diff --git a/src/language/utils/ASTNodeNaturalConversionChecker.cpp b/src/language/utils/ASTNodeNaturalConversionChecker.cpp index 7a1a30c9ca5d582aea9a47458bd95c93ab80465a..043818697009386155b8341c7b46ae11f1afc940 100644 --- a/src/language/utils/ASTNodeNaturalConversionChecker.cpp +++ b/src/language/utils/ASTNodeNaturalConversionChecker.cpp @@ -13,7 +13,9 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalTypeConversion( { if (not isNaturalConversion(data_type, target_data_type)) { 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>())) { return; } @@ -48,7 +50,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve case ASTNodeDataType::list_t: { const auto& content_type_list = data_type.contentTypeList(); 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()); @@ -89,7 +94,10 @@ ASTNodeNaturalConversionChecker<RToR1Conversion>::_checkIsNaturalExpressionConve case ASTNodeDataType::list_t: { const auto& content_type_list = data_type.contentTypeList(); 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()); diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp index 5a071366578271161d21a27d2ce0d5e883f9c7c3..75ba4decb1af5b72f1d993b0e3041eb729d349d8 100644 --- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp +++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp @@ -785,7 +785,9 @@ let f : R^2 -> R, x->x[0]; 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") @@ -795,7 +797,9 @@ let f : R^3 -> R, x->x[0]; 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") @@ -805,7 +809,9 @@ let f : R*R^2 -> R, (t,x)->x[0]; 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") @@ -815,7 +821,9 @@ let f : R^3*R^2 -> R, (x,y)->x[0]*y[1]; 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") diff --git a/tests/test_ASTNodeNaturalConversionChecker.cpp b/tests/test_ASTNodeNaturalConversionChecker.cpp index 0142271ce7c0b9ed9421a07ca81497d6b6f1f41f..a9e10344d3f6eaacd1ac6fde102b1d4b82214927 100644 --- a/tests/test_ASTNodeNaturalConversionChecker.cpp +++ b/tests/test_ASTNodeNaturalConversionChecker.cpp @@ -922,7 +922,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 4, but provided 1"); } SECTION("d=3") @@ -930,7 +930,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 9, but provided 1"); } } @@ -952,7 +952,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 1, but provided 2"); } SECTION("d=3") @@ -960,7 +960,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 9, but provided 2"); } } @@ -988,7 +988,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 1, but provided 3"); } SECTION("d=2") @@ -996,7 +996,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 4, but provided 3"); } } @@ -1338,14 +1338,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 2, but provided 1"); } SECTION("d=3") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, 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]") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 1, but provided 2"); } SECTION("d=3") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, 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]") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 1, but provided 3"); } SECTION("d=2") { REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), - "incompatible dimensions in affectation"); + "incompatible dimensions in affectation: expecting 2, but provided 3"); } }