#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import unittest

import pandas as pd
import numpy as np
import talib
from pandas_talib import *

basepath = os.path.dirname(__file__)
filename = os.path.join(basepath, "..", "data", "AAPL_GOOGL_IBM_20140101_20141201.xls")
d = pd.read_excel(filename, sheetname=None)
panel = pd.Panel.from_dict(d)
panel = panel.iloc[:, 1:, :]
panel.major_axis.name = "Date"

df = panel.loc[:, :, 'AAPL']

SETTINGS.join = False


class TestFunctions(unittest.TestCase):

    def test_indicator_SMA(self):
        timeperiod = 10
        random_serie = pd.DataFrame(np.random.uniform(0, 1, size=10), columns=['last'])
        result = SMA(random_serie, timeperiod, key='last')
        isinstance(result, pd.DataFrame)
        expected = talib.SMA(random_serie['last'].values, timeperiod=10)
        np.testing.assert_almost_equal(result.values, expected)

    def test_indicator_MA(self):
        n = 3
        price = 'Close'
        result = MA(df, n)
        isinstance(result, pd.DataFrame)
        expected = talib.MA(df[price].values, timeperiod=n)
        np.testing.assert_almost_equal(result.values, expected)

    def test_indicator_EMA(self):
        n = 3
        price = 'Close'
        result = EMA(df, n)
        isinstance(result, pd.DataFrame)
        expected = talib.EMA(df[price].values, timeperiod=n)
        np.testing.assert_almost_equal(result.values, expected)

    def test_indicator_MOM(self):
        n = 3
        price = 'Close'
        result = MOM(df, n)
        isinstance(result, pd.DataFrame)
        expected = talib.MOM(df[price].values, timeperiod=n)
        np.testing.assert_almost_equal(result.values, expected)

    def test_indicator_ROC(self):
        n = 3
        price = 'Close'
        result = ROC(df, n)
        isinstance(result, pd.DataFrame)
        expected = talib.ROC(df[price].values, timeperiod=n)
        np.testing.assert_almost_equal(result.values, expected)

    def test_indicator_ATR(self):
        n = 5
        result = ATR(df, n)
        isinstance(result, pd.DataFrame)
        
        expected = talib.ATR(df['High'].values, df['Low'].values, df['Close'].values, timeperiod=n)
        
        np.testing.assert_almost_equal(result, expected[1::])

    def test_indicator_BBANDS(self):
        n = 3
        result = BBANDS(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_PPSR(self):
        result = PPSR(df)
        isinstance(result, pd.DataFrame)

    def test_indicator_STOK(self):
        result = STOK(df)
        isinstance(result, pd.DataFrame)

    def test_indicator_STO(self):
        n = 2
        result = STO(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_TRIX(self):
        n = 3
        result = TRIX(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_ADX(self):
        (n, n_ADX) = (2, 4)
        result = ADX(df, n, n_ADX)
        isinstance(result, pd.DataFrame)

    def test_indicator_MACD(self):
        (n_fast, n_slow) = (9, 13)
        result = MACD(df, n_fast, n_slow)
        isinstance(result, pd.DataFrame)

    def test_indicator_MassI(self):
        result = MassI(df)
        isinstance(result, pd.DataFrame)

    def test_indicator_Vortex(self):
        n = 2
        result = Vortex(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_KST(self):
        (r1, r2, r3, r4, n1, n2, n3, n4) = (1, 2, 3, 4, 6, 7, 9, 9)
        result = KST(df, r1, r2, r3, r4, n1, n2, n3, n4)
        isinstance(result, pd.DataFrame)

    def test_indicator_RSI(self):
        n = 2
        result = RSI(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_TSI(self):
        (r, s) = (2, 4)
        result = TSI(df, r, s)
        isinstance(result, pd.DataFrame)

    def test_indicator_ACCDIST(self):
        n = 2
        result = ACCDIST(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_Chaikin(self):
        result = Chaikin(df)
        isinstance(result, pd.DataFrame)

    def test_indicator_MFI(self):
        n = 2
        result = MFI(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_OBV(self):
        n = 2
        result = OBV(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_FORCE(self):
        n = 2
        result = FORCE(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_EOM(self):
        n = 2
        result = EOM(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_CCI(self):
        n = 2
        result = CCI(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_COPP(self):
        n = 2
        result = COPP(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_COPP(self):
        n = 2
        result = COPP(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_KELCH(self):
        n = 2
        result = KELCH(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_ULTOSC(self):
        n = 2
        result = ULTOSC(df)
        isinstance(result, pd.DataFrame)

    def test_indicator_DONCH(self):
        n = 2
        result = DONCH(df, n)
        isinstance(result, pd.DataFrame)

    def test_indicator_STDDEV(self):
        n = 2
        result = STDDEV(df, n)
        isinstance(result, pd.DataFrame)