use expect_test::expect; use crate::TopEntryPoint; #[test] fn source_file() { check( TopEntryPoint::SourceFile, "", expect![[r#" SOURCE_FILE "#]], ); check( TopEntryPoint::SourceFile, "struct S;", expect![[r#" SOURCE_FILE STRUCT STRUCT_KW "struct" WHITESPACE " " NAME IDENT "S" SEMICOLON ";" "#]], ); check( TopEntryPoint::SourceFile, "@error@", expect![[r#" SOURCE_FILE ERROR AT "@" MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "error" ERROR AT "@" error 0: expected an item error 6: expected BANG error 6: expected `{`, `[`, `(` error 6: expected SEMICOLON error 6: expected an item "#]], ); } #[test] fn macro_stmt() { check( TopEntryPoint::MacroStmts, "", expect![[r#" MACRO_STMTS "#]], ); check( TopEntryPoint::MacroStmts, "#!/usr/bin/rust", expect![[r##" MACRO_STMTS ERROR SHEBANG "#!/usr/bin/rust" error 0: expected expression, item or let statement "##]], ); check( TopEntryPoint::MacroStmts, "let x = 1 2 struct S;", expect![[r#" MACRO_STMTS LET_STMT LET_KW "let" WHITESPACE " " IDENT_PAT NAME IDENT "x" WHITESPACE " " EQ "=" WHITESPACE " " LITERAL INT_NUMBER "1" WHITESPACE " " EXPR_STMT LITERAL INT_NUMBER "2" WHITESPACE " " STRUCT STRUCT_KW "struct" WHITESPACE " " NAME IDENT "S" SEMICOLON ";" "#]], ); } #[test] fn macro_items() { check( TopEntryPoint::MacroItems, "", expect![[r#" MACRO_ITEMS "#]], ); check( TopEntryPoint::MacroItems, "#!/usr/bin/rust", expect![[r##" MACRO_ITEMS ERROR SHEBANG "#!/usr/bin/rust" error 0: expected an item "##]], ); check( TopEntryPoint::MacroItems, "struct S; foo!{}", expect![[r#" MACRO_ITEMS STRUCT STRUCT_KW "struct" WHITESPACE " " NAME IDENT "S" SEMICOLON ";" WHITESPACE " " MACRO_CALL PATH PATH_SEGMENT NAME_REF IDENT "foo" BANG "!" TOKEN_TREE L_CURLY "{" R_CURLY "}" "#]], ); } #[test] fn macro_pattern() { check( TopEntryPoint::Pattern, "", expect![[r#" ERROR error 0: expected pattern "#]], ); check( TopEntryPoint::Pattern, "Some(_)", expect![[r#" TUPLE_STRUCT_PAT PATH PATH_SEGMENT NAME_REF IDENT "Some" L_PAREN "(" WILDCARD_PAT UNDERSCORE "_" R_PAREN ")" "#]], ); check( TopEntryPoint::Pattern, "None leftover tokens", expect![[r#" ERROR IDENT_PAT NAME IDENT "None" WHITESPACE " " IDENT "leftover" WHITESPACE " " IDENT "tokens" "#]], ); check( TopEntryPoint::Pattern, "@err", expect![[r#" ERROR ERROR AT "@" IDENT "err" error 0: expected pattern "#]], ); } #[test] fn type_() { check( TopEntryPoint::Type, "", expect![[r#" ERROR error 0: expected type "#]], ); check( TopEntryPoint::Type, "Option", expect![[r#" PATH_TYPE PATH PATH_SEGMENT NAME_REF IDENT "Option" GENERIC_ARG_LIST L_ANGLE "<" TYPE_ARG NEVER_TYPE BANG "!" R_ANGLE ">" "#]], ); check( TopEntryPoint::Type, "() () ()", expect![[r#" ERROR TUPLE_TYPE L_PAREN "(" R_PAREN ")" WHITESPACE " " L_PAREN "(" R_PAREN ")" WHITESPACE " " L_PAREN "(" R_PAREN ")" "#]], ); check( TopEntryPoint::Type, "$$$", expect![[r#" ERROR ERROR DOLLAR "$" DOLLAR "$" DOLLAR "$" error 0: expected type "#]], ); } #[test] fn expr() { check( TopEntryPoint::Expr, "", expect![[r#" ERROR error 0: expected expression "#]], ); check( TopEntryPoint::Expr, "2 + 2 == 5", expect![[r#" BIN_EXPR BIN_EXPR LITERAL INT_NUMBER "2" WHITESPACE " " PLUS "+" WHITESPACE " " LITERAL INT_NUMBER "2" WHITESPACE " " EQ2 "==" WHITESPACE " " LITERAL INT_NUMBER "5" "#]], ); check( TopEntryPoint::Expr, "let _ = 0;", expect![[r#" ERROR LET_EXPR LET_KW "let" WHITESPACE " " WILDCARD_PAT UNDERSCORE "_" WHITESPACE " " EQ "=" WHITESPACE " " LITERAL INT_NUMBER "0" SEMICOLON ";" "#]], ); } #[track_caller] fn check(entry: TopEntryPoint, input: &str, expect: expect_test::Expect) { let (parsed, _errors) = super::parse(entry, input); expect.assert_eq(&parsed) }