diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 380f070b9e8886849280c9d11f16078786b1c62b..6bccbfae744ed002e0edcde321205f309e88105a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -121,6 +121,7 @@ add_executable (unit_tests test_SmallArray.cpp test_SmallVector.cpp test_Socket.cpp + test_SocketModule.cpp test_SquareGaussQuadrature.cpp test_SquareTransformation.cpp test_SymbolTable.cpp diff --git a/tests/test_BinaryExpressionProcessor_shift.cpp b/tests/test_BinaryExpressionProcessor_shift.cpp index 2f89f1f61c45ddcc137434d28f3196201c1ce866..c1892a2ff3a793a1cdc9a48e6f1a454b090fe77d 100644 --- a/tests/test_BinaryExpressionProcessor_shift.cpp +++ b/tests/test_BinaryExpressionProcessor_shift.cpp @@ -5,6 +5,7 @@ #include <utils/pugs_config.hpp> #include <fstream> +#include <netdb.h> #include <unistd.h> // clazy:excludeall=non-pod-global-static @@ -20,8 +21,10 @@ TEST_CASE("BinaryExpressionProcessor shift", "[language]") { std::ostringstream data; + data << R"(import socket;)"; data << "let fout:ostream, fout = ofstream(\"" << path.string() << "\");\n"; - data << R"(fout << 2 << " " << true << " " << 2 + 3 << "\n";)"; + data << R"(fout << 2 << " " << true << " " << 2 + 3 << "\n"; +fout << createSocketServer(0);)"; TAO_PEGTL_NAMESPACE::string_input input{data.str(), "test.pgs"}; auto ast = ASTBuilder::build(input); @@ -53,7 +56,27 @@ TEST_CASE("BinaryExpressionProcessor shift", "[language]") } } while (fin); - REQUIRE(file_content == "2 true 5\n"); + std::string expected = "2 true 5\n"; + char hbuf[NI_MAXHOST]; + ::gethostname(hbuf, NI_MAXHOST); + expected += hbuf; + expected += ':'; + + REQUIRE(file_content.size() > expected.size()); + REQUIRE(file_content.substr(0, expected.size()) == expected); + + std::string suffix = file_content.substr(expected.size(), file_content.size() - expected.size()); + + auto is_int = [](const std::string& s) { + for (const char& c : s) { + if (not std::isdigit(c)) { + return false; + } + } + return true; + }; + + REQUIRE(is_int(suffix)); } std::filesystem::remove(filename); diff --git a/tests/test_MathModule.cpp b/tests/test_MathModule.cpp index 6846b7c4e24a17dde8747afd9e4fcb1982678985..99801b5f1d6602cbc40b0308e20ea1c1d9009b24 100644 --- a/tests/test_MathModule.cpp +++ b/tests/test_MathModule.cpp @@ -4,8 +4,6 @@ #include <language/modules/MathModule.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> -#include <set> - // clazy:excludeall=non-pod-global-static TEST_CASE("MathModule", "[language]") diff --git a/tests/test_SocketModule.cpp b/tests/test_SocketModule.cpp new file mode 100644 index 0000000000000000000000000000000000000000..879595965742b5aaa100784037506e58db22150f --- /dev/null +++ b/tests/test_SocketModule.cpp @@ -0,0 +1,711 @@ +#include <catch2/catch_approx.hpp> +#include <catch2/catch_test_macros.hpp> + +#include <language/modules/SocketModule.hpp> +#include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <language/utils/OperatorRepository.hpp> +#include <utils/Socket.hpp> + +#include <thread> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("SocketModule", "[language]") +{ + SocketModule socket_module; + const auto& name_builtin_function = socket_module.getNameBuiltinFunctionMap(); + + REQUIRE(name_builtin_function.size() == 25); + + auto create_socket_server = [&name_builtin_function] { + auto i_function = name_builtin_function.find("createSocketServer:N"); + REQUIRE(i_function != name_builtin_function.end()); + + uint64_t arg = 0; + DataVariant arg_variant = arg; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE_NOTHROW(dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get())); + + return dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get()).data_ptr(); + }; + + auto accept_socket_client = [&name_builtin_function](const std::shared_ptr<const Socket>& server) { + auto i_function = name_builtin_function.find("acceptSocketClient:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(server)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE_NOTHROW(dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get())); + + return dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get()).data_ptr(); + }; + + auto connect_socket_server = [&name_builtin_function](const std::string& hostname, int64_t port) { + auto i_function = name_builtin_function.find("connectSocketServer:string*N"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant hostname_variant = hostname; + DataVariant port_variant = port; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({hostname_variant, port_variant}); + + REQUIRE_NOTHROW(dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get())); + + return dynamic_cast<const DataHandler<const Socket>&>(std::get<EmbeddedData>(result_variant).get()).data_ptr(); + }; + + SECTION("read") + { + SECTION("read_B") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + bool b = true; + write(*self_server, b); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_B:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<bool>(result_variant) == true); + + t.join(); + } + + SECTION("read_N") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + uint64_t n = 12; + write(*self_server, n); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_N:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<uint64_t>(result_variant) == 12); + + t.join(); + } + + SECTION("read_Z") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + int64_t k = -3; + write(*self_server, k); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_Z:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<int64_t>(result_variant) == -3); + + t.join(); + } + + SECTION("read_R") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + double x = -3.141; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<double>(result_variant) == -3.141); + + t.join(); + } + + SECTION("read_R1") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<1> x{1.414}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R1:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyVector<1>>(result_variant) == TinyVector<1>{1.414}); + + t.join(); + } + + SECTION("read_R2") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<2> x{1.414, -3.7}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R2:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyVector<2>>(result_variant) == TinyVector<2>{1.414, -3.7}); + + t.join(); + } + + SECTION("read_R3") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<3> x{1.414, -3.7, 5.19}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R3:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyVector<3>>(result_variant) == TinyVector<3>{1.414, -3.7, 5.19}); + + t.join(); + } + + SECTION("read_R1x1") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<1> x{1.414}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R1x1:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyMatrix<1>>(result_variant) == TinyMatrix<1>{1.414}); + + t.join(); + } + + SECTION("read_R2x2") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<2> x{1.414, -3.7, 2.4, -6}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R2x2:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyMatrix<2>>(result_variant) == TinyMatrix<2>{1.414, -3.7, 2.4, -6}); + + t.join(); + } + + SECTION("read_R3x3") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<3> x{1.414, -3.7, 5.19, 2, 0, -2.6, 1.2, -6, 9.3}; + write(*self_server, x); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_R3x3:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<TinyMatrix<3>>(result_variant) == TinyMatrix<3>{1.414, -3.7, 5.19, 2, 0, -2.6, 1.2, -6, 9.3}); + + t.join(); + } + + SECTION("read_string") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + std::string s = "foobar"; + write(*self_server, s.size()); + write(*self_server, s); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("read_string:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + + REQUIRE(std::get<std::string>(result_variant) == std::string{"foobar"}); + + t.join(); + } + } + + SECTION("write") + { + auto get_result = [&name_builtin_function](std::shared_ptr<const Socket> p_client) { + auto i_function = name_builtin_function.find("read_B:socket"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant arg_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({arg_variant}); + return std::get<bool>(result_variant); + }; + + SECTION("B") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + bool b; + read(*self_server, b); + const bool result = (b == true); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*B"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = true; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("N") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + uint64_t n; + read(*self_server, n); + const bool result = (n == 17); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*N"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = uint64_t{17}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("Z") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + int64_t k; + read(*self_server, k); + const bool result = (k == -13); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*Z"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = int64_t{-13}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + double x; + read(*self_server, x); + const bool result = (x == -3.1415); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = double{-3.1415}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^1") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<1> x; + read(*self_server, x); + const bool result = (x == TinyVector<1>{-3.1415}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^1"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyVector<1>{-3.1415}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^2") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<2> x; + read(*self_server, x); + const bool result = (x == TinyVector<2>{-3.1415, 1.414}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^2"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyVector<2>{-3.1415, 1.414}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^3") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyVector<3> x; + read(*self_server, x); + const bool result = (x == TinyVector<3>{-3.1415, 1.414, 1.3}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^3"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyVector<3>{-3.1415, 1.414, 1.3}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^1x1") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<1> x; + read(*self_server, x); + const bool result = (x == TinyMatrix<1>{-3.1415}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^1x1"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyMatrix<1>{-3.1415}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^2x2") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<2> x; + read(*self_server, x); + const bool result = (x == TinyMatrix<2>{3, -3.1415, -1.2, 5.6}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^2x2"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyMatrix<2>{3, -3.1415, -1.2, 5.6}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("R^3x3") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + TinyMatrix<3> x; + read(*self_server, x); + const bool result = (x == TinyMatrix<3>{3, -3.1415, -1.2, 5.6, -4, 1.7, -5.2, 3.4, 2}); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*R^3x3"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = TinyMatrix<3>{3, -3.1415, -1.2, 5.6, -4, 1.7, -5.2, 3.4, 2}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + + SECTION("string") + { + std::shared_ptr p_server = create_socket_server(); + + auto self_client = [&connect_socket_server](int port) { + std::shared_ptr self_server = connect_socket_server("localhost", port); + + size_t size; + read(*self_server, size); + std::string s; + s.resize(size); + read(*self_server, s); + const bool result = (s == "foobar"); + write(*self_server, result); + }; + std::thread t(self_client, p_server->portNumber()); + + std::shared_ptr p_client = accept_socket_client(p_server); + + auto i_function = name_builtin_function.find("write:socket*string"); + REQUIRE(i_function != name_builtin_function.end()); + + DataVariant socket_variant = EmbeddedData(std::make_shared<DataHandler<const Socket>>(p_client)); + DataVariant value_variant = std::string{"foobar"}; + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + DataVariant result_variant = function_embedder.apply({socket_variant, value_variant}); + + REQUIRE(get_result(p_client)); + + t.join(); + } + } +}