/* * 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 import test.collections.behaviors.* import kotlin.test.* class AbstractCollectionsTest { class ReadOnlyCollection : AbstractCollection() { private val data = arrayOf("ok") override val size: Int get() = 1 override fun iterator(): Iterator = data.iterator() } class ReadOnlySet : AbstractSet() { private val data = arrayOf("ok") override val size: Int get() = 1 override fun iterator(): Iterator = data.iterator() } class ReadOnlyList(override val size: Int = 1) : AbstractList() { override fun get(index: Int): String = index.takeIf { it in indices }?.let { "ok" } ?: throw IndexOutOfBoundsException() } class ReadOnlyMap : AbstractMap() { override val entries: Set> = mapOf("ok" to 42).entries } @Test fun abstractCollection() { val coll = ReadOnlyCollection() assertEquals(listOf("ok"), coll.toList()) compare(coll.toList(), coll) { collectionBehavior() } } @Test fun abstractSet() { val set = ReadOnlySet() assertEquals(1, set.size) assertTrue("ok" in set) compare(set.toSet(), set) { setBehavior() } } @Test fun abstractList() { val list = ReadOnlyList(4) assertEquals(listOf("ok", "ok", "ok", "ok"), list) compare(list.toList(), list) { listBehavior() } } @Test fun abstractMap() { val map = ReadOnlyMap() assertEquals(1, map.size) assertTrue(map.contains("ok")) assertTrue(map.containsValue(42)) assertEquals(setOf("ok"), map.keys) assertEquals(listOf(42), map.values.toList()) compare(map.toMap(), map) { mapBehavior() } } class MutColl(val storage: MutableCollection = mutableListOf()) : AbstractMutableCollection() { override val size: Int get() = storage.size override fun iterator(): MutableIterator = storage.iterator() override fun add(element: String): Boolean = storage.add(element) } class MutList(val storage: MutableList = mutableListOf()) : AbstractMutableList() { override val size: Int get() = storage.size override fun get(index: Int): String = storage.get(index) override fun add(index: Int, element: String) = storage.add(index, element) override fun removeAt(index: Int): String = storage.removeAt(index) override fun set(index: Int, element: String): String = storage.set(index, element) } class MutSet(val storage: MutableSet = mutableSetOf()) : AbstractMutableSet() { override val size: Int get() = storage.size override fun iterator(): MutableIterator = storage.iterator() override fun add(element: String): Boolean = storage.add(element) } class MutMap(val storage: MutableMap = mutableMapOf()) : AbstractMutableMap() { override fun put(key: String, value: Int): Int? = storage.put(key, value) override val entries: MutableSet> get() = storage.entries } @Test fun abstractMutableCollection() { val coll = MutColl() coll += "ok" coll += "test" coll.removeAll { it.length > 2 } assertEquals(1, coll.size) assertEquals(listOf("ok"), coll.toList()) compare(coll.storage, coll) { collectionBehavior() } } @Test fun abstractMutableList() { val list = MutList() list += "test" list += "ok" list += "element" val subList = list.subList(0, 2) subList.retainAll { it.length <= 2 } assertEquals(listOf("ok", "element"), list) compare(list.storage, list) { listBehavior() } } @Test fun abstractMutableSet() { val set = MutSet() set.addAll(listOf("ok", "test", "element", "test")) set.removeAll { it.length < 4 } assertEquals(2, set.size) assertEquals(setOf("element", "test"), set) compare(set.storage, set) { setBehavior() } } @Test fun abstractMutableMap() { val map = MutMap() for (e in 'a'..'z') map[e.toString()] = e.toInt() assertEquals(26, map.size) map.remove("a") map.keys.remove("b") map.keys.removeAll { it == "c" } map.values.remove('d'.toInt()) assertTrue(map.containsKey("e")) assertTrue(map.containsValue('f'.toInt())) compare(map.storage, map) { mapBehavior() } } }