package test.collections import java.util.* import kotlin.test.* import org.junit.Test as test class MapTest { @test fun getOrElse() { val data = mapOf() val a = data.getOrElse("foo") { 2 } assertEquals(2, a) val a1 = data.getOrElse("foo") { data.get("bar") } ?: 1 assertEquals(1, a1) val b = data.getOrElse("foo") { 3 } assertEquals(3, b) assertEquals(0, data.size) val empty = mapOf() val c = empty.getOrElse("") { null } assertEquals(null, c) val nullable = mapOf(1 to null) val d = nullable.getOrElse(1) { "x" } assertEquals("x", d) } @Suppress("INVISIBLE_MEMBER") @test fun getOrImplicitDefault() { val data: MutableMap = hashMapOf("bar" to 1) assertTrue(assertFails { data.getOrImplicitDefault("foo") } is NoSuchElementException) assertEquals(1, data.getOrImplicitDefault("bar")) val mutableWithDefault = data.withDefault { 42 } assertEquals(42, mutableWithDefault.getOrImplicitDefault("foo")) // verify that it is wrapper mutableWithDefault["bar"] = 2 assertEquals(2, data["bar"]) data["bar"] = 3 assertEquals(3, mutableWithDefault["bar"]) val readonlyWithDefault = (data as Map).withDefault { it.length } assertEquals(4, readonlyWithDefault.getOrImplicitDefault("loop")) val withReplacedDefault = readonlyWithDefault.withDefault { 42 } assertEquals(42, withReplacedDefault.getOrImplicitDefault("loop")) } @test fun getOrPut() { val data = hashMapOf() val a = data.getOrPut("foo") { 2 } assertEquals(2, a) val b = data.getOrPut("foo") { 3 } assertEquals(2, b) assertEquals(1, data.size) val empty = hashMapOf() val c = empty.getOrPut("") { null } assertEquals(null, c) val d = empty.getOrPut("") { 1 } assertEquals(1, d) } @test fun sizeAndEmpty() { val data = hashMapOf() assertTrue { data.none() } assertEquals(data.size, 0) } @test fun setViaIndexOperators() { val map = hashMapOf() assertTrue { map.none() } assertEquals(map.size, 0) map["name"] = "James" assertTrue { map.any() } assertEquals(map.size, 1) assertEquals("James", map["name"]) } @test fun iterate() { val map = mapOf("beverage" to "beer", "location" to "Mells", "name" to "James") val list = arrayListOf() for (e in map) { list.add(e.key) list.add(e.value) } assertEquals(6, list.size) assertEquals("beverage,beer,location,Mells,name,James", list.joinToString(",")) } @test fun stream() { val map = mapOf("beverage" to "beer", "location" to "Mells", "name" to "James") val named = map.asSequence().filter { it.key == "name" }.single() assertEquals("James", named.value) } @test fun iterateWithProperties() { val map = mapOf("beverage" to "beer", "location" to "Mells", "name" to "James") val list = arrayListOf() for (e in map) { list.add(e.key) list.add(e.value) } assertEquals(6, list.size) assertEquals("beverage,beer,location,Mells,name,James", list.joinToString(",")) } @test fun iterateWithExtraction() { val map = mapOf("beverage" to "beer", "location" to "Mells", "name" to "James") val list = arrayListOf() for ((key, value) in map) { list.add(key) list.add(value) } assertEquals(6, list.size) assertEquals("beverage,beer,location,Mells,name,James", list.joinToString(",")) } @test fun contains() { val map = mapOf("a" to 1, "b" to 2) assertTrue("a" in map) assertTrue("c" !in map) } @test fun map() { val m1 = mapOf("beverage" to "beer", "location" to "Mells") val list = m1.map { it.value + " rocks" } assertEquals(listOf("beer rocks", "Mells rocks"), list) } @test fun mapNotNull() { val m1 = mapOf("a" to 1, "b" to null) val list = m1.mapNotNull { it.value?.let { v -> "${it.key}$v" } } assertEquals(listOf("a1"), list) } @test fun mapValues() { val m1 = mapOf("beverage" to "beer", "location" to "Mells") val m2 = m1.mapValues { it.value + "2" } assertEquals("beer2", m2["beverage"]) assertEquals("Mells2", m2["location"]) } @test fun mapKeys() { val m1 = mapOf("beverage" to "beer", "location" to "Mells") val m2 = m1.mapKeys { it.key + "2" } assertEquals("beer", m2["beverage2"]) assertEquals("Mells", m2["location2"]) } @test fun createUsingPairs() { val map = mapOf(Pair("a", 1), Pair("b", 2)) assertEquals(2, map.size) assertEquals(1, map["a"]) assertEquals(2, map["b"]) } @test fun createFromIterable() { val map = listOf(Pair("a", 1), Pair("b", 2)).toMap() assertEquals(2, map.size) assertEquals(1, map.get("a")) assertEquals(2, map.get("b")) } @test fun createWithSelector() { val map = listOf("a", "bb", "ccc").associateBy { it.length } assertEquals(3, map.size) assertEquals("a", map.get(1)) assertEquals("bb", map.get(2)) assertEquals("ccc", map.get(3)) } @test fun createWithSelectorAndOverwrite() { val map = listOf("aa", "bb", "ccc").associateBy { it.length } assertEquals(2, map.size) assertEquals("bb", map.get(2)) assertEquals("ccc", map.get(3)) } @test fun createWithSelectorForKeyAndValue() { val map = listOf("a", "bb", "ccc").associateBy({ it.length }, { it.toUpperCase() }) assertEquals(3, map.size) assertEquals("A", map[1]) assertEquals("BB", map[2]) assertEquals("CCC", map[3]) } @test fun createWithPairSelector() { val map = listOf("a", "bb", "ccc").associate { it.length to it.toUpperCase() } assertEquals(3, map.size) assertEquals("A", map[1]) assertEquals("BB", map[2]) assertEquals("CCC", map[3]) } @test fun createUsingTo() { val map = mapOf("a" to 1, "b" to 2) assertEquals(2, map.size) assertEquals(1, map["a"]) assertEquals(2, map["b"]) } @test fun createMutableMap() { val map = mutableMapOf("b" to 1, "c" to 2) map.put("a", 3) assertEquals(listOf("b" to 1, "c" to 2, "a" to 3), map.toList()) } @test fun createLinkedMap() { val map = linkedMapOf(Pair("c", 3), Pair("b", 2), Pair("a", 1)) assertEquals(1, map["a"]) assertEquals(2, map["b"]) assertEquals(3, map["c"]) assertEquals(listOf("c", "b", "a"), map.keys.toList()) } @test fun filter() { val map = mapOf(Pair("b", 3), Pair("c", 2), Pair("a", 2)) val filteredByKey = map.filter { it.key == "b" } assertEquals(1, filteredByKey.size) assertEquals(3, filteredByKey["b"]) val filteredByKey2 = map.filterKeys { it == "b" } assertEquals(1, filteredByKey2.size) assertEquals(3, filteredByKey2["b"]) val filteredByValue = map.filter { it.value == 2 } assertEquals(2, filteredByValue.size) assertEquals(null, filteredByValue["b"]) assertEquals(2, filteredByValue["c"]) assertEquals(2, filteredByValue["a"]) val filteredByValue2 = map.filterValues { it == 2 } assertEquals(2, filteredByValue2.size) assertEquals(null, filteredByValue2["b"]) assertEquals(2, filteredByValue2["c"]) assertEquals(2, filteredByValue2["a"]) } @test fun any() { val map = mapOf(Pair("b", 3), Pair("c", 2), Pair("a", 2)) assertTrue(map.any()) assertFalse(emptyMap().any()) assertTrue(map.any { it.key == "b" }) assertFalse(emptyMap().any { it.key == "b" }) assertTrue(map.any { it.value == 2 }) assertFalse(map.any { it.value == 5 }) } @test fun all() { val map = mapOf(Pair("b", 3), Pair("c", 2), Pair("a", 2)) assertTrue(map.all { it.key != "d" }) assertTrue(emptyMap().all { it.key == "d" }) assertTrue(map.all { it.value > 0 }) assertFalse(map.all { it.value == 2 }) } @test fun countBy() { val map = mapOf(Pair("b", 3), Pair("c", 2), Pair("a", 2)) assertEquals(3, map.count()) val filteredByKey = map.count { it.key == "b" } assertEquals(1, filteredByKey) val filteredByValue = map.count { it.value == 2 } assertEquals(2, filteredByValue) } @test fun filterNot() { val map = mapOf(Pair("b", 3), Pair("c", 2), Pair("a", 2)) val filteredByKey = map.filterNot { it.key == "b" } assertEquals(2, filteredByKey.size) assertEquals(null, filteredByKey["b"]) assertEquals(2, filteredByKey["c"]) assertEquals(2, filteredByKey["a"]) val filteredByValue = map.filterNot { it.value == 2 } assertEquals(1, filteredByValue.size) assertEquals(3, filteredByValue["b"]) } fun testPlusAssign(doPlusAssign: (MutableMap) -> Unit) { val map = hashMapOf("a" to 1, "b" to 2) doPlusAssign(map) assertEquals(3, map.size) assertEquals(1, map["a"]) assertEquals(4, map["b"]) assertEquals(3, map["c"]) } @test fun plusAssign() = testPlusAssign { it += "b" to 4 it += "c" to 3 } @test fun plusAssignList() = testPlusAssign { it += listOf("c" to 3, "b" to 4) } @test fun plusAssignArray() = testPlusAssign { it += arrayOf("c" to 3, "b" to 4) } @test fun plusAssignSequence() = testPlusAssign { it += sequenceOf("c" to 3, "b" to 4) } @test fun plusAssignMap() = testPlusAssign { it += mapOf("c" to 3, "b" to 4) } fun testPlus(doPlus: (Map) -> Map) { val original = mapOf("A" to 1, "B" to 2) val extended = doPlus(original) assertEquals(3, extended.size) assertEquals(1, extended["A"]) assertEquals(4, extended["B"]) assertEquals(3, extended["C"]) } @test fun plus() = testPlus { it + ("C" to 3) + ("B" to 4) } @test fun plusList() = testPlus { it + listOf("C" to 3, "B" to 4) } @test fun plusArray() = testPlus { it + arrayOf("C" to 3, "B" to 4) } @test fun plusSequence() = testPlus { it + sequenceOf("C" to 3, "B" to 4) } @test fun plusMap() = testPlus { it + mapOf("C" to 3, "B" to 4) } fun testIdempotent(operation: (Map) -> Map) { val original = mapOf("A" to 1, "B" to 2) assertEquals(original, operation(original)) } fun testIdempotentAssign(operation: (MutableMap) -> Unit) { val original = hashMapOf("A" to 1, "B" to 2) val result = HashMap(original) operation(result) assertEquals(original, result) } @test fun plusEmptyList() = testIdempotent { it + listOf() } @test fun plusEmptySet() = testIdempotent { it + setOf() } @test fun plusAssignEmptyList() = testIdempotentAssign { it += listOf() } @test fun plusAssignEmptySet() = testIdempotentAssign { it += setOf() } }