]> git.stg.codes - stg.git/blobdiff - tests/tut/tut_main.hpp
TUT framework updated to svn version
[stg.git] / tests / tut / tut_main.hpp
diff --git a/tests/tut/tut_main.hpp b/tests/tut/tut_main.hpp
new file mode 100644 (file)
index 0000000..c6955bb
--- /dev/null
@@ -0,0 +1,111 @@
+#ifndef TUT_MAIN_H
+#define TUT_MAIN_H
+
+#include <tut/tut.hpp>
+#include <tut/tut_console_reporter.hpp>
+#include <tut/tut_cppunit_reporter.hpp>
+#include <iostream>
+#include <cstring>
+
+namespace tut
+{
+
+/** Helper function to make test binaries simpler.
+ *
+ * Example of basic usage follows.
+ *
+ * @code
+ *  namespace tut { test_runner_singleton runner; }
+ *
+ *  int main(int argc, char **argv)
+ *  {
+ *      if( tut_main(argc, argv) )
+ *          return 0;
+ *      else
+ *          return -1;
+ *  }
+ * @endcode
+ *
+ * It is also possible to do some generic initialization before
+ * running any tests and cleanup before exiting application.
+ * Note that tut_main can throw tut::no_such_group or tut::no_such_test.
+ *
+ * @code
+ *  namespace tut { test_runner_singleton runner; }
+ *
+ *  int main(int argc, char **argv)
+ *  {
+ *      tut::xml_reporter reporter;
+ *      tut::runner.get().insert_callback(&reporter);
+ *
+ *      MyInit();
+ *      try
+ *      {
+ *          tut_main(argc, argv);
+ *      }
+ *      catch(const tut::tut_error &ex)
+ *      {
+ *          std::cerr << "TUT error: " << ex.what() << std::endl;
+ *      }
+ *      MyCleanup();
+ *  }
+ * @endcode
+ */
+inline bool tut_main(int argc, const char * const * const argv, std::ostream &os = std::cerr)
+{
+    std::stringstream usage;
+    usage << "Usage: " << argv[0] << " [group] [testcase]" << std::endl;
+    groupnames gr = runner.get().list_groups();
+    usage << "Available test groups:" << std::endl;
+    for(groupnames::const_iterator i = gr.begin(); i != gr.end(); ++i)
+    {
+        usage << "    " << *i << std::endl;
+    }
+
+    if(argc>1)
+    {
+        if(std::string(argv[1]) == "-h" ||
+           std::string(argv[1]) == "--help" ||
+           std::string(argv[1]) == "/?" ||
+           argc > 3)
+        {
+            os << usage.rdbuf();
+            return false;
+        }
+    }
+
+    // Check command line options.
+    switch(argc)
+    {
+        case 1:
+            runner.get().run_tests();
+        break;
+
+        case 2:
+            runner.get().run_tests(argv[1]);
+        break;
+
+        case 3:
+        {
+            char *end;
+            int t = strtol(argv[2], &end, 10);
+            if(end != argv[2] + strlen(argv[2]))
+            {
+                throw no_such_test("`" + std::string(argv[2]) + "` should be a number");
+            }
+
+            test_result tr;
+            if(!runner.get().run_test(argv[1], t, tr) || tr.result == test_result::dummy)
+            {
+                throw no_such_test("No testcase `" + std::string(argv[2]) + "` in group `" + argv[1] + "`");
+            }
+        }
+        break;
+    }
+
+    return true;
+} // tut_main()
+
+}
+
+#endif