#include "mvcc_find_update_common.hpp"

TEST_F(Mvcc, FindUncommittedHigherTXUpdate) {
  T2_FIND;
  T3_BEGIN;
  T3_UPDATE;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindCommittedHigherTXUpdate) {
  T2_FIND;
  T3_BEGIN;
  T3_UPDATE;
  T3_COMMIT;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindAbortedHigherTXUpdate) {
  T2_FIND;
  T3_BEGIN;
  T3_UPDATE;
  T3_ABORT;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindCommittedLowerTXUpdate) {
  T2_UPDATE;
  T3_BEGIN;
  T3_FIND;
  T2_COMMIT;
  EXPECT_EQ(v3, version_list.find(*t3));
}

TEST_F(Mvcc, FindAbortedLowerTXUpdate) {
  T2_UPDATE;
  T3_BEGIN;
  T3_FIND;
  T2_ABORT;
  EXPECT_EQ(v3, version_list.find(*t3));
}

TEST_F(Mvcc, FindUncommittedHigherTXRemove) {
  T2_FIND;
  T3_BEGIN;
  T3_REMOVE;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindCommittedHigherTXRemove) {
  T2_FIND;
  T3_BEGIN;
  T3_REMOVE;
  T3_COMMIT;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindAbortedHigherTXRemove) {
  T2_FIND;
  T3_BEGIN;
  T3_REMOVE;
  T3_ABORT;
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, FindCommittedLowerTXRemove) {
  T2_REMOVE;
  T3_BEGIN;
  T3_FIND;
  EXPECT_EQ(v3, version_list.find(*t3));
}

TEST_F(Mvcc, FindAbortedLowerTXRemove) {
  T2_REMOVE;
  T3_BEGIN;
  T3_FIND;
  T2_ABORT;
  EXPECT_EQ(v3, version_list.find(*t3));
}

TEST_F(Mvcc, ReadUncommitedUpdateFromSameTXSameCommand) {
  T2_UPDATE;
  EXPECT_NE(v2, version_list.find(*t2));
}

TEST_F(Mvcc, ReadUncommitedUpdateFromSameTXNotSameCommand) {
  T2_UPDATE;
  engine.Advance(t2->id_);
  EXPECT_EQ(v2, version_list.find(*t2));
}

TEST_F(Mvcc, ReadUncommitedRemoveFromSameTXSameCommand) {
  T2_UPDATE;
  T2_COMMIT;
  T3_BEGIN;
  T3_REMOVE;
  EXPECT_EQ(v2, version_list.find(*t3));
}

TEST_F(Mvcc, ReadUncommitedRemoveFromSameTXNotSameCommand) {
  T2_UPDATE;
  T2_COMMIT;
  T3_BEGIN;
  T3_REMOVE;
  engine.Advance(t3->id_);
  EXPECT_NE(v2, version_list.find(*t3));
}
