From 8f486613be58ced269db1d437e560c16558604e8 Mon Sep 17 00:00:00 2001 From: becquet Date: Thu, 10 May 2007 18:49:20 +0000 Subject: Création de chuck, le programme du robot 2007. --- i/chuck/src/tester/Makefile.defs | 5 ++ i/chuck/src/tester/test_tester.cc | 78 +++++++++++++++++++++ i/chuck/src/tester/tester.cc | 141 ++++++++++++++++++++++++++++++++++++++ i/chuck/src/tester/tester.hh | 77 +++++++++++++++++++++ 4 files changed, 301 insertions(+) create mode 100644 i/chuck/src/tester/Makefile.defs create mode 100644 i/chuck/src/tester/test_tester.cc create mode 100644 i/chuck/src/tester/tester.cc create mode 100644 i/chuck/src/tester/tester.hh (limited to 'i/chuck/src/tester') diff --git a/i/chuck/src/tester/Makefile.defs b/i/chuck/src/tester/Makefile.defs new file mode 100644 index 0000000..eeff4ab --- /dev/null +++ b/i/chuck/src/tester/Makefile.defs @@ -0,0 +1,5 @@ +PROGRAMS += test_tester + +tester_OBJECTS = tester.o $(config_OBJECTS) $(interpreter_OBJECTS) $(log_OBJECTS) + +test_tester_OBJECTS = test_tester.o $(tester_OBJECTS) diff --git a/i/chuck/src/tester/test_tester.cc b/i/chuck/src/tester/test_tester.cc new file mode 100644 index 0000000..d292c7f --- /dev/null +++ b/i/chuck/src/tester/test_tester.cc @@ -0,0 +1,78 @@ +// test_tester.cc +// marvin - programme du robot 2006. {{{ +// +// Copyright (C) 2006 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "tester.hh" + +class TestTester : public Tester +{ + public: + // Constructor + TestTester (int argc, char ** argv) + : Tester (argc, argv) { } + void funcA (const Interpreter::Args &a, bool dryrun) + { + if (!dryrun) + std::cout << " a " << a << std::endl; + } + void funcB (void) + { + std::cout << " b ( )" << std::endl; + } + void funcC (int i) + { + std::cout << " c ( " << i << " )" << std::endl; + } + void funcD (const std::string &s) + { + std::cout << " d ( " << s << " )" << std::endl; + } + void funcE (int i, const std::string &s, double d) + { + std::cout << " e ( " << i << ' ' << s << ' ' << d << " )" << std::endl; + } + void preRun (void) + { + Interpreter &interpreter = getInterpreter (); + // Add functions. + interpreter.add ("a", Interpreter::memFunc (*this, &TestTester::funcA), "Function a (any)"); + interpreter.add ("b", Interpreter::memFunc (*this, &TestTester::funcB), "Function b ()"); + interpreter.add ("c", Interpreter::memFunc (*this, &TestTester::funcC), "Function c (int)"); + interpreter.add ("d", Interpreter::memFunc (*this, &TestTester::funcD), "Function d (string)"); + interpreter.add ("e", Interpreter::memFunc (*this, &TestTester::funcE), "Function e (int, string, double)"); + } +}; + +int +main (int argc, char **argv) +{ + try + { + TestTester tt (argc, argv); + tt.run (); + } + catch (const std::exception &e) + { + std::cerr << e.what () << std::endl; + } +} diff --git a/i/chuck/src/tester/tester.cc b/i/chuck/src/tester/tester.cc new file mode 100644 index 0000000..61f577e --- /dev/null +++ b/i/chuck/src/tester/tester.cc @@ -0,0 +1,141 @@ +// tester.cc +// marvin - programme du robot 2006. {{{ +// +// Copyright (C) 2006 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "tester.hh" + +#include // getopt +#include // std::exception +#include // std::exit +#include // std::ostringstream + +/// Constructor. +Tester::Tester (int argc, char **argv, const std::string &description) + : program_(argv[0]), description_ (description), + showCmd_ (false), config_ (argc, argv) +{ + // Parse command line + getOpt (argc, argv); +} + +/// Getopt command line. +/// Supported arguemnts : +/// - -c 'commands list' +/// - -f +/// - -h : help +/// - -l : list commands suppoted +void +Tester::getOpt (int argc, char **argv) +{ + char *optstring = "hlc:f:"; + int option; + std::string strTmp; + + // Check number of args + if (argc < 2) + { + std::cerr << "Argument missing." << std::endl; + usage (); + std::exit (1); + } + + // Automatic error message + opterr = 1; + + while ((option = getopt (argc, argv, optstring)) != EOF) + { + switch (option) + { + case 'c': + // Check commands + commands_ += optarg; + break; + case 'f': + commands_ += ";include \""; + commands_ += optarg; + commands_ += "\";"; + break; + case 'h': + usage (); + std::exit (0); + break; + case 'l': + showCmd_ = true; + break; + case '?': + default: + usage (); + std::exit (2); + break; + } + } + if (commands_.empty () && !showCmd_) + { + usage (); + std::exit (2); + } +} + +/// Print usage to stdout. +void +Tester::usage (void) const +{ + std::cout << "Usage: " << program_ + << " [-c ]" + << " [-f ]" + << std::endl; + if (!description_.empty ()) + std::cout << description_ << std::endl; + std::cout << " -c Commands to run" << std::endl; + std::cout << " -f File with commands" << std::endl; + std::cout << " -l List all known commands by " + << program_ << std::endl; +} + +/// Print all knwon function and role to stdout. +void +Tester::listCmd (void) const +{ + std::cout << "Commands known by " << program_ << " :" << std::endl; + std::cout << interpreter_.help (); +} + +/// Run commands. +void +Tester::run (void) +{ + // Pre-run + preRun (); + if (showCmd_) + { + listCmd (); + std::exit (0); + } + // Check + interpreter_.interpretString (commands_, true); + // Run ! + interpreter_.interpretString (commands_, false); + // Post-run + postRun (); +} + diff --git a/i/chuck/src/tester/tester.hh b/i/chuck/src/tester/tester.hh new file mode 100644 index 0000000..b9aa312 --- /dev/null +++ b/i/chuck/src/tester/tester.hh @@ -0,0 +1,77 @@ +#ifndef tester_hh +#define tester_hh +// tester.hh +// marvin - programme du robot 2006. {{{ +// +// Copyright (C) 2006 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "config/config.hh" +#include "interpreter/interpreter.hh" +#include "log/data_circular_buffer_factory.hh" + +#include +#include +#include + +class Tester +{ + private: + /// DataCircularBufferFactory for beeing destruct at the end of the program. + /// Note : it must stay at the begining of the class ! + DataCircularBufferFactory dbc; + /// The interperter. + Interpreter interpreter_; + /// Program name. + std::string program_; + /// Description of the program. + std::string description_; + /// Commands to run. + std::string commands_; + /// Getopt command line. + void getOpt (int argc, char **argv); + /// Print usage to stdout. + void usage (void) const; + /// Print all knwon function and role to stdout. + void listCmd (void) const; + /// Show commands instead of run them. + bool showCmd_; + protected: + /// The config. + Config config_; + public: + /// Constructor. + Tester (int argc, char ** argv, const std::string &description = ""); + /// Destructor. + virtual ~Tester (void) { } + /// Get a reference to the interpreter. + Interpreter &getInterpreter (void) { return interpreter_; } + /// Run commands. + /// Call preRun, check command, run them, call postRun. + void run (void); + /// Executed before checking/running commands. Good place to add command + /// to the interpreter. + virtual void preRun (void) { } + /// Executed after running commands. + virtual void postRun (void) { } +}; + +#endif // tester_hh -- cgit v1.2.3