Skip to content

Commit 3e40971

Browse files
goodlyrottenapplezander-xyz
authored andcommitted
switch test_db tests to TraitsTest
1 parent 56ca0c1 commit 3e40971

File tree

3 files changed

+267
-77
lines changed

3 files changed

+267
-77
lines changed
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
// Copyright (C) 2025 Category Labs, Inc.
2+
//
3+
// This program is free software: you can redistribute it and/or modify
4+
// it under the terms of the GNU General Public License as published by
5+
// the Free Software Foundation, either version 3 of the License, or
6+
// (at your option) any later version.
7+
//
8+
// This program is distributed in the hope that it will be useful,
9+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
// GNU General Public License for more details.
12+
//
13+
// You should have received a copy of the GNU General Public License
14+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
16+
#pragma once
17+
18+
#include <category/execution/ethereum/db/trie_db.hpp>
19+
#include <category/execution/ethereum/db/util.hpp>
20+
#include <category/mpt/ondisk_db_config.hpp>
21+
#include <category/vm/evm/traits.hpp>
22+
#include <category/vm/vm.hpp>
23+
#include <monad/test/traits_test.hpp>
24+
25+
#include <gtest/gtest.h>
26+
27+
using namespace monad;
28+
29+
namespace
30+
{
31+
template <typename T, T rev>
32+
struct TrieDbFixtureTraits : public ::testing::Test
33+
{
34+
vm::VM vm;
35+
36+
static constexpr auto get_trait()
37+
{
38+
if constexpr (std::same_as<T, monad_revision>) {
39+
return monad::MonadTraits<rev>{};
40+
}
41+
else if constexpr (std::same_as<T, evmc_revision>) {
42+
return monad::EvmTraits<rev>{};
43+
}
44+
else {
45+
return std::monostate{};
46+
}
47+
}
48+
49+
using Trait = decltype(get_trait());
50+
51+
static consteval bool is_monad_trait() noexcept
52+
{
53+
return monad::is_monad_trait_v<Trait>;
54+
}
55+
56+
static consteval bool is_evm_trait() noexcept
57+
{
58+
return monad::is_evm_trait_v<Trait>;
59+
}
60+
61+
static constexpr std::string get_traits_name()
62+
{
63+
if constexpr (std::same_as<T, monad_revision>) {
64+
return "/" + std::string(monad_revision_to_string(
65+
monad::MonadTraits<rev>::monad_rev()));
66+
}
67+
else if constexpr (std::same_as<T, evmc_revision>) {
68+
return "/" + std::string(evmc_revision_to_string(
69+
monad::EvmTraits<rev>::evm_rev()));
70+
}
71+
else {
72+
return "";
73+
}
74+
}
75+
};
76+
77+
template <typename T, T rev>
78+
struct InMemoryTrieDbFixtureTraits : public TrieDbFixtureTraits<T, rev>
79+
{
80+
static constexpr bool on_disk = false;
81+
82+
InMemoryMachine machine;
83+
mpt::Db db{machine};
84+
TrieDb tdb{db};
85+
86+
static constexpr auto get_name()
87+
{
88+
return "InMemoryTrieDbFixture" +
89+
TrieDbFixtureTraits<T, rev>::get_traits_name();
90+
}
91+
};
92+
93+
template <monad_revision rev>
94+
using MonadInMemoryTrieDbFixtureTraits =
95+
InMemoryTrieDbFixtureTraits<monad_revision, rev>;
96+
97+
template <evmc_revision rev>
98+
using EvmInMemoryTrieDbFixtureTraits =
99+
InMemoryTrieDbFixtureTraits<evmc_revision, rev>;
100+
101+
template <typename T, T rev>
102+
struct OnDiskTrieDbFixtureTraits : public TrieDbFixtureTraits<T, rev>
103+
{
104+
static constexpr bool on_disk = true;
105+
106+
OnDiskMachine machine;
107+
mpt::Db db{machine, mpt::OnDiskDbConfig{}};
108+
TrieDb tdb{db};
109+
110+
static constexpr auto get_name()
111+
{
112+
return "OnDiskTrieDbFixture" +
113+
TrieDbFixtureTraits<T, rev>::get_traits_name();
114+
}
115+
};
116+
117+
template <monad_revision rev>
118+
using MonadOnDiskTrieDbFixtureTraits =
119+
OnDiskTrieDbFixtureTraits<monad_revision, rev>;
120+
121+
template <evmc_revision rev>
122+
using EvmOnDiskTrieDbFixtureTraits =
123+
OnDiskTrieDbFixtureTraits<evmc_revision, rev>;
124+
125+
// Helper to concatenate four ::testing::Types
126+
template <typename... Ts>
127+
struct concat_types;
128+
129+
template <
130+
typename... Ts1, typename... Ts2, typename... Ts3, typename... Ts4>
131+
struct concat_types<
132+
::testing::Types<Ts1...>, ::testing::Types<Ts2...>,
133+
::testing::Types<Ts3...>, ::testing::Types<Ts4...>>
134+
{
135+
using type = ::testing::Types<Ts1..., Ts2..., Ts3..., Ts4...>;
136+
};
137+
138+
template <typename... Ts>
139+
using concat_types_t = typename concat_types<Ts...>::type;
140+
141+
// Union of MonadRevisionTypes and EvmRevisionTypes for both InMemoryTrieDb
142+
// and OnDiskTrieDb
143+
using MonadEvmRevisionDBTypes = concat_types_t<
144+
decltype(make_monad_revision_types<MonadInMemoryTrieDbFixtureTraits>()),
145+
decltype(make_evm_revision_types<EvmInMemoryTrieDbFixtureTraits>()),
146+
decltype(make_monad_revision_types<MonadOnDiskTrieDbFixtureTraits>()),
147+
decltype(make_evm_revision_types<EvmOnDiskTrieDbFixtureTraits>())>;
148+
149+
struct RevisionTestNameGenerator
150+
{
151+
template <typename T>
152+
static std::string GetName(int)
153+
{
154+
return T::get_name();
155+
}
156+
};
157+
}
158+
159+
using InMemoryTrieDbFixture = InMemoryTrieDbFixtureTraits<std::monostate, {}>;
160+
using OnDiskTrieDbFixture = OnDiskTrieDbFixtureTraits<std::monostate, {}>;
161+
162+
template <typename TDB>
163+
struct DBTest : public TDB
164+
{
165+
};
166+
167+
using DBTypes = ::testing::Types<InMemoryTrieDbFixture, OnDiskTrieDbFixture>;
168+
TYPED_TEST_SUITE(DBTest, DBTypes, RevisionTestNameGenerator);
169+
170+
template <typename TDB>
171+
struct DBTraitsTest : public TDB
172+
{
173+
};
174+
175+
TYPED_TEST_SUITE(
176+
DBTraitsTest, MonadEvmRevisionDBTypes, RevisionTestNameGenerator);

0 commit comments

Comments
 (0)