File: test_layout.py

package info (click to toggle)
python-pygraphviz 1.14-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 732 kB
  • sloc: ansic: 5,100; python: 2,669; makefile: 57
file content (100 lines) | stat: -rw-r--r-- 3,353 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import pytest

import pygraphviz as pgv


def test_layout():
    A = pgv.AGraph(name="test graph")
    A.add_path([1, 2, 3, 4])
    assert [n.attr["pos"] is None for n in A.nodes()] == [True] * 4
    A.layout()
    assert [n.attr["pos"] is not None for n in A.nodes()] == [True] * 4


def test_layout_defaults():
    A = pgv.AGraph(name="test graph")
    A.add_path([1, 2, 3, 4])
    # print("Pos before",[n.attr["pos"] for n in A.nodes()])
    assert [n.attr["pos"] is None for n in A.nodes()] == [True] * 4
    A.layout()
    assert [n.attr["pos"] is not None for n in A.nodes()] == [True] * 4
    # print("Pos after",[n.attr["pos"] for n in A.nodes()])


@pytest.mark.parametrize(
    "prog",
    ("neato", "dot", "twopi", "circo", "fdp", "osage", "patchwork", "sfdp"),
)
def test_layout_prog_arg(prog):
    A = pgv.AGraph(name="test graph")
    A.add_path([1, 2, 3, 4])

    # No node position before layout
    assert all(n.attr["pos"] is None for n in A.nodes())

    # All nodes should have a position after layout
    A.layout(prog=prog)
    assert all(n.attr["pos"] is not None for n in A.nodes())

    # Node positions should be different for each of the layouts
    pos = [n.attr["pos"] for n in A.nodes()]
    A.layout(prog="dot")  # Use dot layout as reference
    dot_pos = [n.attr["pos"] for n in A.nodes()]
    assert pos == dot_pos if prog == "dot" else pos != dot_pos


def test_bad_prog_arg_raises():
    A = pgv.AGraph()
    A.add_path([1, 2, 3, 4])
    with pytest.raises(ValueError, match="Program.*is not one of"):
        A.layout(prog="not-a-valid-layout")


class TestExperimentalGraphvizLibInterface:
    def test_layout(self):
        A = pgv.AGraph(name="test graph")
        A.add_path([1, 2, 3, 4])
        assert [n.attr["pos"] is None for n in A.nodes()] == [True] * 4
        A._layout()
        assert [n.attr["pos"] is not None for n in A.nodes()] == [True] * 4

    def test_layout_defaults(self):
        A = pgv.AGraph(name="test graph")
        A.add_path([1, 2, 3, 4])
        # print("Pos before",[n.attr["pos"] for n in A.nodes()])
        assert [n.attr["pos"] is None for n in A.nodes()] == [True] * 4
        A._layout()
        assert [n.attr["pos"] is not None for n in A.nodes()] == [True] * 4
        # print("Pos after",[n.attr["pos"] for n in A.nodes()])

    def test_layout_prog_arg(self):
        A = pgv.AGraph(name="test graph")
        A.add_path([1, 2, 3, 4])
        assert [n.attr["pos"] is None for n in A.nodes()] == [True] * 4
        A._layout(prog=b"dot")
        assert [n.attr["pos"] is not None for n in A.nodes()] == [True] * 4
        dot_pos = [n.attr["pos"] for n in A.nodes()]

        A._layout(prog="dot")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result == dot_pos

        A._layout(prog="twopi")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result != dot_pos

        A._layout(prog="neato")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result != dot_pos

        A._layout(prog="circo")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result != dot_pos

        A._layout(prog="fdp")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result != dot_pos

        A._layout(prog="nop")
        result = [n.attr["pos"] for n in A.nodes()]
        assert result != dot_pos