// Copyright (c) 2021, 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 that JS objects can be referred to as extensions of JavaScriptObject.

@JS()
library javascriptobject_extensions_test;

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

import 'dart:html' show Window;
import 'dart:_interceptors'
    show
        LegacyJavaScriptObject,
        JavaScriptObject,
        UnknownJavaScriptObject,
        JSObject;

const isDDC = const bool.fromEnvironment('dart.library._ddc_only');
const isDart2JS = const bool.fromEnvironment('dart.library._dart2js_only');

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

class InterfaceClass {}

@JS('JSClass')
class JSClass implements InterfaceClass {
  external JSClass();
  external String get name;
}

class ImplementationClass implements JSClass {
  String get name => 'ImplementationClass';
}

class GenericInterfaceClass<T> {}

@JS('JSClass')
class GenericJSClass<T> implements GenericInterfaceClass<T> {
  external GenericJSClass();
}

class GenericImplementationClass<T> implements GenericJSClass<T> {}

@JS()
@anonymous
class AnonymousClass {
  external String get name;
}

class DartClass {}

external AnonymousClass get anonymousObj;

external Window get window;

@JS('window')
external dynamic get windowDynamic;

// Extension on JavaScriptObject. In the future, when extension types are
// introduced, this will be explicitly disallowed.
extension JavaScriptObjectExtension on JavaScriptObject {
  // Use `className` instead so there's no ambiguity on what method is called.
  String get className => getProperty(this, 'name');
}

// Test runtime type checks and casts.
@pragma('dart2js:noInline')
void runtimeIsAndAs<T>(instance, [bool expectation = true]) {
  expect(instance is T, expectation);
  expect(() => instance as T, expectation ? returnsNormally : throws);
}

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
confuse(x) => x;

JavaScriptObject returnJavaScriptObject() => throw '';

JavaScriptObject? returnNullableJavaScriptObject() => throw '';

JSClass returnJS() => throw '';

AnonymousClass returnAnon() => throw '';

UnknownJavaScriptObject returnUnknownJavaScriptObject() => throw '';

ImplementationClass returnImpl() => throw '';

main() {
  eval(r'''
    function JSClass() {
      this.name = 'JSClass';
    }
    self.anonymousObj = {
      name: 'AnonymousClass',
    };
  ''');

  // Instances of JS classes can be casted to JavaScriptObject and back.
  var jsObj = JSClass();
  expect(jsObj is JavaScriptObject, true);
  runtimeIsAndAs<JavaScriptObject>(jsObj);
  var javaScriptObject = jsObj as JavaScriptObject;
  expect(javaScriptObject.className == 'JSClass', true);
  expect(javaScriptObject is JSClass, true);
  runtimeIsAndAs<JSClass>(javaScriptObject);

  // Object literals can be casted to JavaScriptObject and back.
  expect(anonymousObj is JavaScriptObject, true);
  runtimeIsAndAs<JavaScriptObject>(anonymousObj);
  javaScriptObject = anonymousObj as JavaScriptObject;
  expect(javaScriptObject.className == 'AnonymousClass', true);
  expect(javaScriptObject is AnonymousClass, true);
  runtimeIsAndAs<AnonymousClass>(javaScriptObject);

  // Dart objects that don't implement a JS type cannot be casted to or from
  // JavaScriptObject.
  var dartObj = DartClass();
  expect(dartObj is JavaScriptObject, false);
  runtimeIsAndAs<JavaScriptObject>(dartObj, false);
  expect(javaScriptObject is DartClass, false);
  runtimeIsAndAs<DartClass>(javaScriptObject, false);

  // Web Native classes are subclasses of JavaScriptObject, but not
  // LegacyJavaScriptObject.
  expect(window is JavaScriptObject, true);
  runtimeIsAndAs<JavaScriptObject>(window, true);
  runtimeIsAndAs<JavaScriptObject>(windowDynamic, true);
  javaScriptObject = jsObj as JavaScriptObject;
  expect(javaScriptObject is Window, false);
  runtimeIsAndAs<Window>(javaScriptObject, false);

  expect(window is LegacyJavaScriptObject, false);
  runtimeIsAndAs<LegacyJavaScriptObject>(window, false);
  runtimeIsAndAs<LegacyJavaScriptObject>(windowDynamic, false);
  var legacyJavaScriptObject = jsObj as LegacyJavaScriptObject;
  expect(legacyJavaScriptObject is Window, false);
  runtimeIsAndAs<Window>(legacyJavaScriptObject, false);

  // Make sure `Object` methods work with JavaScriptObject like they do with JS
  // interop objects.
  expect(javaScriptObject == jsObj, true);
  expect(javaScriptObject.hashCode, isNotNull);
  expect(javaScriptObject.toString, isNotNull);
  expect(javaScriptObject.noSuchMethod, isNotNull);
  expect(javaScriptObject.runtimeType, isNotNull);

  // Test that nullability works as expected.
  expect(null is JavaScriptObject?, true);
  runtimeIsAndAs<JavaScriptObject?>(null);
  expect(null is JavaScriptObject, false);
  runtimeIsAndAs<JavaScriptObject>(null, hasUnsoundNullSafety);

  // Most of the following tests don't work in DDC and dart2js. In order to test
  // the current status on both compilers, we place the current status in the
  // expectation, and the real expected value in a comment next to it. If at any
  // point we fix the compilers so we get the real expected value, the
  // corresponding expectations should be amended.

  // Transitive is and as.
  // JS type <: JavaScriptObject <: JSObject
  expect(jsObj is JSObject, true);
  runtimeIsAndAs<JSObject>(jsObj);
  // JavaScriptObject <: JS type <: Dart interface
  expect(jsObj is InterfaceClass, isDart2JS /* true */);
  runtimeIsAndAs<InterfaceClass>(jsObj, isDart2JS /* true */);
  // Generics should be effectively ignored when a JS interop class implements
  // a Dart class or vice versa.
  var jsObjInt = GenericJSClass<int>();
  expect(jsObjInt is GenericInterfaceClass<int>, isDart2JS /* true */);
  runtimeIsAndAs<GenericInterfaceClass<int>>(jsObjInt, isDart2JS /* true */);
  var jsObjString = GenericJSClass<String>();
  expect(jsObjString is GenericInterfaceClass<int>, isDart2JS /* true */);
  runtimeIsAndAs<GenericInterfaceClass<int>>(jsObjString, isDart2JS /* true */);
  expect(javaScriptObject is InterfaceClass, isDart2JS /* true */);
  runtimeIsAndAs<InterfaceClass>(javaScriptObject, isDart2JS /* true */);
  // Dart implementation <: JS type <: JavaScriptObject
  var impl = ImplementationClass();
  expect(impl is JSClass, true);
  runtimeIsAndAs<JSClass>(impl);
  var implInt = GenericImplementationClass<int>();
  expect(implInt is GenericJSClass<int>, true);
  runtimeIsAndAs<GenericJSClass<int>>(implInt);
  var implString = GenericImplementationClass<String>();
  expect(implString is GenericJSClass<int>, true);
  runtimeIsAndAs<GenericJSClass<int>>(implString);
  expect(impl is JavaScriptObject, false /* true */);
  runtimeIsAndAs<JavaScriptObject>(impl, false /* true */);
  // Dart implementation <: JS type <: JavaScriptObject <: JSObject
  expect(impl is JSObject, false /* true */);
  runtimeIsAndAs<JSObject>(impl, false /* true */);

  // Test that subtyping with nullability works as expected.
  expect(returnJavaScriptObject is JavaScriptObject? Function(), true);
  expect(
    returnNullableJavaScriptObject is JavaScriptObject Function(),
    hasUnsoundNullSafety,
  );

  // Test that JavaScriptObject can be used in place of package:js types in
  // function types, and vice versa.
  // TODO(srujzs): We should add tests for subtyping involving generics in each
  // of these cases. However, it's very unlikely we'll fix the non-generic cases
  // to begin with, and such tests would be filtered today anyways, so we can
  // add those tests later if we do fix these.
  expect(returnJavaScriptObject is JSClass Function(), false /* true */);
  expect(returnJS is JavaScriptObject Function(), isDDC /* true */);
  expect(returnJavaScriptObject is AnonymousClass Function(), false /* true */);
  expect(returnAnon is JavaScriptObject Function(), isDDC /* true */);

  // Transitive subtyping.
  // UnknownJavaScriptObject <: JavaScriptObject <: JS type
  expect(returnUnknownJavaScriptObject is JSClass Function(), false /* true */);
  // JS type <: JavaScriptObject <: JSObject
  expect(returnJS is JSObject Function(), isDDC /* true */);
  // JavaScriptObject <: JS type <: Dart interface
  expect(returnJavaScriptObject is InterfaceClass Function(), false /* true */);
  // Dart implementation <: JS type <: JavaScriptObject
  expect(returnImpl is JavaScriptObject Function(), false /* true */);
  // UnknownJavaScriptObject <: JavaScriptObject <: JS type <: Dart interface
  expect(
    returnUnknownJavaScriptObject is InterfaceClass Function(),
    false /* true */,
  );
  // Dart implementation <: JS type <: JavaScriptObject <: JSObject
  expect(returnImpl is JSObject Function(), false /* true */);

  // Run above subtype checks but at runtime.
  expect(confuse(returnJavaScriptObject) is JavaScriptObject? Function(), true);
  expect(
    confuse(returnNullableJavaScriptObject) is JavaScriptObject Function(),
    hasUnsoundNullSafety,
  );

  expect(
    confuse(returnJavaScriptObject) is JSClass Function(),
    false /* true */,
  );
  expect(confuse(returnJS) is JavaScriptObject Function(), true);
  expect(
    confuse(returnJavaScriptObject) is AnonymousClass Function(),
    false /* true */,
  );
  expect(confuse(returnAnon) is JavaScriptObject Function(), true);

  expect(
    confuse(returnUnknownJavaScriptObject) is JSClass Function(),
    isDart2JS /* true */,
  );
  expect(confuse(returnJS) is JSObject Function(), true);
  expect(
    confuse(returnJavaScriptObject) is InterfaceClass Function(),
    false /* true */,
  );
  expect(confuse(returnImpl) is JavaScriptObject Function(), false /* true */);
  expect(
    confuse(returnUnknownJavaScriptObject) is InterfaceClass Function(),
    isDart2JS /* true */,
  );
  expect(confuse(returnImpl) is JSObject Function(), false /* true */);
}
