# Path: rvic/core/variables.py
# class Point(object):
#     '''
#     Creates a point class for intellegently storing coordinate information
#     '''
# 
#     def __init__(self, lat=-9999.9, lon=-9999.9, domx=-9999, domy=-9999,
#                  routx=-9999, routy=-9999, name=None, cell_id=-9999):
#         '''Defines x and y variables'''
#         self.lat = lat
#         self.lon = lon
#         self.domx = domx
#         self.domy = domy
#         self.routx = routx
#         self.routy = routy
#         self.cell_id = cell_id
# 
#         if name:
#             self.name = name
#         else:
#             self.name = 'outlet_{0:3.4f}_{1:3.4f}'.format(self.lat, self.lon)
# 
#         return
# 
#     def __str__(self):
#         return ('Point({0}, lat:{1:3.4f}, lon:{2:3.4f}, y:{3:d}, '
#                 'x:{4:d})'.format(self.name, self.lat, self.lon, self.domy,
#                                   self.domx))
# 
#     def __repr__(self):
#         return ('    -- Point --    \n'
#                 'name:\t{0}\n'
#                 'lat:\t{1:3.4f}\n'
#                 'lon:\t{2:3.4f}\n'
#                 'domy:\t{3:d}\n'
#                 'domx:\t{4:d}\n'
#                 'routy:\t{5:d}\n'
#                 'routx:\t{6:d}\n'.format(self.name, self.lat, self.lon,
#                                          self.domy, self.domx,
#                                          self.routy, self.routx))


import pytest
import numpy as np
from rvic.core.make_uh import (find_ts, read_direction, search_catchment,
                               make_uh, make_grid_uh_river, make_grid_uh,
                               adjust_uh_timestep)
from rvic.core.variables import Point


def test_find_ts():
    assert find_ts(np.array([0, 86400, 172800])) == 86400


def test_find_ts_raises_when_scalar():
    with pytest.raises(TypeError):
        find_ts(4)


def test_read_direction(fdr_vic, dy_vic, dx_vic):
    to_y, to_x = read_direction(fdr_vic, dy_vic, dx_vic)
    np.testing.assert_equal(to_y.shape, to_x.shape)
    assert to_y.max() <= fdr_vic.shape[0] + 1
    assert to_x.max() <= fdr_vic.shape[1] + 1


def test_search_catchment(fdr_vic_small, dy_vic, dx_vic, pour_point):
    basin_ids = np.ones_like(fdr_vic_small, dtype=np.int)
    basin_id = 1
    to_y, to_x = read_direction(fdr_vic_small, dy_vic, dx_vic)
    catchment, catch_fracs = search_catchment(to_y, to_x, pour_point,
                                              basin_ids, basin_id)
    assert catch_fracs.min() <= 0.
    assert catch_fracs.max() == 1.
    assert type(catchment) == dict
    assert all([k in catchment for k in ['count_ds', 'x_inds', 'y_inds']])
    assert len(catchment['count_ds']) > 0
    assert len(catchment['count_ds']) == len(catchment['x_inds'])

# Path: rvic/core/variables.py
# class Point(object):
#     '''
#     Creates a point class for intellegently storing coordinate information
#     '''
# 
#     def __init__(self, lat=-9999.9, lon=-9999.9, domx=-9999, domy=-9999,
#                  routx=-9999, routy=-9999, name=None, cell_id=-9999):
#         '''Defines x and y variables'''
#         self.lat = lat
#         self.lon = lon
#         self.domx = domx
#         self.domy = domy
#         self.routx = routx
#         self.routy = routy
#         self.cell_id = cell_id
# 
#         if name:
#             self.name = name
#         else:
#             self.name = 'outlet_{0:3.4f}_{1:3.4f}'.format(self.lat, self.lon)
# 
#         return
# 
#     def __str__(self):
#         return ('Point({0}, lat:{1:3.4f}, lon:{2:3.4f}, y:{3:d}, '
#                 'x:{4:d})'.format(self.name, self.lat, self.lon, self.domy,
#                                   self.domx))
# 
#     def __repr__(self):
#         return ('    -- Point --    \n'
#                 'name:\t{0}\n'
#                 'lat:\t{1:3.4f}\n'
#                 'lon:\t{2:3.4f}\n'
#                 'domy:\t{3:d}\n'
#                 'domx:\t{4:d}\n'
#                 'routy:\t{5:d}\n'
#                 'routx:\t{6:d}\n'.format(self.name, self.lat, self.lon,
#                                          self.domy, self.domx,
#                                          self.routy, self.routx))


# Path: tests/unit/test_make_uh.py
import pytest
import numpy as np
from rvic.core.make_uh import (find_ts, read_direction, search_catchment,
                               make_uh, make_grid_uh_river, make_grid_uh,
                               adjust_uh_timestep)
from rvic.core.variables import Point



def test_find_ts():
    assert find_ts(np.array([0, 86400, 172800])) == 86400


def test_find_ts_raises_when_scalar():
    with pytest.raises(TypeError):
        find_ts(4)


def test_read_direction(fdr_vic, dy_vic, dx_vic):
    to_y, to_x = read_direction(fdr_vic, dy_vic, dx_vic)
    np.testing.assert_equal(to_y.shape, to_x.shape)
    assert to_y.max() <= fdr_vic.shape[0] + 1
    assert to_x.max() <= fdr_vic.shape[1] + 1


def test_search_catchment(fdr_vic_small, dy_vic, dx_vic, pour_point):
    basin_ids = np.ones_like(fdr_vic_small, dtype=np.int)
    basin_id = 1
    to_y, to_x = read_direction(fdr_vic_small, dy_vic, dx_vic)
    catchment, catch_fracs = search_catchment(to_y, to_x, pour_point,
                                              basin_ids, basin_id)
    assert catch_fracs.min() <= 0.
    assert catch_fracs.max() == 1.
    assert type(catchment) == dict
    assert all([k in catchment for k in ['count_ds', 'x_inds', 'y_inds']])
    assert len(catchment['count_ds']) > 0
    assert len(catchment['count_ds']) == len(catchment['x_inds'])

    assert len(catchment['count_ds']) == len(catchment['y_inds'])