1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
17using tracegen::TestTraceContainer;
22TEST(TxDiscardConstrainingTest, EmptyRow)
27TEST(TxDiscardConstrainingTest, CanOnlyDiscardInRevertiblePhases)
30 TestTraceContainer
trace({
31 { { C::precomputed_first_row, 1 } },
33 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
35 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
37 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
42 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_CAN_ONLY_DISCARD_IN_REVERTIBLE_PHASES);
46 trace.
set(C::tx_is_revertible, 1, 0);
48 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_CAN_ONLY_DISCARD_IN_REVERTIBLE_PHASES),
49 "CAN_ONLY_DISCARD_IN_REVERTIBLE_PHASES");
52TEST(TxDiscardConstrainingTest, FailureMustDiscard)
55 TestTraceContainer
trace({
56 { { C::precomputed_first_row, 1 } },
58 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
60 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
62 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
67 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_FAILURE_MUST_DISCARD);
73 "FAILURE_MUST_DISCARD");
76TEST(TxDiscardConstrainingTest, LastRowOfSetupCalculation)
79 TestTraceContainer
trace({
80 { { C::precomputed_first_row, 1 } },
82 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
84 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
86 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
88 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
90 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
95 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_DISCARD_PROPAGATION);
98TEST(TxDiscardConstrainingTest, DiscardPropagationNormal)
101 TestTraceContainer
trace({
102 { { C::precomputed_first_row, 1 } },
104 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
106 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
108 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
110 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
111 { { C::tx_sel, 0 } },
114 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_DISCARD_PROPAGATION);
119 "DISCARD_PROPAGATION");
124TEST(TxDiscardConstrainingTest, DiscardPropagationLiftedAtSetupEnd)
127 TestTraceContainer
trace({
128 { { C::precomputed_first_row, 1 } },
130 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
132 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
134 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
135 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
136 { { C::tx_sel, 0 } },
140 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_DISCARD_PROPAGATION);
143TEST(TxDiscardConstrainingTest, DiscardPropagationLiftedOnFailure)
146 TestTraceContainer
trace({
147 { { C::precomputed_first_row, 1 } },
149 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
151 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
153 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
154 { { C::tx_sel, 0 } },
157 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_DISCARD_PROPAGATION);
160TEST(TxDiscardConstrainingTest, FailureOnlyInRevertibles)
162 TestTraceContainer
trace({
163 { { C::precomputed_first_row, 1 } },
168 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
169 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
173 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
174 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
178 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
180 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
181 { { C::tx_sel, 0 } },
185 check_relation<tx_discard_relation>(
trace);
188TEST(TxDiscardConstrainingTest, FailureOnlyInAppLogic)
190 TestTraceContainer
trace({
191 { { C::precomputed_first_row, 1 } },
196 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
197 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
201 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
202 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
204 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
207 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
208 { { C::tx_sel, 0 } },
212 check_relation<tx_discard_relation>(
trace);
215TEST(TxDiscardConstrainingTest, FailureOnlyInTeardown)
217 TestTraceContainer
trace({
218 { { C::precomputed_first_row, 1 } },
223 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
224 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
228 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
229 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
230 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
232 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
233 { { C::tx_sel, 0 } },
237 check_relation<tx_discard_relation>(
trace);
242 "DISCARD_PROPAGATION");
247TEST(TxDiscardConstrainingTest, FailureInRevertiblesAndTeardown)
249 TestTraceContainer
trace({
250 { { C::precomputed_first_row, 1 } },
255 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
256 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
260 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
261 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
262 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
265 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
266 { { C::tx_sel, 0 } },
270 check_relation<tx_discard_relation>(
trace);
273TEST(TxDiscardConstrainingTest, DiscardButFailureNeverEncountered)
275 TestTraceContainer
trace({
276 { { C::precomputed_first_row, 1 } },
281 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
282 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
285 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
286 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
287 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 0 } },
290 { { C::tx_sel, 1 }, { C::tx_discard, 1 }, { C::tx_is_revertible, 1 }, { C::tx_reverted, 1 } },
294 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
295 { { C::tx_sel, 1 }, { C::tx_discard, 0 }, { C::tx_is_revertible, 0 }, { C::tx_reverted, 0 } },
296 { { C::tx_sel, 0 } },
300 check_relation<tx_discard_relation>(
trace);
305 "DISCARD_PROPAGATION");
312 check_relation<tx_discard_relation>(
trace, tx_discard_relation::SR_CAN_ONLY_DISCARD_IN_REVERTIBLE_PHASES),
313 "CAN_ONLY_DISCARD_IN_REVERTIBLE_PHASES");
void set(Column col, uint32_t row, const FF &value)
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()