aboutsummaryrefslogblamecommitdiffstats
path: root/test.c
blob: 11842c0123fc64084efa5efcb769be2d84ad1753 (plain) (tree)
































































































































































































































































                                                                                                                
/* 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;
}