# 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