Skip to content

Commit

Permalink
Added UnitTests and enhanced TDebug and TCString
Browse files Browse the repository at this point in the history
  • Loading branch information
AdventureT committed Nov 11, 2023
1 parent c506766 commit b66731a
Show file tree
Hide file tree
Showing 187 changed files with 15,080 additions and 23 deletions.
2 changes: 2 additions & 0 deletions OpenJPOG/Source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@
int main(int argc, char** argv)
{
Toshi::TCString test;
Toshi::TCString test2;
test != test2;
return 1;
}
10 changes: 10 additions & 0 deletions Tools/UnitTests/Source/TKernel/TCString_Tests.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "TKernel/TCString.h"
#include <catch2/catch_test_macros.hpp>

TOSHI_NAMESPACE_USING

TEST_CASE("Constructor", "[TCString]")
{
TCString string("ABCD");
REQUIRE(string == "ABCD");
}
8 changes: 8 additions & 0 deletions Tools/UnitTests/Source/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <catch2/catch_session.hpp>

int main(int argc, char* argv[]) {

int result = Catch::Session().run(argc, argv);

return result;
}
97 changes: 97 additions & 0 deletions Tools/UnitTests/premake5.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
function ExtractLib(options)
local catch2Location = "../Vendor/Catch2/lib/" .. _OPTIONS["arch"]
local zipLocation = catch2Location .. "/Catch2" .. options.dbg .. ".zip"
local libLocation = catch2Location .. "/Catch2" .. options.dbg .. ".lib"

if not os.isfile(libLocation) then
zip.extract(zipLocation, catch2Location)
end
end


project "UnitTests"
language "C++"
cppdialect "C++20"
characterset "ASCII"

links
{
"TKernelInterface"
}

libdirs
{
"%{LibDir.catch2}",
}

files
{
"Source/**.h",
"Source/**.cpp",
}

includedirs
{
"%{wks.location}/Toshi/Include",
"%{IncludeDir.catch2}"
}

defines
{
"TOSHI_USER_CLIENT",
}

postbuildcommands
{
"{COPY} \"%{wks.location}bin/" .. outputdir .. "/TKernelInterface/TKernelInterface.dll\" \"%{wks.location}bin/" .. outputdir .. "/%{prj.name}\"",
}

filter "system:windows"
systemversion "latest"

defines
{
"TOSHI_CONSOLE",
"TOSHI_SKU_WINDOWS"
}

filter "configurations:Debug"
kind "ConsoleApp"
runtime "Debug"
defines "TOSHI_DEBUG"
symbols "On"

ExtractLib { dbg = "d" }

links
{
"Catch2d.lib"
}

filter "configurations:Release"
kind "ConsoleApp"
runtime "Release"
defines "TOSHI_RELEASE"
optimize "On"

ExtractLib { dbg = ""}

links
{
"Catch2.lib"
}

filter "configurations:Dist"
kind "ConsoleApp"
runtime "Release"
defines "TOSHI_DIST"
optimize "On"

ExtractLib { dbg = "" }

links
{
"Catch2.lib"
}


1 change: 1 addition & 0 deletions Tools/Vendor/Catch2/include/catch.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <catch2/catch_all.hpp>
148 changes: 148 additions & 0 deletions Tools/Vendor/Catch2/include/catch2/benchmark/catch_benchmark.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@

// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)

// SPDX-License-Identifier: BSL-1.0
// Adapted from donated nonius code.

#ifndef CATCH_BENCHMARK_HPP_INCLUDED
#define CATCH_BENCHMARK_HPP_INCLUDED

#include <catch2/catch_user_config.hpp>
#include <catch2/internal/catch_compiler_capabilities.hpp>
#include <catch2/internal/catch_context.hpp>
#include <catch2/internal/catch_move_and_forward.hpp>
#include <catch2/internal/catch_test_failure_exception.hpp>
#include <catch2/internal/catch_unique_name.hpp>
#include <catch2/interfaces/catch_interfaces_capture.hpp>
#include <catch2/interfaces/catch_interfaces_config.hpp>
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
#include <catch2/benchmark/detail/catch_benchmark_stats.hpp>
#include <catch2/benchmark/catch_clock.hpp>
#include <catch2/benchmark/catch_environment.hpp>
#include <catch2/benchmark/catch_execution_plan.hpp>
#include <catch2/benchmark/detail/catch_estimate_clock.hpp>
#include <catch2/benchmark/detail/catch_analyse.hpp>
#include <catch2/benchmark/detail/catch_benchmark_function.hpp>
#include <catch2/benchmark/detail/catch_run_for_at_least.hpp>

#include <algorithm>
#include <chrono>
#include <exception>
#include <functional>
#include <string>
#include <vector>
#include <cmath>

namespace Catch {
namespace Benchmark {
struct Benchmark {
Benchmark(std::string&& benchmarkName)
: name(CATCH_MOVE(benchmarkName)) {}

template <class FUN>
Benchmark(std::string&& benchmarkName , FUN &&func)
: fun(CATCH_MOVE(func)), name(CATCH_MOVE(benchmarkName)) {}

template <typename Clock>
ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {
auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;
auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));
auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);
int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));
return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations };
}

template <typename Clock = default_clock>
void run() {
auto const* cfg = getCurrentContext().getConfig();

auto env = Detail::measure_environment<Clock>();

getResultCapture().benchmarkPreparing(name);
CATCH_TRY{
auto plan = user_code([&] {
return prepare<Clock>(*cfg, env);
});

BenchmarkInfo info {
CATCH_MOVE(name),
plan.estimated_duration.count(),
plan.iterations_per_sample,
cfg->benchmarkSamples(),
cfg->benchmarkResamples(),
env.clock_resolution.mean.count(),
env.clock_cost.mean.count()
};

getResultCapture().benchmarkStarting(info);

auto samples = user_code([&] {
return plan.template run<Clock>(*cfg, env);
});

auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());
BenchmarkStats<FloatDuration<Clock>> stats{ CATCH_MOVE(info), CATCH_MOVE(analysis.samples), analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };
getResultCapture().benchmarkEnded(stats);
} CATCH_CATCH_ANON (TestFailureException const&) {
getResultCapture().benchmarkFailed("Benchmark failed due to failed assertion"_sr);
} CATCH_CATCH_ALL{
getResultCapture().benchmarkFailed(translateActiveException());
// We let the exception go further up so that the
// test case is marked as failed.
std::rethrow_exception(std::current_exception());
}
}

// sets lambda to be used in fun *and* executes benchmark!
template <typename Fun, std::enable_if_t<!Detail::is_related<Fun, Benchmark>::value, int> = 0>
Benchmark & operator=(Fun func) {
auto const* cfg = getCurrentContext().getConfig();
if (!cfg->skipBenchmarks()) {
fun = Detail::BenchmarkFunction(func);
run();
}
return *this;
}

explicit operator bool() {
return true;
}

private:
Detail::BenchmarkFunction fun;
std::string name;
};
}
} // namespace Catch

#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1
#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2

#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\
if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \
BenchmarkName = [&](int benchmarkIndex)

#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\
if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \
BenchmarkName = [&]

#if defined(CATCH_CONFIG_PREFIX_ALL)

#define CATCH_BENCHMARK(...) \
INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(CATCH2_INTERNAL_BENCHMARK_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))
#define CATCH_BENCHMARK_ADVANCED(name) \
INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(CATCH2_INTERNAL_BENCHMARK_), name)

#else

#define BENCHMARK(...) \
INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(CATCH2_INTERNAL_BENCHMARK_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))
#define BENCHMARK_ADVANCED(name) \
INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(CATCH2_INTERNAL_BENCHMARK_), name)

#endif

#endif // CATCH_BENCHMARK_HPP_INCLUDED
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@

// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)

// SPDX-License-Identifier: BSL-1.0
/** \file
* This is a convenience header for Catch2's benchmarking. It includes
* **all** of Catch2 headers related to benchmarking.
*
* Generally the Catch2 users should use specific includes they need,
* but this header can be used instead for ease-of-experimentation, or
* just plain convenience, at the cost of (significantly) increased
* compilation times.
*
* When a new header is added to either the `benchmark` folder, or to
* the corresponding internal (detail) subfolder, it should be added here.
*/

#ifndef CATCH_BENCHMARK_ALL_HPP_INCLUDED
#define CATCH_BENCHMARK_ALL_HPP_INCLUDED

#include <catch2/benchmark/catch_benchmark.hpp>
#include <catch2/benchmark/catch_chronometer.hpp>
#include <catch2/benchmark/catch_clock.hpp>
#include <catch2/benchmark/catch_constructor.hpp>
#include <catch2/benchmark/catch_environment.hpp>
#include <catch2/benchmark/catch_estimate.hpp>
#include <catch2/benchmark/catch_execution_plan.hpp>
#include <catch2/benchmark/catch_optimizer.hpp>
#include <catch2/benchmark/catch_outlier_classification.hpp>
#include <catch2/benchmark/catch_sample_analysis.hpp>
#include <catch2/benchmark/detail/catch_analyse.hpp>
#include <catch2/benchmark/detail/catch_benchmark_function.hpp>
#include <catch2/benchmark/detail/catch_benchmark_stats.hpp>
#include <catch2/benchmark/detail/catch_benchmark_stats_fwd.hpp>
#include <catch2/benchmark/detail/catch_complete_invoke.hpp>
#include <catch2/benchmark/detail/catch_estimate_clock.hpp>
#include <catch2/benchmark/detail/catch_measure.hpp>
#include <catch2/benchmark/detail/catch_repeat.hpp>
#include <catch2/benchmark/detail/catch_run_for_at_least.hpp>
#include <catch2/benchmark/detail/catch_stats.hpp>
#include <catch2/benchmark/detail/catch_timing.hpp>

#endif // CATCH_BENCHMARK_ALL_HPP_INCLUDED
Loading

0 comments on commit b66731a

Please sign in to comment.