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

// @dart = 2.9

@JS("ArrayTest.Util")
library js_array_test;

import 'dart:html';

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

_injectJs() {
  document.body.append(new ScriptElement()
    ..type = 'text/javascript'
    ..innerHtml = r"""
ArrayTest = {};
ArrayTest.Util = {
  callJsMethod: function(jsObj, jsMethodName, args) {
    return jsObj[jsMethodName].apply(jsObj, args);
  },

  jsEnumerateIndices: function(obj) {
    var ret = [];
    for(var i in obj) {
      ret.push(i);
    }
    return ret;
  },

  checkIsArray: function(obj) {
    return Array.isArray(obj);
  },

  concatValues: function(obj) {
    return obj.concat("a", "b", ["c", "d"], 42, {foo: 10});
  },

  concatOntoArray: function(obj) {
    return [1,2,3].concat(obj, "foo");
  },

  repeatedConcatOntoArray: function(obj) {
    return [1,2,3].concat(obj, obj);
  },

  everyGreaterThanZero: function(obj) {
    return obj.every(function(currentValue, index, array) {
      return currentValue > 0;
    });
  },

  everyGreaterThanZeroCheckThisArg: function(obj) {
    var j = 0;
    return obj.every(function(currentValue, index, array) {
      if (j != index) {
        throw "Unxpected index";
      }
      j++;
      if (array !== obj) {
        throw "Array argument doesn't match obj";
      }
      return currentValue > 0;
    });
  },

  filterGreater42: function(obj) {
    return obj.filter(function(currentValue, index, array) {
      return currentValue > 42;
    });
  },

  forEachCollectResult: function(array) {
    var result = [];
    array.forEach(function(currentValue) {
      result.push(currentValue * 2);
    });
    return result;
  },

  someEqual42: function(array) {
    return array.some(function(currentValue) {
      return currentValue == 42;
    });
  },

  sortNumbersBackwards: function(array) {
    return array.sort(function(a, b) {
      return b - a;
    });
  },

  spliceDummyItems: function(array) {
    return array.splice(1, 2, "quick" ,"brown", "fox");
  },

  spliceTestStringArgs: function(array) {
    return array.splice("1.2", "2.01", "quick" ,"brown", "fox");
  },

  splicePastEnd: function(array) {
    return array.splice(1, 5332, "quick" ,"brown", "fox");
  },

  callJsToString: function(array) {
    return array.toString();
  },

  mapAddIndexToEachElement: function(array) {
    return array.map(function(currentValue, index) {
      return currentValue + index;
    });
  },

  reduceSumDoubledElements: function(array) {
    return array.reduce(function(previousValue, currentValue) {
          return previousValue + currentValue*2;
        },
        0);
  },

  // TODO(jacobr): add a test that distinguishes reduce from reduceRight.
  reduceRightSumDoubledElements: function(array) {
    return array.reduceRight(function(previousValue, currentValue) {
          return previousValue + currentValue*2;
        },
        0);
  },

  getOwnPropertyDescriptor: function(array, property) {
    return Object.getOwnPropertyDescriptor(array, property);
  },

  setLength: function(array, len) {
    return array.length = len;
  },

  getValue: function(obj, index) {
    return obj[index];
  },

  setValue: function(obj, index, value) {
    return obj[index] = value;
  },

  // Calling a method from Dart List on an arbitrary target object.
  callListMethodOnTarget: function(dartArray, target, methodName, args) {
    return dartArray[methodName].apply(target, args);
  },

  newArray: function() { return []; },

  newLiteral: function() { return {}; },

};
""");
}

@JS()
class PropertyDescriptor {
  external get value;
  external bool get writable;
  external bool get enumerable;
  external bool get configurable;
}

@JS()
class SimpleJsLiteralClass {
  external get foo;
}

class Foo {}

@JS()
external callJsMethod(List array, String methodName, List args);

callIndexOf(List array, value) => callJsMethod(array, "indexOf", [value]);
callLastIndexOf(List array, value) =>
    callJsMethod(array, "lastIndexOf", [value]);

callPop(List array) => callJsMethod(array, "pop", []);
callPush(List array, element) => callJsMethod(array, "push", [element]);
callShift(List array) => callJsMethod(array, "shift", []);
callReverse(List array) => callJsMethod(array, "reverse", []);

callListMethodOnObject(object, String methodName, List args) =>
    callListMethodOnTarget([], object, methodName, args);

@JS()
external jsEnumerateIndices(obj);
@JS()
external bool checkIsArray(obj);
@JS()
external concatValues(obj);

@JS()
external concatOntoArray(obj);

@JS()
external repeatedConcatOntoArray(obj);
@JS()
external bool everyGreaterThanZero(obj);
@JS()
external bool everyGreaterThanZeroCheckThisArg(obj);

@JS()
external filterGreater42(obj);

@JS()
external forEachCollectResult(List array);
@JS()
external someEqual42(List array);
@JS()
external sortNumbersBackwards(List array);

@JS()
external List spliceDummyItems(List array);

@JS()
external List spliceTestStringArgs(List array);

@JS()
external List splicePastEnd(List array);

@JS()
external String callJsToString(List array);

@JS()
external mapAddIndexToEachElement(List array);
@JS()
external reduceSumDoubledElements(List array);

// TODO(jacobr): add a test that distinguishes reduce from reduceRight.
@JS()
external reduceRightSumDoubledElements(List array);

@JS()
external PropertyDescriptor getOwnPropertyDescriptor(obj, property);

@JS("setLength")
external callSetLength(List array, length);

@JS()
external getValue(obj, index);

@JS()
external setValue(obj, index, value);

@JS()
external callListMethodOnTarget(
    List target, object, String methodName, List args);

@JS()
external newArray();

@JS()
external newLiteral();

main() {
  _injectJs();

  group('indexOf', () {
    var div = new DivElement();
    var list = [3, 42, "foo", 42, div];
    test('found', () {
      expect(callIndexOf(list, 3), equals(0));
      expect(callIndexOf(list, 42), equals(1));
      expect(callIndexOf(list, "foo"), equals(2));
      expect(callIndexOf(list, div), equals(4));
    });

    test('missing', () {
      expect(callIndexOf(list, 31), equals(-1));
      expect(callIndexOf(list, "42"), equals(-1));
      expect(callIndexOf(list, null), equals(-1));
    });
  });

  group('set length', () {
    test('larger', () {
      var list = ["a", "b", "c", "d"];
      expect(callSetLength(list, 10), equals(10));
      expect(list.length, equals(10));
      expect(list.last, equals(null));
      expect(list[3], equals("d"));
    });

    test('smaller', () {
      var list = ["a", "b", "c", "d"];
      expect(callSetLength(list, 2), equals(2));
      expect(list.first, equals("a"));
      expect(list.last, equals("b"));
      expect(list.length, equals(2));
      expect(callSetLength(list, 0), equals(0));
      expect(list.length, equals(0));
      expect(callSetLength(list, 2), equals(2));
      expect(list.first, equals(null));
    });

    test('invalid', () {
      var list = ["a", "b", "c", "d"];
      expect(() => callSetLength(list, 2.3), throws);
      expect(list.length, equals(4));
      expect(() => callSetLength(list, -1), throws);
      expect(list.length, equals(4));
      // Make sure we are coercing to a JS number.
      expect(callSetLength(list, "2"), equals("2"));
      expect(list.length, equals(2));
    });
  });

  group('join', () {
    var list = [3, 42, "foo"];
    var listWithDartClasses = [3, new Foo(), 42, "foo", new Object()];
    test('default', () {
      expect(callJsMethod(list, "join", []), equals("3,42,foo"));
      expect(callJsMethod(listWithDartClasses, "join", []),
          equals("3,${new Foo()},42,foo,${new Object()}"));
    });

    test('custom separator', () {
      expect(callJsMethod(list, "join", ["##"]), equals("3##42##foo"));
    });
  });

  group('lastIndexOf', () {
    var list = [3, 42, "foo", 42];
    test('found', () {
      expect(callLastIndexOf(list, 3), equals(0));
      expect(callLastIndexOf(list, 42), equals(3));
      expect(callLastIndexOf(list, "foo"), equals(2));
    });

    test('missing', () {
      expect(callLastIndexOf(list, 31), equals(-1));
      expect(callLastIndexOf(list, "42"), equals(-1));
      expect(callLastIndexOf(list, null), equals(-1));
    });
  });

  group('pop', () {
    test('all', () {
      var foo = new Foo();
      var div = new DivElement();
      var list = [3, 42, "foo", foo, div];
      expect(callPop(list), equals(div));
      expect(list.length, equals(4));
      expect(callPop(list), equals(foo));
      expect(list.length, equals(3));
      expect(callPop(list), equals("foo"));
      expect(list.length, equals(2));
      expect(callPop(list), equals(42));
      expect(list.length, equals(1));
      expect(callPop(list), equals(3));
      expect(list.length, equals(0));
      expect(callPop(list), equals(null));
      expect(list.length, equals(0));
    });
  });

  group('push', () {
    test('strings', () {
      var list = [];
      var div = new DivElement();
      expect(callPush(list, "foo"), equals(1));
      expect(callPush(list, "bar"), equals(2));
      // Calling push with 0 elements should do nothing.
      expect(callJsMethod(list, "push", []), equals(2));
      expect(callPush(list, "baz"), equals(3));
      expect(callPush(list, div), equals(4));
      expect(callJsMethod(list, "push", ["a", "b"]), equals(6));
      expect(list, equals(["foo", "bar", "baz", div, "a", "b"]));
    });
  });

  group('shift', () {
    test('all', () {
      var foo = new Foo();
      var div = new DivElement();
      var list = [3, 42, "foo", foo, div];
      expect(callShift(list), equals(3));
      expect(list.length, equals(4));
      expect(callShift(list), equals(42));
      expect(list.length, equals(3));
      expect(callShift(list), equals("foo"));
      expect(list.length, equals(2));
      expect(callShift(list), equals(foo));
      expect(list.length, equals(1));
      expect(callShift(list), equals(div));
      expect(list.length, equals(0));
      expect(callShift(list), equals(null));
      expect(list.length, equals(0));
    });
  });

  group('reverse', () {
    test('simple', () {
      var foo = new Foo();
      var div = new DivElement();
      var list = [div, 42, foo];
      callReverse(list);
      expect(list, equals([foo, 42, div]));
      list = [3, 42];
      callReverse(list);
      expect(list, equals([42, 3]));
    });
  });

  group('slice', () {
    test('copy', () {
      var foo = new Foo();
      var div = new DivElement();
      var list = [3, 42, "foo", foo, div];
      var copy = callJsMethod(list, "slice", []);
      expect(identical(list, copy), isFalse);
      expect(copy.length, equals(list.length));
      for (var i = 0; i < list.length; i++) {
        expect(list[i], equals(copy[i]));
      }
      expect(identical(list[3], copy[3]), isTrue);
      expect(identical(list[4], copy[4]), isTrue);

      copy.add("dummy");
      expect(list.length + 1, equals(copy.length));
    });

    test('specify start', () {
      var list = [3, 42, "foo"];
      var copy = callJsMethod(list, "slice", [1]);
      expect(copy.first, equals(42));
    });

    test('specify start and end', () {
      var list = [3, 42, 92, "foo"];
      var copy = callJsMethod(list, "slice", [1, 3]);
      expect(copy.first, equals(42));
      expect(copy.last, equals(92));
    });

    test('from end', () {
      var list = [3, 42, 92, "foo"];
      expect(callJsMethod(list, "slice", [-2]), equals([92, "foo"]));

      // Past the end of the front of the array.
      expect(callJsMethod(list, "slice", [-2, 3]), equals([92]));

      // Past the end of the front of the array.
      expect(callJsMethod(list, "slice", [-10, 2]), equals([3, 42]));
    });
  });

  group("js snippet tests", () {
    test("enumerate indices", () {
      var list = ["a", "b", "c", "d"];
      var indices = jsEnumerateIndices(list);
      expect(indices.length, equals(4));
      for (int i = 0; i < 4; i++) {
        expect(indices[i], equals('$i'));
      }
    });

    test("set element", () {
      var list = ["a", "b", "c", "d"];
      setValue(list, 0, 42);
      expect(list[0], equals(42));
      setValue(list, 1, 84);
      expect(list[1], equals(84));
      setValue(list, 6, 100); // Off the end of the list.
      expect(list.length, equals(7));
      expect(list[4], equals(null));
      expect(list[6], equals(100));

      // These tests have to be commented out because we don't persist
      // JS proxies for Dart objects like we could/should.
      // setValue(list, -1, "foo"); // Not a valid array index
      // expect(getValue(list, -1), equals("foo"));
      // expect(getValue(list, "-1"), equals("foo"));
    });

    test("get element", () {
      var list = ["a", "b", "c", "d"];
      expect(getValue(list, 0), equals("a"));
      expect(getValue(list, 1), equals("b"));
      expect(getValue(list, 6), equals(null));
      expect(getValue(list, -1), equals(null));

      expect(getValue(list, "0"), equals("a"));
      expect(getValue(list, "1"), equals("b"));
    });

    test("is array", () {
      var list = ["a", "b"];
      expect(checkIsArray(list), isTrue);
    });

    test("property descriptors", () {
      // This test matters to make behavior consistent with JS native arrays
      // and to make devtools integration work well.
      var list = ["a", "b"];
      var descriptor = getOwnPropertyDescriptor(list, 0);

      expect(descriptor.value, equals("a"));
      expect(descriptor.writable, isTrue);
      // TODO(jacobr): commented out until https://github.com/dart-lang/sdk/issues/26128
      // is fixed.
      // expect(descriptor.enumerable, isTrue);
      // expect(descriptor.configurable, isTrue);

      descriptor = getOwnPropertyDescriptor(list, "length");
      expect(descriptor.value, equals(2));
      expect(descriptor.writable, isTrue);
      expect(descriptor.enumerable, isFalse);
      expect(descriptor.configurable, isFalse);
    });

    test("concat js arrays", () {
      var list = ["1", "2"];
      // Tests that calling the concat method from JS will flatten out JS arrays
      // We concat the array with "a", "b", ["c", "d"], 42, {foo: 10}
      // which should generate ["1", "2", "a", "b", ["c", "d"], 42, {foo: 10}]
      var ret = concatValues(list);
      expect(list.length, equals(2));
      expect(ret.length, equals(8));
      expect(ret[0], equals("1"));
      expect(ret[3], equals("b"));
      expect(ret[5], equals("d"));
      expect(ret[6], equals(42));
      dynamic item = ret[7];
      expect(item.foo, equals(10));
    });

    test("concat onto arrays", () {
      // This test only passes if we have monkey patched the core Array object
      // prototype to handle Dart Lists.
      var list = ["a", "b"];
      var ret = concatOntoArray(list);
      expect(list.length, equals(2));
      expect(ret, equals([1, 2, 3, "a", "b", "foo"]));
    });

    test("dart arrays on dart arrays", () {
      // This test only passes if we have monkey patched the core Array object
      // prototype to handle Dart Lists.
      var list = ["a", "b"];
      var ret = callJsMethod(list, "concat", [
        ["c", "d"],
        "e",
        ["f", "g"]
      ]);
      expect(list.length, equals(2));
      expect(ret, equals(["a", "b", "c", "d", "e", "f", "g"]));
    });

    test("every greater than zero", () {
      expect(everyGreaterThanZero([1, 5]), isTrue);
      expect(everyGreaterThanZeroCheckThisArg([1, 5]), isTrue);
      expect(everyGreaterThanZero([1, 0]), isFalse);
      expect(everyGreaterThanZero([]), isTrue);
    });

    test("filter greater than 42", () {
      expect(filterGreater42([1, 5]), equals([]));
      expect(filterGreater42([43, 5, 49]), equals([43, 49]));
      expect(filterGreater42(["43", "5", "49"]), equals(["43", "49"]));
    });

    test("for each collect result", () {
      expect(forEachCollectResult([1, 5, 7]), equals([2, 10, 14]));
    });

    test("some", () {
      expect(someEqual42([1, 5, 9]), isFalse);
      expect(someEqual42([1, 42, 9]), isTrue);
    });

    test("sort backwards", () {
      var arr = [1, 5, 9];
      var ret = sortNumbersBackwards(arr);
      expect(identical(arr, ret), isTrue);
      expect(ret, equals([9, 5, 1]));
    });

    test("splice dummy items", () {
      var list = [1, 2, 3, 4];
      var removed = spliceDummyItems(list);
      expect(removed.length, equals(2));
      expect(removed[0], equals(2));
      expect(removed[1], equals(3));
      expect(list.first, equals(1));
      expect(list[1], equals("quick"));
      expect(list[2], equals("brown"));
      expect(list[3], equals("fox"));
      expect(list.last, equals(4));
    });

    test("splice string args", () {
      var list = [1, 2, 3, 4];
      var removed = spliceTestStringArgs(list);
      expect(removed.length, equals(2));
      expect(removed[0], equals(2));
      expect(removed[1], equals(3));
      expect(list.first, equals(1));
      expect(list[1], equals("quick"));
      expect(list[2], equals("brown"));
      expect(list[3], equals("fox"));
      expect(list.last, equals(4));
    });

    test("splice pastEndOfArray", () {
      var list = [1, 2, 3, 4];
      var removed = splicePastEnd(list);
      expect(removed.length, equals(3));
      expect(list.first, equals(1));
      expect(list.length, equals(4));
      expect(list[1], equals("quick"));
      expect(list[2], equals("brown"));
      expect(list[3], equals("fox"));
    });

    test("splice both bounds past end of array", () {
      var list = [1];
      var removed = splicePastEnd(list);
      expect(removed.length, equals(0));
      expect(list.first, equals(1));
      expect(list.length, equals(4));
      expect(list[1], equals("quick"));
      expect(list[2], equals("brown"));
      expect(list[3], equals("fox"));
    });

    test("call List method on JavaScript object", () {
      var jsObject = newLiteral();
      callListMethodOnObject(jsObject, 'push', ["a"]);
      callListMethodOnObject(jsObject, 'push', ["b"]);
      callListMethodOnObject(jsObject, 'push', ["c", "d"]);
      callListMethodOnObject(jsObject, 'push', []);

      expect(json_helper.stringify(jsObject),
          equals('{"0":"a","1":"b","2":"c","3":"d","length":4}'));

      expect(callListMethodOnObject(jsObject, 'pop', []), equals("d"));
      expect(callListMethodOnObject(jsObject, 'join', ["#"]), equals("a#b#c"));

      var jsArray = newArray();
      callListMethodOnObject(jsArray, 'push', ["a"]);
      callListMethodOnObject(jsArray, 'push', ["b"]);
      callListMethodOnObject(jsArray, 'push', ["c", "d"]);
      callListMethodOnObject(jsArray, 'push', []);

      expect(json_helper.stringify(jsArray), equals('["a","b","c","d"]'));
    });
  });

  // This test group is disabled until we figure out an efficient way to
  // distinguish between "array" Dart List types and non-array Dart list types.
  /*
  group('Non-array Lists', () {
    test('opaque proxy', () {
      // Dartium could easily support making LinkedList and all other classes
      // implementing List behave like a JavaScript array but that would
      // be challenging to implement in dart2js until browsers support ES6.
      var list = ["a", "b", "c", "d"];
      var listView = new UnmodifiableListView(list.getRange(1,3));
      expect(listView is List, isTrue);
      expect(listView.length, equals(2));
      expect(checkIsArray(listView), isFalse);
      expect(checkIsArray(listView.toList()), isTrue);
      expect(getOwnPropertyDescriptor(
          listView, "length"), equals(null));
    });
  });
  */
}
