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

// Tests implicit downcasts in js_util.

@JS()
library js_util_implicit_downcast_test;

import 'package:js/js.dart';
import 'package:js/js_util.dart' as js_util;
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

@JS()
external void eval(String code);

@JS()
class Foo {
  external Foo(num a);

  external num get a;
  external void set a(_);
  external num bar();
}

bool isComplianceMode() {
  var stuff = [1, 'string'];
  var a = stuff[0];
  // Detect whether we are using --omit-implicit-checks.
  try {
    String s = a as dynamic;
    return false;
  } catch (e) {
    // Ignore.
  }
  return true;
}

main() {
  eval(r"""
    function Foo(a) {
      this.a = a;
    }

    Foo.prototype.bar = function() {
      return this.a;
    }
    """);

  if (isComplianceMode()) {
    complianceModeTest();
  } else {
    omitImplicitChecksTest();
  }
}

complianceModeTest() {
  var f = Foo(42);
  expect(js_util.getProperty<int>(f, 'a'), equals(42));
  expect(() => js_util.getProperty<List>(f, 'a'), throws);

  f.a = 5;
  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
  expect(() => js_util.callMethod<List>(f, 'bar', []), throws);

  // Check optimized lowering of callMethod.
  expect(() => js_util.callMethod<List>(f, 'bar', [1]), throws);
  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2]), throws);
  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3]), throws);
  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), throws);
  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), throws);

  var f2 = Foo(7);
  var fConstructor = js_util.getProperty(f, 'constructor');
  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
  expect(() => js_util.callConstructor<List>(fConstructor, [7]), throws);

  // Check optimized lowering of callConstructor.
  expect(() => js_util.callConstructor<List>(fConstructor, null), throws);
  expect(() => js_util.callConstructor<List>(fConstructor, []), throws);
  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2]), throws);
  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3]), throws);
  expect(
    () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]),
    throws,
  );
  expect(
    () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]),
    throws,
  );
}

omitImplicitChecksTest() {
  var f = Foo(42);
  expect(js_util.getProperty<int>(f, 'a'), equals(42));
  expect(js_util.getProperty<List>(f, 'a'), equals(42));

  f.a = 5;
  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
  expect(js_util.callMethod<List>(f, 'bar', []), equals(5));

  // Check optimized lowering of callMethod.
  expect(js_util.callMethod<List>(f, 'bar', [1]), equals(5));
  expect(js_util.callMethod<List>(f, 'bar', [1, 2]), equals(5));
  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3]), equals(5));
  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), equals(5));
  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), equals(5));

  var fConstructor = js_util.getProperty(f, 'constructor');
  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
  expect(
    (js_util.callConstructor<List>(fConstructor, [7]) as Foo).a,
    equals(7),
  );

  // Check optimized lowering of callConstructor.
  expect(
    (js_util.callConstructor<List>(fConstructor, null) as Foo).a,
    equals(null),
  );
  expect(
    (js_util.callConstructor<List>(fConstructor, []) as Foo).a,
    equals(null),
  );
  expect(
    (js_util.callConstructor<List>(fConstructor, [1, 2]) as Foo).a,
    equals(1),
  );
  expect(
    (js_util.callConstructor<List>(fConstructor, [1, 2, 3]) as Foo).a,
    equals(1),
  );
  expect(
    (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]) as Foo).a,
    equals(1),
  );
  expect(
    (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]) as Foo).a,
    equals(1),
  );
}
