/*
 * testExpressionSerializer.cpp
 *
 *  Created on: Jan 4, 2016
 *      Author: pgess
 */

#include "expressionserializer.h"
#include "ast.h"
#include "gtest/gtest.h"
using namespace xreate;
using namespace std;

TEST(ExpressionSerializer, pack1){
	PackedExpression x;

	x << std::make_pair(0xA1, 0x100);
	size_t* storage = reinterpret_cast<size_t*> (*x);
	ASSERT_EQ(0xA100000000000000, *storage);

	x << std::make_pair(0x23456, 0x100000);
	ASSERT_EQ(0xA123456000000000, *storage);

	x << std::make_pair(0x7654321, 0x10000000);
	ASSERT_EQ(0xA123456765432100, *storage);


	x << std::make_pair(0xABBA, 0x10000);
	storage = reinterpret_cast<size_t*> (*x);
	ASSERT_EQ(0xA1234567654321AB, *storage);
	ASSERT_EQ(0xBA00000000000000, *(storage+1));
}

TEST(ExpressionSerializer, serialize1){
	Expression a(Operator::CALL, {Expression(string("a")), Expression(string("a"))});
	Expression b(Operator::CALL, {Expression(string("a")), Expression(string("b"))});

	ExpressionSerializer serializer;
	serializer.registerExpression(a);
	serializer.registerExpression(b);

	PackedExpression packA = serializer.pack(a);
	PackedExpression packB = serializer.pack(b);
	PackedExpression packA2 = serializer.pack(a);

	ASSERT_EQ(packA, packA2);
	ASSERT_NE(packA, packB);
}


