// 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/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, null);
  if (stream.moveNext()) {
    throw StateError("extra cruft in basic literal");
  }
  return result;
}

String writeExpression(Expression expression) {
  StringBuffer buffer = new StringBuffer();
  expressionSerializer.writeTo(buffer, expression, 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)))",
  ];
  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');
  }
}
