From b8a4401a3e5783469f6c0a881ed7a79ac28fbbb2 Mon Sep 17 00:00:00 2001
From: Stuart Mark James <stuart.james@esrf.fr>
Date: Wed, 17 Jul 2019 09:42:51 +0200
Subject: [PATCH] Fix and test traits valid check

---
 src/AttributeTraits.cpp       |  2 +-
 test/AttributeTraitsTests.cpp | 64 +++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/src/AttributeTraits.cpp b/src/AttributeTraits.cpp
index f162e4e..5d7ed55 100644
--- a/src/AttributeTraits.cpp
+++ b/src/AttributeTraits.cpp
@@ -28,7 +28,7 @@ namespace hdbpp_internal
 bool AttributeTraits::isValid() const noexcept
 {
     // ensure all the type information is valid
-    return _attr_write_type != Tango::WT_UNKNOWN || _attr_format != Tango::FMT_UNKNOWN ||
+    return _attr_write_type != Tango::WT_UNKNOWN && _attr_format != Tango::FMT_UNKNOWN &&
         _attr_type != Tango::DATA_TYPE_UNKNOWN;
 }
 
diff --git a/test/AttributeTraitsTests.cpp b/test/AttributeTraitsTests.cpp
index 17ef189..72a9d83 100644
--- a/test/AttributeTraitsTests.cpp
+++ b/test/AttributeTraitsTests.cpp
@@ -28,6 +28,7 @@ SCENARIO("Attribute format returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as an Array")
     {
         AttributeTraits traits {Tango::READ, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are an array")
         {
@@ -46,6 +47,7 @@ SCENARIO("Attribute format returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as a Scalar")
     {
         AttributeTraits traits {Tango::READ, Tango::SCALAR, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are an array")
         {
@@ -64,6 +66,7 @@ SCENARIO("Attribute format returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as an Image")
     {
         AttributeTraits traits {Tango::READ, Tango::IMAGE, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are an array")
         {
@@ -85,6 +88,7 @@ SCENARIO("Attribute write type returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as ReadOnly")
     {
         AttributeTraits traits {Tango::READ, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are ReadOnly")
         {
@@ -115,6 +119,7 @@ SCENARIO("Attribute write type returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as WriteOnly")
     {
         AttributeTraits traits {Tango::WRITE, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are ReadOnly")
         {
@@ -145,6 +150,7 @@ SCENARIO("Attribute write type returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as ReadWrite")
     {
         AttributeTraits traits {Tango::READ_WRITE, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are ReadOnly")
         {
@@ -175,6 +181,7 @@ SCENARIO("Attribute write type returns expected results", "[attribute-traits]")
     GIVEN("Constructed AttributeTraits as ReadWithWrite")
     {
         AttributeTraits traits {Tango::READ_WITH_WRITE, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits are ReadOnly")
         {
@@ -208,6 +215,7 @@ SCENARIO("Attribute traits accessors return construction time results", "[attrib
     GIVEN("Constructed AttributeTraits as a Read Only Array of type Tango::DEV_BOOLEAN")
     {
         AttributeTraits traits {Tango::READ, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+        REQUIRE(traits.isValid());
 
         WHEN("Checking if traits type is Tango::DEV_BOOLEAN")
         {
@@ -223,3 +231,59 @@ SCENARIO("Attribute traits accessors return construction time results", "[attrib
         }
     }
 }
+
+SCENARIO("Attribute traits are invalid if not set with valid traits", "[attribute-traits]")
+{
+    GIVEN("Constructing an AttributeTraits with no traits")
+    {
+        AttributeTraits traits;
+
+        WHEN("Checking if traits type is valid")
+        {
+            THEN("Result is false") 
+            { 
+                REQUIRE(!traits.isValid()); 
+                REQUIRE(traits.isInvalid()); 
+            }
+        }
+    }
+    GIVEN("Constructing an AttributeTraits with valid write trait")
+    {
+        AttributeTraits traits {Tango::READ, Tango::FMT_UNKNOWN, Tango::DATA_TYPE_UNKNOWN};
+
+        WHEN("Checking if traits type is valid")
+        {
+            THEN("Result is false") 
+            { 
+                REQUIRE(!traits.isValid()); 
+                REQUIRE(traits.isInvalid()); 
+            }
+        }
+    }
+    GIVEN("Constructed AttributeTraits with valid format and write traits")
+    {
+        AttributeTraits traits {Tango::READ, Tango::SPECTRUM, Tango::DATA_TYPE_UNKNOWN};
+
+        WHEN("Checking if traits type is valid")
+        {
+            THEN("Result is false") 
+            { 
+                REQUIRE(!traits.isValid()); 
+                REQUIRE(traits.isInvalid()); 
+            }
+        }
+    }
+    GIVEN("Constructed AttributeTraits with valid traits")
+    {
+        AttributeTraits traits {Tango::READ, Tango::SPECTRUM, Tango::DEV_BOOLEAN};
+
+        WHEN("Checking if traits type is valid")
+        {
+            THEN("Result is true") 
+            { 
+                REQUIRE(traits.isValid()); 
+                REQUIRE(!traits.isInvalid()); 
+            }
+        }
+    }
+}
\ No newline at end of file
-- 
GitLab