| /* | |
| * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. | |
| * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. | |
| */ | |
| package test.collections.js | |
| import kotlin.test.* | |
| class JsCollectionsTest { | |
| val TEST_LIST = arrayOf(2, 0, 9, 7, 1).toList() | |
| @Test fun collectionToArray() { | |
| val array = TEST_LIST.toTypedArray() | |
| assertEquals(array.toList(), TEST_LIST) | |
| } | |
| @Test fun toListDoesNotCreateArrayView() { | |
| snapshotDoesNotCreateView(arrayOf("first", "last"), { it.toList() }) | |
| snapshotDoesNotCreateView(arrayOf<Any>("item", 1), { it.toList() }) | |
| } | |
| @Test fun toMutableListDoesNotCreateArrayView() { | |
| snapshotDoesNotCreateView(arrayOf("first", "last"), { it.toMutableList() }) | |
| snapshotDoesNotCreateView(arrayOf<Any>("item", 2), { it.toMutableList() }) | |
| } | |
| @Test fun listOfDoesNotCreateView() { | |
| snapshotDoesNotCreateView(arrayOf("first", "last"), { listOf(*it) }) | |
| snapshotDoesNotCreateView(arrayOf<Any>("item", 3), { listOf(*it) }) | |
| } | |
| @Test fun mutableListOfDoesNotCreateView() { | |
| snapshotDoesNotCreateView(arrayOf("first", "last"), { mutableListOf(*it) }) | |
| snapshotDoesNotCreateView(arrayOf<Any>("item", 4), { mutableListOf(*it) }) | |
| } | |
| @Test fun arrayListDoesNotCreateArrayView() { | |
| snapshotDoesNotCreateView(arrayOf(1, 2), { arrayListOf(*it) }) | |
| snapshotDoesNotCreateView(arrayOf<Any>("first", "last"), { arrayListOf(*it) }) | |
| } | |
| @Suppress("USELESS_CAST") | |
| @Test fun asListHidesPrimitivenessOfArray() { | |
| assertTrue(intArrayOf(1).asList().toTypedArray() as Any is Array<*>, "IntArray primitiveness leaks") | |
| assertTrue(longArrayOf(1).asList().toTypedArray() as Any is Array<*>, "LongArray primitiveness leaks") | |
| assertTrue(charArrayOf(' ').asList().toTypedArray() as Any is Array<*>, "CharArray primitiveness leaks") | |
| } | |
| @Test fun arrayListCapacity() { | |
| val list = ArrayList<Any>(20) | |
| list.ensureCapacity(100) | |
| list.trimToSize() | |
| assertTrue(list.isEmpty()) | |
| } | |
| @Test fun listEqualsOperatesOnAny() { | |
| assertFalse(listOf(1, 2, 3).equals(object {})) | |
| } | |
| @Test fun arrayListValidatesIndexRange() { | |
| val list = mutableListOf(1) | |
| for (index in listOf(-1, 1, 3)) { | |
| if (index != list.size) { // size is a valid position index | |
| assertFailsWith<IndexOutOfBoundsException> { list.add(index, 2) } | |
| assertFailsWith<IndexOutOfBoundsException> { list.addAll(index, listOf(3, 0)) } | |
| assertFailsWith<IndexOutOfBoundsException> { list.listIterator(index) } | |
| } | |
| assertFailsWith<IndexOutOfBoundsException> { list.removeAt(index) } | |
| assertFailsWith<IndexOutOfBoundsException> { list[index] } | |
| assertFailsWith<IndexOutOfBoundsException> { list.subList(index, index + 2) } // tests ranges [-1, 1), [1, 3) and [3, 5) | |
| } | |
| assertEquals(listOf(1), list) | |
| } | |
| @Test fun mutableIteratorRemove() { | |
| val a = mutableListOf(1, 2, 3) | |
| val it = a.iterator() | |
| assertFailsWith<IllegalStateException> { it.remove() } | |
| } | |
| private fun <T> snapshotDoesNotCreateView(array: Array<T>, snapshot: (Array<T>) -> List<T>) { | |
| val first = array.first() | |
| val last = array.last() | |
| val list = snapshot(array) | |
| assertEquals(first, list[0]) | |
| array[0] = last | |
| assertEquals(first, list[0]) | |
| } | |
| } |