/* * 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.* import test.collections.* import test.collections.behaviors.* class ComplexSetJsTest : SetJsTest() { // Helper function with generic parameter to force to use ComlpexHashMap fun doTest() { HashSet() HashSet(3) HashSet(3, 0.5f) @Suppress("UNCHECKED_CAST") val set = HashSet(data as HashSet) assertEquals(data, set) } @Test override fun constructors() { doTest() } // hashSetOf returns ComlpexHashSet because it is Generic override fun createEmptyMutableSet(): MutableSet = genericHashSetOf() override fun createEmptyMutableSetWithNullableValues(): MutableSet = genericHashSetOf() } class PrimitiveSetJsTest : SetJsTest() { override fun createEmptyMutableSet(): MutableSet = stringSetOf() override fun createEmptyMutableSetWithNullableValues(): MutableSet = HashSet() @Test override fun constructors() { HashSet() HashSet(3) HashSet(3, 0.5f) val set = HashSet(data) assertEquals(data, set) } @Test fun compareBehavior() { val specialJsStringSet = HashSet() specialJsStringSet.add("kotlin") compare(genericHashSetOf("kotlin"), specialJsStringSet) { setBehavior() } val specialJsNumberSet = HashSet() specialJsNumberSet.add(3.14) compare(genericHashSetOf(3.14), specialJsNumberSet) { setBehavior() } } } class LinkedHashSetJsTest : SetJsTest() { override fun createEmptyMutableSet(): MutableSet = LinkedHashSet() override fun createEmptyMutableSetWithNullableValues(): MutableSet = LinkedHashSet() @Test override fun constructors() { LinkedHashSet() LinkedHashSet(3) LinkedHashSet(3, 0.5f) val set = LinkedHashSet(data) assertEquals(data, set) } } class LinkedPrimitiveSetJsTest : SetJsTest() { override fun createEmptyMutableSet(): MutableSet = linkedStringSetOf() override fun createEmptyMutableSetWithNullableValues(): MutableSet = LinkedHashSet() @Test override fun constructors() { val orderedData = data.toList() val set = linkedStringSetOf(*orderedData.toTypedArray()) assertEquals(orderedData, set.toList()) } } abstract class SetJsTest { val data: Set = createTestMutableSet() val empty: Set = createEmptyMutableSet() val SPECIAL_NAMES = arrayOf( "__proto__", "constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable" ) @Test fun size() { assertEquals(2, data.size) assertEquals(0, empty.size) } @Test fun isEmpty() { assertFalse(data.isEmpty()) assertTrue(empty.isEmpty()) } @Test fun equalsMethod() { assertNotEquals(createEmptyMutableSet(), data) assertNotEquals(data, empty) assertEquals(createEmptyMutableSet(), empty) assertEquals(createTestMutableSetReversed(), data) } @Test fun contains() { assertTrue(data.contains("foo")) assertTrue(data.contains("bar")) assertFalse(data.contains("baz")) assertFalse(data.contains(1)) assertFalse(empty.contains("foo")) assertFalse(empty.contains("bar")) assertFalse(empty.contains("baz")) assertFalse(empty.contains(1)) } @Test fun iterator() { var result = "" for (e in data) { result += e } assertTrue(result == "foobar" || result == "barfoo") } @Test fun containsAll() { assertTrue(data.containsAll(arrayListOf("foo", "bar"))) assertTrue(data.containsAll(arrayListOf())) assertFalse(data.containsAll(arrayListOf("foo", "bar", "baz"))) assertFalse(data.containsAll(arrayListOf("baz"))) } @Test fun add() { val data = createTestMutableSet() assertTrue(data.add("baz")) assertEquals(3, data.size) assertFalse(data.add("baz")) assertEquals(3, data.size) assertTrue(data.containsAll(arrayListOf("foo", "bar", "baz"))) val nullableSet = createEmptyMutableSetWithNullableValues() assertTrue(nullableSet.add(null)) assertFalse(nullableSet.add(null)) } @Test fun remove() { val data = createTestMutableSet() assertTrue(data.remove("foo")) assertEquals(1, data.size) assertFalse(data.remove("foo")) assertEquals(1, data.size) assertTrue(data.contains("bar")) val nullableSet = createEmptyMutableSetWithNullableValues() nullableSet.add(null) assertTrue(nullableSet.remove(null)) assertFalse(nullableSet.remove(null)) } @Test fun addAll() { val data = createTestMutableSet() assertTrue(data.addAll(arrayListOf("foo", "bar", "baz", "boo"))) assertEquals(4, data.size) assertFalse(data.addAll(arrayListOf("foo", "bar", "baz", "boo"))) assertEquals(4, data.size) assertTrue(data.containsAll(arrayListOf("foo", "bar", "baz", "boo"))) } @Test fun removeAll() { val data = createTestMutableSet() assertFalse(data.removeAll(arrayListOf("baz"))) assertTrue(data.containsAll(arrayListOf("foo", "bar"))) assertEquals(2, data.size) assertTrue(data.removeAll(arrayListOf("foo"))) assertTrue(data.contains("bar")) assertEquals(1, data.size) assertTrue(data.removeAll(arrayListOf("foo", "bar"))) assertEquals(0, data.size) assertFalse(data.removeAll(arrayListOf("foo", "bar", "baz"))) val data2 = createTestMutableSet() assertTrue(data2.removeAll(arrayListOf("foo", "bar", "baz"))) assertTrue(data2.isEmpty()) } @Test fun retainAll() { val data1 = createTestMutableSet() assertTrue(data1.retainAll(arrayListOf("baz"))) assertTrue(data1.isEmpty()) val data2 = createTestMutableSet() assertTrue(data2.retainAll(arrayListOf("foo"))) assertTrue(data2.contains("foo")) assertEquals(1, data2.size) } @Test fun clear() { val data = createTestMutableSet() data.clear() assertTrue(data.isEmpty()) data.clear() assertTrue(data.isEmpty()) } @Test fun specialNamesNotContainsInEmptySet() { for (element in SPECIAL_NAMES) { assertFalse(empty.contains(element), "unexpected element: $element") } } @Test fun specialNamesNotContainsInNonEmptySet() { for (element in SPECIAL_NAMES) { assertFalse(data.contains(element), "unexpected element: $element") } } @Test fun putAndGetSpecialNamesToSet() { val s = createTestMutableSet() for (element in SPECIAL_NAMES) { assertFalse(s.contains(element), "unexpected element: $element") s.add(element) assertTrue(s.contains(element), "element not found: $element") s.remove(element) assertFalse(s.contains(element), "unexpected element after remove: $element") } } abstract fun constructors() @Test fun nullAsValue() { val set = createEmptyMutableSetWithNullableValues() assertTrue(set.isEmpty(), "Set should be empty") set.add(null) assertFalse(set.isEmpty(), "Set should not be empty") assertTrue(set.contains(null), "Set should contains null") assertTrue(set.remove(null), "Expected true when remove null") assertTrue(set.isEmpty(), "Set should be empty") } //Helpers abstract fun createEmptyMutableSet(): MutableSet abstract fun createEmptyMutableSetWithNullableValues(): MutableSet fun createTestMutableSet(): MutableSet { val set = createEmptyMutableSet() set.add("foo") set.add("bar") return set } fun createTestMutableSetReversed(): MutableSet { val set = createEmptyMutableSet() set.add("bar") set.add("foo") return set } fun genericHashSetOf(vararg values: T) = hashSetOf(*values) }