From 66daf409d45bbaa13dde0ae61922e56e2e82360c Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Wed, 21 Nov 2007 06:08:01 +0100 Subject: [PATCH] specify (as test) how asset dependency should work --- src/common/util.hpp | 6 +- src/proc/asset.cpp | 2 +- src/proc/asset.hpp | 6 +- .../proc/asset/dependantassetstest.cpp | 128 +++++++++++++++++- .../proc/asset/identityofassetstest.cpp | 1 - tests/components/proc/asset/testasset.hpp | 107 +++++++++++++++ .../proc/mobject/session/testclip.cpp | 4 +- .../proc/mobject/session/testclip.hpp | 7 +- 8 files changed, 241 insertions(+), 20 deletions(-) create mode 100644 tests/components/proc/asset/testasset.hpp diff --git a/src/common/util.hpp b/src/common/util.hpp index 31c380be0..6d5119b14 100644 --- a/src/common/util.hpp +++ b/src/common/util.hpp @@ -98,8 +98,10 @@ namespace util inline bool contains (SEQ& cont, typename SEQ::value_type& val) { - typename SEQ::iterator end = cont.end(); - return end != std::find(cont.begin(),end, val); + typename SEQ::const_iterator begin = cont.begin(); + typename SEQ::const_iterator end = cont.end(); + + return end != std::find(begin,end, val); } /** shortcut for removing all copies of an Element diff --git a/src/proc/asset.cpp b/src/proc/asset.cpp index f9136bb20..ec75d84b3 100644 --- a/src/proc/asset.cpp +++ b/src/proc/asset.cpp @@ -94,7 +94,7 @@ namespace asset * on the enablement status of parent assets as well. */ void - Asset::enable () throw(cinelerra::error::State) + Asset::enable (bool on) throw(cinelerra::error::State) { UNIMPLEMENTED ("enable/disable Assets."); } diff --git a/src/proc/asset.hpp b/src/proc/asset.hpp index ebac8bd7a..0c304a5de 100644 --- a/src/proc/asset.hpp +++ b/src/proc/asset.hpp @@ -98,7 +98,7 @@ namespace asset const size_t hash; ID (size_t id) : hash(id) {} ID (const KIND& asset) : hash(asset.getID()) {} - operator size_t() const { return hash; } + operator size_t() const { return hash; } }; class Asset; @@ -248,7 +248,7 @@ namespace asset friend class AssetManager; private: - void unregister (PAsset& other); + void unregister (PAsset& other); @@ -274,7 +274,7 @@ namespace asset * Note the corresponding #isActive predicate may * depend on the enablement status of parent assets as well */ - void enable () throw(cinelerra::error::State); + void enable (bool on=true) throw(cinelerra::error::State); }; diff --git a/tests/components/proc/asset/dependantassetstest.cpp b/tests/components/proc/asset/dependantassetstest.cpp index 9b52be4c0..82265a168 100644 --- a/tests/components/proc/asset/dependantassetstest.cpp +++ b/tests/components/proc/asset/dependantassetstest.cpp @@ -22,15 +22,16 @@ #include "common/test/run.hpp" -//#include "common/factory.hpp" -//#include "common/util.hpp" +#include "proc/asset/testasset.hpp" +#include "common/util.hpp" //#include #include +using util::isnil; +using util::contains; //using boost::format; using std::string; -using std::cout; namespace asset @@ -49,10 +50,127 @@ namespace asset */ class DependantAssets_test : public Test { - virtual void run(Arg arg) + virtual void run (Arg arg) + { + checkDependencyMechanics (); + checkUnlinking (); + TODO ("activate missing testcases"); +/////TODO checkEnablementPropagation (); +/////TODO checkRealAssetDependencyRegistration (); + } + + typedef TestAsset TA; + typedef TA::PA PTestA; + + /** @test check operation of basic asset dependency support + */ + void checkDependencyMechanics () + { + PAsset a1 = TA::create(); + ASSERT (isnil (a1->getParents())); + ASSERT (isnil (a1->getDependant())); + + PTestA a2 = TA::create(a1); + ASSERT (a1 == a2->getParents()[0]); // TestAsset registered a1 as parent + ASSERT (a2 == a1->getDependant()[0]); + + TRACE(test, "a1.cnt=%i",a1.use_count()); + TRACE(test, "a2.cnt=%i",a2.use_count()); + PAsset a3 = TA::create(); + a2->set_depend(a3); + ASSERT (a3 == a2->getParents()[1]); + ASSERT (a2 == a3->getDependant()[0]); + ASSERT (!contains (a1->getDependant(), a3)); + } + + + /** @test unlink operation removing inter asset links + */ + void checkUnlinking () + { + PTestA a1_ = TA::create(); + PAsset a1 (a1_); + PTestA a2_ = TA::create(a1); + PAsset a2 (a2_); + ASSERT (a1 == a2->getParents()[0]); + ASSERT (a2 == a1->getDependant()[0]); + + a2_->call_unlink(); + ASSERT (isnil (a2->getParents())); + ASSERT (isnil (a2->getDependant())); + ASSERT (!contains (a1->getDependant(), a2)); // has been propagated + + a2_->set_depend(a1); + PAsset a3 = TA::create(a1); + ASSERT (a1 == a2->getParents()[0]); + ASSERT (a1 == a3->getParents()[0]); + ASSERT (a2 == a1->getDependant()[0]); + ASSERT (a3 == a1->getDependant()[1]); + + a1_->call_unlink(a3->getID()); + ASSERT (!contains (a1->getDependant(), a3)); // selectively removed + ASSERT ( contains (a1->getDependant(), a2)); + ASSERT (a1 == a3->getParents()[0]); // no propagation + } + + + /** @test enabling and disabling an asset should + * propagate to dependant assets + */ + void checkEnablementPropagation () + { + PAsset a1 = TA::create(); + PAsset a2 = TA::create(a1); + PAsset a3 = TA::create(); // not dependant + + ASSERT (a1->isActive()); + ASSERT (a2->isActive()); + ASSERT (a3->isActive()); + + a1->enable(false); + ASSERT (!a1->isActive()); + ASSERT (!a2->isActive()); + ASSERT (a3->isActive()); + + a2->enable(true); + ASSERT (!a1->isActive()); + ASSERT (!a2->isActive()); // ignored because parent is disabled + + a1->enable(true); + ASSERT (a1->isActive()); + ASSERT (a2->isActive()); + + a2->enable(false); + ASSERT (a1->isActive()); + ASSERT (!a2->isActive()); // disabling not propagated to parent + a2->enable(true); + ASSERT (a1->isActive()); + ASSERT (a2->isActive()); + + a3->enable(false); + ASSERT (a1->isActive()); + ASSERT (a2->isActive()); + ASSERT (!a3->isActive()); // no dependency... + + a1->enable(false); + a3->enable(); + ASSERT (!a1->isActive()); + ASSERT (!a2->isActive()); + ASSERT (a3->isActive()); + } + + + /** @test each real world asset subclass has to care + * for registering and deregistering any additional + * dependencies. Here we collect some more prominent + * examples (and hopfully don't fail to cover any + * important special cases...) + */ + void checkRealAssetDependencyRegistration () { UNIMPLEMENTED ("handling of Asset dependencies"); - } + } + }; diff --git a/tests/components/proc/asset/identityofassetstest.cpp b/tests/components/proc/asset/identityofassetstest.cpp index 2e62963bc..05a6e0ae9 100644 --- a/tests/components/proc/asset/identityofassetstest.cpp +++ b/tests/components/proc/asset/identityofassetstest.cpp @@ -46,7 +46,6 @@ namespace asset * @test creating several Assets and checking object identity, * detection of duplicates and version handling. * @see proc_interface::AssetManager#reg - * @todo to be written; features are missing as of 9/07 */ class IdentityOfAssets_test : public Test { diff --git a/tests/components/proc/asset/testasset.hpp b/tests/components/proc/asset/testasset.hpp new file mode 100644 index 000000000..b40ac3a77 --- /dev/null +++ b/tests/components/proc/asset/testasset.hpp @@ -0,0 +1,107 @@ +/* + TESTASSET.hpp - test asset (stub) for checking internal asset functionality + + Copyright (C) CinelerraCV + 2007, Christian Thaeter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +#ifndef ASSET_TESTASSET_H +#define ASSET_TESTASSET_H + + +#include "proc/asset.hpp" +//#include "common/util.hpp" + + +#include + +using std::tr1::shared_ptr; +using boost::format; +using std::string; + + +namespace asset + { + namespace test + { + + namespace + { + uint counter (0); + + /** @internal helper generating continuosely + * different new asset identities + */ + Asset::Ident + make_ident () + { + return Asset::Ident ( str(format("TestAsset.%i") % counter) + , Category (META) + , "test" + , counter++ + ); + } + Asset::Ident + make_ident (PAsset& ref) + { + return Asset::Ident ( str(format("%s-TestAsset.%i") % ref->ident.name + % counter) + , ref->ident.category + , "test" + , counter++ + ); + } + } + + + + /** + * Test(mock) asset subclass usable for hijacking a given + * asset class (template parameter) and subsequently accessing + * internal facillities for writing unit tests. Prerequisite + * for using this template is that the used asset base class + * has a (protected) ctor taking an Asset::Ident.... + */ + template + class TestAsset : public A + { + TestAsset () : A(make_ident ()) { }; + TestAsset (PAsset& pRef) : A(make_ident (pRef)) { this->defineDependency(pRef); }; + + static void deleter (TestAsset* aa) { delete aa; } + + public: + typedef shared_ptr > PA; + + static PA create () { return PA (new TestAsset, &deleter); } + static PA create (PAsset& pRef) { return PA (new TestAsset (pRef), &deleter); } + + /* === interesting asset features we want to access for tests === */ + void call_unlink () { this->unlink (); } + void call_unlink (IDA target) { this->unlink (target); } + void set_depend (PAsset parent) { this->defineDependency (parent); } + + }; + + + + } // namespace test + +} // namespace asset +#endif diff --git a/tests/components/proc/mobject/session/testclip.cpp b/tests/components/proc/mobject/session/testclip.cpp index e91ac5ed9..0d1f4f451 100644 --- a/tests/components/proc/mobject/session/testclip.cpp +++ b/tests/components/proc/mobject/session/testclip.cpp @@ -1,5 +1,5 @@ /* - TestClip - bookkeeping (asset) view of a media clip. + TestClip - test clip (stub) for checking EDL/Session functionality Copyright (C) CinelerraCV 2007, Christian Thaeter @@ -70,7 +70,7 @@ namespace mobject { } }; - cinelerra::Singleton testbed_1; + cinelerra::Singleton testbed_1; // invoke ctor when creating first TestClip... diff --git a/tests/components/proc/mobject/session/testclip.hpp b/tests/components/proc/mobject/session/testclip.hpp index 0e60a0ce8..edb3369ff 100644 --- a/tests/components/proc/mobject/session/testclip.hpp +++ b/tests/components/proc/mobject/session/testclip.hpp @@ -25,20 +25,15 @@ #define MOBJECT_SESSION_TESTCLIP_H -#include "common/test/run.hpp" -#include "common/factory.hpp" - #include "proc/mobject/session/clip.hpp" //#include "common/util.hpp" //#include -#include using std::tr1::shared_ptr; //using boost::format; using std::string; -using std::cout; namespace mobject @@ -55,7 +50,7 @@ namespace mobject * @todo make this usable as Mock object to record invoked operations. * */ - class TestClip : public mobject::session::Clip /////////////TODO how this???? + class TestClip : public mobject::session::Clip { TestClip ();