#include <vector>
#include <string>

#include <gtest/gtest.h>
#include "CommonTests.h"

#include "boolinq.h"

using namespace boolinq;

//////////////////////////////////////////////////////////////////////////

TEST(TakeRange, ManyToMore)
{
    int src[] = {1,2,3,4,5,6};
    int ans[] = {1,2,3,4,5,6};

    auto rng = from(src);
    auto dst = rng.take(10);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, ManyToMany)
{
    int src[] = {1,2,3,4,5,6};
    int ans[] = {1,2,3,4,5,6};

    auto rng = from(src);
    auto dst = rng.take(6);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, ManyToLess)
{
    int src[] = {1,2,3,4,5,6};
    int ans[] = {1,2,3};

    auto rng = from(src);
    auto dst = rng.take(3);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, ManyToOne)
{
    int src[] = {1,2,3,4,5,6};
    int ans[] = {1};

    auto rng = from(src);
    auto dst = rng.take(1);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, ManyToZero)
{
    int src[] = {1,2,3,4,5,6};

    auto rng = from(src);
    auto dst = rng.take(0);

    EXPECT_THROW(dst.nextObject(), EnumeratorEndException);
}

//////////////////////////////////////////////////////////////////////////

TEST(TakeRange, OneToMore)
{
    int src[] = {5};
    int ans[] = {5};

    auto rng = from(src);
    auto dst = rng.take(5);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, OneToOne)
{
    int src[] = {5};
    int ans[] = {5};

    auto rng = from(src);
    auto dst = rng.take(1);

    CheckRangeEqArray(dst, ans);
}

TEST(TakeRange, OneToZero)
{
    int src[] = {5};

    auto rng = from(src);
    auto dst = rng.take(0);

    EXPECT_THROW(dst.nextObject(), EnumeratorEndException);
}

TEST(TakeRange, ZeroToZero)
{
    std::vector<int> src;

    auto rng = from(src);
    auto dst = rng.take(0);

    EXPECT_THROW(rng.nextObject(), EnumeratorEndException);
}

//////////////////////////////////////////////////////////////////////////