BooleanTest.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * Author: Patrick-Christopher Mattulat
  3. * Co-Author: Claude Sonnet 4.6 (LLM)
  4. * Company: Lynar Studios
  5. * E-Mail: webmaster@lynarstudios.com
  6. * Created: 2020-08-09
  7. * Changed: 2026-06-23
  8. *
  9. * */
  10. #include <gtest/gtest.h>
  11. #include <ls-std/ls-std-boxing.hpp>
  12. #include <ls-std/ls-std-core.hpp>
  13. using ls::standard::boxing::Boolean;
  14. using ls::standard::core::IllegalArgumentException;
  15. using std::ostringstream;
  16. using testing::Test;
  17. namespace
  18. {
  19. class BooleanTest : public Test
  20. {
  21. public:
  22. BooleanTest() = default;
  23. ~BooleanTest() override = default;
  24. };
  25. // assignment operators
  26. TEST_F(BooleanTest, operator_assignment_boolean)
  27. {
  28. Boolean expression{};
  29. expression = true;
  30. ASSERT_TRUE(expression.getValue());
  31. }
  32. TEST_F(BooleanTest, operator_assignment_integer)
  33. {
  34. Boolean expression{};
  35. expression = 1;
  36. ASSERT_TRUE(expression.getValue());
  37. }
  38. // stream operators
  39. TEST_F(BooleanTest, operator_output_stream)
  40. {
  41. Boolean expression{true};
  42. ostringstream _stream{};
  43. _stream << expression;
  44. ASSERT_STREQ("true", _stream.str().c_str());
  45. }
  46. // logical operators
  47. TEST_F(BooleanTest, operator_negation_negative_value)
  48. {
  49. const Boolean expression{};
  50. ASSERT_TRUE(!expression);
  51. }
  52. TEST_F(BooleanTest, operator_negation_positive_value)
  53. {
  54. const Boolean expression{true};
  55. ASSERT_FALSE(!expression);
  56. }
  57. TEST_F(BooleanTest, operator_and)
  58. {
  59. Boolean expressionA{true};
  60. Boolean expressionB{true};
  61. ASSERT_TRUE(expressionA && expressionB);
  62. ASSERT_TRUE(expressionB && expressionA);
  63. ASSERT_TRUE(expressionA && true);
  64. ASSERT_TRUE(expressionA && 1);
  65. ASSERT_TRUE(1 && expressionB.getValue());
  66. }
  67. TEST_F(BooleanTest, operator_and_with_false_result)
  68. {
  69. Boolean expressionA{true};
  70. Boolean expressionB{false};
  71. ASSERT_FALSE(expressionA && expressionB);
  72. ASSERT_FALSE(expressionB && expressionA);
  73. }
  74. TEST_F(BooleanTest, operator_or)
  75. {
  76. Boolean expressionA{false};
  77. Boolean expressionB{true};
  78. ASSERT_TRUE(expressionA || expressionB);
  79. ASSERT_TRUE(expressionB || expressionA);
  80. ASSERT_TRUE(1 || expressionA.getValue());
  81. }
  82. TEST_F(BooleanTest, operator_or_with_false_result)
  83. {
  84. Boolean expressionA{false};
  85. Boolean expressionB{false};
  86. ASSERT_FALSE(expressionA || expressionB);
  87. ASSERT_FALSE(expressionB || expressionA);
  88. ASSERT_FALSE(expressionA || 0);
  89. ASSERT_FALSE(expressionA || false);
  90. ASSERT_FALSE(0 || expressionA.getValue());
  91. }
  92. // implementation
  93. TEST_F(BooleanTest, parse_true_value)
  94. {
  95. Boolean expression{};
  96. expression.parse("true");
  97. ASSERT_TRUE(expression.getValue());
  98. expression.parse("tRue");
  99. ASSERT_TRUE(expression.getValue());
  100. expression.parse("TRUE");
  101. ASSERT_TRUE(expression.getValue());
  102. }
  103. TEST_F(BooleanTest, parse_false_value)
  104. {
  105. Boolean expression{};
  106. expression.parse("false");
  107. ASSERT_FALSE(expression);
  108. expression.parse("fAlSe");
  109. ASSERT_FALSE(expression);
  110. expression.parse("FALSE");
  111. ASSERT_FALSE(expression);
  112. }
  113. TEST_F(BooleanTest, parse_with_invalid_parameter)
  114. {
  115. EXPECT_THROW(
  116. {
  117. try
  118. {
  119. Boolean expression{};
  120. expression.parse("hello");
  121. }
  122. catch (const IllegalArgumentException &_exception)
  123. {
  124. throw;
  125. }
  126. },
  127. IllegalArgumentException);
  128. }
  129. TEST_F(BooleanTest, toString_true)
  130. {
  131. Boolean expression{2 < 3};
  132. ASSERT_STREQ("true", expression.toString().c_str());
  133. }
  134. TEST_F(BooleanTest, toString_false)
  135. {
  136. Boolean expression{4 < 3};
  137. ASSERT_STREQ("false", expression.toString().c_str());
  138. }
  139. // additional functionality
  140. TEST_F(BooleanTest, getValue)
  141. {
  142. const Boolean x{2 < 3};
  143. ASSERT_TRUE(x.getValue());
  144. }
  145. TEST_F(BooleanTest, XOR_with_positive_result)
  146. {
  147. Boolean x{2 < 3};
  148. Boolean y{4 < 3};
  149. ASSERT_TRUE(Boolean::XOR(x, y));
  150. ASSERT_TRUE(Boolean::XOR(y, x));
  151. ASSERT_TRUE(Boolean::XOR(y, true));
  152. ASSERT_TRUE(Boolean::XOR(true, y));
  153. ASSERT_TRUE(Boolean::XOR(true, false));
  154. ASSERT_TRUE(Boolean::XOR(false, true));
  155. }
  156. TEST_F(BooleanTest, XOR_with_negative_result)
  157. {
  158. Boolean w{};
  159. Boolean x{true};
  160. Boolean y{};
  161. Boolean z{true};
  162. ASSERT_FALSE(Boolean::XOR(x, z));
  163. ASSERT_FALSE(Boolean::XOR(w, y));
  164. ASSERT_FALSE(Boolean::XOR(true, true));
  165. ASSERT_FALSE(Boolean::XOR(false, false));
  166. ASSERT_FALSE(Boolean::XOR(w, false));
  167. ASSERT_FALSE(Boolean::XOR(false, w));
  168. }
  169. }