blob: 44ea62e19f3a99262dbf8551b41e58b7cb6b2e9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thomas Wolf - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.text.tests;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.ui.text.java.JavaStringDoubleClickStrategy;
public class JavaStringDoubleClickStrategyTest {
/**
* Makes link {@link #findWord(IDocument, int)} accessible and provides a way to fake the
* partition region.
*/
private static class TestStrategy extends JavaStringDoubleClickStrategy {
private final IRegion partition;
public TestStrategy(IRegion partition, int delimiterLength) {
super("Dummy", delimiterLength, delimiterLength, delimiterLength);
this.partition= partition;
}
@Override
protected IRegion getPartitionRegion(IDocument document, int offset) throws BadLocationException {
if (partition != null) {
return partition;
}
return new Region(0, document.getLength());
}
@Override
protected IRegion findWord(IDocument document, int offset) {
return super.findWord(document, offset);
}
}
private void assertDoubleClick(String text, int offset, IRegion expected) {
assertDoubleClick(text, offset, expected, (IRegion) null);
}
private void assertDoubleClick(String text, int offset, IRegion expected, IRegion partition) {
assertDoubleClick(text, offset, expected, partition, 1);
}
private void assertDoubleClick(String text, int offset, IRegion expected, IRegion partition, int delimiterLength) {
IDocument document= new Document(text);
TestStrategy strategy= new TestStrategy(partition, delimiterLength);
IRegion selection= strategy.findWord(document, offset);
assertEquals("Click at " + offset + " in: " + text, expected, selection);
}
private void assertDoubleClick(String text, int offset, IRegion expected, String version) {
IDocument document= new Document(text);
TestStrategy strategy= new TestStrategy(null, 1);
strategy.setSourceVersion(version);
IRegion selection= strategy.findWord(document, offset);
assertEquals("Click at " + offset + " in: " + text, expected, selection);
}
@Test
public void testSingleWordString() {
assertDoubleClick("\"bye\"", 3, new Region(1, 3));
assertDoubleClick("\"bye\"", 2, new Region(1, 3));
assertDoubleClick("\"bye\"", 1, new Region(1, 3));
}
@Test
public void testWithSimpleEscape() {
assertDoubleClick("\"bye\\nbye\"", 9, new Region(6, 3));
assertDoubleClick("\"bye\\nbye\"", 8, new Region(6, 3));
assertDoubleClick("\"bye\\nbye\"", 7, new Region(6, 3));
assertDoubleClick("\"bye\\nbye\"", 6, new Region(4, 2));
assertDoubleClick("\"bye\\nbye\"", 5, new Region(4, 2));
assertDoubleClick("\"bye\\nbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\nbye\"", 3, new Region(1, 3));
}
@Test
public void testWithDoubleEscape() {
assertDoubleClick("\"bye\\\\nbye\"", 10, new Region(6, 4));
assertDoubleClick("\"bye\\\\nbye\"", 9, new Region(6, 4));
assertDoubleClick("\"bye\\\\nbye\"", 8, new Region(6, 4));
assertDoubleClick("\"bye\\\\nbye\"", 7, new Region(6, 4));
assertDoubleClick("\"bye\\\\nbye\"", 6, new Region(6, 4));
assertDoubleClick("\"bye\\\\nbye\"", 5, new Region(4, 2));
assertDoubleClick("\"bye\\\\nbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\\\nbye\"", 3, new Region(1, 3));
}
@Test
public void testWithTripleEscape() {
assertDoubleClick("\"bye\\\\\\nbye\"", 11, new Region(8, 3));
assertDoubleClick("\"bye\\\\\\nbye\"", 10, new Region(8, 3));
assertDoubleClick("\"bye\\\\\\nbye\"", 9, new Region(8, 3));
assertDoubleClick("\"bye\\\\\\nbye\"", 8, new Region(6, 2));
assertDoubleClick("\"bye\\\\\\nbye\"", 7, new Region(6, 2));
assertDoubleClick("\"bye\\\\\\nbye\"", 6, new Region(4, 2));
assertDoubleClick("\"bye\\\\\\nbye\"", 5, new Region(4, 2));
assertDoubleClick("\"bye\\\\\\nbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\\\\\nbye\"", 3, new Region(1, 3));
}
@Test
public void testWithUnicodeEscape1() {
assertDoubleClick("\"bye\\u004fbye\"", 13, new Region(10, 3));
assertDoubleClick("\"bye\\u004fbye\"", 12, new Region(10, 3));
assertDoubleClick("\"bye\\u004fbye\"", 11, new Region(10, 3));
assertDoubleClick("\"bye\\u004fbye\"", 10, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 9, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 8, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 7, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 6, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 5, new Region(4, 6));
assertDoubleClick("\"bye\\u004fbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\u004fbye\"", 3, new Region(1, 3));
}
@Test
public void testWithUnicodeEscape2() {
assertDoubleClick("\"bye\\u004fnbye\"", 14, new Region(10, 4));
assertDoubleClick("\"bye\\u004fnbye\"", 13, new Region(10, 4));
assertDoubleClick("\"bye\\u004fnbye\"", 12, new Region(10, 4));
assertDoubleClick("\"bye\\u004fnbye\"", 11, new Region(10, 4));
assertDoubleClick("\"bye\\u004fnbye\"", 10, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 9, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 8, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 7, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 6, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 5, new Region(4, 6));
assertDoubleClick("\"bye\\u004fnbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\u004fnbye\"", 3, new Region(1, 3));
}
@Test
public void testWithBrokenUnicodeEscape() {
assertDoubleClick("\"bye\\u004nbye\"", 13, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 12, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 11, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 10, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 9, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 8, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 7, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 6, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 5, new Region(5, 8));
assertDoubleClick("\"bye\\u004nbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\u004nbye\"", 3, new Region(1, 3));
}
@Test
public void testWithPartition() {
assertDoubleClick("hello \"bye\\nbye\" world", 21, new Region(17, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 20, new Region(17, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 19, new Region(17, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 18, new Region(17, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 17, new Region(17, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 16, new Region(15, 1), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 15, new Region(12, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 14, new Region(12, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 13, new Region(12, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 12, new Region(10, 2), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 11, new Region(10, 2), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 10, new Region(7, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 9, new Region(7, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 8, new Region(7, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 7, new Region(7, 3), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 6, new Region(5, 1), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 5, new Region(0, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 4, new Region(0, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 3, new Region(0, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 2, new Region(0, 5), new Region(6, 10));
assertDoubleClick("hello \"bye\\nbye\" world", 1, new Region(0, 5), new Region(6, 10));
}
@Test
public void testOctalEscape() {
assertDoubleClick("\"\"\"\nbye\\0\n\"\"\"", 8, new Region(7, 2), null, 3);
assertDoubleClick("\"\"\"\nbye\\0\n\"\"\"", 7, new Region(4, 3), null, 3);
assertDoubleClick("\"\"\"\nbye\\01\n\"\"\"", 9, new Region(7, 3), null, 3);
assertDoubleClick("\"\"\"\nbye\\01\n\"\"\"", 8, new Region(7, 3), null, 3);
assertDoubleClick("\"\"\"\nbye\\01\n\"\"\"", 7, new Region(4, 3), null, 3);
assertDoubleClick("\"\"\"\nbye\\012\n\"\"\"", 10, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\012\n\"\"\"", 9, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\012\n\"\"\"", 8, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\012\n\"\"\"", 7, new Region(4, 3), null, 3);
assertDoubleClick("\"\"\"\nbye\\0123\n\"\"\"", 11, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\0123\n\"\"\"", 10, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\0123\n\"\"\"", 9, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\0123\n\"\"\"", 8, new Region(7, 4), null, 3);
assertDoubleClick("\"\"\"\nbye\\0123\n\"\"\"", 7, new Region(4, 3), null, 3);
}
@Test
public void testLineTerminator() {
assertDoubleClick("\"\"\"\nbye\\\n\"\"\"", 7, new Region(4, 3), null, 3);
}
@Test
public void testSpaceEscapeDefault() {
assertDoubleClick("\"bye\\sbye\"", 9, new Region(5, 4));
assertDoubleClick("\"bye\\sbye\"", 8, new Region(5, 4));
assertDoubleClick("\"bye\\sbye\"", 7, new Region(5, 4));
assertDoubleClick("\"bye\\sbye\"", 6, new Region(5, 4));
assertDoubleClick("\"bye\\sbye\"", 5, new Region(5, 4));
assertDoubleClick("\"bye\\sbye\"", 4, new Region(1, 3));
assertDoubleClick("\"bye\\sbye\"", 3, new Region(1, 3));
}
@Test
public void testSpaceEscapeOnJava11() {
assertDoubleClick("\"bye\\sbye\"", 9, new Region(5, 4), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 8, new Region(5, 4), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 7, new Region(5, 4), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 6, new Region(5, 4), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 5, new Region(5, 4), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 4, new Region(1, 3), JavaCore.VERSION_11);
assertDoubleClick("\"bye\\sbye\"", 3, new Region(1, 3), JavaCore.VERSION_11);
}
@Test
public void testSpaceEscapeOnJava15() {
assertDoubleClick("\"bye\\sbye\"", 9, new Region(6, 3), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 8, new Region(6, 3), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 7, new Region(6, 3), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 6, new Region(4, 2), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 5, new Region(4, 2), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 4, new Region(1, 3), JavaCore.VERSION_15);
assertDoubleClick("\"bye\\sbye\"", 3, new Region(1, 3), JavaCore.VERSION_15);
}
@Test
public void testSpaceEscapeOnJava16() {
assertDoubleClick("\"bye\\sbye\"", 9, new Region(6, 3), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 8, new Region(6, 3), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 7, new Region(6, 3), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 6, new Region(4, 2), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 5, new Region(4, 2), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 4, new Region(1, 3), JavaCore.VERSION_16);
assertDoubleClick("\"bye\\sbye\"", 3, new Region(1, 3), JavaCore.VERSION_16);
}
}