1
1
mirror of https://github.com/casey/just.git synced 2024-11-30 11:17:32 +03:00
just/tests/string.rs
Casey Rodarmor fec979c2c6
Reform and improve string literals (#793)
- Combine and simplify string and backtick lexing.
- Allow newlines in strings and backticks.
- Add triple-delimited indented strings and backticks. Common indented literal non-blank line leading whitespace is stripped.
- If a literal newline is escaped, it will be suppressed.
- Backticks starting with `#!` are reserved for a future upgrade.
2021-04-05 21:28:37 -07:00

383 lines
5.2 KiB
Rust

use crate::common::*;
test! {
name: raw_string,
justfile: r#"
export EXPORTED_VARIABLE := '\z'
recipe:
printf "$EXPORTED_VARIABLE"
"#,
stdout: "\\z",
stderr: "printf \"$EXPORTED_VARIABLE\"\n",
}
test! {
name: multiline_raw_string,
justfile: "
string := 'hello
whatever'
a:
echo '{{string}}'
",
args: ("a"),
stdout: "hello
whatever
",
stderr: "echo 'hello
whatever'
",
}
test! {
name: multiline_backtick,
justfile: "
string := `echo hello
echo goodbye
`
a:
echo '{{string}}'
",
args: ("a"),
stdout: "hello\ngoodbye\n",
stderr: "echo 'hello
goodbye'
",
}
test! {
name: multiline_cooked_string,
justfile: r#"
string := "hello
whatever"
a:
echo '{{string}}'
"#,
args: ("a"),
stdout: "hello
whatever
",
stderr: "echo 'hello
whatever'
",
}
test! {
name: cooked_string_suppress_newline,
justfile: r#"
a := """
foo\
bar
"""
@default:
printf %s '{{a}}'
"#,
stdout: "
foobar
",
}
test! {
name: invalid_escape_sequence,
justfile: r#"x := "\q"
a:"#,
args: ("a"),
stdout: "",
stderr: "error: `\\q` is not a valid escape sequence
|
1 | x := \"\\q\"
| ^^^^
",
status: EXIT_FAILURE,
}
test! {
name: error_line_after_multiline_raw_string,
justfile: "
string := 'hello
whatever' + 'yo'
a:
echo '{{foo}}'
",
args: ("a"),
stdout: "",
stderr: "error: Variable `foo` not defined
|
6 | echo '{{foo}}'
| ^^^
",
status: EXIT_FAILURE,
}
test! {
name: error_column_after_multiline_raw_string,
justfile: "
string := 'hello
whatever' + bar
a:
echo '{{string}}'
",
args: ("a"),
stdout: "",
stderr: "error: Variable `bar` not defined
|
3 | whatever' + bar
| ^^^
",
status: EXIT_FAILURE,
}
test! {
name: multiline_raw_string_in_interpolation,
justfile: r#"
a:
echo '{{"a" + '
' + "b"}}'
"#,
args: ("a"),
stdout: "
a
b
",
stderr: "
echo 'a
b'
",
}
test! {
name: error_line_after_multiline_raw_string_in_interpolation,
justfile: r#"
a:
echo '{{"a" + '
' + "b"}}'
echo {{b}}
"#,
args: ("a"),
stdout: "",
stderr: "error: Variable `b` not defined
|
5 | echo {{b}}
| ^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_raw_string,
justfile: "
a b= ':
",
args: ("a"),
stdout: "",
stderr: "
error: Unterminated string
|
1 | a b= ':
| ^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_string,
justfile: r#"
a b= ":
"#,
args: ("a"),
stdout: "",
stderr: r#"
error: Unterminated string
|
1 | a b= ":
| ^
"#,
status: EXIT_FAILURE,
}
test! {
name: unterminated_backtick,
justfile: "
foo a=\t`echo blaaaaaah:
echo {{a}}
",
stderr: r#"
error: Unterminated backtick
|
1 | foo a= `echo blaaaaaah:
| ^
"#,
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_raw_string,
justfile: "
a b= ''':
",
args: ("a"),
stdout: "",
stderr: "
error: Unterminated string
|
1 | a b= ''':
| ^^^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_string,
justfile: r#"
a b= """:
"#,
args: ("a"),
stdout: "",
stderr: r#"
error: Unterminated string
|
1 | a b= """:
| ^^^
"#,
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_backtick,
justfile: "
foo a=\t```echo blaaaaaah:
echo {{a}}
",
stderr: r#"
error: Unterminated backtick
|
1 | foo a= ```echo blaaaaaah:
| ^^^
"#,
status: EXIT_FAILURE,
}
test! {
name: indented_raw_string_contents_indentation_removed,
justfile: "
a := '''
foo
bar
'''
@default:
printf '{{a}}'
",
stdout: "
foo
bar
",
}
test! {
name: indented_cooked_string_contents_indentation_removed,
justfile: r#"
a := """
foo
bar
"""
@default:
printf '{{a}}'
"#,
stdout: "
foo
bar
",
}
test! {
name: indented_backtick_string_contents_indentation_removed,
justfile: r#"
a := ```
printf '
foo
bar
'
```
@default:
printf '{{a}}'
"#,
stdout: "\n\nfoo\nbar",
}
test! {
name: indented_raw_string_escapes,
justfile: r#"
a := '''
foo\n
bar
'''
@default:
printf %s '{{a}}'
"#,
stdout: r#"
foo\n
bar
"#,
}
test! {
name: indented_cooked_string_escapes,
justfile: r#"
a := """
foo\n
bar
"""
@default:
printf %s '{{a}}'
"#,
stdout: "
foo
bar
",
}
test! {
name: indented_backtick_string_escapes,
justfile: r#"
a := ```
printf %s '
foo\n
bar
'
```
@default:
printf %s '{{a}}'
"#,
stdout: "\n\nfoo\\n\nbar",
}
test! {
name: shebang_backtick,
justfile: "
x := `#!/usr/bin/env sh`
",
stderr: "
error: Backticks may not start with `#!`
|
1 | x := `#!/usr/bin/env sh`
| ^^^^^^^^^^^^^^^^^^^
",
status: EXIT_FAILURE,
}