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

Fix R -> R^1x1 conversion checking when conversion is allowed

- add also missing tests
- improve slightly error messages
parent 7ea84f01
Branches
Tags
1 merge request!71Feature/language tiny matrices
...@@ -13,7 +13,9 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalTypeConversion( ...@@ -13,7 +13,9 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalTypeConversion(
{ {
if (not isNaturalConversion(data_type, target_data_type)) { if (not isNaturalConversion(data_type, target_data_type)) {
if constexpr (std::is_same_v<RToR1ConversionStrategy, AllowRToR1Conversion>) { if constexpr (std::is_same_v<RToR1ConversionStrategy, AllowRToR1Conversion>) {
if ((target_data_type == ASTNodeDataType::vector_t) and (target_data_type.dimension() == 1)) { if (((target_data_type == ASTNodeDataType::vector_t) and (target_data_type.dimension() == 1)) or
((target_data_type == ASTNodeDataType::matrix_t) and (target_data_type.nbRows() == 1) and
(target_data_type.nbColumns() == 1))) {
if (isNaturalConversion(data_type, ASTNodeDataType::build<ASTNodeDataType::double_t>())) { if (isNaturalConversion(data_type, ASTNodeDataType::build<ASTNodeDataType::double_t>())) {
return; return;
} }
...@@ -48,7 +50,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve ...@@ -48,7 +50,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve
case ASTNodeDataType::list_t: { case ASTNodeDataType::list_t: {
const auto& content_type_list = data_type.contentTypeList(); const auto& content_type_list = data_type.contentTypeList();
if (content_type_list.size() != target_data_type.dimension()) { if (content_type_list.size() != target_data_type.dimension()) {
throw ParseError("incompatible dimensions in affectation", std::vector{node.begin()}); std::ostringstream os;
os << "incompatible dimensions in affectation: expecting " << target_data_type.dimension() << ", but provided "
<< content_type_list.size();
throw ParseError(os.str(), std::vector{node.begin()});
} }
Assert(content_type_list.size() == node.children.size()); Assert(content_type_list.size() == node.children.size());
...@@ -89,7 +94,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve ...@@ -89,7 +94,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve
case ASTNodeDataType::list_t: { case ASTNodeDataType::list_t: {
const auto& content_type_list = data_type.contentTypeList(); const auto& content_type_list = data_type.contentTypeList();
if (content_type_list.size() != (target_data_type.nbRows() * target_data_type.nbColumns())) { if (content_type_list.size() != (target_data_type.nbRows() * target_data_type.nbColumns())) {
throw ParseError("incompatible dimensions in affectation", std::vector{node.begin()}); std::ostringstream os;
os << "incompatible dimensions in affectation: expecting "
<< target_data_type.nbRows() * target_data_type.nbColumns() << ", but provided " << content_type_list.size();
throw ParseError(os.str(), std::vector{node.begin()});
} }
Assert(content_type_list.size() == node.children.size()); Assert(content_type_list.size() == node.children.size());
......
...@@ -785,7 +785,9 @@ let f : R^2 -> R, x->x[0]; ...@@ -785,7 +785,9 @@ let f : R^2 -> R, x->x[0];
f((1,2,3)); f((1,2,3));
)"; )";
CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{"incompatible dimensions in affectation"}); CHECK_EXPRESSION_BUILDER_THROWS_WITH(data,
std::string{
"incompatible dimensions in affectation: expecting 2, but provided 3"});
} }
SECTION("tuple[2] -> R^3") SECTION("tuple[2] -> R^3")
...@@ -795,7 +797,9 @@ let f : R^3 -> R, x->x[0]; ...@@ -795,7 +797,9 @@ let f : R^3 -> R, x->x[0];
f((1,2)); f((1,2));
)"; )";
CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{"incompatible dimensions in affectation"}); CHECK_EXPRESSION_BUILDER_THROWS_WITH(data,
std::string{
"incompatible dimensions in affectation: expecting 3, but provided 2"});
} }
SECTION("compound tuple[3] -> R^2") SECTION("compound tuple[3] -> R^2")
...@@ -805,7 +809,9 @@ let f : R*R^2 -> R, (t,x)->x[0]; ...@@ -805,7 +809,9 @@ let f : R*R^2 -> R, (t,x)->x[0];
f(1,(1,2,3)); f(1,(1,2,3));
)"; )";
CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{"incompatible dimensions in affectation"}); CHECK_EXPRESSION_BUILDER_THROWS_WITH(data,
std::string{
"incompatible dimensions in affectation: expecting 2, but provided 3"});
} }
SECTION("compound tuple[2] -> R^3") SECTION("compound tuple[2] -> R^3")
...@@ -815,7 +821,9 @@ let f : R^3*R^2 -> R, (x,y)->x[0]*y[1]; ...@@ -815,7 +821,9 @@ let f : R^3*R^2 -> R, (x,y)->x[0]*y[1];
f((1,2),(3,4)); f((1,2),(3,4));
)"; )";
CHECK_EXPRESSION_BUILDER_THROWS_WITH(data, std::string{"incompatible dimensions in affectation"}); CHECK_EXPRESSION_BUILDER_THROWS_WITH(data,
std::string{
"incompatible dimensions in affectation: expecting 3, but provided 2"});
} }
SECTION("list instead of tuple -> R^3") SECTION("list instead of tuple -> R^3")
......
...@@ -922,7 +922,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -922,7 +922,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2,
2)}), 2)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 4, but provided 1");
} }
SECTION("d=3") SECTION("d=3")
...@@ -930,7 +930,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -930,7 +930,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3,
3)}), 3)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 9, but provided 1");
} }
} }
...@@ -952,7 +952,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -952,7 +952,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1,
1)}), 1)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 1, but provided 2");
} }
SECTION("d=3") SECTION("d=3")
...@@ -960,7 +960,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -960,7 +960,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3,
3)}), 3)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 9, but provided 2");
} }
} }
...@@ -988,7 +988,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -988,7 +988,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1,
1)}), 1)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 1, but provided 3");
} }
SECTION("d=2") SECTION("d=2")
...@@ -996,7 +996,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -996,7 +996,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2,
2)}), 2)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 4, but provided 3");
} }
} }
...@@ -1338,14 +1338,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -1338,14 +1338,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 2, but provided 1");
} }
SECTION("d=3") SECTION("d=3")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 3, but provided 1");
} }
} }
...@@ -1366,14 +1366,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -1366,14 +1366,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 1, but provided 2");
} }
SECTION("d=3") SECTION("d=3")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 3, but provided 2");
} }
} }
...@@ -1400,14 +1400,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") ...@@ -1400,14 +1400,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 1, but provided 3");
} }
SECTION("d=2") SECTION("d=2")
{ {
REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}),
"incompatible dimensions in affectation"); "incompatible dimensions in affectation: expecting 2, but provided 3");
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment