21407c1afabd5947bceee92b7c5dc92bc7f44930
[idea/community.git] / platform / diff-impl / tests / com / intellij / diff / comparison / WordComparisonUtilTest.kt
1 /*
2  * Copyright 2000-2015 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 class WordComparisonUtilTest : ComparisonUtilTestBase() {
19   fun testSimpleCases() {
20     words {
21       ("x z" - "y z")
22       ("-  " - "-  ").default()
23       testAll()
24     }
25
26     words {
27       ("x z" - "y z")
28       ("-  " - "-  ").default()
29       testAll()
30     }
31
32     words {
33       (" x z" - "y z")
34       ("--  " - "-  ").default()
35       (" -  " - "-  ").trim()
36       testAll()
37     }
38
39     words {
40       ("x z " - "y z")
41       ("-  -" - "-  ").default()
42       ("-   " - "-  ").trim()
43       testAll()
44     }
45
46     words {
47       ("x z " - "y z")
48       ("-  -" - "-  ").default()
49       ("-   " - "-  ").trim()
50       testAll()
51     }
52
53     words {
54       ("x z" - " y z ")
55       ("-  " - "--  -").default()
56       ("-  " - " -   ").trim()
57       testAll()
58     }
59
60     words {
61       ("x y" - "x z ")
62       ("  -" - "  --").default()
63       ("  -" - "  - ").trim()
64       testAll()
65     }
66
67     words {
68       ("x,y" - "x")
69       (" --" - " ").default()
70       testAll()
71     }
72
73     words {
74       ("x,y" - "y")
75       ("-- " - " ").default()
76       testAll()
77     }
78
79     words {
80       (".x=" - ".!=")
81       (" - " - " - ").default()
82       testAll()
83     }
84
85     words {
86       ("X xyz1 Z" - "X xyz2 Z")
87       ("  ----  " - "  ----  ").default()
88       testAll()
89     }
90   }
91
92   fun testPunctuation() {
93     words {
94       (" x.z.x " - "x..x")
95       ("-  -  -" - "    ").default()
96       ("   -   " - "    ").trim()
97       testAll()
98     }
99
100     words {
101       ("x..x" - " x.z.x ")
102       ("    " - "-  -  -").default()
103       ("    " - "   -   ").trim()
104       testAll()
105     }
106
107     words {
108       ("x ... z" - "y ... z")
109       ("-      " - "-      ").default()
110       testAll()
111     }
112
113     words {
114       ("x ... z" - "x ... y")
115       ("      -" - "      -").default()
116       testAll()
117     }
118
119     words {
120       ("x ,... z" - "x ... y")
121       ("  -    -" - "      -").default()
122       testAll()
123     }
124
125     words {
126       ("x . , .. z" - "x ... y")
127       ("   ---   -" - "      -").default()
128       ("    -    -" - "      -").ignore()
129       testAll()
130     }
131
132     words {
133       ("x==y==z" - "x====z")
134       ("   -   " - "      ").default()
135       testAll()
136     }
137
138     words {
139       ("x====z" - "x==t==z")
140       ("      " - "   -   ").default()
141       testAll()
142     }
143   }
144
145   fun testOldDiffBug() {
146     words {
147       ("x'y'>" - "x'>")
148       ("  -- " - "   ").default()
149       testAll()
150     }
151
152     words {
153       ("x'>" - "x'y'>")
154       ("   " - "  -- ").default()
155       testAll()
156     }
157   }
158
159   fun testWhitespaceOnlyChanges() {
160     words {
161       ("x  =z" - "x=  z")
162       (" --  " - "  -- ").default()
163       testDefault()
164       testTrim()
165     }
166
167     words {
168       ("x  =" - "x=  z")
169       (" -- " - "  ---").default()
170       ("    " - "    -").ignore()
171       testAll()
172     }
173   }
174
175   fun testNewlines() {
176     words {
177       (" x _ y _ z " - "x z")
178       ("- ------  -" - "   ").default()
179       ("     -     " - "   ").trim()
180       ("     -     " - "   ").ignore()
181       testAll()
182     }
183
184     words {
185       ("x z" - " x _ y _ z ")
186       ("   " - "- ------  -").default()
187       ("   " - "     -     ").trim()
188       ("   " - "     -     ").ignore()
189       testAll()
190     }
191   }
192
193   fun testFixedBugs() {
194     words {
195       (".! " - ".  y!")
196       ("  -" - " --- ").default()
197       ("   " - " --- ").trim()
198       ("   " - "   - ").ignore()
199       testAll()
200     }
201
202     words {
203       (" x n" - " y_  x m")
204       ("   -" - "----   -").default()
205       ("   -" - " -     -").trim()
206       ("   -" - " -     -").ignore()
207       testAll()
208     }
209
210     words {
211       ("x_" - "x!  ")
212       (" -" - " ---").default()
213       ("  " - " -  ").trim()
214       ("  " - " -  ").ignore()
215       testAll()
216     }
217   }
218
219   fun testInnerWhitespaces() {
220     words {
221       ("<< x >>" - "<.<>.>")
222       ("  ---  " - " -  - ").default()
223       ("   -   " - " -  - ").ignore()
224       testAll()
225     }
226
227     words {
228       ("<< x >>" - "y<<x>>y")
229       ("  - -  " - "-     -").default()
230       ("       " - "-     -").ignore()
231       testAll()
232     }
233
234     words {
235       ("x .. z" - "x y .. z")
236       ("      " - " --     ").default() // TODO: looks wrong
237       ("      " - "  -     ").ignore()
238       testAll()
239     }
240
241     words {
242       ("  x..z" - "x..y  ")
243       ("--   -" - "   ---").default()
244       ("     -" - "   -  ").trim()
245       testAll()
246     }
247
248     words {
249       (" x y x _ x z x " - "x x_x x")
250       ("- --  - - --  -" - "       ").default()
251       ("  --      --   " - "       ").trim()
252       ("   -       -   " - "       ").ignore()
253       testAll()
254     }
255   }
256
257   fun testAlgorithmSpecific() {
258     // prefer words over punctuation
259     words {
260       ("...x" - "x...")
261       ("--- " - " ---").default()
262       testAll()
263     }
264
265     // prefer longer words sequences
266     words {
267       ("x x y" - "x y")
268       ("--   " - "   ").default()
269       ("-    " - "   ").ignore()
270       testAll()
271     }
272
273     words {
274       ("y x x" - "y x")
275       ("   --" - "   ").default()
276       ("    -" - "   ").ignore()
277       testAll()
278     }
279
280     words {
281       ("A X A B" - "A B")
282       ("----   " - "   ").default()
283       ("---    " - "   ").ignore()
284       testAll()
285     }
286
287     // prefer less modified 'sentences'
288     words {
289       ("A.X A.Z" - "A.X A.Y A.Z")
290       ("       " - "   ----    ").default()
291       ("       " - "    ---    ").ignore()
292       testAll()
293     }
294
295     words {
296       ("X.A Z.A" - "X.A Y.A Z.A")
297       ("       " - "   ----    ").default()
298       ("       " - "    ---    ").ignore()
299       testAll()
300     }
301
302     // prefer punctuation over whitespaces
303     words {
304       (".   " - "   .")
305       (" ---" - "--- ").default()
306       testDefault()
307     }
308   }
309
310   fun `test legacy cases from ByWordTest`() {
311     words {
312       ("abc def, 123" - "ab def, 12")
313       ("---      ---" - "--      --").default()
314       testAll()
315     }
316
317     words {
318       (" a[xy]+1" - ",a[]+1")
319       ("-  --   " - "-     ").default()
320       ("   --   " - "-     ").trim()
321       testAll()
322     }
323
324     words {
325       ("0987_  a.g();_" - "yyyy_")
326       ("------------- " - "---- ").default()
327       testAll()
328     }
329
330     words {
331       ("  abc_2222_" - "    x = abc_zzzz_")
332     //("      ---- " - "--  ----    ---- ").legacy()
333       ("      ---- " - " ------     ---- ").default()
334       ("      ---- " - "    ---     ---- ").trim()
335       testAll()
336     }
337
338     words { // Idea58505
339       ("   if (eventMerger!=null && !dataSelection.getValueIsAdjusting()) {" -
340        "   if (eventMerger!=null && (dataSelection==null || !dataSelection.getValueIsAdjusting())) {")
341     //("                            -                                      " -
342     // "                            -             ------------------------                       -  ").legacy()
343       ("                                                                   " -
344        "                           ------------------------                                      -  ").default()
345       ("                                                                   " -
346        "                            -----------------------                                      -  ").ignore()
347       testAll()
348     }
349
350     words { // Idea56428
351       ("messageInsertStatement = connection.prepareStatement(\"INSERT INTO AUDIT (AUDIT_TYPE_ID, STATUS, SERVER_ID, INSTANCE_ID, REQUEST_ID) VALUES (?, ?, ?, ?, ?)\");" -
352        "messageInsertStatement = connection.prepareStatement(\"INSERT INTO AUDIT (AUDIT_TYPE_ID, CREATION_TIMESTAMP, STATUS, SERVER_ID, INSTANCE_ID, REQUEST_ID) VALUES (?, ?, ?, ?, ?, ?)\");").plainSource()
353     //("                                                     .                                                                                                     .   " -
354     // "                                                     .                                   --------------------                                                                 --- .   ").legacy()
355       ("                                                     .                                                                                                     .   " -
356        "                                                     .                                  --------------------                                                                  --- .   ").default()
357       ("                                                     .                                                                                                     .   " -
358        "                                                     .                                   -------------------                                                                  --- .   ").ignore()
359       testAll()
360     }
361
362     words {
363       ("f(a, b);" - "f(a,_  b);")
364       ("        " - "    --    ").default()
365       ("        " - "          ").trim()
366       testAll()
367     }
368
369     words {
370       (" o.f(a)" - "o. f( b)")
371       ("-    - " - "  -  -- ").default()
372       ("     - " - "  -  -- ").trim()
373       ("     - " - "      - ").ignore()
374       testAll()
375     }
376
377     words {
378       (" 123 " - "xyz")
379       (" --- " - "---").trim()
380       testTrim()
381     }
382   }
383
384   fun testEmptyRangePositions() {
385     words {
386       ("x? y" - "x y")
387       (" -  " - "   ").default()
388       default(del(1, 1, 1))
389       testAll()
390     }
391
392     words {
393       ("x ?y" - "x y")
394       ("  - " - "   ").default()
395       default(del(2, 2, 1))
396       testAll()
397     }
398   }
399 }