// 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:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'package:unittest/html_individual_config.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();

  useHtmlIndividualConfiguration();

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