1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program Tester Core 3 * ---------------------------------------- 4 * 5 * Copyright 2015 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Template class that is either type of Left or Right. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "tcuEither.hpp" 25 26 namespace tcu 27 { 28 namespace 29 { 30 31 enum 32 { 33 COPYCHECK_VALUE = 1637423219 34 }; 35 36 class TestClassWithConstructor 37 { 38 public: 39 TestClassWithConstructor (int i) 40 : m_i (i) 41 , m_copyCheck (COPYCHECK_VALUE) 42 { 43 } 44 45 ~TestClassWithConstructor (void) 46 { 47 DE_TEST_ASSERT(m_copyCheck == COPYCHECK_VALUE); 48 } 49 50 TestClassWithConstructor (const TestClassWithConstructor& other) 51 : m_i (other.m_i) 52 , m_copyCheck (other.m_copyCheck) 53 { 54 } 55 56 TestClassWithConstructor& operator= (const TestClassWithConstructor& other) 57 { 58 TCU_CHECK(m_copyCheck == COPYCHECK_VALUE); 59 60 if (this == &other) 61 return *this; 62 63 m_i = other.m_i; 64 m_copyCheck = other.m_copyCheck; 65 66 TCU_CHECK(m_copyCheck == COPYCHECK_VALUE); 67 68 return *this; 69 } 70 71 int getValue (void) const 72 { 73 TCU_CHECK(m_copyCheck == COPYCHECK_VALUE); 74 75 return m_i; 76 } 77 78 private: 79 int m_i; 80 int m_copyCheck; 81 }; 82 83 } // anonymous 84 85 void Either_selfTest (void) 86 { 87 // Simple test for first 88 { 89 const int intValue = 1503457782; 90 const Either<int, float> either (intValue); 91 92 TCU_CHECK(either.isFirst()); 93 TCU_CHECK(!either.isSecond()); 94 95 TCU_CHECK(either.is<int>()); 96 TCU_CHECK(!either.is<float>()); 97 98 TCU_CHECK(either.getFirst() == intValue); 99 TCU_CHECK(either.get<int>() == intValue); 100 } 101 102 // Simple test for second 103 { 104 const float floatValue = 0.43223332995f; 105 const Either<int, float> either (floatValue); 106 107 TCU_CHECK(!either.isFirst()); 108 TCU_CHECK(either.isSecond()); 109 110 TCU_CHECK(!either.is<int>()); 111 TCU_CHECK(either.is<float>()); 112 113 TCU_CHECK(either.getSecond() == floatValue); 114 TCU_CHECK(either.get<float>() == floatValue); 115 } 116 117 // Assign first value 118 { 119 const int intValue = 1942092699; 120 const float floatValue = 0.43223332995f; 121 Either<int, float> either (floatValue); 122 123 either = intValue; 124 125 TCU_CHECK(either.isFirst()); 126 TCU_CHECK(!either.isSecond()); 127 128 TCU_CHECK(either.is<int>()); 129 TCU_CHECK(!either.is<float>()); 130 131 TCU_CHECK(either.getFirst() == intValue); 132 TCU_CHECK(either.get<int>() == intValue); 133 } 134 135 // Assign second value 136 { 137 const int intValue = 1942092699; 138 const float floatValue = 0.43223332995f; 139 Either<int, float> either (intValue); 140 141 either = floatValue; 142 143 TCU_CHECK(!either.isFirst()); 144 TCU_CHECK(either.isSecond()); 145 146 TCU_CHECK(!either.is<int>()); 147 TCU_CHECK(either.is<float>()); 148 149 TCU_CHECK(either.getSecond() == floatValue); 150 TCU_CHECK(either.get<float>() == floatValue); 151 } 152 153 // Assign first either value 154 { 155 const int intValue = 1942092699; 156 const float floatValue = 0.43223332995f; 157 Either<int, float> either (floatValue); 158 const Either<int, float> otherEither (intValue); 159 160 either = otherEither; 161 162 TCU_CHECK(either.isFirst()); 163 TCU_CHECK(!either.isSecond()); 164 165 TCU_CHECK(either.is<int>()); 166 TCU_CHECK(!either.is<float>()); 167 168 TCU_CHECK(either.getFirst() == intValue); 169 TCU_CHECK(either.get<int>() == intValue); 170 } 171 172 // Assign second either value 173 { 174 const int intValue = 1942092699; 175 const float floatValue = 0.43223332995f; 176 Either<int, float> either (intValue); 177 const Either<int, float> otherEither (floatValue); 178 179 either = otherEither; 180 181 TCU_CHECK(!either.isFirst()); 182 TCU_CHECK(either.isSecond()); 183 184 TCU_CHECK(!either.is<int>()); 185 TCU_CHECK(either.is<float>()); 186 187 TCU_CHECK(either.getSecond() == floatValue); 188 TCU_CHECK(either.get<float>() == floatValue); 189 } 190 191 // Simple test for first with constructor 192 { 193 const TestClassWithConstructor testObject (171899615); 194 const Either<TestClassWithConstructor, int> either (testObject); 195 196 TCU_CHECK(either.isFirst()); 197 TCU_CHECK(!either.isSecond()); 198 199 TCU_CHECK(either.is<TestClassWithConstructor>()); 200 TCU_CHECK(!either.is<int>()); 201 202 TCU_CHECK(either.getFirst().getValue() == testObject.getValue()); 203 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 204 } 205 206 // Simple test for second with constructor 207 { 208 const TestClassWithConstructor testObject (171899615); 209 const Either<int, TestClassWithConstructor> either (testObject); 210 211 TCU_CHECK(!either.isFirst()); 212 TCU_CHECK(either.isSecond()); 213 214 TCU_CHECK(either.is<TestClassWithConstructor>()); 215 TCU_CHECK(!either.is<int>()); 216 217 TCU_CHECK(either.getSecond().getValue() == testObject.getValue()); 218 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 219 } 220 221 // Assign first with constructor 222 { 223 const int intValue = 1942092699; 224 const TestClassWithConstructor testObject (171899615); 225 Either<TestClassWithConstructor, int> either (intValue); 226 227 either = testObject; 228 229 TCU_CHECK(either.isFirst()); 230 TCU_CHECK(!either.isSecond()); 231 232 TCU_CHECK(either.is<TestClassWithConstructor>()); 233 TCU_CHECK(!either.is<int>()); 234 235 TCU_CHECK(either.getFirst().getValue() == testObject.getValue()); 236 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 237 } 238 239 // Assign second with constructor 240 { 241 const int intValue = 1942092699; 242 const TestClassWithConstructor testObject (171899615); 243 Either<int, TestClassWithConstructor> either (intValue); 244 245 either = testObject; 246 247 TCU_CHECK(!either.isFirst()); 248 TCU_CHECK(either.isSecond()); 249 250 TCU_CHECK(either.is<TestClassWithConstructor>()); 251 TCU_CHECK(!either.is<int>()); 252 253 TCU_CHECK(either.getSecond().getValue() == testObject.getValue()); 254 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 255 } 256 257 // Assign first either with constructor 258 { 259 const int intValue = 1942092699; 260 const TestClassWithConstructor testObject (171899615); 261 Either<TestClassWithConstructor, int> either (intValue); 262 const Either<TestClassWithConstructor, int> otherEither (testObject); 263 264 either = otherEither; 265 266 TCU_CHECK(either.isFirst()); 267 TCU_CHECK(!either.isSecond()); 268 269 TCU_CHECK(either.is<TestClassWithConstructor>()); 270 TCU_CHECK(!either.is<int>()); 271 272 TCU_CHECK(either.getFirst().getValue() == testObject.getValue()); 273 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 274 } 275 276 // Assign second either with constructor 277 { 278 const int intValue = 1942092699; 279 const TestClassWithConstructor testObject (171899615); 280 Either<int, TestClassWithConstructor> either (intValue); 281 const Either<int, TestClassWithConstructor> otherEither (testObject); 282 283 either = otherEither; 284 285 TCU_CHECK(!either.isFirst()); 286 TCU_CHECK(either.isSecond()); 287 288 TCU_CHECK(either.is<TestClassWithConstructor>()); 289 TCU_CHECK(!either.is<int>()); 290 291 TCU_CHECK(either.getSecond().getValue() == testObject.getValue()); 292 TCU_CHECK(either.get<TestClassWithConstructor>().getValue() == testObject.getValue()); 293 } 294 } 295 296 } // tcu 297