use super::*;
use SyntaxKind::*;
#[test]
fn simple_string() {
assert_eq!(
tokens(r#""hello""#),
vec![(QUOTE, "\""), (STRING_TEXT, "hello"), (QUOTE, "\"")]
);
}
#[test]
fn string_with_escapes() {
assert_eq!(
tokens(r#""a\nb""#),
vec![
(QUOTE, "\""),
(STRING_TEXT, "a"),
(STRING_ESCAPE, "\\n"),
(STRING_TEXT, "b"),
(QUOTE, "\""),
]
);
}
#[test]
fn all_escape_sequences() {
assert_eq!(
tokens(r#""\\\"\n\t""#),
vec![
(QUOTE, "\""),
(STRING_ESCAPE, r"\\"),
(STRING_ESCAPE, r#"\""#),
(STRING_ESCAPE, r"\n"),
(STRING_ESCAPE, r"\t"),
(QUOTE, "\""),
]
);
}
#[test]
fn invalid_escape_is_string_text() {
let toks = tokens(r#""\x""#);
assert_eq!(
toks,
vec![(QUOTE, "\""), (STRING_TEXT, "\\x"), (QUOTE, "\""),]
);
}
#[test]
fn backslash_at_end_of_string() {
let toks = tokens(r#""\""#);
assert_eq!(toks, vec![(QUOTE, "\""), (STRING_ESCAPE, r#"\""#),]);
}
#[test]
fn backslash_before_eof_in_string() {
let toks = tokens("\"hello\\");
assert_eq!(
toks,
vec![(QUOTE, "\""), (STRING_TEXT, "hello"), (STRING_TEXT, "\\"),]
);
}
#[test]
fn string_with_interpolation() {
let toks = tokens(r#""J{"o"}e""#);
let expected = vec![
(QUOTE, "\""),
(STRING_TEXT, "J"),
(L_BRACE, "{"),
(QUOTE, "\""),
(STRING_TEXT, "o"),
(QUOTE, "\""),
(R_BRACE, "}"),
(STRING_TEXT, "e"),
(QUOTE, "\""),
];
assert_eq!(toks, expected);
}
#[test]
fn string_interpolation_with_expression() {
let toks = tokens(r#""x is {x + 1}""#);
let expected = vec![
(QUOTE, "\""),
(STRING_TEXT, "x is "),
(L_BRACE, "{"),
(IDENT, "x"),
(WHITESPACE, " "),
(PLUS, "+"),
(WHITESPACE, " "),
(INTEGER, "1"),
(R_BRACE, "}"),
(QUOTE, "\""),
];
assert_eq!(toks, expected);
}
#[test]
fn nested_string_interpolation() {
let toks = tokens(r#""a{"b{"c"}d"}e""#);
let expected = vec![
(QUOTE, "\""), (STRING_TEXT, "a"),
(L_BRACE, "{"), (QUOTE, "\""), (STRING_TEXT, "b"),
(L_BRACE, "{"), (QUOTE, "\""), (STRING_TEXT, "c"),
(QUOTE, "\""), (R_BRACE, "}"), (STRING_TEXT, "d"),
(QUOTE, "\""), (R_BRACE, "}"), (STRING_TEXT, "e"),
(QUOTE, "\""), ];
assert_eq!(toks, expected);
}
#[test]
fn empty_string() {
assert_eq!(tokens(r#""""#), vec![(QUOTE, "\""), (QUOTE, "\"")]);
}
#[test]
fn unterminated_string_at_newline() {
let toks = tokens("\"hello\nworld");
assert_eq!(
toks,
vec![
(QUOTE, "\""),
(STRING_TEXT, "hello"),
(NEWLINE, "\n"),
(IDENT, "world"),
]
);
}
#[test]
fn unterminated_string_at_crlf() {
let toks = tokens("\"hello\r\nworld");
assert_eq!(
toks,
vec![
(QUOTE, "\""),
(STRING_TEXT, "hello"),
(NEWLINE, "\r\n"),
(IDENT, "world"),
]
);
}
#[test]
fn closing_brace_outside_string() {
assert_eq!(kinds("}"), vec![R_BRACE]);
}
#[test]
fn glue_inside_string_mode() {
let toks = tokens("\"Yes, I considered it. <>\n");
assert_eq!(
toks,
vec![
(QUOTE, "\""),
(STRING_TEXT, "Yes, I considered it. "),
(GLUE, "<>"),
(NEWLINE, "\n"),
]
);
}
#[test]
fn glue_mid_string() {
let toks = tokens("\"Hello <>world\"");
assert_eq!(
toks,
vec![
(QUOTE, "\""),
(STRING_TEXT, "Hello "),
(GLUE, "<>"),
(STRING_TEXT, "world"),
(QUOTE, "\""),
]
);
}