From 21bce4125e3c54f888c64192934924ee37759706 Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Mon, 15 Jan 2024 18:52:38 +0000 Subject: [PATCH] add fuzz tests for regexes --- .gitignore | 3 ++- Cargo.lock | 3 ++- Cargo.toml | 5 ++++- src/types/patterns.rs | 49 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a712f53e..0923ace8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ release-note.txt rainconfig.json /old result -docs \ No newline at end of file +docs +proptest-regressions \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 4e8860d5..a8d5955e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,6 +801,7 @@ dependencies = [ "lsp-types", "magic_string", "once_cell", + "proptest", "rain-meta", "regex", "revm", @@ -3386,4 +3387,4 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.48", -] \ No newline at end of file +] diff --git a/Cargo.toml b/Cargo.toml index c876b137..42dfe0b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,5 +62,8 @@ tsify = { version = "0.4.5", default-features = false, features = ["js", "wasm-b [lints.clippy] all = "warn" +[dev-dependencies] +proptest = "1.4.0" + [package.metadata.docs.rs] -all-features = true \ No newline at end of file +all-features = true diff --git a/src/types/patterns.rs b/src/types/patterns.rs index f5e49e61..2281c157 100644 --- a/src/types/patterns.rs +++ b/src/types/patterns.rs @@ -107,7 +107,56 @@ pub mod lint_patterns { #[cfg(test)] mod tests { + use std::any::Any; + use super::*; + use proptest::prelude::*; + + proptest! { + #[test] + fn test_regex_match(input in ".*") { + for pattern in [ + &WORD_PATTERN, + &HASH_PATTERN, + &NUMERIC_PATTERN, + &STRING_LITERAL_PATTERN, + &HEX_PATTERN, + &E_PATTERN, + &INT_PATTERN, + &NAMESPACE_PATTERN, + &COMMENT_PATTERN, + &DEP_PATTERN, + &OPERAND_ARG_PATTERN, + &LHS_PATTERN, + &SUB_PARSER_PATTERN + ] { + let is_match = pattern.is_match(&input); + assert!(is_match, "Regex {:?} failed to match input: {}", pattern.as_str(), input); + }; + } + + #[test] + fn test_regex_no_match(input in ".*") { + for pattern in [ + &WORD_PATTERN, + &HASH_PATTERN, + &NUMERIC_PATTERN, + &STRING_LITERAL_PATTERN, + &HEX_PATTERN, + &E_PATTERN, + &INT_PATTERN, + &NAMESPACE_PATTERN, + &COMMENT_PATTERN, + &DEP_PATTERN, + &OPERAND_ARG_PATTERN, + &LHS_PATTERN, + &SUB_PARSER_PATTERN + ] { + let is_no_match = !pattern.is_match(&input); + assert!(is_no_match, "Regex {:?} incorrectly matched input: {}", pattern.as_str(), input); + }; + } + } #[test] fn test_patterns() -> anyhow::Result<()> {