This repository has been archived on 2026-07-30. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
K1NG-Driver/includes/tomlc17-R260618/test/merge/test1.c
T
2026-07-30 13:18:41 +02:00

201 lines
6.7 KiB
C

#include "../../src/tomlc17.c"
#include <inttypes.h>
static void failed() {
printf("FAILED\n");
exit(1);
}
#define CHECK(x) \
if (x) \
; \
else \
failed()
static void check(const char *doc1, const char *doc2, const char *expected) {
toml_result_t r1 = toml_parse(doc1, strlen(doc1));
toml_result_t r2 = toml_parse(doc2, strlen(doc2));
toml_result_t merged = toml_merge(&r1, &r2);
toml_result_t exp = toml_parse(expected, strlen(expected));
CHECK(toml_equiv(&merged, &exp));
toml_free(r1);
toml_free(r2);
toml_free(merged);
toml_free(exp);
}
// All test cases as separate functions
static void test_simple_merge() {
printf("Running test_simple_merge...\n");
const char *doc1 = "title = \"First\"";
const char *doc2 = "version = \"1.0\"";
const char *expected = "title = \"First\"\n"
"version = \"1.0\"";
check(doc1, doc2, expected);
}
static void test_overwrite_values() {
printf("Running test_overwrite_values...\n");
const char *doc1 = "title = \"First\"\n"
"version = \"0.9\"";
const char *doc2 = "version = \"1.0\"";
const char *expected = "title = \"First\"\n"
"version = \"1.0\"";
check(doc1, doc2, expected);
}
static void test_nested_tables() {
printf("Running test_nested_tables...\n");
const char *doc1 = "[owner]\n"
"name = \"Alice\"\n"
"dob = \"1979-05-27\"";
const char *doc2 = "[owner]\n"
"organization = \"ACME\"";
const char *expected = "[owner]\n"
"name = \"Alice\"\n"
"dob = \"1979-05-27\"\n"
"organization = \"ACME\"";
check(doc1, doc2, expected);
}
static void test_array_merging() {
printf("Running test_array_merging...\n");
const char *doc1 = "dependencies = [\"lib1\", \"lib2\"]";
const char *doc2 = "dependencies = [\"lib3\"]";
const char *expected = "dependencies = [\"lib3\"]";
check(doc1, doc2, expected);
}
static void test_deep_merge() {
printf("Running test_deep_merge...\n");
const char *doc1 = "[database]\n"
"server = \"localhost\"\n"
"ports = [8000, 8001]\n"
"connection_max = 5000";
const char *doc2 = "[database]\n"
"ports = [8001, 8002]\n"
"enabled = true";
const char *expected = "[database]\n"
"server = \"localhost\"\n"
"ports = [8001, 8002]\n"
"connection_max = 5000\n"
"enabled = true";
check(doc1, doc2, expected);
}
static void test_complex_merge() {
printf("Running test_complex_merge...\n");
const char *doc1 = "title = \"TOML Example\"\n"
"\n"
"[owner]\n"
"name = \"Tom Preston-Werner\"\n"
"dob = 1979-05-27T07:32:00Z\n"
"\n"
"[database]\n"
"server = \"192.168.1.1\"\n"
"ports = [8001, 8001, 8002]\n"
"connection_max = 5000\n"
"enabled = true";
const char *doc2 = "title = \"Updated TOML Example\"\n"
"\n"
"[owner]\n"
"organization = \"GitHub\"\n"
"\n"
"[database]\n"
"ports = [9000]\n"
"enabled = false\n"
"\n"
"[clients]\n"
"data = [[\"gamma\", \"delta\"], [1, 2]]";
const char *expected = "title = \"Updated TOML Example\"\n"
"\n"
"[owner]\n"
"name = \"Tom Preston-Werner\"\n"
"dob = 1979-05-27T07:32:00Z\n"
"organization = \"GitHub\"\n"
"\n"
"[database]\n"
"server = \"192.168.1.1\"\n"
"ports = [9000]\n"
"connection_max = 5000\n"
"enabled = false\n"
"\n"
"[clients]\n"
"data = [[\"gamma\", \"delta\"], [1, 2]]";
check(doc1, doc2, expected);
}
static void test_array_of_tables() {
printf("Running test_array_of_tables...\n");
const char *doc1 = "[[products]]\n"
"name = \"Hammer\"\n"
"sku = 738594937";
const char *doc2 = "[[products]]\n"
"color = \"red\"";
const char *expected = "[[products]]\n"
"name = \"Hammer\"\n"
"sku = 738594937\n"
"[[products]]\n"
"color = \"red\"";
check(doc1, doc2, expected);
}
static void test_type_conflicts() {
printf("Running test_type_conflicts...\n");
const char *doc1 = "value = 42";
const char *doc2 = "value = \"forty-two\"";
const char *expected = "value = \"forty-two\"";
check(doc1, doc2, expected);
}
static void test_empty_documents() {
printf("Running test_empty_documents...\n");
check("", "a = 1", "a = 1");
check("a = 1", "", "a = 1");
check("", "", "");
}
// Merged result must own its keys: tomlc17 requires each result be freed
// independently, so reading the merged tree after freeing the inputs must
// not touch the freed input pools.
static void test_keys_outlive_inputs() {
printf("Running test_keys_outlive_inputs...\n");
const char *doc1 = "[owner]\n"
"name = \"Alice\"\n";
const char *doc2 = "[owner]\n"
"organization = \"ACME\"\n";
toml_result_t r1 = toml_parse(doc1, strlen(doc1));
toml_result_t r2 = toml_parse(doc2, strlen(doc2));
toml_result_t merged = toml_merge(&r1, &r2);
CHECK(merged.ok);
toml_free(r1);
toml_free(r2);
toml_datum_t owner = toml_get(merged.toptab, "owner");
toml_datum_t name = toml_get(owner, "name");
toml_datum_t org = toml_get(owner, "organization");
CHECK(name.type == TOML_STRING && 0 == strcmp(name.u.str.ptr, "Alice"));
CHECK(org.type == TOML_STRING && 0 == strcmp(org.u.str.ptr, "ACME"));
toml_free(merged);
}
int main() {
test_simple_merge();
test_overwrite_values();
test_nested_tables();
test_array_merging();
test_deep_merge();
test_complex_merge();
test_array_of_tables();
test_type_conflicts();
test_empty_documents();
test_keys_outlive_inputs();
printf("All tests completed.\n");
return 0;
}