// Copyright 2022 The Jujutsu Authors//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// https://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License. use crate::common::TestEnvironment; #[test]fn test_syntax_error() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", ":x"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `:` is not a prefix operator Caused by: --> 1:1 | 1 | :x | ^ | = `:` is not a prefix operator Hint: Did you mean `::` for ancestors? [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "x &"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:4 | 1 | x & | ^--- | = expected `::`, `..`, `~`, or <primary> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "x - y"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `-` is not an infix operator Caused by: --> 1:3 | 1 | x - y | ^ | = `-` is not an infix operator Hint: Did you mean `~` for difference? [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "HEAD^"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `^` is not a postfix operator Caused by: --> 1:5 | 1 | HEAD^ | ^ | = `^` is not a postfix operator Hint: Did you mean `-` for parents? [EOF] [exit status: 1] ");} #[test]fn test_bad_function_call() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", "all(or::nothing)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `all`: Expected 0 arguments Caused by: --> 1:5 | 1 | all(or::nothing) | ^---------^ | = Function `all`: Expected 0 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "parents()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments Caused by: --> 1:9 | 1 | parents() | ^ | = Function `parents`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "parents(foo, bar, baz)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments Caused by: --> 1:9 | 1 | parents(foo, bar, baz) | ^-----------^ | = Function `parents`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "heads(foo, bar)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `heads`: Expected 1 arguments Caused by: --> 1:7 | 1 | heads(foo, bar) | ^------^ | = Function `heads`: Expected 1 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "latest(a, not_an_integer)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Expected integer Caused by: --> 1:11 | 1 | latest(a, not_an_integer) | ^------------^ | = Expected integer [EOF] [exit status: 1] "); // "N to M arguments" let output = work_dir.run_jj(["log", "-r", "ancestors()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `ancestors`: Expected 1 to 2 arguments Caused by: --> 1:11 | 1 | ancestors() | ^ | = Function `ancestors`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "change_id(glob:a)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Expected change ID prefix Caused by: --> 1:11 | 1 | change_id(glob:a) | ^----^ | = Expected change ID prefix [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "commit_id(xyzzy)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid commit ID prefix Caused by: --> 1:11 | 1 | commit_id(xyzzy) | ^---^ | = Invalid commit ID prefix [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "files(not::a-fileset)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files(not::a-fileset) | ^------------^ | = In fileset expression 2: --> 1:5 | 1 | not::a-fileset | ^--- | = expected <identifier>, <string_literal>, or <raw_string_literal> Hint: See https://jj-vcs.github.io/jj/latest/filesets/ or use `jj help -k filesets` for filesets syntax and how to match file paths. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", r#"files(foo:"bar")"#]); insta::assert_snapshot!(output, @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files(foo:"bar") | ^-------^ | = In fileset expression 2: --> 1:1 | 1 | foo:"bar" | ^-------^ | = Invalid file pattern 3: Invalid file pattern kind `foo:` Hint: See https://jj-vcs.github.io/jj/latest/filesets/#file-patterns or `jj help -k filesets` for valid prefixes. [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", r#"files("../out")"#]); insta::assert_snapshot!(output.normalize_backslash(), @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files("../out") | ^------^ | = In fileset expression 2: --> 1:1 | 1 | "../out" | ^------^ | = Invalid file pattern 3: Path "../out" is not in the repo "." 4: Invalid component ".." in repo-relative path "../out" [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", "bookmarks(bad:pattern)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:11 | 1 | bookmarks(bad:pattern) | ^---------^ | = Invalid string pattern 2: Invalid string pattern kind `bad:` Hint: Try prefixing with one of `exact:`, `glob:`, `regex:`, `substring:`, or one of these with `-i` suffix added (e.g. `glob-i:`) for case-insensitive matching [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "bookmarks(regex:'(')"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:11 | 1 | bookmarks(regex:'(') | ^-------^ | = Invalid string pattern 2: regex parse error: ( ^ error: unclosed group [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "root()::whatever()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `whatever` doesn't exist Caused by: --> 1:9 | 1 | root()::whatever() | ^------^ | = Function `whatever` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(a, b, remote=c)"]); insta::assert_snapshot!(output, @r#" ------- stderr ------- Error: Failed to parse revset: Function `remote_bookmarks`: Got multiple values for keyword "remote" Caused by: --> 1:24 | 1 | remote_bookmarks(a, b, remote=c) | ^------^ | = Function `remote_bookmarks`: Got multiple values for keyword "remote" [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=a, b)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `remote_bookmarks`: Positional argument follows keyword argument Caused by: --> 1:28 | 1 | remote_bookmarks(remote=a, b) | ^ | = Function `remote_bookmarks`: Positional argument follows keyword argument [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(=foo)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:18 | 1 | remote_bookmarks(=foo) | ^--- | = expected <strict_identifier> or <expression> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:25 | 1 | remote_bookmarks(remote=) | ^--- | = expected <expression> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] ");} #[test]fn test_function_name_hint() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let evaluate = |expr| work_dir.run_jj(["log", "-r", expr]); test_env.add_config( r###" [revset-aliases] 'bookmarks(x)' = 'x' # override builtin function 'my_author(x)' = 'author(x)' # similar name to builtin function 'author_sym' = 'x' # not a function alias 'my_bookmarks' = 'bookmark()' # typo in alias "###, ); // The suggestion "bookmarks" shouldn't be duplicated insta::assert_snapshot!(evaluate("bookmark()"), @r" ------- stderr ------- Error: Failed to parse revset: Function `bookmark` doesn't exist Caused by: --> 1:1 | 1 | bookmark() | ^------^ | = Function `bookmark` doesn't exist Hint: Did you mean `bookmarks`, `remote_bookmarks`? [EOF] [exit status: 1] "); // Both builtin function and function alias should be suggested insta::assert_snapshot!(evaluate("author_()"), @r" ------- stderr ------- Error: Failed to parse revset: Function `author_` doesn't exist Caused by: --> 1:1 | 1 | author_() | ^-----^ | = Function `author_` doesn't exist Hint: Did you mean `author`, `author_date`, `author_email`, `author_name`, `my_author`? [EOF] [exit status: 1] "); insta::assert_snapshot!(evaluate("my_bookmarks"), @r" ------- stderr ------- Error: Failed to parse revset: In alias `my_bookmarks` Caused by: 1: --> 1:1 | 1 | my_bookmarks | ^----------^ | = In alias `my_bookmarks` 2: --> 1:1 | 1 | bookmark() | ^------^ | = Function `bookmark` doesn't exist Hint: Did you mean `bookmarks`, `remote_bookmarks`? [EOF] [exit status: 1] ");} #[test]fn test_bad_symbol_or_argument_should_not_be_optimized_out() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", "unknown & none()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Revision `unknown` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "all() | unknown"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Revision `unknown` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "description(regex:'(') & none()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:13 | 1 | description(regex:'(') & none() | ^-------^ | = Invalid string pattern 2: regex parse error: ( ^ error: unclosed group [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "files('..') & none()"]); insta::assert_snapshot!(output.normalize_backslash(), @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files('..') & none() | ^--^ | = In fileset expressionLines 1–500 of 1017. Load more
// Copyright 2022 The Jujutsu Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use crate::common::TestEnvironment; #[test] fn test_syntax_error() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", ":x"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `:` is not a prefix operator Caused by: --> 1:1 | 1 | :x | ^ | = `:` is not a prefix operator Hint: Did you mean `::` for ancestors? [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "x &"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:4 | 1 | x & | ^--- | = expected `::`, `..`, `~`, or <primary> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "x - y"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `-` is not an infix operator Caused by: --> 1:3 | 1 | x - y | ^ | = `-` is not an infix operator Hint: Did you mean `~` for difference? [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "HEAD^"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: `^` is not a postfix operator Caused by: --> 1:5 | 1 | HEAD^ | ^ | = `^` is not a postfix operator Hint: Did you mean `-` for parents? [EOF] [exit status: 1] "); } #[test] fn test_bad_function_call() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", "all(or::nothing)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `all`: Expected 0 arguments Caused by: --> 1:5 | 1 | all(or::nothing) | ^---------^ | = Function `all`: Expected 0 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "parents()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments Caused by: --> 1:9 | 1 | parents() | ^ | = Function `parents`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "parents(foo, bar, baz)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments Caused by: --> 1:9 | 1 | parents(foo, bar, baz) | ^-----------^ | = Function `parents`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "heads(foo, bar)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `heads`: Expected 1 arguments Caused by: --> 1:7 | 1 | heads(foo, bar) | ^------^ | = Function `heads`: Expected 1 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "latest(a, not_an_integer)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Expected integer Caused by: --> 1:11 | 1 | latest(a, not_an_integer) | ^------------^ | = Expected integer [EOF] [exit status: 1] "); // "N to M arguments" let output = work_dir.run_jj(["log", "-r", "ancestors()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `ancestors`: Expected 1 to 2 arguments Caused by: --> 1:11 | 1 | ancestors() | ^ | = Function `ancestors`: Expected 1 to 2 arguments [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "change_id(glob:a)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Expected change ID prefix Caused by: --> 1:11 | 1 | change_id(glob:a) | ^----^ | = Expected change ID prefix [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "commit_id(xyzzy)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid commit ID prefix Caused by: --> 1:11 | 1 | commit_id(xyzzy) | ^---^ | = Invalid commit ID prefix [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "files(not::a-fileset)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files(not::a-fileset) | ^------------^ | = In fileset expression 2: --> 1:5 | 1 | not::a-fileset | ^--- | = expected <identifier>, <string_literal>, or <raw_string_literal> Hint: See https://jj-vcs.github.io/jj/latest/filesets/ or use `jj help -k filesets` for filesets syntax and how to match file paths. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", r#"files(foo:"bar")"#]); insta::assert_snapshot!(output, @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files(foo:"bar") | ^-------^ | = In fileset expression 2: --> 1:1 | 1 | foo:"bar" | ^-------^ | = Invalid file pattern 3: Invalid file pattern kind `foo:` Hint: See https://jj-vcs.github.io/jj/latest/filesets/#file-patterns or `jj help -k filesets` for valid prefixes. [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", r#"files("../out")"#]); insta::assert_snapshot!(output.normalize_backslash(), @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files("../out") | ^------^ | = In fileset expression 2: --> 1:1 | 1 | "../out" | ^------^ | = Invalid file pattern 3: Path "../out" is not in the repo "." 4: Invalid component ".." in repo-relative path "../out" [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", "bookmarks(bad:pattern)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:11 | 1 | bookmarks(bad:pattern) | ^---------^ | = Invalid string pattern 2: Invalid string pattern kind `bad:` Hint: Try prefixing with one of `exact:`, `glob:`, `regex:`, `substring:`, or one of these with `-i` suffix added (e.g. `glob-i:`) for case-insensitive matching [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "bookmarks(regex:'(')"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:11 | 1 | bookmarks(regex:'(') | ^-------^ | = Invalid string pattern 2: regex parse error: ( ^ error: unclosed group [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "root()::whatever()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `whatever` doesn't exist Caused by: --> 1:9 | 1 | root()::whatever() | ^------^ | = Function `whatever` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(a, b, remote=c)"]); insta::assert_snapshot!(output, @r#" ------- stderr ------- Error: Failed to parse revset: Function `remote_bookmarks`: Got multiple values for keyword "remote" Caused by: --> 1:24 | 1 | remote_bookmarks(a, b, remote=c) | ^------^ | = Function `remote_bookmarks`: Got multiple values for keyword "remote" [EOF] [exit status: 1] "#); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=a, b)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Function `remote_bookmarks`: Positional argument follows keyword argument Caused by: --> 1:28 | 1 | remote_bookmarks(remote=a, b) | ^ | = Function `remote_bookmarks`: Positional argument follows keyword argument [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(=foo)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:18 | 1 | remote_bookmarks(=foo) | ^--- | = expected <strict_identifier> or <expression> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=)"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Syntax error Caused by: --> 1:25 | 1 | remote_bookmarks(remote=) | ^--- | = expected <expression> Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols. [EOF] [exit status: 1] "); } #[test] fn test_function_name_hint() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let evaluate = |expr| work_dir.run_jj(["log", "-r", expr]); test_env.add_config( r###" [revset-aliases] 'bookmarks(x)' = 'x' # override builtin function 'my_author(x)' = 'author(x)' # similar name to builtin function 'author_sym' = 'x' # not a function alias 'my_bookmarks' = 'bookmark()' # typo in alias "###, ); // The suggestion "bookmarks" shouldn't be duplicated insta::assert_snapshot!(evaluate("bookmark()"), @r" ------- stderr ------- Error: Failed to parse revset: Function `bookmark` doesn't exist Caused by: --> 1:1 | 1 | bookmark() | ^------^ | = Function `bookmark` doesn't exist Hint: Did you mean `bookmarks`, `remote_bookmarks`? [EOF] [exit status: 1] "); // Both builtin function and function alias should be suggested insta::assert_snapshot!(evaluate("author_()"), @r" ------- stderr ------- Error: Failed to parse revset: Function `author_` doesn't exist Caused by: --> 1:1 | 1 | author_() | ^-----^ | = Function `author_` doesn't exist Hint: Did you mean `author`, `author_date`, `author_email`, `author_name`, `my_author`? [EOF] [exit status: 1] "); insta::assert_snapshot!(evaluate("my_bookmarks"), @r" ------- stderr ------- Error: Failed to parse revset: In alias `my_bookmarks` Caused by: 1: --> 1:1 | 1 | my_bookmarks | ^----------^ | = In alias `my_bookmarks` 2: --> 1:1 | 1 | bookmark() | ^------^ | = Function `bookmark` doesn't exist Hint: Did you mean `bookmarks`, `remote_bookmarks`? [EOF] [exit status: 1] "); } #[test] fn test_bad_symbol_or_argument_should_not_be_optimized_out() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["log", "-r", "unknown & none()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Revision `unknown` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "all() | unknown"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Revision `unknown` doesn't exist [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "description(regex:'(') & none()"]); insta::assert_snapshot!(output, @r" ------- stderr ------- Error: Failed to parse revset: Invalid string pattern Caused by: 1: --> 1:13 | 1 | description(regex:'(') & none() | ^-------^ | = Invalid string pattern 2: regex parse error: ( ^ error: unclosed group [EOF] [exit status: 1] "); let output = work_dir.run_jj(["log", "-r", "files('..') & none()"]); insta::assert_snapshot!(output.normalize_backslash(), @r#" ------- stderr ------- Error: Failed to parse revset: In fileset expression Caused by: 1: --> 1:7 | 1 | files('..') & none() | ^--^ | = In fileset expression