[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[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     lines_inner {
21       ("x z" - "y z")
22       ("-  " - "-  ").default()
23       testAll()
24     }
25
26     lines_inner {
27       ("x z" - "y z")
28       ("-  " - "-  ").default()
29       testAll()
30     }
31
32     lines_inner {
33       (" x z" - "y z")
34       ("--  " - "-  ").default()
35       (" -  " - "-  ").trim()
36       testAll()
37     }
38
39     lines_inner {
40       ("x z " - "y z")
41       ("-  -" - "-  ").default()
42       ("-   " - "-  ").trim()
43       testAll()
44     }
45
46     lines_inner {
47       ("x z " - "y z")
48       ("-  -" - "-  ").default()
49       ("-   " - "-  ").trim()
50       testAll()
51     }
52
53     lines_inner {
54       ("x z" - " y z ")
55       ("-  " - "--  -").default()
56       ("-  " - " -   ").trim()
57       testAll()
58     }
59
60     lines_inner {
61       ("x y" - "x z ")
62       ("  -" - "  --").default()
63       ("  -" - "  - ").trim()
64       testAll()
65     }
66
67     lines_inner {
68       ("x,y" - "x")
69       (" --" - " ").default()
70       testAll()
71     }
72
73     lines_inner {
74       ("x,y" - "y")
75       ("-- " - " ").default()
76       testAll()
77     }
78
79     lines_inner {
80       (".x=" - ".!=")
81       (" - " - " - ").default()
82       testAll()
83     }
84
85     lines_inner {
86       ("X xyz1 Z" - "X xyz2 Z")
87       ("  ----  " - "  ----  ").default()
88       testAll()
89     }
90   }
91
92   fun testPunctuation() {
93     lines_inner {
94       (" x.z.x " - "x..x")
95       ("-  -  -" - "    ").default()
96       ("   -   " - "    ").trim()
97       testAll()
98     }
99
100     lines_inner {
101       ("x..x" - " x.z.x ")
102       ("    " - "-  -  -").default()
103       ("    " - "   -   ").trim()
104       testAll()
105     }
106
107     lines_inner {
108       ("x ... z" - "y ... z")
109       ("-      " - "-      ").default()
110       testAll()
111     }
112
113     lines_inner {
114       ("x ... z" - "x ... y")
115       ("      -" - "      -").default()
116       testAll()
117     }
118
119     lines_inner {
120       ("x ,... z" - "x ... y")
121       ("  -    -" - "      -").default()
122       testAll()
123     }
124
125     lines_inner {
126       ("x . , .. z" - "x ... y")
127       ("   ---   -" - "      -").default()
128       ("    -    -" - "      -").ignore()
129       testAll()
130     }
131
132     lines_inner {
133       ("x==y==z" - "x====z")
134       ("   -   " - "      ").default()
135       testAll()
136     }
137
138     lines_inner {
139       ("x====z" - "x==t==z")
140       ("      " - "   -   ").default()
141       testAll()
142     }
143
144     lines_inner {
145       ("X Y ) {_ A B C" - "X Y Z ) {_ y B C ) {")
146       ("         -    " - "   --      -    ----").default()
147       ("         -    " - "    -      -     ---").ignore()
148       testAll()
149     }
150
151     // TODO
152     words {
153       ("@Deprecated @NotNull" - "@NotNull")
154       (" ------------       " - "        ").default()
155       testAll()
156     }
157
158     // TODO
159     words {
160       ("@Deprecated_ @NotNull" - "@NotNull")
161       (" -------------       " - "        ").default()
162       testAll()
163     }
164   }
165
166   fun testOldDiffBug() {
167     lines_inner {
168       ("x'y'>" - "x'>")
169       ("  -- " - "   ").default()
170       testAll()
171     }
172
173     lines_inner {
174       ("x'>" - "x'y'>")
175       ("   " - "  -- ").default()
176       testAll()
177     }
178
179     lines_inner {
180       ("x'>" - "x'y'>")
181       ("   " - "  -- ").default()
182       testAll()
183     }
184
185     lines_inner {
186       ("x'y'>" - "x'>")
187       ("  -- " - "   ").default()
188       testAll()
189     }
190   }
191
192   fun testWhitespaceOnlyChanges() {
193     lines_inner {
194       ("x  =z" - "x=  z")
195       (" --  " - "  -- ").default()
196       testDefault()
197       testTrim()
198     }
199
200     lines_inner {
201       ("x  =" - "x=  z")
202       (" -- " - "  ---").default()
203       ("    " - "    -").ignore()
204       testAll()
205     }
206   }
207
208   fun testNewlines() {
209     lines_inner {
210       (" x _ y _ z " - "x z")
211       ("- ------  -" - "   ").default()
212       ("     -     " - "   ").trim()
213       ("     -     " - "   ").ignore()
214       testAll()
215     }
216
217     lines_inner {
218       ("x z" - " x _ y _ z ")
219       ("   " - "- ------  -").default()
220       ("   " - "     -     ").trim()
221       ("   " - "     -     ").ignore()
222       testAll()
223     }
224
225     words {
226       ("_i" - "i_")
227       ("- " - " -").default()
228       ("  " - "  ").trim()
229       testAll()
230     }
231
232     words {
233       ("i_" - "_i")
234       ("- " - " -").default() // TODO
235       testAll()
236     }
237
238     words {
239       ("x_y" - "xy")
240       ("   " - "  ").ignore()
241       testIgnore()
242     }
243
244     words {
245       ("A x_y B" - "a xy b")
246       ("-------" - "------").ignore()
247       testIgnore()
248     }
249
250     words {
251       ("A xy B" - "a xy b")
252       ("-    -" - "-    -").ignore()
253       testIgnore()
254     }
255
256     words {
257       ("A_B_" - "X_")
258       ("--- " - "- ").default()
259       testAll()
260     }
261   }
262
263   fun testFixedBugs() {
264     lines_inner {
265       (".! " - ".  y!")
266       ("  -" - " --- ").default()
267       ("   " - " --- ").trim()
268       ("   " - "   - ").ignore()
269       testAll()
270     }
271
272     lines_inner {
273       (" x n" - " y_  x m")
274       ("   -" - "----   -").default()
275       ("   -" - " -     -").trim()
276       ("   -" - " -     -").ignore()
277       testAll()
278     }
279
280     lines_inner {
281       ("x_" - "x!  ")
282       (" -" - " ---").default()
283       ("  " - " -  ").trim()
284       ("  " - " -  ").ignore()
285       testAll()
286     }
287   }
288
289   fun testInnerWhitespaces() {
290     lines_inner {
291       ("<< x >>" - "<.<>.>")
292       ("  ---  " - " -  - ").default()
293       ("   -   " - " -  - ").ignore()
294       testAll()
295     }
296
297     lines_inner {
298       ("<< x >>" - "y<<x>>y")
299       ("  - -  " - "-     -").default()
300       ("       " - "-     -").ignore()
301       testAll()
302     }
303
304     lines_inner {
305       ("x .. z" - "x y .. z")
306       ("      " - " --     ").default()
307       ("      " - "  -     ").ignore()
308       testAll()
309     }
310
311     lines_inner {
312       ("  x..z" - "x..y  ")
313       ("--   -" - "   ---").default()
314       ("     -" - "   -  ").trim()
315       testAll()
316     }
317
318     lines_inner {
319       (" x y x _ x z x " - "x x_x x")
320       ("- --  - - --  -" - "       ").default()
321       ("  --      --   " - "       ").trim()
322       ("   -       -   " - "       ").ignore()
323       testAll()
324     }
325   }
326
327   fun testAlgorithmSpecific() {
328     // prefer words over punctuation
329     lines_inner {
330       ("...x" - "x...")
331       ("--- " - " ---").default()
332       testAll()
333     }
334
335     // prefer longer words sequences
336     lines_inner {
337       ("x x y" - "x y")
338       ("--   " - "   ").default()
339       ("-    " - "   ").ignore()
340       testAll()
341     }
342
343     lines_inner {
344       ("y x x" - "y x")
345       ("   --" - "   ").default()
346       ("    -" - "   ").ignore()
347       testAll()
348     }
349
350     lines_inner {
351       ("A X A B" - "A B")
352       ("----   " - "   ").default()
353       ("---    " - "   ").ignore()
354       testAll()
355     }
356
357     // prefer less modified 'sentences'
358     lines_inner {
359       ("A.X A.Z" - "A.X A.Y A.Z")
360       ("       " - "   ----    ").default()
361       ("       " - "    ---    ").ignore()
362       testAll()
363     }
364
365     lines_inner {
366       ("X.A Z.A" - "X.A Y.A Z.A")
367       ("       " - "   ----    ").default()
368       ("       " - "    ---    ").ignore()
369       testAll()
370     }
371
372     // prefer punctuation over whitespaces
373     lines_inner {
374       (".   " - "   .")
375       (" ---" - "--- ").default()
376       testDefault()
377     }
378
379     lines_inner {
380       ("A B_C D" - "A_B C_D")
381       (" -  -- " - " - --  ").default()
382       (" -  -- " - "   --  ").trim()
383       ("    -  " - "    -  ").ignore()
384       testAll()
385     }
386
387     lines_inner {
388       ("B_C_D_" - "X_Y_Z_")
389       ("- - - " - "- - - ").default()
390       testAll()
391     }
392
393     words {
394       ("!x_!_z" - "!_!_y z")
395       (" -    " - "    -- ").default()
396       testDefault()
397     }
398   }
399
400   fun `test trailing punctuation`() {
401     lines_inner {
402       ("X = { };" - "X = { _ };")
403       ("        " - "     --   ").default()
404       ("        " - "          ").trim()
405       testAll()
406     }
407
408     // TODO
409     lines_inner {
410       ("X = { };_" - "X = { _ };_")
411       ("      -- " - "       ----").default()
412       ("      -- " - "        -- ").trim()
413       testAll()
414     }
415   }
416
417   fun `test legacy cases from ByWordTest`() {
418     lines_inner {
419       ("abc def, 123" - "ab def, 12")
420       ("---      ---" - "--      --").default()
421       testAll()
422     }
423
424     lines_inner {
425       (" a[xy]+1" - ",a[]+1")
426       ("-  --   " - "-     ").default()
427       ("   --   " - "-     ").trim()
428       testAll()
429     }
430
431     lines_inner {
432       ("0987_  a.g();_" - "yyyy_")
433       ("------------- " - "---- ").default()
434       testAll()
435     }
436
437     lines_inner {
438       ("  abc_2222_" - "    x = abc_zzzz_")
439     //("      ---- " - "--  ----    ---- ").legacy()
440       ("      ---- " - " ------     ---- ").default()
441       ("      ---- " - "    ---     ---- ").trim()
442       testAll()
443     }
444
445     lines_inner { // Idea58505
446       ("   if (eventMerger!=null && !dataSelection.getValueIsAdjusting()) {" -
447        "   if (eventMerger!=null && (dataSelection==null || !dataSelection.getValueIsAdjusting())) {")
448     //("                            -                                      " -
449     // "                            -             ------------------------                       -  ").legacy()
450       ("                                                                   " -
451        "                           ------------------------                                      -  ").default()
452       ("                                                                   " -
453        "                            -----------------------                                      -  ").ignore()
454       testAll()
455     }
456
457     lines_inner { // Idea56428
458       ("messageInsertStatement = connection.prepareStatement(\"INSERT INTO AUDIT (AUDIT_TYPE_ID, STATUS, SERVER_ID, INSTANCE_ID, REQUEST_ID) VALUES (?, ?, ?, ?, ?)\");" -
459        "messageInsertStatement = connection.prepareStatement(\"INSERT INTO AUDIT (AUDIT_TYPE_ID, CREATION_TIMESTAMP, STATUS, SERVER_ID, INSTANCE_ID, REQUEST_ID) VALUES (?, ?, ?, ?, ?, ?)\");").plainSource()
460     //("                                                     .                                                                                                     .   " -
461     // "                                                     .                                   --------------------                                                                 --- .   ").legacy()
462       ("                                                     .                                                                                                     .   " -
463        "                                                     .                                  --------------------                                                                  --- .   ").default()
464       ("                                                     .                                                                                                     .   " -
465        "                                                     .                                   -------------------                                                                  --- .   ").ignore()
466       testAll()
467     }
468
469     lines_inner {
470       ("f(a, b);" - "f(a,_  b);")
471       ("        " - "    --    ").default()
472       ("        " - "          ").trim()
473       testAll()
474     }
475
476     lines_inner {
477       (" o.f(a)" - "o. f( b)")
478       ("-    - " - "  -  -- ").default()
479       ("     - " - "  -  -- ").trim()
480       ("     - " - "      - ").ignore()
481       testAll()
482     }
483
484     lines_inner {
485       (" 123 " - "xyz")
486       (" --- " - "---").trim()
487       testTrim()
488     }
489   }
490
491   fun testEmptyRangePositions() {
492     lines_inner {
493       ("x? y" - "x y")
494       (" -  " - "   ").default()
495       default(del(1, 1, 1))
496       testAll()
497     }
498
499     lines_inner {
500       ("x ?y" - "x y")
501       ("  - " - "   ").default()
502       default(del(2, 2, 1))
503       testAll()
504     }
505   }
506
507   fun testContinuousScript() {
508     words {
509       ("ABCD" - "DABC")
510       ("----" - "----").default()
511       testDefault()
512     }
513
514     words {
515       ("汉语漢語" - "語汉语漢")
516       ("   -" - "-   ").default()
517       testDefault()
518     }
519
520     words {
521       ("AB漢CD" - "DA漢CD")
522       ("--   " - "--   ").default()
523       testDefault()
524     }
525
526     words {
527       ("AB漢CD" - "DA语CD")
528       ("---  " - "---  ").default()
529       testDefault()
530     }
531
532     words {
533       ("a_c" - "x_c").plainSource()
534       ("---" - "---").default()
535       testDefault()
536     }
537
538     words {
539       ("!_?" - "!_+")
540       ("  -" - "  +").default()
541       testDefault()
542     }
543   }
544
545   fun testHighSurrogates() {
546     words {
547       ("$chSmile$chGun$chMan$chFace" - "$chGun$chMan$chFace$chSmile")
548       ("--      " - "      --").default()
549       testDefault()
550     }
551
552     words {
553       (chSmile - chGun)
554       ("--" - "--").default()
555       testDefault()
556     }
557
558     words {
559       (chFace - chGun)
560       ("--" - "--").default()
561       testDefault()
562     }
563
564     words {
565       ("$chSmile " - " $chGun")
566       ("---" - "---").default()
567       ("-- " - " --").trim()
568       testAll()
569     }
570
571     words {
572       ("$chSmile$chFace $chMan" - " $chGun$chFace$chMan ")
573       ("--  -  " - "---    -").default()
574       ("--  -  " - " --     ").trim()
575       ("--     " - " --     ").ignore()
576       testAll()
577     }
578   }
579 }