package openmods.calc;
import gnu.trove.set.hash.TCharHashSet;
import openmods.calc.parsing.StringEscaper;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.Assert;
import org.junit.Test;
public class EscapeTest {
private static void verifyParse(String input, String output, int start, int end) {
final Pair<String, Integer> result = StringEscaper.unescapeDelimitedString(input, start);
Assert.assertEquals(output, result.getLeft());
Assert.assertEquals(end, result.getRight().intValue());
}
private static void verifyFullParse(String input, String output) {
verifyParse(input, output, 0, input.length());
}
@Test
public void testSimpleStrings() {
verifyFullParse("''", "");
verifyFullParse("'abc'", "abc");
verifyFullParse("\"\"", "");
verifyFullParse("\"abc\"", "abc");
verifyFullParse("'\"\"'", "\"\"");
verifyFullParse("\"''\"", "''");
verifyFullParse("'a\"bc'", "a\"bc");
verifyFullParse("\"a'bc\"", "a'bc");
}
@Test
public void testPartialStringEscape() {
verifyParse("aaa'abc'", "abc", 3, 8);
verifyParse("'abc'def", "abc", 0, 5);
verifyParse("aaa'abc'ccc", "abc", 3, 8);
}
@Test
public void testFullStringEscape() {
verifyFullParse("'\\\\'", "\\");
verifyFullParse("'\\\''", "'");
verifyFullParse("\"\\\"\"", "\"");
verifyFullParse("'\\r'", "\r");
verifyFullParse("'\\n'", "\n");
verifyFullParse("'\\b'", "\b");
verifyFullParse("'\\t'", "\t");
verifyFullParse("'\\f'", "\f");
verifyFullParse("'\\0'", "\0");
verifyFullParse("'\\x20'", " ");
verifyFullParse("'a\\x20'", "a ");
verifyFullParse("'\\x20a'", " a");
verifyFullParse("'\\x00'", "\0");
verifyFullParse("'\\u2603'", "\u2603");
verifyFullParse("'\\uD83D\\uDE08'", "\uD83D\uDE08");
verifyFullParse("'\\U0001F608'", "\uD83D\uDE08");
}
private static void verifyEscape(String input, String output) {
Assert.assertEquals(output, StringEscaper.escapeString(input, '\'', new TCharHashSet(new char[] { '"' })));
}
@Test
public void testEscape() {
verifyEscape("a", "'a'");
verifyEscape(" ", "' '");
verifyEscape(" ", "' '");
verifyEscape("\r", "'\\r'");
verifyEscape("\n", "'\\n'");
verifyEscape("\b", "'\\b'");
verifyEscape("\t", "'\\t'");
verifyEscape("\f", "'\\f'");
verifyEscape("\0", "'\\0'");
verifyEscape(Character.toString((char)0x05), "'\\x05'");
verifyEscape(Character.toString((char)0x15), "'\\x15'");
verifyEscape("\u2603", "'\\u2603'");
verifyEscape("\u0603", "'\\u0603'");
verifyEscape("\uD83D\uDE08", "'\\U0001F608'");
}
}