#include "storage/v2/commit_log.hpp"

#include "gtest/gtest.h"

TEST(CommitLog, Simple) {
  storage::CommitLog log;
  EXPECT_EQ(log.OldestActive(), 0);

  log.MarkFinished(1);
  EXPECT_EQ(log.OldestActive(), 0);

  log.MarkFinished(0);
  EXPECT_EQ(log.OldestActive(), 2);
}

TEST(CommitLog, Fields) {
  storage::CommitLog log;

  for (uint64_t i = 0; i < 64; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), i + 1);
  }

  for (uint64_t i = 128; i < 192; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), 64);
  }

  for (uint64_t i = 64; i < 128; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), i < 127 ? i + 1 : 192);
  }
}

TEST(CommitLog, Blocks) {
  storage::CommitLog log;

  for (uint64_t i = 0; i < 8192 * 64; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), i + 1);
  }

  for (uint64_t i = 8192 * 64 * 2; i < 8192 * 64 * 3; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), 8192 * 64);
  }

  for (uint64_t i = 8192 * 64; i < 8192 * 64; ++i) {
    log.MarkFinished(i);
    EXPECT_EQ(log.OldestActive(), i < 8192 * 64 - 1 ? i + 1 : 8192 * 64 * 3);
  }
}