Files
2023-06-16 02:26:36 -04:00

81 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma autortfm
#include "Catch2Includes.h"
#include <AutoRTFM/AutoRTFM.h>
#include <map>
#include <vector>
TEST_CASE("Abort")
{
int x = 42;
std::vector<int> v;
std::map<int, std::vector<int>> m;
v.push_back(100);
m[1].push_back(2);
m[1].push_back(3);
m[4].push_back(5);
m[6].push_back(7);
m[6].push_back(8);
m[6].push_back(9);
auto transaction = AutoRTFM::Transact([&]()
{
x = 5;
for (size_t n = 10; n--;)
v.push_back(2 * n);
m.clear();
m[10].push_back(11);
m[12].push_back(13);
m[12].push_back(14);
AutoRTFM::AbortTransaction();
});
REQUIRE(
AutoRTFM::ETransactionResult::AbortedByRequest ==
transaction);
REQUIRE(x == 42);
REQUIRE(v.size() == 1);
REQUIRE(v[0] == 100);
REQUIRE(m.size() == 3);
REQUIRE(m[1].size() == 2);
REQUIRE(m[1][0] == 2);
REQUIRE(m[1][1] == 3);
REQUIRE(m[4].size() == 1);
REQUIRE(m[4][0] == 5);
REQUIRE(m[6].size() == 3);
REQUIRE(m[6][0] == 7);
REQUIRE(m[6][1] == 8);
REQUIRE(m[6][2] == 9);
}
TEST_CASE("Abort.NestedAbortOrder")
{
AutoRTFM::ETransactionResult InnerResult;
unsigned Orderer = 0;
AutoRTFM::Commit([&]
{
InnerResult = AutoRTFM::Transact([&]
{
AutoRTFM::OpenAbort([&]
{
REQUIRE(1 == Orderer);
Orderer += 1;
});
AutoRTFM::OpenAbort([&]
{
REQUIRE(0 == Orderer);
Orderer += 1;
});
AutoRTFM::AbortTransaction();
});
});
REQUIRE(AutoRTFM::ETransactionResult::AbortedByRequest == InnerResult);
REQUIRE(2 == Orderer);
}