diff --git a/src/Magnum/Trade/SceneData.cpp b/src/Magnum/Trade/SceneData.cpp index 1b2028e64..46412f45b 100644 --- a/src/Magnum/Trade/SceneData.cpp +++ b/src/Magnum/Trade/SceneData.cpp @@ -2210,12 +2210,24 @@ Containers::Optional SceneData::importerStateFor(const UnsignedInt #ifdef MAGNUM_BUILD_DEPRECATED std::vector SceneData::children2D() const { if(_dimensions != 2) return {}; + + /* Even though (or exactly because?) this API is deprecated, it's better to + warn than to spend several hours debugging what's wrong */ + if(!hasField(SceneField::Parent)) + Warning{} << "Trade::SceneData::children2D(): no parent field present, returned array will be empty"; + const Containers::Array children = childrenFor(-1); return {children.begin(), children.end()}; } std::vector SceneData::children3D() const { if(_dimensions != 3) return {}; + + /* Even though (or exactly because?) this API is deprecated, it's better to + warn than to spend several hours debugging what's wrong */ + if(!hasField(SceneField::Parent)) + Warning{} << "Trade::SceneData::children3D(): no parent field present, returned array will be empty"; + const Containers::Array children = childrenFor(-1); return {children.begin(), children.end()}; } diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index 27e8cd094..1df17838a 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -218,10 +218,14 @@ const struct { const char* name; bool is2D; bool is3D; + bool skipParent; } ChildrenDeprecatedData[]{ - {"2D", true, false}, - {"3D", false, true}, - {"neither", false, false} + {"2D", true, false, false}, + {"2D with no parent", true, false, true}, + {"3D", false, true, false}, + {"3D with no parent", false, true, true}, + {"neither", false, false, false}, + {"neither with no parent", false, false, true} }; #endif @@ -4978,21 +4982,38 @@ void SceneDataTest::childrenDeprecated() { Containers::StridedArrayView1D view = fields; Containers::Array fieldData; - arrayAppend(fieldData, SceneFieldData{SceneField::Parent, view.slice(&Field::object), view.slice(&Field::parent)}); + if(!data.skipParent) + arrayAppend(fieldData, SceneFieldData{SceneField::Parent, view.slice(&Field::object), view.slice(&Field::parent)}); if(data.is2D) arrayAppend(fieldData, SceneFieldData{SceneField::Translation, SceneObjectType::UnsignedByte, nullptr, SceneFieldType::Vector2, nullptr}); if(data.is3D) arrayAppend(fieldData, SceneFieldData{SceneField::Translation, SceneObjectType::UnsignedByte, nullptr, SceneFieldType::Vector3, nullptr}); SceneData scene{SceneObjectType::UnsignedByte, 25, {}, fields, std::move(fieldData)}; - CORRADE_IGNORE_DEPRECATED_PUSH - CORRADE_COMPARE_AS(scene.children2D(), - (data.is2D ? std::vector{5, 0, 4} : std::vector{}), - TestSuite::Compare::Container); - CORRADE_COMPARE_AS(scene.children3D(), - (data.is3D ? std::vector{5, 0, 4} : std::vector{}), - TestSuite::Compare::Container); - CORRADE_IGNORE_DEPRECATED_POP + + if(!data.skipParent) { + CORRADE_IGNORE_DEPRECATED_PUSH + CORRADE_COMPARE_AS(scene.children2D(), + (data.is2D ? std::vector{5, 0, 4} : std::vector{}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.children3D(), + (data.is3D ? std::vector{5, 0, 4} : std::vector{}), + TestSuite::Compare::Container); + CORRADE_IGNORE_DEPRECATED_POP + } else { + std::ostringstream out; + Warning redirectWarning{&out}; + CORRADE_IGNORE_DEPRECATED_PUSH + CORRADE_VERIFY(scene.children2D().empty()); + CORRADE_VERIFY(scene.children3D().empty()); + CORRADE_IGNORE_DEPRECATED_POP + if(data.is2D) + CORRADE_COMPARE(out.str(), "Trade::SceneData::children2D(): no parent field present, returned array will be empty\n"); + else if(data.is3D) + CORRADE_COMPARE(out.str(), "Trade::SceneData::children3D(): no parent field present, returned array will be empty\n"); + else + CORRADE_COMPARE(out.str(), ""); + } } #endif