#include "levatest.h"
#include <leva.h>

using namespace std;

CPPUNIT_TEST_SUITE_REGISTRATION( LEvaTest );

bool debugMode;
ostream * dout;


void LEvaTest::setUp()
{
	actual.clear();
	expected.clear();
	debugMode = true;
	dout = &actual;

}


void LEvaTest::tearDown()
{
}


void LEvaTest::testVar()
{
	{
		Double a = 1.0;
	}
	CPPUNIT_ASSERT_EQUAL(string("+-~"), actual.str());
}

void LEvaTest::testUsedVar()
{
	{
		Double a = 1.0;
		cout << a;
	}
	expected << "+(" << 1.0 << ")-~";
	CPPUNIT_ASSERT_EQUAL(expected.str(), actual.str());
}


void LEvaTest::testBExp()
{
	{
		Double a = 1.0, b = 0.5;
		a + b;

	}
	CPPUNIT_ASSERT_EQUAL(string("++++++----~-~-~"), actual.str());
}

void LEvaTest::testUsedBExp()
{
	{
		Double a = 1.0, b = 0.5;
		cout << a + b;
	}
	expected << "++++++-(+b,(" << 1.0 << "),("<< 0.5 <<"))---~-~-~";
	CPPUNIT_ASSERT_EQUAL(expected.str(), actual.str());
}

void LEvaTest::testMedium()
{
	{
		Double a = 1, b = 0.5, c;
		c = a + b;
		CPPUNIT_ASSERT_EQUAL((double)c, 1.5);
	}
	expected << "+++++++--~+-(+b,("<<1.0<<"),(" << 0.5 << "))---~-~-~";
	CPPUNIT_ASSERT_EQUAL(expected.str(), actual.str());
}


void LEvaTest::testComplex()
{
	{
		Double a = 1, b = 2, c;
		c = a + b;
		CPPUNIT_ASSERT_EQUAL((double)c, 3.0);
		a = 2;
		CPPUNIT_ASSERT_EQUAL((double)c, 3.0);
		c = a + b;
		CPPUNIT_ASSERT_EQUAL((double)c, 4.0);
	}
}
