/* Copyright © 2010, 2011, 2012 Vladimír Vondruš This file is part of Magnum. Magnum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. Magnum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details. */ #include "ResourceManagerTest.h" #include #include "ResourceManager.h" using namespace std; using namespace Corrade::Utility; CORRADE_TEST_MAIN(Magnum::Test::ResourceManagerTest) namespace Magnum { namespace Test { class Data { public: static std::size_t count; inline Data() { ++count; } inline ~Data() { --count; } }; typedef Magnum::ResourceManager ResourceManager; size_t Data::count = 0; ResourceManagerTest::ResourceManagerTest() { addTests(&ResourceManagerTest::state, &ResourceManagerTest::stateFallback, &ResourceManagerTest::stateDisallowed, &ResourceManagerTest::basic, &ResourceManagerTest::residentPolicy, &ResourceManagerTest::referenceCountedPolicy, &ResourceManagerTest::manualPolicy); } void ResourceManagerTest::state() { ResourceManager rm; Resource data = rm.get("data"); CORRADE_VERIFY(!data); CORRADE_COMPARE(data.state(), ResourceState::NotLoaded); CORRADE_COMPARE(rm.state("data"), ResourceState::NotLoaded); rm.set("data", nullptr, ResourceDataState::Loading, ResourcePolicy::Resident); CORRADE_VERIFY(!data); CORRADE_COMPARE(data.state(), ResourceState::Loading); CORRADE_COMPARE(rm.state("data"), ResourceState::Loading); rm.set("data", nullptr, ResourceDataState::NotFound, ResourcePolicy::Resident); CORRADE_VERIFY(!data); CORRADE_COMPARE(data.state(), ResourceState::NotFound); CORRADE_COMPARE(rm.state("data"), ResourceState::NotFound); /* Nothing happened at all */ CORRADE_COMPARE(Data::count, 0); } void ResourceManagerTest::stateFallback() { { ResourceManager rm; rm.setFallback(new Data); Resource data = rm.get("data"); CORRADE_VERIFY(data); CORRADE_COMPARE(data.state(), ResourceState::NotLoadedFallback); CORRADE_COMPARE(rm.state("data"), ResourceState::NotLoadedFallback); rm.set("data", nullptr, ResourceDataState::Loading, ResourcePolicy::Resident); CORRADE_VERIFY(data); CORRADE_COMPARE(data.state(), ResourceState::LoadingFallback); CORRADE_COMPARE(rm.state("data"), ResourceState::LoadingFallback); rm.set("data", nullptr, ResourceDataState::NotFound, ResourcePolicy::Resident); CORRADE_VERIFY(data); CORRADE_COMPARE(data.state(), ResourceState::NotFoundFallback); CORRADE_COMPARE(rm.state("data"), ResourceState::NotFoundFallback); /* Only fallback is here */ CORRADE_COMPARE(Data::count, 1); } /* Fallback gets destroyed */ CORRADE_COMPARE(Data::count, 0); } void ResourceManagerTest::stateDisallowed() { ResourceManager rm; stringstream out; Error::setOutput(&out); Data d; rm.set("data", &d, ResourceDataState::Loading, ResourcePolicy::Resident); CORRADE_COMPARE(out.str(), "ResourceManager::set(): data should be null if and only if state is NotFound or Loading\n"); out.str(""); rm.set("data", nullptr, ResourceDataState::Final, ResourcePolicy::Resident); CORRADE_COMPARE(out.str(), "ResourceManager::set(): data should be null if and only if state is NotFound or Loading\n"); } void ResourceManagerTest::basic() { ResourceManager rm; /* One mutable, one final */ ResourceKey questionKey("the-question"); ResourceKey answerKey("the-answer"); rm.set(questionKey, new int32_t(10), ResourceDataState::Mutable, ResourcePolicy::Resident); rm.set(answerKey, new int32_t(42), ResourceDataState::Final, ResourcePolicy::Resident); Resource theQuestion = rm.get(questionKey); Resource theAnswer = rm.get(answerKey); /* Check basic functionality */ CORRADE_COMPARE(theQuestion.state(), ResourceState::Mutable); CORRADE_COMPARE(theAnswer.state(), ResourceState::Final); CORRADE_COMPARE(*theQuestion, 10); CORRADE_COMPARE(*theAnswer, 42); CORRADE_COMPARE(rm.count(), 2); /* Cannot change already final resource */ stringstream out; Error::setOutput(&out); rm.set(answerKey, new int32_t(43), ResourceDataState::Mutable, ResourcePolicy::Resident); CORRADE_COMPARE(*theAnswer, 42); CORRADE_COMPARE(out.str(), "ResourceManager::set(): cannot change already final resource\n"); /* But non-final can be changed */ rm.set(questionKey, new int32_t(20), ResourceDataState::Final, ResourcePolicy::Resident); CORRADE_COMPARE(theQuestion.state(), ResourceState::Final); CORRADE_COMPARE(*theQuestion, 20); } void ResourceManagerTest::residentPolicy() { ResourceManager* rm = new ResourceManager; rm->set("blah", new Data(), ResourceDataState::Mutable, ResourcePolicy::Resident); CORRADE_COMPARE(Data::count, 1); rm->free(); CORRADE_COMPARE(Data::count, 1); delete rm; CORRADE_COMPARE(Data::count, 0); } void ResourceManagerTest::referenceCountedPolicy() { ResourceManager rm; ResourceKey dataRefCountKey("dataRefCount"); /* Reference counted resources must be requested first */ { rm.set(dataRefCountKey, new Data(), ResourceDataState::Final, ResourcePolicy::ReferenceCounted); CORRADE_COMPARE(rm.count(), 0); Resource data = rm.get(dataRefCountKey); CORRADE_COMPARE(data.state(), ResourceState::NotLoaded); CORRADE_COMPARE(Data::count, 0); } { Resource data = rm.get(dataRefCountKey); CORRADE_COMPARE(rm.count(), 1); CORRADE_COMPARE(data.state(), ResourceState::NotLoaded); rm.set(dataRefCountKey, new Data(), ResourceDataState::Final, ResourcePolicy::ReferenceCounted); CORRADE_COMPARE(data.state(), ResourceState::Final); CORRADE_COMPARE(Data::count, 1); } CORRADE_COMPARE(rm.count(), 0); CORRADE_COMPARE(Data::count, 0); } void ResourceManagerTest::manualPolicy() { ResourceManager rm; ResourceKey dataKey("data"); /* Manual free */ { rm.set(dataKey, new Data(), ResourceDataState::Mutable, ResourcePolicy::Manual); Resource data = rm.get(dataKey); rm.free(); } CORRADE_COMPARE(rm.count(), 1); CORRADE_COMPARE(Data::count, 1); rm.free(); CORRADE_COMPARE(rm.count(), 0); CORRADE_COMPARE(Data::count, 0); rm.set(dataKey, new Data(), ResourceDataState::Mutable, ResourcePolicy::Manual); CORRADE_COMPARE(rm.count(), 1); CORRADE_COMPARE(Data::count, 1); } }}