| # Basic multi-regex tests. | 
 |  | 
 | [[test]] | 
 | name = "basic10" | 
 | regex = ["a", "a"] | 
 | haystack = "a" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 1, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic10-leftmost-first" | 
 | regex = ["a", "a"] | 
 | haystack = "a" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "basic20" | 
 | regex = ["a", "a"] | 
 | haystack = "ba" | 
 | matches = [ | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 1, span = [1, 2] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic30" | 
 | regex = ["a", "b"] | 
 | haystack = "a" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic40" | 
 | regex = ["a", "b"] | 
 | haystack = "b" | 
 | matches = [ | 
 |   { id = 1, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic50" | 
 | regex = ["a|b", "b|a"] | 
 | haystack = "b" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 1, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic60" | 
 | regex = ["foo", "oo"] | 
 | haystack = "foo" | 
 | matches = [ | 
 |   { id = 0, span = [0, 3] }, | 
 |   { id = 1, span = [1, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic60-leftmost-first" | 
 | regex = ["foo", "oo"] | 
 | haystack = "foo" | 
 | matches = [ | 
 |   { id = 0, span = [0, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "basic61" | 
 | regex = ["oo", "foo"] | 
 | haystack = "foo" | 
 | matches = [ | 
 |   { id = 1, span = [0, 3] }, | 
 |   { id = 0, span = [1, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic61-leftmost-first" | 
 | regex = ["oo", "foo"] | 
 | haystack = "foo" | 
 | matches = [ | 
 |   { id = 1, span = [0, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "basic70" | 
 | regex = ["abcd", "bcd", "cd", "d"] | 
 | haystack = "abcd" | 
 | matches = [ | 
 |   { id = 0, span = [0, 4] }, | 
 |   { id = 1, span = [1, 4] }, | 
 |   { id = 2, span = [2, 4] }, | 
 |   { id = 3, span = [3, 4] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic71" | 
 | regex = ["bcd", "cd", "d", "abcd"] | 
 | haystack = "abcd" | 
 | matches = [ | 
 |   { id = 3, span = [0, 4] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "basic80" | 
 | regex = ["^foo", "bar$"] | 
 | haystack = "foo" | 
 | matches = [ | 
 |   { id = 0, span = [0, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic81" | 
 | regex = ["^foo", "bar$"] | 
 | haystack = "foo bar" | 
 | matches = [ | 
 |   { id = 0, span = [0, 3] }, | 
 |   { id = 1, span = [4, 7] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic82" | 
 | regex = ["^foo", "bar$"] | 
 | haystack = "bar" | 
 | matches = [ | 
 |   { id = 1, span = [0, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic90" | 
 | regex = ["[a-z]+$", "foo"] | 
 | haystack = "01234 foo" | 
 | matches = [ | 
 |   { id = 0, span = [8, 9] }, | 
 |   { id = 0, span = [7, 9] }, | 
 |   { id = 0, span = [6, 9] }, | 
 |   { id = 1, span = [6, 9] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic91" | 
 | regex = ["[a-z]+$", "foo"] | 
 | haystack = "foo 01234" | 
 | matches = [ | 
 |   { id = 1, span = [0, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic100" | 
 | regex = [".*?", "a"] | 
 | haystack = "zzza" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 0, span = [0, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 |   { id = 0, span = [2, 3] }, | 
 |   { id = 0, span = [1, 3] }, | 
 |   { id = 0, span = [0, 3] }, | 
 |   { id = 0, span = [4, 4] }, | 
 |   { id = 0, span = [3, 4] }, | 
 |   { id = 0, span = [2, 4] }, | 
 |   { id = 0, span = [1, 4] }, | 
 |   { id = 0, span = [0, 4] }, | 
 |   { id = 1, span = [3, 4] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic101" | 
 | regex = [".*", "a"] | 
 | haystack = "zzza" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 0, span = [0, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 |   { id = 0, span = [2, 3] }, | 
 |   { id = 0, span = [1, 3] }, | 
 |   { id = 0, span = [0, 3] }, | 
 |   { id = 0, span = [4, 4] }, | 
 |   { id = 0, span = [3, 4] }, | 
 |   { id = 0, span = [2, 4] }, | 
 |   { id = 0, span = [1, 4] }, | 
 |   { id = 0, span = [0, 4] }, | 
 |   { id = 1, span = [3, 4] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic102" | 
 | regex = [".*", "a"] | 
 | haystack = "zzz" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 0, span = [0, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 |   { id = 0, span = [2, 3] }, | 
 |   { id = 0, span = [1, 3] }, | 
 |   { id = 0, span = [0, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic110" | 
 | regex = ['\ba\b'] | 
 | haystack = "hello a bye" | 
 | matches = [ | 
 |   { id = 0, span = [6, 7] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic111" | 
 | regex = ['\ba\b', '\be\b'] | 
 | haystack = "hello a bye e" | 
 | matches = [ | 
 |   { id = 0, span = [6, 7] }, | 
 |   { id = 1, span = [12, 13] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic120" | 
 | regex = ["a"] | 
 | haystack = "a" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic121" | 
 | regex = [".*a"] | 
 | haystack = "a" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic122" | 
 | regex = [".*a", "β"] | 
 | haystack = "β" | 
 | matches = [ | 
 |   { id = 1, span = [0, 2] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "basic130" | 
 | regex = ["ab", "b"] | 
 | haystack = "ba" | 
 | matches = [ | 
 |   { id = 1, span = [0, 1] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | # These test cases where one of the regexes matches the empty string. | 
 |  | 
 | [[test]] | 
 | name = "empty10" | 
 | regex = ["", "a"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 1, span = [0, 1] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty10-leftmost-first" | 
 | regex = ["", "a"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty11" | 
 | regex = ["a", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 1, span = [1, 1] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty11-leftmost-first" | 
 | regex = ["a", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 1] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty20" | 
 | regex = ["", "b"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 1, span = [1, 2] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty20-leftmost-first" | 
 | regex = ["", "b"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty21" | 
 | regex = ["b", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 1, span = [1, 1] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty21-leftmost-first" | 
 | regex = ["b", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty22" | 
 | regex = ["(?:)", "b"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 1, span = [1, 2] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty23" | 
 | regex = ["b", "(?:)"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 1, span = [1, 1] }, | 
 |   { id = 0, span = [1, 2] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty30" | 
 | regex = ["", "z"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty30-leftmost-first" | 
 | regex = ["", "z"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 0, span = [0, 0] }, | 
 |   { id = 0, span = [1, 1] }, | 
 |   { id = 0, span = [2, 2] }, | 
 |   { id = 0, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty31" | 
 | regex = ["z", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 1, span = [1, 1] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty31-leftmost-first" | 
 | regex = ["z", ""] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [0, 0] }, | 
 |   { id = 1, span = [1, 1] }, | 
 |   { id = 1, span = [2, 2] }, | 
 |   { id = 1, span = [3, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | [[test]] | 
 | name = "empty40" | 
 | regex = ["c(?:)", "b"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [1, 2] }, | 
 |   { id = 0, span = [2, 3] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "empty40-leftmost-first" | 
 | regex = ["c(?:)", "b"] | 
 | haystack = "abc" | 
 | matches = [ | 
 |   { id = 1, span = [1, 2] }, | 
 |   { id = 0, span = [2, 3] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 |  | 
 | # These test cases where there are no matches. | 
 |  | 
 | [[test]] | 
 | name = "nomatch10" | 
 | regex = ["a", "a"] | 
 | haystack = "b" | 
 | matches = [] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "nomatch20" | 
 | regex = ["^foo", "bar$"] | 
 | haystack = "bar foo" | 
 | matches = [] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "nomatch30" | 
 | regex = [] | 
 | haystack = "a" | 
 | matches = [] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | [[test]] | 
 | name = "nomatch40" | 
 | regex = ["^rooted$", '\.log$'] | 
 | haystack = "notrooted" | 
 | matches = [] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 |  | 
 | # These test multi-regex searches with capture groups. | 
 | # | 
 | # NOTE: I wrote these tests in the course of developing a first class API for | 
 | # overlapping capturing group matches, but ultimately removed that API because | 
 | # the semantics for overlapping matches aren't totally clear. However, I've | 
 | # left the tests because I believe the semantics for these patterns are clear | 
 | # and because we can still test our "which patterns matched" APIs with them. | 
 |  | 
 | [[test]] | 
 | name = "caps-010" | 
 | regex = ['^(\w+) (\w+)$', '^(\S+) (\S+)$'] | 
 | haystack = "Bruce Springsteen" | 
 | matches = [ | 
 |   { id = 0, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 |   { id = 1, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 | unicode = false | 
 | utf8 = false | 
 |  | 
 | [[test]] | 
 | name = "caps-020" | 
 | regex = ['^(\w+) (\w+)$', '^[A-Z](\S+) [A-Z](\S+)$'] | 
 | haystack = "Bruce Springsteen" | 
 | matches = [ | 
 |   { id = 0, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 |   { id = 1, spans = [[0, 17], [1, 5], [7, 17]] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 | unicode = false | 
 | utf8 = false | 
 |  | 
 | [[test]] | 
 | name = "caps-030" | 
 | regex = ['^(\w+) (\w+)$', '^([A-Z])(\S+) ([A-Z])(\S+)$'] | 
 | haystack = "Bruce Springsteen" | 
 | matches = [ | 
 |   { id = 0, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 |   { id = 1, spans = [[0, 17], [0, 1], [1, 5], [6, 7], [7, 17]] }, | 
 | ] | 
 | match-kind = "all" | 
 | search-kind = "overlapping" | 
 | unicode = false | 
 | utf8 = false | 
 |  | 
 | [[test]] | 
 | name = "caps-110" | 
 | regex = ['(\w+) (\w+)', '(\S+) (\S+)'] | 
 | haystack = "Bruce Springsteen" | 
 | matches = [ | 
 |   { id = 0, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 | unicode = false | 
 | utf8 = false | 
 |  | 
 | [[test]] | 
 | name = "caps-120" | 
 | regex = ['(\w+) (\w+)', '(\S+) (\S+)'] | 
 | haystack = "&ruce $pringsteen" | 
 | matches = [ | 
 |   { id = 1, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 | unicode = false | 
 | utf8 = false | 
 |  | 
 | [[test]] | 
 | name = "caps-121" | 
 | regex = ['(\w+) (\w+)', '(\S+) (\S+)'] | 
 | haystack = "&ruce $pringsteen Foo Bar" | 
 | matches = [ | 
 |   { id = 1, spans = [[0, 17], [0, 5], [6, 17]] }, | 
 |   { id = 0, spans = [[18, 25], [18, 21], [22, 25]] }, | 
 | ] | 
 | match-kind = "leftmost-first" | 
 | search-kind = "leftmost" | 
 | unicode = false | 
 | utf8 = false |