// 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<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 (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}"');
    }
  }
}
