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