| // 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(); |
| TestRunner testRunner = new TestRunner(); |
| testRunner.run(); |
| if (testRunner.failures.isNotEmpty) { |
| print('Round trip failures:'); |
| testRunner.failures.forEach(print); |
| throw StateError('Round trip failures'); |
| } |
| } |
| |
| // 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(); |
| } |
| |
| class TestRunner { |
| final List<String> failures = []; |
| |
| void run() { |
| test('(get-prop (int 0) (public "hashCode"))'); |
| test('(get-super (public "hashCode"))'); |
| test('(invoke-method (int 0) (public "foo") () ((int 1) (int 2)) ())'); |
| test('(invoke-method (int 0) (public "foo") ((dynamic) (void)) ' |
| '((int 1) (int 2)) ("others" (list (dynamic) ((int 3) (int 4)))))'); |
| test('(let "x^0" () (dynamic) (int 0) () (null))'); |
| test('(let "x^0" () (dynamic) _ () (null))'); |
| test('(let "x^0" ((const)) (dynamic) (int 0) () (null))'); |
| test('(let "x^0" ((const)) (dynamic) _ () (null))'); |
| test('(let "x^0" ((final)) (dynamic) (int 0) () (null))'); |
| test('(let "x^0" ((final)) (dynamic) _ () (null))'); |
| test(r'''(string "Hello, 'string'!")'''); |
| test(r'''(string "Hello, \"string\"!")'''); |
| test(r'''(string "Yeah nah yeah, here is\nthis really long string haiku\n''' |
| r'''blowing in the wind\n")'''); |
| test('(int 42)'); |
| test('(int 0)'); |
| test('(int -1001)'); |
| test('(double 3.14159)'); |
| test('(bool true)'); |
| test('(bool false)'); |
| test('(null)'); |
| test(r'''(invalid "You can't touch this")'''); |
| test('(not (bool true))'); |
| test('(&& (bool true) (bool false))'); |
| test('(|| (&& (bool true) (not (bool true))) (bool true))'); |
| test('(concat ((string "The opposite of ") (int 3) ' |
| '(string " is ") (int 7)))'); |
| test('(symbol "unquote-splicing")'); |
| test('(this)'); |
| test('(rethrow)'); |
| test('(throw (string "error"))'); |
| test('(await (null))'); |
| test('(cond (bool true) (dynamic) (int 0) (int 1))'); |
| test('(is (bool true) (invalid))'); |
| test('(as (bool true) (void))'); |
| test('(type (bottom))'); |
| test('(list (dynamic) ((null) (null) (null)))'); |
| test('(const-list (dynamic) ((int 0) (int 1) (int 2)))'); |
| test('(set (dynamic) ((bool true) (bool false) (int 0)))'); |
| test('(const-set (dynamic) ((int 0) (int 1) (int 2)))'); |
| test('(map (dynamic) (void)' |
| ' ((int 0) (null) (int 1) (null) (int 2) (null)))'); |
| test('(const-map (dynamic) (void) ((int 0) (null) (int 1) (null) ' |
| '(int 2) (null)))'); |
| test('(type (-> () () () ((dynamic)) () () (dynamic)))'); |
| test('(type (-> () () () () ((dynamic)) () (dynamic)))'); |
| test('(type (-> () () () ((dynamic) (dynamic)) () () (dynamic)))'); |
| test('(type (-> () () () () () () (dynamic)))'); |
| test('(type (-> () () () ((-> () () () ((dynamic)) () () (dynamic))) () () ' |
| '(dynamic)))'); |
| test('(type (-> ("T^0") ((dynamic)) ((dynamic)) () () () (dynamic)))'); |
| test('(type (-> ("T^0") ((dynamic)) ((dynamic)) ((par "T^0" _)) () () ' |
| '(par "T^0" _)))'); |
| test('(type (-> ("T^0" "S^1") ((par "S^1" _) (par "T^0" _)) ((dynamic) ' |
| '(dynamic)) () () () (dynamic)))'); |
| } |
| |
| void test(String input) { |
| var kernelAst = readExpression(input); |
| var output = writeExpression(kernelAst); |
| if (output != input) { |
| failures.add('* input "${input}" gave output "${output}"'); |
| } |
| } |
| } |