From 63ce37cf6e8318ecb4b678e719a086dfb5bc15b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teemu=20P=C3=A4tsi?= Date: Sat, 24 May 2025 11:14:32 +0300 Subject: [PATCH] expr: Refactor regex tests into multiple targeted functions --- tests/by-util/test_expr.rs | 207 +++++++++++++++++++------------------ 1 file changed, 106 insertions(+), 101 deletions(-) diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index 2eee64555..2c0eafe32 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -273,112 +273,12 @@ fn test_length_mb() { } #[test] -fn test_regex() { - new_ucmd!() - .args(&["a^b", ":", "a^b"]) - .succeeds() - .stdout_only("3\n"); - new_ucmd!() - .args(&["a^b", ":", "a\\^b"]) - .succeeds() - .stdout_only("3\n"); - new_ucmd!() - .args(&["b", ":", "a\\|^b"]) - .succeeds() - .stdout_only("1\n"); - new_ucmd!() - .args(&["ab", ":", "\\(^a\\)b"]) - .succeeds() - .stdout_only("a\n"); - new_ucmd!() - .args(&["a$b", ":", "a\\$b"]) - .succeeds() - .stdout_only("3\n"); - new_ucmd!() - .args(&["a", ":", "a$\\|b"]) - .succeeds() - .stdout_only("1\n"); - new_ucmd!() - .args(&["ab", ":", "a\\(b$\\)"]) - .succeeds() - .stdout_only("b\n"); - new_ucmd!() - .args(&["abc", ":", "^abc"]) - .succeeds() - .stdout_only("3\n"); - new_ucmd!() - .args(&["^abc", ":", "^^abc"]) - .succeeds() - .stdout_only("4\n"); - new_ucmd!() - .args(&["b^$ic", ":", "b^\\$ic"]) - .succeeds() - .stdout_only("5\n"); - new_ucmd!() - .args(&["a$c", ":", "a$\\c"]) - .succeeds() - .stdout_only("3\n"); - new_ucmd!() - .args(&["$a", ":", "$a"]) - .succeeds() - .stdout_only("2\n"); - new_ucmd!() - .args(&["a", ":", "a$\\|b"]) - .succeeds() - .stdout_only("1\n"); - new_ucmd!() - .args(&["^^^^^^^^^", ":", "^^^"]) - .succeeds() - .stdout_only("2\n"); - new_ucmd!() - .args(&["ab[^c]", ":", "ab[^c]"]) - .succeeds() - .stdout_only("3\n"); // Matches "ab[" - new_ucmd!() - .args(&["ab[^c]", ":", "ab\\[^c]"]) - .succeeds() - .stdout_only("6\n"); - new_ucmd!() - .args(&["[^a]", ":", "\\[^a]"]) - .succeeds() - .stdout_only("4\n"); - new_ucmd!() - .args(&["\\a", ":", "\\\\[^^]"]) - .succeeds() - .stdout_only("2\n"); - new_ucmd!() - .args(&["^a", ":", "^^[^^]"]) - .succeeds() - .stdout_only("2\n"); - new_ucmd!() - .args(&["-5", ":", "-\\{0,1\\}[0-9]*$"]) - .succeeds() - .stdout_only("2\n"); +fn test_regex_empty() { new_ucmd!().args(&["", ":", ""]).fails().stdout_only("0\n"); new_ucmd!() .args(&["abc", ":", ""]) .fails() .stdout_only("0\n"); - new_ucmd!() - .args(&["abc", ":", "bc"]) - .fails() - .stdout_only("0\n"); - new_ucmd!() - .args(&["^abc", ":", "^abc"]) - .fails() - .stdout_only("0\n"); - new_ucmd!() - .args(&["abc", ":", "ab[^c]"]) - .fails() - .stdout_only("0\n"); - new_ucmd!() - .args(&["$", ":", "$"]) - .fails() - .stdout_only("0\n"); - new_ucmd!() - .args(&["a$", ":", "a$\\|b"]) - .fails() - .stdout_only("0\n"); } #[test] @@ -401,6 +301,111 @@ fn test_regex_trailing_backslash() { .stderr_only("expr: Trailing backslash\n"); } +#[test] +fn test_regex_caret() { + new_ucmd!() + .args(&["a^b", ":", "a^b"]) + .succeeds() + .stdout_only("3\n"); + new_ucmd!() + .args(&["a^b", ":", "a\\^b"]) + .succeeds() + .stdout_only("3\n"); + new_ucmd!() + .args(&["abc", ":", "^abc"]) + .succeeds() + .stdout_only("3\n"); + new_ucmd!() + .args(&["^abc", ":", "^^abc"]) + .succeeds() + .stdout_only("4\n"); + new_ucmd!() + .args(&["b", ":", "a\\|^b"]) + .succeeds() + .stdout_only("1\n"); + new_ucmd!() + .args(&["ab", ":", "\\(^a\\)b"]) + .succeeds() + .stdout_only("a\n"); + new_ucmd!() + .args(&["^abc", ":", "^abc"]) + .fails() + .stdout_only("0\n"); + new_ucmd!() + .args(&["^^^^^^^^^", ":", "^^^"]) + .succeeds() + .stdout_only("2\n"); + new_ucmd!() + .args(&["ab[^c]", ":", "ab[^c]"]) + .succeeds() + .stdout_only("3\n"); // Matches "ab[" + new_ucmd!() + .args(&["ab[^c]", ":", "ab\\[^c]"]) + .succeeds() + .stdout_only("6\n"); + new_ucmd!() + .args(&["[^a]", ":", "\\[^a]"]) + .succeeds() + .stdout_only("4\n"); + new_ucmd!() + .args(&["\\a", ":", "\\\\[^^]"]) + .succeeds() + .stdout_only("2\n"); + // Patterns are anchored to the beginning of the pattern "^bc" + new_ucmd!() + .args(&["abc", ":", "bc"]) + .fails() + .stdout_only("0\n"); + new_ucmd!() + .args(&["^a", ":", "^^[^^]"]) + .succeeds() + .stdout_only("2\n"); + new_ucmd!() + .args(&["abc", ":", "ab[^c]"]) + .fails() + .stdout_only("0\n"); +} + +#[test] +fn test_regex_dollar() { + new_ucmd!() + .args(&["a$b", ":", "a\\$b"]) + .succeeds() + .stdout_only("3\n"); + new_ucmd!() + .args(&["a", ":", "a$\\|b"]) + .succeeds() + .stdout_only("1\n"); + new_ucmd!() + .args(&["ab", ":", "a\\(b$\\)"]) + .succeeds() + .stdout_only("b\n"); + new_ucmd!() + .args(&["a$c", ":", "a$\\c"]) + .succeeds() + .stdout_only("3\n"); + new_ucmd!() + .args(&["$a", ":", "$a"]) + .succeeds() + .stdout_only("2\n"); + new_ucmd!() + .args(&["a", ":", "a$\\|b"]) + .succeeds() + .stdout_only("1\n"); + new_ucmd!() + .args(&["-5", ":", "-\\{0,1\\}[0-9]*$"]) + .succeeds() + .stdout_only("2\n"); + new_ucmd!() + .args(&["$", ":", "$"]) + .fails() + .stdout_only("0\n"); + new_ucmd!() + .args(&["a$", ":", "a$\\|b"]) + .fails() + .stdout_only("0\n"); +} + #[test] fn test_substr() { new_ucmd!()