"""Test HexGraph and DualHexGraph."""
from pytest import approx
from numpy.testing import assert_array_equal, assert_array_almost_equal
import numpy as np

from landlab.graph import DualHexGraph


ROOT_3_OVER_2 = np.sqrt(3.) * .5


def test_create():
    """Test creating a dual hex graph with rectangular layout."""
    graph = DualHexGraph((4, 3), node_layout='rect')

    assert graph.number_of_nodes == 12
    assert graph.number_of_links == 23
    assert graph.number_of_patches == 12

    assert graph.number_of_corners == 10
    assert graph.number_of_faces == 11
    assert graph.number_of_cells == 2


def test_create_hex():
    """Test creating a dual hex graph with hex layout."""
    graph = DualHexGraph((4, 3), node_layout='hex')

    assert graph.number_of_nodes == 16
    assert graph.number_of_links == 34
    assert graph.number_of_patches == 19

    assert graph.number_of_corners == 19
    assert graph.number_of_faces == 23
    assert graph.number_of_cells == 5


def test_create_rect1():
    """Test creating a dual hex graph."""
    graph = DualHexGraph((4, 3), node_layout='rect1')

    assert graph.number_of_nodes == 14
    assert graph.number_of_links == 28
    assert graph.number_of_patches == 15

    assert graph.number_of_corners == 13
    assert graph.number_of_faces == 15
    assert graph.number_of_cells == 3


def test_spacing():
    """Test spacing of nodes."""
    graph = DualHexGraph((20, 31), node_layout='rect1')
    assert_array_almost_equal(graph.length_of_link, 1.)

    graph = DualHexGraph((31, 20), spacing=2, node_layout='rect1')
    assert_array_almost_equal(graph.length_of_link, 2.)


def test_origin():
    """Test setting the origin."""
    graph = DualHexGraph((4, 3))

    assert graph.y_of_node[0] == approx(0.)
    assert graph.x_of_node[0] == approx(0.)
    assert graph.x_of_corner[0] == approx(1.5)

    graph = DualHexGraph((4, 3), origin=(.5, .25))

    assert graph.y_of_node[0] == approx(.5)
    assert graph.x_of_node[0] == approx(.25)
    assert graph.x_of_corner[0] == approx(1.75)


def test_orientation():
    """Test vertical and horizontal orientation."""
    graph = DualHexGraph((3, 4), orientation='vertical')
    assert_array_almost_equal(graph.y_of_corner,
                              [.5, .5, 1, 1, 1, 1.5, 1.5, 1.5, 2, 2])

    graph = DualHexGraph((4, 3), orientation='horizontal')
    assert_array_almost_equal(graph.x_of_corner,
                              [1.5, 1, 2, 1, 2, .5, 1.5, .5, 1.5, 1])


def test_adjacent_corners_at_corner():
    graph = DualHexGraph((3, 3), node_layout='hex')
    assert_array_equal(graph.adjacent_corners_at_corner,
                       [[ 3,  2, -1],
                        [ 4 , 3, -1],
                        [ 5,  0, -1],
                        [ 6,  0,  1],
                        [ 7,  1, -1],
                        [ 8,  2, -1],
                        [ 9,  8,  3],
                        [ 9,  4, -1],
                        [ 5,  6, -1],
                        [ 6,  7, -1]])
