diff options
Diffstat (limited to 'www/wiki/extensions/AbuseFilter/tests')
104 files changed, 583 insertions, 0 deletions
diff --git a/www/wiki/extensions/AbuseFilter/tests/legacyParserTest.php b/www/wiki/extensions/AbuseFilter/tests/legacyParserTest.php new file mode 100644 index 00000000..c3055c15 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/legacyParserTest.php @@ -0,0 +1,52 @@ +<?php +/** + * Runs tests against the PHP parser. + */ + +require_once getenv( 'MW_INSTALL_PATH' ) !== false + ? getenv( 'MW_INSTALL_PATH' ) . "/maintenance/commandLine.inc" + : __DIR__ . '/../../../maintenance/commandLine.inc'; + +$tester = new AbuseFilterParser; + +$test_path = __DIR__ . "/parserTests"; +$tests = glob( $test_path . "/*.t" ); + +$check = 0; +$pass = 0; + +foreach ( $tests as $test ) { + $result = substr( $test, 0, -2 ) . ".r"; + + $rule = trim( file_get_contents( $test ) ); + $output = trim( file_get_contents( $result ) ) == 'MATCH'; + + $testname = basename( $test ); + + print "Trying test $testname...\n"; + + try { + $check++; + $actual = intval( $tester->parse( $rule ) ); + + if ( $actual == $output ) { + print "-PASSED.\n"; + $pass++; + } else { + print "-FAILED - expected output $output, actual output $actual.\n"; + print "-Expression: $rule\n"; + + // export + $vars = var_export( $tester->mTokens, true ); + file_put_contents( $test . '.parsed', $vars ); + } + } catch ( AFPException $excep ) { + print "-FAILED - exception " . $excep->getMessage() . " with input $rule\n"; + + // export + $vars = var_export( $tester->mTokens, true ); + file_put_contents( $test . '.parsed', $vars ); + } +} + +print "$pass tests passed out of $check\n"; diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.r new file mode 100644 index 00000000..8093d2ab --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.r @@ -0,0 +1 @@ +NOT_MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.t new file mode 100644 index 00000000..e57b08b4 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/almost-empty.t @@ -0,0 +1 @@ +;;;; diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.t new file mode 100644 index 00000000..1f88e9df --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/arith.t @@ -0,0 +1,27 @@ +(1 + 1 === 2) & +(1.5 + 1.5 === 3.0) & +(2.5 + 1 === 3.5) & +(0 + 1 === 1) & +(2.5 + 0 === 2.5) & +(5 - 3 === 2) & +(5 - 3.5 === 1.5) & +(5.5 - 3.5 === 2.0) & +(1 - 0 === 1) & +(2.5 - 0 === 2.5) & +(2 * 3 === 6) & +(2 * 3.5 === 7.0) & +(2.5 * 3.5 === 8.75) & +(2.5 * 0 === 0.0) & +(10 / 2 === 5) & +(10 / 2.5 === 4.0) & +(18 / 36 === 0.5) & +(0 / 36 === 0) & +(12.5 / 2.5 === 5.0) & +(10.5 / 2.5 === 4.2) & +(10 % 7 === 3) & +(10.48762 % 7 === 3) & +(10 % 7.123576 === 3) & +(2 ** 4 === 16) & +(2.5 ** 2 === 6.25) & +(2.5 ** 0 === 1.0) & +(1000 ** 0 === 1)
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.t new file mode 100644 index 00000000..479dd3b0 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/arrays.t @@ -0,0 +1,12 @@ +array1 := [ 'a', 'b', 'c', ]; +array2 := []; +array2[] := 'd'; +array2[] := 'g'; +array2[] := 'f'; +array2[1] := 'e'; + +array3 := array1 + array2; +array4 := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]; + +(string(array3) == "a\nb\nc\nd\ne\nf\n" & !('b' in array2) & array1 contains 'c' & [ false, !(1;0), null ][1] & length(array3) == 6 & + array4[1][1] == 5 ) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.t new file mode 100644 index 00000000..4b236bd2 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/bool-assoc.t @@ -0,0 +1 @@ +!(true | false & false) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.t new file mode 100644 index 00000000..99e5c80e --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/bug25373.t @@ -0,0 +1 @@ +(1 == 1) ? (true) : (false) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.t new file mode 100644 index 00000000..c0bc317c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/cast.t @@ -0,0 +1 @@ +(string(1) === "1") & (int("1") === 1) & (float(1) === 1.0) & bool(1) & !bool(0) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.t new file mode 100644 index 00000000..9a8635c8 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-all.t @@ -0,0 +1 @@ +ccnorm_contains_all("the f00 is on the b4r", "foo", "is on", "bar") diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.t new file mode 100644 index 00000000..6aeac35c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm-contains-any.t @@ -0,0 +1 @@ +ccnorm_contains_any("like 4ny0ne else", "foo", "aNyon3") & ccnorm_contains_any("street f1ghter","F1ght") diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.t new file mode 100644 index 00000000..f233e42e --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ccnorm.t @@ -0,0 +1 @@ +ccnorm("aany0ne") = "AANYONE" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.t new file mode 100644 index 00000000..3252b87a --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/comment.t @@ -0,0 +1,4 @@ +1 /* a */ == /* b */ "1" /* c */ /* & + +1/0 +*/ diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.t new file mode 100644 index 00000000..f8b81b24 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-all.t @@ -0,0 +1 @@ +contains_all("the foo is on the bar", "foo", "is on", "bar") & !(contains_all(['foo', 'bar', 'hey'], 'foo', 'bar', 'sup')) & contains_all([1, 2, 3], '1', '2', '3')
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.t new file mode 100644 index 00000000..56f1c8bd --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains-any.t @@ -0,0 +1 @@ +contains_any("like anyone else", "else", "someone") & contains_any("street fighter", "fight") & !(contains_any('My foo is cute', 'bar', 'wtf')) & contains_any([[1], [2,3]], 1) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.t new file mode 100644 index 00000000..cac43d24 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/contains.t @@ -0,0 +1 @@ +"quux" contains "ux" & ['1', 'foo'] contains '1' & !('fo obar' contains 'foo') & ['foo'] contains 'f'
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/count.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/count.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/count.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/count.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/count.t new file mode 100644 index 00000000..5733b0b2 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/count.t @@ -0,0 +1,6 @@ +count("a,b,c,d") = 4 & +count(",", "a,b,c,d") = 3 & +count("", "abcd") = 0 & +count("a", "abab") = 2 & +count("ab", "abab") = 2 & +count("aa", "aaaaa") = 2 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.r new file mode 100644 index 00000000..8093d2ab --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.r @@ -0,0 +1 @@ +NOT_MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.t new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/empty.t diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.t new file mode 100644 index 00000000..25df4e69 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/eq.t @@ -0,0 +1 @@ +(1 == 1) & (1 != 2) & (1 === 1) & (1 == "1") & (1 !== "1") diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.t new file mode 100644 index 00000000..17849182 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/expn.t @@ -0,0 +1,2 @@ +/* In filter language, the exponentiation is left-associative */ +(2 ** 3 ** 2) === 64 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/float.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/float.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/float.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/float.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/float.t new file mode 100644 index 00000000..e31067e0 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/float.t @@ -0,0 +1 @@ +(5 / 2 === 2.5) & (int(5 / 2) === 2) & (5. / 2 === 2.5) & (5 / 2. === 2.5) & (int(.5) === 0) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.t new file mode 100644 index 00000000..88e163b4 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/get-matches.t @@ -0,0 +1,4 @@ +/* More complete tests for get_matches are in AbuseFilterParserTest.php */ +a := get_matches('I am a (dog|cat)', 'What did you say?'); +get_matches('The (truth|pineapple) is (?:rarely)? pure and (nee*v(ah|er) sh?imple)', 'The truth is rarely pure and never simple, Wilde said') == ['The truth is rarely pure and never simple', 'truth', 'never simple', 'er'] & +a === [false, false]
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.t new file mode 100644 index 00000000..160d1ab8 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ifthen.t @@ -0,0 +1 @@ +(if 1 then 2 else 3 end) == 2 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/in.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/in.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/in.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/in.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/in.t new file mode 100644 index 00000000..73d480d3 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/in.t @@ -0,0 +1 @@ +"foo" in "foobar" & '1' in ['1', 'foo'] & !('foo' in 'fo obar') & 'f' in ['foo'] diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.t new file mode 100644 index 00000000..6995baf7 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/lcase.t @@ -0,0 +1 @@ +lcase("FÁmí") = "fámí" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/length.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/length.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/length.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/length.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/length.t new file mode 100644 index 00000000..064b22fa --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/length.t @@ -0,0 +1 @@ +length("foobar") == 6 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/like.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/like.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/like.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/like.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/like.t new file mode 100644 index 00000000..74396f19 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/like.t @@ -0,0 +1 @@ +"f+oo-bér" like "f+oo-b?r" & "quux" matches "qu*x" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.t new file mode 100644 index 00000000..c055541b --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-assignment.t @@ -0,0 +1,6 @@ +test_list := [ [1, 2], [3, 4] ]; + +test_list[1] := 42; +test_list[] := 17; + +test_list[0][0] == 1 & test_list[0][1] == 2 & test_list[1] == 42 & test_list[2] == 17 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.t new file mode 100644 index 00000000..db431573 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/list-comparisons.t @@ -0,0 +1,11 @@ +a := [1, 2, 3]; +b := [1, 2, 3]; +c := [2, 3, 4]; +d := [1, 2, 3, 4]; +e := ['1', '2', '3']; +f := [[['1']]]; +g := [[[1]]]; +h := [[1, 2], 3]; +i := [['1', 2], '3']; + +a == b & a === b & a != c & b != d & a == e & a !== e & f == g & f !== g & h == i & h !== i & e != i diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.t new file mode 100644 index 00000000..7cfaf4af --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-arithmetic.t @@ -0,0 +1,8 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Arithmetic]] */ + +1 + 1 === 2 & +2 * 2 === 4 & +12 / 24 === 0.5 & +24 / 12 === 2 & +9 ** 2 === 81 & +6 % 5 === 1
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.t new file mode 100644 index 00000000..a8e88539 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-bools.t @@ -0,0 +1,13 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Boolean operations]] */ + +(1 | 1) & +(1 | 0) & +!(0 | 0) & +(1 & 1) & +!(1 & 0) & +!(0 & 0) & +!(1 ^ 1) & +(1 ^ 0) & +!(0 ^ 0) & +!(!1) + diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.t new file mode 100644 index 00000000..7d0ada0d --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-comparisons.t @@ -0,0 +1,20 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Simple comparisons]] */ + +!(1 == 2) & +(1 <= 2) & +!(1 >= 2) & +(1 != 2) & +(1 < 2) & +!(1 > 2) & +(2 = 2) & +('' == false) & +!('' === false) & +(1 == true) & +!(1 === true) & +(['1','2','3'] == ['1','2','3']) & +([1,2,3] === [1,2,3]) & +(['1','2','3'] == [1,2,3]) & +!(['1','2','3'] === [1,2,3]) & +([1,1,''] == [true, true, false]) & +!(['1'] == '1') + diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.t new file mode 100644 index 00000000..ea5bf1b1 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-functions.t @@ -0,0 +1,22 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Functions]] */ + +length( "Wikipedia" ) === 9 & +lcase( "WikiPedia" ) === 'wikipedia' & +ccnorm( "w1k1p3d14" ) === 'WIKIPEDIA' & +ccnorm( "ωɨƙɩᑭƐƉ1α" ) === 'WIKIPEDIA' & +ccnorm_contains_any( "w1k1p3d14", "wiKiP3D1A", "foo", "bar" ) === true & +ccnorm_contains_any( "w1k1p3d14", "foo", "bar", "baz" ) === false & +ccnorm_contains_any( "w1k1p3d14 is 4w3s0me", "bar", "baz", "some" ) === true & +ccnorm( "ìíîïĩїį!ľ₤ĺľḷĿ" ) === 'IIIIIII!LLLLLL' & +norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@1%%α!!" ) === 'WIKIPEDAIA' & +norm( "F00 B@rr" ) === 'FOBAR' & +rmdoubles( "foobybboo" ) === 'fobybo' & +specialratio( "Wikipedia!" ) === 0.1 & +count( "foo", "foofooboofoo" ) === 3 & +count( "foo,bar,baz" ) === 3 & +rmspecials( "FOOBAR!!1" ) === 'FOOBAR1' & +rescape( "abc* (def)" ) === 'abc\* \(def\)' & +str_replace( "foobarbaz", "bar", "-" ) === 'foo-baz' & +ip_in_range( "127.0.10.0", "127.0.0.0/12" ) === true & +contains_any( "foobar", "x", "y", "f" ) === true & +get_matches( "(foo?ba+r) is (so+ good)", "fobaaar is soooo good to eat" ) === ['fobaaar is soooo good', 'fobaaar', 'soooo good']
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.t new file mode 100644 index 00000000..d6ca07d4 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-keywords.t @@ -0,0 +1,9 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Keywords]] */ + +("1234" like "12?4") & +("1234" like "12*") & +("foo" in "foobar") & +("o" in ["foo", "bar"]) & +("foo" regex "\w+") & +("a\b" regex "a\\\\b") & +("a\b" regex "a\x5C\x5Cb")
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.r new file mode 100644 index 00000000..f629599c --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.r @@ -0,0 +1 @@ +MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.t new file mode 100644 index 00000000..904413b3 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/mwexamples-lists.t @@ -0,0 +1,10 @@ +/* Examples from [[mw:Extension:AbuseFilter/Rules format#Lists]] */ + +a_list := [ 5, 6, 7, 10]; +a_list[0] == 5 & +length(a_list) == 4 & +string(a_list) == "5\n6\n7\n10\n" & +5 in a_list == true & +'5' in a_list == true & +'5\n6' in a_list == true & +1 in a_list == true
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.t new file mode 100644 index 00000000..ed2d442a --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/norm.t @@ -0,0 +1 @@ +norm("foo") = "FO" & norm("any0ne") = "ANYONE" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.t new file mode 100644 index 00000000..1959a0fe --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/numbers.t @@ -0,0 +1 @@ +ax = 10 & Fx = 15 & 10o = 8 & 10b = 2 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.t new file mode 100644 index 00000000..6c94f4b6 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ord.t @@ -0,0 +1,8 @@ +1 > 0 & +0 < 1 & +2 >= 2 & +2 <= 2 & +0.1 < 0.2 & +0.001 <= 0.001 & +-0.01 < 0.01 & +0 >= -0.0001 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.t new file mode 100644 index 00000000..3aff6ab1 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/prec.t @@ -0,0 +1 @@ +(1 + 2 * 3 = 7) & (2 ** 2 * 2 = 8) & (1 - 1 - 1 = -1) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.t new file mode 100644 index 00000000..706da02d --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/regex.t @@ -0,0 +1 @@ +"foobér" rlike "^[fq]o{2}\\S.r$" & "foo" regex "^f..?.$" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.t new file mode 100644 index 00000000..7a0a3f8f --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmdoubles.t @@ -0,0 +1 @@ +rmdoubles("foobarééqq") = "fobaréq" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.t new file mode 100644 index 00000000..a4df5cd5 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/rmspecials.t @@ -0,0 +1 @@ +rmspecials("foo;bar!") = "foobar" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.r new file mode 100644 index 00000000..33a8a805 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.r @@ -0,0 +1 @@ +NOT_MATCH
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.t new file mode 100644 index 00000000..d87746de --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-and.t @@ -0,0 +1,2 @@ +/* The division by zero should not be executed and not crash the filter */ +false & 1/0
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.t new file mode 100644 index 00000000..bec088f6 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/shortcircuit-or.t @@ -0,0 +1,2 @@ +/* The division by zero should not be executed and not crash the filter */ +true | 1/0 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.t new file mode 100644 index 00000000..c4a3565a --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/specialratio.t @@ -0,0 +1 @@ +specialratio("foó;") = 0.25 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/string.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/string.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/string.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/string.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/string.t new file mode 100644 index 00000000..f6036cef --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/string.t @@ -0,0 +1 @@ +"a\tb" = "a b" & "a\qb" = "a\qb" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.t new file mode 100644 index 00000000..a9f11586 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/tern.t @@ -0,0 +1 @@ +1 ? 0 ? 3 : 4 : 5 == 4 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.t new file mode 100644 index 00000000..be058b8b --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/ucase.t @@ -0,0 +1 @@ +ucase("FÁmí") = "FÁMÍ" diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.t new file mode 100644 index 00000000..051be509 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/utf8.t @@ -0,0 +1 @@ +length("áéý") == 3 diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.t new file mode 100644 index 00000000..3c3a0023 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/vars.t @@ -0,0 +1,5 @@ +/* Variables test */ +test_var1 := test_var2 := "aa"; +set( 'ResulT', set_var( 'TV3', "bb" ) ); + +str_replace( test_var1, test_var2, tv3 ) == result;
\ No newline at end of file diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.t new file mode 100644 index 00000000..bc1bf519 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/whitespace1.t @@ -0,0 +1 @@ +1 == length("a") diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.t new file mode 100644 index 00000000..0d81aee3 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest1.t @@ -0,0 +1,9 @@ +/* Filter 30 from English Wikipedia (large deletion from article by new editors) */ +user_groups_test := ["*"]; +new_size_test := 100; +article_namespace_test := 0; +edit_delta_test := -5000; +added_lines_test := ''; + +!("autoconfirmed" in user_groups_test) & (new_size_test > 50) & (article_namespace_test == 0) & + (edit_delta_test < -2000) & !("#redirect" in lcase(added_lines_test)) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.t new file mode 100644 index 00000000..0e137503 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest2.t @@ -0,0 +1,21 @@ +/* Filter 61 from English Wikipedia (new user removing references) */ +user_groups_test := ["*"]; +new_size_test := 100; +article_namespace_test := 0; +edit_delta_test := -22; +added_lines_test := ['<ref name="bah">test</ref> test2!']; +removed_lines_test := ['<ref name="bah">test</ref><ref name="wah">test2</ref>']; + +!("autoconfirmed" in user_groups_test) +/* this edit_delta ignores large blankings that are treated by another filter */ +& edit_delta_test >= -1000 +& article_namespace_test == 0 +/* No added lines usually mean a blanking which is dealt with by other filter */ +& length(added_lines_test) != 0 +& !("#redirect" in lcase(added_lines_test)) +/*Counts of more reference tags are removed than added */ +& (rcount("(<ref>|<ref\sname|</ref>)",removed_lines_test) > rcount("(<ref>|<ref\sname|</ref>)",added_lines_test)) +/*Excludes changing to the named reference format and removing closing tags attached to formerly named refs. Unequality is to account for closing the first named tag */ +& !(rcount("<ref>",removed_lines_test) = rcount("<ref\sname",added_lines_test) | rcount("</ref>",removed_lines_test) <= rcount("<ref\sname",added_lines_test)) +/*Excludes removal of references to Wikipedia itself */ +& !(count("http://en.wikipedia.org",string(removed_lines_test)) > count("http://en.wikipedia.org",string(added_lines_test))) diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.r b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.r new file mode 100644 index 00000000..4736e080 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.r @@ -0,0 +1 @@ +MATCH diff --git a/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.t b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.t new file mode 100644 index 00000000..342ba7e5 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/parserTests/wptest3.t @@ -0,0 +1,28 @@ +/* Filter 18 from English Wikipedia (test type edits from clicking on edit bar) */ +user_groups_test := ["*"]; +article_namespace_test := 0; +added_lines_test := ["Hello world! '''Bold text''' [http://www.example.com link title]"]; + +(article_namespace_test == 0) & +!("autoconfirmed" in user_groups_test) & +(contains_any(string(added_lines_test), + "'''Bold text'''", + "''Italic text''", + "[[Link title]]", + "[http://www.example.com link title]", + "== Headline text ==", + "[[File:Example.jpg]]", + "[[Media:Example.ogg]]", + "<math>Insert formula here</math>", + "<nowiki>Insert non-formatted text here</nowiki>", + "#REDIRECT [[Target page name]]", + "<s>Strike-through text</s>", + "<sup>Superscript text</sup>", + "<sub>Subscript text</sub>", + "<small>Small Text</small>", + "<!-- Comment -->", + "Image:Example.jpg|Caption", + "<ref>Insert footnote text here</ref>", + "Ǣ ǣ ǖ ǘ ǚ ǜ Ă" +)) + diff --git a/www/wiki/extensions/AbuseFilter/tests/phpunit/AbuseFilterParserTest.php b/www/wiki/extensions/AbuseFilter/tests/phpunit/AbuseFilterParserTest.php new file mode 100644 index 00000000..d7560e92 --- /dev/null +++ b/www/wiki/extensions/AbuseFilter/tests/phpunit/AbuseFilterParserTest.php @@ -0,0 +1,222 @@ +<?php +/** + * Tests for the AbuseFilter parser + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * + * @license GPL-2.0-or-later + * @author Marius Hoch < hoo@online.de > + */ + +/** + * @group Test + * @group AbuseFilter + * + * @covers AbuseFilterCachingParser + * @covers AbuseFilterParser + * @covers AbuseFilterTokenizer + */ +class AbuseFilterParserTest extends MediaWikiTestCase { + /** + * @return AbuseFilterParser + */ + static function getParser() { + static $parser = null; + if ( !$parser ) { + $parser = new AbuseFilterParser(); + } + return $parser; + } + + /** + * @return AbuseFilterParser[] + */ + static function getParsers() { + static $parsers = null; + if ( !$parsers ) { + $parsers = [ + new AbuseFilterParser(), + new AbuseFilterCachingParser() + ]; + } + return $parsers; + } + + /** + * @dataProvider readTests + */ + public function testParser( $testName, $rule, $expected ) { + foreach ( self::getParsers() as $parser ) { + $actual = $parser->parse( $rule ); + $this->assertEquals( $expected, $actual, 'Running parser test ' . $testName ); + } + } + + /** + * @return array + */ + public function readTests() { + $tests = []; + $testPath = __DIR__ . "/../parserTests"; + $testFiles = glob( $testPath . "/*.t" ); + + foreach ( $testFiles as $testFile ) { + $testName = substr( $testFile, 0, -2 ); + + $resultFile = $testName . '.r'; + $rule = trim( file_get_contents( $testFile ) ); + $result = trim( file_get_contents( $resultFile ) ) == 'MATCH'; + + $tests[] = [ + basename( $testName ), + $rule, + $result + ]; + } + + return $tests; + } + + /** + * Ensure that AbuseFilterTokenizer::OPERATOR_RE matches the contents + * and order of AbuseFilterTokenizer::$operators. + */ + public function testOperatorRe() { + $operatorRe = '/(' . implode( '|', array_map( function ( $op ) { + return preg_quote( $op, '/' ); + }, AbuseFilterTokenizer::$operators ) ) . ')/A'; + $this->assertEquals( $operatorRe, AbuseFilterTokenizer::OPERATOR_RE ); + } + + /** + * Ensure that AbuseFilterTokenizer::RADIX_RE matches the contents + * and order of AbuseFilterTokenizer::$bases. + */ + public function testRadixRe() { + $baseClass = implode( '', array_keys( AbuseFilterTokenizer::$bases ) ); + $radixRe = "/([0-9A-Fa-f]+(?:\.\d*)?|\.\d+)([$baseClass])?/Au"; + $this->assertEquals( $radixRe, AbuseFilterTokenizer::RADIX_RE ); + } + + /** + * Ensure the number of conditions counted for given expressions is right. + * + * @dataProvider condCountCases + */ + public function testCondCount( $rule, $expected ) { + $parser = self::getParser(); + // Set some variables for convenience writing test cases + $parser->setVars( array_combine( range( 'a', 'f' ), range( 'a', 'f' ) ) ); + $countBefore = AbuseFilter::$condCount; + $parser->parse( $rule ); + $countAfter = AbuseFilter::$condCount; + $actual = $countAfter - $countBefore; + $this->assertEquals( $expected, $actual, 'Condition count for ' . $rule ); + } + + /** + * Data provider for testCondCount method. + * @return array + */ + public function condCountCases() { + return [ + [ '(((a == b)))', 1 ], + [ 'contains_any(a, b, c)', 1 ], + [ 'a == b == c', 2 ], + [ 'a in b + c in d + e in f', 3 ], + [ 'true', 0 ], + [ 'a == a | c == d', 1 ], + [ 'a == b & c == d', 1 ], + ]; + } + + /** + * get_matches should throw an exception with an invalid number of arguments. + * @expectedException AFPUserVisibleException + * @covers AbuseFilterParser::funcGetMatches + */ + public function testGetMatchesInvalidArgs() { + $parser = self::getParser(); + $parser->parse( "get_matches('')" ); + } + + /** + * get_matches should throw an exception when given an invalid regular expression. + * @expectedException AFPUserVisibleException + * @covers AbuseFilterParser::funcGetMatches + */ + public function testGetMatchesInvalidRegex() { + $parser = self::getParser(); + $parser->parse( "get_matches('this (should fail')" ); + } + + /** + * Ensure get_matches function captures returns expected output. + * @param string $needle Regex to pass to get_matches. + * @param string $haystack String to run regex against. + * @param string[] $expected The expected values of the matched groups. + * @covers AbuseFilterParser::funcGetMatches + * @dataProvider getMatchesCases + */ + public function testGetMatches( $needle, $haystack, $expected ) { + $parser = self::getParser(); + $afpData = $parser->intEval( "get_matches('$needle', '$haystack')" )->data; + + // Extract matches from AFPData. + $matches = array_map( function ( $afpDatum ) { + return $afpDatum->data; + }, $afpData ); + + $this->assertEquals( $expected, $matches ); + } + + /** + * Data provider for get_matches method. + * @return array + */ + public function getMatchesCases() { + return [ + [ + 'You say (.*) \(and I say (.*)\)\.', + 'You say hello (and I say goodbye).', + [ + 'You say hello (and I say goodbye).', + 'hello', + 'goodbye', + ], + ], + [ + 'I(?: am)? the ((walrus|egg man).*)\!', + 'I am the egg man, I am the walrus !', + [ + 'I am the egg man, I am the walrus !', + 'egg man, I am the walrus ', + 'egg man', + ], + ], + [ + 'this (does) not match', + 'foo bar', + [ + false, + false, + ], + ], + ]; + } +} |