aboutsummaryrefslogtreecommitdiffstats
path: root/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test.c')
-rw-r--r--test.c257
1 files changed, 257 insertions, 0 deletions
diff --git a/test.c b/test.c
new file mode 100644
index 0000000..11842c0
--- /dev/null
+++ b/test.c
@@ -0,0 +1,257 @@
+/* See LICENSE file for copyright and license details. */
+#include "libcoopgamma.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+static int
+streq(const char *a, const char *b)
+{
+ if (!a != !b)
+ return 0;
+ return !a || !strcmp(a, b);
+}
+
+
+static int
+rampseq(const libcoopgamma_ramps_t *a, const libcoopgamma_ramps_t *b, libcoopgamma_depth_t depth)
+{
+ size_t nr, ng, nb, width;
+
+ if (a->u8.red_size != b->u8.red_size ||
+ a->u8.green_size != b->u8.green_size ||
+ a->u8.blue_size != b->u8.blue_size)
+ return 0;
+
+ if (depth == -2)
+ width = sizeof(double);
+ else if (depth == -1)
+ width = sizeof(float);
+ else
+ width = ((size_t)depth) / 8;
+
+ nr = a->u8.red_size * width;
+ ng = a->u8.green_size * width;
+ nb = a->u8.blue_size * width;
+
+ if (memcmp(a->u8.red, b->u8.red, nr + ng + nb) ||
+ memcmp(a->u8.green, b->u8.green, ng + nb) ||
+ memcmp(a->u8.blue, b->u8.blue, nb))
+ return 0;
+
+ return 1;
+}
+
+
+int
+main(void)
+{
+ libcoopgamma_filter_t filter1, filter2;
+ libcoopgamma_crtc_info_t crtc1, crtc2;
+ libcoopgamma_filter_query_t query1, query2;
+ libcoopgamma_filter_table_t table1, table2;
+ libcoopgamma_context_t ctx1, ctx2;
+ libcoopgamma_async_context_t async1, async2;
+ size_t n, m, i;
+ char* buf;
+
+ filter1.priority = INT64_MIN;
+ filter1.crtc = "CRTC";
+ filter1.class = "A::B::C::D";
+ filter1.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL;
+ filter1.depth = LIBCOOPGAMMA_DOUBLE;
+ filter1.ramps.d.red_size = 4;
+ filter1.ramps.d.green_size = 5;
+ filter1.ramps.d.blue_size = 6;
+ filter1.ramps.d.red = (double[]){0.0, 0.1, 0.2, 0.5,
+ 0.3, 0.11, 0.22, 0.45, 0.9,
+ -1, -0.5, 0, 0.5, 1, 1.5};
+ filter1.ramps.d.green = filter1.ramps.d.red + filter1.ramps.d.red_size;
+ filter1.ramps.d.blue = filter1.ramps.d.green + filter1.ramps.d.green_size;
+
+ crtc1.cooperative = 0;
+ crtc1.depth = LIBCOOPGAMMA_DOUBLE;
+ crtc1.supported = LIBCOOPGAMMA_YES;
+ crtc1.red_size = 4;
+ crtc1.green_size = 5;
+ crtc1.blue_size = 6;
+ crtc1.colourspace = LIBCOOPGAMMA_SRGB;
+ crtc1.have_gamut = 1;
+ crtc1.red_x = 100;
+ crtc1.red_y = 50;
+ crtc1.green_x = 300;
+ crtc1.green_y = 350;
+ crtc1.blue_x = 200;
+ crtc1.blue_y = 260;
+ crtc1.white_x = 500;
+ crtc1.white_y = 999;
+
+ query1.high_priority = INT64_MIN;
+ query1.low_priority = INT64_MIN;
+ query1.crtc = "crtc";
+ query1.coalesce = 1;
+
+ table1.red_size = 4;
+ table1.green_size = 5;
+ table1.blue_size = 6;
+ table1.filter_count = 2;
+ table1.filters = (libcoopgamma_queried_filter_t[]){
+ {
+ .priority = UINT64_MAX,
+ .class = "a::b::c",
+ .ramps.d = {.red_size = 4,
+ .green_size = 5,
+ .blue_size = 6,
+ .red = (double[]){0.0, 0.1, 0.2, 0.5,
+ 0.3, 0.11, 0.22, 0.45, 0.9,
+ -1, -0.5, 0, 0.5, 1, 1.5}}
+ }, {
+ .priority = UINT64_MAX - 1,
+ .class = NULL,
+ .ramps.d = {.red_size = 4,
+ .green_size = 5,
+ .blue_size = 6,
+ .red = (double[]){0.02, 0.12, 0.22, 0.52,
+ 0.32, 0.112, 0.222, 0.452, 0.92,
+ -12, -0.52, 0.2, 0.52, 12, 1.52}}
+ }
+ };
+ table1.depth = LIBCOOPGAMMA_DOUBLE;
+ table1.filters[0].ramps.d.green = table1.filters[0].ramps.d.red + table1.filters[0].ramps.d.red_size;
+ table1.filters[1].ramps.d.green = table1.filters[1].ramps.d.red + table1.filters[1].ramps.d.red_size;
+ table1.filters[0].ramps.d.blue = table1.filters[0].ramps.d.green + table1.filters[0].ramps.d.green_size;
+ table1.filters[1].ramps.d.blue = table1.filters[1].ramps.d.green + table1.filters[1].ramps.d.green_size;
+
+ ctx1.error.number = UINT64_MAX;
+ ctx1.error.custom = 1;
+ ctx1.error.server_side = 0;
+ ctx1.error.description = "description";
+ ctx1.fd = 3;
+ ctx1.have_all_headers = 1;
+ ctx1.bad_message = 0;
+ ctx1.blocking = 2;
+ ctx1.message_id = UINT32_MAX;
+ ctx1.in_response_to = UINT32_MAX - 1;
+ ctx1.outbound = "0123456789";
+ ctx1.outbound_head = 7;
+ ctx1.outbound_tail = 2;
+ ctx1.outbound_size = 10;
+ ctx1.inbound = "abcdefghi";
+ ctx1.inbound_head = 6;
+ ctx1.inbound_tail = 3;
+ ctx1.inbound_size = 9;
+ ctx1.length = 100;
+ ctx1.curline = 5;
+
+ async1.message_id = UINT32_MAX;
+ async1.coalesce = 1;
+
+ n = libcoopgamma_filter_marshal(&filter1, NULL);
+ n += libcoopgamma_crtc_info_marshal(&crtc1, NULL);
+ n += libcoopgamma_filter_query_marshal(&query1, NULL);
+ n += libcoopgamma_filter_table_marshal(&table1, NULL);
+ n += libcoopgamma_context_marshal(&ctx1, NULL);
+ n += libcoopgamma_async_context_marshal(&async1, NULL);
+
+ buf = malloc(n);
+ n = libcoopgamma_filter_marshal(&filter1, buf);
+ n += libcoopgamma_crtc_info_marshal(&crtc1, &buf[n]);
+ n += libcoopgamma_filter_query_marshal(&query1, &buf[n]);
+ n += libcoopgamma_filter_table_marshal(&table1, &buf[n]);
+ n += libcoopgamma_context_marshal(&ctx1, &buf[n]);
+ n += libcoopgamma_async_context_marshal(&async1, &buf[n]);
+
+ if (libcoopgamma_filter_unmarshal(&filter2, buf, &m)) return 1; else n = m;
+ if (libcoopgamma_crtc_info_unmarshal(&crtc2, &buf[n], &m)) return 2; else n += m;
+ if (libcoopgamma_filter_query_unmarshal(&query2, &buf[n], &m)) return 3; else n += m;
+ if (libcoopgamma_filter_table_unmarshal(&table2, &buf[n], &m)) return 4; else n += m;
+ if (libcoopgamma_context_unmarshal(&ctx2, &buf[n], &m)) return 5; else n += m;
+ if (libcoopgamma_async_context_unmarshal(&async2, &buf[n], &m)) return 6;
+ free(buf);
+
+ if (filter1.priority != filter2.priority ||
+ !streq(filter1.crtc, filter2.crtc) ||
+ !streq(filter1.class, filter2.class) ||
+ filter1.lifespan != filter2.lifespan ||
+ filter1.depth != filter2.depth ||
+ !rampseq(&filter1.ramps, &filter2.ramps, filter1.depth))
+ return 7;
+
+ if (crtc1.cooperative != crtc2.cooperative ||
+ crtc1.depth != crtc2.depth ||
+ crtc1.supported != crtc2.supported ||
+ crtc1.red_size != crtc2.red_size ||
+ crtc1.green_size != crtc2.green_size ||
+ crtc1.blue_size != crtc2.blue_size ||
+ crtc1.colourspace != crtc2.colourspace ||
+ crtc1.have_gamut != crtc2.have_gamut ||
+ crtc1.red_x != crtc2.red_x ||
+ crtc1.red_y != crtc2.red_y ||
+ crtc1.green_x != crtc2.green_x ||
+ crtc1.green_y != crtc2.green_y ||
+ crtc1.blue_x != crtc2.blue_x ||
+ crtc1.blue_y != crtc2.blue_y ||
+ crtc1.white_x != crtc2.white_x ||
+ crtc1.white_y != crtc2.white_y)
+ return 8;
+
+ if (query1.high_priority != query2.high_priority ||
+ query1.low_priority != query2.low_priority ||
+ !streq(query1.crtc, query2.crtc) ||
+ query1.coalesce != query2.coalesce)
+ return 9;
+
+ if (table1.red_size != table2.red_size ||
+ table1.green_size != table2.green_size ||
+ table1.blue_size != table2.blue_size ||
+ table1.filter_count != table2.filter_count ||
+ table1.depth != table2.depth)
+ return 10;
+ for (i = 0; i < table1.filter_count; i++)
+ if (table1.filters[i].priority != table2.filters[i].priority ||
+ !streq(table1.filters[i].class, table2.filters[i].class) ||
+ !rampseq(&table1.filters[i].ramps, &table2.filters[i].ramps, table1.depth))
+ return 11;
+
+ if (ctx1.error.number != ctx2.error.number ||
+ ctx1.error.custom != ctx2.error.custom ||
+ ctx1.error.server_side != ctx2.error.server_side ||
+ !streq(ctx1.error.description, ctx2.error.description))
+ return 12;
+
+ if (ctx1.fd != ctx2.fd ||
+ ctx1.have_all_headers != ctx2.have_all_headers ||
+ ctx1.bad_message != ctx2.bad_message ||
+ ctx1.blocking != ctx2.blocking ||
+ ctx1.message_id != ctx2.message_id ||
+ ctx1.in_response_to != ctx2.in_response_to ||
+ ctx1.length != ctx2.length ||
+ ctx1.curline != ctx2.curline)
+ return 13;
+
+ if (ctx2.outbound_head > ctx2.outbound_size ||
+ ctx2.outbound_tail > ctx2.outbound_size ||
+ ctx2.inbound_head > ctx2.inbound_size ||
+ ctx2.inbound_tail > ctx2.inbound_size)
+ return 14;
+
+ if ((n = ctx1.outbound_head - ctx1.outbound_tail) != ctx2.outbound_head - ctx2.outbound_tail ||
+ (m = ctx1.inbound_head - ctx1.inbound_tail) != ctx2.inbound_head - ctx2.inbound_tail)
+ return 15;
+
+ if (memcmp(ctx1.outbound + ctx1.outbound_tail, ctx2.outbound + ctx2.outbound_tail, n) ||
+ memcmp(ctx1.inbound + ctx1.inbound_tail, ctx2.inbound + ctx2.inbound_tail, m))
+ return 16;
+
+ if (async1.message_id != async2.message_id ||
+ async1.coalesce != async2.coalesce)
+ return 17;
+
+ libcoopgamma_context_destroy(&ctx2, 1);
+ libcoopgamma_filter_destroy(&filter2);
+ libcoopgamma_filter_query_destroy(&query2);
+ libcoopgamma_filter_table_destroy(&table2);
+ return 0;
+}