Skip to content
Snippets Groups Projects
Commit 346c39d4 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add tests for affectations and compound affectations

Add missing tests for R^d and subscript
parent 23ed26d5
No related branches found
No related tags found
1 merge request!37Feature/language
......@@ -101,7 +101,6 @@ class AffectationExecutor final : public IAffectationExecutor
m_lhs = os.str();
}
} else {
static_assert(std::is_same_v<OperatorT, language::pluseq_op>, "unexpected operator type");
if constexpr (std::is_same_v<std::string, DataT>) {
m_lhs += std::get<std::string>(rhs);
} else if constexpr (std::is_arithmetic_v<DataT>) {
......@@ -173,7 +172,9 @@ class ComponentAffectationExecutor final : public IAffectationExecutor
if constexpr (std::is_integral_v<IndexValueT>) {
index_value = value;
} else {
// LCOV_EXCL_START
throw parse_error("unexpected error: invalid index type", std::vector{m_index_expression.begin()});
// LCOV_EXCL_STOP
}
},
value_variant);
......@@ -188,7 +189,6 @@ class ComponentAffectationExecutor final : public IAffectationExecutor
m_lhs_array[index_value] = std::to_string(std::get<DataT>(rhs));
}
} else {
static_assert(std::is_same_v<OperatorT, language::pluseq_op>, "unexpected operator type");
if constexpr (std::is_same_v<std::string, DataT>) {
m_lhs_array[index_value] += std::get<std::string>(rhs);
} else {
......@@ -253,10 +253,12 @@ class AffectationProcessor final : public INodeProcessor
Assert(found);
DataVariant& value = i_symbol->attributes().value();
// LCOV_EXCL_START
if (array_expression.m_data_type != ASTNodeDataType::vector_t) {
throw parse_error("unexpected error: invalid lhs (expecting R^d)",
std::vector{array_subscript_expression.begin()});
}
// LCOV_EXCL_STOP
auto& index_expression = *array_subscript_expression.children[1];
......@@ -291,14 +293,18 @@ class AffectationProcessor final : public INodeProcessor
std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression);
break;
}
// LCOV_EXCL_START
default: {
throw parse_error("unexpected error: invalid vector dimension",
std::vector{array_subscript_expression.begin()});
}
// LCOV_EXCL_STOP
}
} else {
// LCOV_EXCL_START
throw parse_error("unexpected error: invalid lhs", std::vector{node.children[0]->begin()});
// LCOV_EXCL_STOP
}
}
};
......@@ -328,7 +334,9 @@ class AffectationFromListProcessor final : public INodeProcessor
std::is_same_v<T, double>) {
v[i] = child_value;
} else {
// LCOV_EXCL_START
throw parse_error("unexpected error: unexpected right hand side type in affectation", m_node.begin());
// LCOV_EXCL_STOP
}
},
children_values[i]);
......
......@@ -103,10 +103,49 @@ TEST_CASE("AffectationProcessor", "[language]")
SECTION("R")
{
CHECK_AFFECTATION_RESULT("R r = -1;", "r", -1.);
CHECK_AFFECTATION_RESULT("R r = true;", "r", 1.);
CHECK_AFFECTATION_RESULT("R r = false;", "r", 0.);
CHECK_AFFECTATION_RESULT("R r = -2.3;", "r", -2.3);
CHECK_AFFECTATION_RESULT("R r = -1;", "r", double{-1});
CHECK_AFFECTATION_RESULT("R r = true;", "r", double{1});
CHECK_AFFECTATION_RESULT("R r = false;", "r", double{0});
CHECK_AFFECTATION_RESULT("R r = -2.3;", "r", double{-2.3});
}
SECTION("R^1")
{
CHECK_AFFECTATION_RESULT("R^1 x = -1;", "x", (TinyVector<1>{-1}));
CHECK_AFFECTATION_RESULT("R^1 x = true;", "x", (TinyVector<1>{true}));
CHECK_AFFECTATION_RESULT("R^1 x = false;", "x", (TinyVector<1>{false}));
CHECK_AFFECTATION_RESULT("R^1 x = -2.3;", "x", (TinyVector<1>{-2.3}));
CHECK_AFFECTATION_RESULT("R^1 x; x[0] = -1;", "x", (TinyVector<1>{-1}));
CHECK_AFFECTATION_RESULT("R^1 x; x[0] = true;", "x", (TinyVector<1>{true}));
CHECK_AFFECTATION_RESULT("R^1 x; x[0] = false;", "x", (TinyVector<1>{false}));
CHECK_AFFECTATION_RESULT("R^1 x; x[0] = -2.3;", "x", (TinyVector<1>{-2.3}));
CHECK_AFFECTATION_RESULT("R^1 x = 0;", "x", (TinyVector<1>{zero}));
CHECK_AFFECTATION_RESULT("R^1 x; x = 0;", "x", (TinyVector<1>{zero}));
}
SECTION("R^2")
{
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true);", "x", (TinyVector<2>{-1, true}));
CHECK_AFFECTATION_RESULT("R^2 x = (true, false);", "x", (TinyVector<2>{true, false}));
CHECK_AFFECTATION_RESULT("R^2 x = (-0.3, 12);", "x", (TinyVector<2>{-0.3, 12}));
CHECK_AFFECTATION_RESULT("R^2 x; x[0] = -1; x[1] = true;", "x", (TinyVector<2>{-1, true}));
CHECK_AFFECTATION_RESULT("R^2 x; x[0] = true; x[1] = false;", "x", (TinyVector<2>{true, false}));
CHECK_AFFECTATION_RESULT("R^2 x; x[0] = -0.3; x[1] = 12;", "x", (TinyVector<2>{-0.3, 12}));
CHECK_AFFECTATION_RESULT("R^2 x = 0;", "x", (TinyVector<2>{zero}));
CHECK_AFFECTATION_RESULT("R^2 x; x = 0;", "x", (TinyVector<2>{zero}));
}
SECTION("R^3")
{
CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false);", "x", (TinyVector<3>{-1, true, false}));
CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2);", "x", (TinyVector<3>{-0.3, 12, 6.2}));
CHECK_AFFECTATION_RESULT("R^3 x; x[0] = -1; x[1] = true; x[2] = false;", "x", (TinyVector<3>{-1, true, false}));
CHECK_AFFECTATION_RESULT("R^3 x; x[0] = -0.3; x[1] = 12; x[2] = 6.2;", "x", (TinyVector<3>{-0.3, 12, 6.2}));
CHECK_AFFECTATION_RESULT("R^3 x = 0;", "x", (TinyVector<3>{zero}));
CHECK_AFFECTATION_RESULT("R^3 x; x = 0;", "x", (TinyVector<3>{zero}));
}
}
......@@ -136,6 +175,28 @@ TEST_CASE("AffectationProcessor", "[language]")
CHECK_AFFECTATION_RESULT("R r = 3.3; r += false;", "r", 3.3);
CHECK_AFFECTATION_RESULT("R r = 2; r += 1.1;", "r", 3.1);
}
SECTION("R^1")
{
CHECK_AFFECTATION_RESULT("R^1 x = -1; R^1 y = 1; x += y;", "x", (TinyVector<1>{-1} + TinyVector<1>{1}));
CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] += 1;", "x", (TinyVector<1>{2} + TinyVector<1>{1}));
}
SECTION("R^2")
{
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); R^2 y = (1,3); x += y;", "x",
(TinyVector<2>{-1, true} + TinyVector<2>{1, 3}));
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] += 2; x[1] += 1;", "x",
(TinyVector<2>{-1, true} + TinyVector<2>{2, 1}));
}
SECTION("R^3")
{
CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); R^3 y = (1,2,3); x += y;", "x",
(TinyVector<3>{-1, true, false} + TinyVector<3>{1, 2, 3}));
CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] += 1; x[1] += -3; x[2] += 1;", "x",
(TinyVector<3>{-0.3, 12, 6.2} + TinyVector<3>{1, -3, 1}));
}
}
SECTION("-=")
......@@ -164,6 +225,28 @@ TEST_CASE("AffectationProcessor", "[language]")
CHECK_AFFECTATION_RESULT("R r = 3.3; r -= false;", "r", 3.3);
CHECK_AFFECTATION_RESULT("R r = 2; r -= 1.1;", "r", (2. - 1.1));
}
SECTION("R^1")
{
CHECK_AFFECTATION_RESULT("R^1 x = -1; R^1 y = 1; x -= y;", "x", (TinyVector<1>{-1} - TinyVector<1>{1}));
CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] -= 1;", "x", (TinyVector<1>{2} - TinyVector<1>{1}));
}
SECTION("R^2")
{
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); R^2 y = (1,3); x -= y;", "x",
(TinyVector<2>{-1, true} - TinyVector<2>{1, 3}));
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] -= 2; x[1] -= 1;", "x",
(TinyVector<2>{-1, true} - TinyVector<2>{2, 1}));
}
SECTION("R^3")
{
CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); R^3 y = (1,2,3); x-=y;", "x",
(TinyVector<3>{-1, true, false} - TinyVector<3>{1, 2, 3}));
CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] -= 1; x[1] -= -3; x[2] -= 1;", "x",
(TinyVector<3>{-0.3, 12, 6.2} - TinyVector<3>{1, -3, 1}));
}
}
SECTION("*=")
......@@ -192,6 +275,26 @@ TEST_CASE("AffectationProcessor", "[language]")
CHECK_AFFECTATION_RESULT("R r = 3.3; r *= false;", "r", (3.3 * false));
CHECK_AFFECTATION_RESULT("R r = 2; r *= 1.1;", "r", (2. * 1.1));
}
SECTION("R^1")
{
CHECK_AFFECTATION_RESULT("R^1 x = 2; x *= 2;", "x", (TinyVector<1>{TinyVector<1>{2} *= 2}));
CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] *= 1.3;", "x", (TinyVector<1>{2 * 1.3}));
}
SECTION("R^2")
{
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x *= 3;", "x", (TinyVector<2>{TinyVector<2>{-1, true} *= 3}));
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] *= 2; x[1] *= 3;", "x", (TinyVector<2>{-1 * 2, true * 3}));
}
SECTION("R^3")
{
CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); x*=5.2;", "x",
(TinyVector<3>{TinyVector<3>{-1, true, false} *= 5.2}));
CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] *= -1; x[1] *= -3; x[2] *= 2;", "x",
(TinyVector<3>{-0.3 * -1, 12 * -3, 6.2 * 2}));
}
}
SECTION("/=")
......@@ -217,6 +320,22 @@ TEST_CASE("AffectationProcessor", "[language]")
CHECK_AFFECTATION_RESULT("R r = 1.1; r /= true;", "r", (1.1 / true));
CHECK_AFFECTATION_RESULT("R r = 2; r /= 1.1;", "r", (2. / 1.1));
}
SECTION("R^1")
{
CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] /= 1.3;", "x", (TinyVector<1>{2 / 1.3}));
}
SECTION("R^2")
{
CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] /= 2; x[1] /= 3;", "x", (TinyVector<2>{-1. / 2., true / 3.}));
}
SECTION("R^3")
{
CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] /= -1.2; x[1] /= -3.1; x[2] /= 2.4;", "x",
(TinyVector<3>{-0.3 / -1.2, 12 / -3.1, 6.2 / 2.4}));
}
}
SECTION("errors")
......
......@@ -108,6 +108,13 @@ TEST_CASE("ListAffectationProcessor", "[language]")
}
}
SECTION("compound R^d from '0'")
{
CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "x", (TinyVector<3>{zero}));
CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "y", (TinyVector<2>{zero}));
CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "z", (TinyVector<1>{zero}));
}
SECTION("compound with subscript values")
{
CHECK_AFFECTATION_RESULT(R"(R^3 x; (x[0], x[2], x[1]) = (4, 6, 5);)", "x", (TinyVector<3>{4, 5, 6}));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment