#include <list>
#include <vector>

#include <gtest/gtest.h>

#include "boolinq.h"

using namespace boolinq;

TEST(Avg, ThreeInts)
{
    std::vector<int> src;
    src.push_back(1);
    src.push_back(2);
    src.push_back(3);

    auto rng = from(src);

    EXPECT_EQ(2, rng.avg<double>());
}

TEST(Avg, FiveInts)
{
    std::vector<int> src;
    src.push_back(1);
    src.push_back(2);
    src.push_back(3);
    src.push_back(4);
    src.push_back(5);

    auto rng = from(src);
    auto dst0 = rng.where([](int a){return a%2 == 0;});
    auto dst1 = rng.where([](int a){return a%2 == 1;});

    EXPECT_EQ(3, dst0.avg<double>());
    EXPECT_EQ(3, dst1.avg<double>());
}

TEST(Avg, FiveStringsLen)
{
    std::vector<std::string> src;
    src.push_back("hello");
    src.push_back("apple");
    src.push_back("nokia");
    src.push_back("oracle");
    src.push_back("ponny");

    auto rng = from(src);

    EXPECT_EQ(5, rng.avg<int>([](const std::string & str){return str.size();}));
}