get rid of intellij.build.toolbox.litegen parameter and use BuildOptions.TOOLBOX_LITE...
[idea/community.git] / platform / diff-impl / tests / testSrc / com / intellij / diff / comparison / MergeResolveUtilTest.kt
1 /*
2  * Copyright 2000-2016 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 package com.intellij.diff.comparison
17
18 import com.intellij.diff.DiffTestCase
19
20 class MergeResolveUtilTest : DiffTestCase() {
21   fun testSimple() {
22     test(
23       "",
24       "",
25       "",
26       ""
27     )
28
29     test(
30       "x x x",
31       "x x x",
32       "x x x",
33       "x x x"
34     )
35
36     test(
37       "x x x",
38       "x Y x",
39       "x x x",
40       "x Y x"
41     )
42
43     test(
44       "x x",
45       "x x",
46       "x Y x",
47       "x Y x"
48     )
49
50     test(
51       "x X x",
52       "x x",
53       "x X x",
54       "x x"
55     )
56   }
57
58   fun testSameModification() {
59     test(
60       "x x x",
61       "x Y x",
62       "x Y x",
63       "x Y x"
64     )
65
66     test(
67       "x x",
68       "x Y x",
69       "x Y x",
70       "x Y x"
71     )
72
73     test(
74       "x X x",
75       "x x",
76       "x x",
77       "x x"
78     )
79   }
80
81   fun testNonConflictingChanges() {
82     test(
83       "x x x",
84       "x Y x x",
85       "x x Z x",
86       "x Y x Z x"
87     )
88
89     test(
90       "x",
91       "x Y",
92       "Z x",
93       "Z x Y"
94     )
95
96     test(
97       "x x",
98       "x",
99       "Z x x",
100       "Z x"
101     )
102   }
103
104   fun testFailure() {
105     test(
106       "x x x",
107       "x Y x",
108       "x Z x",
109       null
110     )
111
112     test(
113       "x x",
114       "x Y x",
115       "x Z x",
116       null
117     )
118   }
119
120   fun testNonFailureConflicts() {
121     testGreedy(
122       "x X x",
123       "x x",
124       "x X Y x",
125       "x Y x"
126     )
127
128     testGreedy(
129       "x X x",
130       "x x",
131       "x Y X x",
132       "x Y x"
133     )
134
135     testGreedy(
136       "x X Y x",
137       "x X x",
138       "x Y x",
139       "x x"
140     )
141
142     testGreedy(
143       "x X Y Z x",
144       "x X x",
145       "x Z x",
146       "x x"
147     )
148
149     testGreedy(
150       "x A B C D E F G H K x",
151       "x C F K x",
152       "x A D H x",
153       "x x"
154     )
155   }
156
157   fun testConfusingConflicts() {
158     // these cases might be a failure as well
159
160     testGreedy(
161       "x X x",
162       "x x",
163       "x Z x",
164       "xZ x"
165     )
166
167     testGreedy(
168       "x X X x",
169       "x X Y X x",
170       "x x",
171       "x Y x"
172     )
173
174     testGreedy(
175       "x X x",
176       "x x",
177       "x Y x",
178       "xY x"
179     )
180
181
182     testGreedy(
183       "x X X x",
184       "x Y x",
185       "x X Y x",
186       "x Y x"
187     )
188
189     // IDEA-200696
190     test(
191       "version: 1.0.0",
192       "version: 2.0.0",
193       "version: 1.0.4",
194       "version: 2.0.4"
195     )
196   }
197
198   fun testRegressions() {
199     test(
200       "i\n",
201       "i",
202       "\ni",
203       "i",
204       "i"
205     )
206
207     testSimple(
208       "Y X Y",
209       "Y C\nX\nC Y",
210       "Y \nX\n Y",
211       "Y \nC\nX\nC Y"
212     )
213
214     test(
215       """
216   public static class ChangeData {
217     @NotNull public final ChangeKind kind;
218     public final int otherPath;
219
220     public ChangeData(@NotNull ChangeKind kind, int otherPath) {
221       this.kind = kind;
222       this.otherPath = otherPath;
223     }
224
225     public boolean isRename() {
226       return kind.equals(ChangeKind.RENAMED_FROM) || kind.equals(ChangeKind.RENAMED_TO);
227     }
228
229     @Override
230     public int hashCode() {
231       return Objects.hash(kind, otherPath);
232     }
233   }
234
235   private enum ChangeKind {
236     MODIFIED((byte)0),
237     RENAMED_FROM((byte)1),
238     RENAMED_TO((byte)2);""",
239       """
240   public enum ChangeKind {
241     NOT_CHANGED((byte)-1),
242     MODIFIED((byte)0),
243     ADDED((byte)1),
244     REMOVED((byte)2);""",
245       """
246   public static class ChangeData {
247   @NotNull public final ChangeKind kind;
248   public final int otherPath;
249
250   public ChangeData(@NotNull ChangeKind kind, int otherPath) {
251     this.kind = kind;
252     this.otherPath = otherPath;
253   }
254
255   public boolean isRename() {
256     return kind.equals(ChangeKind.RENAMED_FROM) || kind.equals(ChangeKind.RENAMED_TO);
257   }
258
259   @Override
260   public int hashCode() {
261     return Objects.hash(kind, otherPath);
262   }
263 }
264
265 private enum ChangeKind {
266   MODIFIED((byte)0),
267   RENAMED_FROM((byte)1),
268   RENAMED_TO((byte)2);""",
269       """
270   public enum ChangeKind {
271     NOT_CHANGED((byte)-1),
272   MODIFIED((byte)0),
273   ADDED((byte)1),
274   REMOVED((byte)2);"""
275     )
276   }
277
278   private fun testSimple(base: String, left: String, right: String, expected: String?) {
279     val simpleResult = MergeResolveUtil.tryResolve(left, base, right)
280     assertEquals(expected, simpleResult)
281   }
282
283   private fun testGreedy(base: String, left: String, right: String, expected: String?) {
284     val greedyResult = MergeResolveUtil.tryGreedyResolve(left, base, right)
285     assertEquals(expected, greedyResult)
286   }
287
288   private fun test(base: String, left: String, right: String, expected: String?) {
289     testSimple(base, left, right, expected)
290     testGreedy(base, left, right, expected)
291   }
292
293   private fun test(base: String, left: String, right: String, expectedSimple: String?, expectedGreedy: String?) {
294     testSimple(base, left, right, expectedSimple)
295     testGreedy(base, left, right, expectedGreedy)
296   }
297 }