diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-04-14 09:46:23 (GMT) | 
|---|---|---|
| committer | Richard Maudsley <richard.maudsley@isode.com> | 2014-04-25 08:38:24 (GMT) | 
| commit | d5f701fdd6826421c0c83b8e299918065b6c99d1 (patch) | |
| tree | 90d5c425b8dda4c293e3e902ad9cea4f7750430f /Swift/Controllers/UnitTest | |
| parent | e4704555946626980014d936dcfe6ede2710501b (diff) | |
| download | swift-d5f701fdd6826421c0c83b8e299918065b6c99d1.zip swift-d5f701fdd6826421c0c83b8e299918065b6c99d1.tar.bz2 | |
Sort ContactSuggester results using case-insensitive substring match, plus unit tests.
Change-Id: I806f696dac582ba2d818ceb22df3a10495ce0b16
Diffstat (limited to 'Swift/Controllers/UnitTest')
| -rw-r--r-- | Swift/Controllers/UnitTest/ContactSuggesterTest.cpp | 128 | 
1 files changed, 128 insertions, 0 deletions
| diff --git a/Swift/Controllers/UnitTest/ContactSuggesterTest.cpp b/Swift/Controllers/UnitTest/ContactSuggesterTest.cpp new file mode 100644 index 0000000..222491b --- /dev/null +++ b/Swift/Controllers/UnitTest/ContactSuggesterTest.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2014 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 <boost/bind.hpp> +#include <boost/function.hpp> +#include <boost/smart_ptr/make_shared.hpp> + +#include <Swiften/Base/foreach.h> +#include "Swift/Controllers/ContactSuggester.h" + +using namespace Swift; + +class ContactSuggesterTest : public CppUnit::TestFixture { +	CPPUNIT_TEST_SUITE(ContactSuggesterTest); +	CPPUNIT_TEST(equalityTest); +	CPPUNIT_TEST(lexicographicalSortTest); +	CPPUNIT_TEST(sortTest); +	CPPUNIT_TEST_SUITE_END(); + +public: + +	std::vector<std::string> wordList() { +		const std::string words[] = { +			"abc", +			"ab", +			"bc", +			"d" +		}; + +		return std::vector<std::string>(words, words+sizeof(words)/sizeof(*words)); +	} + +	std::vector<StatusShow::Type> statusList() { +		StatusShow::Type types[] = { +			StatusShow::Online, +			StatusShow::Away, +			StatusShow::FFC, +			StatusShow::XA, +			StatusShow::DND, +			StatusShow::None +		}; + +		return std::vector<StatusShow::Type>(types, types+sizeof(types)/sizeof(*types)); +	} + +	std::vector<Contact::ref> contactList() { +		std::vector<Contact::ref> contacts; +		std::vector<std::string> words = wordList(); +		std::vector<StatusShow::Type> statuses = statusList(); +		foreach (const std::string& name, words) { +			foreach (const std::string& jid, words) { +				foreach (const StatusShow::Type& status, statuses) { +					contacts.push_back(boost::make_shared<Contact>(name, jid, status, "")); +				} +			} +		} +		return contacts; +	} + +	/* a = a */ +	bool isReflexive(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) { +		std::vector<Contact::ref> contacts = contactList(); +		foreach (const Contact::ref& a, contacts) { +			if (!comparitor(a, a)) { +				return false; +			} +		} +		return true; +	} + +	/* a = b -> b = a */ +	bool isSymmetric(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) { +		std::vector<Contact::ref> contacts = contactList(); +		foreach (const Contact::ref& a, contacts) { +			foreach (const Contact::ref& b, contacts) { +				if (comparitor(a, b)) { +					if (!comparitor(b, a)) { +						return false; +					} +				} +			} +		} +		return true; +	} + +	/* a = b && b = c -> a = c */ +	bool isTransitive(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) { +		std::vector<Contact::ref> contacts = contactList(); +		foreach (const Contact::ref& a, contacts) { +			foreach (const Contact::ref& b, contacts) { +				foreach (const Contact::ref& c, contacts) { +					if (comparitor(a, b) && comparitor(b, c)) { +						if (!comparitor(a, c)) { +							return false; +						} +					} +				} +			} +		} +		return true; +	} + +	void equalityTest() { +		CPPUNIT_ASSERT(isReflexive(Contact::equalityPredicate)); +		CPPUNIT_ASSERT(isSymmetric(Contact::equalityPredicate)); +		CPPUNIT_ASSERT(isTransitive(Contact::equalityPredicate)); +	} + +	void lexicographicalSortTest() { +		CPPUNIT_ASSERT(isTransitive(Contact::lexicographicalSortPredicate)); +	} + +	void sortTest() { +		std::vector<std::string> words = wordList(); +		foreach (const std::string& word, words) { +			CPPUNIT_ASSERT(isTransitive(boost::bind(Contact::sortPredicate, _1, _2, word))); +		} +	} + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(ContactSuggesterTest); | 
 Swift
 Swift