TestSqlValueAndTuple.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <unistd.h>
  7. #include <LibSQL/Meta.h>
  8. #include <LibSQL/Row.h>
  9. #include <LibSQL/Tuple.h>
  10. #include <LibSQL/Value.h>
  11. #include <LibTest/TestCase.h>
  12. TEST_CASE(text_value)
  13. {
  14. SQL::Value v(SQL::SQLType::Text);
  15. v = "Test";
  16. VERIFY(v.to_string().value() == "Test");
  17. }
  18. TEST_CASE(text_value_to_int)
  19. {
  20. SQL::Value v(SQL::SQLType::Text);
  21. v = "42";
  22. EXPECT_EQ(v.to_int().value(), 42);
  23. }
  24. TEST_CASE(text_value_to_int_crash)
  25. {
  26. SQL::Value v(SQL::SQLType::Text);
  27. v = "Test";
  28. EXPECT_CRASH("Can't convert 'Test' to integer", [&]() { (void) (int) v; return Test::Crash::Failure::DidNotCrash; });
  29. }
  30. TEST_CASE(serialize_text_value)
  31. {
  32. SQL::Value v(SQL::SQLType::Text);
  33. v = "Test";
  34. VERIFY(v.to_string().value() == "Test");
  35. ByteBuffer buffer;
  36. v.serialize(buffer);
  37. size_t offset = 0;
  38. SQL::Value v2(SQL::SQLType::Text, buffer, offset);
  39. VERIFY((String)v2 == "Test");
  40. }
  41. TEST_CASE(integer_value)
  42. {
  43. SQL::Value v(SQL::SQLType::Integer);
  44. v = 42;
  45. VERIFY(v.to_int().value() == 42);
  46. }
  47. TEST_CASE(serialize_int_value)
  48. {
  49. SQL::Value v(SQL::SQLType::Text);
  50. v = 42;
  51. VERIFY(v.to_int().value() == 42);
  52. ByteBuffer buffer;
  53. v.serialize(buffer);
  54. size_t offset = 0;
  55. SQL::Value v2(SQL::SQLType::Text, buffer, offset);
  56. VERIFY(v2 == v);
  57. }
  58. TEST_CASE(float_value)
  59. {
  60. SQL::Value v(SQL::SQLType::Float);
  61. v = 3.14;
  62. VERIFY(v.to_double().value() - 3.14 < 0.001);
  63. }
  64. TEST_CASE(assign_text_value_to_int)
  65. {
  66. SQL::Value text(SQL::SQLType::Text);
  67. text = "42";
  68. SQL::Value integer(SQL::SQLType::Integer);
  69. integer = text;
  70. EXPECT_EQ(integer.to_int().value(), 42);
  71. }
  72. TEST_CASE(assign_int_to_text_value)
  73. {
  74. SQL::Value text(SQL::SQLType::Text);
  75. text = 42;
  76. EXPECT_EQ((String)text, "42");
  77. }
  78. TEST_CASE(copy_value)
  79. {
  80. SQL::Value text(SQL::SQLType::Text);
  81. text = 42;
  82. SQL::Value copy(text);
  83. EXPECT_EQ((String)copy, "42");
  84. }
  85. TEST_CASE(compare_text_to_int)
  86. {
  87. SQL::Value text(SQL::SQLType::Text);
  88. text = 42;
  89. SQL::Value integer(SQL::SQLType::Integer);
  90. integer = 42;
  91. EXPECT(text == integer);
  92. EXPECT(integer == text);
  93. }
  94. TEST_CASE(order_text_values)
  95. {
  96. SQL::Value v1(SQL::SQLType::Text);
  97. v1 = "Test_A";
  98. SQL::Value v2(SQL::SQLType::Text);
  99. v2 = "Test_B";
  100. EXPECT(v1 <= v2);
  101. EXPECT(v1 < v2);
  102. EXPECT(v2 >= v1);
  103. EXPECT(v2 > v1);
  104. }
  105. TEST_CASE(order_int_values)
  106. {
  107. SQL::Value v1(SQL::SQLType::Integer);
  108. v1 = 12;
  109. SQL::Value v2(SQL::SQLType::Integer);
  110. v2 = 42;
  111. EXPECT(v1 <= v2);
  112. EXPECT(v1 < v2);
  113. EXPECT(v2 >= v1);
  114. EXPECT(v2 > v1);
  115. }
  116. TEST_CASE(tuple)
  117. {
  118. SQL::TupleDescriptor descriptor;
  119. descriptor.append({ "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  120. descriptor.append({ "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  121. SQL::Tuple tuple(descriptor);
  122. tuple["col1"] = "Test";
  123. tuple["col2"] = 42;
  124. VERIFY(tuple[0] == "Test");
  125. VERIFY(tuple[1] == 42);
  126. }
  127. TEST_CASE(serialize_tuple)
  128. {
  129. SQL::TupleDescriptor descriptor;
  130. descriptor.append({ "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  131. descriptor.append({ "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  132. SQL::Tuple tuple(descriptor);
  133. tuple["col1"] = "Test";
  134. tuple["col2"] = 42;
  135. auto buffer = ByteBuffer();
  136. tuple.serialize(buffer);
  137. EXPECT_EQ((String)tuple[0], "Test");
  138. EXPECT_EQ((int)tuple[1], 42);
  139. size_t offset = 0;
  140. SQL::Tuple tuple2(descriptor, buffer, offset);
  141. VERIFY(tuple2[0] == "Test");
  142. VERIFY(tuple2[1] == 42);
  143. }
  144. TEST_CASE(copy_tuple)
  145. {
  146. SQL::TupleDescriptor descriptor;
  147. descriptor.append({ "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  148. descriptor.append({ "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  149. SQL::Tuple tuple(descriptor);
  150. tuple["col1"] = "Test";
  151. tuple["col2"] = 42;
  152. SQL::Tuple copy;
  153. copy = tuple;
  154. VERIFY(tuple == copy);
  155. SQL::Tuple copy_2(copy);
  156. VERIFY(tuple == copy_2);
  157. }
  158. TEST_CASE(compare_tuples)
  159. {
  160. SQL::TupleDescriptor descriptor;
  161. descriptor.append({ "col1", SQL::SQLType::Text, SQL::Order::Ascending });
  162. descriptor.append({ "col2", SQL::SQLType::Integer, SQL::Order::Descending });
  163. SQL::Tuple tuple1(descriptor);
  164. tuple1["col1"] = "Test";
  165. tuple1["col2"] = 42;
  166. SQL::Tuple tuple2(descriptor);
  167. tuple2["col1"] = "Test";
  168. tuple2["col2"] = 12;
  169. SQL::Tuple tuple3(descriptor);
  170. tuple3["col1"] = "Text";
  171. tuple3["col2"] = 12;
  172. EXPECT(tuple1 <= tuple2);
  173. EXPECT(tuple1 < tuple2);
  174. EXPECT(tuple2 >= tuple1);
  175. EXPECT(tuple2 > tuple1);
  176. EXPECT(tuple1 <= tuple3);
  177. EXPECT(tuple1 < tuple3);
  178. EXPECT(tuple3 >= tuple1);
  179. EXPECT(tuple3 > tuple1);
  180. }