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

@JS()
library js_native_test;

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

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

_injectJs() {
  final script = new ScriptElement();
  script.type = 'text/javascript';
  script.innerHtml = r"""
var x = 42;

var _x = 123;

var myArray = ["value1"];

function returnThis() {
  return this;
}

function getTypeOf(o) {
  return typeof(o);
}

function Foo(a) {
  this.a = a;
}

Foo.b = 38;

Foo.prototype.bar = function() {
  return this.a;
}
Foo.prototype.toString = function() {
  return "I'm a Foo a=" + this.a;
}

var container = new Object();
container.Foo = Foo;

function checkMap(m, key, value) {
  if (m.hasOwnProperty(key))
    return m[key] == value;
  else
    return false;
}

var rejectedPromise = new Promise((resolve, reject) => reject('rejected'));
var resolvedPromise = new Promise(resolve => resolve('resolved'));
function getResolvedPromise() {
  return resolvedPromise;
}

""";
  document.body.append(script);
}

@JS()
external bool checkMap(m, String, value);

@JS('JSON.stringify')
external String stringify(o);

@JS('Node')
external get JSNodeType;

@JS('Element')
external get JSElementType;

@JS('Text')
external get JSTextType;

@JS('HTMLCanvasElement')
external get JSHtmlCanvasElementType;

@JS()
class Foo {
  external Foo(num a);

  external num get a;
  external num bar();
}

@JS('Foo')
external get JSFooType;

@JS()
@anonymous
class ExampleTypedLiteral {
  external factory ExampleTypedLiteral({a, b, JS$_c, JS$class});

  external get a;
  external get b;
  external get JS$_c;
  external set JS$_c(v);
  // Identical to JS$_c but only accessible within the library.
  external get _c;
  external get JS$class;
  external set JS$class(v);
}

@JS()
abstract class Promise<T> {}

@JS()
external Promise get resolvedPromise;

@JS()
external Promise get rejectedPromise;

@JS()
external Promise getResolvedPromise();

@JS("Object.prototype.hasOwnProperty")
external get _hasOwnProperty;

bool hasOwnProperty(o, String name) {
  return js_util.callMethod(_hasOwnProperty, 'call', [o, name]);
}

main() {
  _injectJs();

  group('js_util.jsify()', () {
    test('convert a List', () {
      final list = [1, 2, 3, 4, 5, 6, 7, 8];
      var array = js_util.jsify(list);
      expect(array is List, isTrue);
      expect(identical(array, list), isFalse);
      expect(array.length, equals(list.length));
      for (var i = 0; i < list.length; i++) {
        expect(array[i], equals(list[i]));
      }
    });

    test('convert an Iterable', () {
      final set = new Set.from([1, 2, 3, 4, 5, 6, 7, 8]);
      var array = js_util.jsify(set);
      expect(array is List, isTrue);
      expect(array.length, equals(set.length));
      for (var i = 0; i < array.length; i++) {
        expect(set.contains(array[i]), isTrue);
      }
    });

    test('convert a Map', () {
      var map = {'a': 1, 'b': 2, 'c': 3};
      var jsMap = js_util.jsify(map);
      expect(jsMap is! List, isTrue);
      for (var key in map.keys) {
        expect(checkMap(jsMap, key, map[key]), isTrue);
      }
    });

    test('deep convert a complex object', () {
      dynamic object = {
        'a': [
          1,
          [2, 3]
        ],
        'b': {'c': 3, 'd': new Foo(42)},
        'e': null
      };
      var jsObject = js_util.jsify(object);
      expect(js_util.getProperty(jsObject, 'a')[0], equals(object['a'][0]));
      expect(
          js_util.getProperty(jsObject, 'a')[1][0], equals(object['a'][1][0]));
      expect(
          js_util.getProperty(jsObject, 'a')[1][1], equals(object['a'][1][1]));
      expect(js_util.getProperty(js_util.getProperty(jsObject, 'b'), 'c'),
          equals(object['b']['c']));
      expect(js_util.getProperty(js_util.getProperty(jsObject, 'b'), 'd'),
          equals(object['b']['d']));
      expect(
          js_util.callMethod(
              js_util.getProperty(js_util.getProperty(jsObject, 'b'), 'd'),
              'bar', []),
          equals(42));
      expect(js_util.getProperty(jsObject, 'e'), isNull);
    });

    test('throws if object is not a Map or Iterable', () {
      expect(() => js_util.jsify('a'), throwsArgumentError);
    });
  });

  group('js_util.newObject', () {
    test('create', () {
      expect(identical(js_util.newObject(), js_util.newObject()), isFalse);
    });

    test('callMethod', () {
      var o = js_util.newObject();
      expect(js_util.callMethod(o, 'toString', []), equals('[object Object]'));
      expect(stringify(o), equals('{}'));
    });

    test('properties', () {
      var o = js_util.newObject();
      expect(js_util.hasProperty(o, 'foo bar'), isFalse);
      expect(js_util.hasProperty(o, 'toString'), isTrue);
      expect(hasOwnProperty(o, 'toString'), isFalse);
      expect(hasOwnProperty(o, 'foo bar'), isFalse);
      js_util.setProperty(o, 'foo bar', 42);
      expect(hasOwnProperty(o, 'foo bar'), isTrue);
      expect(js_util.getProperty(o, 'foo bar'), equals(42));
      expect(js_util.hasProperty(o, 'foo bar'), isTrue);
      expect(stringify(o), equals('{"foo bar":42}'));
    });
  });

  group('hasProperty', () {
    test('typed object', () {
      var f = new Foo(42);
      expect(js_util.hasProperty(f, 'a'), isTrue);
      expect(js_util.hasProperty(f, 'toString'), isTrue);
      js_util.setProperty(f, '__proto__', null);
      expect(js_util.hasProperty(f, 'toString'), isFalse);
    });
    test('typed literal', () {
      var l =
          new ExampleTypedLiteral(a: 'x', b: 42, JS$_c: null, JS$class: true);
      expect(js_util.hasProperty(l, 'a'), isTrue);
      expect(js_util.hasProperty(l, 'b'), isTrue);
      expect(js_util.hasProperty(l, '_c'), isTrue);
      expect(l.JS$_c, isNull);
      expect(js_util.hasProperty(l, 'class'), isTrue);
      // JS$_c escapes to _c so the property JS$_c will not exist on the object.
      expect(js_util.hasProperty(l, r'JS$_c'), isFalse);
      expect(js_util.hasProperty(l, r'JS$class'), isFalse);
      expect(l.JS$class, isTrue);

      l = new ExampleTypedLiteral(a: null);
      expect(js_util.hasProperty(l, 'a'), isTrue);
      expect(js_util.hasProperty(l, 'b'), isFalse);
      expect(js_util.hasProperty(l, '_c'), isFalse);
      expect(js_util.hasProperty(l, 'class'), isFalse);

      l = new ExampleTypedLiteral(JS$_c: 74);
      expect(js_util.hasProperty(l, '_c'), isTrue);
      expect(l.JS$_c, equals(74));
    });
  });

  group('getProperty', () {
    test('typed object', () {
      var f = new Foo(42);
      expect(js_util.getProperty(f, 'a'), equals(42));
      expect(js_util.getProperty(f, 'toString') is Function, isTrue);
      js_util.setProperty(f, '__proto__', null);
      expect(js_util.getProperty(f, 'toString'), isNull);
    });

    test('typed literal', () {
      var l = new ExampleTypedLiteral(a: 'x', b: 42, JS$_c: 7, JS$class: true);
      expect(js_util.getProperty(l, 'a'), equals('x'));
      expect(js_util.getProperty(l, 'b'), equals(42));
      expect(js_util.getProperty(l, '_c'), equals(7));
      expect(l.JS$_c, equals(7));
      expect(js_util.getProperty(l, 'class'), isTrue);
      expect(js_util.getProperty(l, r'JS$_c'), isNull);
      expect(js_util.getProperty(l, r'JS$class'), isNull);
    });
  });

  group('setProperty', () {
    test('typed object', () {
      var f = new Foo(42);
      expect(js_util.getProperty(f, 'a'), equals(42));
      js_util.setProperty(f, 'a', 100);
      expect(f.a, equals(100));
      expect(js_util.getProperty(f, 'a'), equals(100));
    });

    test('typed literal', () {
      var l = new ExampleTypedLiteral();
      js_util.setProperty(l, 'a', 'foo');
      expect(js_util.getProperty(l, 'a'), equals('foo'));
      expect(l.a, equals('foo'));
      js_util.setProperty(l, 'a', l);
      expect(identical(l.a, l), isTrue);
      var list = ['arr'];
      js_util.setProperty(l, 'a', list);
      expect(identical(l.a, list), isTrue);
      l.JS$class = 42;
      expect(l.JS$class, equals(42));
      js_util.setProperty(l, 'class', 100);
      expect(l.JS$class, equals(100));
    });
  });

  group('callMethod', () {
    test('html object', () {
      var canvas = new CanvasElement();
      expect(
          identical(canvas.getContext('2d'),
              js_util.callMethod(canvas, 'getContext', ['2d'])),
          isTrue);
    });

    test('typed object', () {
      var f = new Foo(42);
      expect(js_util.callMethod(f, 'bar', []), equals(42));
    });
  });

  group('instanceof', () {
    test('html object', () {
      var canvas = new Element.tag('canvas');
      expect(js_util.instanceof(canvas, JSNodeType), isTrue);
      expect(js_util.instanceof(canvas, JSTextType), isFalse);
      expect(js_util.instanceof(canvas, JSElementType), isTrue);
      expect(js_util.instanceof(canvas, JSHtmlCanvasElementType), isTrue);
      var div = new Element.tag('div');
      expect(js_util.instanceof(div, JSNodeType), isTrue);
      expect(js_util.instanceof(div, JSTextType), isFalse);
      expect(js_util.instanceof(div, JSElementType), isTrue);
      expect(js_util.instanceof(div, JSHtmlCanvasElementType), isFalse);

      var text = new Text('foo');
      expect(js_util.instanceof(text, JSNodeType), isTrue);
      expect(js_util.instanceof(text, JSTextType), isTrue);
      expect(js_util.instanceof(text, JSElementType), isFalse);
    });

    test('typed object', () {
      var f = new Foo(42);
      expect(js_util.instanceof(f, JSFooType), isTrue);
      expect(js_util.instanceof(f, JSNodeType), isFalse);
    });

    test('typed literal', () {
      var l = new ExampleTypedLiteral();
      expect(js_util.instanceof(l, JSFooType), isFalse);
    });
  });

  group('callConstructor', () {
    test('html object', () {
      var textNode = js_util.callConstructor(JSTextType, ['foo']);
      expect(js_util.instanceof(textNode, JSTextType), isTrue);
      expect(textNode is Text, isTrue);
      expect(textNode.text, equals('foo'));
    });

    test('typed object', () {
      Foo f = js_util.callConstructor(JSFooType, [42]);
      expect(f.a, equals(42));
    });
  });

  Future<void> testResolvedPromise() async {
    final String result = await js_util.promiseToFuture(resolvedPromise);
    expect(result, equals('resolved'));
  }

  Future<void> testRejectedPromise() async {
    try {
      final String result = await promiseToFuture(rejectedPromise);
      fail('expected Future to throw an error');
    } catch (error) {
      expect(error, equals('rejected'));
    }
  }

  Future<void> testReturnRejectedPromise() async {
    final String result = await promiseToFuture(getResolvedPromise());
    expect(result, equals('resolved'));
  }

  asyncTest(() async {
    await testResolvedPromise();
    await testRejectedPromise();
    await testReturnRejectedPromise();
  });
}
