diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2025-04-06 14:19:14 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2025-04-06 14:19:14 +0200 |
| commit | cdc56dc6910368384749055dcae7d4264354d5fa (patch) | |
| tree | 9d67dd70eccc9e14a91f9fde53127c2aa1f59cbe /tests/core | |
| parent | eecc6c1f18a71bc7de79df2fe73638cfb49914d9 (diff) | |
Add iterator for `core:text/regex`.
Usage:
```odin
haystack := `xxfoobarxfoobarxx`
pattern := `f(o)ob(ar)`
it := regex.create_iterator(haystack, pattern, {.Global}) or_return
defer regex.destroy(it)
for capture in regex.match(&it) {
fmt.println(capture)
}
```
Diffstat (limited to 'tests/core')
| -rw-r--r-- | tests/core/text/regex/test_core_text_regex.odin | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index 3e7145406..755c99634 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -72,6 +72,18 @@ expect_error :: proc(t: ^testing.T, pattern: string, expected_error: typeid, fla testing.expect_value(t, variant_ti, expected_ti, loc = loc) } +check_capture :: proc(t: ^testing.T, got, expected: regex.Capture, loc := #caller_location) { + testing.expect_value(t, len(got.pos), len(got.groups), loc = loc) + testing.expect_value(t, len(got.pos), len(expected.pos), loc = loc) + testing.expect_value(t, len(got.groups), len(expected.groups), loc = loc) + + if len(got.pos) == len(expected.pos) { + for i in 0..<len(got.pos) { + testing.expect_value(t, got.pos[i], expected.pos[i], loc = loc) + testing.expect_value(t, got.groups[i], expected.groups[i], loc = loc) + } + } +} @test test_concatenation :: proc(t: ^testing.T) { @@ -1080,3 +1092,48 @@ test_preallocated_capture :: proc(t: ^testing.T) { testing.expect_value(t, groups, "") } } + +Iterator_Test :: struct { + haystack: string, + pattern: string, + flags: regex.Flags, + expected: []regex.Capture, +} + +iterator_vectors := []Iterator_Test{ + { + `xxab32ab52xx`, `(ab\d{1})`, {.Global}, + { + {pos = {{2, 5}, {2, 5}}, groups = {"ab3", "ab3"}}, + {pos = {{6, 9}, {6, 9}}, groups = {"ab5", "ab5"}}, + }, + }, + { + `xxfoobarxfoobarxx`, `f(o)ob(ar)`, {.Global}, + { + {pos = {{2, 8}, {3, 4}, {6, 8}}, groups = {"foobar", "o", "ar"}}, + {pos = {{9, 15}, {10, 11}, {13, 15}}, groups = {"foobar", "o", "ar"}}, + }, + } +} + +@test +test_match_iterator :: proc(t: ^testing.T) { + for test in iterator_vectors { + it, err := regex.create_iterator(test.haystack, test.pattern, test.flags) + defer regex.destroy(it) + + testing.expect_value(t, err, nil) + (err == nil) or_continue + + count: int + for capture in regex.match(&it) { + if count > len(test.expected) { + break + } + check_capture(t, capture, test.expected[count]) + count += 1 + } + testing.expect_value(t, count, len(test.expected)) + } +}
\ No newline at end of file |