summaryrefslogtreecommitdiff
path: root/i/marvin/src/tester/tester.cc
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/tester/tester.cc')
-rw-r--r--i/marvin/src/tester/tester.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/i/marvin/src/tester/tester.cc b/i/marvin/src/tester/tester.cc
index ba4ff40..3251fbb 100644
--- a/i/marvin/src/tester/tester.cc
+++ b/i/marvin/src/tester/tester.cc
@@ -24,6 +24,19 @@
// }}}
#include "tester.hh"
+#include <unistd.h>
+#include <iostream>
+#include <exception>
+#include <sstream>
+
+/// Constructor.
+Tester::Tester (int argc, char **argv)
+ : config_ (argc, argv), program_(argv[0]), commands_ ("")
+{
+ // Parse command line
+ getOpt (argc, argv);
+}
+
/// Destructor.
Tester::~Tester (void)
{
@@ -33,6 +46,121 @@ Tester::~Tester (void)
}
}
+/// Getopt command line.
+/// Supported arguemnts :
+/// - -c "commands list"
+void
+Tester::getOpt (int argc, char **argv)
+{
+ char *optstring = "c:";
+ int option;
+
+ // Check number of args
+ if (argc < 2)
+ {
+ std::cerr << "Argument missing." << std::endl;
+ usage ();
+ exit (1);
+ }
+
+ // Automatic error message
+ opterr = 1;
+
+ while ((option = getopt (argc, argv, optstring)) != EOF)
+ {
+ switch (option)
+ {
+ case 'c':
+ commands_ = optarg;
+ break;
+ case '?':
+ default:
+ usage ();
+ exit (2);
+ break;
+ }
+ }
+}
+
+/// Print usage to stdout.
+void
+Tester::usage (void)
+{
+ std::cout << "Usage: " << program_ << " [-c <commands list>]" <<
+ std::endl;
+}
+
+/// Run command list.
+/// If check is true, the command list will be checked, otherwise, it
+/// will be executed. If check failed, it throw an exception.
+void
+Tester::parse (const std::string &commands, bool check)
+{
+ Args argList;
+ std::istringstream list_commands (commands);
+ std::string commandargs, command, args;
+ std::string::size_type pos;
+
+ // Cut it by ;
+ while (std::getline (list_commands, commandargs, ';'))
+ {
+ argList.clear ();
+ // Remove space at begining
+ pos = commandargs.find_first_not_of (' ');
+ // For empty command...
+ if (pos != std::string::npos)
+ {
+ commandargs = commandargs.substr
+ (commandargs.find_first_not_of (' '));
+ // Remove space at end
+ commandargs = commandargs.substr
+ (0, commandargs.find_last_not_of (' ') + 1);
+ // Get the command
+ pos = commandargs.find_first_of (' ');
+ command = commandargs.substr (0, pos);
+ // Args ?
+ if (pos != std::string::npos)
+ {
+ args = commandargs.substr (pos);
+ pos = 0;
+ do
+ {
+ // Next
+ args = args.substr (pos);
+ // Remove space at begining
+ args = args.substr (args.find_first_not_of (' '));
+ // Get the end position of the first arg
+ pos = args.find_first_of (' ');
+ // Add args
+ // TODO type ?
+ argList.push_back (args.substr (0, pos));
+ }
+ while (pos != std::string::npos);
+ }
+ if (check)
+ {
+ // TODO Check args
+ if (!exist (command))
+ throw std::runtime_error ("Unknow command : " + command);
+ }
+ else
+ call (command, argList);
+ }
+ }
+}
+
+/// Check function exists.
+bool
+Tester::exist (const std::string &s)
+{
+ Funcs::const_iterator i;
+ i = funcs_.find (s);
+ if (i == funcs_.end ())
+ return false;
+ else
+ return true;
+}
+
/// Add a test function, Tester owns f.
void
Tester::add (const std::string &s, Func *f)
@@ -65,3 +193,22 @@ Tester::call (const std::string &s, const Args &a) const
}
}
+void
+Tester::run (void)
+{
+ if (commands_.size () < 1)
+ throw std::runtime_error ("Nothing to do");
+ // Check commands
+ try
+ {
+ parse (commands_, true);
+ }
+ catch (const std::exception &e)
+ {
+ std::cerr << "Error : " << e.what () << std::endl;
+ usage ();
+ exit (3);
+ }
+ parse (commands_, false);
+}
+