| 1 | /**************************************************************************** | 
| 2 | ** | 
| 3 | ** Copyright (C) 2016 Paul Lemire <paul.lemire350@gmail.com> | 
| 4 | ** Contact: https://www.qt.io/licensing/ | 
| 5 | ** | 
| 6 | ** This file is part of the Qt3D module of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ | 
| 9 | ** Commercial License Usage | 
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | 
| 11 | ** accordance with the commercial license agreement provided with the | 
| 12 | ** Software or, alternatively, in accordance with the terms contained in | 
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | 
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further | 
| 15 | ** information use the contact form at https://www.qt.io/contact-us. | 
| 16 | ** | 
| 17 | ** GNU General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU | 
| 19 | ** General Public License version 3 as published by the Free Software | 
| 20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
| 21 | ** included in the packaging of this file. Please review the following | 
| 22 | ** information to ensure the GNU General Public License requirements will | 
| 23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. | 
| 24 | ** | 
| 25 | ** $QT_END_LICENSE$ | 
| 26 | ** | 
| 27 | ****************************************************************************/ | 
| 28 |  | 
| 29 | // TODO Remove in Qt6 | 
| 30 | #include <QtCore/qcompilerdetection.h> | 
| 31 | QT_WARNING_DISABLE_DEPRECATED | 
| 32 |  | 
| 33 | #include <QtTest/QTest> | 
| 34 | #include <Qt3DRender/qabstracttexture.h> | 
| 35 | #include <Qt3DRender/private/qabstracttexture_p.h> | 
| 36 | #include <QObject> | 
| 37 | #include <QSignalSpy> | 
| 38 | #include <Qt3DRender/qabstracttextureimage.h> | 
| 39 | #include <Qt3DCore/qpropertyupdatedchange.h> | 
| 40 | #include <Qt3DCore/qpropertynodeaddedchange.h> | 
| 41 | #include <Qt3DCore/qpropertynoderemovedchange.h> | 
| 42 | #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> | 
| 43 | #include <Qt3DCore/private/qnodevisitor_p.h> | 
| 44 | #include <Qt3DCore/qnodecreatedchange.h> | 
| 45 | #include "testpostmanarbiter.h" | 
| 46 |  | 
| 47 | class FakeTexture : public Qt3DRender::QAbstractTexture | 
| 48 | { | 
| 49 | public: | 
| 50 |     int sharedTextureId() const | 
| 51 |     { | 
| 52 |         return static_cast<Qt3DRender::QAbstractTexturePrivate *>(d_ptr.get())->m_sharedTextureId; | 
| 53 |     } | 
| 54 |  | 
| 55 |     void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override | 
| 56 |     { | 
| 57 |         Qt3DRender::QAbstractTexture::sceneChangeEvent(change); | 
| 58 |     } | 
| 59 |  | 
| 60 | }; | 
| 61 |  | 
| 62 | class FakeTextureImage : public Qt3DRender::QAbstractTextureImage | 
| 63 | { | 
| 64 | protected: | 
| 65 |     Qt3DRender::QTextureImageDataGeneratorPtr dataGenerator() const override | 
| 66 |     { | 
| 67 |         return Qt3DRender::QTextureImageDataGeneratorPtr(); | 
| 68 |     } | 
| 69 | }; | 
| 70 |  | 
| 71 | class tst_QAbstractTexture : public QObject | 
| 72 | { | 
| 73 |     Q_OBJECT | 
| 74 |  | 
| 75 | private Q_SLOTS: | 
| 76 |  | 
| 77 |     void initTestCase() | 
| 78 |     { | 
| 79 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::TextureFormat>(typeName: "TextureFormat" ); | 
| 80 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::Filter>(typeName: "Filter" ); | 
| 81 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::ComparisonFunction>(typeName: "ComparisonFunction" ); | 
| 82 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::ComparisonMode>(typeName: "ComparisonMode" ); | 
| 83 |     } | 
| 84 |  | 
| 85 |     void checkDefaultConstruction() | 
| 86 |     { | 
| 87 |         // GIVEN | 
| 88 |         FakeTexture abstractTexture; | 
| 89 |  | 
| 90 |         // THEN | 
| 91 |         QCOMPARE(abstractTexture.target(), Qt3DRender::QAbstractTexture::Target2D); | 
| 92 |         QCOMPARE(abstractTexture.format(), Qt3DRender::QAbstractTexture::Automatic); | 
| 93 |         QCOMPARE(abstractTexture.generateMipMaps(), false); | 
| 94 |         QCOMPARE(abstractTexture.wrapMode()->x(), Qt3DRender::QTextureWrapMode::ClampToEdge); | 
| 95 |         QCOMPARE(abstractTexture.wrapMode()->y(), Qt3DRender::QTextureWrapMode::ClampToEdge); | 
| 96 |         QCOMPARE(abstractTexture.wrapMode()->z(), Qt3DRender::QTextureWrapMode::ClampToEdge); | 
| 97 |         QCOMPARE(abstractTexture.status(), Qt3DRender::QAbstractTexture::None); | 
| 98 |         QCOMPARE(abstractTexture.width(), 1); | 
| 99 |         QCOMPARE(abstractTexture.height(), 1); | 
| 100 |         QCOMPARE(abstractTexture.depth(), 1); | 
| 101 |         QCOMPARE(abstractTexture.magnificationFilter(), Qt3DRender::QAbstractTexture::Nearest); | 
| 102 |         QCOMPARE(abstractTexture.minificationFilter(),  Qt3DRender::QAbstractTexture::Nearest); | 
| 103 |         QCOMPARE(abstractTexture.maximumAnisotropy(), 1.0f); | 
| 104 |         QCOMPARE(abstractTexture.comparisonFunction(), Qt3DRender::QAbstractTexture::CompareLessEqual); | 
| 105 |         QCOMPARE(abstractTexture.comparisonMode(), Qt3DRender::QAbstractTexture::CompareNone); | 
| 106 |         QCOMPARE(abstractTexture.layers(), 1); | 
| 107 |         QCOMPARE(abstractTexture.samples(), 1); | 
| 108 |         QCOMPARE(abstractTexture.textureImages().size(), 0); | 
| 109 |         QCOMPARE(abstractTexture.samples(), 1); | 
| 110 |         QCOMPARE(abstractTexture.sharedTextureId(), -1); | 
| 111 |         QCOMPARE(abstractTexture.handleType(), Qt3DRender::QAbstractTexture::NoHandle); | 
| 112 |         QCOMPARE(abstractTexture.handle(), QVariant()); | 
| 113 |     } | 
| 114 |  | 
| 115 |     void checkPropertyChanges() | 
| 116 |     { | 
| 117 |         // GIVEN | 
| 118 |         FakeTexture abstractTexture; | 
| 119 |  | 
| 120 |         { | 
| 121 |             // WHEN | 
| 122 |             QSignalSpy spy(&abstractTexture, SIGNAL(formatChanged(TextureFormat))); | 
| 123 |             const Qt3DRender::QAbstractTexture::TextureFormat newValue = Qt3DRender::QAbstractTexture::R8I; | 
| 124 |             abstractTexture.setFormat(newValue); | 
| 125 |  | 
| 126 |             // THEN | 
| 127 |             QVERIFY(spy.isValid()); | 
| 128 |             QCOMPARE(abstractTexture.format(), newValue); | 
| 129 |             QCOMPARE(spy.count(), 1); | 
| 130 |  | 
| 131 |             // WHEN | 
| 132 |             spy.clear(); | 
| 133 |             abstractTexture.setFormat(newValue); | 
| 134 |  | 
| 135 |             // THEN | 
| 136 |             QCOMPARE(abstractTexture.format(), newValue); | 
| 137 |             QCOMPARE(spy.count(), 0); | 
| 138 |         } | 
| 139 |         { | 
| 140 |             // WHEN | 
| 141 |             QSignalSpy spy(&abstractTexture, SIGNAL(generateMipMapsChanged(bool))); | 
| 142 |             const bool newValue = true; | 
| 143 |             abstractTexture.setGenerateMipMaps(newValue); | 
| 144 |  | 
| 145 |             // THEN | 
| 146 |             QVERIFY(spy.isValid()); | 
| 147 |             QCOMPARE(abstractTexture.generateMipMaps(), newValue); | 
| 148 |             QCOMPARE(spy.count(), 1); | 
| 149 |  | 
| 150 |             // WHEN | 
| 151 |             spy.clear(); | 
| 152 |             abstractTexture.setGenerateMipMaps(newValue); | 
| 153 |  | 
| 154 |             // THEN | 
| 155 |             QCOMPARE(abstractTexture.generateMipMaps(), newValue); | 
| 156 |             QCOMPARE(spy.count(), 0); | 
| 157 |         } | 
| 158 |         { | 
| 159 |             // WHEN | 
| 160 |             QSignalSpy spy(&abstractTexture, SIGNAL(widthChanged(int))); | 
| 161 |             const int newValue = 383; | 
| 162 |             abstractTexture.setWidth(newValue); | 
| 163 |  | 
| 164 |             // THEN | 
| 165 |             QVERIFY(spy.isValid()); | 
| 166 |             QCOMPARE(abstractTexture.width(), newValue); | 
| 167 |             QCOMPARE(spy.count(), 1); | 
| 168 |  | 
| 169 |             // WHEN | 
| 170 |             spy.clear(); | 
| 171 |             abstractTexture.setWidth(newValue); | 
| 172 |  | 
| 173 |             // THEN | 
| 174 |             QCOMPARE(abstractTexture.width(), newValue); | 
| 175 |             QCOMPARE(spy.count(), 0); | 
| 176 |         } | 
| 177 |         { | 
| 178 |             // WHEN | 
| 179 |             QSignalSpy spy(&abstractTexture, SIGNAL(heightChanged(int))); | 
| 180 |             const int newValue = 427; | 
| 181 |             abstractTexture.setHeight(newValue); | 
| 182 |  | 
| 183 |             // THEN | 
| 184 |             QVERIFY(spy.isValid()); | 
| 185 |             QCOMPARE(abstractTexture.height(), newValue); | 
| 186 |             QCOMPARE(spy.count(), 1); | 
| 187 |  | 
| 188 |             // WHEN | 
| 189 |             spy.clear(); | 
| 190 |             abstractTexture.setHeight(newValue); | 
| 191 |  | 
| 192 |             // THEN | 
| 193 |             QCOMPARE(abstractTexture.height(), newValue); | 
| 194 |             QCOMPARE(spy.count(), 0); | 
| 195 |         } | 
| 196 |         { | 
| 197 |             // WHEN | 
| 198 |             QSignalSpy spy(&abstractTexture, SIGNAL(depthChanged(int))); | 
| 199 |             const int newValue = 454; | 
| 200 |             abstractTexture.setDepth(newValue); | 
| 201 |  | 
| 202 |             // THEN | 
| 203 |             QVERIFY(spy.isValid()); | 
| 204 |             QCOMPARE(abstractTexture.depth(), newValue); | 
| 205 |             QCOMPARE(spy.count(), 1); | 
| 206 |  | 
| 207 |             // WHEN | 
| 208 |             spy.clear(); | 
| 209 |             abstractTexture.setDepth(newValue); | 
| 210 |  | 
| 211 |             // THEN | 
| 212 |             QCOMPARE(abstractTexture.depth(), newValue); | 
| 213 |             QCOMPARE(spy.count(), 0); | 
| 214 |         } | 
| 215 |         { | 
| 216 |             // WHEN | 
| 217 |             QSignalSpy spy(&abstractTexture, SIGNAL(magnificationFilterChanged(Qt3DRender::QAbstractTexture::Filter))); | 
| 218 |             const Qt3DRender::QAbstractTexture::Filter newValue = Qt3DRender::QAbstractTexture::LinearMipMapLinear; | 
| 219 |             abstractTexture.setMagnificationFilter(newValue); | 
| 220 |  | 
| 221 |             // THEN | 
| 222 |             QVERIFY(spy.isValid()); | 
| 223 |             QCOMPARE(abstractTexture.magnificationFilter(), newValue); | 
| 224 |             QCOMPARE(spy.count(), 1); | 
| 225 |  | 
| 226 |             // WHEN | 
| 227 |             spy.clear(); | 
| 228 |             abstractTexture.setMagnificationFilter(newValue); | 
| 229 |  | 
| 230 |             // THEN | 
| 231 |             QCOMPARE(abstractTexture.magnificationFilter(), newValue); | 
| 232 |             QCOMPARE(spy.count(), 0); | 
| 233 |         } | 
| 234 |         { | 
| 235 |             // WHEN | 
| 236 |             QSignalSpy spy(&abstractTexture, SIGNAL(minificationFilterChanged(Filter))); | 
| 237 |             const Qt3DRender::QAbstractTexture::Filter newValue = Qt3DRender::QAbstractTexture::LinearMipMapNearest; | 
| 238 |             abstractTexture.setMinificationFilter(newValue); | 
| 239 |  | 
| 240 |             // THEN | 
| 241 |             QVERIFY(spy.isValid()); | 
| 242 |             QCOMPARE(abstractTexture.minificationFilter(), newValue); | 
| 243 |             QCOMPARE(spy.count(), 1); | 
| 244 |  | 
| 245 |             // WHEN | 
| 246 |             spy.clear(); | 
| 247 |             abstractTexture.setMinificationFilter(newValue); | 
| 248 |  | 
| 249 |             // THEN | 
| 250 |             QCOMPARE(abstractTexture.minificationFilter(), newValue); | 
| 251 |             QCOMPARE(spy.count(), 0); | 
| 252 |         } | 
| 253 |         { | 
| 254 |             // WHEN | 
| 255 |             QSignalSpy spy(&abstractTexture, SIGNAL(maximumAnisotropyChanged(float))); | 
| 256 |             const float newValue = 100.0f; | 
| 257 |             abstractTexture.setMaximumAnisotropy(newValue); | 
| 258 |  | 
| 259 |             // THEN | 
| 260 |             QVERIFY(spy.isValid()); | 
| 261 |             QCOMPARE(abstractTexture.maximumAnisotropy(), newValue); | 
| 262 |             QCOMPARE(spy.count(), 1); | 
| 263 |  | 
| 264 |             // WHEN | 
| 265 |             spy.clear(); | 
| 266 |             abstractTexture.setMaximumAnisotropy(newValue); | 
| 267 |  | 
| 268 |             // THEN | 
| 269 |             QCOMPARE(abstractTexture.maximumAnisotropy(), newValue); | 
| 270 |             QCOMPARE(spy.count(), 0); | 
| 271 |         } | 
| 272 |         { | 
| 273 |             // WHEN | 
| 274 |             QSignalSpy spy(&abstractTexture, SIGNAL(comparisonFunctionChanged(Qt3DRender::QAbstractTexture::ComparisonFunction))); | 
| 275 |             const Qt3DRender::QAbstractTexture::ComparisonFunction newValue = Qt3DRender::QAbstractTexture::CompareGreaterEqual; | 
| 276 |             abstractTexture.setComparisonFunction(newValue); | 
| 277 |  | 
| 278 |             // THEN | 
| 279 |             QVERIFY(spy.isValid()); | 
| 280 |             QCOMPARE(abstractTexture.comparisonFunction(), newValue); | 
| 281 |             QCOMPARE(spy.count(), 1); | 
| 282 |  | 
| 283 |             // WHEN | 
| 284 |             spy.clear(); | 
| 285 |             abstractTexture.setComparisonFunction(newValue); | 
| 286 |  | 
| 287 |             // THEN | 
| 288 |             QCOMPARE(abstractTexture.comparisonFunction(), newValue); | 
| 289 |             QCOMPARE(spy.count(), 0); | 
| 290 |         } | 
| 291 |         { | 
| 292 |             // WHEN | 
| 293 |             QSignalSpy spy(&abstractTexture, SIGNAL(comparisonModeChanged(Qt3DRender::QAbstractTexture::ComparisonMode))); | 
| 294 |             const Qt3DRender::QAbstractTexture::ComparisonMode newValue = Qt3DRender::QAbstractTexture::CompareRefToTexture; | 
| 295 |             abstractTexture.setComparisonMode(newValue); | 
| 296 |  | 
| 297 |             // THEN | 
| 298 |             QVERIFY(spy.isValid()); | 
| 299 |             QCOMPARE(abstractTexture.comparisonMode(), newValue); | 
| 300 |             QCOMPARE(spy.count(), 1); | 
| 301 |  | 
| 302 |             // WHEN | 
| 303 |             spy.clear(); | 
| 304 |             abstractTexture.setComparisonMode(newValue); | 
| 305 |  | 
| 306 |             // THEN | 
| 307 |             QCOMPARE(abstractTexture.comparisonMode(), newValue); | 
| 308 |             QCOMPARE(spy.count(), 0); | 
| 309 |         } | 
| 310 |         { | 
| 311 |             // WHEN | 
| 312 |             QSignalSpy spy(&abstractTexture, SIGNAL(layersChanged(int))); | 
| 313 |             const int newValue = 512; | 
| 314 |             abstractTexture.setLayers(newValue); | 
| 315 |  | 
| 316 |             // THEN | 
| 317 |             QVERIFY(spy.isValid()); | 
| 318 |             QCOMPARE(abstractTexture.layers(), newValue); | 
| 319 |             QCOMPARE(spy.count(), 1); | 
| 320 |  | 
| 321 |             // WHEN | 
| 322 |             spy.clear(); | 
| 323 |             abstractTexture.setLayers(newValue); | 
| 324 |  | 
| 325 |             // THEN | 
| 326 |             QCOMPARE(abstractTexture.layers(), newValue); | 
| 327 |             QCOMPARE(spy.count(), 0); | 
| 328 |         } | 
| 329 |         { | 
| 330 |             // WHEN | 
| 331 |             QSignalSpy spy(&abstractTexture, SIGNAL(samplesChanged(int))); | 
| 332 |             const int newValue = 1024; | 
| 333 |             abstractTexture.setSamples(newValue); | 
| 334 |  | 
| 335 |             // THEN | 
| 336 |             QVERIFY(spy.isValid()); | 
| 337 |             QCOMPARE(abstractTexture.samples(), newValue); | 
| 338 |             QCOMPARE(spy.count(), 1); | 
| 339 |  | 
| 340 |             // WHEN | 
| 341 |             spy.clear(); | 
| 342 |             abstractTexture.setSamples(newValue); | 
| 343 |  | 
| 344 |             // THEN | 
| 345 |             QCOMPARE(abstractTexture.samples(), newValue); | 
| 346 |             QCOMPARE(spy.count(), 0); | 
| 347 |         } | 
| 348 |     } | 
| 349 |  | 
| 350 |     void checkCreationData() | 
| 351 |     { | 
| 352 |         // GIVEN | 
| 353 |         FakeTexture abstractTexture; | 
| 354 |  | 
| 355 |         abstractTexture.setFormat(Qt3DRender::QAbstractTexture::RG3B2); | 
| 356 |         abstractTexture.setGenerateMipMaps(true); | 
| 357 |         abstractTexture.setWidth(350); | 
| 358 |         abstractTexture.setHeight(383); | 
| 359 |         abstractTexture.setDepth(396); | 
| 360 |         abstractTexture.setMagnificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapLinear); | 
| 361 |         abstractTexture.setMinificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapNearest); | 
| 362 |         abstractTexture.setMaximumAnisotropy(12.0f); | 
| 363 |         abstractTexture.setComparisonFunction(Qt3DRender::QAbstractTexture::CommpareNotEqual); | 
| 364 |         abstractTexture.setComparisonMode(Qt3DRender::QAbstractTexture::CompareRefToTexture); | 
| 365 |         abstractTexture.setLayers(128); | 
| 366 |         abstractTexture.setSamples(256); | 
| 367 |         abstractTexture.setWrapMode(Qt3DRender::QTextureWrapMode(Qt3DRender::QTextureWrapMode::ClampToBorder)); | 
| 368 |  | 
| 369 |         FakeTextureImage image; | 
| 370 |         FakeTextureImage image2; | 
| 371 |         abstractTexture.addTextureImage(textureImage: &image); | 
| 372 |         abstractTexture.addTextureImage(textureImage: &image2); | 
| 373 |  | 
| 374 |         // WHEN | 
| 375 |         QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges; | 
| 376 |  | 
| 377 |         { | 
| 378 |             Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&abstractTexture); | 
| 379 |             creationChanges = creationChangeGenerator.creationChanges(); | 
| 380 |         } | 
| 381 |  | 
| 382 |         // THEN | 
| 383 |         { | 
| 384 |             QCOMPARE(creationChanges.size(), 3); // Texture + Images | 
| 385 |  | 
| 386 |             const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QAbstractTextureData>>(src: creationChanges.first()); | 
| 387 |             const Qt3DRender::QAbstractTextureData cloneData = creationChangeData->data; | 
| 388 |  | 
| 389 |             QCOMPARE(abstractTexture.target(), cloneData.target); | 
| 390 |             QCOMPARE(abstractTexture.format(), cloneData.format); | 
| 391 |             QCOMPARE(abstractTexture.generateMipMaps(), cloneData.autoMipMap); | 
| 392 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeX); | 
| 393 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeY); | 
| 394 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeZ); | 
| 395 |             QCOMPARE(abstractTexture.width(), cloneData.width); | 
| 396 |             QCOMPARE(abstractTexture.height(), cloneData.height); | 
| 397 |             QCOMPARE(abstractTexture.depth(), cloneData.depth); | 
| 398 |             QCOMPARE(abstractTexture.magnificationFilter(), cloneData.magFilter); | 
| 399 |             QCOMPARE(abstractTexture.minificationFilter(), cloneData.minFilter); | 
| 400 |             QCOMPARE(abstractTexture.maximumAnisotropy(), cloneData.maximumAnisotropy); | 
| 401 |             QCOMPARE(abstractTexture.comparisonFunction(), cloneData.comparisonFunction); | 
| 402 |             QCOMPARE(abstractTexture.comparisonMode(), cloneData.comparisonMode); | 
| 403 |             QCOMPARE(abstractTexture.layers(), cloneData.layers); | 
| 404 |             QCOMPARE(abstractTexture.samples(), cloneData.samples); | 
| 405 |             QCOMPARE(abstractTexture.sharedTextureId(), cloneData.sharedTextureId); | 
| 406 |             QCOMPARE(abstractTexture.textureImages().size(), cloneData.textureImageIds.size()); | 
| 407 |  | 
| 408 |             for (int i = 0, m = abstractTexture.textureImages().size(); i < m; ++i) | 
| 409 |                 QCOMPARE(abstractTexture.textureImages().at(i)->id(), cloneData.textureImageIds.at(i)); | 
| 410 |  | 
| 411 |             QCOMPARE(abstractTexture.id(), creationChangeData->subjectId()); | 
| 412 |             QCOMPARE(abstractTexture.isEnabled(), true); | 
| 413 |             QCOMPARE(abstractTexture.isEnabled(), creationChangeData->isNodeEnabled()); | 
| 414 |             QCOMPARE(abstractTexture.metaObject(), creationChangeData->metaObject()); | 
| 415 |         } | 
| 416 |  | 
| 417 |         // WHEN | 
| 418 |         abstractTexture.setEnabled(false); | 
| 419 |  | 
| 420 |         { | 
| 421 |             Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&abstractTexture); | 
| 422 |             creationChanges = creationChangeGenerator.creationChanges(); | 
| 423 |         } | 
| 424 |  | 
| 425 |         // THEN | 
| 426 |         { | 
| 427 |             QCOMPARE(creationChanges.size(), 3); // Texture + Images | 
| 428 |  | 
| 429 |             const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QAbstractTextureData>>(src: creationChanges.first()); | 
| 430 |             const Qt3DRender::QAbstractTextureData cloneData = creationChangeData->data; | 
| 431 |  | 
| 432 |             QCOMPARE(abstractTexture.target(), cloneData.target); | 
| 433 |             QCOMPARE(abstractTexture.format(), cloneData.format); | 
| 434 |             QCOMPARE(abstractTexture.generateMipMaps(), cloneData.autoMipMap); | 
| 435 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeX); | 
| 436 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeY); | 
| 437 |             QCOMPARE(abstractTexture.wrapMode()->x(), cloneData.wrapModeZ); | 
| 438 |             QCOMPARE(abstractTexture.width(), cloneData.width); | 
| 439 |             QCOMPARE(abstractTexture.height(), cloneData.height); | 
| 440 |             QCOMPARE(abstractTexture.depth(), cloneData.depth); | 
| 441 |             QCOMPARE(abstractTexture.magnificationFilter(), cloneData.magFilter); | 
| 442 |             QCOMPARE(abstractTexture.minificationFilter(), cloneData.minFilter); | 
| 443 |             QCOMPARE(abstractTexture.maximumAnisotropy(), cloneData.maximumAnisotropy); | 
| 444 |             QCOMPARE(abstractTexture.comparisonFunction(), cloneData.comparisonFunction); | 
| 445 |             QCOMPARE(abstractTexture.comparisonMode(), cloneData.comparisonMode); | 
| 446 |             QCOMPARE(abstractTexture.layers(), cloneData.layers); | 
| 447 |             QCOMPARE(abstractTexture.samples(), cloneData.samples); | 
| 448 |             QCOMPARE(abstractTexture.sharedTextureId(), cloneData.sharedTextureId); | 
| 449 |             QCOMPARE(abstractTexture.textureImages().size(), cloneData.textureImageIds.size()); | 
| 450 |  | 
| 451 |             for (int i = 0, m = abstractTexture.textureImages().size(); i < m; ++i) | 
| 452 |                 QCOMPARE(abstractTexture.textureImages().at(i)->id(), cloneData.textureImageIds.at(i)); | 
| 453 |  | 
| 454 |             QCOMPARE(abstractTexture.id(), creationChangeData->subjectId()); | 
| 455 |             QCOMPARE(abstractTexture.isEnabled(), false); | 
| 456 |             QCOMPARE(abstractTexture.isEnabled(), creationChangeData->isNodeEnabled()); | 
| 457 |             QCOMPARE(abstractTexture.metaObject(), creationChangeData->metaObject()); | 
| 458 |         } | 
| 459 |     } | 
| 460 |  | 
| 461 |     void checkFormatUpdate() | 
| 462 |     { | 
| 463 |         // GIVEN | 
| 464 |         TestArbiter arbiter; | 
| 465 |         FakeTexture abstractTexture; | 
| 466 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 467 |  | 
| 468 |         { | 
| 469 |             // WHEN | 
| 470 |             abstractTexture.setFormat(Qt3DRender::QAbstractTexture::RG8_UNorm); | 
| 471 |  | 
| 472 |             // THEN | 
| 473 |             QCOMPARE(arbiter.events.size(), 0); | 
| 474 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 475 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 476 |  | 
| 477 |             arbiter.dirtyNodes.clear(); | 
| 478 |         } | 
| 479 |  | 
| 480 |         { | 
| 481 |             // WHEN | 
| 482 |             abstractTexture.setFormat(Qt3DRender::QAbstractTexture::RG8_UNorm); | 
| 483 |  | 
| 484 |             // THEN | 
| 485 |             QCOMPARE(arbiter.events.size(), 0); | 
| 486 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 487 |         } | 
| 488 |  | 
| 489 |     } | 
| 490 |  | 
| 491 |     void checkGenerateMipMapsUpdate() | 
| 492 |     { | 
| 493 |         // GIVEN | 
| 494 |         TestArbiter arbiter; | 
| 495 |         FakeTexture abstractTexture; | 
| 496 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 497 |  | 
| 498 |         { | 
| 499 |             // WHEN | 
| 500 |             abstractTexture.setGenerateMipMaps(true); | 
| 501 |  | 
| 502 |             // THEN | 
| 503 |             QCOMPARE(arbiter.events.size(), 0); | 
| 504 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 505 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 506 |  | 
| 507 |             arbiter.dirtyNodes.clear(); | 
| 508 |         } | 
| 509 |  | 
| 510 |         { | 
| 511 |             // WHEN | 
| 512 |             abstractTexture.setGenerateMipMaps(true); | 
| 513 |  | 
| 514 |             // THEN | 
| 515 |             QCOMPARE(arbiter.events.size(), 0); | 
| 516 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 517 |         } | 
| 518 |  | 
| 519 |     } | 
| 520 |  | 
| 521 |     void checkWidthUpdate() | 
| 522 |     { | 
| 523 |         // GIVEN | 
| 524 |         TestArbiter arbiter; | 
| 525 |         FakeTexture abstractTexture; | 
| 526 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 527 |  | 
| 528 |         { | 
| 529 |             // WHEN | 
| 530 |             abstractTexture.setWidth(1024); | 
| 531 |  | 
| 532 |             // THEN | 
| 533 |             QCOMPARE(arbiter.events.size(), 0); | 
| 534 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 535 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 536 |  | 
| 537 |             arbiter.dirtyNodes.clear(); | 
| 538 |         } | 
| 539 |  | 
| 540 |         { | 
| 541 |             // WHEN | 
| 542 |             abstractTexture.setWidth(1024); | 
| 543 |  | 
| 544 |             // THEN | 
| 545 |             QCOMPARE(arbiter.events.size(), 0); | 
| 546 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 547 |         } | 
| 548 |  | 
| 549 |     } | 
| 550 |  | 
| 551 |     void checkHeightUpdate() | 
| 552 |     { | 
| 553 |         // GIVEN | 
| 554 |         TestArbiter arbiter; | 
| 555 |         FakeTexture abstractTexture; | 
| 556 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 557 |  | 
| 558 |         { | 
| 559 |             // WHEN | 
| 560 |             abstractTexture.setHeight(256); | 
| 561 |  | 
| 562 |             // THEN | 
| 563 |             QCOMPARE(arbiter.events.size(), 0); | 
| 564 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 565 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 566 |  | 
| 567 |             arbiter.dirtyNodes.clear(); | 
| 568 |         } | 
| 569 |  | 
| 570 |         { | 
| 571 |             // WHEN | 
| 572 |             abstractTexture.setHeight(256); | 
| 573 |  | 
| 574 |             // THEN | 
| 575 |             QCOMPARE(arbiter.events.size(), 0); | 
| 576 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 577 |         } | 
| 578 |  | 
| 579 |     } | 
| 580 |  | 
| 581 |     void checkDepthUpdate() | 
| 582 |     { | 
| 583 |         // GIVEN | 
| 584 |         TestArbiter arbiter; | 
| 585 |         FakeTexture abstractTexture; | 
| 586 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 587 |  | 
| 588 |         { | 
| 589 |             // WHEN | 
| 590 |             abstractTexture.setDepth(512); | 
| 591 |  | 
| 592 |             // THEN | 
| 593 |             QCOMPARE(arbiter.events.size(), 0); | 
| 594 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 595 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 596 |  | 
| 597 |             arbiter.dirtyNodes.clear(); | 
| 598 |         } | 
| 599 |  | 
| 600 |         { | 
| 601 |             // WHEN | 
| 602 |             abstractTexture.setDepth(512); | 
| 603 |  | 
| 604 |             // THEN | 
| 605 |             QCOMPARE(arbiter.events.size(), 0); | 
| 606 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 607 |         } | 
| 608 |  | 
| 609 |     } | 
| 610 |  | 
| 611 |     void checkMagnificationFilterUpdate() | 
| 612 |     { | 
| 613 |         // GIVEN | 
| 614 |         TestArbiter arbiter; | 
| 615 |         FakeTexture abstractTexture; | 
| 616 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 617 |  | 
| 618 |         { | 
| 619 |             // WHEN | 
| 620 |             abstractTexture.setMagnificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapLinear); | 
| 621 |  | 
| 622 |             // THEN | 
| 623 |             QCOMPARE(arbiter.events.size(), 0); | 
| 624 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 625 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 626 |  | 
| 627 |             arbiter.dirtyNodes.clear(); | 
| 628 |         } | 
| 629 |  | 
| 630 |         { | 
| 631 |             // WHEN | 
| 632 |             abstractTexture.setMagnificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapLinear); | 
| 633 |  | 
| 634 |             // THEN | 
| 635 |             QCOMPARE(arbiter.events.size(), 0); | 
| 636 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 637 |         } | 
| 638 |  | 
| 639 |     } | 
| 640 |  | 
| 641 |     void checkMinificationFilterUpdate() | 
| 642 |     { | 
| 643 |         // GIVEN | 
| 644 |         TestArbiter arbiter; | 
| 645 |         FakeTexture abstractTexture; | 
| 646 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 647 |  | 
| 648 |         { | 
| 649 |             // WHEN | 
| 650 |             abstractTexture.setMinificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapLinear); | 
| 651 |  | 
| 652 |             // THEN | 
| 653 |             QCOMPARE(arbiter.events.size(), 0); | 
| 654 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 655 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 656 |  | 
| 657 |             arbiter.dirtyNodes.clear(); | 
| 658 |         } | 
| 659 |  | 
| 660 |         { | 
| 661 |             // WHEN | 
| 662 |             abstractTexture.setMinificationFilter(Qt3DRender::QAbstractTexture::NearestMipMapLinear); | 
| 663 |  | 
| 664 |             // THEN | 
| 665 |             QCOMPARE(arbiter.events.size(), 0); | 
| 666 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 667 |         } | 
| 668 |  | 
| 669 |     } | 
| 670 |  | 
| 671 |     void checkMaximumAnisotropyUpdate() | 
| 672 |     { | 
| 673 |         // GIVEN | 
| 674 |         TestArbiter arbiter; | 
| 675 |         FakeTexture abstractTexture; | 
| 676 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 677 |  | 
| 678 |         { | 
| 679 |             // WHEN | 
| 680 |             abstractTexture.setMaximumAnisotropy(327.0f); | 
| 681 |  | 
| 682 |             // THEN | 
| 683 |             QCOMPARE(arbiter.events.size(), 0); | 
| 684 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 685 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 686 |  | 
| 687 |             arbiter.dirtyNodes.clear(); | 
| 688 |         } | 
| 689 |  | 
| 690 |         { | 
| 691 |             // WHEN | 
| 692 |             abstractTexture.setMaximumAnisotropy(327.0f); | 
| 693 |  | 
| 694 |             // THEN | 
| 695 |             QCOMPARE(arbiter.events.size(), 0); | 
| 696 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 697 |         } | 
| 698 |  | 
| 699 |     } | 
| 700 |  | 
| 701 |     void checkComparisonFunctionUpdate() | 
| 702 |     { | 
| 703 |         // GIVEN | 
| 704 |         TestArbiter arbiter; | 
| 705 |         FakeTexture abstractTexture; | 
| 706 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 707 |  | 
| 708 |         { | 
| 709 |             // WHEN | 
| 710 |             abstractTexture.setComparisonFunction(Qt3DRender::QAbstractTexture::CompareAlways); | 
| 711 |  | 
| 712 |             // THEN | 
| 713 |             QCOMPARE(arbiter.events.size(), 0); | 
| 714 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 715 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 716 |  | 
| 717 |             arbiter.dirtyNodes.clear(); | 
| 718 |         } | 
| 719 |  | 
| 720 |         { | 
| 721 |             // WHEN | 
| 722 |             abstractTexture.setComparisonFunction(Qt3DRender::QAbstractTexture::CompareAlways); | 
| 723 |  | 
| 724 |             // THEN | 
| 725 |             QCOMPARE(arbiter.events.size(), 0); | 
| 726 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 727 |         } | 
| 728 |  | 
| 729 |     } | 
| 730 |  | 
| 731 |     void checkComparisonModeUpdate() | 
| 732 |     { | 
| 733 |         // GIVEN | 
| 734 |         TestArbiter arbiter; | 
| 735 |         FakeTexture abstractTexture; | 
| 736 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 737 |  | 
| 738 |         { | 
| 739 |             // WHEN | 
| 740 |             abstractTexture.setComparisonMode(Qt3DRender::QAbstractTexture::CompareRefToTexture); | 
| 741 |  | 
| 742 |             // THEN | 
| 743 |             QCOMPARE(arbiter.events.size(), 0); | 
| 744 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 745 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 746 |  | 
| 747 |             arbiter.dirtyNodes.clear(); | 
| 748 |         } | 
| 749 |  | 
| 750 |         { | 
| 751 |             // WHEN | 
| 752 |             abstractTexture.setComparisonMode(Qt3DRender::QAbstractTexture::CompareRefToTexture); | 
| 753 |  | 
| 754 |             // THEN | 
| 755 |             QCOMPARE(arbiter.events.size(), 0); | 
| 756 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 757 |         } | 
| 758 |  | 
| 759 |     } | 
| 760 |  | 
| 761 |     void checkLayersUpdate() | 
| 762 |     { | 
| 763 |         // GIVEN | 
| 764 |         TestArbiter arbiter; | 
| 765 |         FakeTexture abstractTexture; | 
| 766 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 767 |  | 
| 768 |         { | 
| 769 |             // WHEN | 
| 770 |             abstractTexture.setLayers(64); | 
| 771 |  | 
| 772 |             // THEN | 
| 773 |             QCOMPARE(arbiter.events.size(), 0); | 
| 774 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 775 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 776 |  | 
| 777 |             arbiter.dirtyNodes.clear(); | 
| 778 |         } | 
| 779 |  | 
| 780 |         { | 
| 781 |             // WHEN | 
| 782 |             abstractTexture.setLayers(64); | 
| 783 |  | 
| 784 |             // THEN | 
| 785 |             QCOMPARE(arbiter.events.size(), 0); | 
| 786 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 787 |         } | 
| 788 |  | 
| 789 |     } | 
| 790 |  | 
| 791 |     void checkSamplesUpdate() | 
| 792 |     { | 
| 793 |         // GIVEN | 
| 794 |         TestArbiter arbiter; | 
| 795 |         FakeTexture abstractTexture; | 
| 796 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 797 |  | 
| 798 |         { | 
| 799 |             // WHEN | 
| 800 |             abstractTexture.setSamples(16); | 
| 801 |  | 
| 802 |             // THEN | 
| 803 |             QCOMPARE(arbiter.events.size(), 0); | 
| 804 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 805 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 806 |  | 
| 807 |             arbiter.dirtyNodes.clear(); | 
| 808 |         } | 
| 809 |  | 
| 810 |         { | 
| 811 |             // WHEN | 
| 812 |             abstractTexture.setSamples(16); | 
| 813 |  | 
| 814 |             // THEN | 
| 815 |             QCOMPARE(arbiter.events.size(), 0); | 
| 816 |             QCOMPARE(arbiter.dirtyNodes.size(), 0); | 
| 817 |         } | 
| 818 |  | 
| 819 |     } | 
| 820 |  | 
| 821 |     void checkTextureImageAdded() | 
| 822 |     { | 
| 823 |         // GIVEN | 
| 824 |         TestArbiter arbiter; | 
| 825 |         FakeTexture abstractTexture; | 
| 826 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 827 |  | 
| 828 |         { | 
| 829 |             // WHEN | 
| 830 |             FakeTextureImage image; | 
| 831 |             abstractTexture.addTextureImage(textureImage: &image); | 
| 832 |             QCoreApplication::processEvents(); | 
| 833 |  | 
| 834 |             // THEN | 
| 835 |             QCOMPARE(arbiter.events.size(), 0); | 
| 836 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 837 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 838 |  | 
| 839 |             arbiter.dirtyNodes.clear(); | 
| 840 |         } | 
| 841 |     } | 
| 842 |  | 
| 843 |     void checkTextureImageRemoved() | 
| 844 |     { | 
| 845 |         // GIVEN | 
| 846 |         TestArbiter arbiter; | 
| 847 |         FakeTexture abstractTexture; | 
| 848 |         FakeTextureImage image; | 
| 849 |         abstractTexture.addTextureImage(textureImage: &image); | 
| 850 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 851 |  | 
| 852 |         { | 
| 853 |             // WHEN | 
| 854 |             abstractTexture.removeTextureImage(textureImage: &image); | 
| 855 |             QCoreApplication::processEvents(); | 
| 856 |  | 
| 857 |             // THEN | 
| 858 |             QCOMPARE(arbiter.events.size(), 0); | 
| 859 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 860 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 861 |  | 
| 862 |             arbiter.dirtyNodes.clear(); | 
| 863 |         } | 
| 864 |     } | 
| 865 |  | 
| 866 |     void checkSceneChangedEvent() | 
| 867 |     { | 
| 868 |         // GIVEN | 
| 869 |         TestArbiter arbiter; | 
| 870 |         FakeTexture abstractTexture; | 
| 871 |         arbiter.setArbiterOnNode(&abstractTexture); | 
| 872 |  | 
| 873 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::Status>(typeName: "Status" ); | 
| 874 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::TextureFormat>(typeName: "TextureFormat" ); | 
| 875 |         qRegisterMetaType<Qt3DRender::QAbstractTexture::HandleType>(typeName: "HandleType" ); | 
| 876 |  | 
| 877 |  | 
| 878 |         { | 
| 879 |             QSignalSpy spy(&abstractTexture, SIGNAL(widthChanged(int))); | 
| 880 |  | 
| 881 |             // THEN | 
| 882 |             QVERIFY(spy.isValid()); | 
| 883 |  | 
| 884 |             // WHEN | 
| 885 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 886 |             valueChange->setPropertyName("width" ); | 
| 887 |             valueChange->setValue(883); | 
| 888 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 889 |  | 
| 890 |             // THEN | 
| 891 |             QCOMPARE(spy.count(), 1); | 
| 892 |             QCOMPARE(arbiter.events.size(), 0); | 
| 893 |             QCOMPARE(abstractTexture.width(), 883); | 
| 894 |  | 
| 895 |             // WHEN | 
| 896 |             spy.clear(); | 
| 897 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 898 |  | 
| 899 |             // THEN | 
| 900 |             QCOMPARE(spy.count(), 0); | 
| 901 |             QCOMPARE(arbiter.events.size(), 0); | 
| 902 |             QCOMPARE(abstractTexture.width(), 883); | 
| 903 |         } | 
| 904 |  | 
| 905 |         { | 
| 906 |             QSignalSpy spy(&abstractTexture, SIGNAL(heightChanged(int))); | 
| 907 |  | 
| 908 |             // THEN | 
| 909 |             QVERIFY(spy.isValid()); | 
| 910 |  | 
| 911 |             // WHEN | 
| 912 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 913 |             valueChange->setPropertyName("height" ); | 
| 914 |             valueChange->setValue(1584); | 
| 915 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 916 |  | 
| 917 |             // THEN | 
| 918 |             QCOMPARE(spy.count(), 1); | 
| 919 |             QCOMPARE(arbiter.events.size(), 0); | 
| 920 |             QCOMPARE(abstractTexture.height(), 1584); | 
| 921 |  | 
| 922 |             // WHEN | 
| 923 |             spy.clear(); | 
| 924 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 925 |  | 
| 926 |             // THEN | 
| 927 |             QCOMPARE(spy.count(), 0); | 
| 928 |             QCOMPARE(arbiter.events.size(), 0); | 
| 929 |             QCOMPARE(abstractTexture.height(), 1584); | 
| 930 |         } | 
| 931 |  | 
| 932 |         { | 
| 933 |             QSignalSpy spy(&abstractTexture, SIGNAL(depthChanged(int))); | 
| 934 |  | 
| 935 |             // THEN | 
| 936 |             QVERIFY(spy.isValid()); | 
| 937 |  | 
| 938 |             // WHEN | 
| 939 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 940 |             valueChange->setPropertyName("depth" ); | 
| 941 |             valueChange->setValue(8); | 
| 942 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 943 |  | 
| 944 |             // THEN | 
| 945 |             QCOMPARE(spy.count(), 1); | 
| 946 |             QCOMPARE(arbiter.events.size(), 0); | 
| 947 |             QCOMPARE(abstractTexture.depth(), 8); | 
| 948 |  | 
| 949 |             // WHEN | 
| 950 |             spy.clear(); | 
| 951 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 952 |  | 
| 953 |             // THEN | 
| 954 |             QCOMPARE(spy.count(), 0); | 
| 955 |             QCOMPARE(arbiter.events.size(), 0); | 
| 956 |             QCOMPARE(abstractTexture.depth(), 8); | 
| 957 |         } | 
| 958 |  | 
| 959 |         { | 
| 960 |             QSignalSpy spy(&abstractTexture, SIGNAL(layersChanged(int))); | 
| 961 |  | 
| 962 |             // THEN | 
| 963 |             QVERIFY(spy.isValid()); | 
| 964 |  | 
| 965 |             // WHEN | 
| 966 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 967 |             valueChange->setPropertyName("layers" ); | 
| 968 |             valueChange->setValue(256); | 
| 969 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 970 |  | 
| 971 |             // THEN | 
| 972 |             QCOMPARE(spy.count(), 1); | 
| 973 |             QCOMPARE(arbiter.events.size(), 0); | 
| 974 |             QCOMPARE(abstractTexture.layers(), 256); | 
| 975 |  | 
| 976 |             // WHEN | 
| 977 |             spy.clear(); | 
| 978 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 979 |  | 
| 980 |             // THEN | 
| 981 |             QCOMPARE(spy.count(), 0); | 
| 982 |             QCOMPARE(arbiter.events.size(), 0); | 
| 983 |             QCOMPARE(abstractTexture.layers(), 256); | 
| 984 |         } | 
| 985 |  | 
| 986 |         { | 
| 987 |             QSignalSpy spy(&abstractTexture, SIGNAL(formatChanged(TextureFormat))); | 
| 988 |  | 
| 989 |             // THEN | 
| 990 |             QVERIFY(spy.isValid()); | 
| 991 |  | 
| 992 |             // WHEN | 
| 993 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 994 |             valueChange->setPropertyName("format" ); | 
| 995 |             const auto newFormat = Qt3DRender::QAbstractTexture::R8I; | 
| 996 |             valueChange->setValue(QVariant::fromValue(value: newFormat)); | 
| 997 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 998 |  | 
| 999 |             // THEN | 
| 1000 |             QCOMPARE(spy.count(), 1); | 
| 1001 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1002 |             QCOMPARE(abstractTexture.format(), newFormat); | 
| 1003 |  | 
| 1004 |             // WHEN | 
| 1005 |             spy.clear(); | 
| 1006 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1007 |  | 
| 1008 |             // THEN | 
| 1009 |             QCOMPARE(spy.count(), 0); | 
| 1010 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1011 |             QCOMPARE(abstractTexture.format(), newFormat); | 
| 1012 |         } | 
| 1013 |  | 
| 1014 |         { | 
| 1015 |             QSignalSpy spy(&abstractTexture, SIGNAL(statusChanged(Status))); | 
| 1016 |  | 
| 1017 |             // THEN | 
| 1018 |             QVERIFY(spy.isValid()); | 
| 1019 |  | 
| 1020 |             // WHEN | 
| 1021 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 1022 |             valueChange->setPropertyName("status" ); | 
| 1023 |             const auto newStatus = Qt3DRender::QAbstractTexture::Error; | 
| 1024 |             valueChange->setValue(QVariant::fromValue(value: newStatus)); | 
| 1025 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1026 |  | 
| 1027 |             // THEN | 
| 1028 |             QCOMPARE(spy.count(), 1); | 
| 1029 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1030 |             QCOMPARE(abstractTexture.status(), newStatus); | 
| 1031 |  | 
| 1032 |             // WHEN | 
| 1033 |             spy.clear(); | 
| 1034 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1035 |  | 
| 1036 |             // THEN | 
| 1037 |             QCOMPARE(spy.count(), 0); | 
| 1038 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1039 |             QCOMPARE(abstractTexture.status(), newStatus); | 
| 1040 |         } | 
| 1041 |  | 
| 1042 |         { | 
| 1043 |             QSignalSpy spy(&abstractTexture, SIGNAL(handleTypeChanged(HandleType))); | 
| 1044 |  | 
| 1045 |             // THEN | 
| 1046 |             QVERIFY(spy.isValid()); | 
| 1047 |  | 
| 1048 |             // WHEN | 
| 1049 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 1050 |             valueChange->setPropertyName("handleType" ); | 
| 1051 |             const auto newType = Qt3DRender::QAbstractTexture::OpenGLTextureId; | 
| 1052 |             valueChange->setValue(QVariant::fromValue(value: newType)); | 
| 1053 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1054 |  | 
| 1055 |             // THEN | 
| 1056 |             QCOMPARE(spy.count(), 1); | 
| 1057 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1058 |             QCOMPARE(abstractTexture.handleType(), newType); | 
| 1059 |  | 
| 1060 |             // WHEN | 
| 1061 |             spy.clear(); | 
| 1062 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1063 |  | 
| 1064 |             // THEN | 
| 1065 |             QCOMPARE(spy.count(), 0); | 
| 1066 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1067 |             QCOMPARE(abstractTexture.handleType(), newType); | 
| 1068 |         } | 
| 1069 |  | 
| 1070 |         { | 
| 1071 |             QSignalSpy spy(&abstractTexture, SIGNAL(handleChanged(QVariant))); | 
| 1072 |  | 
| 1073 |             // THEN | 
| 1074 |             QVERIFY(spy.isValid()); | 
| 1075 |  | 
| 1076 |             // WHEN | 
| 1077 |             Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); | 
| 1078 |             valueChange->setPropertyName("handle" ); | 
| 1079 |             valueChange->setValue(QVariant(1)); | 
| 1080 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1081 |  | 
| 1082 |             // THEN | 
| 1083 |             QCOMPARE(spy.count(), 1); | 
| 1084 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1085 |             QCOMPARE(abstractTexture.handle(), QVariant(1)); | 
| 1086 |  | 
| 1087 |             // WHEN | 
| 1088 |             spy.clear(); | 
| 1089 |             abstractTexture.sceneChangeEvent(change: valueChange); | 
| 1090 |  | 
| 1091 |             // THEN | 
| 1092 |             QCOMPARE(spy.count(), 0); | 
| 1093 |             QCOMPARE(arbiter.events.size(), 0); | 
| 1094 |             QCOMPARE(abstractTexture.handle(), QVariant(1)); | 
| 1095 |         } | 
| 1096 |     } | 
| 1097 |  | 
| 1098 |     void checkTextureDataUpdate() | 
| 1099 |     { | 
| 1100 |         { | 
| 1101 |             // GIVEN | 
| 1102 |             TestArbiter arbiter; | 
| 1103 |             FakeTexture abstractTexture; | 
| 1104 |             Qt3DRender::QTextureDataUpdate update; | 
| 1105 |             arbiter.setArbiterOnNode(&abstractTexture); | 
| 1106 |  | 
| 1107 |             // WHEN | 
| 1108 |             abstractTexture.updateData(update); | 
| 1109 |             QCoreApplication::processEvents(); | 
| 1110 |  | 
| 1111 |             // THEN (arbiter -> should not be stored in the initial changes but only send as a property change) | 
| 1112 |             auto d = static_cast<Qt3DRender::QAbstractTexturePrivate*>(Qt3DRender::QAbstractTexturePrivate::get(q: &abstractTexture)); | 
| 1113 |             QCOMPARE(d->m_pendingDataUpdates.size(), 1); | 
| 1114 |             QCOMPARE(arbiter.dirtyNodes.size(), 1); | 
| 1115 |             QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); | 
| 1116 |         } | 
| 1117 |     } | 
| 1118 |  | 
| 1119 | }; | 
| 1120 |  | 
| 1121 | QTEST_MAIN(tst_QAbstractTexture) | 
| 1122 |  | 
| 1123 | #include "tst_qabstracttexture.moc" | 
| 1124 |  |