1
1
mirror of https://github.com/casey/just.git synced 2024-11-28 22:00:18 +03:00
just/tests/string.rs

547 lines
8.3 KiB
Rust

use super::*;
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
——▶ justfile:1:6
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
——▶ justfile:6:11
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
——▶ justfile:3:13
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
——▶ justfile:5:10
5 │ echo {{b}}
│ ^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_raw_string,
justfile: "
a b= ':
",
args: ("a"),
stdout: "",
stderr: "
error: Unterminated string
——▶ justfile:1:6
1 │ a b= ':
│ ^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_string,
justfile: r#"
a b= ":
"#,
args: ("a"),
stdout: "",
stderr: r#"
error: Unterminated string
justfile:1:6
1 a b= ":
│ ^
"#,
status: EXIT_FAILURE,
}
test! {
name: unterminated_backtick,
justfile: "
foo a=\t`echo blaaaaaah:
echo {{a}}
",
stderr: r"
error: Unterminated backtick
——▶ justfile:1:8
1 │ foo a= `echo blaaaaaah:
│ ^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_raw_string,
justfile: "
a b= ''':
",
args: ("a"),
stdout: "",
stderr: "
error: Unterminated string
——▶ justfile:1:6
1 │ a b= ''':
│ ^^^
",
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_string,
justfile: r#"
a b= """:
"#,
args: ("a"),
stdout: "",
stderr: r#"
error: Unterminated string
justfile:1:6
1 a b= """:
│ ^^^
"#,
status: EXIT_FAILURE,
}
test! {
name: unterminated_indented_backtick,
justfile: "
foo a=\t```echo blaaaaaah:
echo {{a}}
",
stderr: r"
error: Unterminated backtick
——▶ justfile:1:8
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 `#!`
——▶ justfile:1:6
1 │ x := `#!/usr/bin/env sh`
│ ^^^^^^^^^^^^^^^^^^^
",
status: EXIT_FAILURE,
}
#[test]
fn valid_unicode_escape() {
Test::new()
.justfile(r#"x := "\u{1f916}\u{1F916}""#)
.args(["--evaluate", "x"])
.stdout("🤖🤖")
.run();
}
#[test]
fn unicode_escapes_with_all_hex_digits() {
Test::new()
.justfile(r#"x := "\u{012345}\u{6789a}\u{bcdef}\u{ABCDE}\u{F}""#)
.args(["--evaluate", "x"])
.stdout("\u{012345}\u{6789a}\u{bcdef}\u{ABCDE}\u{F}")
.run();
}
#[test]
fn maximum_valid_unicode_escape() {
Test::new()
.justfile(r#"x := "\u{10FFFF}""#)
.args(["--evaluate", "x"])
.stdout("\u{10FFFF}")
.run();
}
#[test]
fn unicode_escape_no_braces() {
Test::new()
.justfile("x := \"\\u1234\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: expected unicode escape sequence delimiter `{` but found `1`
——▶ justfile:1:6
1 │ x := "\u1234"
│ ^^^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_empty() {
Test::new()
.justfile("x := \"\\u{}\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: unicode escape sequences must not be empty
——▶ justfile:1:6
1 │ x := "\u{}"
│ ^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_requires_immediate_opening_brace() {
Test::new()
.justfile("x := \"\\u {1f916}\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: expected unicode escape sequence delimiter `{` but found ` `
——▶ justfile:1:6
1 │ x := "\u {1f916}"
│ ^^^^^^^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_non_hex() {
Test::new()
.justfile("x := \"\\u{foo}\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: expected hex digit [0-9A-Fa-f] but found `o`
——▶ justfile:1:6
1 │ x := "\u{foo}"
│ ^^^^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_invalid_character() {
Test::new()
.justfile("x := \"\\u{BadBad}\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: unicode escape sequence value `BadBad` greater than maximum valid code point `10FFFF`
——▶ justfile:1:6
1 │ x := "\u{BadBad}"
│ ^^^^^^^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_too_long() {
Test::new()
.justfile("x := \"\\u{FFFFFFFFFF}\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: unicode escape sequence starting with `\u{FFFFFFF` longer than six hex digits
——▶ justfile:1:6
1 │ x := "\u{FFFFFFFFFF}"
│ ^^^^^^^^^^^^^^^^
"#,
)
.run();
}
#[test]
fn unicode_escape_unterminated() {
Test::new()
.justfile("x := \"\\u{1f917\"")
.args(["--evaluate", "x"])
.status(1)
.stderr(
r#"
error: unterminated unicode escape sequence
——▶ justfile:1:6
1 │ x := "\u{1f917"
│ ^^^^^^^^^^
"#,
)
.run();
}