Przeglądaj źródła

Extended Boolean class

- added "XOR" method for exclusive or check
- extended tests for Boolean class
pcmattulat 4 lat temu
rodzic
commit
8eef89e34d

+ 16 - 0
source/boxing/Boolean.cpp

@@ -87,6 +87,22 @@ std::string ls_std::Boolean::toString()
   return this->_toString();
 }
 
+bool ls_std::Boolean::XOR(const Boolean &_leftExpression, const Boolean &_rightExpression) {
+  return (_leftExpression && !_rightExpression) || (!_leftExpression && _rightExpression);
+}
+
+bool ls_std::Boolean::XOR(const Boolean &_leftExpression, bool _rightExpression) {
+  return (_leftExpression && !_rightExpression) || (!_leftExpression && _rightExpression);
+}
+
+bool ls_std::Boolean::XOR(bool _leftExpression, const Boolean &_rightExpression) {
+  return (_leftExpression && !_rightExpression) || (!_leftExpression && _rightExpression);
+}
+
+bool ls_std::Boolean::XOR(bool _leftExpression, bool _rightExpression) {
+  return (_leftExpression && !_rightExpression) || (!_leftExpression && _rightExpression);
+}
+
 std::string ls_std::Boolean::_toString() const
 {
   std::string booleanString {};

+ 5 - 5
source/boxing/Boolean.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-09
- * Changed:         2020-08-09
+ * Changed:         2020-08-13
  *
  * */
 
@@ -57,10 +57,10 @@ namespace ls_std {
 
       // additional functionality
 
-//      static bool XOR(const Boolean& _leftExpression, const Boolean& _rightExpression);
-//      static bool AND(const Boolean& _leftExpression, const Boolean& _rightExpression);
-//      static bool NOT(const Boolean& _leftExpression, const Boolean& _rightExpression);
-//      static bool OR(const Boolean& _leftExpression, const Boolean& _rightExpression);
+      static bool XOR(const Boolean& _leftExpression, const Boolean& _rightExpression);
+      static bool XOR(const Boolean& _leftExpression, bool _rightExpression);
+      static bool XOR(bool _leftExpression, const Boolean& _rightExpression);
+      static bool XOR(bool _leftExpression, bool _rightExpression);
 
     private:
 

+ 38 - 0
test/cases/boxing/BooleanTest.cpp

@@ -24,6 +24,8 @@ namespace {
       {}
   };
 
+  // assignment operators
+
   TEST_F(BooleanTest, operatorAssignment)
   {
     ls_std::Boolean expression {};
@@ -35,6 +37,8 @@ namespace {
     ASSERT_TRUE(expression);
   }
 
+  // stream operators
+
   TEST_F(BooleanTest, operatorOutputStream)
   {
     ls_std::Boolean expression {true};
@@ -44,6 +48,8 @@ namespace {
     ASSERT_STREQ("true", _stream.str().c_str());
   }
 
+  // logical operators
+
   TEST_F(BooleanTest, operatorNot) {
     ls_std::Boolean expression {};
     ASSERT_TRUE(!expression);
@@ -98,6 +104,8 @@ namespace {
     ASSERT_FALSE(0 || expressionA);
   }
 
+  // implementation
+
   TEST_F(BooleanTest, parse)
   {
     ls_std::Boolean expression {};
@@ -134,4 +142,34 @@ namespace {
     expression = 4 < 3;
     ASSERT_STREQ("false", expression.toString().c_str());
   }
+
+  // additional functionality
+
+  TEST_F(BooleanTest, XOR)
+  {
+    ls_std::Boolean x {2 < 3};
+    ls_std::Boolean y {4 < 3};
+
+    ASSERT_TRUE(ls_std::Boolean::XOR(x, y));
+    ASSERT_TRUE(ls_std::Boolean::XOR(y, x));
+    ASSERT_TRUE(ls_std::Boolean::XOR(y, true));
+    ASSERT_TRUE(ls_std::Boolean::XOR(true, y));
+    ASSERT_TRUE(ls_std::Boolean::XOR(true, false));
+    ASSERT_TRUE(ls_std::Boolean::XOR(false, true));
+  }
+
+  TEST_F(BooleanTest, XORNegative)
+  {
+    ls_std::Boolean w {};
+    ls_std::Boolean x {true};
+    ls_std::Boolean y {};
+    ls_std::Boolean z {true};
+
+    ASSERT_FALSE(ls_std::Boolean::XOR(x, z));
+    ASSERT_FALSE(ls_std::Boolean::XOR(w, y));
+    ASSERT_FALSE(ls_std::Boolean::XOR(true, true));
+    ASSERT_FALSE(ls_std::Boolean::XOR(false, false));
+    ASSERT_FALSE(ls_std::Boolean::XOR(w, false));
+    ASSERT_FALSE(ls_std::Boolean::XOR(false, w));
+  }
 }