/*
* 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__);
}
// ================================================================