mirror of
https://github.com/RGBCube/serenity
synced 2025-05-30 19:18:11 +00:00

This will be very useful as we add the randomized test cases and their two loops ("generate+test many times" and "shrink once failure is found"), because without this failure reporting we'd get many FAIL error messages while still searching for the minimal one. So, inside randomized test cases we want to only turn the error reporting on for one last time after all the generating and shrinking.
77 lines
2.7 KiB
C++
77 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2021, Andrew Kaster <akaster@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibTest/Macros.h> // intentionally first -- we redefine VERIFY and friends in here
|
|
|
|
#include <AK/DeprecatedString.h>
|
|
#include <AK/Function.h>
|
|
#include <AK/Vector.h>
|
|
#include <LibTest/Randomized/RandomnessSource.h>
|
|
#include <LibTest/TestCase.h>
|
|
#include <LibTest/TestResult.h>
|
|
|
|
namespace Test {
|
|
|
|
class TestSuite {
|
|
public:
|
|
static TestSuite& the()
|
|
{
|
|
if (s_global == nullptr)
|
|
s_global = new TestSuite();
|
|
return *s_global;
|
|
}
|
|
|
|
static void release()
|
|
{
|
|
if (s_global)
|
|
delete s_global;
|
|
s_global = nullptr;
|
|
}
|
|
|
|
int run(Vector<NonnullRefPtr<TestCase>> const&);
|
|
int main(DeprecatedString const& suite_name, Span<StringView> arguments);
|
|
Vector<NonnullRefPtr<TestCase>> find_cases(DeprecatedString const& search, bool find_tests, bool find_benchmarks);
|
|
void add_case(NonnullRefPtr<TestCase> const& test_case)
|
|
{
|
|
m_cases.append(test_case);
|
|
}
|
|
|
|
TestResult current_test_result() const { return m_current_test_result; }
|
|
void set_current_test_result(TestResult result) { m_current_test_result = result; }
|
|
|
|
void set_suite_setup(Function<void()> setup) { m_setup = move(setup); }
|
|
// The RandomnessSource is where generators record / replay random data
|
|
// from. Initially a live "truly random" RandomnessSource is used, and when
|
|
// a failure is found, a set of hardcoded RandomnessSources is used during
|
|
// shrinking.
|
|
void set_randomness_source(Randomized::RandomnessSource source) { m_randomness_source = move(source); }
|
|
Randomized::RandomnessSource& randomness_source() { return m_randomness_source; }
|
|
|
|
// Dictates whether FAIL(), EXPECT() and similar macros in LibTest/Macros.h
|
|
// print messages or not. This is important for randomized tests because
|
|
// they run the test function many times in a row, and we only want to
|
|
// report the _minimal_ (shrunk) failure to the user, not all of them.
|
|
bool is_reporting_enabled() { return m_reporting_enabled; }
|
|
void enable_reporting() { m_reporting_enabled = true; }
|
|
void disable_reporting() { m_reporting_enabled = false; }
|
|
|
|
private:
|
|
static TestSuite* s_global;
|
|
Vector<NonnullRefPtr<TestCase>> m_cases;
|
|
u64 m_testtime = 0;
|
|
u64 m_benchtime = 0;
|
|
DeprecatedString m_suite_name;
|
|
u64 m_benchmark_repetitions = 1;
|
|
Function<void()> m_setup;
|
|
TestResult m_current_test_result = TestResult::NotRun;
|
|
Randomized::RandomnessSource m_randomness_source = Randomized::RandomnessSource::live();
|
|
bool m_reporting_enabled = true;
|
|
};
|
|
|
|
}
|