@Override public TextRange newRange(int startLine, int startLineOffset, int endLine, int endLineOffset) { checkMetadata(); TextPointer start = newPointer(startLine, startLineOffset); TextPointer end = newPointer(endLine, endLineOffset); return newRangeValidPointers(start, end, false); }
/** * Create Range from global offsets. Used for backward compatibility with older API. */ public TextRange newRange(int startOffset, int endOffset) { checkMetadata(); return newRangeValidPointers(newPointer(startOffset), newPointer(endOffset), false); }
@Override public TextRange selectLine(int line) { checkMetadata(); TextPointer startPointer = newPointer(line, 0); TextPointer endPointer = newPointer(line, lineLength(line)); return newRangeValidPointers(startPointer, endPointer, true); }
@Test public void testRangeOverlap() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); // Don't fail assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)))).isTrue(); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isTrue(); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 1), file.newPointer(1, 2)))).isFalse(); assertThat(file.newRange(file.newPointer(1, 2), file.newPointer(1, 3)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isFalse(); } }
@Test public void checkValidRange() { Metadata metadata = new FileMetadata().readMetadata(new StringReader("bla bla a\nabcde")); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(2, 1)).start().line()).isEqualTo(1); // Don't fail file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)); file.newRange(file.newPointer(1, 0), file.newPointer(1, 9)); file.newRange(file.newPointer(1, 0), file.newPointer(2, 0)); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(2, 5))).isEqualTo(file.newRange(0, 15)); try { file.newRange(file.newPointer(1, 0), file.newPointer(1, 0)); fail(); } catch (Exception e) { assertThat(e).hasMessage("Start pointer [line=1, lineOffset=0] should be before end pointer [line=1, lineOffset=0]"); } try { file.newRange(file.newPointer(1, 0), file.newPointer(1, 10)); fail(); } catch (Exception e) { assertThat(e).hasMessage("10 is not a valid line offset for pointer. File src/Foo.php has 9 character(s) at line 1"); } }
@Test public void checkValidPointerUsingGlobalOffset() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {8, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(0).line()).isEqualTo(1); assertThat(file.newPointer(0).lineOffset()).isEqualTo(0); assertThat(file.newPointer(9).line()).isEqualTo(1); // Ignore eol characters assertThat(file.newPointer(9).lineOffset()).isEqualTo(8); assertThat(file.newPointer(10).line()).isEqualTo(2); assertThat(file.newPointer(10).lineOffset()).isEqualTo(0); assertThat(file.newPointer(15).line()).isEqualTo(2); assertThat(file.newPointer(15).lineOffset()).isEqualTo(5); assertThat(file.newPointer(16).line()).isEqualTo(2); // Ignore eol characters assertThat(file.newPointer(16).lineOffset()).isEqualTo(5); try { file.newPointer(-1); fail(); } catch (Exception e) { assertThat(e).hasMessage("-1 is not a valid offset for a file"); } try { file.newPointer(17); fail(); } catch (Exception e) { assertThat(e).hasMessage("17 is not a valid offset for file src/Foo.php. Max offset is 16"); } }
Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(1, 0).line()).isEqualTo(1); assertThat(file.newPointer(1, 0).lineOffset()).isEqualTo(0); file.newPointer(1, 9); file.newPointer(2, 0); file.newPointer(2, 5); file.newPointer(0, 1); fail(); } catch (Exception e) { file.newPointer(3, 1); fail(); } catch (Exception e) { file.newPointer(1, -1); fail(); } catch (Exception e) { file.newPointer(1, 10); fail(); } catch (Exception e) {
@Override public TextRange newRange(int startLine, int startLineOffset, int endLine, int endLineOffset) { checkMetadata(); TextPointer start = newPointer(startLine, startLineOffset); TextPointer end = newPointer(endLine, endLineOffset); return newRangeValidPointers(start, end, false); }
/** * Create Range from global offsets. Used for backward compatibility with older API. */ public TextRange newRange(int startOffset, int endOffset) { checkMetadata(); return newRangeValidPointers(newPointer(startOffset), newPointer(endOffset), false); }
@Override public TextRange selectLine(int line) { checkMetadata(); TextPointer startPointer = newPointer(line, 0); TextPointer endPointer = newPointer(line, lineLength(line)); return newRangeValidPointers(startPointer, endPointer, true); }