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

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/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

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