1
+ /*
2
+ * Copyright 2016-2019 JetBrains s.r.o.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package kotlinx.collections.immutable.contractTests.immutableList
18
+
19
+ import com.google.common.collect.testing.TestStringListGenerator
20
+ import kotlinx.collections.immutable.mutate
21
+ import kotlinx.collections.immutable.persistentListOf
22
+
23
+ class PersistentListGenerator {
24
+ object PList {
25
+ object Of : TestStringListGenerator() {
26
+ override fun create (elements : Array <out String >): List <String > {
27
+ return persistentListOf(* elements)
28
+ }
29
+ }
30
+
31
+ object AddAll : TestStringListGenerator() {
32
+ override fun create (elements : Array <out String >): List <String > {
33
+ return persistentListOf<String >().addAll(elements.toList())
34
+ }
35
+ }
36
+
37
+ object AddEach : TestStringListGenerator() {
38
+ override fun create (elements : Array <out String >): List <String > {
39
+ return elements.fold(persistentListOf()) { list, element -> list.add(element) }
40
+ }
41
+ }
42
+
43
+ object MutateAddAll : TestStringListGenerator() {
44
+ override fun create (elements : Array <out String >): List <String > {
45
+ return persistentListOf<String >().mutate { it.addAll(elements.toList()) }
46
+ }
47
+ }
48
+
49
+ object MutateAddEach : TestStringListGenerator() {
50
+ override fun create (elements : Array <out String >): List <String > {
51
+ return persistentListOf<String >().mutate { list -> elements.forEach { list.add(it) } }
52
+ }
53
+ }
54
+
55
+ object HeadSubList : TestStringListGenerator() {
56
+ override fun create (elements : Array <out String >): List <String > {
57
+ val suffix = arrayOf(" f" , " g" )
58
+ val all = Array (elements.size + suffix.size) {
59
+ if (it < elements.size) elements[it] else suffix[it - elements.size]
60
+ }
61
+ return persistentListOf<String >().addAll(all.toList())
62
+ .subList(0 , elements.size)
63
+ }
64
+ }
65
+
66
+ object TailSubList : TestStringListGenerator() {
67
+ override fun create (elements : Array <String >): List <String > {
68
+ val prefix = arrayOf(" f" , " g" )
69
+ val all = Array (elements.size + prefix.size) {
70
+ if (it < prefix.size) prefix[it] else elements[it - prefix.size]
71
+ }
72
+ return persistentListOf<String >().addAll(all.toList())
73
+ .subList(2 , elements.size + 2 )
74
+ }
75
+ }
76
+
77
+ object MiddleSubList : TestStringListGenerator() {
78
+ override fun create (elements : Array <String >): List <String > {
79
+ val prefix = arrayOf(" f" , " g" )
80
+ val suffix = arrayOf(" h" , " i" )
81
+
82
+ val all = arrayOfNulls<String >(2 + elements.size + 2 )
83
+ System .arraycopy(prefix, 0 , all, 0 , 2 )
84
+ System .arraycopy(elements, 0 , all, 2 , elements.size)
85
+ System .arraycopy(suffix, 0 , all, 2 + elements.size, 2 )
86
+
87
+ return persistentListOf<String >().addAll(all.toList() as List <String >)
88
+ .subList(2 , elements.size + 2 )
89
+ }
90
+ }
91
+
92
+
93
+ object Builder {
94
+ object Of : TestStringListGenerator() {
95
+ override fun create (elements : Array <out String >): MutableList <String > {
96
+ return persistentListOf(* elements).builder()
97
+ }
98
+ }
99
+
100
+ object AddAll : TestStringListGenerator() {
101
+ override fun create (elements : Array <out String >): MutableList <String > {
102
+ return persistentListOf<String >().builder().apply { this .addAll(elements.toList()) }
103
+ }
104
+ }
105
+
106
+ object AddEach : TestStringListGenerator() {
107
+ override fun create (elements : Array <out String >): MutableList <String > {
108
+ return persistentListOf<String >().builder().apply { elements.forEach { this .add(it) } }
109
+ }
110
+ }
111
+
112
+ object AddAt : TestStringListGenerator() {
113
+ override fun create (elements : Array <out String >): MutableList <String > {
114
+ val builder = persistentListOf<String >().builder()
115
+
116
+ val list = elements.mapIndexed { i, e -> Pair (i, e) }.toMutableList().apply { shuffle() }
117
+ list.forEachIndexed { index, pair ->
118
+ val preceded = list.subList(0 , index).count { it.first < pair.first }
119
+ builder.add(preceded, pair.second)
120
+ }
121
+
122
+ return builder
123
+ }
124
+ }
125
+
126
+ object HeadSubList : TestStringListGenerator() {
127
+ override fun create (elements : Array <out String >): MutableList <String > {
128
+ val suffix = arrayOf(" f" , " g" )
129
+ val all = Array (elements.size + suffix.size) {
130
+ if (it < elements.size) elements[it] else suffix[it - elements.size]
131
+ }
132
+ return persistentListOf<String >().builder().apply { addAll(all.toList()) }
133
+ .subList(0 , elements.size)
134
+ }
135
+ }
136
+
137
+ object TailSubList : TestStringListGenerator() {
138
+ override fun create (elements : Array <String >): MutableList <String > {
139
+ val prefix = arrayOf(" f" , " g" )
140
+ val all = Array (elements.size + prefix.size) {
141
+ if (it < prefix.size) prefix[it] else elements[it - prefix.size]
142
+ }
143
+ return persistentListOf<String >().builder().apply { addAll(all.toList()) }
144
+ .subList(2 , elements.size + 2 )
145
+ }
146
+ }
147
+
148
+ object MiddleSubList : TestStringListGenerator() {
149
+ override fun create (elements : Array <String >): MutableList <String > {
150
+ val prefix = arrayOf(" f" , " g" )
151
+ val suffix = arrayOf(" h" , " i" )
152
+
153
+ val all = arrayOfNulls<String >(2 + elements.size + 2 )
154
+ System .arraycopy(prefix, 0 , all, 0 , 2 )
155
+ System .arraycopy(elements, 0 , all, 2 , elements.size)
156
+ System .arraycopy(suffix, 0 , all, 2 + elements.size, 2 )
157
+
158
+ return persistentListOf<String >().builder().apply { addAll(all.toList() as List <String >) }
159
+ .subList(2 , elements.size + 2 )
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
0 commit comments