#include "indicator_test.hh"
#include "../Source/sma.hh"
#include "../Source/stdev.hh"
#include "../Source/macd.hh"
#include "../Source/rsi.hh"
#include "../Source/cci.hh"
#include <QDebug>

void IndicatorTest::movingAverageMinimal()
{
    AI::SMA ma1(1);
    QCOMPARE(ma1(), 0.0);

    ma1(10.1);
    QCOMPARE(ma1(), 10.1);

    ma1(-1540450.456456451);
    QCOMPARE(ma1(), -1540450.456456451);

    ma1(0.0);
    QCOMPARE(ma1(), 0.0);
}

void IndicatorTest::movingAverage()
{
    AI::SMA ma5(5);
    QCOMPARE(ma5(), 0.0);

    ma5(5.0);
    QCOMPARE(ma5(), 1.0);

    ma5(10.0);
    QCOMPARE(ma5(), 3.0);

    ma5(15.0);
    QCOMPARE(ma5(), 6.0);

    ma5(1.0);
    QCOMPARE(ma5(), 6.2);

    ma5(2.0);
    QCOMPARE(ma5(), 6.6);

    ma5(4.0);
    QCOMPARE(ma5(), 6.4);

    ma5(401.5);
    QCOMPARE(ma5(), 84.7);

    ma5.clear();

    QCOMPARE(ma5(), 0.0);

    ma5(555.5);
    QCOMPARE(ma5(), 111.1);
}

void IndicatorTest::standardDeviationMinimal()
{
    AI::STDEV dev2(2);
    QCOMPARE(dev2(), 0.0);

    dev2(10.23);
    QCOMPARE(dev2(), 7.233702371538380);

    dev2(10.23);
    QCOMPARE(dev2(), 0.0);

    dev2(10.23);
    QCOMPARE(dev2(), 0.0);

    dev2(0.0);
    QCOMPARE(dev2(), 7.233702371538380);

    dev2.clear();
    QCOMPARE(dev2(), 0.0);
}

void IndicatorTest::standardDeviation()
{
    AI::STDEV dev5(5);
    QCOMPARE(dev5(), 0.0);

    dev5(23.325);
    QCOMPARE(dev5(), 10.431257115036500);

    dev5(-45.616);
    QCOMPARE(dev5(), 25.127163313832300);

    dev5(0.75);
    QCOMPARE(dev5(), 25.162644161534400);

    dev5(26.32);
    QCOMPARE(dev5(), 28.781991821276000);

    dev5(37.4);
    QCOMPARE(dev5(), 33.019412369089800);

    dev5(37.4);
    QCOMPARE(dev5(), 35.138091342587200);

    dev5(37.4);
    QCOMPARE(dev5(), 15.893067041952600);

    dev5.clear();
    QCOMPARE(dev5(), 0.0);
}

void IndicatorTest::movingAverageConvergenceDivergence()
{
    AI::MACD macd(2, 4);

    QCOMPARE(macd(), 0.0);

    macd(1.0);
    QCOMPARE(macd(), 0.25);

    macd(2.0);
    QCOMPARE(macd(), 0.75);

    macd(3.0);
    QCOMPARE(macd(), 1.0);

    macd(2.0);
    QCOMPARE(macd(), 0.5);

    macd(1.0);
    QCOMPARE(macd(), -0.5);

    macd(1.0);
    QCOMPARE(macd(), -0.75);

    macd.clear();
    QCOMPARE(macd(), 0.0);
}

void IndicatorTest::relativeStrengthIndexMinimal()
{
    AI::RSI rsi2(2);

    QCOMPARE(rsi2(), 100.0);

    rsi2(1.0);
    QCOMPARE(rsi2(), 100.0);

    rsi2(1.5);
    QCOMPARE(rsi2(), 100.0);

    rsi2(-1.0);
    QCOMPARE(rsi2(), 16.6666666666666);

    rsi2(-15.6);
    QCOMPARE(rsi2(), 0.0);

    rsi2.clear();
    QCOMPARE(rsi2(), 100.0);
}

void IndicatorTest::relativeStrengthIndex()
{
    AI::RSI rsi4(4);

    QCOMPARE(rsi4(), 100.0);

    rsi4(-1);
    QCOMPARE(rsi4(), 0.0);

    rsi4(2);
    QCOMPARE(rsi4(), 75.0);

    rsi4(3);
    QCOMPARE(rsi4(), 80.0);

    rsi4(-6);
    QCOMPARE(rsi4(), 28.571428571428600);

    rsi4(2);
    QCOMPARE(rsi4(), 57.142857142857100);

    rsi4.clear();
    QCOMPARE(rsi4(), 100.0);
}

void IndicatorTest::comodityChannelIndex()
{
    AI::CCI cci4(4);

    QCOMPARE(cci4(), 0.0);
}
