1import os
2import unittest
3from tempfile import NamedTemporaryFile
4
5import numpy as np
6
7from orangecontrib.network.network import readwrite
8
9
10def _fullpath(name):
11    return os.path.join(os.path.split(__file__)[0], name)
12
13
14class TestReadPajek(unittest.TestCase):
15    def test_two_mode(self):
16        davis = readwrite.read_pajek(_fullpath("../networks/davis.net"))
17        self.assertEqual(davis.number_of_nodes(), 32)
18        self.assertEqual(
19            list(davis.nodes),
20            ['EVELYN', 'LAURA', 'THERESA', 'BRENDA', 'CHARLOTTE', 'FRANCES',
21             'ELEANOR', 'PEARL', 'RUTH', 'VERNE', 'MYRNA', 'KATHERINE',
22             'SYLVIA', 'NORA', 'HELEN', 'DOROTHY', 'OLIVIA', 'FLORA', 'E1',
23             'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11',
24             'E12', 'E13', 'E14']
25            )
26        self.assertEqual(davis.in_first_mode, 18)
27
28    def test_write_pajek(self):
29        net = readwrite.read_pajek(_fullpath("../networks/leu_by_genesets.net"))
30        with NamedTemporaryFile("wt", suffix=".net", delete=False) as f:
31            try:
32                readwrite.write_pajek(f, net)
33                f.close()
34                net2 = readwrite.read_pajek(f.name)
35                np.testing.assert_equal(net2.nodes, net.nodes)
36                np.testing.assert_equal(net2.coordinates, net.coordinates)
37                self.assertEqual(len(net2.edges), 1)
38                edges, edges2 = net.edges[0].edges, net2.edges[0].edges
39                np.testing.assert_equal(edges.indptr, edges2.indptr)
40                np.testing.assert_equal(edges.indices, edges2.indices)
41                np.testing.assert_almost_equal(edges.data, edges2.data)
42            finally:
43                os.remove(f.name)
44
45    def test_write_pajek_no_coordinates(self):
46        net = readwrite.read_pajek(_fullpath("../networks/leu_by_genesets.net"))
47        net.coordinates = None
48        with NamedTemporaryFile("wt", suffix=".net", delete=False) as f:
49            try:
50                readwrite.write_pajek(f, net)
51                f.close()
52                net2 = readwrite.read_pajek(f.name)
53                np.testing.assert_equal(net2.nodes, net.nodes)
54                self.assertIsNone(net2.coordinates, net.coordinates)
55            finally:
56                os.remove(f.name)
57
58    def test_write_pajek_multiple_edge_types(self):
59        net = readwrite.read_pajek(_fullpath("../networks/leu_by_genesets.net"))
60        net.edges.append(net.edges[0])
61        with NamedTemporaryFile("wt", suffix=".net") as f:
62            self.assertRaises(TypeError, readwrite.write_pajek, f, net)
63
64    def test_edge_list(self):
65        net = readwrite.read_pajek(_fullpath("test-arcslist.net"))
66        neighs = [(1, (2, 3, 6)),
67                  (2, (1, 4, 5, 6)),
68                  (5, (1, 2)),
69                  (6, (2, 3, 4))]
70        self.assertEqual(net.number_of_edges(), sum(len(y) for _, y in neighs))
71        self.assertTrue(net.edges[0].directed)
72        for x, y in neighs:
73            np.testing.assert_equal(net.outgoing(x - 1), np.array(y) - 1)
74
75
76if __name__ == "__main__":
77    unittest.main()
78