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