diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
index a98670a13ffce592cd8ee73700daf74e1e8d9735..c45708ddd241d875a30d11b5b2e4450893a3df23 100644
--- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
@@ -61,6 +61,25 @@
     REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);                \
   }
 
+#define CHECK_AST_THROWS_WITH(data, error)                                         \
+  {                                                                                \
+    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \
+    static_assert(std::is_same_v<std::decay_t<decltype(error)>, std::string>);     \
+                                                                                   \
+    string_input input{data, "test.pgs"};                                          \
+    auto ast = ASTBuilder::build(input);                                           \
+                                                                                   \
+    ASTModulesImporter{*ast};                                                      \
+    ASTNodeTypeCleaner<language::import_instruction>{*ast};                        \
+                                                                                   \
+    ASTSymbolTableBuilder{*ast};                                                   \
+    ASTNodeDataTypeBuilder{*ast};                                                  \
+                                                                                   \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                               \
+    ASTNodeTypeCleaner<language::let_declaration>{*ast};                           \
+    REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, error);                    \
+  }
+
 TEST_CASE("ASTNodeFunctionExpressionBuilder", "[language]")
 {
   SECTION("return a B")
@@ -266,6 +285,106 @@ times_2_3(-2);
     }
   }
 
+  SECTION("return a string")
+  {
+    SECTION("string argument")
+    {
+      std::string_view data = R"(
+let cat : string*string -> string, (s1,s2) -> s1+s2;
+cat("foo", "bar");
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:FunctionProcessor)
+     +-(language::name:cat:NameProcessor)
+     `-(language::function_argument_list:ASTNodeExpressionListProcessor)
+         +-(language::literal:"foo":ValueProcessor)
+         `-(language::literal:"bar":ValueProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+
+    SECTION("B argument conversion")
+    {
+      std::string_view data = R"(
+let cat : string*string -> string, (s1,s2) -> s1+s2;
+cat("foo", true);
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:FunctionProcessor)
+     +-(language::name:cat:NameProcessor)
+     `-(language::function_argument_list:ASTNodeExpressionListProcessor)
+         +-(language::literal:"foo":ValueProcessor)
+         `-(language::true_kw:ValueProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+
+    SECTION("N argument conversion")
+    {
+      std::string_view data = R"(
+let cat : string*string -> string, (s1,s2) -> s1+s2;
+N n = 2;
+cat("foo", n);
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:FunctionProcessor)
+     +-(language::name:cat:NameProcessor)
+     `-(language::function_argument_list:ASTNodeExpressionListProcessor)
+         +-(language::literal:"foo":ValueProcessor)
+         `-(language::name:n:NameProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+
+    SECTION("Z argument conversion")
+    {
+      std::string_view data = R"(
+let cat : string*string -> string, (s1,s2) -> s1+s2;
+cat("foo", -1);
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:FunctionProcessor)
+     +-(language::name:cat:NameProcessor)
+     `-(language::function_argument_list:ASTNodeExpressionListProcessor)
+         +-(language::literal:"foo":ValueProcessor)
+         `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
+             `-(language::integer:1:ValueProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+
+    SECTION("R argument conversion")
+    {
+      std::string_view data = R"(
+let cat : string*string -> string, (s1,s2) -> s1+s2;
+cat("foo", 2.5e-3);
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:FunctionProcessor)
+     +-(language::name:cat:NameProcessor)
+     `-(language::function_argument_list:ASTNodeExpressionListProcessor)
+         +-(language::literal:"foo":ValueProcessor)
+         `-(language::real:2.5e-3:ValueProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+  }
+
   SECTION("errors")
   {
     SECTION("wrong argument number")
@@ -274,6 +393,7 @@ times_2_3(-2);
 let Id : Z -> Z, z -> z;
 Id(2,3);
 )";
+
       CHECK_AST_THROWS(data);
     }
 
@@ -283,7 +403,18 @@ Id(2,3);
 let sum : R*R -> R, (x,y) -> x+y;
 sum(2);
 )";
+
       CHECK_AST_THROWS(data);
     }
+
+    SECTION("invalid string conversion")
+    {
+      std::string_view data = R"(
+let bad_conv : string -> R, s -> s;
+bad_conv(2);
+)";
+
+      CHECK_AST_THROWS_WITH(data, std::string{"invalid string conversion"});
+    }
   }
 }