89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
#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;
|
|
}
|