blob: 045fac46bf138b646a0fafdb28871dde36bae9fc [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fit/function.h>
#include <cstdlib>
#include <zxtest/base/assertion.h>
#include <zxtest/base/observer.h>
#include <zxtest/base/parameterized-value-impl.h>
#include <zxtest/base/runner.h>
#include <zxtest/base/test-case.h>
#include <zxtest/base/test-info.h>
#include <zxtest/base/types.h>
#include <zxtest/base/values.h>
namespace zxtest {
class RunnerTestPeer {
public:
static size_t GetParameterizedTestInfoSize(Runner* runner) {
return runner->parameterized_test_info_.size();
}
static void DeleteParameterizedTestInfo(Runner* runner, const internal::TypeId& suite_type) {
size_t index = 0;
for (auto& test_info : runner->parameterized_test_info_) {
if (test_info->GetFixtureId() == suite_type) {
runner->parameterized_test_info_.erase(index);
return;
}
index++;
}
}
static std::optional<::zxtest::internal::ParameterizedTestCaseInfo*> GetParameterizedTestInfo(
Runner* runner, const internal::TypeId& suite_type) {
for (auto& test_info : runner->parameterized_test_info_) {
if (test_info->GetFixtureId() == suite_type) {
return test_info.get();
}
}
return {};
}
};
namespace internal {
class ParameterizedTestCaseInfoImplTestPeer {
public:
template <typename T, typename U>
static size_t GetEntriesSize(ParameterizedTestCaseInfoImpl<T, U>* suite) {
return suite->test_entries_.size();
}
template <typename T, typename U>
static size_t GetInstantiationsSize(ParameterizedTestCaseInfoImpl<T, U>* suite) {
return suite->instantiation_fns_.size();
}
};
} // namespace internal
namespace test {
class ParameterizedTestSuite1 : public TestWithParam<int> {
public:
void SetUp() override {}
void TearDown() override {}
};
class ParameterizedSuite1Test1 : public ParameterizedTestSuite1 {
private:
void TestBody() final {}
};
class ParameterizedSuite1Test2 : public ParameterizedTestSuite1 {
private:
void TestBody() final {}
};
class ParameterizedTestSuite2 : public TestWithParam<int> {
public:
void SetUp() override {}
void TearDown() override {}
};
class ParameterizedSuite2Test1 : public ParameterizedTestSuite2 {
private:
void TestBody() final {}
};
void TestAddParameterizedSuites() {
auto runner = ::zxtest::Runner::GetInstance();
auto type1 = internal::TypeIdProvider<ParameterizedTestSuite1>::Get();
auto type2 = internal::TypeIdProvider<ParameterizedTestSuite2>::Get();
auto orig_size = ::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner);
ZX_ASSERT_MSG(!::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type1).has_value(),
"The test suite should not exist yet.");
runner->AddParameterizedTest<ParameterizedTestSuite1>(
std::make_unique<::zxtest::internal::AddTestDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType, ParameterizedSuite1Test1>>(),
fbl::String("suite_name"), fbl::String("test_name"),
{.filename = __FILE__, .line_number = __LINE__});
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type1).has_value(),
"There should be a matching test suite.");
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner) == orig_size + 1,
"The number of suites should have increased.");
runner->AddParameterizedTest<ParameterizedTestSuite2>(
std::make_unique<::zxtest::internal::AddTestDelegateImpl<
ParameterizedTestSuite2, ParameterizedTestSuite2::ParamType, ParameterizedSuite2Test1>>(),
fbl::String("suite_name"), fbl::String("test_name"),
{.filename = __FILE__, .line_number = __LINE__});
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type2).has_value(),
"There should be a matching test suite.");
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner) == orig_size + 2,
"The number of suites should have increased.");
::zxtest::RunnerTestPeer::DeleteParameterizedTestInfo(runner, type1);
::zxtest::RunnerTestPeer::DeleteParameterizedTestInfo(runner, type2);
}
void TestAddParameterizedTests() {
auto runner = ::zxtest::Runner::GetInstance();
auto type = internal::TypeIdProvider<ParameterizedTestSuite1>::Get();
auto orig_size = ::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner);
ZX_ASSERT_MSG(!::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type).has_value(),
"The test suite should not exist yet.");
runner->AddParameterizedTest<ParameterizedTestSuite1>(
std::make_unique<::zxtest::internal::AddTestDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType, ParameterizedSuite1Test1>>(),
fbl::String("suite_name"), fbl::String("test_name"),
{.filename = __FILE__, .line_number = __LINE__});
std::optional<internal::ParameterizedTestCaseInfo*> suite =
::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type);
ZX_ASSERT_MSG(suite.has_value(), "There should be a matching test suite.");
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner) == orig_size + 1,
"The number of suites should have increased.");
auto val = suite.value();
using ImplType =
typename internal::ParameterizedTestCaseInfoImpl<ParameterizedTestSuite1,
ParameterizedTestSuite1::ParamType>;
ImplType* suite_impl = reinterpret_cast<ImplType*>(val);
ZX_ASSERT_MSG(internal::ParameterizedTestCaseInfoImplTestPeer::GetEntriesSize(suite_impl) == 1,
"There should only be one test case entry.");
runner->AddParameterizedTest<ParameterizedTestSuite1>(
std::make_unique<::zxtest::internal::AddTestDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType, ParameterizedSuite1Test2>>(),
fbl::String("suite_name"), fbl::String("test_name"),
{.filename = __FILE__, .line_number = __LINE__});
ZX_ASSERT_MSG(::zxtest::RunnerTestPeer::GetParameterizedTestInfoSize(runner) == orig_size + 1,
"The number of suites should not have changed.");
ZX_ASSERT_MSG(internal::ParameterizedTestCaseInfoImplTestPeer::GetEntriesSize(suite_impl) == 2,
"There should be two test case entries.");
::zxtest::RunnerTestPeer::DeleteParameterizedTestInfo(runner, type);
}
void TestAddParameterizedInstaniations() {
auto runner = ::zxtest::Runner::GetInstance();
auto type = internal::TypeIdProvider<ParameterizedTestSuite1>::Get();
ZX_ASSERT_MSG(!::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type).has_value(),
"The test suite should not exist yet.");
runner->AddParameterizedTest<ParameterizedTestSuite1>(
std::make_unique<::zxtest::internal::AddTestDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType, ParameterizedSuite1Test1>>(),
fbl::String("suite_name"), fbl::String("test_name"),
{.filename = __FILE__, .line_number = __LINE__});
std::optional<internal::ParameterizedTestCaseInfo*> suite =
::zxtest::RunnerTestPeer::GetParameterizedTestInfo(runner, type);
ZX_ASSERT_MSG(suite.has_value(), "There should be a matching test suite.");
auto val = suite.value();
using ImplType =
typename internal::ParameterizedTestCaseInfoImpl<ParameterizedTestSuite1,
ParameterizedTestSuite1::ParamType>;
ImplType* suite_impl = reinterpret_cast<ImplType*>(val);
ZX_ASSERT_MSG(
internal::ParameterizedTestCaseInfoImplTestPeer::GetInstantiationsSize(suite_impl) == 0,
"There should be no instantiation entries yet.");
auto default_name_generator = [](const auto info) -> std::string {
return std::to_string(info.index);
};
auto provider1 = ::zxtest::Values(1, 2, 3);
runner->AddInstantiation<ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType>(
std::make_unique<zxtest::internal::AddInstantiationDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType>>(),
fbl::String("prefix_name"), {.filename = __FILE__, .line_number = __LINE__}, provider1,
default_name_generator);
ZX_ASSERT_MSG(
internal::ParameterizedTestCaseInfoImplTestPeer::GetInstantiationsSize(suite_impl) == 1,
"There should be one instantiation entry.");
auto provider2 = ::zxtest::Values(5, 4, 3);
runner->AddInstantiation<ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType>(
std::make_unique<zxtest::internal::AddInstantiationDelegateImpl<
ParameterizedTestSuite1, ParameterizedTestSuite1::ParamType>>(),
fbl::String("prefix_name"), {.filename = __FILE__, .line_number = __LINE__}, provider2,
default_name_generator);
ZX_ASSERT_MSG(
internal::ParameterizedTestCaseInfoImplTestPeer::GetInstantiationsSize(suite_impl) == 2,
"There should be two instantiation entries.");
::zxtest::RunnerTestPeer::DeleteParameterizedTestInfo(runner, type);
}
enum __enum_type {
VALUE_1 = 1,
VALUE_2 = 2,
};
void TestInexactTypeMatchup() {
// The error being tested is at compile-time.
::zxtest::internal::ValueProvider<ParameterizedTestSuite1::ParamType> p1(
::zxtest::Values(VALUE_1, VALUE_2));
}
} // namespace test
} // namespace zxtest