[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / platform / diff-impl / tests / com / intellij / diff / comparison / ComparisonUtilTest.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 import com.intellij.diff.DiffTestCase
19 import com.intellij.diff.util.IntPair
20
21 class ComparisonUtilTest : DiffTestCase() {
22   fun testTrimEquals() {
23     doTestTrim(true, "", "")
24     doTestTrim(true, "", "   ")
25     doTestTrim(true, "   ", "   ")
26     doTestTrim(true, "\n   ", "  \n")
27     doTestTrim(true, "asd ", "asd  ")
28     doTestTrim(true, "    asd", "asd")
29     doTestTrim(true, "\n\n\n", "\n\n\n")
30     doTestTrim(true, "\n  \n  \n ", "  \n \n\n  ")
31     doTestTrim(false, "\n\n", "\n\n\n")
32
33     doTestTrim(false, "\nasd ", "asd\n  ")
34     doTestTrim(true, "\nasd \n", "\n asd\n  ")
35     doTestTrim(false, "x", "y")
36     doTestTrim(false, "\n", " ")
37
38     doTestTrim(true, "\t ", "")
39     doTestTrim(false, "", "\t\n \n\t")
40     doTestTrim(false, "\t", "\n")
41
42     doTestTrim(true, "x", " x")
43     doTestTrim(true, "x", "x ")
44     doTestTrim(false, "x\n", "x")
45
46     doTestTrim(false, "abc", "a\nb\nc\n")
47     doTestTrim(true, "\nx y x\n", "\nx y x\n")
48     doTestTrim(false, "\nxyx\n", "\nx y x\n")
49     doTestTrim(true, "\nx y x", "\nx y x")
50     doTestTrim(false, "\nxyx", "\nx y x")
51     doTestTrim(true, "x y x", "x y x")
52     doTestTrim(false, "xyx", "x y x")
53     doTestTrim(true, "  x y x  ", "x y x")
54
55     doTestTrim(false, "x", "\t\n ")
56     doTestTrim(false, "", " x ")
57     doTestTrim(false, "", "x ")
58     doTestTrim(false, "", " x")
59     doTestTrim(false, "xyx", "xxx")
60     doTestTrim(false, "xyx", "xYx")
61   }
62
63   fun testLineFragment() {
64     doTestLineFragment(
65       "", "x",
66       !0 - 0, !0 - 1,
67       !0 - 1, !0 - 1)
68
69     doTestLineFragment(
70       "x", "y",
71       !0 - 1, !0 - 1,
72       !0 - 1, !0 - 1)
73
74     doTestLineFragment(
75       "x_", "y_",
76       !0 - 2, !0 - 2,
77       !0 - 1, !0 - 1)
78
79     doTestLineFragment(
80       "x", "y_",
81       !0 - 1, !0 - 2,
82       !0 - 1, !0 - 2)
83
84     doTestLineFragment(
85       "x", "x_",
86       !1 - 1, !2 - 2,
87       !1 - 1, !1 - 2)
88
89     doTestLineFragment(
90       "x_y_z_", "x_Y_z_",
91       !2 - 4, !2 - 4,
92       !1 - 2, !1 - 2)
93
94     doTestLineFragment(
95       "x_y_z_", "x_y_Z_",
96       !4 - 6, !4 - 6,
97       !2 - 3, !2 - 3)
98
99     doTestLineFragment(
100       "x_y_z_", "x_y_Z_",
101       !4 - 6, !4 - 6,
102       !2 - 3, !2 - 3)
103
104     doTestLineFragment(
105       "x_y_z_", "x_y_Z",
106       !4 - 6, !4 - 5,
107       !2 - 4, !2 - 3)
108
109     doTestLineFragment(
110       "x_y_z", "x_y_Z_",
111       !4 - 5, !4 - 6,
112       !2 - 3, !2 - 4)
113
114     doTestLineFragment(
115       " ", "_ ",
116       !0 - 0, !0 - 1,
117       !0 - 0, !0 - 1)
118
119     doTestLineFragment(
120       " ", " _",
121       !1 - 1, !2 - 2,
122       !1 - 1, !1 - 2)
123   }
124
125   //
126   // Impl
127   //
128
129   private fun doTestLineFragment(string1: String, string2: String,
130                                  offsets1: IntPair, offsets2: IntPair,
131                                  lines1: IntPair, lines2: IntPair) {
132     val fragments = MANAGER.compareLines(parseSource(string1), parseSource(string2), ComparisonPolicy.DEFAULT, INDICATOR)
133     assertTrue(fragments.size == 1, "Side: ${fragments.size})")
134     val fragment = fragments[0]
135
136     assertEquals(offsets1.val1, fragment.startOffset1, fragment.toString())
137     assertEquals(offsets1.val2, fragment.endOffset1, fragment.toString())
138     assertEquals(offsets2.val1, fragment.startOffset2, fragment.toString())
139     assertEquals(offsets2.val2, fragment.endOffset2, fragment.toString())
140     assertEquals(lines1.val1, fragment.startLine1, fragment.toString())
141     assertEquals(lines1.val2, fragment.endLine1, fragment.toString())
142     assertEquals(lines2.val1, fragment.startLine2, fragment.toString())
143     assertEquals(lines2.val2, fragment.endLine2, fragment.toString())
144   }
145
146   private fun doTestTrim(expected: Boolean, string1: String, string2: String) {
147     doTest(expected, string1, string2, ComparisonPolicy.TRIM_WHITESPACES)
148   }
149
150   private fun doTest(expected: Boolean, string1: String, string2: String, policy: ComparisonPolicy) {
151     val result = MANAGER.isEquals(string1, string2, policy)
152     assertEquals(expected, result, "---\n$string1\n---\n$string2\n---")
153   }
154
155   //
156   // Helpers
157   //
158
159   operator fun Int.not(): LineColHelper = LineColHelper(this)
160   operator fun LineColHelper.minus(col: Int): IntPair = IntPair(this.line, col)
161
162   inner class LineColHelper(val line: Int)
163 }