/* SubID(Test) - exploring possible properties of an extensible symbolic identifier Copyright (C) 2009, Hermann Vosseler   **Lumiera** 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. See the file COPYING for further details. * *****************************************************************/ /** @file sub-id-test.cpp ** unit test \ref SubID_test */ #include "lib/test/run.hpp" #include "lib/util.hpp" #include "lib/util-foreach.hpp" #include "lib/format-cout.hpp" #include "lib/sub-id.hpp" #include #include #include #include #include namespace lib { namespace test{ using util::for_each; using std::bind; using std::placeholders::_1; using boost::hash; using std::vector; using std::string; namespace { // test data enum Colour { R,G,B }; inline string toString (Colour c) ///< make the enum printable { static string sym("RGB"); return sym.substr(c,1); } } /************************************************************************//** * @test for now (9/09) this is a playground for shaping a vague design idea * - base types and casts * - exploring some extensions * - use this ID as Hash-Map key * * @see lib::SubID */ class SubID_test : public Test { virtual void run (Arg) { checkBaseType(); checkExtension(); checkSubIDHash(); } void checkBaseType () { typedef SubId CID; CID c1 (R); CID c2 (G); CID c3 (B); cout << "...." << c1 << c2 << c3 << endl; } void checkExtension () { typedef SubId UID; typedef ExtendedSubId CUID; SubID const& id1 = CUID(R, 12); SubID const& id2 = CUID(G, 13); cout << "id1=" << id1 << endl; cout << "id2=" << id2 << endl; } void checkSubIDHash() { typedef SubId CID; typedef SubId UID; typedef ExtendedSubId CUID; vector simpleIDs; simpleIDs.push_back(CID(R)); simpleIDs.push_back(CID(R)); simpleIDs.push_back(CID(G)); simpleIDs.push_back(CID(B)); vector extendedIDs; extendedIDs.push_back(CUID(R,22)); extendedIDs.push_back(CUID(R,22)); // note the duplicates get dropped extendedIDs.push_back(CUID(R,23)); extendedIDs.push_back(CUID(R,24)); extendedIDs.push_back(CUID(G,24)); extendedIDs.push_back(CUID(B,25)); buildHashtable (simpleIDs); buildHashtable (extendedIDs); } template struct HashTable : std::unordered_map> { void add (KEY key) { (*this)[key] = string(key); } void verify (KEY key) { cout << "verify....." << key << endl; CHECK (string(key) == (*this)[key]); } }; template void buildHashtable (vector keys) { typedef HashTable HTab; HTab tab; for_each (keys, bind (&HTab::add, ref(tab), _1 )); for_each (keys, bind (&HTab::verify, ref(tab), _1 )); cout << "Elements in hashtable: " << tab.size() << endl; } }; /** Register this test class... */ LAUNCHER (SubID_test, "unit common"); }} // namespace lib::test