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.cc141
1 files changed, 12 insertions, 129 deletions
diff --git a/i/marvin/src/tester/tester.cc b/i/marvin/src/tester/tester.cc
index 3251fbb..5b93fd8 100644
--- a/i/marvin/src/tester/tester.cc
+++ b/i/marvin/src/tester/tester.cc
@@ -24,28 +24,18 @@
// }}}
#include "tester.hh"
-#include <unistd.h>
-#include <iostream>
-#include <exception>
-#include <sstream>
+#include <unistd.h> // getopt
+#include <exception> // std::exception
+#include <cstdlib> // std::exit
/// Constructor.
Tester::Tester (int argc, char **argv)
- : config_ (argc, argv), program_(argv[0]), commands_ ("")
+ : config_ (argc, argv), program_(argv[0])
{
// Parse command line
getOpt (argc, argv);
}
-/// Destructor.
-Tester::~Tester (void)
-{
- for (Funcs::iterator i = funcs_.begin (); i != funcs_.end (); ++i)
- {
- delete i->second;
- }
-}
-
/// Getopt command line.
/// Supported arguemnts :
/// - -c "commands list"
@@ -60,7 +50,7 @@ Tester::getOpt (int argc, char **argv)
{
std::cerr << "Argument missing." << std::endl;
usage ();
- exit (1);
+ std::exit (1);
}
// Automatic error message
@@ -71,12 +61,12 @@ Tester::getOpt (int argc, char **argv)
switch (option)
{
case 'c':
- commands_ = optarg;
+ commands_.append (optarg);
break;
case '?':
default:
usage ();
- exit (2);
+ std::exit (2);
break;
}
}
@@ -84,131 +74,24 @@ Tester::getOpt (int argc, char **argv)
/// Print usage to stdout.
void
-Tester::usage (void)
+Tester::usage (void) const
{
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)
+Tester::add (const std::string &s, Interpreter::Func *f)
{
- if (!funcs_.insert (Funcs::value_type (s, f)).second)
- {
- // Tester owns f, therefore, f must be deleted.
- delete f;
- throw std::runtime_error ("function \'" + s
- + "\' inserted two times");
- }
-}
-
-/// Call a test function by name.
-bool
-Tester::call (const std::string &s, const Args &a) const
-{
- Funcs::const_iterator i;
- i = funcs_.find (s);
- if (i == funcs_.end ())
- throw std::runtime_error ("function \'" + s + "\' does not exist");
- try
- {
- return (*i->second) (a);
- }
- catch (const std::exception &e)
- {
- throw std::runtime_error ("while calling \'" + s + "\', "
- + e.what ());
- }
+ interpreter_.add (s, f);
}
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);
+ // TODO called interpreter with the commands_, in check mode then in run
+ // mode.
}