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

library jsTest;

import 'dart:js';

// TODO(jmesserly): get tests from package(s) instead.
import 'dom.dart';
import 'minitest.dart';

class Foo {
  final JsObject _proxy;

  Foo(num a) : this._proxy = new JsObject(context['Foo'], [a]);

  JsObject toJs() => _proxy;

  num get a => _proxy['a'];
  num bar() => _proxy.callMethod('bar');
}

class Color {
  static final RED = new Color._("red");
  static final BLUE = new Color._("blue");
  String _value;
  Color._(this._value);
  String toJs() => this._value;
}

class TestDartObject {}

class Callable {
  call() => 'called';
}

main() {
  group('identity', () {

    test('context instances should be identical', () {
      var c1 = context;
      var c2 = context;
      expect(identical(c1, c2), true);
    });

    // TODO(jacobr): switch from equals to identical when dartium supports
    // maintaining proxy equality.
    test('identical JS functions should have equal proxies', () {
      var f1 = context['Object'];
      var f2 = context['Object'];
      expect(f1, equals(f2));
    });

    // TODO(justinfagnani): old tests duplicate checks above, remove
    // on test next cleanup pass
    test('test proxy equality', () {
      var foo1 = new JsObject(context['Foo'], [1]);
      var foo2 = new JsObject(context['Foo'], [2]);
      context['foo1'] = foo1;
      context['foo2'] = foo2;
      expect(foo1, isNot(context['foo2']));
      expect(foo2, context['foo2']);
      context.deleteProperty('foo1');
      context.deleteProperty('foo2');
    });

    test('retrieve same dart Object', () {
      final obj = new Object();
      context['obj'] = obj;
      expect(context['obj'], same(obj));
      context.deleteProperty('obj');
    });

    group('caching', () {
      test('JS->Dart', () {
        // Test that we are not pulling cached proxy from the prototype
        // when asking for a proxy for the object.
        final proto = context['someProto'];
        expect(proto['role'], 'proto');
        final obj = context['someObject'];
        expect(obj['role'], 'object');
      });
    });

  });

  group('context', () {

    test('read global field', () {
      expect(context['x'], 42);
      expect(context['y'], null);
    });

    test('read global field with underscore', () {
      expect(context['_x'], 123);
      expect(context['y'], null);
    });

    test('write global field', () {
      context['y'] = 42;
      expect(context['y'], 42);
    });

  });

  group('new JsObject()', () {

    test('new Foo()', () {
      var foo = new JsObject(context['Foo'], [42]);
      expect(foo['a'], 42);
      expect(foo.callMethod('bar'), 42);
      expect(() => foo.callMethod('baz'), throwsA(isNoSuchMethodError));
    });

    test('new container.Foo()', () {
      final Foo2 = context['container']['Foo'];
      final foo = new JsObject(Foo2, [42]);
      expect(foo['a'], 42);
      expect(Foo2['b'], 38);
    });

    test('new Array()', () {
      var a = new JsObject(context['Array']);
      expect(a, (a) => a is JsArray);

      // Test that the object still behaves via the base JsObject interface.
      // JsArray specific tests are below.
      expect(a['length'], 0);

      a.callMethod('push', ["value 1"]);
      expect(a['length'], 1);
      expect(a[0], "value 1");

      a.callMethod('pop');
      expect(a['length'], 0);
    });

    test('new Date()', () {
      final a = new JsObject(context['Date']);
      expect(a.callMethod('getTime'), isNotNull);
    });

    test('new Date(12345678)', () {
      final a = new JsObject(context['Date'], [12345678]);
      expect(a.callMethod('getTime'), 12345678);
    });

    test('new Date("December 17, 1995 03:24:00 GMT")', () {
      final a = new JsObject(context['Date'],
          ["December 17, 1995 03:24:00 GMT"]);
      expect(a.callMethod('getTime'), 819170640000);
    });

    test('new Date(1995,11,17)', () {
      // Note: JS Date counts months from 0 while Dart counts from 1.
      final a = new JsObject(context['Date'], [1995, 11, 17]);
      final b = new DateTime(1995, 12, 17);
      expect(a.callMethod('getTime'), b.millisecondsSinceEpoch);
    });

    test('new Date(1995,11,17,3,24,0)', () {
      // Note: JS Date counts months from 0 while Dart counts from 1.
      final a = new JsObject(context['Date'],
          [1995, 11, 17, 3, 24, 0]);
      final b = new DateTime(1995, 12, 17, 3, 24, 0);
      expect(a.callMethod('getTime'), b.millisecondsSinceEpoch);
    });

    test('new Object()', () {
      final a = new JsObject(context['Object']);
      expect(a, isNotNull);

      a['attr'] = "value";
      expect(a['attr'], "value");
    });

    test(r'new RegExp("^\w+$")', () {
      final a = new JsObject(context['RegExp'], [r'^\w+$']);
      expect(a, isNotNull);
      expect(a.callMethod('test', ['true']), true);
      expect(a.callMethod('test', [' false']), false);
    });

    test('js instantiation via map notation : new Array()', () {
      final a = new JsObject(context['Array']);
      expect(a, isNotNull);
      expect(a['length'], 0);

      a.callMethod('push', ["value 1"]);
      expect(a['length'], 1);
      expect(a[0], "value 1");

      a.callMethod('pop');
      expect(a['length'], 0);
    });

    test('js instantiation via map notation : new Date()', () {
      final a = new JsObject(context['Date']);
      expect(a.callMethod('getTime'), isNotNull);
    });

    test('>10 parameters', () {
      final o = new JsObject(context['Baz'], [1,2,3,4,5,6,7,8,9,10,11]);
      for (var i = 1; i <= 11; i++) {
        expect(o["f$i"], i);
      }
      expect(o['constructor'], context['Baz']);
    });
  });

  group('JsFunction and callMethod', () {

    test('new JsObject can return a JsFunction', () {
      var f = new JsObject(context['Function']);
      expect(f, (a) => a is JsFunction);
    });

    test('JsFunction.apply on a function defined in JS', () {
      expect(context['razzle'].apply([]), 42);
    });

    test('JsFunction.apply on a function that uses "this"', () {
      var object = new Object();
      expect(context['returnThis'].apply([], thisArg: object), same(object));
    });

    test('JsObject.callMethod on a function defined in JS', () {
      expect(context.callMethod('razzle'), 42);
      expect(() => context.callMethod('dazzle'), throwsA(isNoSuchMethodError));
    });

    test('callMethod with many arguments', () {
      expect(context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
        55);
    });

    test('access a property of a function', () {
      expect(context.callMethod('Bar'), "ret_value");
      expect(context['Bar']['foo'], "property_value");
    });

  });

  group('JsArray', () {

    test('new JsArray()', () {
      var array = new JsArray();
      var arrayType = context['Array'];
      expect(array.instanceof(arrayType), true);
      expect(array, []);
      // basic check that it behaves like a List
      array.addAll([1, 2, 3]);
      expect(array, [1, 2, 3]);
    });

    test('new JsArray.from()', () {
      var array = new JsArray.from([1, 2, 3]);
      var arrayType = context['Array'];
      expect(array.instanceof(arrayType), true);
      expect(array, [1, 2, 3]);
    });

    test('get Array from JS', () {
      context['a'] = new JsObject(context['Array'], [1, 2, 3]);
      expect(context.callMethod('isPropertyInstanceOf',
          ['a', context['Array']]), true);
      var a = context['a'];
      expect(a, (a) => a is JsArray);
      expect(a, [1, 2, 3]);
      context.deleteProperty('a');
    });

    test('pass Array to JS', () {
      context['a'] = [1, 2, 3];
      expect(context.callMethod('isPropertyInstanceOf',
          ['a', context['Array']]), false);
      var a = context['a'];
      expect(a, (a) => a is List);
      expect(a, isNot((a) => a is JsArray));
      expect(a, [1, 2, 3]);
      context.deleteProperty('a');
    });

    test('[]', () {
      var array = new JsArray.from([1, 2]);
      expect(array[0], 1);
      expect(array[1], 2);
      expect(() => array[-1], throwsA(isRangeError));
      expect(() => array[2], throwsA(isRangeError));
    });

   test('[]=', () {
      var array = new JsArray.from([1, 2]);
      array[0] = 'd';
      array[1] = 'e';
      expect(array, ['d', 'e']);
      expect(() => array[-1] = 3, throwsA(isRangeError));
      expect(() => array[2] = 3, throwsA(isRangeError));
    });

    test('length', () {
      var array = new JsArray.from([1, 2, 3]);
      expect(array.length, 3);
      array.add(4);
      expect(array.length, 4);
      array.length = 2;
      expect(array, [1, 2]);
      array.length = 3;
      expect(array, [1, 2, null]);
    });
 
     test('add', () {
      var array = new JsArray();
      array.add('a');
      expect(array, ['a']);
      array.add('b');
      expect(array, ['a', 'b']);
    });

    test('addAll', () {
      var array = new JsArray();
      array.addAll(['a', 'b']);
      expect(array, ['a', 'b']);
      // make sure addAll can handle Iterables
      array.addAll(new Set.from(['c']));
      expect(array, ['a', 'b', 'c']);
    });

    test('insert', () {
      var array = new JsArray.from([]);
      array.insert(0, 'b');
      expect(array, ['b']);
      array.insert(0, 'a');
      expect(array, ['a', 'b']);
      array.insert(2, 'c');
      expect(array, ['a', 'b', 'c']);
      expect(() => array.insert(4, 'e'), throwsA(isRangeError));
      expect(() => array.insert(-1, 'e'), throwsA(isRangeError));
    });

    test('removeAt', () {
      var array = new JsArray.from(['a', 'b', 'c']);
      expect(array.removeAt(1), 'b');
      expect(array, ['a', 'c']);
      expect(() => array.removeAt(2), throwsA(isRangeError));
      expect(() => array.removeAt(-1), throwsA(isRangeError));
    });

    test('removeLast', () {
      var array = new JsArray.from(['a', 'b', 'c']);
      expect(array.removeLast(), 'c');
      expect(array, ['a', 'b']);
      array.length = 0;
      expect(() => array.removeLast(), throwsA(isRangeError));
    });

    test('removeRange', () {
      var array = new JsArray.from(['a', 'b', 'c', 'd']);
      array.removeRange(1, 3);
      expect(array, ['a', 'd']);
      expect(() => array.removeRange(-1, 2), throwsA(isRangeError));
      expect(() => array.removeRange(0, 3), throwsA(isRangeError));
      expect(() => array.removeRange(2, 1), throwsA(isRangeError));
    });

    test('setRange', () {
      var array = new JsArray.from(['a', 'b', 'c', 'd']);
      array.setRange(1, 3, ['e', 'f']);
      expect(array, ['a', 'e', 'f', 'd']);
      array.setRange(3, 4, ['g', 'h', 'i'], 1);
      expect(array, ['a', 'e', 'f', 'h']);
    });

    test('sort', () {
      var array = new JsArray.from(['c', 'a', 'b']);
      array.sort();
      expect(array, ['a', 'b', 'c']);
    });

    test('sort with a Comparator', () {
      var array = new JsArray.from(['c', 'a', 'b']);
      array.sort((a, b) => -(a.compareTo(b)));
      expect(array, ['c', 'b', 'a']);
    });

  });

  group('JsObject.fromBrowserObject()', () {

    test('Nodes are proxied', () {
      var node = new JsObject.fromBrowserObject(document.createElement('div'));
      context.callMethod('addTestProperty', [node]);
      expect(node is JsObject, true);
      expect(node.instanceof(context['HTMLDivElement']), true);
      expect(node['testProperty'], 'test');
    });

    test('primitives and null throw ArgumentError', () {
      for (var v in ['a', 1, 2.0, true, null]) {
        expect(() => new JsObject.fromBrowserObject(v),
            throwsA((a) => a is ArgumentError));
      }
    });

  });

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

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

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

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

    test('invoke Dart callback from JS with this', () {
      // A JavaScript constructor implemented in Dart using 'this'
      final constructor = new JsFunction.withThis(($this, arg1) {
        $this['a'] = 42;
      });
      var o = new JsObject(constructor, ["b"]);
      expect(o['a'], 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'),
          '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 be callable in JS', () {
      context['callable'] = new Callable();
      var result = context.callMethod('callable');
      expect(result, 'called');
      context.deleteProperty('callable');
    });

  });

  group('JsObject.jsify()', () {

    test('convert a List', () {
      final list = [1, 2, 3, 4, 5, 6, 7, 8];
      var array = new JsObject.jsify(list);
      expect(context.callMethod('isArray', [array]), true);
      expect(array['length'], list.length);
      for (var i = 0; i < list.length ; i++) {
        expect(array[i], list[i]);
      }
    });

    test('convert an Iterable', () {
      final set = new Set.from([1, 2, 3, 4, 5, 6, 7, 8]);
      var array = new JsObject.jsify(set);
      expect(context.callMethod('isArray', [array]), true);
      expect(array['length'], set.length);
      for (var i = 0; i < array['length'] ; i++) {
        expect(set.contains(array[i]), true);
      }
    });

    test('convert a Map', () {
      var map = {'a': 1, 'b': 2, 'c': 3};
      var jsMap = new JsObject.jsify(map);
      expect(!context.callMethod('isArray', [jsMap]), true);
      for (final key in map.keys) {
        expect(context.callMethod('checkMap', [jsMap, key, map[key]]), true);
      }
    });

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

    test('throws if object is not a Map or Iterable', () {
      expect(() => new JsObject.jsify('a'),
          throwsA((a) => a is ArgumentError));
    });
  });

  group('JsObject methods', () {

    test('hashCode and ==', () {
      final o1 = context['Object'];
      final o2 = context['Object'];
      expect(o1 == o2, true);
      expect(o1.hashCode == o2.hashCode, true);
      final d = context['document'];
      expect(o1 == d, false);
    });

    test('toString', () {
      var foo = new JsObject(context['Foo'], [42]);
      expect(foo.toString(), "I'm a Foo a=42");
      var container = context['container'];
      expect(container.toString(), "[object Object]");
    });

    test('toString returns a String even if the JS object does not', () {
      var foo = new JsObject(context['Liar']);
      expect(foo.callMethod('toString'), 1);
      expect(foo.toString(), '1');
    });

    test('instanceof', () {
      var foo = new JsObject(context['Foo'], [1]);
      expect(foo.instanceof(context['Foo']), true);
      expect(foo.instanceof(context['Object']), true);
      expect(foo.instanceof(context['String']), false);
    });

    test('deleteProperty', () {
      var object = new JsObject.jsify({});
      object['a'] = 1;
      expect(context['Object'].callMethod('keys', [object])['length'], 1);
      expect(context['Object'].callMethod('keys', [object])[0], "a");
      object.deleteProperty("a");
      expect(context['Object'].callMethod('keys', [object])['length'], 0);
    });

    test('hasProperty', () {
      var object = new JsObject.jsify({});
      object['a'] = 1;
      expect(object.hasProperty('a'), true);
      expect(object.hasProperty('b'), false);
    });

    test('[] and []=', () {
      final myArray = context['myArray'];
      expect(myArray['length'], 1);
      expect(myArray[0], "value1");
      myArray[0] = "value2";
      expect(myArray['length'], 1);
      expect(myArray[0], "value2");

      final foo = new JsObject(context['Foo'], [1]);
      foo["getAge"] = () => 10;
      expect(foo.callMethod('getAge'), 10);
    });

  });

  group('transferrables', () {

    group('JS->Dart', () {

      test('DateTime', () {
        var date = context.callMethod('getNewDate');
        expect(date is DateTime, true);
      });

      test('window', () {
        expect(context['window'] is Window, true);
      });

      test('foreign browser objects should be proxied', () {
        var iframe = document.createElement('iframe');
        document.body.appendChild(iframe);
        var proxy = new JsObject.fromBrowserObject(iframe);

        // Window
        var contentWindow = proxy['contentWindow'];
        expect(contentWindow, isNot((a) => a is Window));
        expect(contentWindow, (a) => a is JsObject);

        // Node
        var foreignDoc = contentWindow['document'];
        expect(foreignDoc, isNot((a) => a is Node));
        expect(foreignDoc, (a) => a is JsObject);

        // Event
        var clicked = false;
        foreignDoc['onclick'] = (e) {
          expect(e, isNot((a) => a is Event));
          expect(e, (a) => a is JsObject);
          clicked = true;
        };

        context.callMethod('fireClickEvent', [contentWindow]);
        expect(clicked, true);
      });

      test('document', () {
        expect(context['document'] is Document, true);
      });

      test('Blob', () {
        var blob = context.callMethod('getNewBlob');
        expect(blob is Blob, true);
        expect(blob.type, 'text/html');
      });

      test('unattached DivElement', () {
        var node = context.callMethod('getNewDivElement');
        expect(node is DivElement, true);
      });

      test('Event', () {
        var event = context.callMethod('getNewEvent');
        expect(event is Event, true);
      });

      test('ImageData', () {
        var node = context.callMethod('getNewImageData');
        expect(node is ImageData, true);
      });

    });

    group('Dart->JS', () {

      test('Date', () {
        context['o'] = new DateTime(1995, 12, 17);
        var dateType = context['Date'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', dateType]),
            true);
        context.deleteProperty('o');
      });

      test('window', () {
        context['o'] = window;
        var windowType = context['Window'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', windowType]),
            true);
        context.deleteProperty('o');
      });

      test('document', () {
        context['o'] = document;
        var documentType = context['Document'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', documentType]),
            true);
        context.deleteProperty('o');
      });

      test('Blob', () {
        var fileParts = ['<a id="a"><b id="b">hey!</b></a>'];
        context['o'] = new Blob(fileParts, type: 'text/html');
        var blobType = context['Blob'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', blobType]),
            true);
        context.deleteProperty('o');
      });

      test('unattached DivElement', () {
        context['o'] = document.createElement('div');
        var divType = context['HTMLDivElement'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', divType]),
            true);
        context.deleteProperty('o');
      });

      test('Event', () {
        context['o'] = new CustomEvent('test');
        var eventType = context['Event'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', eventType]),
            true);
        context.deleteProperty('o');
      });

      // this test fails in IE9 for very weird, but unknown, reasons
      // the expression context['ImageData'] fails if useHtmlConfiguration()
      // is called, or if the other tests in this file are enabled
      test('ImageData', () {
        CanvasElement canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
        context['o'] = ctx.createImageData(1, 1);
        var imageDataType = context['ImageData'];
        expect(context.callMethod('isPropertyInstanceOf', ['o', imageDataType]),
            true);
        context.deleteProperty('o');
      });

    });
  });
}
