[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / platform / diff-impl / tests / com / intellij / diff / util / LineOffsetsTest.kt
1 /*
2  * Copyright 2000-2017 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.util
17
18 import com.intellij.diff.DiffTestCase
19 import com.intellij.diff.tools.util.text.LineOffsetsUtil
20 import com.intellij.openapi.editor.impl.DocumentImpl
21
22 class LineOffsetsTest : DiffTestCase() {
23   fun testWithDocument() {
24     checkSameAsDocument("")
25     checkSameAsDocument("text")
26     checkSameAsDocument("text\n")
27     checkSameAsDocument("\n")
28     checkSameAsDocument("text\ntext2")
29     checkSameAsDocument("text\ntext2\n")
30     checkSameAsDocument("\n\n\n")
31   }
32
33   fun testOffsets() {
34     checkOffsets("", !0 - 0)
35     checkOffsets("\n\n", !0 - 0, !1 - 1, !2 - 2)
36     checkOffsets("text", !0 - 4)
37     checkOffsets("text\n", !0 - 4, !5 - 5)
38     checkOffsets("text\r", !0 - 5)
39     checkOffsets("text\r\n", !0 - 5, !6 - 6)
40   }
41
42   private fun checkSameAsDocument(text: String) {
43     val lineOffsets1 = LineOffsetsUtil.create(DocumentImpl(text))
44     val lineOffsets2 = LineOffsetsUtil.create(text)
45
46     assertEquals(lineOffsets1.lineCount, lineOffsets2.lineCount)
47     assertEquals(lineOffsets1.textLength, lineOffsets2.textLength)
48
49     for (i in 0 until lineOffsets1.lineCount) {
50       assertEquals(lineOffsets1.getLineStart(i), lineOffsets2.getLineStart(i))
51       assertEquals(lineOffsets1.getLineEnd(i), lineOffsets2.getLineEnd(i))
52       assertEquals(lineOffsets1.getLineEnd(i, false), lineOffsets2.getLineEnd(i, false))
53       assertEquals(lineOffsets1.getLineEnd(i, true), lineOffsets2.getLineEnd(i, true))
54     }
55
56     for (i in 0..lineOffsets1.textLength) {
57       assertEquals(lineOffsets1.getLineNumber(i), lineOffsets2.getLineNumber(i))
58     }
59   }
60
61   private fun checkOffsets(text: String, vararg offsets: IntPair) {
62     val lineOffsets = LineOffsetsUtil.create(text)
63
64     assertEquals(offsets.size, lineOffsets.lineCount)
65
66     offsets.forEachIndexed { line, value ->
67       assertEquals(lineOffsets.getLineStart(line), value.val1)
68       assertEquals(lineOffsets.getLineEnd(line), value.val2)
69
70       for (offset in lineOffsets.getLineStart(line)..lineOffsets.getLineEnd(line)) {
71         assertEquals(line, lineOffsets.getLineNumber(offset))
72       }
73     }
74   }
75
76   private operator fun Int.not(): IntPairHelper = IntPairHelper(this)
77   private operator fun IntPairHelper.minus(col: Int): IntPair = IntPair(this.line, col)
78   private class IntPairHelper(val line: Int)
79 }