mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-15 08:18:55 +00:00
[eclipse/xtext-core#1183]: Fix tests on windows machines.
Signed-off-by: Arne Deutsch <Arne.Deutsch@itemis.de>
This commit is contained in:
parent
12e6a792c9
commit
7c8e4e3d82
6 changed files with 435 additions and 287 deletions
|
@ -7,139 +7,193 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.xtext.ide.tests.server
|
||||
|
||||
import org.eclipse.lsp4j.DocumentHighlight
|
||||
import org.eclipse.lsp4j.DocumentHighlightKind
|
||||
import org.eclipse.lsp4j.Position
|
||||
import org.eclipse.xtext.ide.server.occurrences.IDocumentHighlightService
|
||||
import org.eclipse.lsp4j.Range
|
||||
import org.eclipse.lsp4j.TextEdit
|
||||
import org.eclipse.xtext.ide.server.Document
|
||||
import org.junit.Test
|
||||
|
||||
import static org.junit.Assert.*
|
||||
import org.eclipse.lsp4j.TextDocumentContentChangeEvent
|
||||
import static extension org.eclipse.xtext.util.Strings.toUnixLineSeparator
|
||||
|
||||
/**
|
||||
* Class for testing the {@link DocumentHighlightService document highlight
|
||||
* service} behavior through the language server.
|
||||
*
|
||||
* <p>
|
||||
* The string representation of on single {@link DocumentHighlight highlight}
|
||||
* instance is represented with the below pattern:
|
||||
*
|
||||
* <pre>
|
||||
* R|W|T [{d}+, {d}+] .. [{d}+, {d}+]
|
||||
* </pre>
|
||||
*
|
||||
* where the first character describes the {@link DocumentHighlightKind kind} of
|
||||
* the document highlight. If missing, then the value is {@code NaN}. The values
|
||||
* between the first square brackets are the start {@link Position#getLine()
|
||||
* line} and the (zero-based) {@link Position#getCharacter() character offset}
|
||||
* in the line. The second square brackets contains the end position of the
|
||||
* selection and described with the same semantics as the first start range.
|
||||
* Multiple highlight instances are separated by the {@code |} ("pipe")
|
||||
* character.
|
||||
*
|
||||
* @author akos.kitta - Initial contribution and API
|
||||
*
|
||||
* @see DocumentHighlight
|
||||
* @see IDocumentHighlightService
|
||||
* @author efftinge - Initial contribution and API
|
||||
*/
|
||||
class DocumentHighlightTest extends AbstractTestLangLanguageServerTest {
|
||||
class DocumentTest {
|
||||
|
||||
@Test def void testOffSet() {
|
||||
new Document(1, '''
|
||||
hello world
|
||||
foo
|
||||
bar
|
||||
'''.normalize) => [
|
||||
assertEquals(0, getOffSet(position(0,0)))
|
||||
assertEquals(11, getOffSet(position(0,11)))
|
||||
try {
|
||||
getOffSet(position(0, 12))
|
||||
fail()
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
//expected
|
||||
}
|
||||
assertEquals(12, getOffSet(position(1,0)))
|
||||
assertEquals(13, getOffSet(position(1,1)))
|
||||
assertEquals(14, getOffSet(position(1,2)))
|
||||
assertEquals(16, getOffSet(position(2,0)))
|
||||
assertEquals(19, getOffSet(position(2,3)))
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testOffSet_empty() {
|
||||
new Document(1, "") => [
|
||||
assertEquals(0, getOffSet(position(0,0)))
|
||||
try {
|
||||
getOffSet(position(0, 12))
|
||||
fail()
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
//expected
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testUpdate_01() {
|
||||
new Document(1, '''
|
||||
hello world
|
||||
foo
|
||||
bar
|
||||
'''.normalize) => [
|
||||
assertEquals('''
|
||||
hello world
|
||||
bar
|
||||
'''.normalize, applyTextDocumentChanges(#[
|
||||
change(position(1,0), position(2,0), "")
|
||||
]).contents)
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testUpdate_02() {
|
||||
new Document(1, '''
|
||||
hello world
|
||||
foo
|
||||
bar
|
||||
'''.normalize) => [
|
||||
assertEquals('''
|
||||
hello world
|
||||
future
|
||||
bar
|
||||
'''.normalize, applyTextDocumentChanges(#[
|
||||
change(position(1,1), position(1,3), "uture")
|
||||
]).contents)
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testUpdate_03() {
|
||||
new Document(1, '''
|
||||
hello world
|
||||
foo
|
||||
bar'''.normalize) => [
|
||||
assertEquals('', applyTextDocumentChanges(#[
|
||||
change(position(0,0), position(2,3), "")
|
||||
]).contents)
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testApplyTextDocumentChanges_04() {
|
||||
new Document(1, '''
|
||||
foo
|
||||
bar
|
||||
'''.normalize).applyTextDocumentChanges(#[
|
||||
change(position(0,3), position(0,3), "b"),
|
||||
change(position(0,4), position(0,4), "a"),
|
||||
change(position(0,5), position(0,5), "r")
|
||||
])
|
||||
=> [
|
||||
assertEquals('''
|
||||
foobar
|
||||
bar
|
||||
'''.normalize, contents)
|
||||
assertEquals(2, version)
|
||||
]
|
||||
}
|
||||
|
||||
@Test def void testUpdate_nonIncrementalChange() {
|
||||
new Document(1, '''
|
||||
hello world
|
||||
foo
|
||||
bar'''.normalize) => [
|
||||
assertEquals(' foo ', applyChanges(#[
|
||||
textEdit(null, null, " foo ")
|
||||
]).contents)
|
||||
]
|
||||
}
|
||||
|
||||
@Test(expected=IndexOutOfBoundsException) def void testGetLineContent_negative() {
|
||||
new Document(1, '').getLineContent(-1);
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineNoOccurrences_SelectionBeforeWriteSiteMethodName() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } }''';
|
||||
column = '''type A { op'''.length;
|
||||
expectedDocumentHighlight = '';
|
||||
];
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineNoOccurrences_SelectionAfterWriteSiteMethodName() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } }''';
|
||||
column = '''type A { op foo('''.length;
|
||||
expectedDocumentHighlight = '';
|
||||
];
|
||||
}
|
||||
@Test(expected=IndexOutOfBoundsException) def void testGetLineContent_exceeds() {
|
||||
new Document(1, '''
|
||||
aaa
|
||||
bbb
|
||||
ccc''').getLineContent(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineSingleOccurrence() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } }''';
|
||||
column = '''type A { op fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[0, 12] .. [0, 15]]';
|
||||
];
|
||||
}
|
||||
@Test def void testGetLineContent_empty() {
|
||||
assertEquals('', new Document(1, '').getLineContent(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineSingleOccurrenceWithVariable() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { int foo op foo() { } }''';
|
||||
column = '''type A { int fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[0, 13] .. [0, 16]]';
|
||||
];
|
||||
}
|
||||
@Test def void testGetLineContent() {
|
||||
assertEquals('bbb', new Document(1, '''
|
||||
aaa
|
||||
bbb
|
||||
ccc'''.toUnixLineSeparator).getLineContent(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineSingleOccurrenceWithMultipleTypes() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } } type B { op foo() { } }''';
|
||||
column = '''type A { op fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[0, 12] .. [0, 15]]';
|
||||
];
|
||||
}
|
||||
@Test def void testGetLineCount_empty() {
|
||||
assertEquals(1, new Document(1, '').lineCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineMultipleOccurrences_SelectionOnReadSite() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } op bar() { foo(10) } }''';
|
||||
line = 0;
|
||||
column = '''type A { op foo() { } op bar() { fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[0, 12] .. [0, 15]] | R [[0, 33] .. [0, 36]]';
|
||||
];
|
||||
}
|
||||
@Test def void testGetLineCount_single() {
|
||||
assertEquals(1, new Document(1, 'aaa bbb ccc').lineCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
def void singleLineMultipleOccurrences_SelectionOnWriteSite() {
|
||||
testDocumentHighlight[
|
||||
model = '''type A { op foo() { } op bar() { foo(10) } }''';
|
||||
line = 0;
|
||||
column = '''type A { op fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[0, 12] .. [0, 15]] | R [[0, 33] .. [0, 36]]';
|
||||
];
|
||||
}
|
||||
@Test def void testGetLineCount_multi() {
|
||||
assertEquals(3, new Document(1, '''
|
||||
aaa
|
||||
bbb
|
||||
ccc''').lineCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
def void multipleLinesMultipleOccurrences_WithHorizontalTabs() {
|
||||
testDocumentHighlight[
|
||||
// This snippet contains horizontal tabs for code indentation
|
||||
model = '''
|
||||
type A {
|
||||
op foo() { }
|
||||
op bar() {
|
||||
foo(10)
|
||||
}
|
||||
}''';
|
||||
line = 1;
|
||||
// Same as above, horizontal tabs for code indentation
|
||||
column = ''' op fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[1, 4] .. [1, 7]] | R [[3, 2] .. [3, 5]]';
|
||||
];
|
||||
}
|
||||
|
||||
@Test
|
||||
def void multipleLinesMultipleOccurrences_WithWhitespaces() {
|
||||
testDocumentHighlight[
|
||||
// This snippet contains spaces for code indentation
|
||||
model = '''
|
||||
type A {
|
||||
op foo() { }
|
||||
op bar() {
|
||||
foo(10)
|
||||
}
|
||||
}''';
|
||||
line = 1;
|
||||
// Same as above, spaces for code indentation
|
||||
column = ''' op fo'''.length;
|
||||
expectedDocumentHighlight = 'W [[1, 7] .. [1, 10]] | R [[3, 8] .. [3, 11]]';
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
private def change(Position startPos, Position endPos, String newText) {
|
||||
new TextDocumentContentChangeEvent => [
|
||||
if (startPos !== null) {
|
||||
range = new Range => [
|
||||
start = startPos
|
||||
end = endPos
|
||||
]
|
||||
}
|
||||
it.text = newText
|
||||
]
|
||||
}
|
||||
|
||||
private def textEdit(Position startPos, Position endPos, String newText) {
|
||||
new TextEdit => [
|
||||
if (startPos !== null) {
|
||||
range = new Range => [
|
||||
start = startPos
|
||||
end = endPos
|
||||
]
|
||||
}
|
||||
it.newText = newText
|
||||
]
|
||||
}
|
||||
|
||||
private def normalize(CharSequence s) {
|
||||
return s.toString.replaceAll("\r", "")
|
||||
}
|
||||
|
||||
private def position(int l, int c) {
|
||||
new Position => [line=l character=c]
|
||||
}
|
||||
|
||||
}
|
|
@ -11,6 +11,8 @@ import com.google.inject.Inject
|
|||
import java.util.List
|
||||
import org.eclipse.lsp4j.ClientCapabilities
|
||||
import org.eclipse.lsp4j.DidChangeTextDocumentParams
|
||||
import org.eclipse.lsp4j.Position
|
||||
import org.eclipse.lsp4j.Range
|
||||
import org.eclipse.lsp4j.SemanticHighlightingCapabilities
|
||||
import org.eclipse.lsp4j.TextDocumentClientCapabilities
|
||||
import org.eclipse.lsp4j.TextDocumentContentChangeEvent
|
||||
|
@ -20,8 +22,8 @@ import org.junit.Before
|
|||
import org.junit.Test
|
||||
|
||||
import static org.junit.Assert.*
|
||||
import org.eclipse.lsp4j.Range
|
||||
import org.eclipse.lsp4j.Position
|
||||
|
||||
import static extension org.eclipse.xtext.util.Strings.*
|
||||
|
||||
class SemanticHighlightingTest extends AbstractTestLangLanguageServerTest {
|
||||
|
||||
|
@ -168,7 +170,7 @@ class SemanticHighlightingTest extends AbstractTestLangLanguageServerTest {
|
|||
val actual = entry.value.sortWith[left, right|left.line - right.line].map[it -> scopes].map [
|
||||
toExpectation
|
||||
].join('\n');
|
||||
assertEquals(expected, actual);
|
||||
assertEquals(expected.toUnixLineSeparator, actual);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,201 +7,285 @@
|
|||
*/
|
||||
package org.eclipse.xtext.ide.tests.server;
|
||||
|
||||
import org.eclipse.lsp4j.DocumentHighlight;
|
||||
import org.eclipse.lsp4j.DocumentHighlightKind;
|
||||
import java.util.Collections;
|
||||
import org.eclipse.lsp4j.Position;
|
||||
import org.eclipse.lsp4j.Range;
|
||||
import org.eclipse.lsp4j.TextDocumentContentChangeEvent;
|
||||
import org.eclipse.lsp4j.TextEdit;
|
||||
import org.eclipse.xtend2.lib.StringConcatenation;
|
||||
import org.eclipse.xtext.ide.server.occurrences.IDocumentHighlightService;
|
||||
import org.eclipse.xtext.ide.tests.server.AbstractTestLangLanguageServerTest;
|
||||
import org.eclipse.xtext.testing.DocumentHighlightConfiguration;
|
||||
import org.eclipse.xtext.ide.server.Document;
|
||||
import org.eclipse.xtext.util.Strings;
|
||||
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
|
||||
import org.eclipse.xtext.xbase.lib.Exceptions;
|
||||
import org.eclipse.xtext.xbase.lib.ObjectExtensions;
|
||||
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Class for testing the {@link DocumentHighlightService document highlight
|
||||
* service} behavior through the language server.
|
||||
*
|
||||
* <p>
|
||||
* The string representation of on single {@link DocumentHighlight highlight}
|
||||
* instance is represented with the below pattern:
|
||||
*
|
||||
* <pre>
|
||||
* R|W|T [{d}+, {d}+] .. [{d}+, {d}+]
|
||||
* </pre>
|
||||
*
|
||||
* where the first character describes the {@link DocumentHighlightKind kind} of
|
||||
* the document highlight. If missing, then the value is {@code NaN}. The values
|
||||
* between the first square brackets are the start {@link Position#getLine()
|
||||
* line} and the (zero-based) {@link Position#getCharacter() character offset}
|
||||
* in the line. The second square brackets contains the end position of the
|
||||
* selection and described with the same semantics as the first start range.
|
||||
* Multiple highlight instances are separated by the {@code |} ("pipe")
|
||||
* character.
|
||||
*
|
||||
* @author akos.kitta - Initial contribution and API
|
||||
*
|
||||
* @see DocumentHighlight
|
||||
* @see IDocumentHighlightService
|
||||
* @author efftinge - Initial contribution and API
|
||||
*/
|
||||
@SuppressWarnings("all")
|
||||
public class DocumentHighlightTest extends AbstractTestLangLanguageServerTest {
|
||||
public class DocumentTest {
|
||||
@Test
|
||||
public void singleLineNoOccurrences_SelectionBeforeWriteSiteMethodName() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } }");
|
||||
it.setModel(_builder.toString());
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("");
|
||||
public void testOffSet() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("hello world");
|
||||
_builder.newLine();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
_builder.newLine();
|
||||
String _normalize = this.normalize(_builder);
|
||||
Document _document = new Document(Integer.valueOf(1), _normalize);
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
Assert.assertEquals(0, it.getOffSet(this.position(0, 0)));
|
||||
Assert.assertEquals(11, it.getOffSet(this.position(0, 11)));
|
||||
try {
|
||||
it.getOffSet(this.position(0, 12));
|
||||
Assert.fail();
|
||||
} catch (final Throwable _t) {
|
||||
if (_t instanceof IndexOutOfBoundsException) {
|
||||
} else {
|
||||
throw Exceptions.sneakyThrow(_t);
|
||||
}
|
||||
}
|
||||
Assert.assertEquals(12, it.getOffSet(this.position(1, 0)));
|
||||
Assert.assertEquals(13, it.getOffSet(this.position(1, 1)));
|
||||
Assert.assertEquals(14, it.getOffSet(this.position(1, 2)));
|
||||
Assert.assertEquals(16, it.getOffSet(this.position(2, 0)));
|
||||
Assert.assertEquals(19, it.getOffSet(this.position(2, 3)));
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineNoOccurrences_SelectionAfterWriteSiteMethodName() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } }");
|
||||
it.setModel(_builder.toString());
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op foo(");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("");
|
||||
public void testOffSet_empty() {
|
||||
Document _document = new Document(Integer.valueOf(1), "");
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
Assert.assertEquals(0, it.getOffSet(this.position(0, 0)));
|
||||
try {
|
||||
it.getOffSet(this.position(0, 12));
|
||||
Assert.fail();
|
||||
} catch (final Throwable _t) {
|
||||
if (_t instanceof IndexOutOfBoundsException) {
|
||||
} else {
|
||||
throw Exceptions.sneakyThrow(_t);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineSingleOccurrence() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } }");
|
||||
it.setModel(_builder.toString());
|
||||
public void testUpdate_01() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("hello world");
|
||||
_builder.newLine();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
_builder.newLine();
|
||||
String _normalize = this.normalize(_builder);
|
||||
Document _document = new Document(Integer.valueOf(1), _normalize);
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[0, 12] .. [0, 15]]");
|
||||
_builder_1.append("hello world");
|
||||
_builder_1.newLine();
|
||||
_builder_1.append("bar");
|
||||
_builder_1.newLine();
|
||||
TextDocumentContentChangeEvent _change = this.change(this.position(1, 0), this.position(2, 0), "");
|
||||
Assert.assertEquals(this.normalize(_builder_1), it.applyTextDocumentChanges(
|
||||
Collections.<TextDocumentContentChangeEvent>unmodifiableList(CollectionLiterals.<TextDocumentContentChangeEvent>newArrayList(_change))).getContents());
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineSingleOccurrenceWithVariable() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { int foo op foo() { } }");
|
||||
it.setModel(_builder.toString());
|
||||
public void testUpdate_02() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("hello world");
|
||||
_builder.newLine();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
_builder.newLine();
|
||||
String _normalize = this.normalize(_builder);
|
||||
Document _document = new Document(Integer.valueOf(1), _normalize);
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { int fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[0, 13] .. [0, 16]]");
|
||||
_builder_1.append("hello world");
|
||||
_builder_1.newLine();
|
||||
_builder_1.append("future");
|
||||
_builder_1.newLine();
|
||||
_builder_1.append("bar");
|
||||
_builder_1.newLine();
|
||||
TextDocumentContentChangeEvent _change = this.change(this.position(1, 1), this.position(1, 3), "uture");
|
||||
Assert.assertEquals(this.normalize(_builder_1), it.applyTextDocumentChanges(
|
||||
Collections.<TextDocumentContentChangeEvent>unmodifiableList(CollectionLiterals.<TextDocumentContentChangeEvent>newArrayList(_change))).getContents());
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineSingleOccurrenceWithMultipleTypes() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } } type B { op foo() { } }");
|
||||
it.setModel(_builder.toString());
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[0, 12] .. [0, 15]]");
|
||||
public void testUpdate_03() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("hello world");
|
||||
_builder.newLine();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
String _normalize = this.normalize(_builder);
|
||||
Document _document = new Document(Integer.valueOf(1), _normalize);
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
TextDocumentContentChangeEvent _change = this.change(this.position(0, 0), this.position(2, 3), "");
|
||||
Assert.assertEquals("", it.applyTextDocumentChanges(
|
||||
Collections.<TextDocumentContentChangeEvent>unmodifiableList(CollectionLiterals.<TextDocumentContentChangeEvent>newArrayList(_change))).getContents());
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineMultipleOccurrences_SelectionOnReadSite() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } op bar() { foo(10) } }");
|
||||
it.setModel(_builder.toString());
|
||||
it.setLine(0);
|
||||
public void testApplyTextDocumentChanges_04() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
_builder.newLine();
|
||||
String _normalize = this.normalize(_builder);
|
||||
TextDocumentContentChangeEvent _change = this.change(this.position(0, 3), this.position(0, 3), "b");
|
||||
TextDocumentContentChangeEvent _change_1 = this.change(this.position(0, 4), this.position(0, 4), "a");
|
||||
TextDocumentContentChangeEvent _change_2 = this.change(this.position(0, 5), this.position(0, 5), "r");
|
||||
Document _applyTextDocumentChanges = new Document(Integer.valueOf(1), _normalize).applyTextDocumentChanges(
|
||||
Collections.<TextDocumentContentChangeEvent>unmodifiableList(CollectionLiterals.<TextDocumentContentChangeEvent>newArrayList(_change, _change_1, _change_2)));
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op foo() { } op bar() { fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[0, 12] .. [0, 15]] | R [[0, 33] .. [0, 36]]");
|
||||
_builder_1.append("foobar");
|
||||
_builder_1.newLine();
|
||||
_builder_1.append("bar");
|
||||
_builder_1.newLine();
|
||||
Assert.assertEquals(this.normalize(_builder_1), it.getContents());
|
||||
Assert.assertEquals(2, (it.getVersion()).intValue());
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_applyTextDocumentChanges, _function);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleLineMultipleOccurrences_SelectionOnWriteSite() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A { op foo() { } op bar() { foo(10) } }");
|
||||
it.setModel(_builder.toString());
|
||||
it.setLine(0);
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("type A { op fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[0, 12] .. [0, 15]] | R [[0, 33] .. [0, 36]]");
|
||||
public void testUpdate_nonIncrementalChange() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("hello world");
|
||||
_builder.newLine();
|
||||
_builder.append("foo");
|
||||
_builder.newLine();
|
||||
_builder.append("bar");
|
||||
String _normalize = this.normalize(_builder);
|
||||
Document _document = new Document(Integer.valueOf(1), _normalize);
|
||||
final Procedure1<Document> _function = (Document it) -> {
|
||||
TextEdit _textEdit = this.textEdit(null, null, " foo ");
|
||||
Assert.assertEquals(" foo ", it.applyChanges(
|
||||
Collections.<TextEdit>unmodifiableList(CollectionLiterals.<TextEdit>newArrayList(_textEdit))).getContents());
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
ObjectExtensions.<Document>operator_doubleArrow(_document, _function);
|
||||
}
|
||||
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testGetLineContent_negative() {
|
||||
new Document(Integer.valueOf(1), "").getLineContent((-1));
|
||||
}
|
||||
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testGetLineContent_exceeds() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("aaa");
|
||||
_builder.newLine();
|
||||
_builder.append("bbb");
|
||||
_builder.newLine();
|
||||
_builder.append("ccc");
|
||||
new Document(Integer.valueOf(1), _builder.toString()).getLineContent(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void multipleLinesMultipleOccurrences_WithHorizontalTabs() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A {");
|
||||
_builder.newLine();
|
||||
_builder.append("\t");
|
||||
_builder.append("op foo() { }");
|
||||
_builder.newLine();
|
||||
_builder.append("\t");
|
||||
_builder.append("op bar() {");
|
||||
_builder.newLine();
|
||||
_builder.append("\t\t");
|
||||
_builder.append("foo(10)");
|
||||
_builder.newLine();
|
||||
_builder.append("\t");
|
||||
_builder.append("}");
|
||||
_builder.newLine();
|
||||
_builder.append("}");
|
||||
it.setModel(_builder.toString());
|
||||
it.setLine(1);
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append("\t");
|
||||
_builder_1.append("op fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[1, 4] .. [1, 7]] | R [[3, 2] .. [3, 5]]");
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
public void testGetLineContent_empty() {
|
||||
Assert.assertEquals("", new Document(Integer.valueOf(1), "").getLineContent(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void multipleLinesMultipleOccurrences_WithWhitespaces() {
|
||||
final Procedure1<DocumentHighlightConfiguration> _function = (DocumentHighlightConfiguration it) -> {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("type A {");
|
||||
_builder.newLine();
|
||||
_builder.append(" ");
|
||||
_builder.append("op foo() { }");
|
||||
_builder.newLine();
|
||||
_builder.append(" ");
|
||||
_builder.append("op bar() {");
|
||||
_builder.newLine();
|
||||
_builder.append(" ");
|
||||
_builder.append("foo(10)");
|
||||
_builder.newLine();
|
||||
_builder.append(" ");
|
||||
_builder.append("}");
|
||||
_builder.newLine();
|
||||
_builder.append("}");
|
||||
it.setModel(_builder.toString());
|
||||
it.setLine(1);
|
||||
StringConcatenation _builder_1 = new StringConcatenation();
|
||||
_builder_1.append(" ");
|
||||
_builder_1.append("op fo");
|
||||
it.setColumn(_builder_1.length());
|
||||
it.setExpectedDocumentHighlight("W [[1, 7] .. [1, 10]] | R [[3, 8] .. [3, 11]]");
|
||||
public void testGetLineContent() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("aaa");
|
||||
_builder.newLine();
|
||||
_builder.append("bbb");
|
||||
_builder.newLine();
|
||||
_builder.append("ccc");
|
||||
String _unixLineSeparator = Strings.toUnixLineSeparator(_builder);
|
||||
Assert.assertEquals("bbb", new Document(Integer.valueOf(1), _unixLineSeparator).getLineContent(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetLineCount_empty() {
|
||||
Assert.assertEquals(1, new Document(Integer.valueOf(1), "").getLineCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetLineCount_single() {
|
||||
Assert.assertEquals(1, new Document(Integer.valueOf(1), "aaa bbb ccc").getLineCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetLineCount_multi() {
|
||||
StringConcatenation _builder = new StringConcatenation();
|
||||
_builder.append("aaa");
|
||||
_builder.newLine();
|
||||
_builder.append("bbb");
|
||||
_builder.newLine();
|
||||
_builder.append("ccc");
|
||||
Assert.assertEquals(3, new Document(Integer.valueOf(1), _builder.toString()).getLineCount());
|
||||
}
|
||||
|
||||
private TextDocumentContentChangeEvent change(final Position startPos, final Position endPos, final String newText) {
|
||||
TextDocumentContentChangeEvent _textDocumentContentChangeEvent = new TextDocumentContentChangeEvent();
|
||||
final Procedure1<TextDocumentContentChangeEvent> _function = (TextDocumentContentChangeEvent it) -> {
|
||||
if ((startPos != null)) {
|
||||
Range _range = new Range();
|
||||
final Procedure1<Range> _function_1 = (Range it_1) -> {
|
||||
it_1.setStart(startPos);
|
||||
it_1.setEnd(endPos);
|
||||
};
|
||||
Range _doubleArrow = ObjectExtensions.<Range>operator_doubleArrow(_range, _function_1);
|
||||
it.setRange(_doubleArrow);
|
||||
}
|
||||
it.setText(newText);
|
||||
};
|
||||
this.testDocumentHighlight(_function);
|
||||
return ObjectExtensions.<TextDocumentContentChangeEvent>operator_doubleArrow(_textDocumentContentChangeEvent, _function);
|
||||
}
|
||||
|
||||
private TextEdit textEdit(final Position startPos, final Position endPos, final String newText) {
|
||||
TextEdit _textEdit = new TextEdit();
|
||||
final Procedure1<TextEdit> _function = (TextEdit it) -> {
|
||||
if ((startPos != null)) {
|
||||
Range _range = new Range();
|
||||
final Procedure1<Range> _function_1 = (Range it_1) -> {
|
||||
it_1.setStart(startPos);
|
||||
it_1.setEnd(endPos);
|
||||
};
|
||||
Range _doubleArrow = ObjectExtensions.<Range>operator_doubleArrow(_range, _function_1);
|
||||
it.setRange(_doubleArrow);
|
||||
}
|
||||
it.setNewText(newText);
|
||||
};
|
||||
return ObjectExtensions.<TextEdit>operator_doubleArrow(_textEdit, _function);
|
||||
}
|
||||
|
||||
private String normalize(final CharSequence s) {
|
||||
return s.toString().replaceAll("\r", "");
|
||||
}
|
||||
|
||||
private Position position(final int l, final int c) {
|
||||
Position _position = new Position();
|
||||
final Procedure1<Position> _function = (Position it) -> {
|
||||
it.setLine(l);
|
||||
it.setCharacter(c);
|
||||
};
|
||||
return ObjectExtensions.<Position>operator_doubleArrow(_position, _function);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
|
|||
import org.eclipse.xtend2.lib.StringConcatenation;
|
||||
import org.eclipse.xtext.ide.server.UriExtensions;
|
||||
import org.eclipse.xtext.ide.tests.server.AbstractTestLangLanguageServerTest;
|
||||
import org.eclipse.xtext.util.Strings;
|
||||
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
|
||||
import org.eclipse.xtext.xbase.lib.Extension;
|
||||
import org.eclipse.xtext.xbase.lib.Functions.Function1;
|
||||
|
@ -315,6 +316,6 @@ public class SemanticHighlightingTest extends AbstractTestLangLanguageServerTest
|
|||
return this.toExpectation(it);
|
||||
};
|
||||
final String actual = IterableExtensions.join(ListExtensions.<Pair<SemanticHighlightingInformation, List<List<String>>>, String>map(ListExtensions.<SemanticHighlightingInformation, Pair<SemanticHighlightingInformation, List<List<String>>>>map(IterableExtensions.<SemanticHighlightingInformation>sortWith(entry.getValue(), _function_1), _function_2), _function_3), "\n");
|
||||
this.assertEquals(expected, actual);
|
||||
this.assertEquals(Strings.toUnixLineSeparator(expected), actual);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,12 +12,12 @@ import com.google.inject.Inject
|
|||
import com.google.inject.Module
|
||||
import java.io.File
|
||||
import java.io.FileWriter
|
||||
import java.net.URI
|
||||
import java.nio.file.Path
|
||||
import java.nio.file.Paths
|
||||
import java.util.List
|
||||
import java.util.Map
|
||||
import java.util.concurrent.CompletableFuture
|
||||
import org.eclipse.emf.common.util.URI
|
||||
import org.eclipse.lsp4j.CodeAction
|
||||
import org.eclipse.lsp4j.CodeActionContext
|
||||
import org.eclipse.lsp4j.CodeActionParams
|
||||
|
@ -65,6 +65,7 @@ import org.eclipse.lsp4j.WorkspaceSymbolParams
|
|||
import org.eclipse.lsp4j.jsonrpc.Endpoint
|
||||
import org.eclipse.lsp4j.jsonrpc.messages.Either
|
||||
import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints
|
||||
import org.eclipse.lsp4j.services.LanguageClient
|
||||
import org.eclipse.lsp4j.util.SemanticHighlightingTokens
|
||||
import org.eclipse.xtend.lib.annotations.Accessors
|
||||
import org.eclipse.xtend.lib.annotations.Data
|
||||
|
@ -84,7 +85,8 @@ import org.junit.Assert
|
|||
import org.junit.Before
|
||||
import org.junit.jupiter.api.AfterEach
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.eclipse.lsp4j.services.LanguageClient
|
||||
|
||||
import static extension org.eclipse.xtext.util.Strings.*
|
||||
|
||||
import static extension org.eclipse.lsp4j.util.Ranges.containsRange
|
||||
|
||||
|
@ -174,7 +176,7 @@ abstract class AbstractLanguageServerTest implements Endpoint {
|
|||
}
|
||||
|
||||
protected def Path relativize(String uri) {
|
||||
val path = Paths.get(new URI(uri))
|
||||
val path = Paths.get(new java.net.URI(uri))
|
||||
testRootPath.relativize(path)
|
||||
}
|
||||
|
||||
|
@ -210,7 +212,7 @@ abstract class AbstractLanguageServerTest implements Endpoint {
|
|||
uri = fileUri
|
||||
languageId = langaugeId
|
||||
version = 1
|
||||
text = model
|
||||
text = model.toUnixLineSeparator
|
||||
]
|
||||
])
|
||||
}
|
||||
|
@ -416,7 +418,7 @@ abstract class AbstractLanguageServerTest implements Endpoint {
|
|||
protected dispatch def String toExpectation(WorkspaceEdit it) '''
|
||||
changes :
|
||||
«FOR entry : changes.entrySet»
|
||||
«org.eclipse.emf.common.util.URI.createURI(entry.key).lastSegment» : «entry.value.toExpectation»
|
||||
«URI.createURI(entry.key).lastSegment» : «entry.value.toExpectation»
|
||||
«ENDFOR»
|
||||
documentChanges :
|
||||
«documentChanges.toExpectation»
|
||||
|
@ -435,7 +437,7 @@ abstract class AbstractLanguageServerTest implements Endpoint {
|
|||
'''
|
||||
|
||||
protected def dispatch String toExpectation(VersionedTextDocumentIdentifier v)
|
||||
'''«org.eclipse.emf.common.util.URI.createURI(v.uri).lastSegment» <«v.version»>'''
|
||||
'''«URI.createURI(v.uri).lastSegment» <«v.version»>'''
|
||||
|
||||
|
||||
|
||||
|
@ -782,6 +784,10 @@ class TextDocumentConfiguration {
|
|||
String model
|
||||
String filePath
|
||||
(InitializeParams)=>void initializer
|
||||
|
||||
def void setModel(String model) {
|
||||
this.model = model.toUnixLineSeparator
|
||||
}
|
||||
}
|
||||
|
||||
@Accessors
|
||||
|
|
|
@ -107,6 +107,7 @@ import org.eclipse.xtext.testing.WorkspaceSymbolConfiguration;
|
|||
import org.eclipse.xtext.util.CancelIndicator;
|
||||
import org.eclipse.xtext.util.Files;
|
||||
import org.eclipse.xtext.util.Modules2;
|
||||
import org.eclipse.xtext.util.Strings;
|
||||
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
|
||||
import org.eclipse.xtext.xbase.lib.Conversions;
|
||||
import org.eclipse.xtext.xbase.lib.Exceptions;
|
||||
|
@ -368,7 +369,7 @@ public abstract class AbstractLanguageServerTest implements Endpoint {
|
|||
it_1.setUri(fileUri);
|
||||
it_1.setLanguageId(langaugeId);
|
||||
it_1.setVersion(1);
|
||||
it_1.setText(model);
|
||||
it_1.setText(Strings.toUnixLineSeparator(model));
|
||||
};
|
||||
TextDocumentItem _doubleArrow = ObjectExtensions.<TextDocumentItem>operator_doubleArrow(_textDocumentItem, _function_1);
|
||||
it.setTextDocument(_doubleArrow);
|
||||
|
|
Loading…
Reference in a new issue