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

import 'dart:html';
import 'dart:indexed_db' show IdbFactory, KeyRange;
import 'dart:typed_data' show Int32List;
import 'dart:js';

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

import 'js_test_util.dart';

main() {
  injectJs();

  test('invoke Dart callback from JS', () {
    expect(() => context.callMethod('invokeCallback'), throws);

    context['callback'] = () => 42;
    expect(context.callMethod('invokeCallback'), equals(42));

    context.deleteProperty('callback');
  });

  test('pass a Dart function to JS and back', () {
    var dartFunction = () => 42;
    context['dartFunction'] = dartFunction;
    expect(identical(context['dartFunction'], dartFunction), isTrue);
    context.deleteProperty('dartFunction');
  });

  test('callback as parameter', () {
    expect(context.callMethod('getTypeOf', [context['razzle']]),
        equals("function"));
  });

  test('invoke Dart callback from JS with this', () {
    // A JavaScript constructor function implemented in Dart which
    // uses 'this'
    final constructor = new JsFunction.withThis(($this, arg1) {
      var t = $this;
      $this['a'] = 42;
    });
    var o = new JsObject(constructor, ["b"]);
    expect(o['a'], equals(42));
  });

  test('invoke Dart callback from JS with 11 parameters', () {
    context['callbackWith11params'] =
        (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) =>
            '$p1$p2$p3$p4$p5$p6$p7$p8$p9$p10$p11';
    expect(context.callMethod('invokeCallbackWith11params'),
        equals('1234567891011'));
  });

  test('return a JS proxy to JavaScript', () {
    var result = context.callMethod('testJsMap', [
      () => new JsObject.jsify({'value': 42})
    ]);
    expect(result, 42);
  });

  test('emulated functions should not be callable in JS', () {
    context['callable'] = new Callable();
    expect(() => context.callMethod('callable'), throwsNoSuchMethodError);

    Function f = new Callable();
    context['callable'] = f;
    expect(context.callMethod('callable'), 'called');
    context.deleteProperty('callable');
  });
}
