[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / platform / diff-impl / tests / com / intellij / diff / tools / fragmented / LineNumberConvertorTest.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.tools.fragmented
17
18 import junit.framework.TestCase
19
20 class LineNumberConvertorTest : TestCase() {
21   fun testEmpty() {
22     doTest(
23       {
24       },
25       {
26         checkEmpty(-5, 20)
27         checkEmptyInv(-5, 20)
28       }
29     )
30   }
31
32   fun testSingleRange() {
33     doTest(
34       {
35         put(2, 3, 2)
36       },
37       {
38         checkMatch(2, 3, 2)
39
40         checkEmpty(-5, 1)
41         checkEmpty(4, 10)
42
43         checkEmptyInv(-5, 2)
44         checkEmptyInv(5, 10)
45       }
46     )
47   }
48
49   fun testTwoRanges() {
50     doTest(
51       {
52         put(2, 3, 2)
53         put(10, 7, 1)
54       },
55       {
56         checkMatch(2, 3, 2)
57         checkMatch(10, 7, 1)
58
59         checkEmpty(-5, 1)
60         checkEmpty(4, 9)
61         checkEmpty(11, 15)
62
63         checkEmptyInv(-5, 2)
64         checkEmptyInv(5, 6)
65         checkEmptyInv(8, 12)
66       }
67     )
68   }
69
70   fun testAdjustmentRanges() {
71     doTest(
72       {
73         put(2, 3, 2)
74         put(4, 5, 3)
75       },
76       {
77         checkMatch(2, 3, 5)
78
79         checkEmpty(-5, 1)
80         checkEmpty(7, 10)
81
82         checkEmptyInv(-5, 2)
83         checkEmptyInv(8, 10)
84       }
85     )
86   }
87
88   fun testPartiallyAdjustmentRanges() {
89     doTest(
90       {
91         put(2, 3, 2)
92         put(4, 10, 3)
93       },
94       {
95         checkMatch(2, 3, 2)
96         checkMatch(4, 10, 3)
97
98         checkEmpty(-5, 1)
99         checkEmpty(7, 10)
100
101         checkEmptyInv(-5, 2)
102         checkEmptyInv(5, 9)
103         checkEmptyInv(13, 15)
104       }
105     )
106   }
107
108   fun testTwoRangesApproximate() {
109     doTest(
110       {
111         put(1, 2, 1)
112         put(6, 5, 2)
113       },
114       {
115         checkEmpty(-5, 0)
116         checkMatch(1, 2, 1)
117         checkEmpty(3, 5)
118         checkMatch(6, 5, 2)
119         checkEmpty(8, 20)
120
121         checkApproximate(0, 0)
122         checkApproximate(1, 2)
123         checkApproximate(2, 3)
124         checkApproximate(3, 3)
125         checkApproximate(4, 3)
126         checkApproximate(5, 3)
127         checkApproximate(6, 5)
128         checkApproximate(7, 6)
129         checkApproximate(8, 7)
130         checkApproximate(9, 7)
131         checkApproximate(10, 7)
132         checkApproximate(11, 7)
133
134         checkApproximateInv(0, 0)
135         checkApproximateInv(0, 1)
136         checkApproximateInv(1, 2)
137         checkApproximateInv(2, 3)
138         checkApproximateInv(2, 4)
139         checkApproximateInv(6, 5)
140         checkApproximateInv(7, 6)
141         checkApproximateInv(8, 7)
142         checkApproximateInv(8, 8)
143         checkApproximateInv(8, 9)
144         checkApproximateInv(8, 10)
145         checkApproximateInv(8, 11)
146       }
147     )
148   }
149
150   fun testNonFairRange() {
151     doTest(
152       {
153         put(1, 2, 1)
154         put(6, 5, 2, 4)
155       },
156       {
157         checkEmpty(-5, 0)
158         checkMatch(1, 2, 1)
159         checkEmpty(3, 20)
160
161         checkApproximate(0, 0)
162         checkApproximate(1, 2)
163         checkApproximate(2, 3)
164         checkApproximate(3, 3)
165         checkApproximate(4, 3)
166         checkApproximate(5, 3)
167         checkApproximate(6, 5)
168         checkApproximate(7, 6)
169         checkApproximate(8, 7)
170         checkApproximate(9, 8)
171         checkApproximate(10, 9)
172         checkApproximate(11, 9)
173         checkApproximate(12, 9)
174
175         checkApproximateInv(0, 0)
176         checkApproximateInv(0, 1)
177         checkApproximateInv(1, 2)
178         checkApproximateInv(2, 3)
179         checkApproximateInv(2, 4)
180         checkApproximateInv(6, 5)
181         checkApproximateInv(7, 6)
182         checkApproximateInv(8, 7)
183         checkApproximateInv(8, 8)
184         checkApproximateInv(8, 9)
185         checkApproximateInv(8, 10)
186         checkApproximateInv(8, 11)
187       })
188   }
189
190   //
191   // Impl
192   //
193
194   private fun doTest(prepare: TestBuilder.() -> Unit, check: Test.() -> Unit) {
195     val builder = TestBuilder()
196     builder.prepare()
197     val test = builder.finish()
198     test.check()
199   }
200
201   private class TestBuilder {
202     private val builder = LineNumberConvertor.Builder()
203
204     fun put(left: Int, right: Int, length: Int) {
205       builder.put(left, right, length)
206     }
207
208     fun put(left: Int, right: Int, lengthLeft: Int, lengthRight: Int) {
209       builder.put(left, right, lengthLeft, lengthRight)
210     }
211
212     fun finish(): Test = Test(builder.build())
213   }
214
215   private class Test(val convertor: LineNumberConvertor) {
216     fun checkMatch(left: Int, right: Int, length: Int = 1) {
217       for (i in 0..length - 1) {
218         assertEquals(right + i, convertor.convert(left + i))
219         assertEquals(left + i, convertor.convertInv(right + i))
220       }
221     }
222
223     fun checkApproximate(left: Int, right: Int) {
224       assertEquals(right, convertor.convertApproximate(left))
225     }
226
227     fun checkApproximateInv(left: Int, right: Int) {
228       assertEquals(left, convertor.convertApproximateInv(right))
229     }
230
231     fun checkEmpty(startLeft: Int, endLeft: Int) {
232       for (i in startLeft..endLeft) {
233         assertEquals(-1, convertor.convert(i))
234       }
235     }
236
237     fun checkEmptyInv(startRight: Int, endRight: Int) {
238       for (i in startRight..endRight) {
239         assertEquals(-1, convertor.convertInv(i))
240       }
241     }
242   }
243 }