// 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('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']]),
        isTrue);
    var a = context['a'];
    expect(a is JsArray, isTrue);
    expect(a, [1, 2, 3]);
    context.deleteProperty('a');
  });

  test('pass Array to JS', () {
    context['a'] = [1, 2, 3];
    var a = context['a'];
    expect(a is List, isTrue);
    expect(a is JsArray, isFalse);
    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], throwsRangeError);
    expect(() => array[2], throwsRangeError);
  });

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

  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'), throwsRangeError);
    expect(() => array.insert(-1, 'e'), throwsRangeError);
  });

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

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

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

  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']);
  });
}
