/*
* Copyright 2013-2016 Sergey Ignatov, Alexander Zolotov, Florin Patan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.goide.util;
import com.goide.GoCodeInsightFixtureTestCase;
import com.goide.psi.GoStringLiteral;
import com.goide.psi.impl.GoElementFactory;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.psi.LiteralTextEscaper;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.testFramework.PlatformTestUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
public class GoStringLiteralEscaperTest extends GoCodeInsightFixtureTestCase {
private static String decodeRange(@NotNull GoStringLiteral expr, @NotNull TextRange range) {
StringBuilder builder = new StringBuilder();
expr.createLiteralTextEscaper().decode(range, builder);
return builder.toString();
}
public void testEscaperDecodeString() {
GoStringLiteral expr = createStringFromText("\\nfoo");
assertNotNull(expr);
assertEquals("fo", decodeRange(expr, TextRange.create(3, 5)));
assertEquals("\n", decodeRange(expr, TextRange.create(1, 3)));
}
public void testEscaperDecodeRawString() {
GoStringLiteral expr = createRawStringFromText("\nfoo");
assertNotNull(expr);
assertEquals("fo", decodeRange(expr, TextRange.create(2, 4)));
assertEquals("\n", decodeRange(expr, TextRange.create(1, 2)));
}
public void testEscaperOffsetInStringHost() {
GoStringLiteral expr = createStringFromText("\\nfoo");
assertNotNull(expr);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange newLineFoo = TextRange.create(1, 6);
escaper.decode(newLineFoo, new StringBuilder());
assertEquals(1, escaper.getOffsetInHost(0, newLineFoo));
assertEquals(3, escaper.getOffsetInHost(1, newLineFoo));
assertEquals(4, escaper.getOffsetInHost(2, newLineFoo));
assertEquals(5, escaper.getOffsetInHost(3, newLineFoo));
assertEquals(6, escaper.getOffsetInHost(4, newLineFoo));
assertEquals(-1, escaper.getOffsetInHost(5, newLineFoo));
}
public void testEscaperOffsetInRawStringHost() {
GoStringLiteral expr = createRawStringFromText("\nfoo");
assertNotNull(expr);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange newLineFoo = TextRange.create(1, 5);
escaper.decode(newLineFoo, new StringBuilder());
assertEquals(1, escaper.getOffsetInHost(0, newLineFoo));
assertEquals(2, escaper.getOffsetInHost(1, newLineFoo));
assertEquals(3, escaper.getOffsetInHost(2, newLineFoo));
assertEquals(4, escaper.getOffsetInHost(3, newLineFoo));
assertEquals(5, escaper.getOffsetInHost(4, newLineFoo));
assertEquals(-1, escaper.getOffsetInHost(5, newLineFoo));
}
public void testEscaperOffsetInStringHostSubString() {
GoStringLiteral expr = createStringFromText("\\nfoo");
assertNotNull(expr);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange fooOnly = TextRange.create(3, 6);
escaper.decode(fooOnly, new StringBuilder());
assertEquals(3, escaper.getOffsetInHost(0, fooOnly));
assertEquals(4, escaper.getOffsetInHost(1, fooOnly));
assertEquals(5, escaper.getOffsetInHost(2, fooOnly));
assertEquals(6, escaper.getOffsetInHost(3, fooOnly));
assertEquals(-1, escaper.getOffsetInHost(4, fooOnly));
}
public void testEscaperOffsetInRawStringHostSubString() {
GoStringLiteral expr = createRawStringFromText("\nfoo");
assertNotNull(expr);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange fooOnly = TextRange.create(2, 5);
escaper.decode(fooOnly, new StringBuilder());
assertEquals(2, escaper.getOffsetInHost(0, fooOnly));
assertEquals(3, escaper.getOffsetInHost(1, fooOnly));
assertEquals(4, escaper.getOffsetInHost(2, fooOnly));
assertEquals(5, escaper.getOffsetInHost(3, fooOnly));
assertEquals(-1, escaper.getOffsetInHost(4, fooOnly));
}
public void testEscaperOffsetInSingleCharString() {
doSingleCharTest(createStringFromText("c"));
}
public void testEscaperOffsetInSingleCharRawString() {
doSingleCharTest(createRawStringFromText("c"));
}
private static void doSingleCharTest(@NotNull GoStringLiteral expr) {
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange range = TextRange.create(1, 2);
escaper.decode(range, new StringBuilder());
assertEquals(1, escaper.getOffsetInHost(0, range));
assertEquals(2, escaper.getOffsetInHost(1, range));
assertEquals(-1, escaper.getOffsetInHost(2, range));
}
public void testEscaperOffsetInSingleEscapedCharString() {
GoStringLiteral expr = createStringFromText("\\n");
assertNotNull(expr);
LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
TextRange range = TextRange.create(1, 3);
escaper.decode(range, new StringBuilder());
assertEquals(1, escaper.getOffsetInHost(0, range));
assertEquals(3, escaper.getOffsetInHost(1, range));
assertEquals(-1, escaper.getOffsetInHost(2, range));
}
// region decode tests
public void testDecodeEscapedString() {
GoStringLiteral expr = createStringFromText("\\t\\n\\b");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 7));
assertEquals("\t\n\b", a);
}
public void testDecodeEscapedVerticalTabString() {
GoStringLiteral expr = createStringFromText("\\v");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 3));
assertEquals("\013", a);
}
public void testDecodeEscapedBellString() {
GoStringLiteral expr = createStringFromText("\\a");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 3));
assertEquals("\007", a);
}
public void testDecodeOctalCharString() {
GoStringLiteral expr = createStringFromText("\\011");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 5));
assertEquals("\t", a);
}
public void testDecodeHexCharString() {
GoStringLiteral expr = createStringFromText("\\x41");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 5));
assertEquals("A", a);
}
public void testDecodeShortUnicodeCharString() {
GoStringLiteral expr = createStringFromText("\\u8a9e");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 7));
assertEquals("語", a);
}
public void testDecodeLongUnicodeCharString() {
PlatformTestUtil.withEncoding(CharsetToolkit.UTF8, () -> {
GoStringLiteral expr = createStringFromText("\\U00008a9e");
assertNotNull(expr);
String a = decodeRange(expr, TextRange.create(1, 11));
assertEquals("語", a);
});
}
public void testQuote() {
PlatformTestUtil.withEncoding(CharsetToolkit.UTF8, () -> {
GoStringLiteral expr = createStringFromText("import \\\"fmt\\\"");
assertNotNull(expr);
assertEquals("\"fmt\"", decodeRange(expr, TextRange.create(8, 15)));
});
}
// endregion
@NotNull
private GoStringLiteral createStringFromText(@NotNull String text) {
return GoElementFactory.createStringLiteral(myFixture.getProject(), String.format(Locale.US, "\"%s\"", text));
}
@NotNull
private GoStringLiteral createRawStringFromText(@NotNull String text) {
return GoElementFactory.createStringLiteral(myFixture.getProject(), String.format(Locale.US, "`%s`", text));
}
}