// 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.

// 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();
}
