//===----------------------------------------------------------------------===//
//
//                         BusTub
//
// disk_scheduler_test.cpp
//
// Identification: test/storage/disk_scheduler_test.cpp
//
// Copyright (c) 2015-2025, Carnegie Mellon University Database Group
//
//===----------------------------------------------------------------------===//

#include <cstring>
#include <future>  // NOLINT
#include <memory>

#include "common/exception.h"
#include "gtest/gtest.h"
#include "storage/disk/disk_manager_memory.h"
#include "storage/disk/disk_scheduler.h"

namespace bustub {

using bustub::DiskManagerUnlimitedMemory;

// NOLINTNEXTLINE
TEST(DiskSchedulerTest, DISABLED_ScheduleWriteReadPageTest) {
  char buf[BUSTUB_PAGE_SIZE] = {0};
  char data[BUSTUB_PAGE_SIZE] = {0};

  auto dm = std::make_unique<DiskManagerUnlimitedMemory>();
  auto disk_scheduler = std::make_unique<DiskScheduler>(dm.get());

  std::strncpy(data, "A test string.", sizeof(data));

  auto promise1 = disk_scheduler->CreatePromise();
  auto future1 = promise1.get_future();
  auto promise2 = disk_scheduler->CreatePromise();
  auto future2 = promise2.get_future();

  DiskRequest r1{/*is_write=*/true, data, /*page_id=*/0, std::move(promise1)};
  std::vector<DiskRequest> requests1;
  requests1.push_back(std::move(r1));
  disk_scheduler->Schedule(requests1);

  DiskRequest r2{/*is_write=*/false, buf, /*page_id=*/0, std::move(promise2)};
  std::vector<DiskRequest> requests2;
  requests2.push_back(std::move(r2));
  disk_scheduler->Schedule(requests2);

  ASSERT_TRUE(future1.get());
  ASSERT_TRUE(future2.get());
  ASSERT_EQ(std::memcmp(buf, data, sizeof(buf)), 0);

  disk_scheduler = nullptr;  // Call the DiskScheduler destructor to finish all scheduled jobs.
  dm->ShutDown();
}

}  // namespace bustub
