mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-23 16:08:43 +00:00
157 lines
5.4 KiB
C
157 lines
5.4 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "lib/minunit.h"
|
|
#include "lib/mlrutil.h"
|
|
#include "lib/mlrregex.h"
|
|
|
|
int tests_run = 0;
|
|
int tests_failed = 0;
|
|
int assertions_run = 0;
|
|
int assertions_failed = 0;
|
|
|
|
// ----------------------------------------------------------------
|
|
static char * test_save_regex_captures() {
|
|
|
|
// Capture-groups \1 through \9 supported, along with entire-string match in \0
|
|
const size_t nmatchmax = 10;
|
|
regmatch_t matches[nmatchmax];
|
|
string_array_t* pregex_captures = NULL;
|
|
regex_t regex;
|
|
|
|
char* input = "abcde";
|
|
char* sregex = "abcde";
|
|
regcomp_or_die(®ex, sregex, 0);
|
|
regmatch_or_die(®ex, input, nmatchmax, matches);
|
|
save_regex_captures(&pregex_captures, input, matches, nmatchmax);
|
|
mu_assert_lf(pregex_captures != NULL);
|
|
mu_assert_lf(pregex_captures->length == 1);
|
|
mu_assert_lf(pregex_captures->strings[0] != NULL);
|
|
mu_assert_lf(streq(pregex_captures->strings[0], "abcde"));
|
|
regfree(®ex);
|
|
|
|
input = "abcde";
|
|
sregex = "a(.*)e";
|
|
regcomp_or_die(®ex, sregex, 0);
|
|
regmatch_or_die(®ex, input, nmatchmax, matches);
|
|
save_regex_captures(&pregex_captures, input, matches, nmatchmax);
|
|
mu_assert_lf(pregex_captures->length == 2);
|
|
mu_assert_lf(pregex_captures->strings[0] != NULL);
|
|
mu_assert_lf(streq(pregex_captures->strings[1], "bcd"));
|
|
regfree(®ex);
|
|
|
|
input = "abcde";
|
|
sregex = "a(b)(.)(d)e";
|
|
regcomp_or_die(®ex, sregex, 0);
|
|
regmatch_or_die(®ex, input, nmatchmax, matches);
|
|
save_regex_captures(&pregex_captures, input, matches, nmatchmax);
|
|
mu_assert_lf(pregex_captures->length == 4);
|
|
mu_assert_lf(pregex_captures->strings[0] != NULL);
|
|
mu_assert_lf(streq(pregex_captures->strings[1], "b"));
|
|
mu_assert_lf(streq(pregex_captures->strings[2], "c"));
|
|
mu_assert_lf(streq(pregex_captures->strings[3], "d"));
|
|
regfree(®ex);
|
|
|
|
input = "abcdefghij";
|
|
sregex = "(a)(b)(c)(d)(e)(f)(g)(h)(i)";
|
|
regcomp_or_die(®ex, sregex, 0);
|
|
regmatch_or_die(®ex, input, nmatchmax, matches);
|
|
save_regex_captures(&pregex_captures, input, matches, nmatchmax);
|
|
mu_assert_lf(pregex_captures->length == 10);
|
|
mu_assert_lf(pregex_captures->strings[0] != NULL);
|
|
mu_assert_lf(streq(pregex_captures->strings[1], "a"));
|
|
mu_assert_lf(streq(pregex_captures->strings[2], "b"));
|
|
mu_assert_lf(streq(pregex_captures->strings[3], "c"));
|
|
mu_assert_lf(streq(pregex_captures->strings[4], "d"));
|
|
mu_assert_lf(streq(pregex_captures->strings[5], "e"));
|
|
mu_assert_lf(streq(pregex_captures->strings[6], "f"));
|
|
mu_assert_lf(streq(pregex_captures->strings[7], "g"));
|
|
mu_assert_lf(streq(pregex_captures->strings[8], "h"));
|
|
mu_assert_lf(streq(pregex_captures->strings[9], "i"));
|
|
regfree(®ex);
|
|
|
|
string_array_free(pregex_captures);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
static char * test_interpolate_regex_captures() {
|
|
int was_allocated = FALSE;
|
|
|
|
char* output = interpolate_regex_captures("hello", NULL, &was_allocated);
|
|
mu_assert_lf(streq(output, "hello"));
|
|
mu_assert_lf(was_allocated == FALSE);
|
|
|
|
string_array_t* psa = string_array_alloc(0);
|
|
output = interpolate_regex_captures("hello", psa, &was_allocated);
|
|
mu_assert_lf(streq(output, "hello"));
|
|
mu_assert_lf(was_allocated == FALSE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("hello", psa, &was_allocated);
|
|
mu_assert_lf(streq(output, "hello"));
|
|
mu_assert_lf(was_allocated == FALSE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("h\\3ello", psa, &was_allocated);
|
|
printf("output=[%s]\n", output);
|
|
mu_assert_lf(streq(output, "hcello"));
|
|
mu_assert_lf(was_allocated == TRUE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("h\\1ello", psa, &was_allocated);
|
|
printf("output=[%s]\n", output);
|
|
mu_assert_lf(streq(output, "haello"));
|
|
mu_assert_lf(was_allocated == TRUE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("h\\4ello", psa, &was_allocated);
|
|
printf("output=[%s]\n", output);
|
|
mu_assert_lf(streq(output, "hello"));
|
|
mu_assert_lf(was_allocated == TRUE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("h\\0ello", psa, &was_allocated);
|
|
printf("output=[%s]\n", output);
|
|
mu_assert_lf(streq(output, "hXello"));
|
|
mu_assert_lf(was_allocated == TRUE);
|
|
string_array_free(psa);
|
|
|
|
psa = string_array_from_line(mlr_strdup_or_die("X,a,b,c"), ',');
|
|
output = interpolate_regex_captures("h\\3e\\1l\\2l\\4o", psa, &was_allocated);
|
|
printf("output=[%s]\n", output);
|
|
mu_assert_lf(streq(output, "hcealblo"));
|
|
mu_assert_lf(was_allocated == TRUE);
|
|
string_array_free(psa);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// ================================================================
|
|
static char * all_tests() {
|
|
mu_run_test(test_save_regex_captures);
|
|
mu_run_test(test_interpolate_regex_captures);
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
printf("TEST_MLRREGEX ENTER\n");
|
|
char *result = all_tests();
|
|
printf("\n");
|
|
if (result != 0) {
|
|
printf("Not all unit tests passed\n");
|
|
}
|
|
else {
|
|
printf("TEST_MLRREGEX: ALL UNIT TESTS PASSED\n");
|
|
}
|
|
printf("Tests passed: %d of %d\n", tests_run - tests_failed, tests_run);
|
|
printf("Assertions passed: %d of %d\n", assertions_run - assertions_failed, assertions_run);
|
|
|
|
return result != 0;
|
|
}
|