395c0e4b98
Change-Id: I70aa3092a4a7b9c7f77b4e007a9d6fd602883ccf Reviewed-on: https://dart-review.googlesource.com/c/92560 Reviewed-by: Kevin Millikin <kmillikin@google.com>
107 lines
3.9 KiB
Dart
107 lines
3.9 KiB
Dart
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
library kernel.text_serializer_test;
|
|
|
|
import 'package:kernel/ast.dart';
|
|
import 'package:kernel/text/serializer_combinators.dart';
|
|
import 'package:kernel/text/text_reader.dart';
|
|
import 'package:kernel/text/text_serializer.dart';
|
|
|
|
void main() {
|
|
initializeSerializers();
|
|
test();
|
|
}
|
|
|
|
// Wrappers for testing.
|
|
Expression readExpression(String input) {
|
|
TextIterator stream = new TextIterator(input, 0);
|
|
stream.moveNext();
|
|
Expression result = expressionSerializer.readFrom(
|
|
stream, new DeserializationState(null, new CanonicalName.root()));
|
|
if (stream.moveNext()) {
|
|
throw StateError("extra cruft in basic literal");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
String writeExpression(Expression expression) {
|
|
StringBuffer buffer = new StringBuffer();
|
|
expressionSerializer.writeTo(
|
|
buffer, expression, new SerializationState(null));
|
|
return buffer.toString();
|
|
}
|
|
|
|
void test() {
|
|
List<String> failures = [];
|
|
List<String> tests = [
|
|
"(get-prop (int 0) (public \"hashCode\"))",
|
|
"(get-super (public \"hashCode\"))",
|
|
"(invoke-method (int 0) (public \"foo\") () ((int 1) (int 2)) ())",
|
|
"(invoke-method (int 0) (public \"foo\") ((dynamic) (void)) "
|
|
"((int 1) (int 2)) (\"others\" (list (dynamic) ((int 3) (int 4)))))",
|
|
"(let (var \"x^0\" (dynamic) (int 0) ()) (null))",
|
|
"(let (var \"x^0\" (dynamic) _ ()) (null))",
|
|
"(let (const \"x^0\" (dynamic) (int 0) ()) (null))",
|
|
"(let (const \"x^0\" (dynamic) _ ()) (null))",
|
|
"(let (final \"x^0\" (dynamic) (int 0) ()) (null))",
|
|
"(let (final \"x^0\" (dynamic) _ ()) (null))",
|
|
"(string \"Hello, 'string'!\")",
|
|
"(string \"Hello, \\\"string\\\"!\")",
|
|
"(string \"Yeah nah yeah, here is\\nthis really long string haiku\\n"
|
|
"blowing in the wind\\n\")",
|
|
"(int 42)",
|
|
"(int 0)",
|
|
"(int -1001)",
|
|
"(double 3.14159)",
|
|
"(bool true)",
|
|
"(bool false)",
|
|
"(null)",
|
|
"(invalid \"You can't touch this\")",
|
|
"(not (bool true))",
|
|
"(&& (bool true) (bool false))",
|
|
"(|| (&& (bool true) (not (bool true))) (bool true))",
|
|
"(concat ((string \"The opposite of \") (int 3) "
|
|
"(string \" is \") (int 7)))",
|
|
"(symbol \"unquote-splicing\")",
|
|
"(this)",
|
|
"(rethrow)",
|
|
"(throw (string \"error\"))",
|
|
"(await (null))",
|
|
"(cond (bool true) (dynamic) (int 0) (int 1))",
|
|
"(is (bool true) (invalid))",
|
|
"(as (bool true) (void))",
|
|
"(type (bottom))",
|
|
"(list (dynamic) ((null) (null) (null)))",
|
|
"(const-list (dynamic) ((int 0) (int 1) (int 2)))",
|
|
"(set (dynamic) ((bool true) (bool false) (int 0)))",
|
|
"(const-set (dynamic) ((int 0) (int 1) (int 2)))",
|
|
"(map (dynamic) (void) ((int 0) (null) (int 1) (null) (int 2) (null)))",
|
|
"(const-map (dynamic) (void) ((int 0) (null) (int 1) (null) "
|
|
"(int 2) (null)))",
|
|
"(type (-> () () () ((dynamic)) () () (dynamic)))",
|
|
"(type (-> () () () () ((dynamic)) () (dynamic)))",
|
|
"(type (-> () () () ((dynamic) (dynamic)) () () (dynamic)))",
|
|
"(type (-> () () () () () () (dynamic)))",
|
|
"(type (-> () () () ((-> () () () ((dynamic)) () () (dynamic))) () () "
|
|
"(dynamic)))",
|
|
"(type (-> (\"T^0\") ((dynamic)) ((dynamic)) () () () (dynamic)))",
|
|
"(type (-> (\"T^0\") ((dynamic)) ((dynamic)) ((par \"T^0\" _)) () () "
|
|
"(par \"T^0\" _)))",
|
|
"(type (-> (\"T^0\" \"S^1\") ((par \"S^1\" _) (par \"T^0\" _)) ((dynamic) "
|
|
"(dynamic)) () () () (dynamic)))",
|
|
];
|
|
for (var test in tests) {
|
|
var literal = readExpression(test);
|
|
var output = writeExpression(literal);
|
|
if (output != test) {
|
|
failures.add('* input "${test}" gave output "${output}"');
|
|
}
|
|
}
|
|
if (failures.isNotEmpty) {
|
|
print('Round trip failures:');
|
|
failures.forEach(print);
|
|
throw StateError('Round trip failures');
|
|
}
|
|
}
|