package bsh;
import org.junit.Assert;
import org.junit.Test;
public class StringLiteralTest {
private static final String ESCAPE_CHAR = "\\";
private enum DelimiterMode {
SINGLE_LINE("\""),
MULTI_LINE("\"\"\"");
private final String _delimiter;
DelimiterMode(String delimiter) {
_delimiter = delimiter;
}
public String delimiter() {
return _delimiter;
}
}
@Test
public void parse_string_literal() throws Exception {
assertStringParsing("test", DelimiterMode.SINGLE_LINE);
}
@Test
public void parse_long_string_literal_singleline() throws Exception {
assertStringParsing("test", DelimiterMode.MULTI_LINE);
}
@Test
public void parse_string_literal_with_escaped_chars() throws Exception {
assertStringParsing(
"\\\n\t\r\"\'",
ESCAPE_CHAR + '\\' +
ESCAPE_CHAR + "n" +
ESCAPE_CHAR + "t" +
ESCAPE_CHAR + "r" +
ESCAPE_CHAR + '"' +
ESCAPE_CHAR + "'",
DelimiterMode.SINGLE_LINE);
}
@Test
public void parse_string_literal_with_special_chars_multiline() throws Exception {
assertStringParsing(
"\t\n\\\"\'",
"\t\n\\\"\'",
DelimiterMode.MULTI_LINE);
}
/** http://sourceforge.net/tracker/?func=detail&aid=1898217&group_id=4075&atid=104075 */
@Test
public void parse_unicode_literals() throws Exception {
assertStringParsing("\u00FF", "\\u00FF", DelimiterMode.SINGLE_LINE);
}
@Test
public void parse_long_string_literal_multiline() throws Exception {
assertStringParsing("test\ntest", DelimiterMode.MULTI_LINE);
}
private void assertStringParsing(final String s, final DelimiterMode mode) throws EvalError {
assertStringParsing(s, s, mode);
}
private void assertStringParsing(final String expected, final String source, final DelimiterMode mode) throws EvalError {
final Interpreter interpreter = new Interpreter();
Assert.assertEquals(expected, interpreter.eval("return " + mode.delimiter() + source + mode.delimiter() + ""));
}
}