/*******************************************************************************
 * Copyright (c) 2013 protos software gmbh (http://www.protos.de).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * CONTRIBUTORS:
 * 		Juergen Haug (initial contribution)
 *
 *******************************************************************************/

#include "AddressTest.h"

#include "common/messaging/Address.h"
#include "etUnit/etUnit.h"

using namespace etRuntime;

void AddressTest::testConstructors() {

	const char* failMsg = "Address constructor test failed";

	// Test Constructor Address(void)
	Address addr1;
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 0, addr1.m_nodeID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 0, addr1.m_threadID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 0, addr1.m_objectID);

	// Test Constructor Address(int nodem_caseId, int threadm_caseId, int objectID)
	Address addr2(1, 2, 3);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 1, addr2.m_nodeID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 2, addr2.m_threadID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, 3, addr2.m_objectID);

	// Test Constuctor Address(const Address& right)
	Address addr3(addr2);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, addr2.m_nodeID, addr3.m_nodeID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, addr2.m_threadID, addr3.m_threadID);
	EXPECT_EQUAL_INT16(m_caseId, failMsg, addr2.m_objectID, addr3.m_objectID);
}

void AddressTest::testOperators() {

	const char* failMsg = "Address operator test failed";

	// Test operator==
	Address addr1(1, 2, 3);
	Address addr2(1, 2, 3);
	Address addr3(1, 2, 4);
	Address addr4(1, 4, 3);
	Address addr5(4, 2, 3);
	EXPECT_TRUE(m_caseId, failMsg, addr1 == addr2);
	EXPECT_FALSE(m_caseId, failMsg, addr1 == addr3);
	EXPECT_FALSE(m_caseId, failMsg, addr1 == addr4);
	EXPECT_FALSE(m_caseId, failMsg, addr1 == addr5);

	// Test operator!=
	EXPECT_FALSE(m_caseId, failMsg, addr1 != addr2);
	EXPECT_TRUE(m_caseId, failMsg, addr1 != addr3);
	EXPECT_TRUE(m_caseId, failMsg, addr1 != addr4);
	EXPECT_TRUE(m_caseId, failMsg, addr1 != addr5);

	// Test operator=
	Address addr6(1, 2, 3);
	Address addr7 = addr6;
	EXPECT_TRUE(m_caseId, failMsg, addr6 == addr7);

	// Test operator<
	Address addr8(1, 2, 3);
	Address addr9(1, 2, 4);
	Address addr10(1, 3, 3);
	Address addr11(2, 2, 3);
	EXPECT_TRUE(m_caseId, failMsg, addr8 < addr9);
	EXPECT_FALSE(m_caseId, failMsg, addr9 < addr8);
	EXPECT_TRUE(m_caseId, failMsg, addr8 < addr10);
	EXPECT_FALSE(m_caseId, failMsg, addr10 < addr8);
	EXPECT_TRUE(m_caseId, failMsg, addr8 < addr11);
	EXPECT_FALSE(m_caseId, failMsg, addr11 < addr8);

}

void AddressTest::testToString() {

}

void AddressTest::testToID() {

	// Test toID()
	Address addr(1, 2, 3);
	EXPECT_TRUE(m_caseId, "Address toID test failed", !addr.toID().compare("1_2_3"));

}
void AddressTest::testCreateInc() {

	// Test CreateInc()
	Address addr(1, 2, 3);
	EXPECT_TRUE(m_caseId, "Address CreateInc test failed",
			addr.createInc() == Address(1, 2, 4));

}
void AddressTest::testIsValid() {

	const char* failMsg = "Address IsValid test failed";

	// Test IsValid()
	Address addr1;
	Address addr2(1, 2, 3);
	EXPECT_FALSE(m_caseId, failMsg, addr1.isValid());
	EXPECT_TRUE(m_caseId, failMsg, addr2.isValid());

}

void AddressTest::runAllTestCases() {
	ADD_TESTCASE_CPP(testConstructors)
	ADD_TESTCASE_CPP(testOperators)
	// ADD_TESTCASE(testToString)
	ADD_TESTCASE_CPP(testToID)
	ADD_TESTCASE_CPP(testCreateInc)
	ADD_TESTCASE_CPP(testIsValid)
}
