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

// @dart = 2.9

// Tests method calls (typed and dynamic) on various forms of JS objects.

@JS()
library js_parameters_test;

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

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

@JS()
class Foo {
  external Foo();
  external dynamic method(int x);
}

@JS()
external Foo makeFooLiteral();

@JS()
external Foo makeFooObjectCreate();

main() {
  // These examples from based on benchmarks-internal/js
  eval(r'''
self.Foo = function Foo() {}
self.Foo.prototype.method = function(x) { return x + 1; }

self.makeFooLiteral = function() {
  return {
    method: function(x) { return x + 1; }
  }
}

// Objects created in this way have no prototype.
self.makeFooObjectCreate = function() {
  var o = Object.create(null);
  o.method = function(x) { return x + 1; }
  return o;
}
''');

  var foo = Foo();
  Expect.equals(2, foo.method(1));

  foo = makeFooLiteral();
  Expect.equals(2, foo.method(1));

  foo = makeFooObjectCreate();
  Expect.equals(2, foo.method(1));

  dynamic dynamicFoo = Foo();
  Expect.equals(2, dynamicFoo.method(1));

  dynamicFoo = makeFooLiteral();
  Expect.equals(2, dynamicFoo.method(1));

  dynamicFoo = makeFooObjectCreate();
  Expect.equals(2, dynamicFoo.method(1));
}
