+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 };