class TestItokawaMat32():
    # define asteroid
    ast = asteroid.Asteroid('itokawa', 32, 'mat')
    pos = np.random.uniform(1, 2, size=(3, ))
    V = ast.V
    num_v = V.shape[0]

    r_v = V - np.tile(pos, (num_v, 1))

    # extract things from object
    Fa, Fb, Fc = ast.asteroid_grav['Fa'], ast.asteroid_grav[
        'Fb'], ast.asteroid_grav['Fc']
    F_face = ast.asteroid_grav['F_face']
    e1, e2, e3 = ast.asteroid_grav['e1'], ast.asteroid_grav[
        'e2'], ast.asteroid_grav['e3']
    e1_vertex_map, e2_vertex_map, e3_vertex_map = ast.asteroid_grav[
        'e1_vertex_map'], ast.asteroid_grav[
            'e2_vertex_map'], ast.asteroid_grav['e3_vertex_map']
    e1_face_map, e2_face_map, e3_face_map = ast.asteroid_grav[
        'e1_face_map'], ast.asteroid_grav['e2_face_map'], ast.asteroid_grav[
            'e3_face_map']
    E1_edge, E2_edge, E3_edge = ast.asteroid_grav[
        'E1_edge'], ast.asteroid_grav['E2_edge'], ast.asteroid_grav['E3_edge']
    e_vertex_map, unique_index = ast.asteroid_grav[
        'e_vertex_map'], ast.asteroid_grav['unique_index']

    w_face = polyhedron.laplacian_factor(r_v, Fa, Fb, Fc)

    # compute things to compare methods
    L1_edge, L2_edge, L3_edge = polyhedron.edge_factor(r_v, e1, e2, e3,
                                                       e1_vertex_map,
                                                       e2_vertex_map,
                                                       e3_vertex_map)
    L1_edge_map, L2_edge_map, L3_edge_map = polyhedron.map_edge_factor(
        r_v, e1, e2, e3, e1_vertex_map, e2_vertex_map, e3_vertex_map)

    U_face_loop, U_grad_face_loop, U_grad_mat_face_loop = polyhedron.face_contribution_loop(
        r_v, Fa, F_face, w_face)
    U_face, U_grad_face, U_grad_mat_face = polyhedron.face_contribution(
        r_v, Fa, F_face, w_face)

    U_edge_loop, U_grad_edge_loop, U_grad_mat_edge_loop = polyhedron.edge_contribution_loop(
        r_v, e1_face_map, e2_face_map, e3_face_map, e1_vertex_map,
        e2_vertex_map, e3_vertex_map, E1_edge, E2_edge, E3_edge, L1_edge,
        L2_edge, L3_edge)
    U_edge, U_grad_edge, U_grad_mat_edge = polyhedron.edge_contribution(
        pos, e_vertex_map, unique_index, V, E1_edge, E2_edge, E3_edge, L1_edge,
        L2_edge, L3_edge)

    # make sure things match
    def test_potential(self):
        np.testing.assert_allclose(self.U_face, self.U_face_loop)

    def test_attraction(self):
        np.testing.assert_allclose(self.U_grad_face, self.U_grad_face_loop)

    def test_laplacian(self):
        np.testing.assert_allclose(self.U_grad_mat_face,
                                   self.U_grad_mat_face_loop)

    def test_L1_edge(self):
        np.testing.assert_allclose(self.L1_edge_map, self.L1_edge)

    def test_L2_edge(self):
        np.testing.assert_allclose(self.L2_edge_map, self.L2_edge)

    def test_L3_edge(self):
        np.testing.assert_allclose(self.L3_edge_map, self.L3_edge)

    def test_edge_contribution(self):
        np.testing.assert_allclose(self.U_edge, self.U_edge_loop)

    def test_grad_edge(self):
        np.testing.assert_allclose(self.U_grad_edge, self.U_grad_edge_loop)
        'e3_vertex_map']
e1_face_map, e2_face_map, e3_face_map = ast.asteroid_grav[
    'e1_face_map'], ast.asteroid_grav['e2_face_map'], ast.asteroid_grav[
        'e3_face_map']
E1_edge, E2_edge, E3_edge = ast.asteroid_grav['E1_edge'], ast.asteroid_grav[
    'E2_edge'], ast.asteroid_grav['E3_edge']
e_vertex_map, unique_index = ast.asteroid_grav[
    'e_vertex_map'], ast.asteroid_grav['unique_index']

w_face = polyhedron.laplacian_factor(r_v, Fa, Fb, Fc)

# compute things to compare methods
L1_edge, L2_edge, L3_edge = polyhedron.edge_factor(r_v, e1, e2, e3,
                                                   e1_vertex_map,
                                                   e2_vertex_map,
                                                   e3_vertex_map)
L1_edge_map, L2_edge_map, L3_edge_map = polyhedron.map_edge_factor(
    r_v, e1, e2, e3, e1_vertex_map, e2_vertex_map, e3_vertex_map)

U_face_loop, U_grad_face_loop, U_grad_mat_face_loop = polyhedron.face_contribution_loop(
    r_v, Fa, F_face, w_face)
U_face, U_grad_face, U_grad_mat_face = polyhedron.face_contribution(
    r_v, Fa, F_face, w_face)

U_edge_loop, U_grad_edge_loop, U_grad_mat_edge_loop = polyhedron.edge_contribution_loop(
    r_v, e1_face_map, e2_face_map, e3_face_map, e1_vertex_map, e2_vertex_map,
    e3_vertex_map, E1_edge, E2_edge, E3_edge, L1_edge, L2_edge, L3_edge)
U_edge, U_grad_edge, U_grad_mat_edge = polyhedron.edge_contribution(
    pos, e_vertex_map, unique_index, V, E1_edge, E2_edge, E3_edge, L1_edge,
    L2_edge, L3_edge)