bootstrap/test/test_validator.h

204 lines
5.0 KiB
C
Raw Normal View History

2023-11-24 17:27:44 +00:00
#ifndef _BOOTSTRAP_TEST_VALIDATOR
#define _BOOTSTRAP_TEST_VALIDATOR
2023-11-26 13:30:44 +00:00
#include <unistd.h>
2023-11-24 17:27:44 +00:00
#include "dyn_array.h"
#include "sput.h"
2023-11-26 13:30:44 +00:00
#include "string_utils.h"
2023-11-24 17:27:44 +00:00
#include "validator.h"
2023-11-24 19:23:52 +00:00
struct TestValidatorFixture {
const char *json;
struct DynArray *prompts;
cJSON *parsed;
2023-11-26 13:30:44 +00:00
struct Config config;
2023-11-24 19:23:52 +00:00
};
static struct TestValidatorFixture *test_validator_setup(const char *json) {
struct TestValidatorFixture *fixture =
malloc(sizeof(struct TestValidatorFixture));
fixture->json = json;
fixture->prompts = 0;
fixture->parsed = cJSON_Parse(json);
2023-11-26 13:30:44 +00:00
char *cwd = getcwd(0, 0);
const char *segments[] = {cwd, "test", "specs"};
char *root_dir = join(sizeof(segments) / sizeof(char *), segments, '/');
fixture->config.cwd = cwd;
fixture->config.root_dir = root_dir;
fixture->config.target = "minimal_spec_json";
2023-11-24 19:23:52 +00:00
return fixture;
}
static void test_validator_teardown(struct TestValidatorFixture *fixture) {
if (fixture->parsed) {
cJSON_Delete(fixture->parsed);
}
2023-11-26 13:30:44 +00:00
free((void *)fixture->config.cwd);
free((void *)fixture->config.root_dir);
2023-11-24 19:23:52 +00:00
free(fixture);
}
static void test_validator_toplevel_not_object() {
2023-11-24 19:23:52 +00:00
struct TestValidatorFixture *fixture = test_validator_setup("[]");
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_TOP_LEVEL_NOT_OBJECT, "top-level not object"
);
error_free(error);
2023-11-24 17:27:44 +00:00
2023-11-24 19:23:52 +00:00
test_validator_teardown(fixture);
}
static void test_validator_field_not_object() {
2023-11-24 19:23:52 +00:00
struct TestValidatorFixture *fixture =
test_validator_setup("{\"key\": \"$UNKNOWN\"}");
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_NOT_OBJECT, "field not object"
);
error_free(error);
2023-11-24 19:23:52 +00:00
test_validator_teardown(fixture);
}
static void test_validator_field_name_leading_digit() {
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"1abc\": {"
2023-11-27 12:03:05 +00:00
" \"type\": \"line\""
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_NAME_INVALID,
"field name leading digit"
);
error_free(error);
test_validator_teardown(fixture);
}
static void test_validator_field_name_non_alnum() {
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"a~bc\": {"
2023-11-27 12:03:05 +00:00
" \"type\": \"line\""
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_NAME_INVALID, "field name non alnum"
);
error_free(error);
test_validator_teardown(fixture);
}
static void test_validator_field_type_invalid() {
2023-11-25 02:35:22 +00:00
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"key\": {"
" \"type\": 2"
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_TYPE_INVALID, "field type invalid"
);
error_free(error);
test_validator_teardown(fixture);
}
static void test_validator_field_type_unknown() {
2023-11-25 02:35:22 +00:00
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"key\": {"
" \"type\": \"UNKNOWN\""
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_TYPE_UNKNOWN, "field type unknown"
);
error_free(error);
test_validator_teardown(fixture);
}
static void test_validator_valid_type_ci() {
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"key\": {"
2023-11-27 12:03:05 +00:00
" \"type\": \"LiNe\","
" \"prompt\": \"What value for key?\""
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(error == 0, "valid");
test_validator_teardown(fixture);
}
static void test_validator_field_prompt_invalid() {
2023-11-25 02:35:22 +00:00
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"key\": {"
2023-11-27 12:03:05 +00:00
" \"type\": \"line\","
2023-11-25 02:35:22 +00:00
" \"prompt\": 2"
" }"
"}"
);
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(
error->code == ERROR_VALIDATOR_FIELD_PROMPT_INVALID, "field prompt invalid"
);
error_free(error);
test_validator_teardown(fixture);
}
static void test_validator_valid() {
2023-11-25 02:35:22 +00:00
struct TestValidatorFixture *fixture = test_validator_setup(
"{"
" \"key\": {"
2023-11-27 12:03:05 +00:00
" \"type\": \"line\","
2023-11-25 02:35:22 +00:00
" \"prompt\": \"What value for key?\""
" }"
"}"
);
2023-11-24 19:23:52 +00:00
2023-11-26 13:30:44 +00:00
struct Error *error =
validate_spec_json(&fixture->config, fixture->parsed, &fixture->prompts);
sput_fail_unless(error == 0, "valid");
2023-11-24 19:23:52 +00:00
test_validator_teardown(fixture);
2023-11-24 17:27:44 +00:00
}
#endif /* _BOOTSTRAP_TEST_VALIDATOR */