"""
    Title: test_convo.py
    Author: Tina Yang, tina.yang@ga.gov.au
    CreationDate: 2015-07-01
    Description: Unit testing module for convo function in calculate_bal.py
"""

import sys
import os.path
import unittest
import numpy as np
from inspect import getfile, currentframe
from numpy.testing import assert_array_equal


class TestConvo(unittest.TestCase):

    def test_convo(self):

        bal_exp_w = np.array([[-99., 29., 100., 19., 100., 40., 200., 200.],
                              [-99., 19., 100., 100., 40., 40., 200., 200.],
                              [-99., 40., 29., 100., 100., 29., 100., 29.],
                              [-99., 100., 40., 29., 40., 12.5, 29., 40.],
                              [-99., -99., 29., 40., 19., 29., 29., 29.],
                              [-99., 40., 100., 100., 29., 40., 29., 40.],
                              [-99., 100., 40., 29., 100., 100., 40., 100.],
                              [-99., 100., 29., 19., 29., 100., 100., 200.]])

        bal_exp_e = np.array([[100., 200., 200., 200., 200., 40., -99., -99.],
                              [100., 200., 200., 200., 200., 19., 29., -99.],
                              [100., 100., 100., 29., 100., 29., 29., -99.],
                              [40., 29., 40., 12.5, 29., 40., 19., -99.],
                              [29., 40., 19., 29, 29., 29, 40., -99.],
                              [100., 100., 29., 40., 29., 40., 29., -99.],
                              [40., 40., 100., 100., 40., 100., 40., -99.],
                              [29, 19., 200., 200., 200., 200., -99., -99.]])

        bal_exp_n = np.array([[-99., -99., -99., -99., -99., -99., -99., -99.],
                              [29., 100., -99., 100., 40., 200., 40., -99.],
                              [19, 100., 100, 40., 40., 200., 19., 29.],
                              [40., 29., 100., 100., 29., 200., 29., 29.],
                              [100., 40., 100., 40., 12.5, 200., 40., 19.],
                              [29., 29., 40., 19., 29, 200, 29, 40.],
                              [40., 100., 100., 29., 40., 29., 40., 29],
                              [100., 40., 29., 100., 100., 40., 100., 40.]])

        bal_exp_s = np.array([[19., 100., 100., 40., 40., 200., 19., 29.],
                              [40., 29, 100., 100., 29., 100., 29., 29.],
                              [100., 40., 29., 40., 12.5, 29., 40., 19.],
                              [12.5, 29., 40., 19., 29, 29., 200., 40.],
                              [40., 100., 100., 40., 40., 29, 200., 29],
                              [100., 40., 29., 100., 100., 100., 200., 40.],
                              [100., 29., 19., 29., 100., 100., 200., -99.],
                              [-99., -99., -99., -99., -99., -99., -99.,
                               -99.]])

        bal_exp_nw = np.array([[-99., -99., -99., -99., -99., -99., -99.,
                                -99.],
                               [-99., 19., 100., -99., 40., 29., 200., 29.],
                               [-99., 12.5, 100, 100., 29., 29., 200., 200.],
                               [-99., 29., 19., 100., 40., 29., 40., 200.],
                               [-99., 100., 29., 19., 29., 12.5, 19., 29.],
                               [-99., -99., 19., 29., 12.5, 19, 19., 19],
                               [-99., 29., 100., 40., 19., 29., 19., 29.],
                               [-99., 40., 29., 19., 100., 100., 29., 40.]])

        bal_exp_ne = np.array([[-99., -99., -99., -99., -99., -99., -99.,
                                -99.],
                               [100., -99., 40., 29., 200., 29., -99., -99.],
                               [100., 100., 29, 200., 200., 12.5, 19., -99.],
                               [19., 100., 200., 200., 40., 29., 29., -99.],
                               [29., 19., 200., 12.5, 19., 29., 12.5, -99.],
                               [19., 29., 12.5, 19., 19., 19., 29., -99.],
                               [100., 40., 19., 29., 19., 29., 19., -99.],
                               [29., 19., 100., 100., 29., 40., 29., -99.]])

        bal_exp_se = np.array([[100., 100., 29., 29., 200., 12.5, 19., -99.],
                               [19, 100., 40., 29., 40., 29., 29., -99.],
                               [29., 19., 29, 12.5, 19., 29., 12.5, -99.],
                               [19., 29., 12.5, 19, 19., 19., 29., -99.],
                               [100., 40., 19., 200., 19., 29, 19., -99.],
                               [29., 19., 100., 100., 200., 40., 29., -99.],
                               [29., 12.5, 19., 40., 100., 200., -99., -99.],
                               [-99., -99., -99., -99., -99., -99., -99.,
                                -99.]])

        bal_exp_sw = np.array([[-99., 12.5, 100., 100., 29., 29., 200., 12.5],
                               [-99., 29., 19., 100., 40., 29., 40., 29.],
                               [-99., 100., 29, 19., 29., 12.5, 19., 29.],
                               [-99., -99., 19., 29., 12.5, 19, 19., 19],
                               [-99., 29., 100., 40., 19., 29., 19., 29.],
                               [-99., 40., 29., 19., 100., 100., 29., 40.],
                               [-99., 40., 29., 12.5, 19., 40., 100., 200.],
                               [-99., -99., -99., -99., -99., -99., -99.,
                                -99.]])

        result_list = [bal_exp_w, bal_exp_e, bal_exp_n, bal_exp_s, bal_exp_nw,
                       bal_exp_ne, bal_exp_se, bal_exp_sw]

        cmd_folder = os.path.realpath(
                     os.path.abspath(os.path.split(
                     getfile(currentframe()))[0]))

        parent = os.path.abspath(os.path.join(cmd_folder, os.pardir))

        if parent not in sys.path:
            sys.path.insert(0, parent)

        from calculate_bal import convo

        veg_data = np.array([[  3.,  1.,  2.,  4.,  5.,  3.,  3.,  -99.],
                             [  7.,  1.,  1.,  3.,  3.,  4.,  5.,  6.],
                             [  6.,  7.,  1.,  4.,  5.,  4.,  5.,  5.],
                             [  2.,  5.,  6.,  4.,  5.,  3.,  4.,  5.],
                             [-99.,  3.,  4.,  5.,  7.,  5.,  7.,  6.],
                             [  4.,  1.,  2.,  3.,  4.,  5.,  6.,  7.],
                             [  4.,  4.,  5.,  1.,  2.,  3.,  4.,  5.],
                             [  6.,  7.,  5.,  5.,  6.,  1.,  2.,  3.]])


        slope_data = np.array([[ 1., 2.,  -99., 4., 5., 6., 5., 5.],
                               [ 1., 2.,  3.,  4., 5., 6., 1., 2.],
                               [ 3., 3., 5., 4., 4., 5., 4., 4.],
                               [ 5., 5., 6., 2., -99., 2., 3., 1.],
                               [-99., 2.,  3., 5., 2., 3., 2., 3.],
                               [  2., 3.,  3., 3., 3., 3., 3., 3.],
                               [ 4., 3., 3., 4., 4., 4., 4., 5.],
                               [ 4., 4., 1., 3., 4., 5., 6., -99.]])

        aspect_data = dict([('w', np.array([
                                           [7., 7., 7., 7., 7., 7., 7., 9.],
                                           [7., 7., 7., 7., 7., 7., 7., 7.],
                                           [7., 7., 7., 7., 7., 7., 7., 7.],
                                           [7., 7., 1., 7., 2., 7., 7., 7.],
                                           [3., 7., 7., 4., 7., 7., 7., 7.],
                                           [7., 7., 7., 7., 7., 7., 7., 7.],
                                           [7., 7., 7., 7., 7., 7., 7., 7.],
                                           [7., 7., 7., 7., 7., 7., 7., 7.]])),
                             ('e', np.array([
                                           [3., 3., 3., 3., 3., 3., 3., 9.],
                                           [3., 3., 3., 3., 3., 3., 3., 3.],
                                           [3., 3., 3., 3., 3., 3., 3., 3.],
                                           [3., 3., 9., 3., 9., 3., 3., 3.],
                                           [9., 3., 3., 9., 3., 3., 3., 3.],
                                           [3., 3., 3., 3., 3., 3., 3., 3.],
                                           [3., 3., 3., 3., 3., 3., 3., 3.],
                                           [3., 3., 3., 3., 3., 3., 3., 3.]])),
                             ('n', np.array([
                                           [1., 1., 1., 1., 1., 1., 1., 9.],
                                           [1., 1., 1., 1., 1., 1., 1., 1.],
                                           [1., 1., 1., 1., 1., 1., 1., 1.],
                                           [1., 1., 9., 1., 9., 1., 1., 1.],
                                           [9., 1., 1., 9., 1., 1., 1., 1.],
                                           [1., 1., 1., 1., 1., 1., 1., 1.],
                                           [1., 1., 1., 1., 1., 1., 1., 1.],
                                           [1., 1., 1., 1., 1., 1., 1., 1.]])),
                             ('s', np.array([
                                           [5., 5., 5., 5., 5., 5., 5., 9.],
                                           [5., 5., 5., 5., 5., 5., 5., 5.],
                                           [5., 5., 5., 5., 5., 5., 5., 5.],
                                           [5., 5., 9., 5., 9., 5., 5., 5.],
                                           [9., 5., 5., 9., 5., 5., 5., 5.],
                                           [5., 5., 5., 5., 5., 5., 5., 5.],
                                           [5., 5., 5., 5., 5., 5., 5., 5.],
                                           [5., 5., 5., 5., 5., 5., 5., 5.]])),
                             ('nw', np.array([
                                           [8., 8., 8., 8., 8., 8., 8., 9.],
                                           [8., 8., 8., 8., 8., 8., 8., 8.],
                                           [8., 8., 8., 8., 8., 8., 8., 8.],
                                           [8., 8., 9., 8., 9., 8., 8., 8.],
                                           [9., 8., 8., 9., 8., 8., 8., 8.],
                                           [8., 8., 8., 8., 8., 8., 8., 8.],
                                           [8., 8., 8., 8., 8., 8., 8., 8.],
                                           [8., 8., 8., 8., 8., 8., 8., 8.]])),
                             ('ne', np.array([
                                           [2., 2., 2., 2., 2., 2., 2., 9.],
                                           [2., 2., 2., 2., 2., 2., 2., 2.],
                                           [2., 2., 2., 2., 2., 2., 2., 2.],
                                           [2., 2., 9., 2., 9., 2., 2., 2.],
                                           [9., 2., 2., 9., 2., 2., 2., 2.],
                                           [2., 2., 2., 2., 2., 2., 2., 2.],
                                           [2., 2., 2., 2., 2., 2., 2., 2.],
                                           [2., 2., 2., 2., 2., 2., 2., 2.]])),
                             ('se', np.array([
                                           [4., 4., 4., 4., 4., 4., 4., 9.],
                                           [4., 4., 4., 4., 4., 4., 4., 4.],
                                           [4., 4., 4., 4., 4., 4., 4., 4.],
                                           [4., 4., 9., 4., 9., 4., 4., 4.],
                                           [9., 4., 4., 9., 4., 4., 4., 4.],
                                           [4., 4., 4., 4., 4., 4., 4., 4.],
                                           [4., 4., 4., 4., 4., 4., 4., 4.],
                                           [4., 4., 4., 4., 4., 4., 4., 4.]])),
                             ('sw', np.array([
                                           [6., 6., 6., 6., 6., 6., 6., 9.],
                                           [6., 6., 6., 6., 6., 6., 6., 6.],
                                           [6., 6., 6., 6., 6., 6., 6., 6.],
                                           [6., 6., 9., 6., 9., 6., 6., 6.],
                                           [9., 6., 6., 9., 6., 6., 6., 6.],
                                           [6., 6., 6., 6., 6., 6., 6., 6.],
                                           [6., 6., 6., 6., 6., 6., 6., 6.],
                                           [6., 6., 6., 6., 6., 6., 6., 6.]]))
                            ])

        pixel_width = 25

        dire = ['w', 'e', 'n', 's', 'nw', 'ne', 'se', 'sw']

        fdi = 80

        index = 0

        for one_dir in dire:

            outdata = convo(one_dir, veg_data, slope_data,
                            aspect_data[one_dir], pixel_width, fdi)

            bal_exp = result_list[index]

            assert_array_equal(outdata,  bal_exp)

            index += 1


if __name__ == "__main__":
    unittest.main()

