From: <ro...@us...> - 2013-07-25 13:47:34
|
Revision: 2121 http://sourceforge.net/p/nsclspectcl/code/2121 Author: ron-fox Date: 2013-07-25 13:47:31 +0000 (Thu, 25 Jul 2013) Log Message: ----------- Complete coding/testing of the Spectrum Dictionary class Modified Paths: -------------- branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.cpp branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.h branches/spectcl-5.0/SpecTclPackage/SpectrumDictTest.cpp Modified: branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.cpp =================================================================== --- branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.cpp 2013-07-24 20:26:07 UTC (rev 2120) +++ branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.cpp 2013-07-25 13:47:31 UTC (rev 2121) @@ -75,6 +75,8 @@ { if (m_Dictionary.find(spectrum.getName()) == m_Dictionary.end()) { m_Dictionary[spectrum.getName()] = &spectrum; + fireObservers(Add); + } else { std::string msg = "CSpectrumDictionary::add - cannot insert duplicate spectrum named: '"; msg += spectrum.getName(); @@ -119,7 +121,63 @@ msg += "' does not exist"; throw spectrum_dictionary_exception(msg); } else { + fireObservers(Remove); m_Dictionary.erase(p); } } +/** + * size + * + * @return size_t - the number of spectra in the dictionary. + +size_t +CSpectrumDictionary::size() +{ + return m_Dictionary.size(); +} + + +/* + * getReason + * + * Get the reason for the current observation. + * + * @return CSpectrumDictionary::Op + * + * @note exception thrown on empty. + */ +CSpectrumDictionary::Op +CSpectrumDictionary::getReason() +{ + if (! m_observationReason.empty()) { + return m_observationReason.top(); + } else { + throw spectrum_dictionary_exception + ("CSpectrumDictionary::getReason - not observing so there's no reason"); + } +} +/*---------------------------------------------------------------------- + * Private methods. + */ + +/** + * fireObservers + * + * Request the observable interface invoke the observers. + * + * @param op - Operation that triggered observation. The most recent (current + * one is available via getReason. + * + * @note nested observation is supported via a stack of operations. + */ +void +CSpectrumDictionary::fireObservers(CSpectrumDictionary::Op reason) +{ + m_observationReason.push(reason); + + observe(); + + m_observationReason.pop(); + +} Modified: branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.h =================================================================== --- branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.h 2013-07-24 20:26:07 UTC (rev 2120) +++ branches/spectcl-5.0/SpecTclPackage/CSpectrumDictionary.h 2013-07-25 13:47:31 UTC (rev 2121) @@ -102,14 +102,14 @@ DictionaryIterator begin() {return m_Dictionary.begin();} DictionaryIterator end() {return m_Dictionary.end(); } - size_t size() {return 0; } + size_t size(); - Op getReason() const {return Add;} + Op getReason(); // Observer trigger. private: - void fireObservers(Op reason) {} + void fireObservers(Op reason); }; class spectrum_dictionary_exception : public std::exception Modified: branches/spectcl-5.0/SpecTclPackage/SpectrumDictTest.cpp =================================================================== --- branches/spectcl-5.0/SpecTclPackage/SpectrumDictTest.cpp 2013-07-24 20:26:07 UTC (rev 2120) +++ branches/spectcl-5.0/SpecTclPackage/SpectrumDictTest.cpp 2013-07-25 13:47:31 UTC (rev 2121) @@ -13,6 +13,7 @@ #include "CSpectrumAllocator.h" #include "CSpectrumIncrementer.h" #include "CTrueCondition.h" +#include "CObservable.h" #include <stdint.h> @@ -33,16 +34,19 @@ CPPUNIT_TEST(removeok); - // CPPUNIT_TEST(begin); - // CPPUNIT_TEST(beginonempty); + CPPUNIT_TEST(begin); + CPPUNIT_TEST(beginnonempty); - // CPPUNIT_TEST(end); - // CPPUNIT_TEST(endnonempty); + CPPUNIT_TEST(end); - // CPPUNIT_TEST(size); + CPPUNIT_TEST(size); + // Observer tests: + CPPUNIT_TEST(observeradd); + CPPUNIT_TEST(observerremove); + CPPUNIT_TEST(getreasonempty); CPPUNIT_TEST_SUITE_END(); @@ -65,6 +69,17 @@ void removenox(); void removeok(); + + void begin(); + void beginnonempty(); + + void end(); + + void size(); + + void observeradd(); + void observerremove(); + void getreasonempty(); }; @@ -241,3 +256,161 @@ delete pSpec; } +/** + * begin + * Test begin method is begi iterator: + */ +void +SpectrumDictTest::begin() +{ + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + ASSERT(pDict->m_Dictionary.begin() == pDict->begin()); +} +/** + * beginnonempty + * If there's a spectrum in the dict: + * * begin 'points' to its pair. + * * the iterator from begin incremented gets us to end. + */ +void +SpectrumDictTest::beginnonempty() +{ + CSpectrum* pSpec = makeSpectrum(); + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + + pDict->add(*pSpec); + + CSpectrumDictionary::DictionaryIterator p = pDict->begin(); + EQ(pSpec->getName(), p->first); + EQ(pSpec, p->second); + + p++; + ASSERT(p == pDict->m_Dictionary.end()); +} +/** + * end + */ +void +SpectrumDictTest::end() +{ + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + ASSERT(pDict->m_Dictionary.end() == pDict->end()); +} +/** + * size + * + * Shows how many spectra are in the dictionary. + */ +void +SpectrumDictTest::size() +{ + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + EQ(static_cast<size_t>(0), pDict->size()); + + pDict->add(*(makeSpectrum())); + + EQ(static_cast<size_t>(1), pDict->size()); + + CAxis *pX = new CAxis("X-axis", 0.0, 127.0, 128); + std::vector<CAxis*> axes; + axes.push_back(pX); + CDummyAllocator* pAlloc = new CDummyAllocator; + CDummyIncrementer* pInc = new CDummyIncrementer; + CTrueCondition* pTrue = new CTrueCondition; + + pDict->add(*new CSpectrum("test2", pAlloc, pInc, pTrue, axes)); + EQ(static_cast<size_t>(2), pDict->size()); + +} +/** + * observeradd + * + * Add observer must be called when a spectrum is added + * and the operation at the time must be 'Add'. + */ +class WhatObserved : public CObserver<CSpectrumDictionary> +{ +public: + bool called; + CSpectrumDictionary::Op op; + + WhatObserved() : called(false) {} + + void operator()(CObservable<CSpectrumDictionary>* s) + { + CSpectrumDictionary* pDict + = reinterpret_cast<CSpectrumDictionary*>(s); + + called = true; + op = pDict->getReason(); + } +}; + +void +SpectrumDictTest::observeradd() +{ + CSpectrum* pSpec = makeSpectrum(); + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + WhatObserved observer; + pDict->addObserver(&observer); + + pDict->add(*pSpec); + + ASSERT(observer.called); + EQ(CSpectrumDictionary::Add, observer.op); + +} +/** + * observerremove + * + * Test that an observer gets called on remove. + */ +void +SpectrumDictTest::observerremove() +{ + CSpectrum* pSpec = makeSpectrum(); + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + WhatObserved observer; + + pDict->add(*pSpec); + + + pDict->addObserver(&observer); + pDict->remove(pSpec->getName().c_str()); + + ASSERT(observer.called); + EQ(CSpectrumDictionary::Remove, observer.op); + +} +/** + * getreasonempty + * + * If I get the reason when not processing + * observations, a spectrum_dictionary_exception + * gets thrown. + */ +void +SpectrumDictTest::getreasonempty() +{ + CSpectrumDictionary* pDict = CSpectrumDictionary::instance(); + + bool thrown = false; + bool rthrow = false; + std::string msg; + + try { + pDict->getReason(); + } + catch(spectrum_dictionary_exception& e) { + thrown = true; + rthrow = true; + msg = e.what(); + } + catch (...) { + thrown = true; + } + ASSERT(thrown); + ASSERT(rthrow); + EQ(std::string("CSpectrumDictionary::getReason - not observing so there's no reason"), + msg); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |