1 #ifndef _XETESTCASE_HPP 2 #define _XETESTCASE_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program Test Executor 5 * ------------------------------------------ 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Test case. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "xeDefs.hpp" 27 28 #include <string> 29 #include <vector> 30 #include <set> 31 #include <map> 32 33 namespace xe 34 { 35 36 enum TestCaseType 37 { 38 TESTCASETYPE_SELF_VALIDATE, 39 TESTCASETYPE_CAPABILITY, 40 TESTCASETYPE_ACCURACY, 41 TESTCASETYPE_PERFORMANCE, 42 43 TESTCASETYPE_LAST 44 }; 45 46 const char* getTestCaseTypeName (TestCaseType caseType); 47 48 enum TestNodeType 49 { 50 TESTNODETYPE_ROOT, 51 TESTNODETYPE_GROUP, 52 TESTNODETYPE_TEST_CASE, 53 54 TESTNODETYPE_LAST 55 }; 56 57 class TestGroup; 58 class TestCase; 59 60 class TestNode 61 { 62 public: 63 virtual ~TestNode (void) {} 64 65 TestNodeType getNodeType (void) const { return m_nodeType; } 66 const char* getName (void) const { return m_name.c_str(); } 67 const TestGroup* getParent (void) const { return m_parent; } 68 69 void getFullPath (std::string& path) const; 70 std::string getFullPath (void) const { std::string str; getFullPath(str); return str; } 71 72 const TestNode* find (const char* path) const; 73 TestNode* find (const char* path); 74 75 protected: 76 TestNode (TestGroup* parent, TestNodeType nodeType, const char* name, const char* desc); 77 78 private: 79 TestNode (const TestNode& other); 80 TestNode& operator= (const TestNode& other); 81 82 TestGroup* m_parent; 83 TestNodeType m_nodeType; 84 std::string m_name; 85 std::string m_description; 86 }; 87 88 class TestGroup : public TestNode 89 { 90 public: 91 ~TestGroup (void); 92 93 int getNumChildren (void) const { return (int)m_children.size(); } 94 TestNode* getChild (int ndx) { return m_children[ndx]; } 95 const TestNode* getChild (int ndx) const { return m_children[ndx]; } 96 97 TestNode* findChildNode (const char* path); 98 const TestNode* findChildNode (const char* path) const; 99 100 TestGroup* createGroup (const char* name, const char* description); 101 TestCase* createCase (TestCaseType caseType, const char* name, const char* description); 102 103 protected: 104 TestGroup (TestGroup* parent, TestNodeType nodeType, const char* name, const char* description); 105 106 private: 107 std::vector<TestNode*> m_children; 108 std::set<std::string> m_childNames; //!< Used for checking for duplicate test case names. 109 110 // For adding TestCase to m_children. \todo [2012-06-15 pyry] Is the API broken perhaps? 111 friend class TestNode; 112 }; 113 114 class TestRoot : public TestGroup 115 { 116 public: 117 TestRoot (void); 118 }; 119 120 class TestCase : public TestNode 121 { 122 public: 123 ~TestCase (void); 124 125 TestCaseType getCaseType (void) const { return m_caseType; } 126 127 static TestCase* createAsChild (TestGroup* parent, TestCaseType caseType, const char* name, const char* description); 128 129 protected: 130 TestCase (TestGroup* parent, TestCaseType caseType, const char* name, const char* description); 131 132 private: 133 TestCaseType m_caseType; 134 }; 135 136 // Helper class for efficiently constructing TestCase hierarchy from test case list. 137 class TestHierarchyBuilder 138 { 139 public: 140 TestHierarchyBuilder (TestRoot* root); 141 ~TestHierarchyBuilder (void); 142 143 TestCase* createCase (const char* path, TestCaseType caseType); 144 145 private: 146 TestHierarchyBuilder (const TestHierarchyBuilder& other); 147 TestHierarchyBuilder& operator= (const TestHierarchyBuilder& other); 148 149 TestRoot* m_root; 150 std::map<std::string, TestGroup*> m_groupMap; 151 }; 152 153 // Helper class for computing and iterating test sets. 154 class TestSet 155 { 156 public: 157 TestSet (void) {} 158 ~TestSet (void) {} 159 160 bool empty (void) const { return m_set.empty(); } 161 162 void add (const TestNode* node); 163 void addCase (const TestCase* testCase); 164 void addGroup (const TestGroup* testGroup); 165 166 void remove (const TestNode* node); 167 void removeCase (const TestCase* testCase); 168 void removeGroup (const TestGroup* testGroup); 169 170 bool hasNode (const TestNode* node) const { return m_set.find(node) != m_set.end(); } 171 172 private: 173 std::set<const TestNode*> m_set; 174 }; 175 176 class ConstTestNodeIterator 177 { 178 public: 179 static ConstTestNodeIterator begin (const TestNode* root); 180 static ConstTestNodeIterator end (const TestNode* root); 181 182 ConstTestNodeIterator& operator++ (void); 183 ConstTestNodeIterator operator++ (int); 184 185 const TestNode* operator* (void) const; 186 187 bool operator!= (const ConstTestNodeIterator& other) const; 188 189 protected: 190 ConstTestNodeIterator (const TestNode* root); 191 192 private: 193 struct GroupState 194 { 195 GroupState (const TestGroup* group_) : group(group_), childNdx(0) {} 196 197 const TestGroup* group; 198 int childNdx; 199 200 bool operator!= (const GroupState& other) const 201 { 202 return group != other.group || childNdx != other.childNdx; 203 } 204 205 bool operator== (const GroupState& other) const 206 { 207 return group == other.group && childNdx == other.childNdx; 208 } 209 }; 210 211 const TestNode* m_root; 212 std::vector<GroupState> m_iterStack; 213 }; 214 215 // \todo [2012-06-19 pyry] Implement following iterators: 216 // - TestNodeIterator 217 // - ConstTestSetIterator 218 // - TestSetIterator 219 220 } // xe 221 222 #endif // _XETESTCASE_HPP 223