// 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:_foreign_helper' show JS, JS_GET_NAME;
import 'dart:_js_embedded_names' show JsGetName;
import 'dart:_rti' as rti;
import "package:expect/expect.dart";

final String objectName = JS_GET_NAME(JsGetName.OBJECT_CLASS_TYPE_NAME);
final String nullName = JS_GET_NAME(JsGetName.NULL_CLASS_TYPE_NAME);

const typeRulesJson = r'''
{
  "int": {"num": []},
  "List": {"Iterable": ["1"]},
  "CodeUnits": {
    "List": ["int"],
    "Iterable": ["int"]
  }
}
''';
final typeRules = JS('=Object', 'JSON.parse(#)', typeRulesJson);
final universe = rti.testingCreateUniverse();

main() {
  rti.testingAddRules(universe, typeRules);
  runTests();
  runTests(); // Ensure caching didn't change anything.
}

void runTests() {
  strictSubtype('List<CodeUnits>', 'Iterable<List<int>>');
  strictSubtype('CodeUnits', 'Iterable<num>');
  strictSubtype('Iterable<int>', 'Iterable<num>');
  strictSubtype('List<int>', objectName);
  strictSubtype(nullName, 'int');
  strictSubtype(nullName, 'Iterable<CodeUnits>');
  strictSubtype(nullName, objectName);
  unrelated('int', 'CodeUnits');
  equivalent(nullName, nullName);
  equivalent('double', 'double');
  equivalent(objectName, objectName);
  equivalent('@', '@');
  equivalent('~', '~');
  equivalent('1&', '1&');
  equivalent('List<int>', 'List<int>');
  equivalent(objectName, '@');
  equivalent(objectName, '~');
  equivalent(objectName, '1&');
  equivalent('@', '~');
  equivalent('@', '1&');
  equivalent('~', '1&');
  equivalent('List<$objectName>', 'List<@>');
  equivalent('List<$objectName>', 'List<~>');
  equivalent('List<$objectName>', 'List<1&>');
  equivalent('List<@>', 'List<~>');
  equivalent('List<@>', 'List<1&>');
  equivalent('List<~>', 'List<1&>');
}

String reason(String s, String t) => "$s <: $t";

void strictSubtype(String s, String t) {
  var sRti = rti.testingUniverseEval(universe, s);
  var tRti = rti.testingUniverseEval(universe, t);
  Expect.isTrue(rti.testingIsSubtype(universe, sRti, tRti), reason(s, t));
  Expect.isFalse(rti.testingIsSubtype(universe, tRti, sRti), reason(t, s));
}

void unrelated(String s, String t) {
  var sRti = rti.testingUniverseEval(universe, s);
  var tRti = rti.testingUniverseEval(universe, t);
  Expect.isFalse(rti.testingIsSubtype(universe, sRti, tRti), reason(s, t));
  Expect.isFalse(rti.testingIsSubtype(universe, tRti, sRti), reason(t, s));
}

void equivalent(String s, String t) {
  var sRti = rti.testingUniverseEval(universe, s);
  var tRti = rti.testingUniverseEval(universe, t);
  Expect.isTrue(rti.testingIsSubtype(universe, sRti, tRti), reason(s, t));
  Expect.isTrue(rti.testingIsSubtype(universe, tRti, sRti), reason(t, s));
}
