#ifndef __HAYAI_TEST #define __HAYAI_TEST #include #include "hayai_clock.hpp" #include "hayai_test_result.hpp" namespace hayai { /// Base test class. /// @ref SetUp is invoked before each run, and @ref TearDown is invoked /// once the run is finished. Iterations rely on the same fixture /// for every run. /// /// The default test class does not contain any actual code in the /// SetUp and TearDown methods, which means that tests can inherit /// this class directly for non-fixture based benchmarking tests. class Test { public: /// Set up the testing fixture for execution of a run. virtual void SetUp() { } /// Tear down the previously set up testing fixture after the /// execution run. virtual void TearDown() { } /// Run the test. /// @param iterations Number of iterations to gather data for. /// @returns the number of nanoseconds the run took. uint64_t Run(std::size_t iterations) { std::size_t iteration = iterations; // Set up the testing fixture. SetUp(); // Get the starting time. Clock::TimePoint startTime, endTime; startTime = Clock::Now(); // Run the test body for each iteration. while (iteration--) TestBody(); // Get the ending time. endTime = Clock::Now(); // Tear down the testing fixture. TearDown(); // Return the duration in nanoseconds. return Clock::Duration(startTime, endTime); } virtual ~Test() { } protected: /// Test body. /// Executed for each iteration the benchmarking test is run. virtual void TestBody() { } }; } #endif