// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/castable.h"

#include <memory>
#include <string>

#include "gtest/gtest.h"

struct Animal : public tint::Castable<Animal> {
  explicit Animal(std::string n) : name(n) {}
  const std::string name;
};

struct Amphibian : public tint::Castable<Amphibian, Animal> {
  explicit Amphibian(std::string n) : Base(n) {}
};

struct Mammal : public tint::Castable<Mammal, Animal> {
  explicit Mammal(std::string n) : Base(n) {}
};

struct Reptile : public tint::Castable<Reptile, Animal> {
  explicit Reptile(std::string n) : Base(n) {}
};

struct Frog : public tint::Castable<Frog, Amphibian> {
  Frog() : Base("Frog") {}
};

struct Bear : public tint::Castable<Bear, Mammal> {
  Bear() : Base("Bear") {}
};

struct Gecko : public tint::Castable<Gecko, Reptile> {
  Gecko() : Base("Gecko") {}
};

TINT_INSTANTIATE_CLASS_ID(Animal);
TINT_INSTANTIATE_CLASS_ID(Amphibian);
TINT_INSTANTIATE_CLASS_ID(Mammal);
TINT_INSTANTIATE_CLASS_ID(Reptile);
TINT_INSTANTIATE_CLASS_ID(Frog);
TINT_INSTANTIATE_CLASS_ID(Bear);
TINT_INSTANTIATE_CLASS_ID(Gecko);

namespace tint {

TEST(CastableBase, Is) {
  std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
  std::unique_ptr<CastableBase> bear = std::make_unique<Bear>();
  std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>();

  ASSERT_TRUE(frog->Is<Animal>());
  ASSERT_TRUE(bear->Is<Animal>());
  ASSERT_TRUE(gecko->Is<Animal>());

  ASSERT_TRUE(frog->Is<Amphibian>());
  ASSERT_FALSE(bear->Is<Amphibian>());
  ASSERT_FALSE(gecko->Is<Amphibian>());

  ASSERT_FALSE(frog->Is<Mammal>());
  ASSERT_TRUE(bear->Is<Mammal>());
  ASSERT_FALSE(gecko->Is<Mammal>());

  ASSERT_FALSE(frog->Is<Reptile>());
  ASSERT_FALSE(bear->Is<Reptile>());
  ASSERT_TRUE(gecko->Is<Reptile>());
}

TEST(CastableBase, As) {
  std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
  std::unique_ptr<CastableBase> bear = std::make_unique<Bear>();
  std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>();

  ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get()));
  ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get()));
  ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get()));

  ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get()));
  ASSERT_EQ(bear->As<Amphibian>(), nullptr);
  ASSERT_EQ(gecko->As<Amphibian>(), nullptr);

  ASSERT_EQ(frog->As<Mammal>(), nullptr);
  ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get()));
  ASSERT_EQ(gecko->As<Mammal>(), nullptr);

  ASSERT_EQ(frog->As<Reptile>(), nullptr);
  ASSERT_EQ(bear->As<Reptile>(), nullptr);
  ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get()));
}

TEST(Castable, Is) {
  std::unique_ptr<Animal> frog = std::make_unique<Frog>();
  std::unique_ptr<Animal> bear = std::make_unique<Bear>();
  std::unique_ptr<Animal> gecko = std::make_unique<Gecko>();

  ASSERT_TRUE(frog->Is<Animal>());
  ASSERT_TRUE(bear->Is<Animal>());
  ASSERT_TRUE(gecko->Is<Animal>());

  ASSERT_TRUE(frog->Is<Amphibian>());
  ASSERT_FALSE(bear->Is<Amphibian>());
  ASSERT_FALSE(gecko->Is<Amphibian>());

  ASSERT_FALSE(frog->Is<Mammal>());
  ASSERT_TRUE(bear->Is<Mammal>());
  ASSERT_FALSE(gecko->Is<Mammal>());

  ASSERT_FALSE(frog->Is<Reptile>());
  ASSERT_FALSE(bear->Is<Reptile>());
  ASSERT_TRUE(gecko->Is<Reptile>());
}

TEST(Castable, As) {
  std::unique_ptr<Animal> frog = std::make_unique<Frog>();
  std::unique_ptr<Animal> bear = std::make_unique<Bear>();
  std::unique_ptr<Animal> gecko = std::make_unique<Gecko>();

  ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get()));
  ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get()));
  ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get()));

  ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get()));
  ASSERT_EQ(bear->As<Amphibian>(), nullptr);
  ASSERT_EQ(gecko->As<Amphibian>(), nullptr);

  ASSERT_EQ(frog->As<Mammal>(), nullptr);
  ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get()));
  ASSERT_EQ(gecko->As<Mammal>(), nullptr);

  ASSERT_EQ(frog->As<Reptile>(), nullptr);
  ASSERT_EQ(bear->As<Reptile>(), nullptr);
  ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get()));
}

}  // namespace tint
