// 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. // @dart = 2.9 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 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 (null-type))'); 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}"'); } } }