OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-atomspace / tests / atoms / base / ClassServerUTest.cxxtest

221 lines · cxxtest ref:
/*
 * tests/atoms/base/ClassServerUTest.cxxtest
 *
 * Copyright (C) 2019 OpenGog Foundation
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License v3 as
 * published by the Free Software Foundation and including the exceptions
 * at http://opencog.org/wiki/Licenses
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program; if not, write to:
 * Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

 #include <opencog/atoms/base/Handle.h>
 #include <opencog/atoms/base/ClassServer.h>

using namespace opencog;
using namespace std;

class ClassServerUTest :  public CxxTest::TestSuite
{
private:

	NameServer *name_server;
	ClassServer *class_server;

	Type NODE;
	Type NODE_A;
	Type NODE_B;
	Type NODE_C;
	Type NODE_D;

	static Handle factory_a(const Handle& h)
	{
		return Handle::UNDEFINED;
	}

	static Handle factory_b(const Handle& h)
	{
		return Handle::UNDEFINED;
	}

	static Handle factory_c(const Handle& h)
	{
		return Handle::UNDEFINED;
	}

	static bool validator_a(const Handle& h)
	{
		return false;
	}

	static bool validator_b(const Handle& h)
	{
		return false;
	}

	static bool validator_c(const Handle& h)
	{
		return false;
	}

public:

	void setUp()
	{
		name_server = new NameServer();
		class_server = new ClassServer(*name_server);

		/*
		 * Test type hierarchy:
		 *
		 * NODE <- NODE_A <- NODE_B <- NODE_C
		 *           ^
		 *           |
		 *         NODE_D
		 */

		name_server->beginTypeDecls("test_types");
		NODE = name_server->declType(NODE, "Node");
		NODE_A = name_server->declType(NODE, "NodeA");
		NODE_B = name_server->declType(NODE_A, "NodeB");
		NODE_C = name_server->declType(NODE_B, "NodeC");
		NODE_D = name_server->declType(NODE_A, "NodeD");
		name_server->endTypeDecls();
	}

	void tearDown()
	{
		delete class_server;
		delete name_server;
	}

	void test_set_factory()
	{
		class_server->addFactory(NODE_B, factory_b);

		TS_ASSERT_EQUALS(factory_b, class_server->getFactory(NODE_B));
	}

	void test_set_factory_to_descendants()
	{
		class_server->addFactory(NODE_A, factory_a);

		TS_ASSERT_EQUALS(factory_a, class_server->getFactory(NODE_B));
		TS_ASSERT_EQUALS(factory_a, class_server->getFactory(NODE_C));
		TS_ASSERT_EQUALS(factory_a, class_server->getFactory(NODE_D));
	}

	void test_parent_factory_is_not_replaced()
	{
		class_server->addFactory(NODE_B, factory_b);

		TS_ASSERT(!class_server->getFactory(NODE_A));
	}

	void test_replace_descendants_factory()
	{
		class_server->addFactory(NODE_A, factory_a);

		class_server->addFactory(NODE_B, factory_b);

		TS_ASSERT_EQUALS(factory_b, class_server->getFactory(NODE_C));
	}

	void test_factory_from_other_hierarchy_is_not_replaced()
	{
		class_server->addFactory(NODE_A, factory_a);

		class_server->addFactory(NODE_B, factory_b);

		TS_ASSERT_EQUALS(factory_a, class_server->getFactory(NODE_D));
	}

	void test_not_parent_factory_is_not_replaced()
	{
		class_server->addFactory(NODE_C, factory_c);

		class_server->addFactory(NODE_B, factory_b);

		TS_ASSERT_EQUALS(factory_c, class_server->getFactory(NODE_C));
	}

	void test_add_validator()
	{
		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(validator_b, class_server->getValidator(NODE_B));
	}

	void test_replace_descendants_validators()
	{
		class_server->addValidator(NODE_A, validator_a);

		TS_ASSERT_EQUALS(validator_a, class_server->getValidator(NODE_A));
		TS_ASSERT_EQUALS(validator_a, class_server->getValidator(NODE_B));
		TS_ASSERT_EQUALS(validator_a, class_server->getValidator(NODE_C));
	}

	void test_parent_validator_is_not_replaced()
	{
		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT(!class_server->getValidator(NODE_A));
	}

	void test_replace_descendants_validator()
	{
		class_server->addValidator(NODE_A, validator_a);

		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(validator_b, class_server->getValidator(NODE_C));
	}

	void test_validator_from_other_hierarchy_is_not_replaced()
	{
		class_server->addValidator(NODE_A, validator_a);

		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(validator_a, class_server->getValidator(NODE_D));
	}

	void test_explicitly_set_validator_is_not_replaced()
	{
		class_server->addValidator(NODE_C, validator_c);

		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(validator_c, class_server->getValidator(NODE_C));
	}

	void test_explicitly_set_factory_is_not_replaced_by_validating_factory()
	{
		class_server->addFactory(NODE_B, factory_b);

		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(factory_b, class_server->getFactory(NODE_B));
	}

	void test_implicitly_set_factory_is_not_replaced_by_validating_factory()
	{
		class_server->addFactory(NODE_A, factory_a);

		class_server->addValidator(NODE_B, validator_b);

		TS_ASSERT_EQUALS(factory_a, class_server->getFactory(NODE_B));
	}
};