Files
Ensifer/test/tumbler-test.c
T

88 lines
2.4 KiB
C
Raw Normal View History

2026-09-30 19:27:45 -04:00
#include "tumbler.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void expect_string(const tumbler_t *t, const char *want)
{
char *got = NULL;
tumbler_result_t r = tumbler_to_string(t, &got);
assert(r.code == TUMBLER_OK);
assert(strcmp(got, want) == 0);
free(got);
}
static tumbler_t parse(const char *s)
{
tumbler_t t = {0};
tumbler_result_t r = tumbler_parse(s, &t);
assert(r.code == TUMBLER_OK);
return t;
}
static void test_compare(void)
{
const char *line[] = {
"1", "1.1", "1.1.1", "1.1.2", "1.1.3",
"1.2", "1.2.1", "1.2.2", "1.3", "1.4", "2"
};
for (size_t i = 0; i + 1 < sizeof(line) / sizeof(line[0]); i++) {
tumbler_t a = parse(line[i]);
tumbler_t b = parse(line[i + 1]);
assert(tumbler_compare(&a, &b) < 0);
tumbler_free(&a);
tumbler_free(&b);
}
{
tumbler_t a = parse("1");
tumbler_t b = parse("1.0.0");
assert(tumbler_compare(&a, &b) == 0);
tumbler_free(&a);
tumbler_free(&b);
}
}
static void test_arithmetic(void)
{
tumbler_t a, b, out = {0};
a = parse("3"); b = parse("2.16.3");
assert(tumbler_add(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "5.16.3");
tumbler_free(&a); tumbler_free(&b); tumbler_free(&out);
a = parse("25.6.46.93"); b = parse("0.0.3.1.21");
assert(tumbler_add(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "25.6.49.1.21");
tumbler_free(&a); tumbler_free(&b); tumbler_free(&out);
a = parse("1.4.3"); b = parse("1.1.1");
assert(tumbler_subtract_strong(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "0.3.3");
tumbler_free(&out);
assert(tumbler_subtract(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "0.3.3");
tumbler_free(&a); tumbler_free(&b); tumbler_free(&out);
a = parse("0.3.3.3.4.5.6"); b = parse("0.1.1.3.3.3.3");
assert(tumbler_subtract_weak(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "0.2");
tumbler_free(&a); tumbler_free(&b); tumbler_free(&out);
a = parse("1.2.3"); b = parse("1.1");
assert(tumbler_subtract(&a, &b, &out).code == TUMBLER_OK);
expect_string(&out, "0.1.3");
tumbler_free(&a); tumbler_free(&b); tumbler_free(&out);
}
int main(void)
{
test_compare();
test_arithmetic();
puts("tumbler tests: ok");
return 0;
}