//========- unittests/Support/TaskQueue.cpp - TaskQueue.h tests ------========//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/Config/llvm-config.h"

#if LLVM_ENABLE_THREADS

#include "llvm/Support/TaskQueue.h"

#include "gtest/gtest.h"

using namespace llvm;

class TaskQueueTest : public testing::Test {
protected:
  TaskQueueTest() {}
};

TEST_F(TaskQueueTest, OrderedFutures) {
  ThreadPool TP(1);
  TaskQueue TQ(TP);
  std::atomic<int> X{ 0 };
  std::atomic<int> Y{ 0 };
  std::atomic<int> Z{ 0 };

  std::mutex M1, M2, M3;
  std::unique_lock<std::mutex> L1(M1);
  std::unique_lock<std::mutex> L2(M2);
  std::unique_lock<std::mutex> L3(M3);

  std::future<void> F1 = TQ.async([&] {
    std::unique_lock<std::mutex> Lock(M1);
    ++X;
  });
  std::future<void> F2 = TQ.async([&] {
    std::unique_lock<std::mutex> Lock(M2);
    ++Y;
  });
  std::future<void> F3 = TQ.async([&] {
    std::unique_lock<std::mutex> Lock(M3);
    ++Z;
  });

  L1.unlock();
  F1.wait();
  ASSERT_EQ(1, X);
  ASSERT_EQ(0, Y);
  ASSERT_EQ(0, Z);

  L2.unlock();
  F2.wait();
  ASSERT_EQ(1, X);
  ASSERT_EQ(1, Y);
  ASSERT_EQ(0, Z);

  L3.unlock();
  F3.wait();
  ASSERT_EQ(1, X);
  ASSERT_EQ(1, Y);
  ASSERT_EQ(1, Z);
}

TEST_F(TaskQueueTest, UnOrderedFutures) {
  ThreadPool TP(1);
  TaskQueue TQ(TP);
  std::atomic<int> X{ 0 };
  std::atomic<int> Y{ 0 };
  std::atomic<int> Z{ 0 };
  std::mutex M;

  std::unique_lock<std::mutex> Lock(M);

  std::future<void> F1 = TQ.async([&] { ++X; });
  std::future<void> F2 = TQ.async([&] { ++Y; });
  std::future<void> F3 = TQ.async([&M, &Z] {
    std::unique_lock<std::mutex> Lock(M);
    ++Z;
  });

  F2.wait();
  ASSERT_EQ(1, X);
  ASSERT_EQ(1, Y);
  ASSERT_EQ(0, Z);

  Lock.unlock();

  F3.wait();
  ASSERT_EQ(1, X);
  ASSERT_EQ(1, Y);
  ASSERT_EQ(1, Z);
}

TEST_F(TaskQueueTest, FutureWithReturnValue) {
  ThreadPool TP(1);
  TaskQueue TQ(TP);
  std::future<std::string> F1 = TQ.async([&] { return std::string("Hello"); });
  std::future<int> F2 = TQ.async([&] { return 42; });

  ASSERT_EQ(42, F2.get());
  ASSERT_EQ("Hello", F1.get());
}
#endif
