// 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 failures = []; List 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'); } }