2021-04-12 12:31:43 -07:00
|
|
|
/******************************************************************************
|
|
|
|
|
* Top contributors (to current version):
|
2024-03-12 09:35:09 -07:00
|
|
|
* Aina Niemetz, Andres Noetzli, 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 Op class.
|
|
|
|
|
*/
|
2018-12-14 10:25:15 -08:00
|
|
|
|
2020-12-02 10:13:54 -08:00
|
|
|
#include "test_api.h"
|
2018-12-14 10:25:15 -08:00
|
|
|
|
2022-03-29 16:23:01 -07:00
|
|
|
namespace cvc5::internal {
|
2020-12-03 11:29:58 -08:00
|
|
|
|
|
|
|
|
namespace test {
|
2018-12-14 10:25:15 -08:00
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
class TestApiBlackOp : public TestApi
|
2018-12-14 10:25:15 -08:00
|
|
|
{
|
|
|
|
|
};
|
|
|
|
|
|
2022-04-28 17:47:10 -07:00
|
|
|
TEST_F(TestApiBlackOp, hash)
|
|
|
|
|
{
|
2024-06-21 12:40:11 -07:00
|
|
|
std::hash<Op> h;
|
|
|
|
|
ASSERT_EQ(h(d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 1})),
|
|
|
|
|
h(d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 1})));
|
|
|
|
|
ASSERT_NE(h(d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 1})),
|
|
|
|
|
h(d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 2})));
|
|
|
|
|
(void)std::hash<Op>{}(Op());
|
2022-04-28 17:47:10 -07:00
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackOp, getKind)
|
2018-12-14 10:25:15 -08:00
|
|
|
{
|
2024-06-11 16:37:16 -07:00
|
|
|
Op x = d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 1});
|
|
|
|
|
ASSERT_EQ(x.getKind(), Kind::BITVECTOR_EXTRACT);
|
2018-12-14 10:25:15 -08:00
|
|
|
}
|
|
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackOp, isNull)
|
2018-12-14 10:25:15 -08:00
|
|
|
{
|
2019-12-02 13:36:19 -08:00
|
|
|
Op x;
|
2020-12-02 10:13:54 -08:00
|
|
|
ASSERT_TRUE(x.isNull());
|
2024-03-08 11:39:13 -08:00
|
|
|
Op y = d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {31, 1});
|
2022-04-28 17:47:10 -07:00
|
|
|
ASSERT_FALSE(y.isNull());
|
|
|
|
|
ASSERT_NE(x, y);
|
2018-12-14 10:25:15 -08:00
|
|
|
}
|
2019-08-11 09:07:31 -07:00
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackOp, opFromKind)
|
2019-08-11 09:07:31 -07:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
ASSERT_NO_THROW(d_tm.mkOp(Kind::ADD));
|
|
|
|
|
ASSERT_THROW(d_tm.mkOp(Kind::BITVECTOR_EXTRACT), CVC5ApiException);
|
2019-12-02 13:36:19 -08:00
|
|
|
}
|
|
|
|
|
|
2021-04-20 20:57:56 -05:00
|
|
|
TEST_F(TestApiBlackOp, getNumIndices)
|
|
|
|
|
{
|
2022-03-21 17:00:58 -07:00
|
|
|
// Operators with 0 indices
|
2024-03-08 11:39:13 -08:00
|
|
|
Op plus = d_tm.mkOp(Kind::ADD);
|
2021-04-20 20:57:56 -05:00
|
|
|
|
|
|
|
|
ASSERT_EQ(0, plus.getNumIndices());
|
2022-03-21 17:00:58 -07:00
|
|
|
|
|
|
|
|
// Operators with 1 index
|
2024-03-08 11:39:13 -08:00
|
|
|
Op divisible = d_tm.mkOp(Kind::DIVISIBLE, {4});
|
|
|
|
|
Op bvRepeat = d_tm.mkOp(Kind::BITVECTOR_REPEAT, {5});
|
|
|
|
|
Op bvZeroExtend = d_tm.mkOp(Kind::BITVECTOR_ZERO_EXTEND, {6});
|
|
|
|
|
Op bvSignExtend = d_tm.mkOp(Kind::BITVECTOR_SIGN_EXTEND, {7});
|
|
|
|
|
Op bvRotateLeft = d_tm.mkOp(Kind::BITVECTOR_ROTATE_LEFT, {8});
|
|
|
|
|
Op bvRotateRight = d_tm.mkOp(Kind::BITVECTOR_ROTATE_RIGHT, {9});
|
|
|
|
|
Op intToBv = d_tm.mkOp(Kind::INT_TO_BITVECTOR, {10});
|
|
|
|
|
Op iand = d_tm.mkOp(Kind::IAND, {11});
|
|
|
|
|
Op fpToUbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_UBV, {12});
|
|
|
|
|
Op fpToSbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_SBV, {13});
|
2022-03-21 17:00:58 -07:00
|
|
|
|
2021-04-20 20:57:56 -05:00
|
|
|
ASSERT_EQ(1, divisible.getNumIndices());
|
2022-03-21 17:00:58 -07:00
|
|
|
ASSERT_EQ(1, bvRepeat.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, bvZeroExtend.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, bvSignExtend.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, bvRotateLeft.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, bvRotateRight.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, intToBv.getNumIndices());
|
2021-04-20 20:57:56 -05:00
|
|
|
ASSERT_EQ(1, iand.getNumIndices());
|
2022-03-21 17:00:58 -07:00
|
|
|
ASSERT_EQ(1, fpToUbv.getNumIndices());
|
|
|
|
|
ASSERT_EQ(1, fpToSbv.getNumIndices());
|
|
|
|
|
|
|
|
|
|
// Operators with 2 indices
|
2024-03-08 11:39:13 -08:00
|
|
|
Op bvExtract = d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {1, 0});
|
|
|
|
|
Op toFpFromIeeeBv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_IEEE_BV, {3, 2});
|
|
|
|
|
Op toFpFromFp = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_FP, {5, 4});
|
|
|
|
|
Op toFpFromReal = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_REAL, {7, 6});
|
|
|
|
|
Op toFpFromSbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_SBV, {9, 8});
|
|
|
|
|
Op toFpFromUbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_UBV, {11, 10});
|
|
|
|
|
Op regexpLoop = d_tm.mkOp(Kind::REGEXP_LOOP, {15, 14});
|
2022-03-21 17:00:58 -07:00
|
|
|
|
|
|
|
|
ASSERT_EQ(2, bvExtract.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, toFpFromIeeeBv.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, toFpFromFp.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, toFpFromReal.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, toFpFromSbv.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, toFpFromUbv.getNumIndices());
|
|
|
|
|
ASSERT_EQ(2, regexpLoop.getNumIndices());
|
|
|
|
|
|
|
|
|
|
// Operators with n indices
|
|
|
|
|
std::vector<uint32_t> indices = {0, 3, 2, 0, 1, 2};
|
2024-03-08 11:39:13 -08:00
|
|
|
Op tupleProject = d_tm.mkOp(Kind::TUPLE_PROJECT, indices);
|
2022-03-21 17:00:58 -07:00
|
|
|
ASSERT_EQ(indices.size(), tupleProject.getNumIndices());
|
2022-05-02 14:08:58 -07:00
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Op relationProject = d_tm.mkOp(Kind::RELATION_PROJECT, indices);
|
2022-07-06 16:02:23 -05:00
|
|
|
ASSERT_EQ(indices.size(), relationProject.getNumIndices());
|
|
|
|
|
|
2024-03-08 11:39:13 -08:00
|
|
|
Op tableProject = d_tm.mkOp(Kind::TABLE_PROJECT, indices);
|
2022-05-02 14:08:58 -07:00
|
|
|
ASSERT_EQ(indices.size(), tableProject.getNumIndices());
|
2021-04-20 20:57:56 -05:00
|
|
|
}
|
|
|
|
|
|
2021-07-22 02:10:39 -05:00
|
|
|
TEST_F(TestApiBlackOp, subscriptOperator)
|
|
|
|
|
{
|
2022-03-21 17:00:58 -07:00
|
|
|
// Operators with 0 indices
|
2024-03-08 11:39:13 -08:00
|
|
|
Op plus = d_tm.mkOp(Kind::ADD);
|
2021-07-22 02:10:39 -05:00
|
|
|
|
|
|
|
|
ASSERT_THROW(plus[0], CVC5ApiException);
|
|
|
|
|
|
2022-03-21 17:00:58 -07:00
|
|
|
// Operators with 1 index
|
2024-03-08 11:39:13 -08:00
|
|
|
Op divisible = d_tm.mkOp(Kind::DIVISIBLE, {4});
|
|
|
|
|
Op bvRepeat = d_tm.mkOp(Kind::BITVECTOR_REPEAT, {5});
|
|
|
|
|
Op bvZeroExtend = d_tm.mkOp(Kind::BITVECTOR_ZERO_EXTEND, {6});
|
|
|
|
|
Op bvSignExtend = d_tm.mkOp(Kind::BITVECTOR_SIGN_EXTEND, {7});
|
|
|
|
|
Op bvRotateLeft = d_tm.mkOp(Kind::BITVECTOR_ROTATE_LEFT, {8});
|
|
|
|
|
Op bvRotateRight = d_tm.mkOp(Kind::BITVECTOR_ROTATE_RIGHT, {9});
|
|
|
|
|
Op intToBv = d_tm.mkOp(Kind::INT_TO_BITVECTOR, {10});
|
|
|
|
|
Op iand = d_tm.mkOp(Kind::IAND, {11});
|
|
|
|
|
Op fpToUbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_UBV, {12});
|
|
|
|
|
Op fpToSbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_SBV, {13});
|
|
|
|
|
Op regexpRepeat = d_tm.mkOp(Kind::REGEXP_REPEAT, {14});
|
2022-03-21 17:00:58 -07:00
|
|
|
|
|
|
|
|
ASSERT_EQ(4, divisible[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(5, bvRepeat[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(6, bvZeroExtend[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(7, bvSignExtend[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(8, bvRotateLeft[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(9, bvRotateRight[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(10, intToBv[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(11, iand[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(12, fpToUbv[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(13, fpToSbv[0].getUInt32Value());
|
2022-05-02 14:08:58 -07:00
|
|
|
ASSERT_EQ(14, regexpRepeat[0].getUInt32Value());
|
2022-03-21 17:00:58 -07:00
|
|
|
|
|
|
|
|
// Operators with 2 indices
|
2024-03-08 11:39:13 -08:00
|
|
|
Op bvExtract = d_tm.mkOp(Kind::BITVECTOR_EXTRACT, {1, 0});
|
|
|
|
|
Op toFpFromIeeeBv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_IEEE_BV, {3, 2});
|
|
|
|
|
Op toFpFromFp = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_FP, {5, 4});
|
|
|
|
|
Op toFpFromReal = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_REAL, {7, 6});
|
|
|
|
|
Op toFpFromSbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_SBV, {9, 8});
|
|
|
|
|
Op toFpFromUbv = d_tm.mkOp(Kind::FLOATINGPOINT_TO_FP_FROM_UBV, {11, 10});
|
|
|
|
|
Op regexpLoop = d_tm.mkOp(Kind::REGEXP_LOOP, {15, 14});
|
2022-03-21 17:00:58 -07:00
|
|
|
|
|
|
|
|
ASSERT_EQ(1, bvExtract[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(0, bvExtract[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(3, toFpFromIeeeBv[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(2, toFpFromIeeeBv[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(5, toFpFromFp[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(4, toFpFromFp[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(7, toFpFromReal[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(6, toFpFromReal[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(9, toFpFromSbv[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(8, toFpFromSbv[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(11, toFpFromUbv[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(10, toFpFromUbv[1].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(15, regexpLoop[0].getUInt32Value());
|
|
|
|
|
ASSERT_EQ(14, regexpLoop[1].getUInt32Value());
|
|
|
|
|
|
|
|
|
|
// Operators with n indices
|
|
|
|
|
std::vector<uint32_t> indices = {0, 3, 2, 0, 1, 2};
|
2024-03-08 11:39:13 -08:00
|
|
|
Op tupleProject = d_tm.mkOp(Kind::TUPLE_PROJECT, indices);
|
2022-03-21 17:00:58 -07:00
|
|
|
for (size_t i = 0, size = tupleProject.getNumIndices(); i < size; i++)
|
|
|
|
|
{
|
|
|
|
|
ASSERT_EQ(indices[i], tupleProject[i].getUInt32Value());
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-07-22 02:10:39 -05:00
|
|
|
|
2021-02-08 09:55:38 -08:00
|
|
|
TEST_F(TestApiBlackOp, opScopingToString)
|
2020-10-08 09:35:56 -07:00
|
|
|
{
|
2024-03-08 11:39:13 -08:00
|
|
|
Op bitvector_repeat_ot = d_tm.mkOp(Kind::BITVECTOR_REPEAT, {5});
|
2020-10-08 09:35:56 -07:00
|
|
|
std::string op_repr = bitvector_repeat_ot.toString();
|
2021-01-12 08:55:56 -08:00
|
|
|
ASSERT_EQ(bitvector_repeat_ot.toString(), op_repr);
|
2022-04-28 17:47:10 -07:00
|
|
|
{
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << bitvector_repeat_ot;
|
|
|
|
|
ASSERT_EQ(ss.str(), op_repr);
|
|
|
|
|
}
|
2020-10-08 09:35:56 -07:00
|
|
|
}
|
2020-12-03 11:29:58 -08:00
|
|
|
} // namespace test
|
2022-03-29 16:23:01 -07:00
|
|
|
} // namespace cvc5::internal
|