#ifndef _BOOTSTRAP_TEST_VALIDATOR #define _BOOTSTRAP_TEST_VALIDATOR #include "dyn_array.h" #include "sput.h" #include "validator.h" struct TestValidatorFixture { const char *json; struct DynArray *prompts; cJSON *parsed; }; 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); return fixture; } static void test_validator_teardown(struct TestValidatorFixture *fixture) { if (fixture->parsed) { cJSON_Delete(fixture->parsed); } free(fixture); } static void test_validator_toplevel_not_object() { struct TestValidatorFixture *fixture = test_validator_setup("[]"); struct Error *error = validate_spec_json(fixture->parsed, &fixture->prompts); sput_fail_unless( error->code == ERROR_VALIDATOR_TOP_LEVEL_NOT_OBJECT, "top-level not object" ); error_free(error); test_validator_teardown(fixture); } static void test_validator_field_not_object() { struct TestValidatorFixture *fixture = test_validator_setup("{\"key\": \"$UNKNOWN\"}"); struct Error *error = validate_spec_json(fixture->parsed, &fixture->prompts); sput_fail_unless( error->code == ERROR_VALIDATOR_FIELD_NOT_OBJECT, "field not object" ); error_free(error); test_validator_teardown(fixture); } static void test_validator_field_type_invalid() { struct TestValidatorFixture *fixture = test_validator_setup( "{" " \"key\": {" " \"type\": 2" " }" "}" ); struct Error *error = validate_spec_json(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() { struct TestValidatorFixture *fixture = test_validator_setup( "{" " \"key\": {" " \"type\": \"UNKNOWN\"" " }" "}" ); struct Error *error = validate_spec_json(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\": {" " \"type\": \"tExT\"," " \"prompt\": \"What value for key?\"" " }" "}" ); struct Error *error = validate_spec_json(fixture->parsed, &fixture->prompts); sput_fail_unless(error == 0, "valid"); test_validator_teardown(fixture); } static void test_validator_field_prompt_invalid() { struct TestValidatorFixture *fixture = test_validator_setup( "{" " \"key\": {" " \"type\": \"text\"," " \"prompt\": 2" " }" "}" ); struct Error *error = validate_spec_json(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() { struct TestValidatorFixture *fixture = test_validator_setup( "{" " \"key\": {" " \"type\": \"text\"," " \"prompt\": \"What value for key?\"" " }" "}" ); struct Error *error = validate_spec_json(fixture->parsed, &fixture->prompts); sput_fail_unless(error == 0, "valid"); test_validator_teardown(fixture); } #endif /* _BOOTSTRAP_TEST_VALIDATOR */