OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-atomspace / tests / atoms / signature / TypeIntersectionUTest.cxxtest

291 lines · cxxtest ref:
/*
 * tests/atoms/core/TypeIntersectionUTest.cxxtest
 *
 * Copyright (C) 2016 OpenCog Foundation
 * Copyright (C) 2020 Linas Vepstas
 * All Rights Reserved
 * Author: Nil Geisweiller
 *
 * 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/atomspace/AtomSpace.h>
#include <opencog/util/Logger.h>
#include <opencog/atoms/signature/TypeChoice.h>

using namespace opencog;

#define aa _as.add_atom
#define al _as.add_link
#define an _as.add_node

class TypeIntersectionUTest : public CxxTest::TestSuite
{
private:
	Handle A, B, W, X, Y, Z, G1, G2, NT, PNT, CNT, NTI, DPTCI, LLT, LTI;

	AtomSpace _as;

public:
	TypeIntersectionUTest()
	{
		logger().set_level(Logger::DEBUG);
		logger().set_timestamp_flag(false);
		logger().set_print_to_stdout_flag(true);

		A = an(CONCEPT_NODE, "A");
		B = an(CONCEPT_NODE, "B");
		X = an(VARIABLE_NODE, "$X");
		Y = an(VARIABLE_NODE, "$Y");
		Z = an(VARIABLE_NODE, "$Z");
		W = an(VARIABLE_NODE, "$W");
		G1 = an(GLOB_NODE, "$G1");
		G2 = an(GLOB_NODE, "$G2");
		NT = an(TYPE_NODE, "Node");
		PNT = an(TYPE_NODE, "PredicateNode");
		CNT = an(TYPE_NODE, "ConceptNode");
		NTI = an(TYPE_INH_NODE, "Node");
		DPTCI = an(TYPE_CO_INH_NODE, "DefinedPredicateNode");
		LLT = an(TYPE_NODE, "ListLink");
		LTI = an(TYPE_INH_NODE, "Link");
	}

	void test_direct();

	void test_extend_1();
	void test_extend_2();
	void test_extend_2a();
	void test_extend_2b();
	void test_extend_2c();
	void test_extend_3();
	void test_extend_4();
	void test_extend_4a();
	void test_extend_5();
	void test_extend_5a();
};

// Test representation, directly.
void TypeIntersectionUTest::test_direct()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK,
			               al(INTERVAL_LINK,
			                  an(NUMBER_NODE, "0"),
			                  an(NUMBER_NODE, "-1")),
			               CNT);

	logger().debug() << "result = " << oc_to_string(result);

	TypeChoicePtr tcp = TypeChoiceCast(result);
	GlobInterval gi = tcp->get_glob_interval();
	TS_ASSERT_EQUALS(gi.first, 0);
	TS_ASSERT_EQUALS(gi.second, SIZE_MAX);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_1()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, PNT, al(TYPE_CHOICE, PNT));
	Handle expect = al(TYPE_INTERSECTION_LINK, PNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_2()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, NT, PNT);
	Handle expect = al(TYPE_INTERSECTION_LINK, al(TYPE_CHOICE));

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_2a()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, CNT, al(TYPE_CHOICE, PNT, CNT));
	Handle expect = al(TYPE_INTERSECTION_LINK, CNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_2b()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, CNT, al(TYPE_CHOICE, PNT, CNT));
	Handle expect = al(TYPE_CHOICE, CNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	// Handle compare will fail because they are different atom types.
	// TS_ASSERT_EQUALS(result, expect);

	TypeChoicePtr tcpr(TypeChoiceCast(result));
	TypeChoicePtr tcpe(TypeChoiceCast(expect));

	TS_ASSERT(*tcpr == *tcpe);
	TS_ASSERT(*tcpe == *tcpr);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_2c()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

   Handle result = al(TYPED_VARIABLE_LINK, Y,
	          al(TYPE_INTERSECTION_LINK, CNT, al(TYPE_CHOICE, PNT, CNT)));
   Handle expect = al(TYPED_VARIABLE_LINK, Y, CNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_3()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, PNT, NTI);
	Handle expect = al(TYPE_INTERSECTION_LINK, PNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_4()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK,
		al(TYPE_CHOICE, LLT, NTI),
		al(TYPE_CHOICE, LTI, CNT));

	Handle expect = al(TYPE_INTERSECTION_LINK, al(TYPE_CHOICE, CNT, LLT));

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_4a()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK, NT, DPTCI);
	Handle expect = al(TYPE_INTERSECTION_LINK, NT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_5()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK,
	                    al(TYPE_INTERSECTION_LINK,
	                       al(INTERVAL_LINK,
	                          an(NUMBER_NODE, "0"),
	                          an(NUMBER_NODE, "2")),
	                       NTI),
			              al(TYPE_INTERSECTION_LINK,
			                 al(INTERVAL_LINK,
			                    an(NUMBER_NODE, "1"),
			                    an(NUMBER_NODE, "-1")),
			                 PNT));

	Handle expect = al(TYPE_INTERSECTION_LINK,
			               al(INTERVAL_LINK,
			                  an(NUMBER_NODE, "1"),
			                  an(NUMBER_NODE, "2")),
			               PNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}

void TypeIntersectionUTest::test_extend_5a()
{
	logger().info("BEGIN TEST: %s", __FUNCTION__);

	Handle result = al(TYPE_INTERSECTION_LINK,
	                   al(TYPE_INTERSECTION_LINK,
	                      al(INTERVAL_LINK,
	                         an(NUMBER_NODE, "0"),
	                         an(NUMBER_NODE, "2")),
	                      PNT),
	                   al(TYPE_INTERSECTION_LINK,
	                      al(INTERVAL_LINK,
	                         an(NUMBER_NODE, "1"),
	                         an(NUMBER_NODE, "3")),
	                      PNT));

	Handle expect = al(TYPE_INTERSECTION_LINK,
	                   al(INTERVAL_LINK,
	                      an(NUMBER_NODE, "1"),
	                      an(NUMBER_NODE, "2")),
	                   PNT);

	logger().debug() << "result = " << oc_to_string(result);
	logger().debug() << "expect = " << oc_to_string(expect);

	TS_ASSERT_EQUALS(result, expect);

	logger().info("END TEST: %s", __FUNCTION__);
}