1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 package com.google.protobuf.kotlin 9 10 import com.google.common.testing.EqualsTester 11 import com.google.common.truth.Truth.assertThat 12 import kotlin.test.assertFailsWith 13 import org.junit.Test 14 import org.junit.runner.RunWith 15 import org.junit.runners.JUnit4 16 17 @RunWith(JUnit4::class) 18 @OptIn(OnlyForUseByGeneratedProtoCode::class) 19 class DslMapTest { 20 class DummyProxy private constructor() : DslProxy() 21 22 @Test matchesMapnull23 fun matchesMap() { 24 assertThat(DslMap<Int, Int, DummyProxy>(mapOf(1 to -1, 2 to -2))).containsExactly(1, -1, 2, -2) 25 } 26 27 @Test reflectsChangesInMapnull28 fun reflectsChangesInMap() { 29 val mutableMap = mutableMapOf(1 to -1, 2 to -2) 30 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMap) 31 mutableMap[3] = -3 32 assertThat(dslMap).containsExactly(1, -1, 2, -2, 3, -3).inOrder() 33 } 34 35 @Test dslMapIsNotMutablenull36 fun dslMapIsNotMutable() { 37 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 38 assertThat(dslMap is MutableMap<*, *>).isFalse() 39 } 40 41 @Test dslMapKeysAreNotMutablenull42 fun dslMapKeysAreNotMutable() { 43 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 44 assertThat(dslMap.keys is MutableSet<*>).isFalse() 45 } 46 47 @Test dslMapValuesAreNotMutablenull48 fun dslMapValuesAreNotMutable() { 49 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 50 assertThat(dslMap.values is MutableSet<*>).isFalse() 51 } 52 53 @Test dslMapEntriesAreNotMutablenull54 fun dslMapEntriesAreNotMutable() { 55 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 56 assertThat(dslMap.entries is MutableSet<*>).isFalse() 57 } 58 59 @Test dslMapEntryObjectsAreNotMutablenull60 fun dslMapEntryObjectsAreNotMutable() { 61 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 62 assertThat(dslMap.entries.single() is MutableMap.MutableEntry<*, *>).isFalse() 63 } 64 65 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 66 @Test dslMapIsNotEvenSecretlyMutablenull67 fun dslMapIsNotEvenSecretlyMutable() { 68 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 69 val dslMapAsJavaUtilMap = dslMap as java.util.Map<Int, Int> 70 assertFailsWith<UnsupportedOperationException> { dslMapAsJavaUtilMap.put(2, -2) } 71 } 72 73 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 74 @Test dslMapKeysAreNotEvenSecretlyMutablenull75 fun dslMapKeysAreNotEvenSecretlyMutable() { 76 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 77 val dslMapKeysAsJavaUtilSet = dslMap.keys as java.util.Set<Int> 78 assertFailsWith<UnsupportedOperationException> { dslMapKeysAsJavaUtilSet.remove(1) } 79 } 80 81 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 82 @Test dslMapKeysIteratorIsNotEvenSecretlyMutablenull83 fun dslMapKeysIteratorIsNotEvenSecretlyMutable() { 84 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 85 val dslMapKeysAsJavaUtilSet = dslMap.keys as java.util.Set<Int> 86 val itr = dslMapKeysAsJavaUtilSet.iterator() 87 itr.next() 88 assertFailsWith<UnsupportedOperationException> { itr.remove() } 89 } 90 91 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 92 @Test dslMapValuesAreNotEvenSecretlyMutablenull93 fun dslMapValuesAreNotEvenSecretlyMutable() { 94 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 95 val dslMapValuesAsJavaUtilCollection = dslMap.values as java.util.Collection<Int> 96 assertFailsWith<UnsupportedOperationException> { dslMapValuesAsJavaUtilCollection.remove(1) } 97 } 98 99 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 100 @Test dslMapValuesIteratorIsNotEvenSecretlyMutablenull101 fun dslMapValuesIteratorIsNotEvenSecretlyMutable() { 102 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 103 val dslMapValuesAsJavaUtilCollection = dslMap.values as java.util.Collection<Int> 104 val itr = dslMapValuesAsJavaUtilCollection.iterator() 105 itr.next() 106 assertFailsWith<UnsupportedOperationException> { itr.remove() } 107 } 108 109 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 110 @Test dslMapEntriesAreNotEvenSecretlyMutablenull111 fun dslMapEntriesAreNotEvenSecretlyMutable() { 112 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 113 val dslMapEntriesAsJavaUtilSet = dslMap.entries as java.util.Set<Map.Entry<Int, Int>> 114 val entry = dslMap.entries.single() 115 assertFailsWith<UnsupportedOperationException> { dslMapEntriesAsJavaUtilSet.remove(entry) } 116 } 117 118 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 119 @Test dslMapEntriesIteratorIsNotEvenSecretlyMutablenull120 fun dslMapEntriesIteratorIsNotEvenSecretlyMutable() { 121 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 122 val dslMapEntriesAsJavaUtilSet = dslMap.entries as java.util.Set<Map.Entry<Int, Int>> 123 val itr = dslMapEntriesAsJavaUtilSet.iterator() 124 itr.next() 125 assertFailsWith<UnsupportedOperationException> { itr.remove() } 126 } 127 128 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") 129 @Test dslMapEntryObjectsAreNotEvenSecretlyMutablenull130 fun dslMapEntryObjectsAreNotEvenSecretlyMutable() { 131 val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) 132 val dslMapEntryAsJavaUtilMapEntry = dslMap.entries.single() as java.util.Map.Entry<Int, Int> 133 assertFailsWith<UnsupportedOperationException> { dslMapEntryAsJavaUtilMapEntry.value = 2 } 134 } 135 136 @Test expectedToStringnull137 fun expectedToString() { 138 assertThat(DslMap<Int, Int, DummyProxy>(mapOf(1 to 2, 2 to 3)).toString()) 139 .isEqualTo("{1=2, 2=3}") 140 } 141 142 @Test equalitynull143 fun equality() { 144 EqualsTester() 145 .addEqualityGroup(DslMap<Int, Int, DummyProxy>(mapOf(1 to 2, 2 to 3)), mapOf(1 to 2, 2 to 3)) 146 .addEqualityGroup(DslMap<Int, Int, DummyProxy>(mapOf(1 to 3, 2 to 3)), mapOf(1 to 3, 2 to 3)) 147 .addEqualityGroup( 148 DslMap<Int, Int, DummyProxy>(emptyMap()), 149 DslMap<String, String, DummyProxy>(emptyMap()), 150 emptyMap<Int, Int>(), 151 ) 152 .testEquals() 153 } 154 } 155