diff --git a/include/sqlgen/parsing/Parser_default.hpp b/include/sqlgen/parsing/Parser_default.hpp index fccb678..ec29ddf 100644 --- a/include/sqlgen/parsing/Parser_default.hpp +++ b/include/sqlgen/parsing/Parser_default.hpp @@ -32,16 +32,28 @@ struct Parser { try { if constexpr (std::is_floating_point_v) { return static_cast(std::stod(*_str)); + + } else if constexpr (std::is_same_v) { + if (*_str == "t" || *_str == "T" || *_str == "true" || + *_str == "TRUE") { + return true; + } + if (*_str == "f" || *_str == "F" || *_str == "false" || + *_str == "FALSE") { + return false; + } + return std::stoi(*_str) != 0; + } else if constexpr (std::is_integral_v) { return static_cast(std::stoll(*_str)); - } else if constexpr (std::is_same_v) { - return std::stoi(*_str) != 0; + } else if constexpr (std::is_enum_v) { if (auto res = rfl::string_to_enum(*_str)) { return Type{*res}; } else { return error(res.error()); } + } else { static_assert(rfl::always_false_v, "Unsupported type"); } diff --git a/tests/mysql/test_boolean.cpp b/tests/mysql/test_boolean.cpp new file mode 100644 index 0000000..fbf643c --- /dev/null +++ b/tests/mysql/test_boolean.cpp @@ -0,0 +1,61 @@ +#ifndef SQLGEN_BUILD_DRY_TESTS_ONLY + +#include + +#include +#include +#include +#include +#include + +namespace test_boolean { + +struct Person { + sqlgen::PrimaryKey id; + std::string first_name; + std::string last_name; + bool has_children; +}; + +TEST(mysql, test_boolean) { + const auto people1 = std::vector({Person{.id = 0, + .first_name = "Homer", + .last_name = "Simpson", + .has_children = true}, + Person{.id = 1, + .first_name = "Bart", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 2, + .first_name = "Lisa", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 3, + .first_name = "Maggie", + .last_name = "Simpson", + .has_children = false}}); + + const auto credentials = sqlgen::mysql::Credentials{.host = "localhost", + .user = "sqlgen", + .password = "password", + .dbname = "mysql"}; + + using namespace sqlgen; + using namespace sqlgen::literals; + + const auto conn = + mysql::connect(credentials).and_then(drop | if_exists); + + const auto people2 = sqlgen::write(conn, people1) + .and_then(sqlgen::read>) + .value(); + + const auto json1 = rfl::json::write(people1); + const auto json2 = rfl::json::write(people2); + + EXPECT_EQ(json1, json2); +} + +} // namespace test_boolean + +#endif diff --git a/tests/postgres/test_boolean.cpp b/tests/postgres/test_boolean.cpp new file mode 100644 index 0000000..59a79d2 --- /dev/null +++ b/tests/postgres/test_boolean.cpp @@ -0,0 +1,61 @@ +#ifndef SQLGEN_BUILD_DRY_TESTS_ONLY + +#include + +#include +#include +#include +#include +#include + +namespace test_boolean { + +struct Person { + sqlgen::PrimaryKey id; + std::string first_name; + std::string last_name; + bool has_children; +}; + +TEST(postgres, test_boolean) { + const auto people1 = std::vector({Person{.id = 0, + .first_name = "Homer", + .last_name = "Simpson", + .has_children = true}, + Person{.id = 1, + .first_name = "Bart", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 2, + .first_name = "Lisa", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 3, + .first_name = "Maggie", + .last_name = "Simpson", + .has_children = false}}); + + const auto credentials = sqlgen::postgres::Credentials{.user = "postgres", + .password = "password", + .host = "localhost", + .dbname = "postgres"}; + + using namespace sqlgen; + using namespace sqlgen::literals; + + const auto conn = + postgres::connect(credentials).and_then(drop | if_exists); + + const auto people2 = sqlgen::write(conn, people1) + .and_then(sqlgen::read>) + .value(); + + const auto json1 = rfl::json::write(people1); + const auto json2 = rfl::json::write(people2); + + EXPECT_EQ(json1, json2); +} + +} // namespace test_boolean + +#endif diff --git a/tests/postgres/test_read_to_sql.cpp b/tests/postgres/test_read_to_sql.cpp index 7cedfbf..1c3f245 100644 --- a/tests/postgres/test_read_to_sql.cpp +++ b/tests/postgres/test_read_to_sql.cpp @@ -23,8 +23,12 @@ TEST(postgres, test_write_and_read_dry) { const auto query2 = postgres::to_sql(sqlgen::read | where("id"_c == 1)); - std::cout << query1 << std::endl; - std::cout << query2 << std::endl; + EXPECT_EQ( + query1, + R"(SELECT "id", "first_name", "last_name", "age" FROM "Person" WHERE "id" = 1)"); + EXPECT_EQ( + query2, + R"(SELECT "id", "first_name", "last_name", "age" FROM "Person" WHERE "id" = 1)"); } } // namespace test_write_and_read_dry diff --git a/tests/sqlite/test_boolean.cpp b/tests/sqlite/test_boolean.cpp new file mode 100644 index 0000000..b358992 --- /dev/null +++ b/tests/sqlite/test_boolean.cpp @@ -0,0 +1,52 @@ +#include + +#include +#include +#include +#include +#include + +namespace test_boolean { + +struct Person { + sqlgen::PrimaryKey id; + std::string first_name; + std::string last_name; + bool has_children; +}; + +TEST(sqlite, test_boolean) { + const auto people1 = std::vector({Person{.id = 0, + .first_name = "Homer", + .last_name = "Simpson", + .has_children = true}, + Person{.id = 1, + .first_name = "Bart", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 2, + .first_name = "Lisa", + .last_name = "Simpson", + .has_children = false}, + Person{.id = 3, + .first_name = "Maggie", + .last_name = "Simpson", + .has_children = false}}); + + using namespace sqlgen; + using namespace sqlgen::literals; + + const auto conn = sqlite::connect(); + + const auto people2 = sqlgen::write(conn, people1) + .and_then(sqlgen::read>) + .value(); + + const auto json1 = rfl::json::write(people1); + const auto json2 = rfl::json::write(people2); + + EXPECT_EQ(json1, json2); +} + +} // namespace test_boolean +