hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

+test.ha (6032B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 type testcase = (str, str, bool, []flag);
      5 
      6 const testcases: [_]testcase = [
      7 	// homegrown tests
      8 	("a", "a", true, []),
      9 	("b", "b", true, []),
     10 	("ε", "ε", true, []),
     11 	("\0", "\0", true, []),
     12 	("abcde", "abcde", true, []),
     13 	("aaa", "bbb", false, []),
     14 	("わたし", "わたし", true, []),
     15 	("わした", "わたし", false, []),
     16 	("わaし", "わたし", false, []),
     17 
     18 	("ab*cde", "abcde", true, []),
     19 	("g*a", "gordana", true, []),
     20 	("ab*cde*foo*bar", "abcdefooba", false, []),
     21 	("*", "foo", true, []),
     22 	("aa*", "aafoo", true, []),
     23 	("bb*", "foo", false, []),
     24 	("*cc", "foocc", true, []),
     25 	("*dd", "foo", false, []),
     26 	("ra**ra", "rarara", true, []),
     27 	("x*yy*x", "xxyyyyyxxx", true, []),
     28 	("*", "*", true, []),
     29 	("*", "", true, []),
     30 	("****", "a", true, []),
     31 	("**a**", "a", true, []),
     32 	("****", "", true, []),
     33 	("*", "わたし", true, []),
     34 
     35 	("?", "ε", true, []),
     36 	("?", "\0", true, []),
     37 	("?", "*", true, []),
     38 	("?", "", false, []),
     39 	("??", "a", false, []),
     40 	("??", "abc", false, []),
     41 	("?aa", "bbb", false, []),
     42 	("わ?し", "わたし", true, []),
     43 	("???", "わたし", true, []),
     44 
     45 	("**?**", "", false, []),
     46 	("*?*?*?*?", "abcd", true, []),
     47 	("*?*?*?*?", "abc", false, []),
     48 
     49 	("[b]", "b", true, []),
     50 	("a[b]c", "abc", true, []),
     51 	("a[b]c", "axc", false, []),
     52 	("[a-c]", "b", true, []),
     53 	("[a-z]", "a", true, []),
     54 	("[c-a]", "b", false, []),
     55 	("x[a-c]y", "xay", true, []),
     56 	("x[a-c]y", "xby", true, []),
     57 	("x[a-c]y", "xcy", true, []),
     58 	("x[a-c]y", "xzy", false, []),
     59 	("x[a-c]y", "xy", false, []),
     60 	("[a-c]*[a-c]", "axxxb", true, []),
     61 	("わ[た]し", "わたし", true, []),
     62 
     63 	("[-]", "-", true, []),
     64 	("[.]", ".", true, []),
     65 	("[:ias]", ":", true, []),
     66 	("[-]", "a", false, []),
     67 	("[-ac]", "a", true, []),
     68 	("[-ac]", "-", true, []),
     69 	("[-ac]", "b", false, []),
     70 	("[ac-]", "a", true, []),
     71 	("[ac-]", "-", true, []),
     72 	("[ac-]", "b", false, []),
     73 
     74 	("[.a.]", "a", false, []),
     75 
     76 	("[[:alnum:]]", "7", true, []),
     77 	("[[:alpha:]]", "[", false, []),
     78 	("[[:alpha:]]", "[[", false, []),
     79 	("[[alpha:]]", "a]", true, []),
     80 	("[[alpha:]]", ":]", true, []),
     81 	("[[:alpha:]]", "a", true, []),
     82 	("[[:blank:]]", " ", true, []),
     83 	("[[:alnum:]]a", "a]a", false, []),
     84 	("[[:alnum:][[:digit:]]", "a", true, []),
     85 
     86 	("[!b]", "b", false, []),
     87 	("a[!b]c", "abc", false, []),
     88 	("a[!b]c", "axc", true, []),
     89 	("[!a-c]", "b", false, []),
     90 	("[!c-a]", "b", true, []),
     91 	("x[!a-c]y", "xay", false, []),
     92 	("x[!a-c]y", "xby", false, []),
     93 	("x[!a-c]y", "xcy", false, []),
     94 	("x[!a-c]y", "xzy", true, []),
     95 	("x[!a-c]y", "xy", false, []),
     96 	("[!a-c]*[!a-c]", "axxxb", false, []),
     97 	("わ[!た]し", "わたし", false, []),
     98 
     99 	("[!-]", "-", false, []),
    100 	("[!-]", "a", true, []),
    101 	("[!-ac]", "a", false, []),
    102 	("[!-ac]", "-", false, []),
    103 	("[!-ac]", "b", true, []),
    104 
    105 	("[![:alnum:]]", "a", false, []),
    106 	("[![:alpha:]]", "[", true, []),
    107 	("[![:alnum:]]a", "a]a", false, []),
    108 	("[![:alpha:]]a", "[a", true, []),
    109 	("[![:alnum:][:digit:]]", "a", false, []),
    110 
    111 	(".", ".", true, [flag::PERIOD]),
    112 	("*", ".", false, [flag::PERIOD]),
    113 	("?", ".", false, [flag::PERIOD]),
    114 	("[.]", ".", false, [flag::PERIOD]),
    115 	(".*", ".asdf", true, [flag::PERIOD]),
    116 	(".*", "asdf", false, [flag::PERIOD]),
    117 
    118 	("\\", "\\", true, [flag::NOESCAPE]),
    119 	("\\*", "\\asdf", true, [flag::NOESCAPE]),
    120 
    121 	// adapted from musl tests
    122 	("*.c", "foo.c", true, []),
    123 	("*.c", ".c", true, []),
    124 	("*.a", "foo.c", false, []),
    125 	("*.c", ".foo.c", true, []),
    126 	("a\\*.c", "ax.c", false, []),
    127 	("a[xy].c", "ax.c", true, []),
    128 	("a[!y].c", "ax.c", true, []),
    129 	("-O[01]", "-O1", true, []),
    130 	("[[?*\\]", "\\", true, []),
    131 	("[]?*\\]", "]", true, []),
    132 	("[!]a-]", "b", true, []),
    133 	("[]-_]", "^", true, []),
    134 	("[!]-_]", "X", true, []),
    135 	("??", "-", false, []),
    136 	("[*]/b", "a/b", false, []),
    137 	("[*]/b", "*/b", true, []),
    138 	("[?]/b", "a/b", false, []),
    139 	("[?]/b", "?/b", true, []),
    140 	("[[a]/b", "a/b", true, []),
    141 	("[[a]/b", "[/b", true, []),
    142 	("\\*/b", "a/b", false, []),
    143 	("\\*/b", "*/b", true, []),
    144 	("\\?/b", "a/b", false, []),
    145 	("\\?/b", "?/b", true, []),
    146 	("[/b", "[/b", false, []),
    147 	("\\[/b", "[/b", true, []),
    148 	("??""/b", "aa/b", true, []),
    149 	("???b", "aa/b", true, []),
    150 	("a[/]b", "a/b", true, []),
    151 	("*[/]b", "a", false, []),
    152 	("[![:d-d]", "b", false, []),
    153 	("[[:d-d]", "[", false, []),
    154 	("[![:d-d]", "[", false, []),
    155 	("[a-z]/[a-z]", "a/b", true, [flag::PATHNAME]),
    156 	("a[/]b", "a/b", false, [flag::PATHNAME]),
    157 	("*", "a/b", false, [flag::PATHNAME]),
    158 	("*[/]b", "a/b", false, [flag::PATHNAME]),
    159 	("*[b]", "a/b", false, [flag::PATHNAME]),
    160 	("a[a/z]*.c", "a/x.c", false, [flag::PATHNAME]),
    161 	("a/*.c", "a/x.c", true, [flag::PATHNAME]),
    162 	("a*.c", "a/x.c", false, [flag::PATHNAME]),
    163 	("*/foo", "/foo", true, [flag::PATHNAME]),
    164 	("*.c", ".foo.c", false, [flag::PERIOD]),
    165 	("*.c", "foo.c", true, [flag::PERIOD]),
    166 	("a\\*.c", "a*.c", false, [flag::NOESCAPE]),
    167 	("???b", "aa/b", false, [flag::PATHNAME]),
    168 	("?a/b", ".a/b", false, [flag::PATHNAME, flag::PERIOD]),
    169 	("a/?b", "a/.b", false, [flag::PATHNAME, flag::PERIOD]),
    170 	("*a/b", ".a/b", false, [flag::PATHNAME, flag::PERIOD]),
    171 	("a/*b", "a/.b", false, [flag::PATHNAME, flag::PERIOD]),
    172 	("[.]a/b", ".a/b", false, [flag::PATHNAME, flag::PERIOD]),
    173 	("a/[.]b", "a/.b", false, [flag::PATHNAME, flag::PERIOD]),
    174 	("*/?", "a/b", true, [flag::PATHNAME, flag::PERIOD]),
    175 	("?/*", "a/b", true, [flag::PATHNAME, flag::PERIOD]),
    176 	(".*/?", ".a/b", true, [flag::PATHNAME, flag::PERIOD]),
    177 	("*/.?", "a/.b", true, [flag::PATHNAME, flag::PERIOD]),
    178 	("*/*", "a/.b", false, [flag::PATHNAME, flag::PERIOD]),
    179 	("*?*/*", "a/.b", true, [flag::PERIOD]),
    180 	("*[.]/b", "a./b", true, [flag::PATHNAME, flag::PERIOD]),
    181 	("*[[:alpha:]]/*[[:alnum:]]", "a/b", true, [flag::PATHNAME]),
    182 	("a?b", "a.b", true, [flag::PATHNAME, flag::PERIOD]),
    183 	("a*b", "a.b", true, [flag::PATHNAME, flag::PERIOD]),
    184 	("a[.]b", "a.b", true, [flag::PATHNAME, flag::PERIOD]),
    185 ];
    186 
    187 @test fn fnmatch() void = {
    188 	for (let tc .. testcases) {
    189 		let flags = flag::NONE;
    190 		for (let fl .. tc.3) {
    191 			flags |= fl;
    192 		};
    193 		assert(fnmatch(tc.0, tc.1, flags) == tc.2);
    194 	};
    195 
    196 };