/*
 * containers.cpp
 *
 *  Created on: Jun 9, 2015
 *      Author: pgess
 */
#include "gtest/gtest.h"
#include "passmanager.h"
#include "Parser.h"
#include "query/containers.h"

using namespace std;
using namespace xreate;
using namespace containers;

TEST(Containers, DISABLED_DFAData1){
}

TEST(Containers, ContanierLinkedList1){
	FILE* input = fopen("scripts/testspass/Containers_Implementation_LinkedList1.xreate","r");
	assert(input != nullptr);

	Scanner scanner(input);
	Parser parser(&scanner);
	parser.Parse();

	AST& ast = parser.root;
	CodeScope* body = ast.findFunction("test")->getEntryScope();
	Symbol symb_chilrenRaw = body->findSymbol("childrenRaw");

	containers::ImplementationLinkedList iLL(symb_chilrenRaw);

	ASSERT_EQ(true, static_cast<bool>(iLL));
	ASSERT_EQ("next", iLL.fieldPointer);

	Implementation impl = Implementation::create(symb_chilrenRaw);
	ASSERT_NO_FATAL_FAILURE(impl.extract<ON_THE_FLY>());

	ImplementationRec<ON_THE_FLY> recOnthefly = impl.extract<ON_THE_FLY>();
	ASSERT_EQ(symb_chilrenRaw, recOnthefly.source);
}

TEST(Containers, Implementation_LinkedListFull){
	FILE* input = fopen("scripts/testspass/Containers_Implementation_LinkedList1.xreate","r");
	assert(input != nullptr);

	Scanner scanner(input);
    std::unique_ptr<PassManager> program(PassManager::prepareForCode(scanner));
	void* mainPtr = program->run();
	int (*main)() = (int (*)())(intptr_t)mainPtr;

	int answer = main();
	ASSERT_EQ(16, answer);

	fclose(input);
}

