diff --git a/Cargo.lock b/Cargo.lock index 29f115e4..a36b6e68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -677,6 +677,7 @@ name = "emmylua_parser_desc" version = "0.13.0" dependencies = [ "emmylua_parser", + "googletest", "rowan", "unicode-general-category", ] diff --git a/crates/emmylua_parser_desc/Cargo.toml b/crates/emmylua_parser_desc/Cargo.toml index 8bf00256..1d9725cb 100644 --- a/crates/emmylua_parser_desc/Cargo.toml +++ b/crates/emmylua_parser_desc/Cargo.toml @@ -16,4 +16,7 @@ emmylua_parser.workspace = true # external rowan.workspace = true -unicode-general-category.workspace = true \ No newline at end of file +unicode-general-category.workspace = true + +[dev-dependencies] +googletest.workspace = true diff --git a/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs b/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs index 949af725..057e6077 100644 --- a/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs @@ -198,8 +198,9 @@ impl<'a> JsonLexer<'a> { mod tests { use super::*; use emmylua_parser::Reader; + use googletest::prelude::*; - #[test] + #[gtest] fn test_json_lexer_basic() { let json = r#" { @@ -235,11 +236,11 @@ mod tests { } } - assert!(string_count > 0, "Should find strings"); - assert!(number_count > 0, "Should find numbers"); - assert!(keyword_count > 0, "Should find keywords"); - assert!(brace_count > 0, "Should find braces"); - assert!(bracket_count > 0, "Should find brackets"); + expect_gt!(string_count, 0, "Should find strings"); + expect_gt!(number_count, 0, "Should find numbers"); + expect_gt!(keyword_count, 0, "Should find keywords"); + expect_gt!(brace_count, 0, "Should find braces"); + expect_gt!(bracket_count, 0, "Should find brackets"); println!( "Found {} strings, {} numbers, {} keywords, {} braces, {} brackets", @@ -247,7 +248,7 @@ mod tests { ); } - #[test] + #[gtest] fn test_json_lexer_keywords() { let json = "true false null"; @@ -260,10 +261,10 @@ mod tests { .filter(|t| t.kind == JsonTokenKind::TkKeyword) .collect(); - assert_eq!(keywords.len(), 3, "Should find exactly 3 keywords"); + expect_eq!(keywords.len(), 3, "Should find exactly 3 keywords"); } - #[test] + #[gtest] fn test_json_lexer_numbers() { let json = "42 -17 3.14 -2.5 1e10 1E-5 -1.23e+4"; @@ -276,10 +277,10 @@ mod tests { .filter(|t| t.kind == JsonTokenKind::TkNumber) .collect(); - assert_eq!(numbers.len(), 7, "Should find exactly 7 numbers"); + expect_eq!(numbers.len(), 7, "Should find exactly 7 numbers"); } - #[test] + #[gtest] fn test_json_lexer_strings() { let json = r#""hello" "world with spaces" "escaped\"quote" "unicode\u0041""#; @@ -292,10 +293,10 @@ mod tests { .filter(|t| t.kind == JsonTokenKind::TkString) .collect(); - assert_eq!(strings.len(), 4, "Should find exactly 4 strings"); + expect_eq!(strings.len(), 4, "Should find exactly 4 strings"); } - #[test] + #[gtest] fn test_json_lexer_structure() { let json = r#"{"key": ["value1", "value2"]}"#; @@ -315,11 +316,11 @@ mod tests { let has_colon = tokens.iter().any(|t| t.kind == JsonTokenKind::TkColon); let has_comma = tokens.iter().any(|t| t.kind == JsonTokenKind::TkComma); - assert!(has_left_brace, "Should have left brace"); - assert!(has_right_brace, "Should have right brace"); - assert!(has_left_bracket, "Should have left bracket"); - assert!(has_right_bracket, "Should have right bracket"); - assert!(has_colon, "Should have colon"); - assert!(has_comma, "Should have comma"); + expect_true!(has_left_brace, "Should have left brace"); + expect_true!(has_right_brace, "Should have right brace"); + expect_true!(has_left_bracket, "Should have left bracket"); + expect_true!(has_right_bracket, "Should have right bracket"); + expect_true!(has_colon, "Should have colon"); + expect_true!(has_comma, "Should have comma"); } } diff --git a/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs b/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs index 327f0ca8..8421cfb8 100644 --- a/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs @@ -448,8 +448,9 @@ impl<'a> VimscriptLexer<'a> { mod tests { use super::*; use emmylua_parser::Reader; + use googletest::prelude::*; - #[test] + #[gtest] fn test_vim_lexer_basic() { let code = r#" " This is a comment @@ -483,10 +484,10 @@ endfunction } } - assert!(keyword_count > 0, "Should find keywords"); - assert!(string_count > 0, "Should find strings"); - assert!(comment_count > 0, "Should find comments"); - assert!(number_count > 0, "Should find numbers"); + expect_gt!(keyword_count, 0, "Should find keywords"); + expect_gt!(string_count, 0, "Should find strings"); + expect_gt!(comment_count, 0, "Should find comments"); + expect_gt!(number_count, 0, "Should find numbers"); println!( "Found {} keywords, {} strings, {} comments, {} numbers", @@ -494,7 +495,7 @@ endfunction ); } - #[test] + #[gtest] fn test_vim_lexer_keywords() { let code = "function! if else endif let echo return"; @@ -507,6 +508,6 @@ endfunction .filter(|t| t.kind == VimTokenKind::TkKeyword) .collect(); - assert!(keywords.len() >= 5, "Should find multiple keywords"); + expect_ge!(keywords.len(), 5, "Should find multiple keywords"); } } diff --git a/crates/emmylua_parser_desc/src/md.rs b/crates/emmylua_parser_desc/src/md.rs index 60650491..2b454e82 100644 --- a/crates/emmylua_parser_desc/src/md.rs +++ b/crates/emmylua_parser_desc/src/md.rs @@ -1465,9 +1465,10 @@ mod tests { use super::*; #[allow(unused)] use crate::testlib::{print_result, test}; + use googletest::prelude::*; - #[test] - fn test_md() { + #[gtest] + fn test_md() -> Result<()> { let code = r#" --- # Inline code --- @@ -1720,11 +1721,12 @@ mod tests { "#; // print_result(&code, Box::new(MdParser::new(None))); - test(&code, Box::new(MdParser::new(None)), &expected); + test(&code, Box::new(MdParser::new(None)), &expected).or_fail()?; + Ok(()) } - #[test] - fn test_myst() { + #[gtest] + fn test_myst() -> Result<()> { let code = r#" --- # Inline --- @@ -1823,11 +1825,12 @@ mod tests { --- $$ (anchor) "#; - test(&code, Box::new(MdParser::new_myst(None, None)), &expected); + test(&code, Box::new(MdParser::new_myst(None, None)), &expected).or_fail()?; + Ok(()) } - #[test] - fn test_myst_primary_domain() { + #[gtest] + fn test_myst_primary_domain() -> Result<()> { let code = r#"--- See {obj}`ref`"#; let expected = r#" @@ -1838,28 +1841,33 @@ mod tests { &code, Box::new(MdParser::new_myst(Some("lua".to_string()), None)), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_myst_search_at_offset() { + #[gtest] + fn test_myst_search_at_offset() -> Result<()> { let code = r#"--- See {lua:obj}`x` {lua:obj}`ref`"#; let expected = r#"--- See {lua:obj}`x` {lua:obj}`ref`"#; test( &code, Box::new(MdParser::new_myst(None, Some(31))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(MdParser::new_myst(None, Some(32))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(MdParser::new_myst(None, Some(34))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See {lua:obj}`x` {lua:obj}`"#; let expected = r#"--- See {lua:obj}`x` {lua:obj}`"#; @@ -1867,7 +1875,8 @@ mod tests { &code, Box::new(MdParser::new_myst(None, Some(31))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See {lua:obj}`x` {lua:obj}``..."#; let expected = r#"--- See {lua:obj}`x` {lua:obj}``..."#; @@ -1875,11 +1884,13 @@ mod tests { &code, Box::new(MdParser::new_myst(None, Some(31))), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_md_no_indent() { + #[gtest] + fn test_md_no_indent() -> Result<()> { let code = r#" ---```lua --- @@ -1906,6 +1917,7 @@ local t = 123 local t = 123 "#; - test(&code, Box::new(MdParser::new(None)), &expected); + test(&code, Box::new(MdParser::new(None)), &expected).or_fail()?; + Ok(()) } } diff --git a/crates/emmylua_parser_desc/src/ref_target.rs b/crates/emmylua_parser_desc/src/ref_target.rs index 7d9ab290..09479cfa 100644 --- a/crates/emmylua_parser_desc/src/ref_target.rs +++ b/crates/emmylua_parser_desc/src/ref_target.rs @@ -203,11 +203,12 @@ fn eat_string(reader: &mut Reader) -> bool { #[cfg(test)] mod tests { use super::*; + use googletest::prelude::*; - #[test] + #[gtest] fn test_parse_ref_target_simple() { let res = parse_ref_target("a.b.c.d", TextRange::up_to(7.into()), 7.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -230,10 +231,10 @@ mod tests { ) } - #[test] + #[gtest] fn test_parse_ref_target_simple_partial() { let res = parse_ref_target("a.abc.d", TextRange::up_to(7.into()), 2.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -248,7 +249,7 @@ mod tests { ); let res = parse_ref_target("a.abc.d", TextRange::up_to(7.into()), 3.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -263,7 +264,7 @@ mod tests { ); let res = parse_ref_target("a.abc.d", TextRange::up_to(7.into()), 5.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -278,10 +279,10 @@ mod tests { ); } - #[test] + #[gtest] fn test_parse_ref_target_type() { let res = parse_ref_target("a.b.[c.d].e", TextRange::up_to(11.into()), 11.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -304,10 +305,10 @@ mod tests { ) } - #[test] + #[gtest] fn test_parse_ref_target_type_at_end() { let res = parse_ref_target("a.b.[c.d]", TextRange::up_to(9.into()), 9.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -326,14 +327,14 @@ mod tests { ) } - #[test] + #[gtest] fn test_parse_ref_target_type_braces_strings() { let res = parse_ref_target( "a.b.[fun(x: table): { n: int, lit: \"}]\" }]", TextRange::up_to(55.into()), 55.into(), ); - assert_eq!( + expect_eq!( res, Some(vec![ ( @@ -354,10 +355,10 @@ mod tests { ) } - #[test] + #[gtest] fn test_parse_ref_target_type_string_literal() { let res = parse_ref_target("a.b.['c']", TextRange::up_to(9.into()), 9.into()); - assert_eq!( + expect_eq!( res, Some(vec![ ( diff --git a/crates/emmylua_parser_desc/src/rst.rs b/crates/emmylua_parser_desc/src/rst.rs index d149b77e..5a84a480 100644 --- a/crates/emmylua_parser_desc/src/rst.rs +++ b/crates/emmylua_parser_desc/src/rst.rs @@ -1728,9 +1728,10 @@ mod tests { use super::*; #[allow(unused)] use crate::testlib::{print_result, test}; + use googletest::prelude::*; - #[test] - fn test_rst() { + #[gtest] + fn test_rst() -> Result<()> { let code = r#" --- Inline markup --- ============= @@ -2179,11 +2180,12 @@ mod tests { --- - And this is list. "#; - test(&code, Box::new(RstParser::new(None, None, None)), &expected); + test(&code, Box::new(RstParser::new(None, None, None)), &expected).or_fail()?; + Ok(()) } - #[test] - fn test_rst_no_indent() { + #[gtest] + fn test_rst_no_indent() -> Result<()> { let code = r#" ---```lua --- @@ -2214,11 +2216,13 @@ local t = 123 &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), None)), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_rst_default_role() { + #[gtest] + fn test_rst_default_role() -> Result<()> { let code = r#"--- See `ref`"#; let expected = r#"--- See `ref`"#; @@ -2227,11 +2231,13 @@ local t = 123 &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), None)), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_rst_primary_domain() { + #[gtest] + fn test_rst_primary_domain() -> Result<()> { let code = r#"--- See :obj:`ref`"#; let expected = r#" @@ -2242,28 +2248,33 @@ local t = 123 &code, Box::new(RstParser::new(Some("lua".to_string()), None, None)), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_rst_search_at_offset() { + #[gtest] + fn test_rst_search_at_offset() -> Result<()> { let code = r#"--- See :lua:obj:`x` :lua:obj:`ref`"#; let expected = r#"--- See :lua:obj:`x` :lua:obj:`ref`"#; test( &code, Box::new(RstParser::new(None, None, Some(31))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(RstParser::new(None, None, Some(32))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(RstParser::new(None, None, Some(34))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See :lua:obj:`x` :lua:obj:`"#; let expected = r#"--- See :lua:obj:`x` :lua:obj:`"#; @@ -2271,7 +2282,8 @@ local t = 123 &code, Box::new(RstParser::new(None, None, Some(31))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See :lua:obj:`x` :lua:obj:``..."#; let expected = r#"--- See :lua:obj:`x` :lua:obj:``..."#; @@ -2279,28 +2291,33 @@ local t = 123 &code, Box::new(RstParser::new(None, None, Some(31))), &expected, - ); + ) + .or_fail()?; + Ok(()) } - #[test] - fn test_rst_search_at_offset_default_role() { + #[gtest] + fn test_rst_search_at_offset_default_role() -> Result<()> { let code = r#"--- See `ab`"#; let expected = r#"--- See `ab`"#; test( &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(9))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(10))), &expected, - ); + ) + .or_fail()?; test( &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(11))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See `"#; let expected = r#"--- See `"#; @@ -2308,7 +2325,8 @@ local t = 123 &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(9))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See `..."#; let expected = r#"--- See `..."#; @@ -2316,7 +2334,8 @@ local t = 123 &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(9))), &expected, - ); + ) + .or_fail()?; let code = r#"--- See ``"#; let expected = r#"--- See ``"#; @@ -2324,6 +2343,8 @@ local t = 123 &code, Box::new(RstParser::new(None, Some("lua:obj".to_string()), Some(9))), &expected, - ); + ) + .or_fail()?; + Ok(()) } } diff --git a/crates/emmylua_parser_desc/src/testlib.rs b/crates/emmylua_parser_desc/src/testlib.rs index 2eec7b11..30633cb8 100644 --- a/crates/emmylua_parser_desc/src/testlib.rs +++ b/crates/emmylua_parser_desc/src/testlib.rs @@ -3,8 +3,9 @@ use crate::{DescItem, LuaDescParser}; use emmylua_parser::{ LuaAstNode, LuaDocDescription, LuaKind, LuaParser, LuaSyntaxKind, ParserConfig, }; +use googletest::prelude::*; -pub fn test(code: &str, mut parser: Box, expected: &str) { +pub fn test(code: &str, mut parser: Box, expected: &str) -> Result<()> { let tree = LuaParser::parse(code, ParserConfig::default()); let Some(desc) = tree .get_red_root() @@ -12,7 +13,7 @@ pub fn test(code: &str, mut parser: Box, expected: &str) { .filter(|node| matches!(node.kind(), LuaKind::Syntax(LuaSyntaxKind::DocDescription))) .next() else { - panic!("No desc found in {:?}", tree.get_red_root()); + return fail!("No desc found in {:?}", tree.get_red_root()); }; let ranges = parser.parse(code, LuaDocDescription::cast(desc).unwrap()); let result = format_result(code, ranges); @@ -20,34 +21,9 @@ pub fn test(code: &str, mut parser: Box, expected: &str) { let result_trimmed = result.trim(); let expected_trimmed = expected.trim(); - if result_trimmed != expected_trimmed { - // Split strings by lines - let result_lines: Vec<&str> = result_trimmed.lines().collect(); - let expected_lines: Vec<&str> = expected_trimmed.lines().collect(); - - println!("Strings do not match! Detailed comparison:"); - println!( - "Actual result has {} lines, expected result has {} lines", - result_lines.len(), - expected_lines.len() - ); - println!(); - - let max_lines = result_lines.len().max(expected_lines.len()); - for i in 0..max_lines { - let actual_line = result_lines.get(i).unwrap_or(&""); - let expected_line = expected_lines.get(i).unwrap_or(&""); + expect_eq!(result_trimmed, expected_trimmed); - if actual_line != expected_line { - println!("Line {} does not match:", i + 1); - println!(" Actual: {:?}", actual_line); - println!(" Expected: {:?}", expected_line); - println!(); - } - } - - panic!("Test failed: actual result does not match expected result"); - } + Ok(()) } #[allow(unused)] @@ -73,20 +49,20 @@ pub fn format_result(text: &str, mut items: Vec) -> String { let mut cur_items: Vec = Vec::new(); let mut res = String::new(); - fn pop_cur_itemss( + fn pop_cur_items( text: &str, - cur_itemss: &mut Vec, + cur_items: &mut Vec, pos: &mut usize, end: usize, res: &mut String, ) { - while let Some(cur_items) = cur_itemss.last() { - let cur_end: usize = cur_items.range.end().into(); + while let Some(cur_item) = cur_items.last() { + let cur_end: usize = cur_item.range.end().into(); if cur_end <= end { *res += &text[*pos..cur_end]; *pos = cur_end; - *res += &format!("", cur_items.kind); - cur_itemss.pop(); + *res += &format!("", cur_item.kind); + cur_items.pop(); } else { break; } @@ -97,7 +73,7 @@ pub fn format_result(text: &str, mut items: Vec) -> String { } for next_item in items { - pop_cur_itemss( + pop_cur_items( text, &mut cur_items, &mut pos, @@ -110,7 +86,7 @@ pub fn format_result(text: &str, mut items: Vec) -> String { cur_items.push(next_item); } - pop_cur_itemss(text, &mut cur_items, &mut pos, text.len(), &mut res); + pop_cur_items(text, &mut cur_items, &mut pos, text.len(), &mut res); res += &text[pos..]; res diff --git a/crates/emmylua_parser_desc/src/util.rs b/crates/emmylua_parser_desc/src/util.rs index 402a6046..a4cb2001 100644 --- a/crates/emmylua_parser_desc/src/util.rs +++ b/crates/emmylua_parser_desc/src/util.rs @@ -358,6 +358,7 @@ pub fn sort_result(items: &mut Vec) { mod tests { use super::*; use emmylua_parser::{LuaParser, ParserConfig}; + use googletest::prelude::*; fn get_desc(code: &str) -> LuaDocDescription { LuaParser::parse(code, ParserConfig::default()) @@ -376,9 +377,9 @@ mod tests { .collect() } - #[test] + #[gtest] fn test_desc_to_lines() { - assert_eq!( + expect_eq!( run_desc_to_lines( r#" -- Desc @@ -387,7 +388,7 @@ mod tests { vec![""; 0] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" ---------- @@ -398,7 +399,7 @@ mod tests { vec![""; 0] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" ---------- @@ -411,7 +412,7 @@ mod tests { vec![""; 0] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" --- Desc @@ -420,7 +421,7 @@ mod tests { vec!["Desc"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" -------- @@ -431,7 +432,7 @@ mod tests { vec!["Desc"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" -------- @@ -444,7 +445,7 @@ mod tests { vec![" Desc", "-----", " Desc"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" --- Desc @@ -454,7 +455,7 @@ mod tests { vec![" Desc", "Desc 2"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" ---Desc @@ -464,7 +465,7 @@ mod tests { vec!["Desc", " Desc 2"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" --- Desc @@ -474,7 +475,7 @@ mod tests { vec!["Desc", "Desc 2"] ); - assert_eq!( + expect_eq!( run_desc_to_lines( r#" --- @param x int Desc