// 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("ArrayTest.Util")
library js_array_test;

import 'dart:html';

import 'dart:js' as js;
import 'package:js/js.dart';
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package
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));
    });
  });
  */
}
