// Copyright 2021 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/tint/utils/unique_vector.h"
#include "src/tint/utils/reverse.h"

#include "gtest/gtest.h"

namespace tint::utils {
namespace {

TEST(UniqueVectorTest, Empty) {
    UniqueVector<int> unique_vec;
    EXPECT_EQ(unique_vec.size(), 0u);
    EXPECT_EQ(unique_vec.empty(), true);
    EXPECT_EQ(unique_vec.begin(), unique_vec.end());
}

TEST(UniqueVectorTest, MoveConstructor) {
    UniqueVector<int> unique_vec(std::vector<int>{0, 3, 2, 1, 2});
    EXPECT_EQ(unique_vec.size(), 4u);
    EXPECT_EQ(unique_vec.empty(), false);
    EXPECT_EQ(unique_vec[0], 0);
    EXPECT_EQ(unique_vec[1], 3);
    EXPECT_EQ(unique_vec[2], 2);
    EXPECT_EQ(unique_vec[3], 1);
}

TEST(UniqueVectorTest, AddUnique) {
    UniqueVector<int> unique_vec;
    unique_vec.add(0);
    unique_vec.add(1);
    unique_vec.add(2);
    EXPECT_EQ(unique_vec.size(), 3u);
    EXPECT_EQ(unique_vec.empty(), false);
    int i = 0;
    for (auto n : unique_vec) {
        EXPECT_EQ(n, i);
        i++;
    }
    for (auto n : Reverse(unique_vec)) {
        i--;
        EXPECT_EQ(n, i);
    }
    EXPECT_EQ(unique_vec[0], 0);
    EXPECT_EQ(unique_vec[1], 1);
    EXPECT_EQ(unique_vec[2], 2);
}

TEST(UniqueVectorTest, AddDuplicates) {
    UniqueVector<int> unique_vec;
    unique_vec.add(0);
    unique_vec.add(0);
    unique_vec.add(0);
    unique_vec.add(1);
    unique_vec.add(1);
    unique_vec.add(2);
    EXPECT_EQ(unique_vec.size(), 3u);
    EXPECT_EQ(unique_vec.empty(), false);
    int i = 0;
    for (auto n : unique_vec) {
        EXPECT_EQ(n, i);
        i++;
    }
    for (auto n : Reverse(unique_vec)) {
        i--;
        EXPECT_EQ(n, i);
    }
    EXPECT_EQ(unique_vec[0], 0);
    EXPECT_EQ(unique_vec[1], 1);
    EXPECT_EQ(unique_vec[2], 2);
}

TEST(UniqueVectorTest, AsVector) {
    UniqueVector<int> unique_vec;
    unique_vec.add(0);
    unique_vec.add(0);
    unique_vec.add(0);
    unique_vec.add(1);
    unique_vec.add(1);
    unique_vec.add(2);

    const std::vector<int>& vec = unique_vec;
    EXPECT_EQ(vec.size(), 3u);
    EXPECT_EQ(unique_vec.empty(), false);
    int i = 0;
    for (auto n : vec) {
        EXPECT_EQ(n, i);
        i++;
    }
    for (auto n : Reverse(unique_vec)) {
        i--;
        EXPECT_EQ(n, i);
    }
}

TEST(UniqueVectorTest, PopBack) {
    UniqueVector<int> unique_vec;
    unique_vec.add(0);
    unique_vec.add(2);
    unique_vec.add(1);

    EXPECT_EQ(unique_vec.pop_back(), 1);
    EXPECT_EQ(unique_vec.size(), 2u);
    EXPECT_EQ(unique_vec.empty(), false);
    EXPECT_EQ(unique_vec[0], 0);
    EXPECT_EQ(unique_vec[1], 2);

    EXPECT_EQ(unique_vec.pop_back(), 2);
    EXPECT_EQ(unique_vec.size(), 1u);
    EXPECT_EQ(unique_vec.empty(), false);
    EXPECT_EQ(unique_vec[0], 0);

    unique_vec.add(1);

    EXPECT_EQ(unique_vec.size(), 2u);
    EXPECT_EQ(unique_vec.empty(), false);
    EXPECT_EQ(unique_vec[0], 0);
    EXPECT_EQ(unique_vec[1], 1);

    EXPECT_EQ(unique_vec.pop_back(), 1);
    EXPECT_EQ(unique_vec.size(), 1u);
    EXPECT_EQ(unique_vec.empty(), false);
    EXPECT_EQ(unique_vec[0], 0);

    EXPECT_EQ(unique_vec.pop_back(), 0);
    EXPECT_EQ(unique_vec.size(), 0u);
    EXPECT_EQ(unique_vec.empty(), true);
}

TEST(UniqueVectorTest, Data) {
    UniqueVector<int> unique_vec;
    EXPECT_EQ(unique_vec.data(), nullptr);

    unique_vec.add(42);
    EXPECT_EQ(unique_vec.data(), &unique_vec[0]);
    EXPECT_EQ(*unique_vec.data(), 42);
}

}  // namespace
}  // namespace tint::utils
