use crate::{Mode, ParseOptions, parse, parse_expression, parse_module}; #[test] fn test_modes() { let source = "a[0][1][2][3][4]"; assert!(parse(source, ParseOptions::from(Mode::Expression)).is_ok()); assert!(parse(source, ParseOptions::from(Mode::Module)).is_ok()); } #[test] fn test_expr_mode_invalid_syntax1() { let source = "first second"; let error = parse_expression(source).unwrap_err(); insta::assert_debug_snapshot!(error); } #[test] fn test_expr_mode_invalid_syntax2() { let source = r"first second "; let error = parse_expression(source).unwrap_err(); insta::assert_debug_snapshot!(error); } #[test] fn test_expr_mode_invalid_syntax3() { let source = r"first second third "; let error = parse_expression(source).unwrap_err(); insta::assert_debug_snapshot!(error); } #[test] fn test_expr_mode_valid_syntax() { let source = "first "; let parsed = parse_expression(source).unwrap(); insta::assert_debug_snapshot!(parsed.expr()); } #[test] fn test_unicode_aliases() { // https://github.com/RustPython/RustPython/issues/4566 let source = r#"x = "\N{BACKSPACE}another cool trick""#; let suite = parse_module(source).unwrap().into_suite(); insta::assert_debug_snapshot!(suite); } #[test] fn test_ipython_escape_commands() { let parsed = parse( r" # Normal Python code ( a % b ) # Dynamic object info ??a.foo ?a.foo ?a.foo? ??a.foo()?? # Line magic %timeit a = b %timeit foo(b) % 3 %alias showPath pwd && ls -a %timeit a =\ foo(b); b = 2 %matplotlib --inline %matplotlib \ --inline # System shell access !pwd && ls -a | sed 's/^/\ /' !pwd \ && ls -a | sed 's/^/\\ /' !!cd /Users/foo/Library/Application\ Support/ # Let's add some Python code to make sure that earlier escapes were handled # correctly and that we didn't consume any of the following code as a result # of the escapes. def foo(): return ( a != b ) # Transforms into `foo(..)` /foo 1 2 ;foo 1 2 ,foo 1 2 # Indented escape commands for a in range(5): !ls p1 = !pwd p2: str = !pwd foo = %foo \ bar % foo foo = %foo # comment # Help end line magics foo? foo.bar?? foo.bar.baz? foo[0]?? foo[0][1]? foo.bar[0].baz[1]?? foo.bar[0].baz[2].egg?? " .trim(), ParseOptions::from(Mode::Ipython), ) .unwrap(); insta::assert_debug_snapshot!(parsed.syntax()); } #[test] fn test_fstring_expr_inner_line_continuation_and_t_string() { let source = r#"f'{\t"i}'"#; let parsed = parse_expression(source); let error = parsed.unwrap_err(); insta::assert_debug_snapshot!(error); } #[test] fn test_fstring_expr_inner_line_continuation_newline_t_string() { let source = r#"f'{\ t"i}'"#; let parsed = parse_expression(source); let error = parsed.unwrap_err(); insta::assert_debug_snapshot!(error); }