/*
 * Copyright (c) 2010 Kevin Smith
 * Licensed under the GNU General Public License v3.
 * See Documentation/Licenses/GPLv3.txt for more information.
 */

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

#include "SwifTools/TabComplete.h"

using namespace Swift;

class TabCompleteTest : public CppUnit::TestFixture {
	CPPUNIT_TEST_SUITE(TabCompleteTest);
	CPPUNIT_TEST(testEmpty);
	CPPUNIT_TEST(testNoMatch);
	CPPUNIT_TEST(testOneMatch);
	CPPUNIT_TEST(testTwoMatch);
	CPPUNIT_TEST(testChangeMatch);
	CPPUNIT_TEST(testRemoveDuringComplete);
	CPPUNIT_TEST(testAddDuringComplete);
	CPPUNIT_TEST(testSwiftRoomSample);
	CPPUNIT_TEST_SUITE_END();
	
public:
	TabCompleteTest() {};
	
	void setUp() {
		completer_ = TabComplete();
	}
	
	void testEmpty() {
		std::string blah("Blah");
		CPPUNIT_ASSERT_EQUAL(
			blah,
			completer_.completeWord(blah));
		CPPUNIT_ASSERT_EQUAL(
			blah,
			completer_.completeWord(blah));
	}

	void testNoMatch() {
		completer_.addWord("Bleh");
		std::string blah("Blah");
		CPPUNIT_ASSERT_EQUAL(
			blah,
			completer_.completeWord(blah));
		CPPUNIT_ASSERT_EQUAL(
			blah,
			completer_.completeWord(blah));
	}

	void testOneMatch() {
		std::string short1("Bl");
		std::string long1("Blehling");
		completer_.addWord(long1);
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(short1));
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(long1));
	}
	
	void testTwoMatch() {
		std::string short1("Hur");
		std::string long1("Hurgle");
		std::string long2("Hurdler");
		completer_.addWord(long1);
		completer_.addWord("Blah");
		completer_.addWord(long2);
		completer_.addWord("Bleh");
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(short1));
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(long2));
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(long1));
	}

	void testChangeMatch() {
		std::string short1("Hur");
		std::string short2("Rub");
		std::string long1("Hurgle");
		std::string long2("Rubbish");
		completer_.addWord(long2);
		completer_.addWord("Blah");
		completer_.addWord(long1);
		completer_.addWord("Bleh");
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(short1));
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(short2));
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(long2));
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(short1));
	}

	void testRemoveDuringComplete() {
		std::string short1("Kev");
		std::string long1("Kevin");
		std::string long2("Kevlar");
		completer_.addWord(long1);
		completer_.addWord("Blah");
		completer_.addWord(long2);
		completer_.addWord("Bleh");
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(short1));
		completer_.removeWord(long2);
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(long2));
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(long1));
	}

	void testAddDuringComplete() {
		std::string short1("Rem");
		std::string long1("Remko");
		std::string long2("Remove");
		std::string long3("Remedial");
		completer_.addWord(long1);
		completer_.addWord("Blah");
		completer_.addWord(long2);
		completer_.addWord("Bleh");
		CPPUNIT_ASSERT_EQUAL(
			long2,
			completer_.completeWord(short1));
		completer_.addWord(long3);
		CPPUNIT_ASSERT_EQUAL(
			long1,
			completer_.completeWord(long2));
		CPPUNIT_ASSERT_EQUAL(
			long3,
			completer_.completeWord(long1));
	}

	void testSwiftRoomSample() {
		std::string t("t");
		std::string Anpan("Anpan");
		std::string cdubouloz("cdubouloz");
		std::string Tobias("Tobias");
		std::string Zash("Zash");
		std::string lastsky("lastsky");
		std::string Steve("Steve Kille");
		std::string Flo("Flo");
		std::string Test("Test");
		std::string test("test");
		completer_.addWord(Anpan);
		completer_.addWord(cdubouloz);
		completer_.addWord(Tobias);
		completer_.addWord(lastsky);
		completer_.addWord(Steve);
		completer_.addWord(Flo);
		completer_.addWord(Zash);

		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Tobias));

		completer_.addWord(Test);

		CPPUNIT_ASSERT_EQUAL(
			Test,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Test));
		CPPUNIT_ASSERT_EQUAL(
			Test,
			completer_.completeWord(Tobias));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Test));

		completer_.addWord(Zash);
		completer_.addWord(Zash);
		completer_.addWord(Zash);
		completer_.addWord(Zash);

		completer_.removeWord(Test);

		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Tobias));

		completer_.addWord(test);

		completer_.addWord(Zash);
		completer_.addWord(Zash);
		completer_.addWord(Zash);
		completer_.addWord(Zash);


		CPPUNIT_ASSERT_EQUAL(
			test,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(test));
		CPPUNIT_ASSERT_EQUAL(
			test,
			completer_.completeWord(Tobias));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(test));

		completer_.removeWord(test);

		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Tobias));

		completer_.removeWord(Tobias);
		CPPUNIT_ASSERT_EQUAL(
			t,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			t,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			t,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			t,
			completer_.completeWord(t));

		completer_.addWord(Tobias);

		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(t));
		CPPUNIT_ASSERT_EQUAL(
			Tobias,
			completer_.completeWord(Tobias));

	}



private:
	TabComplete completer_;
};

CPPUNIT_TEST_SUITE_REGISTRATION(TabCompleteTest);