// Copyright 2018 The Chromium 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 "crazy_linker_pointer_set.h"

#include <gtest/gtest.h>

namespace crazy {

TEST(PointerSet, DefaultIsEmpty) {
  PointerSet set;
  EXPECT_FALSE(set.Has(nullptr));

  const Vector<const void*>& values = set.GetValuesForTesting();
  EXPECT_TRUE(values.IsEmpty());
}

TEST(PointerSet, Has) {
  PointerSet set;

  // nullptr is a perfectly valid value in the set.
  EXPECT_FALSE(set.Has(nullptr));
  EXPECT_FALSE(set.Add(nullptr));
  EXPECT_TRUE(set.Has(nullptr));

  const Vector<const void*>& values = set.GetValuesForTesting();
  EXPECT_FALSE(values.IsEmpty());
  EXPECT_EQ(1U, values.GetCount());
  EXPECT_EQ(nullptr, values[0]);
}

TEST(PointerSet, Add) {
  PointerSet set;

  auto* kOne = reinterpret_cast<void*>(1);
  auto* kTwo = reinterpret_cast<void*>(2);
  auto* kTen = reinterpret_cast<void*>(10);

  EXPECT_FALSE(set.Add(kOne));
  EXPECT_TRUE(set.Add(kOne));
  EXPECT_FALSE(set.Add(kTen));

  EXPECT_TRUE(set.Has(kOne));
  EXPECT_FALSE(set.Has(kTwo));
  EXPECT_TRUE(set.Has(kTen));

  const Vector<const void*>& values = set.GetValuesForTesting();
  EXPECT_FALSE(values.IsEmpty());
  EXPECT_EQ(2U, values.GetCount());
  EXPECT_EQ(kOne, values[0]);
  EXPECT_EQ(kTen, values[1]);
}

TEST(PointerSet, Remove) {
  PointerSet set;

  auto* kOne = reinterpret_cast<void*>(1);
  auto* kTwo = reinterpret_cast<void*>(2);
  auto* kTen = reinterpret_cast<void*>(10);

  EXPECT_FALSE(set.Add(kOne));
  EXPECT_FALSE(set.Add(kTwo));
  EXPECT_FALSE(set.Add(kTen));

  EXPECT_TRUE(set.Has(kOne));
  EXPECT_TRUE(set.Has(kTwo));
  EXPECT_TRUE(set.Has(kTen));

  const Vector<const void*>& values = set.GetValuesForTesting();
  EXPECT_FALSE(values.IsEmpty());
  EXPECT_EQ(3U, values.GetCount());

  EXPECT_TRUE(set.Remove(kTwo));

  EXPECT_TRUE(set.Has(kOne));
  EXPECT_FALSE(set.Has(kTwo));
  EXPECT_TRUE(set.Has(kTen));

  EXPECT_FALSE(values.IsEmpty());
  EXPECT_EQ(2U, values.GetCount());

  EXPECT_FALSE(set.Remove(kTwo));

  EXPECT_FALSE(values.IsEmpty());
  EXPECT_EQ(2U, values.GetCount());

  EXPECT_EQ(2U, values.GetCount());
  EXPECT_EQ(kOne, values[0]);
  EXPECT_EQ(kTen, values[1]);
}

}  // namespace crazy
