// Copyright (c) 2019, 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.

import 'dart:_rti' as rti;
import "package:expect/expect.dart";

void checkToString(String expected, rti.Rti rti1) {
  String result = rti.testingRtiToString(rti1);
  if (expected == result) return;
  Expect.equals(expected, result.replaceAll('minified:', ''));
}

testDynamic() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, '@');
  var rti2 = rti.testingUniverseEval(universe, ',,@,,');

  Expect.isTrue(identical(rti1, rti2), 'dynamic should be identical');
  Expect.isFalse(rti1 is String);
  checkToString('dynamic', rti1);
}

testVoid() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, '~');
  var rti2 = rti.testingUniverseEval(universe, ',,~,,');

  Expect.isTrue(identical(rti1, rti2), 'void should be identical');
  Expect.isFalse(rti1 is String);
  checkToString('void', rti1);
}

testNever() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, '0&');
  var rti2 = rti.testingUniverseEval(universe, '0&');

  Expect.isTrue(identical(rti1, rti2), 'Never should be identical');
  Expect.isFalse(rti1 is String);
  checkToString('Never', rti1);
}

testAny() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, '1&');
  var rti2 = rti.testingUniverseEval(universe, '1&');

  Expect.isTrue(identical(rti1, rti2), "'any' should be identical");
  Expect.isFalse(rti1 is String);
  checkToString('any', rti1);
}

testTerminal() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, '@');
  var rti2 = rti.testingUniverseEval(universe, '~');
  var rti3 = rti.testingUniverseEval(universe, '0&');
  var rti4 = rti.testingUniverseEval(universe, '1&');

  Expect.isFalse(identical(rti1, rti2));
  Expect.isFalse(identical(rti1, rti3));
  Expect.isFalse(identical(rti1, rti4));
  Expect.isFalse(identical(rti2, rti3));
  Expect.isFalse(identical(rti2, rti4));
  Expect.isFalse(identical(rti3, rti4));
}

testInterface1() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, 'int');
  var rti2 = rti.testingUniverseEval(universe, ',,int,,');

  Expect.isTrue(identical(rti1, rti2));
  Expect.isFalse(rti1 is String);
  checkToString('int', rti1);
}

testInterface2() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, 'Foo<int,bool>');
  var rti2 = rti.testingUniverseEval(universe, 'Foo<int,bool>');

  Expect.isTrue(identical(rti1, rti2));
  Expect.isFalse(rti1 is String);
  checkToString('Foo<int, bool>', rti1);
}

testInterface3() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, 'Foo<Bar<int>,Bar<bool>>');
  var rti2 = rti.testingUniverseEval(universe, 'Foo<Bar<int>,Bar<bool>>');

  Expect.isTrue(identical(rti1, rti2));
  Expect.isFalse(rti1 is String);
  checkToString('Foo<Bar<int>, Bar<bool>>', rti1);
}

testInterface4() {
  var universe = rti.testingCreateUniverse();

  var rti1 = rti.testingUniverseEval(universe, 'Foo<Foo<Foo<Foo<int>>>>');
  var rti2 = rti.testingUniverseEval(universe, 'Foo<Foo<Foo<Foo<int>>>>');

  Expect.isTrue(identical(rti1, rti2));
  Expect.isFalse(rti1 is String);
  checkToString('Foo<Foo<Foo<Foo<int>>>>', rti1);
}

main() {
  testDynamic();
  testVoid();
  testNever();
  testAny();
  testTerminal();
  testInterface1();
  testInterface2();
  testInterface3();
  testInterface4();
}
