#include "serialization/DeserializationTypeDetector.h"
#include "unittest/TestSuite.h"

static DeserializationContext * detect1(const void * data, size_t size) {
	if (data == (void *) 1) {
		return (void *) 2;
	}
	return NULL;
}

static DeserializationContext * detect2(const void * data, size_t size) {
	if (size == 1) {
		return (void *) 3;
	}
	return NULL;
}

static void test(void) {
	DeserializationTypeDetector * detector = DeserializationTypeDetector_create();
	DeserializationContext * context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 0);
	TestCase_assertPointerNULL(context);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, (void *) 1, 0);
	TestCase_assertPointerNULL(context);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 1);
	TestCase_assertPointerNULL(context);
	
	DeserializationTypeDetector_registerDetectionCallback(detector, detect1);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 0);
	TestCase_assertPointerNULL(context);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, (void *) 1, 0);
	TestCase_assertPointerEqual(context, (void *) 2);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 1);
	TestCase_assertPointerNULL(context);
	
	DeserializationTypeDetector_registerDetectionCallback(detector, detect2);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 0);
	TestCase_assertPointerNULL(context);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, (void *) 1, 0);
	TestCase_assertPointerEqual(context, (void *) 2);
	context = DeserializationTypeDetector_createDeserializationContextWithData(detector, NULL, 1);
	TestCase_assertPointerEqual(context, (void *) 3);
	
	DeserializationTypeDetector_dispose(detector);
}

TEST_SUITE(DeserializationTypeDetectorTest,
           test)
