// Copyright 2004-present Facebook. All Rights Reserved.

#include <c10/util/irange.h>

#include <gtest/gtest.h>

using namespace ::testing;

TEST(irange_test, range_test) {
    std::vector<int> test_vec;
    for(const auto i : c10::irange(4, 11)){
        test_vec.push_back(i);
    }
    const std::vector<int> correct = {{4,5,6,7,8,9,10}};
    ASSERT_EQ(test_vec, correct);
}

TEST(irange_test, end_test) {
    std::vector<int> test_vec;
    for(const auto i : c10::irange(5)){
        test_vec.push_back(i);
    }
    const std::vector<int> correct = {{0, 1, 2, 3, 4}};
    ASSERT_EQ(test_vec, correct);
}

TEST(irange_test, neg_range_test) {
    std::vector<int> test_vec;
    for(const auto i : c10::irange(-2, 3)){
        test_vec.push_back(i);
    }
    const std::vector<int> correct = {{-2,-1,0,1,2}};
    ASSERT_EQ(test_vec, correct);
}

TEST(irange, empty_reverse_range_two_inputs){
    std::vector<int> test_vec;
    for(const auto i : c10::irange(3, -3)){
        test_vec.push_back(i);
        if(i>20){ //Cap the number of elements we add if something goes wrong
            break;
        }
    }
    const std::vector<int> correct = {};
    ASSERT_EQ(test_vec, correct);
}

TEST(irange, empty_reverse_range_one_input){
    std::vector<int> test_vec;
    for(const auto i : c10::irange(-3)){
        test_vec.push_back(i);
        if(i>20){ //Cap the number of elements we add if something goes wrong
            break;
        }
    }
    const std::vector<int> correct = {};
    ASSERT_EQ(test_vec, correct);
}
