// Copyright (c) 2015, 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_function_getter_test;

import 'dart:html';

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

_injectJs() {
  document.body!.append(new ScriptElement()
    ..type = 'text/javascript'
    ..innerHtml = r"""
  var bar = { };

  bar.instanceMember = function() {
    if (this !== bar) {
      throw 'Unexpected this!';
    }
    return arguments.length;
  };

  bar.staticMember = function() {
    return arguments.length * 2;
  };

  bar.dynamicStatic = function() {
    return arguments.length;
  };

  bar.add = function(a, b) {
    return a + b;
  };

  var foo = { 'bar' : bar };
""");
}

typedef int AddFn(int x, int y);

@JS()
abstract class Bar {
  external Function get staticMember;
  external Function get instanceMember;
  external AddFn get add;
  external get dynamicStatic;
  external num get nonFunctionStatic;
}

@JS()
abstract class Foo {
  external Bar get bar;
}

@JS()
external Foo get foo;

main() {
  _injectJs();

  group('call getter as function', () {
    test('member function', () {
      expect(foo.bar.instanceMember(), equals(0));
      expect(foo.bar.instanceMember(0), equals(1));
      expect(foo.bar.instanceMember(0, 0), equals(2));
      expect(foo.bar.instanceMember(0, 0, 0, 0, 0, 0), equals(6));
      var instanceMember = foo.bar.instanceMember;
      expect(() => instanceMember(), throws);
      expect(() => instanceMember(0), throws);
      expect(() => instanceMember(0, 0), throws);
      expect(() => instanceMember(0, 0, 0, 0, 0, 0), throws);
    });

    test('static function', () {
      expect(foo.bar.staticMember(), equals(0));
      expect(foo.bar.staticMember(0), equals(2));
      expect(foo.bar.staticMember(0, 0), equals(4));
      expect(foo.bar.staticMember(0, 0, 0, 0, 0, 0), equals(12));
      var staticMember = foo.bar.staticMember;
      expect(staticMember(), equals(0));
      expect(staticMember(0), equals(2));
      expect(staticMember(0, 0), equals(4));
      expect(staticMember(0, 0, 0, 0, 0, 0), equals(12));
    });

    test('static dynamicStatic', () {
      expect(foo.bar.dynamicStatic(), equals(0));
      expect(foo.bar.dynamicStatic(0), equals(1));
      expect(foo.bar.dynamicStatic(0, 0), equals(2));
      expect(foo.bar.dynamicStatic(0, 0, 0, 0, 0, 0), equals(6));
      var dynamicStatic = foo.bar.dynamicStatic;
      expect(dynamicStatic(), equals(0));
      expect(dynamicStatic(0), equals(1));
      expect(dynamicStatic(0, 0), equals(2));
      expect(dynamicStatic(0, 0, 0, 0, 0, 0), equals(6));
    });

    test('typedef function', () {
      expect(foo.bar.add(4, 5), equals(9));
    });
  });
}
