package test.collections import kotlin.test.* import org.junit.Test import java.util.HashSet import java.util.LinkedHashSet class ComplexSetJsTest : SetJsTest() { // Helper function with generic parameter to force to use ComlpexHashMap fun doTest() { HashSet() HashSet(3) HashSet(3, 0.5f) 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 = hashSetOf() override fun createEmptyMutableSetWithNullableValues(): MutableSet = hashSetOf() } class PrimitiveSetJsTest : SetJsTest() { override fun createEmptyMutableSet(): MutableSet = HashSet() override fun createEmptyMutableSetWithNullableValues(): MutableSet = HashSet() test override fun constructors() { HashSet() HashSet(3) HashSet(3, 0.5f) val set = HashSet(data) assertEquals(data, set) } } class LinkedHashSetTest : 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) } } abstract class SetJsTest { val data: Set = createTestMutableSet() val empty: Set = createEmptyMutableSet() val SPECIAL_NAMES = array("__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 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"))) } 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")) } 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()) val data2 = createTestMutableSet() assertFalse(data.removeAll(arrayListOf("foo", "bar", "baz"))) assertTrue(data.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") } } test 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 } }