2021-04-12 12:31:43 -07:00
|
|
|
/******************************************************************************
|
|
|
|
|
* Top contributors (to current version):
|
2024-03-12 09:35:09 -07:00
|
|
|
* Aina Niemetz, Gereon Kremer
|
2021-04-12 12:31:43 -07:00
|
|
|
*
|
|
|
|
|
* This file is part of the cvc5 project.
|
|
|
|
|
*
|
2025-01-23 09:54:20 -08:00
|
|
|
* Copyright (c) 2009-2025 by the authors listed in the file AUTHORS
|
2021-04-12 12:31:43 -07:00
|
|
|
* in the top-level source directory and their institutional affiliations.
|
|
|
|
|
* All rights reserved. See the file COPYING in the top-level source
|
|
|
|
|
* directory for licensing information.
|
|
|
|
|
* ****************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Black box testing of the guards of the C++ API functions.
|
|
|
|
|
*/
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
#include "test_api.h"
|
|
|
|
|
|
2022-03-29 16:23:01 -07:00
|
|
|
namespace cvc5::internal {
|
2020-12-03 11:29:58 -08:00
|
|
|
|
|
|
|
|
namespace test {
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
class TestApiBlackGrammar : public TestApi
|
2020-12-02 09:13:34 -08:00
|
|
|
{
|
2024-06-21 12:40:11 -07:00
|
|
|
protected:
|
|
|
|
|
void SetUp() override
|
|
|
|
|
{
|
|
|
|
|
TestApi::SetUp();
|
|
|
|
|
d_bool = d_tm.getBooleanSort();
|
|
|
|
|
}
|
|
|
|
|
Sort d_bool;
|
2020-12-02 09:13:34 -08:00
|
|
|
};
|
|
|
|
|
|
2022-05-02 14:08:58 -07:00
|
|
|
TEST_F(TestApiBlackGrammar, toString)
|
|
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
d_solver->setOption("sygus", "true");
|
2024-06-21 12:40:11 -07:00
|
|
|
Term start = d_tm.mkVar(d_bool);
|
|
|
|
|
Grammar g = d_solver->mkGrammar({}, {start});
|
2024-07-09 16:27:42 -07:00
|
|
|
ASSERT_EQ(g.toString(), "");
|
2024-03-08 11:39:13 -08:00
|
|
|
g.addRule(start, d_tm.mkBoolean(false));
|
2024-07-09 16:27:42 -07:00
|
|
|
ASSERT_NE(g.toString(), "");
|
2022-05-02 14:08:58 -07:00
|
|
|
{
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << g;
|
|
|
|
|
ASSERT_EQ(ss.str(), g.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackGrammar, addRule)
|
2020-12-02 09:13:34 -08:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
d_solver->setOption("sygus", "true");
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
Term nullTerm;
|
2024-06-21 12:40:11 -07:00
|
|
|
Term start = d_tm.mkVar(d_bool);
|
|
|
|
|
Term nts = d_tm.mkVar(d_bool);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Grammar g = d_solver->mkGrammar({}, {start});
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_NO_THROW(g.addRule(start, d_tm.mkBoolean(false)));
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRule(nullTerm, d_tm.mkBoolean(false)), CVC5ApiException);
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g.addRule(start, nullTerm), CVC5ApiException);
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRule(nts, d_tm.mkBoolean(false)), CVC5ApiException);
|
|
|
|
|
ASSERT_THROW(g.addRule(start, d_tm.mkInteger(0)), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-06-21 12:40:11 -07:00
|
|
|
d_solver->synthFun("f", {}, d_bool, g);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRule(start, d_tm.mkBoolean(false)), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackGrammar, addRules)
|
2020-12-02 09:13:34 -08:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
d_solver->setOption("sygus", "true");
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
Term nullTerm;
|
2024-06-21 12:40:11 -07:00
|
|
|
Term start = d_tm.mkVar(d_bool);
|
|
|
|
|
Term nts = d_tm.mkVar(d_bool);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Grammar g = d_solver->mkGrammar({}, {start});
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_NO_THROW(g.addRules(start, {d_tm.mkBoolean(false)}));
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRules(nullTerm, {d_tm.mkBoolean(false)}), CVC5ApiException);
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g.addRules(start, {nullTerm}), CVC5ApiException);
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRules(nts, {d_tm.mkBoolean(false)}), CVC5ApiException);
|
|
|
|
|
ASSERT_THROW(g.addRules(start, {d_tm.mkInteger(0)}), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-06-21 12:40:11 -07:00
|
|
|
d_solver->synthFun("f", {}, d_bool, g);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_THROW(g.addRules(start, {d_tm.mkBoolean(false)}), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackGrammar, addAnyConstant)
|
2020-12-02 09:13:34 -08:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
d_solver->setOption("sygus", "true");
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
Term nullTerm;
|
2024-06-21 12:40:11 -07:00
|
|
|
Term start = d_tm.mkVar(d_bool);
|
|
|
|
|
Term nts = d_tm.mkVar(d_bool);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Grammar g = d_solver->mkGrammar({}, {start});
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
ASSERT_NO_THROW(g.addAnyConstant(start));
|
|
|
|
|
ASSERT_NO_THROW(g.addAnyConstant(start));
|
|
|
|
|
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g.addAnyConstant(nullTerm), CVC5ApiException);
|
|
|
|
|
ASSERT_THROW(g.addAnyConstant(nts), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-06-21 12:40:11 -07:00
|
|
|
d_solver->synthFun("f", {}, d_bool, g);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g.addAnyConstant(start), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackGrammar, addAnyVariable)
|
2020-12-02 09:13:34 -08:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
d_solver->setOption("sygus", "true");
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
Term nullTerm;
|
2024-06-21 12:40:11 -07:00
|
|
|
Term x = d_tm.mkVar(d_bool);
|
|
|
|
|
Term start = d_tm.mkVar(d_bool);
|
|
|
|
|
Term nts = d_tm.mkVar(d_bool);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Grammar g1 = d_solver->mkGrammar({x}, {start});
|
|
|
|
|
Grammar g2 = d_solver->mkGrammar({}, {start});
|
2020-12-02 09:13:34 -08:00
|
|
|
|
|
|
|
|
ASSERT_NO_THROW(g1.addAnyVariable(start));
|
|
|
|
|
ASSERT_NO_THROW(g1.addAnyVariable(start));
|
|
|
|
|
ASSERT_NO_THROW(g2.addAnyVariable(start));
|
|
|
|
|
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g1.addAnyVariable(nullTerm), CVC5ApiException);
|
|
|
|
|
ASSERT_THROW(g1.addAnyVariable(nts), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2024-06-21 12:40:11 -07:00
|
|
|
d_solver->synthFun("f", {}, d_bool, g1);
|
2020-12-02 09:13:34 -08:00
|
|
|
|
2021-04-15 13:04:55 -07:00
|
|
|
ASSERT_THROW(g1.addAnyVariable(start), CVC5ApiException);
|
2020-12-02 09:13:34 -08:00
|
|
|
}
|
2024-06-21 12:40:11 -07:00
|
|
|
|
2024-07-09 14:24:26 -07:00
|
|
|
TEST_F(TestApiBlackGrammar, equalHash)
|
2024-06-21 12:40:11 -07:00
|
|
|
{
|
|
|
|
|
d_solver->setOption("sygus", "true");
|
|
|
|
|
|
|
|
|
|
Term x = d_tm.mkVar(d_bool, "x");
|
|
|
|
|
Term start1 = d_tm.mkVar(d_bool, "start");
|
|
|
|
|
Term start2 = d_tm.mkVar(d_bool, "start");
|
|
|
|
|
Grammar g1, g2;
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
ASSERT_EQ(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g1));
|
|
|
|
|
ASSERT_EQ(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
ASSERT_NE(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({x}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start2});
|
2024-06-21 12:40:11 -07:00
|
|
|
ASSERT_NE(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({x}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
g2.addAnyVariable(start1);
|
|
|
|
|
ASSERT_NE(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({x}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
std::vector<Term> rules = {d_tm.mkFalse()};
|
|
|
|
|
g1.addRules(start1, rules);
|
|
|
|
|
g2.addRules(start1, rules);
|
|
|
|
|
ASSERT_EQ(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({x}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
std::vector<Term> rules2 = {d_tm.mkFalse()};
|
|
|
|
|
g2.addRules(start1, rules2);
|
|
|
|
|
ASSERT_NE(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2024-06-25 07:48:54 -07:00
|
|
|
g1 = d_solver->mkGrammar({x}, {start1});
|
|
|
|
|
g2 = d_solver->mkGrammar({x}, {start1});
|
2024-06-21 12:40:11 -07:00
|
|
|
std::vector<Term> rules1 = {d_tm.mkTrue()};
|
|
|
|
|
std::vector<Term> rules2 = {d_tm.mkFalse()};
|
|
|
|
|
g1.addRules(start1, rules1);
|
|
|
|
|
g2.addRules(start1, rules2);
|
|
|
|
|
ASSERT_NE(std::hash<Grammar>{}(g1), std::hash<Grammar>{}(g2));
|
2024-07-09 14:24:26 -07:00
|
|
|
ASSERT_EQ(g1, g1);
|
|
|
|
|
ASSERT_NE(g1, g2);
|
2024-06-21 12:40:11 -07:00
|
|
|
}
|
|
|
|
|
(void)std::hash<Grammar>{}(Grammar());
|
|
|
|
|
}
|
2020-12-03 11:29:58 -08:00
|
|
|
} // namespace test
|
2022-03-29 16:23:01 -07:00
|
|
|
} // namespace cvc5::internal
|