// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/shared/address_range.h"

#include <gtest/gtest.h>

namespace debug_ipc {

TEST(AddressRange, InRange) {
  constexpr AddressRange range(1, 5);
  EXPECT_FALSE(range.InRange(0));
  EXPECT_TRUE(range.InRange(1));
  EXPECT_TRUE(range.InRange(4));
  EXPECT_FALSE(range.InRange(5));
}

TEST(AddressRange, Contains) {
  constexpr AddressRange range(100, 105);

  // A range can contain itself.
  EXPECT_TRUE(range.Contains(range));

  // Completely inside.
  EXPECT_TRUE(range.Contains(AddressRange(102, 104)));

  // Completely outside.
  EXPECT_FALSE(range.Contains(AddressRange(1, 99)));
  EXPECT_FALSE(range.Contains(AddressRange(200, 205)));

  // Partially overlapping.
  EXPECT_FALSE(range.Contains(AddressRange(0, 102)));
  EXPECT_FALSE(range.Contains(AddressRange(102, 200)));
}

TEST(AddressRange, Overlaps) {
  constexpr AddressRange range(100, 105);

  // A range can contain itself.
  EXPECT_TRUE(range.Overlaps(range));

  // Completely inside.
  EXPECT_TRUE(range.Overlaps(AddressRange(102, 104)));

  // Completely outside.
  EXPECT_FALSE(range.Overlaps(AddressRange(1, 99)));
  EXPECT_FALSE(range.Overlaps(AddressRange(200, 205)));

  // Partially overlapping.
  EXPECT_TRUE(range.Overlaps(AddressRange(0, 102)));
  EXPECT_TRUE(range.Overlaps(AddressRange(102, 200)));
}

TEST(AddressRange, Union) {
  constexpr AddressRange range(100, 105);
  constexpr AddressRange empty;

  // Union with itself.
  EXPECT_EQ(range, range.Union(range));

  // Union with empty. Shouldn't matter where the empty range is. Check both sides being empty.
  EXPECT_EQ(range, range.Union(empty));
  EXPECT_EQ(range, empty.Union(range));
  EXPECT_EQ(range, range.Union(AddressRange(1000, 1000)));
  EXPECT_EQ(range, AddressRange(1000, 1000).Union(range));

  // Completely inside.
  EXPECT_EQ(range, range.Union(AddressRange(102, 104)));

  // Completely outside.
  EXPECT_EQ(AddressRange(1, 105), range.Union(AddressRange(1, 99)));
  EXPECT_EQ(AddressRange(100, 205), range.Union(AddressRange(200, 205)));

  // Partially overlapping.
  EXPECT_EQ(AddressRange(0, 105), range.Union(AddressRange(0, 102)));
  EXPECT_EQ(AddressRange(100, 200), range.Union(AddressRange(102, 200)));
}

}  // namespace debug_ipc
