9157bbcf19
Change-Id: Ib49aae4ee0f5ba1ff809dbf8b8ff0bc1c16e6838 Reviewed-on: https://dart-review.googlesource.com/c/89121 Reviewed-by: Daniel Hillerström <hillerstrom@google.com> Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
129 lines
4.6 KiB
Dart
129 lines
4.6 KiB
Dart
// Copyright (c) 2019, 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_from_kernel_nodes_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, DeserializationEnvironment environment) {
|
|
TextIterator stream = new TextIterator(input, 0);
|
|
stream.moveNext();
|
|
Expression result = expressionSerializer.readFrom(stream, environment);
|
|
if (stream.moveNext()) {
|
|
throw StateError("extra cruft in basic literal");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
String writeExpression(
|
|
Expression expression, SerializationEnvironment environment) {
|
|
StringBuffer buffer = new StringBuffer();
|
|
expressionSerializer.writeTo(buffer, expression, environment);
|
|
return buffer.toString();
|
|
}
|
|
|
|
class TestCase {
|
|
final String name;
|
|
final Node node;
|
|
final SerializationEnvironment serializationEnvironment;
|
|
final DeserializationEnvironment deserializationEnvironment;
|
|
final String expectation;
|
|
|
|
TestCase(
|
|
{this.name,
|
|
this.node,
|
|
this.expectation,
|
|
this.serializationEnvironment,
|
|
this.deserializationEnvironment});
|
|
}
|
|
|
|
void test() {
|
|
List<String> failures = [];
|
|
List<TestCase> tests = <TestCase>[
|
|
new TestCase(
|
|
name: "let dynamic x = 42 in x",
|
|
node: () {
|
|
VariableDeclaration x = new VariableDeclaration("x",
|
|
type: const DynamicType(), initializer: new IntLiteral(42));
|
|
return new Let(x, new VariableGet(x));
|
|
}(),
|
|
expectation:
|
|
"(let (var \"x^0\" (dynamic) (int 42) ()) (get-var \"x^0\" _))"),
|
|
new TestCase(
|
|
name: "let dynamic x = 42 in let Bottom x^0 = null in x",
|
|
node: () {
|
|
VariableDeclaration outterLetVar = new VariableDeclaration("x",
|
|
type: const DynamicType(), initializer: new IntLiteral(42));
|
|
VariableDeclaration innerLetVar = new VariableDeclaration("x",
|
|
type: const BottomType(), initializer: new NullLiteral());
|
|
return new Let(outterLetVar,
|
|
new Let(innerLetVar, new VariableGet(outterLetVar)));
|
|
}(),
|
|
expectation: ""
|
|
"(let (var \"x^0\" (dynamic) (int 42) ())"
|
|
" (let (var \"x^1\" (bottom) (null) ())"
|
|
" (get-var \"x^0\" _)))"),
|
|
new TestCase(
|
|
name: "let dynamic x = 42 in let Bottom x^0 = null in x^0",
|
|
node: () {
|
|
VariableDeclaration outterLetVar = new VariableDeclaration("x",
|
|
type: const DynamicType(), initializer: new IntLiteral(42));
|
|
VariableDeclaration innerLetVar = new VariableDeclaration("x",
|
|
type: const BottomType(), initializer: new NullLiteral());
|
|
return new Let(
|
|
outterLetVar, new Let(innerLetVar, new VariableGet(innerLetVar)));
|
|
}(),
|
|
expectation: ""
|
|
"(let (var \"x^0\" (dynamic) (int 42) ())"
|
|
" (let (var \"x^1\" (bottom) (null) ())"
|
|
" (get-var \"x^1\" _)))"),
|
|
() {
|
|
VariableDeclaration x =
|
|
new VariableDeclaration("x", type: const DynamicType());
|
|
return new TestCase(
|
|
name: "/* suppose: dynamic x; */ x = 42",
|
|
node: () {
|
|
return new VariableSet(x, new IntLiteral(42));
|
|
}(),
|
|
expectation: "(set-var \"x^0\" (int 42))",
|
|
serializationEnvironment: new SerializationEnvironment(null)
|
|
..add(x, "x^0"),
|
|
deserializationEnvironment: new DeserializationEnvironment(null)
|
|
..add("x^0", x));
|
|
}(),
|
|
];
|
|
for (TestCase testCase in tests) {
|
|
String roundTripInput =
|
|
writeExpression(testCase.node, testCase.serializationEnvironment);
|
|
if (roundTripInput != testCase.expectation) {
|
|
failures.add(''
|
|
'* initial serialization for test "${testCase.name}"'
|
|
' gave output "${roundTripInput}"');
|
|
}
|
|
|
|
TreeNode deserialized =
|
|
readExpression(roundTripInput, testCase.deserializationEnvironment);
|
|
String roundTripOutput =
|
|
writeExpression(deserialized, testCase.serializationEnvironment);
|
|
if (roundTripOutput != roundTripInput) {
|
|
failures.add(''
|
|
'* input "${testCase.name}" gave output "${roundTripOutput}"');
|
|
}
|
|
}
|
|
if (failures.isNotEmpty) {
|
|
print('Round trip failures:');
|
|
failures.forEach(print);
|
|
throw StateError('Round trip failures');
|
|
}
|
|
}
|