use insta::assert_debug_snapshot; macro_rules! assert_lexes { ($input:literal) => { let lexer = rested::lexer::Lexer::new($input); insta::with_settings!({ description => $input }, { assert_debug_snapshot!(lexer.into_iter().collect::>()); }) } } #[test] fn lex_put_patch_delete() { assert_lexes!( r#" put /api {} patch /api {} delete /api {} "# ); } #[test] fn lex_string_literals() { assert_lexes!(r#""hello""#); assert_lexes!(r#""hello"#); assert_lexes!( r#" "hello "world "# ); assert_lexes!(r#" "" "" ``"#); assert_lexes!(r#" { "Bearer token" } "#); assert_lexes!( r#"` { stuff }` ` stuff"# ); } #[test] fn lex_bools() { assert_lexes!("true false"); } #[test] fn lex_numbers() { assert_lexes!("123124 1.0 23.8635"); } #[test] fn lex_get_url() { assert_lexes!("get http://localhost"); } #[test] fn lex_get_url_with_header() { assert_lexes!("get http://localhost { header \"Authorization\" \"Bearer token\" }"); } #[test] fn lex_get_url_over_many_lines() { assert_lexes!("get\nhttp://localhost"); assert_lexes!( r#"get http://localhost { }"# ); } #[test] fn lex_get_url_with_header_and_body() { assert_lexes!( r#" post http://localhost { header "Authorization" "Bearer token" body "{neet: 1337}" }"# ); } #[test] fn lex_call_expression() { assert_lexes!(r#"env() env("stuff")"#); assert_lexes!( r#" let a = env(") "# ); assert_lexes!( r#"get `http://localhost:8080/api?sort=${sort}&filter=${filter}` let a = read("testasdf.rd")"# ); } #[test] fn lex_template_literals() { assert_lexes!(r#"`stuff${"interpolated"}(things${env("dead_night")}` `dohickeys`"#); assert_lexes!(r#"`a${"temp"}` }}"#); assert_lexes!( r#" let b = `asdf ${}` "# ); assert_lexes!(r#"` ${} ${} `"#); assert_lexes!(r#"`head ${} ${} tail`"#); assert_lexes!( r#" let b = `asdf ${test} ${} ${"word"}` "# ); assert_lexes!( r#" let b = `asdf ${}` let c = {} "# ); assert_lexes!(r#"`${test} ${df} `"#); assert_lexes!(r#"`asdf ${test} ${df} `"#); assert_lexes!(r#"`asdf ${`hello${"world"}`} ${asdf} jkl`"#); assert_lexes!( r#" post /api { body `{"neet": ${env("love")}, 2: ${"two"}}` } post http://localhost { header "Authorization" "Bearer token" body `{"neet": 1337}` } "# ); assert_lexes!(r#"`string${env("base")}morestring${true}evenmore${"expr string"}`"#); assert_lexes!(r#"`asdf ${`hello${"world"}`} jkl`"#); } #[test] fn lex_json_object() { assert_lexes!( r#" let obj = { key: "value", otherKey: ["val", "vlue"] } "# ); assert_lexes!( r#" let o = { key: "value", post: { author: "Me" } }"# ); } #[test] fn lex_eof_position() { let src = "let varname = "; let mut lexer = Lexer::new(src); use rested::lexer::*; assert_eq!( lexer.next_token(), Token { kind: TokenKind::Let, text: "let", start: rested::lexer::locations::Position::default() } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Ident, text: "varname", start: locations::Position { line: 0, col: 4, value: 4 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Assign, text: "=", start: locations::Position { line: 0, col: 12, value: 12 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::End, text: "", start: locations::Position { line: 0, col: 13, value: 13 } } ); } #[test] fn lex_eof_position_with_newline() { let src = "let varname = \n"; let mut lexer = Lexer::new(src); use rested::lexer::*; assert_eq!( lexer.next_token(), Token { kind: TokenKind::Let, text: "let", start: rested::lexer::locations::Position::default() } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Ident, text: "varname", start: locations::Position { line: 0, col: 4, value: 4 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Assign, text: "=", start: locations::Position { line: 0, col: 12, value: 12 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::End, text: "", start: locations::Position { line: 1, col: 0, value: 14 } } ); } #[test] fn lex_eof_position_with_newlines() { let src = r#"let varname = "value" let "#; let mut lexer = Lexer::new(src); use rested::lexer::*; assert_eq!( lexer.next_token(), Token { kind: TokenKind::Let, text: "let", start: rested::lexer::locations::Position::default() } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Ident, text: "varname", start: locations::Position { line: 0, col: 4, value: 4 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Assign, text: "=", start: locations::Position { line: 0, col: 12, value: 12 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::StringLiteral, text: "\"value\"", start: locations::Position { line: 0, col: 14, value: 14 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::Let, text: "let", start: locations::Position { line: 1, col: 8, value: 30 } } ); assert_eq!( lexer.next_token(), Token { kind: TokenKind::End, text: "", start: locations::Position { line: 2, col: 0, value: 33 } } ); }