From 511859ef8028bb75032a965b490faa67b174a4e6 Mon Sep 17 00:00:00 2001
From: deva <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(-)

(limited to 'server')

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;
-- 
cgit v1.2.3