//===------ HLSLRootSignatureRangeTest.cpp - RootSignature Range tests ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h"
#include "gtest/gtest.h"

using namespace llvm::hlsl::rootsig;

namespace {

TEST(HLSLRootSignatureTest, NoOverlappingInsertTests) {
  // Ensures that there is never a reported overlap
  ResourceRange::MapT::Allocator Allocator;
  ResourceRange Range(Allocator);

  RangeInfo A;
  A.LowerBound = 0;
  A.UpperBound = 3;
  EXPECT_EQ(Range.insert(A), std::nullopt);

  RangeInfo B;
  B.LowerBound = 4;
  B.UpperBound = 7;
  EXPECT_EQ(Range.insert(B), std::nullopt);

  RangeInfo C;
  C.LowerBound = 10;
  C.UpperBound = RangeInfo::Unbounded;
  EXPECT_EQ(Range.insert(C), std::nullopt);

  // A = [0;3]
  EXPECT_EQ(Range.lookup(0), &A);
  EXPECT_EQ(Range.lookup(2), &A);
  EXPECT_EQ(Range.lookup(3), &A);

  // B = [4;7]
  EXPECT_EQ(Range.lookup(4), &B);
  EXPECT_EQ(Range.lookup(5), &B);
  EXPECT_EQ(Range.lookup(7), &B);

  EXPECT_EQ(Range.lookup(8), nullptr);
  EXPECT_EQ(Range.lookup(9), nullptr);

  // C = [10;unbounded]
  EXPECT_EQ(Range.lookup(10), &C);
  EXPECT_EQ(Range.lookup(42), &C);
  EXPECT_EQ(Range.lookup(98237423), &C);
  EXPECT_EQ(Range.lookup(RangeInfo::Unbounded), &C);
}

TEST(HLSLRootSignatureTest, SingleOverlappingInsertTests) {
  // Ensures that we correctly report an overlap when we insert a range that
  // overlaps with one other range but does not cover (replace) it
  ResourceRange::MapT::Allocator Allocator;
  ResourceRange Range(Allocator);

  RangeInfo A;
  A.LowerBound = 1;
  A.UpperBound = 5;
  EXPECT_EQ(Range.insert(A), std::nullopt);

  RangeInfo B;
  B.LowerBound = 0;
  B.UpperBound = 2;
  EXPECT_EQ(Range.insert(B).value(), &A);

  RangeInfo C;
  C.LowerBound = 4;
  C.UpperBound = RangeInfo::Unbounded;
  EXPECT_EQ(Range.insert(C).value(), &A);

  // A = [1;5]
  EXPECT_EQ(Range.lookup(1), &A);
  EXPECT_EQ(Range.lookup(2), &A);
  EXPECT_EQ(Range.lookup(3), &A);
  EXPECT_EQ(Range.lookup(4), &A);
  EXPECT_EQ(Range.lookup(5), &A);

  // B = [0;0]
  EXPECT_EQ(Range.lookup(0), &B);

  // C = [6; unbounded]
  EXPECT_EQ(Range.lookup(6), &C);
  EXPECT_EQ(Range.lookup(RangeInfo::Unbounded), &C);
}

TEST(HLSLRootSignatureTest, MultipleOverlappingInsertTests) {
  // Ensures that we correctly report an overlap when inserted range
  // overlaps more than one range and it does not cover (replace) either
  // range. In this case it will just fill in the interval between the two
  ResourceRange::MapT::Allocator Allocator;
  ResourceRange Range(Allocator);

  RangeInfo A;
  A.LowerBound = 0;
  A.UpperBound = 2;
  EXPECT_EQ(Range.insert(A), std::nullopt);

  RangeInfo B;
  B.LowerBound = 4;
  B.UpperBound = 6;
  EXPECT_EQ(Range.insert(B), std::nullopt);

  RangeInfo C;
  C.LowerBound = 1;
  C.UpperBound = 5;
  EXPECT_EQ(Range.insert(C).value(), &A);

  // A = [0;2]
  EXPECT_EQ(Range.lookup(0), &A);
  EXPECT_EQ(Range.lookup(1), &A);
  EXPECT_EQ(Range.lookup(2), &A);

  // B = [4;6]
  EXPECT_EQ(Range.lookup(4), &B);
  EXPECT_EQ(Range.lookup(5), &B);
  EXPECT_EQ(Range.lookup(6), &B);

  // C = [3;3]
  EXPECT_EQ(Range.lookup(3), &C);
}

TEST(HLSLRootSignatureTest, CoverInsertTests) {
  // Ensures that we correctly report an overlap when inserted range
  // covers one or more ranges
  ResourceRange::MapT::Allocator Allocator;
  ResourceRange Range(Allocator);

  RangeInfo A;
  A.LowerBound = 0;
  A.UpperBound = 2;
  EXPECT_EQ(Range.insert(A), std::nullopt);

  RangeInfo B;
  B.LowerBound = 4;
  B.UpperBound = 5;
  EXPECT_EQ(Range.insert(B), std::nullopt);

  // Covers B
  RangeInfo C;
  C.LowerBound = 4;
  C.UpperBound = 6;
  EXPECT_EQ(Range.insert(C).value(), &B);

  // A = [0;2]
  // C = [4;6] <- covers reference to B
  EXPECT_EQ(Range.lookup(0), &A);
  EXPECT_EQ(Range.lookup(1), &A);
  EXPECT_EQ(Range.lookup(2), &A);
  EXPECT_EQ(Range.lookup(3), nullptr);
  EXPECT_EQ(Range.lookup(4), &C);
  EXPECT_EQ(Range.lookup(5), &C);
  EXPECT_EQ(Range.lookup(6), &C);

  // Covers all other ranges
  RangeInfo D;
  D.LowerBound = 0;
  D.UpperBound = 7;
  EXPECT_EQ(Range.insert(D).value(), &A);

  // D = [0;7] <- Covers reference to A and C
  EXPECT_EQ(Range.lookup(0), &D);
  EXPECT_EQ(Range.lookup(1), &D);
  EXPECT_EQ(Range.lookup(2), &D);
  EXPECT_EQ(Range.lookup(3), &D);
  EXPECT_EQ(Range.lookup(4), &D);
  EXPECT_EQ(Range.lookup(5), &D);
  EXPECT_EQ(Range.lookup(6), &D);
  EXPECT_EQ(Range.lookup(7), &D);
}

} // namespace
