summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2009-07-24 09:11:52 +0000
committerdeva <deva>2009-07-24 09:11:52 +0000
commit511859ef8028bb75032a965b490faa67b174a4e6 (patch)
treef803fce448b03f9a0586a493484983ea59215025
parentcdc1e51494c6afc16f00e2d5829db5250a801f42 (diff)
Made some more tests, and documented the header file.
-rw-r--r--server/src/macrolist.cc49
-rw-r--r--server/src/macrolist.h29
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<std::string> 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<std::string>::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 <string>
#include "versionstr.h"
+#include "exception.h"
+
+/**
+ * The Items contained in the MacroList.
+ */
typedef std::map<VersionStr, std::string> 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<std::string, MacroListItem > {
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;