Browse Source

Add regexp tests adapted from http://www.theiling.de/cnc/date/2017-12-19.html

mingodad 8 years ago
parent
commit
153ec064f7
1 changed files with 234 additions and 1 deletions
  1. 234 1
      SquiLu/tests/squilu-test.nut

+ 234 - 1
SquiLu/tests/squilu-test.nut

@@ -662,6 +662,238 @@ sqt.run("pattern matching", function(){
 
 });
 
+sqt.run("regexp", function(){
+
+	/*
+	Adapted from
+		http://www.theiling.de/cnc/date/2017-12-19.html
+		http://www.theiling.de/cnc/regexp/test.c
+	*/
+
+	const RE_E_OK = 1;
+	const RE_E_FAIL = 2;
+	const RE_E_SYNTAX = 3;
+	const RE_E_NOTIMPL = 3;
+
+	local function re_match(re_str, test_str)
+	{
+		local result;
+		try {
+			local re = regexp(re_str);
+			result = (re.match(test_str) != null) ? RE_E_OK : RE_E_FAIL;
+		} catch(e) {result = RE_E_SYNTAX;}
+		return result;
+	}
+/*
+	print(re_match("aaa", "aaa"));
+	print(re_match("aaa", "aab"));
+	print(re_match("(a|[(])+", "a(aa((a"));
+	print("bac".match("[\\^a]*"));
+*/
+	sqt.ok(re_match("aaa", "aaa") == RE_E_OK);
+	sqt.ok(re_match("aaa", "aab") == RE_E_FAIL);
+	sqt.ok(re_match("aaa", "aa") == RE_E_FAIL);
+	sqt.ok(re_match("aa", "aaa") == RE_E_OK);
+	sqt.ok(re_match("a..", "aaa") == RE_E_OK);
+	sqt.ok(re_match("aaa", "a..") == RE_E_FAIL);
+	sqt.ok(re_match("a{}", "") == RE_E_SYNTAX);
+	sqt.ok(re_match("(aaa)", "aaa") == RE_E_OK);
+	sqt.ok(re_match("(aa)a", "aaa") == RE_E_OK);
+	sqt.ok(re_match("(aaa", "aaa") == RE_E_SYNTAX);
+	sqt.ok(re_match("a+", "") == RE_E_FAIL);
+	sqt.ok(re_match("a+", "aaa") == RE_E_OK);
+	sqt.ok(re_match(".+", "aaa") == RE_E_OK);
+	sqt.ok(re_match("(a)+", "aaa") == RE_E_OK);
+	sqt.ok(re_match("(aa)+", "aaaa") == RE_E_OK);
+	//sqt.ok(re_match("(aa)+", "aaa") == RE_E_FAIL);
+	sqt.ok(re_match("(aa(b)+)+", "aabaabb") == RE_E_OK);
+	//sqt.ok(re_match("(aa(b)+)+", "aaabaabb") == RE_E_FAIL);
+	//sqt.ok(re_match("(aa(b)+)+", "aaaabb") == RE_E_FAIL);
+	sqt.ok(re_match("a+b", "aaaaaaaaaaaaaaaab") == RE_E_OK);
+	sqt.ok(re_match("a+b", "aaaaaaaaaaaaaaaa") == RE_E_FAIL);
+	sqt.ok(re_match("a?", "a") == RE_E_OK);
+	sqt.ok(re_match("a?", "aa") == RE_E_OK);
+	sqt.ok(re_match("a?b", "b") == RE_E_OK);
+	//sqt.ok(re_match("a?", "") == RE_E_OK);
+	//sqt.ok(re_match("(a?)?", "") == RE_E_OK);
+	//sqt.ok(re_match("a*", "") == RE_E_OK);
+	//sqt.ok(re_match("(a?)+", "") == RE_E_OK);
+	//sqt.ok(re_match("?", "") == RE_E_SYNTAX);
+	sqt.ok(re_match("a*b", "b") == RE_E_OK);
+	//sqt.ok(re_match("(a+)?", "") == RE_E_OK);
+	sqt.ok(re_match("a+b", "b") == RE_E_FAIL);
+	sqt.ok(re_match("a+b", "ab") == RE_E_OK);
+	sqt.ok(re_match("a+b", "aab") == RE_E_OK);
+	sqt.ok(re_match("a+b", "aaab") == RE_E_OK);
+	sqt.ok(re_match("a{2}b", "ab") == RE_E_FAIL);
+	sqt.ok(re_match("a{2}b", "aab") == RE_E_OK);
+	sqt.ok(re_match("a{2}b", "aaab") == RE_E_OK);
+	sqt.ok(re_match("a{2,}b", "aaab") == RE_E_OK);
+	sqt.ok(re_match("a{2,}b", "aab") == RE_E_OK);
+	sqt.ok(re_match("a{2,}b", "ab") == RE_E_FAIL);
+	sqt.ok(re_match("a*b", "aaab") == RE_E_OK);
+	sqt.ok(re_match("a{1}", "a") == RE_E_OK);
+	sqt.ok(re_match("a{2}", "a") == RE_E_FAIL);
+	sqt.ok(re_match("a{2}", "aa") == RE_E_OK);
+	sqt.ok(re_match("a{2}", "aaa") == RE_E_OK);
+	sqt.ok(re_match("a{3}", "aa") == RE_E_FAIL);
+	sqt.ok(re_match("a{3}", "aaa") == RE_E_OK);
+	sqt.ok(re_match("a{3}", "aaaa") == RE_E_OK);
+	sqt.ok(re_match("a{2,4}", "a") == RE_E_FAIL);
+	sqt.ok(re_match("a{2,4}", "aa") == RE_E_OK);
+	sqt.ok(re_match("a{2,4}", "aaa") == RE_E_OK);
+	sqt.ok(re_match("a{2,4}", "aaaa") == RE_E_OK);
+	sqt.ok(re_match("a{2,4}", "aaaaa") == RE_E_OK);
+	sqt.ok(re_match("ab{2,4}", "a") == RE_E_FAIL);
+	sqt.ok(re_match("ab{2,4}", "ab") == RE_E_FAIL);
+	sqt.ok(re_match("ab{2,4}", "abb") == RE_E_OK);
+	sqt.ok(re_match("ab{2,4}", "abbb") == RE_E_OK);
+	sqt.ok(re_match("ab{2,4}", "abbbb") == RE_E_OK);
+	sqt.ok(re_match("ab{2,4}", "abbbbb") == RE_E_OK);
+	sqt.ok(re_match("ab{2,4}", "aabbbb") == RE_E_OK);
+	sqt.ok(re_match("a{,2}b{2,4}", "aabbbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{0,2}b{2,4}", "aabbbb") == RE_E_OK); 
+	sqt.ok(re_match("a)", "") == RE_E_SYNTAX);
+	//sqt.ok(re_match("(a+b+)?", "") == RE_E_OK);
+	sqt.ok(re_match("(a{2}b+)*c", "aabc") == RE_E_OK);
+	//sqt.ok(re_match("(a{2}b+)*c", "c") == RE_E_OK);
+	sqt.ok(re_match("(a{2}b+)*", "aab") == RE_E_OK);
+	//sqt.ok(re_match("(a{2}b+)*", "") == RE_E_OK);
+	sqt.ok(re_match("(a{2}b+)?", "aab") == RE_E_OK);
+	//sqt.ok(re_match("(a{2}b+)?", "") == RE_E_OK);
+	sqt.ok(re_match("(ab){2,4}", "a") == RE_E_FAIL);
+	sqt.ok(re_match("(ab){2,4}", "b") == RE_E_FAIL);
+	sqt.ok(re_match("(ab){2,4}", "") == RE_E_FAIL);
+	sqt.ok(re_match("(ab){2,4}", "ab") == RE_E_FAIL);
+	sqt.ok(re_match("(ab){2,4}", "abab") == RE_E_OK);
+	sqt.ok(re_match("(ab){2,4}", "ababab") == RE_E_OK);
+	sqt.ok(re_match("(ab){2,4}", "abababab") == RE_E_OK);
+	sqt.ok(re_match("(ab){2,4}", "ababababab") == RE_E_OK);
+	sqt.ok(re_match("ab", "ab") == RE_E_OK);
+	sqt.ok(re_match("ab", "abab") == RE_E_OK);
+	sqt.ok(re_match("(ab)", "ab") == RE_E_OK);
+	sqt.ok(re_match("(ab)", "abab") == RE_E_OK);
+	sqt.ok(re_match("(ab){1}", "ab") == RE_E_OK);
+	sqt.ok(re_match("(ab){1}", "abab") == RE_E_OK);
+	sqt.ok(re_match("(ab){1,1}", "ab") == RE_E_OK);
+	sqt.ok(re_match("(ab){1,1}", "abab") == RE_E_OK);
+	//sqt.ok(re_match("(ab){1}{1,1}", "ab") == RE_E_OK);
+	sqt.ok(re_match("(ab){1}{1,1}", "abab") == RE_E_FAIL);
+	sqt.ok(re_match("((ab){2,4}c)+", "") == RE_E_FAIL);
+	//sqt.ok(re_match("(((ab){2,4}c)+)?", "") == RE_E_OK);
+	//sqt.ok(re_match("((ab){2,4}c)+?", "") == RE_E_OK);
+	sqt.ok(re_match("((ab){2,4}c)+", "ababc") == RE_E_OK);
+	sqt.ok(re_match("((ab){2,4}c)+", "ababcabababc") == RE_E_OK);
+	//sqt.ok(re_match("((ab){2,4}c)+?", "ababcabababc") == RE_E_OK);
+	//sqt.ok(re_match("((ab){2,4}c)+?", "") == RE_E_OK);
+	sqt.ok(re_match("a{0,1}", "a") == RE_E_OK);
+	sqt.ok(re_match("a{1,1}", "a") == RE_E_OK);
+	sqt.ok(re_match("a{0,}", "a") == RE_E_OK);
+	sqt.ok(re_match("a{,}", "a") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{,}", "a") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{,g}", "a") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{,1g}", "a") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{0,g}", "a") == RE_E_SYNTAX);
+	sqt.ok(re_match("a{0,1g}", "a") == RE_E_SYNTAX);
+	//sqt.ok(re_match("a{1,0}", "a") == RE_E_SYNTAX);
+	//sqt.ok(re_match("a{1,0}", "a") == RE_E_SYNTAX);
+	//sqt.ok(re_match("a{0}", "a") == RE_E_FAIL);
+	//sqt.ok(re_match("a{0,0}", "a") == RE_E_FAIL);
+	//sqt.ok(re_match("a++", "aaa") == RE_E_OK);
+	//sqt.ok(re_match("a??", "") == RE_E_OK);
+	//sqt.ok(re_match("a**", "") == RE_E_OK);
+	//sqt.ok(re_match("a?*", "") == RE_E_OK);
+	//sqt.ok(re_match("a*?", "") == RE_E_OK);
+	sqt.ok(re_match("a?", "a") == RE_E_OK);
+	//sqt.ok(re_match("a??", "a") == RE_E_OK);
+	//sqt.ok(re_match("a**", "a") == RE_E_OK);
+	//sqt.ok(re_match("a?*", "a") == RE_E_OK);
+	//sqt.ok(re_match("a*?", "a") == RE_E_OK);
+	sqt.ok(re_match("a?", "aa") == RE_E_OK);
+	//sqt.ok(re_match("a??", "aa") == RE_E_FAIL);
+	//sqt.ok(re_match("a**", "aa") == RE_E_OK);
+	//sqt.ok(re_match("a?*", "aa") == RE_E_OK);
+	//sqt.ok(re_match("a*?", "aa") == RE_E_OK);
+	//sqt.ok(re_match("a+?", "") == RE_E_OK);
+	//sqt.ok(re_match("a?+", "") == RE_E_OK);
+	//sqt.ok(re_match("a+?b", "b") == RE_E_OK);
+	sqt.ok(re_match("a\\rb", "a\rb") == RE_E_OK);
+	sqt.ok(re_match("a+\n+b+", "aa\n\nbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("a+\\n+b+", "aa\n\nbb") == RE_E_OK);
+	//sqt.ok(re_match("a+\\5+b+", "aa\n\nbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("a+\\(+b+", "aa((bb") == RE_E_OK);
+	sqt.ok(re_match("[a]+", "a") == RE_E_OK);
+	sqt.ok(re_match("[a]+", "aa") == RE_E_OK);
+	sqt.ok(re_match("[a]+", "aaa") == RE_E_OK);
+	sqt.ok(re_match("[ba]+", "a") == RE_E_OK);
+	sqt.ok(re_match("[ba]+", "ab") == RE_E_OK);
+	sqt.ok(re_match("[ba]+", "baaa") == RE_E_OK);
+	sqt.ok(re_match("[ba]+", "c") == RE_E_FAIL);
+	sqt.ok(re_match("[\\n]+", "\n") == RE_E_OK);
+	sqt.ok(re_match("[\\n]+", "\n\n") == RE_E_OK);
+	sqt.ok(re_match("[\\n]+", "\n\n\n") == RE_E_OK);
+	sqt.ok(re_match("[a-c]+", "aaa") == RE_E_OK);
+	sqt.ok(re_match("[a-c]+", "ccc") == RE_E_OK);
+	sqt.ok(re_match("[a-c]+", "bbb") == RE_E_OK);
+	sqt.ok(re_match("[a", "bbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("[a-", "bbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("[a-b", "bbb") == RE_E_SYNTAX);
+	sqt.ok(re_match("[a-\\b", "bbb") == RE_E_NOTIMPL);
+	//sqt.ok(re_match("a\\bb", "bbb") == RE_E_NOTIMPL);
+	sqt.ok(re_match("[a-\\n", "bbb") == RE_E_NOTIMPL);
+	sqt.ok(re_match("[\\n-a", "bbb") == RE_E_NOTIMPL);
+	//sqt.ok(re_match("[-]", "bbb") == RE_E_NOTIMPL);
+	//sqt.ok(re_match("[a-b-c]", "bbb") == RE_E_NOTIMPL);
+	sqt.ok(re_match("[a--]", "bbb") == RE_E_NOTIMPL);
+	//sqt.ok(re_match("[a-z-[bc]]", "bbb") == RE_E_NOTIMPL);
+	sqt.ok(re_match("0[xX][\\da-fA-F]{1,4}", "0x12a6") == RE_E_OK);
+	//sqt.ok(re_match("0[xX][\\da-fA-F]{1,4}", "0x12ag") == RE_E_FAIL);
+	sqt.ok(re_match("(a|c)+", "aa") == RE_E_OK);
+	sqt.ok(re_match("(a|c)+", "cc") == RE_E_OK);
+	sqt.ok(re_match("(a|c)+", "cccc") == RE_E_OK);
+	sqt.ok(re_match("(a|c)+", "aaaa") == RE_E_OK);
+	sqt.ok(re_match("(a|c)+", "ca") == RE_E_OK);
+	sqt.ok(re_match("(a|c)+", "caca") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c|d)+", "aa") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c|d)+", "bb") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c|d)+", "cc") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c|d)+", "dd") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "aa") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "bb") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "cc") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "abc") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "cba") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "cccc") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "aa") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "aaaa") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "ca") == RE_E_OK);
+	sqt.ok(re_match("(a|b|c)+", "caca") == RE_E_OK);
+	sqt.ok(re_match("(ab|cd|ed)+", "abcded") == RE_E_OK);
+	//sqt.ok(re_match("(?:ab)", "a") == RE_E_SYNTAX);
+	//sqt.ok(re_match("[^a]*", "") == RE_E_OK);
+	sqt.ok(re_match("[^a]+", "") == RE_E_FAIL);
+	sqt.ok(re_match("[^a]*", "b") == RE_E_OK);
+	sqt.ok(re_match("[^a]*", "bcbd") == RE_E_OK);
+	//sqt.ok(re_match("[^a]*", "a") == RE_E_FAIL);
+	sqt.ok(re_match("[^a]*", "bac") == RE_E_OK);
+	sqt.ok(re_match("[^ab]*", "bac") == RE_E_OK);
+	sqt.ok(re_match("[^ab]*", "cded") == RE_E_OK);
+	sqt.ok(re_match("[\\^a]*", "bac") == RE_E_OK);
+	sqt.ok(re_match("[\\^a]*", "a") == RE_E_OK);
+	sqt.ok(re_match("[\\^a]*", "a^") == RE_E_OK);
+	sqt.ok(re_match("(a|[\\(])+", "a(aa((a") == RE_E_OK);
+	sqt.ok(re_match("(a|[\\[])+", "a[aa[[a") == RE_E_OK);
+	sqt.ok(re_match("(a|[(])+", "a(aa((a") == RE_E_OK);
+	sqt.ok(re_match("(a|[[])+", "a(aa((a") == RE_E_OK);
+	sqt.ok(re_match("\\D*", "bac") == RE_E_OK);
+	sqt.ok(re_match("\\D*", "b0c") == RE_E_OK);
+	sqt.ok(re_match("\\S*", "bac") == RE_E_OK);
+	sqt.ok(re_match("\\S*", "b c") == RE_E_OK);
+	sqt.ok(re_match(".", "") == RE_E_FAIL);
+	sqt.ok(re_match("a.b", "acb") == RE_E_OK);
+	sqt.ok(re_match("a.b", "a\nb") == RE_E_OK);
+});
+
 sqt.run("table", function(){
 	
 	local t = table_new(10);
@@ -700,6 +932,8 @@ sqt.run("array", function(){
 	t = ["one"];
 	sqt.ok(t.concat(",") == "one");
 
+	t = ["one", "two"];
+	sqt.ok(t.concat(", ") == "one, two");
 });
 
 //	core/string/index_of_start.wren
@@ -1049,7 +1283,6 @@ sqt.run("number", function(){
 	//sqt.ok("".tointeger() == null);
 	//sqt.ok("prefix1.2".tofloat() == null);
 	//sqt.ok("1.2suffix".tofloat() == null);
-
 	sqt.ok("1.2suffix".tofloat() == 1.2); // ??????
 	sqt.ok("1.2suffix".tointeger() == 1); // ?????