[eclipse/xtext-core#1183]: Fix tests on windows machines.

Signed-off-by: Arne Deutsch <Arne.Deutsch@itemis.de>
This commit is contained in:
Arne Deutsch 2019-06-25 13:40:33 +02:00
parent 12e6a792c9
commit 7c8e4e3d82
6 changed files with 435 additions and 287 deletions

View file

@ -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]
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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);