luau-syntax 0.732.0

Luau lexer, parser, AST, CST, and source utilities
Documentation
use super::*;

// Parser.test.cpp: parse_interpolated_string_double_brace_begin
#[test]
fn parse_interpolated_string_double_brace_begin() {
    parse_errors(
        r#"
            _ = `{{oops}}`
        "#,
    )
    .assert_first_message(
        "Double braces are not permitted within interpolated strings; did you mean '\\{'?",
    );
}

// Parser.test.cpp: parse_interpolated_string_double_brace_mid
#[test]
fn parse_interpolated_string_double_brace_mid() {
    parse_errors(
        r#"
            _ = `{nice} {{oops}}`
        "#,
    )
    .assert_first_message(
        "Double braces are not permitted within interpolated strings; did you mean '\\{'?",
    );
}

// Parser.test.cpp: parse_interpolated_string_without_end_brace
#[test]
fn parse_interpolated_string_without_end_brace() {
    for (source, column) in [(r#"_ = `{a`"#, 7), (r#"_ = `{abcdefg`"#, 13)] {
        let errors = parse_errors(source);
        assert_eq!(errors.len(), 1, "{source}");
        assert_eq!(
            errors[0].message, "Malformed interpolated string; did you forget to add a '}'?",
            "{source}"
        );
        assert_eq!(errors[0].location.begin.column, column, "{source}");
    }

    assert_eq!(
        parse_errors(r#"_ =       `{a`"#)[0].location.begin.column,
        parse_errors(r#"_ = `{abcdefg`"#)[0].location.begin.column
    );
}

// Parser.test.cpp: parse_interpolated_string_without_end_brace_in_table
#[test]
fn parse_interpolated_string_without_end_brace_in_table() {
    let errors = parse_errors(
        r#"
            _ = { `{a` }
        "#,
    );

    assert_eq!(errors.len(), 2);
    assert_eq!(
        errors[0].message,
        "Malformed interpolated string; did you forget to add a '}'?"
    );
    assert_eq!(
        errors[1].message,
        "Expected '}' (to close '{' at line 2), got <eof>"
    );
}

// Parser.test.cpp: parse_interpolated_string_mid_without_end_brace_in_table
#[test]
fn parse_interpolated_string_mid_without_end_brace_in_table() {
    let errors = parse_errors(
        r#"
            _ = { `x {"y"} {z` }
        "#,
    );

    assert_eq!(errors.len(), 2);
    assert_eq!(
        errors[0].message,
        "Malformed interpolated string; did you forget to add a '}'?"
    );
    assert_eq!(
        errors[1].message,
        "Expected '}' (to close '{' at line 2), got <eof>"
    );
}

// Parser.test.cpp: parse_interpolated_string_without_expression
#[test]
fn parse_interpolated_string_without_expression() {
    for source in [r#"print(`{}`)"#, r#"print(`{}{1}`)"#] {
        parse_errors(source)
            .assert_first_message("Malformed interpolated string, expected expression inside '{}'");
    }
}

// Parser.test.cpp: parse_interpolated_string_call_without_parens
#[test]
fn parse_interpolated_string_call_without_parens() {
    parse_errors(
        r#"
            _ = print `{42}`
        "#,
    )
    .assert_first_message("Expected identifier when parsing expression, got `{");
}

// Parser.test.cpp: parse_interpolated_string_weird_token
#[test]
fn parse_interpolated_string_weird_token() {
    parse_errors(
        r#"
            local a = `??? {42 !!}`
        "#,
    )
    .assert_first_message("Malformed interpolated string, got '!'");
}

// Parser.test.cpp: parse_interpolated_string_malformed_escape
#[test]
fn parse_interpolated_string_malformed_escape() {
    parse_errors(
        r#"
            local a = `???\xQQ {1}`
        "#,
    )
    .assert_first_message("Interpolated string literal contains malformed escape sequence");
}

// Parser.test.cpp: parse_interpolated_string_as_type_fail
#[test]
fn parse_interpolated_string_as_type_fail() {
    with_parse(
        r#"
            local a: `what` = `???`
            local b: `what {"the"}` = `???`
            local c: `what {"the"} heck` = `???`
        "#,
        ParseOptions::default(),
        |result| {
            let result = result.unwrap();
            let errors = result.metadata.errors;

            assert_eq!(errors.len(), 3);
            for error in errors {
                assert_eq!(
                    error.message,
                    "Interpolated string literals cannot be used as types"
                );
            }
        },
    );
}