OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-atomspace / tests / query / SparseUTest.cxxtest

270 lines · cxxtest ref:
/*
 * tests/query/SparseUTest.cxxtest
 *
 * Copyright (C) 2009, 2011, 2014, 2022 Linas Vepstas <linasvepstas@gmail.com>
 * All Rights Reserved
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

#include <opencog/guile/SchemeEval.h>
#include <opencog/util/Logger.h>

using namespace opencog;

class SparseUTest :  public CxxTest::TestSuite
{
	private:
		AtomSpacePtr as;
		SchemeEval* eval;

	public:

		SparseUTest(void)
		{
			logger().set_level(Logger::DEBUG);
			// logger().set_level(Logger::FINE);
			logger().set_print_to_stdout_flag(true);
			logger().set_timestamp_flag(false);
			logger().set_sync_flag(true);
		}

		~SparseUTest()
		{
			logger().info("Completed running SparseUTest");

			// erase the log file if no assertions failed
			if (!CxxTest::TestTracker::tracker().suiteFailed())
				std::remove(logger().get_filename().c_str());
			else
			{
				logger().info("SparseUTest failed!");
				logger().flush();
			}
		}

		void setUp(void);
		void tearDown(void) { }

		void test_glob(void);
		void test_palin(void);
		void test_palin_dab(void);

		void test_glob_ord(void);
		void test_palin_ord(void);

		void test_chem_bad(void);
		void test_chem_inf(void);
		void test_chem_good(void);
		void test_chem_order(void);
};

/*
 * This function sets up an implication link, and some data.
 */
#define an as->add_node
#define al as->add_link
void SparseUTest::setUp(void)
{
	as = createAtomSpace();
	eval = SchemeEval::get_scheme_evaluator(as);
	eval->eval("(add-to-load-path \"" PROJECT_SOURCE_DIR "\")");
	eval->eval("(add-to-load-path \"" PROJECT_BINARY_DIR "\")");
}

#define getarity(hand) hand->get_arity()

// ================================================================

// Unordered links with a glob in it
void SparseUTest::test_glob(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/sparse.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 2 solutions
	// In the buggy case, this hits an infinite loop.
	result = eval->eval_h("(cog-execute! (CollectionOf est))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 2, getarity(result));

	// --------------------------------------------
	// Result should be a SetLink w/ 1 solution
	// In the buggy case, this hits an infinite loop.
	result = eval->eval_h("(cog-execute! (CollectionOf est-uni))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 1, getarity(result));

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

// ================================================================

// Unordered links with a palindrome glob in it
void SparseUTest::test_palin(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/sparse.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 4 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf palin))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 4, getarity(result));

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

// ================================================================

// Unordered links with a palindrome glob in it
void SparseUTest::test_palin_dab(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/sparse.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 2 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf palin-disambig))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 2, getarity(result));

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

// ================================================================

// Unordered links with a glob in it
void SparseUTest::test_glob_ord(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/sparse-list.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 1 solution
	result = eval->eval_h("(cog-execute! (CollectionOf est))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 1, getarity(result));

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

// ================================================================

// Unordered links with a palindrome glob in it
void SparseUTest::test_palin_ord(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/sparse-list.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 2 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf palin))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 2, getarity(result));

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

// ================================================================

// Unordered links emulating a chemical reaction
void SparseUTest::test_chem_bad(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/chem_types.scm\")");
	eval->eval("(load-from-path \"tests/query/sparse-react.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 4 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf bad-ester))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 4, getarity(result));

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

// ================================================================

// Unordered links emulating a chemical reaction
void SparseUTest::test_chem_good(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/chem_types.scm\")");
	eval->eval("(load-from-path \"tests/query/sparse-react.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 1 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf esterification))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 1, getarity(result));

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

// ================================================================

// This should not go into an inf loop.
void SparseUTest::test_chem_inf(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/chem_types.scm\")");
	eval->eval("(load-from-path \"tests/query/sparse-rinf.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ no solutions
	result = eval->eval_h("(cog-execute! (CollectionOf ester))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 0, getarity(result));

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

// ================================================================

// Ordered links emulating a chemical reaction
void SparseUTest::test_chem_order(void)
{
	logger().debug("BEGIN TEST: %s", __FUNCTION__);

	eval->eval("(load-from-path \"tests/query/chem_types.scm\")");
	eval->eval("(load-from-path \"tests/query/sparse-react-ordered.scm\")");
	Handle result;

	// --------------------------------------------
	// Result should be a SetLink w/ 1 solutions
	result = eval->eval_h("(cog-execute! (CollectionOf estero))");

	logger().debug("glob arity is %d\n", getarity(result));
	TSM_ASSERT_EQUALS("wrong number of solutions found", 1, getarity(result));

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

// ================================================================