#include #include "test_helper.h" #include "test_schema.h" #include "mariadb_mock.h" using namespace ::testing; using namespace ::cpphibernate; using namespace ::cpphibernate::modifier; using namespace ::boost::hana::literals; TEST(CppHibernateTests, read_test1) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT " "BinToUuid(`T0`.`tbl_test1_id`), " "`T0`.`str_data`, " "`T0`.`str64_data`, " "`T0`.`u32_nullable`, " "`T0`.`u32_ptr_u`, " "`T0`.`u32_ptr_s` " "FROM " "`tbl_test1` AS `T0` ", result_used({ { "3d12697a-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `t1`", "str64_data of class `test1` object `t1`", nullptr, "123", "456" } })); expect_query(mock, "COMMIT"); EXPECT_CALL( mock, mysql_close( reinterpret_cast(0x1111))); EXPECT_CALL( mock, mysql_real_escape_string(reinterpret_cast(0x1111), _, _, _)) .Times(AnyNumber()) .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString())); test1 t1; t1.id = uuid("3d12697a-abb9-11e8-98d0-529269fb1459"); ::cppmariadb::connection connection(reinterpret_cast(0x1111)); auto context = make_context(test_schema, connection); using namespace modifier; context.read(t1); EXPECT_EQ (t1.id, uuid("3d12697a-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ (t1.str_data, "str_data of class `test1` object `t1`"); EXPECT_EQ (t1.str64_data, "str64_data of class `test1` object `t1`"); EXPECT_FALSE(static_cast(t1.u32_nullable)); ASSERT_TRUE (static_cast(t1.u32_ptr_u)); EXPECT_EQ (*t1.u32_ptr_u, 123); ASSERT_TRUE (static_cast(t1.u32_ptr_s)); EXPECT_EQ (*t1.u32_ptr_s, 456); } TEST(CppHibernateTests, read_test2) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT " "BinToUuid(`T0`.`tbl_test2_id`), " "`T0`.`u8_data`, " "`T0`.`i8_data`, " "`T0`.`u16_data`, " "`T0`.`i16_data` " "FROM " "`tbl_test2` AS `T0` ", result_used({ { "3d1270dc-abb9-11e8-98d0-529269fb1459", "1", "2", "3", "4" } })); expect_query(mock, "COMMIT"); EXPECT_CALL( mock, mysql_real_escape_string(reinterpret_cast(0x1111), _, _, _)) .Times(AnyNumber()) .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString())); EXPECT_CALL( mock, mysql_close( reinterpret_cast(0x1111))); ::cppmariadb::connection connection(reinterpret_cast(0x1111)); auto context = make_context(test_schema, connection); constexpr decltype(auto) test2_key_field = test_schema.tables[1_c].fields[0_c]; test2 t2; context.read(t2, where(equal(test2_key_field, "3d1270dc-abb9-11e8-98d0-529269fb1459"))); EXPECT_EQ(t2.id, uuid("3d1270dc-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ(t2.u8_data, 1); EXPECT_EQ(t2.i8_data, 2); EXPECT_EQ(t2.u16_data, 3); EXPECT_EQ(t2.i16_data, 4); } TEST(CppHibernateTests, read_test3) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT " "BinToUuid(`T0`.`tbl_test3_id`), " "`T0`.`u32_data`, " "`T0`.`i32_data`, " "`T0`.`u64_data`, " "`T0`.`i64_data` " "FROM " "`tbl_test3` AS `T0` ", result_used({ { "3d12737a-abb9-11e8-98d0-529269fb1459", "5", "6", "7", "8" } })); expect_query(mock, "COMMIT"); EXPECT_CALL( mock, mysql_real_escape_string(reinterpret_cast(0x1111), _, _, _)) .Times(AnyNumber()) .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString())); EXPECT_CALL( mock, mysql_close( reinterpret_cast(0x1111))); ::cppmariadb::connection connection(reinterpret_cast(0x1111)); auto context = make_context(test_schema, connection); test3 t3; t3.id = uuid("3d12737a-abb9-11e8-98d0-529269fb1459"); context.read(t3); EXPECT_EQ(t3.id, uuid("3d12737a-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ(t3.u32_data, 5); EXPECT_EQ(t3.i32_data, 6); EXPECT_EQ(t3.u64_data, 7); EXPECT_EQ(t3.i64_data, 8); } TEST(CppHibernateTests, read_derived1_static) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT " "BinToUuid(`T1`.`tbl_base_id`), " "`T1`.`name`, " "BinToUuid(`T0`.`tbl_derived1_id`), " "`T0`.`enum_data`, " "BinToUuid(`T2`.`tbl_test1_id`), " "`T2`.`str_data`, " "`T2`.`str64_data`, " "`T2`.`u32_nullable`, " "`T2`.`u32_ptr_u`, " "`T2`.`u32_ptr_s` " "FROM " "`tbl_derived1` AS `T0` " "LEFT JOIN " "`tbl_base` AS `T1` ON `T0`.`tbl_base_id`=`T1`.`tbl_base_id` " "LEFT JOIN " "`tbl_test1` AS `T2` ON `T0`.`tbl_test1_id_test1_data`=`T2`.`tbl_test1_id` ", result_used({ { "3d12778a-abb9-11e8-98d0-529269fb1459", "derived1", "3d12758c-abb9-11e8-98d0-529269fb1459", "test2", "3d127988-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `d1.test1_data`", "str64_data of class `test1` object `d1.test1_data`", "32", nullptr, "789" } })); expect_query(mock, "COMMIT"); EXPECT_CALL( mock, mysql_real_escape_string(reinterpret_cast(0x1111), _, _, _)) .Times(AnyNumber()) .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString())); EXPECT_CALL( mock, mysql_close( reinterpret_cast(0x1111))); ::cppmariadb::connection connection(reinterpret_cast(0x1111)); auto context = make_context(test_schema, connection); derived1 d1; d1.derived1_id = uuid("3d12758c-abb9-11e8-98d0-529269fb1459"); context.read(d1); EXPECT_EQ (d1.id, uuid("3d12778a-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ (d1.derived1_id, uuid("3d12758c-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ (d1.name, "derived1"); EXPECT_EQ (d1.enum_data, test_enum::test2); EXPECT_EQ (d1.test1_data.str_data, "str_data of class `test1` object `d1.test1_data`"); EXPECT_EQ (d1.test1_data.str64_data, "str64_data of class `test1` object `d1.test1_data`"); ASSERT_TRUE (static_cast(d1.test1_data.u32_nullable)); EXPECT_EQ (*d1.test1_data.u32_nullable, 32); ASSERT_TRUE (static_cast(d1.test1_data.u32_ptr_s)); EXPECT_EQ (*d1.test1_data.u32_ptr_s, 789); EXPECT_FALSE(static_cast(d1.test1_data.u32_ptr_u)); } TEST(CppHibernateTests, read_derived2_static) { StrictMock mock; expect_query(mock, "START TRANSACTION"); expect_query(mock, "SELECT " "BinToUuid(`T1`.`tbl_base_id`), " "`T1`.`name`, " "BinToUuid(`T0`.`tbl_derived2_id`), " "BinToUuid(`T2`.`tbl_test2_id`), " "`T2`.`u8_data`, " "`T2`.`i8_data`, " "`T2`.`u16_data`, " "`T2`.`i16_data`, " "BinToUuid(`T3`.`tbl_test2_id`), " "`T3`.`u8_data`, " "`T3`.`i8_data`, " "`T3`.`u16_data`, " "`T3`.`i16_data`, " "BinToUuid(`T4`.`tbl_test2_id`), " "`T4`.`u8_data`, " "`T4`.`i8_data`, " "`T4`.`u16_data`, " "`T4`.`i16_data` " "FROM " "`tbl_derived2` AS `T0` " "LEFT JOIN " "`tbl_base` AS `T1` ON `T0`.`tbl_base_id`=`T1`.`tbl_base_id` " "LEFT JOIN " "`tbl_test2` AS `T2` ON `T0`.`tbl_test2_id_test2_nullable`=`T2`.`tbl_test2_id` " "LEFT JOIN " "`tbl_test2` AS `T3` ON `T0`.`tbl_test2_id_test2_ptr_u`=`T3`.`tbl_test2_id` " "LEFT JOIN " "`tbl_test2` AS `T4` ON `T0`.`tbl_test2_id_test2_ptr_s`=`T4`.`tbl_test2_id` ", result_used({ { "3d127db6-abb9-11e8-98d0-529269fb1459", "derived2", "3d127bcc-abb9-11e8-98d0-529269fb1459", "3d1283a6-abb9-11e8-98d0-529269fb1459", "10", "11", "12", "13", "3d128522-abb9-11e8-98d0-529269fb1459", "20", "21", "22", "23", nullptr, nullptr, nullptr, nullptr, nullptr } })); expect_query(mock, "COMMIT"); EXPECT_CALL( mock, mysql_real_escape_string(reinterpret_cast(0x1111), _, _, _)) .Times(AnyNumber()) .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString())); EXPECT_CALL( mock, mysql_close( reinterpret_cast(0x1111))); ::cppmariadb::connection connection(reinterpret_cast(0x1111)); auto context = make_context(test_schema, connection); derived2 d2; d2.derived2_id = uuid("3d127bcc-abb9-11e8-98d0-529269fb1459"); context.read(d2); EXPECT_EQ (d2.id, uuid("3d127db6-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ (d2.derived2_id, uuid("3d127bcc-abb9-11e8-98d0-529269fb1459")); EXPECT_EQ (d2.name, "derived2"); ASSERT_TRUE (static_cast(d2.test2_nullable)); EXPECT_EQ (d2.test2_nullable->u8_data, 10); EXPECT_EQ (d2.test2_nullable->i8_data, 11); EXPECT_EQ (d2.test2_nullable->u16_data, 12); EXPECT_EQ (d2.test2_nullable->i16_data, 13); ASSERT_TRUE (static_cast(d2.test2_ptr_u)); EXPECT_EQ (d2.test2_ptr_u->u8_data, 20); EXPECT_EQ (d2.test2_ptr_u->i8_data, 21); EXPECT_EQ (d2.test2_ptr_u->u16_data, 22); EXPECT_EQ (d2.test2_ptr_u->i16_data, 23); EXPECT_FALSE(static_cast(d2.test2_ptr_s)); }