From 511859ef8028bb75032a965b490faa67b174a4e6 Mon Sep 17 00:00:00 2001 From: deva Date: Fri, 24 Jul 2009 09:11:52 +0000 Subject: Made some more tests, and documented the header file. --- server/src/macrolist.cc | 49 +++++++++++++++++++++++++++++++++++++++++++------ server/src/macrolist.h | 29 +++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/server/src/macrolist.cc b/server/src/macrolist.cc index 1117ed9..f067fb1 100644 --- a/server/src/macrolist.cc +++ b/server/src/macrolist.cc @@ -70,9 +70,9 @@ MacroList::MacroList(std::string macropath) } } -std::string MacroList::getLatestVersion(std::string macro) +std::string MacroList::getLatestVersion(std::string macro) throw(Exception) { - if(find(macro) == end()) return ""; + if(find(macro) == end()) throw Exception("Macro ["+macro+"] does not exist"); MacroListItem mli = (*this)[macro]; if(mli.size() == 0) return ""; printf("Search for %s - found %s v%s\n", @@ -84,9 +84,12 @@ std::string MacroList::getLatestVersion(std::string macro) #ifdef TEST_MACROLIST +#define MACRODIR "/home" // We assume this directory exists and does not contain any xml files! + int main() { - MacroList lst("/home"); + // Test sorting + MacroList lst(MACRODIR); lst["macro1"][VersionStr("1.0")] = "macro1-1.0.xml"; lst["macro1"][VersionStr("1.1")] = "macro1-1.1.xml"; @@ -95,19 +98,53 @@ int main() lst["macro2"][VersionStr("1.0")] = "macro2.xml"; lst["macro3"][VersionStr("1.0")] = "macro3.xml"; + std::vector refs; + refs.push_back("macro1-1.2.xml"); + refs.push_back("macro1-1.1.1.xml"); + refs.push_back("macro1-1.1.xml"); + refs.push_back("macro1-1.0.xml"); + refs.push_back("macro2.xml"); + refs.push_back("macro3.xml"); + MacroList::iterator i = lst.begin(); + std::vector::iterator k = refs.begin(); while(i != lst.end()) { MacroListItem::iterator j = i->second.begin(); while(j != i->second.end()) { - printf("%s - v%s file: %s\n", + printf("%s - v%s file: %s - should be %s\n", i->first.c_str(), ((std::string)j->first).c_str(), - j->second.c_str()); - j++; + j->second.c_str(), + k->c_str()); + if(j->second != *k) return 1; + j++; k++; } i++; } + // Test lookup of latest versions. + std::string m1 = lst.getLatestVersion("macro1"); + printf("Latest macro1: %s\n", m1.c_str()); + if(m1 != MACRODIR"/macro1-1.2.xml") return 1; + + std::string m2 = lst.getLatestVersion("macro2"); + printf("Latest macro2: %s\n", m2.c_str()); + if(m2 != MACRODIR"/macro2.xml") return 1; + + std::string m3 = lst.getLatestVersion("macro3"); + printf("Latest macro3: %s\n", m3.c_str()); + if(m3 != MACRODIR"/macro3.xml") return 1; + + // Look for non existing macro (this should throw an exception) + try { + std::string m4 = lst.getLatestVersion("macro4"); + } catch(Exception &e) { + printf("ERROR: %s\n", e.what()); + goto onandon; + } + return 1; + onandon: + return 0; } diff --git a/server/src/macrolist.h b/server/src/macrolist.h index 328e522..9b9b0d2 100644 --- a/server/src/macrolist.h +++ b/server/src/macrolist.h @@ -32,13 +32,38 @@ #include #include "versionstr.h" +#include "exception.h" + +/** + * The Items contained in the MacroList. + */ typedef std::map MacroListItem; +/** + * The MacroList class is intended for macro file caching, so that all macros + * do not need to be parsed on each macro query. + * It builds a list of macros and versions based on the informations read from + * the MacroHeaderParser. + * This means that just because a macro gets into the list doesn't means that it + * will validate as a correct macro (not even nessecarily correct XML). + */ class MacroList : public std::map { public: + /** + * Constructor. + * @param macropath A std::string containing the path in which we should look + * for xml files. + */ MacroList(std::string macropath); - - std::string getLatestVersion(std::string macro); + + /** + * Convenience method, to gain the filename of the latest version of a given macro. + * This method throws an Exception if the macro does not exist in the tree. + * @param macro A std::string containing the name of the wanted macro. + * @return A std::string containing the file containing the macro with full path + * included. + */ + std::string getLatestVersion(std::string macro) throw(Exception); private: std::string macropath; -- cgit v1.2.3