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

// dart2jsOptions=--omit-implicit-checks

// Test that native methods with unnamed optional arguments are called with the
// number of arguments in the call site AND the call site is inlined.

import 'native_testing.dart';

typedef int Int2Int(int x);

@Native("A")
class A {
  int foo([x, y, z]) native;

  // Calls can be inlined provided they don't pass an argument.
  int callFun([Int2Int fn]) native;
}

class B {
  @pragma('dart2js:noElision')
  static var g;

  @pragma('dart2js:noInline')
  method1(a) {
    g = '(Method1Tag)'; // Tag to identify compiled JavaScript method.
    A x = makeA();
    // Call sites that are searched for in compiled JavaScript.
    x.foo();
    x.foo(1);
    x.foo(2, 10);
    return x.foo(3, 10, 30);
  }

  @pragma('dart2js:noInline')
  method2() {
    g = '(Method2Tag)';
    A x = makeA();
    var r1 = x.callFun(); // Can be inlined.
    var r2 = x.callFun();
    return r1 + r2;
  }

  @pragma('dart2js:noInline')
  method3() {
    g = '(Method3Tag)';
    A x = makeA();
    var r1 = x.callFun((x) => x * 2); // Can't be inlined due to conversion.
    var r2 = x.callFun((x) => x * 0);
    return r1 + r2;
  }
}

A makeA() native;

String findMethodTextContaining(instance, string) native;

void setup() {
  JS('', r"""
(function(){
  function A() {}
  A.prototype.foo = function () { return arguments.length; };
  A.prototype.callFun = function (fn) { return fn ? fn(123) : 1; };

  self.makeA = function(){return new A()};

  findMethodTextContaining = function (instance, string) {
    var proto = Object.getPrototypeOf(instance);
    var keys = Object.keys(proto);
    for (var i = 0; i < keys.length; i++) {
      var name = keys[i];
      var member = proto[name];
      var s = String(member);
      if (s.indexOf(string)>0) return s;
    }
  };

  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['A']);
}

void match(String s, String pattern1) {
  var pattern2 = pattern1.replaceAll(' ', '');
  Expect.isTrue(s.contains(pattern1) || s.contains(pattern2),
      "expected $pattern1 or $pattern2 in '$s'");
}

void nomatch(String s, String pattern1) {
  var pattern2 = pattern1.replaceAll(' ', '');
  Expect.isFalse(s.contains(pattern1) || s.contains(pattern2),
      "should not have $pattern1 or $pattern2 in '$s'");
}

test1() {
  String method1 = findMethodTextContaining(new B(), '(Method1Tag)');
  Expect.isNotNull(method1, 'No method found containing "(Method1Tag)"');

  // Direct (inlined) calls don't have $3 or minified names.
  match(method1, r'.foo()');
  match(method1, r'.foo(1)');
  match(method1, r'.foo(2, 10)');
  match(method1, r'.foo(3, 10, 30)');

  // Ensure the methods are compiled by calling them.
  var a = makeA();

  Expect.equals(0, a.foo());
  Expect.equals(1, a.foo(10));
  Expect.equals(2, a.foo(10, 20));
  Expect.equals(3, a.foo(10, 20, 30));

  var b = new B();
  var r = b.method1(a);
  Expect.equals(3, r);
}

test2() {
  String method2 = findMethodTextContaining(new B(), '(Method2Tag)');
  Expect.isNotNull(method2, 'No method found containing "(Method2Tag)"');
  // Can always inline the zero-arg call.
  match(method2, r'.callFun()');

  String method3 = findMethodTextContaining(new B(), '(Method3Tag)');
  Expect.isNotNull(method3, 'No method found containing "(Method3Tag)"');
  // Don't inline native method with a function argument - should call a stub
  // containing the conversion.
  nomatch(method3, r'.callFun(');

  // Ensure the methods are compiled by calling them.
  var a = makeA();
  Expect.equals(369, a.callFun((i) => 3 * i));

  var b = new B();
  Expect.equals(2, b.method2());
  Expect.equals(246, b.method3());
}

main() {
  nativeTesting();
  setup();
  test1();
  test2();
}
