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

@JS()
library js_interop_test;

import 'package:expect/expect.dart';
import 'package:js/js.dart';

import 'object_apis_utils.dart';

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

@JS()
class JavaScriptClass {
  external factory JavaScriptClass();
  external int get instanceGetter;
}

void main() {
  final toStringValue = 'external toString';
  // Install a class that is accessible through interop.
  eval('''
self.JavaScriptClass = class JavaScriptClass {
  constructor() {}
  get instanceGetter() { return 42; }
  toString() { return '$toStringValue'; }
}
''');
  var instanceOfClass = JavaScriptClass();
  var other = JavaScriptClass();
  Expect.equals(42, instanceOfClass.instanceGetter);
  testHashCode(instanceOfClass);
  testRuntimeType(instanceOfClass);
  testNoSuchMethod(instanceOfClass);
  testNoSuchMethodTearoff(instanceOfClass);
  testToString(instanceOfClass, toStringValue);
  testToStringTearoff(instanceOfClass, toStringValue);
  testEquals(instanceOfClass, other);

  var emptyObject = eval('Object.create({})');
  testHashCode(emptyObject);
  testRuntimeType(emptyObject);
  testNoSuchMethod(emptyObject);
  testNoSuchMethodTearoff(emptyObject);
  testToString(emptyObject, '[object Object]');
  testToStringTearoff(emptyObject, '[object Object]');
  testEquals(emptyObject, other);

  var objectWithNoProto = eval('Object.create(null)');
  testHashCode(objectWithNoProto);
  testRuntimeType(objectWithNoProto);
  testNoSuchMethod(objectWithNoProto);
  testNoSuchMethodTearoff(objectWithNoProto);
  // These operations throwing is only testing for consistency, and does not
  // imply a choice for the desired behavior. This is simply the state of
  // JavaScript interop at the time this test was written.
  Expect.throws(() => objectWithNoProto.toString());
  Expect.throws(() {
    // DDC will fail at the point of the tearoff.
    var toStringTearoff = objectWithNoProto.toString;
    // Dart2js fails if you call the tearoff.
    toStringTearoff();
  });
  testEquals(objectWithNoProto, other);

  var jsNull = eval('null');
  testHashCode(jsNull);
  testRuntimeType(jsNull);
  testNoSuchMethod(jsNull);
  testNoSuchMethodTearoff(jsNull);
  testToString(jsNull, 'null');
  testToStringTearoff(jsNull, 'null');
  testEquals(jsNull, other);
}
