package org.python.pydev.editor;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.rules.IToken;
import org.python.pydev.editor.ColorCacheAndStyleForTesting.TextAttr;
import org.python.pydev.shared_core.string.FastStringBuffer;
import junit.framework.TestCase;
public class PyFStringScannerTest extends TestCase {
public void testFStringTokenScanner1() {
check(
"f'a {b} a'",
"" +
"unicode:0:2\n" +
"unicode:2:2\n" +
"string:4:3\n" +
"unicode:7:2\n" +
"unicode:9:1\n" +
"");
}
//It's possible that the damage comes from a non-full damager
//if the damage was done in another partition, so, we need to
//cover for this situation.
public void testFStringTokenScanner1a() {
check(
"f'''",
"" +
"unicode:0:4\n" +
"");
}
public void testFStringTokenScanner1b() {
check(
"f'''{",
"" +
"unicode:0:4\n" +
"string:4:1\n" +
"");
}
public void testFStringTokenScanner1c() {
check(
"f'''{}a",
"" +
"unicode:0:4\n" +
"string:4:2\n" +
"unicode:6:1\n" +
"");
}
public void testFStringTokenScanner2() {
check(
"f'{b}'",
"" +
"unicode:0:2\n" +
"string:2:3\n" +
"unicode:5:1\n" +
"");
}
public void testFStringTokenScanner2a() {
check(
" f' {b}' ", //Note: checking on a substring
"" +
"unicode:2:2\n" +
"unicode:4:2\n" +
"string:6:3\n" +
"unicode:9:1\n" +
"",
2,
8);
}
public void testFStringTokenScanner3() {
check(
"f'{bsn'",
"" +
"unicode:0:2\n" +
"string:2:4\n" +
"unicode:6:1\n" +
"");
}
public void testFStringTokenScanner4() {
check(
"f'aa{bsn",
"" +
"unicode:0:2\n" +
"unicode:2:2\n" +
"string:4:4\n" +
"");
}
public void testFStringTokenScanner5() {
check(
"f'a{b}a{b}a",
"" +
"unicode:0:2\n" +
"unicode:2:1\n" +
"string:3:3\n" +
"unicode:6:1\n" +
"string:7:3\n" +
"unicode:10:1\n" +
"");
}
public void testFStringTokenScanner6() {
check(
"f\"{'{b}'}\"",
"" +
"unicode:0:2\n" +
"string:2:7\n" +
"unicode:9:1\n" +
"");
}
public void testFStringTokenScanner8() {
check(
"f'{}{}",
"" +
"unicode:0:2\n" +
"string:2:2\n" +
"string:4:2\n" +
"");
}
public void testFStringTokenScanner9() {
check(
"f'th\n{an}",
"" +
"unicode:0:2\n" +
"unicode:2:3\n" +
"string:5:4\n" +
"");
}
private void check(String initialContent, String expected) {
check(initialContent, expected, 0, initialContent.length());
}
private void check(String initialContent, String expected, int startOffset, int len) {
Document document = new Document(initialContent);
ColorCacheAndStyleForTesting colorCache = new ColorCacheAndStyleForTesting();
PyFStringScanner pyStringScanner = new PyFStringScanner(colorCache);
pyStringScanner.setRange(document, startOffset, len);
FastStringBuffer buf = new FastStringBuffer();
while (true) {
IToken nextToken = pyStringScanner.nextToken();
if (nextToken.isEOF()) {
break;
}
int tokenOffset = pyStringScanner.getTokenOffset();
int tokenLength = pyStringScanner.getTokenLength();
String data = ((TextAttr) nextToken.getData()).data;
buf.append(data).append(':').append(tokenOffset)
.append(':').append(tokenLength).append('\n');
}
String string = buf.toString();
assertEquals(expected, string);
}
}