예제 #1
0
 def test_func_na(self):
     """Test that na param columns are ignored."""
     f = fsm.StateMachine(p("test_func_na.ods"))
     f.validate()
     # the state
     s = f.states[fsm.hash_dict(dict(SV1="T"))]
     # the transition
     t = "EVENT_1", fsm.hash_dict(dict(MV1="T", MV2="T"))
     self.assertFalse(t in s.transitions)
예제 #2
0
def main(filename, debug=False):
    'draw the state machine that is in $filename'

    print "Parsing file...   (%s)" % time.ctime()
    machine = fsm.StateMachine(filename)

    print "Building graph... (%s)" % time.ctime()
    despair = object()
    graph_base = u'digraph G {\n%s [label="despair"]\n%%s\n}' % id(despair)
    graph_lines = []
    s2s = {}
    for state in machine.states.values():
        line = "%s [label=%s]" % (id(state), dict2label(state.values))
        graph_lines.append(line)

    for event in machine.events.values():
        for transition in event.draw_transitions:
            if all(map(lambda x: x == "*", transition.target.values())):
                target = despair
            else:
                try:
                    target = machine.get_state(transition.target)
                except KeyError:
                    continue

            l = s2s.setdefault((fsm.hash_dict(transition.source),
                                fsm.hash_dict(transition.target)), [])
            l.append(transition)

    for (source, target), ts in s2s.items():
        try:
            source = machine.get_state(dict(source))
            if all(map(lambda x: x == "*", dict(target).values())):
                target = despair
            else:
                target = machine.get_state(dict(target))
        except KeyError:
            continue
        cases = []
        for t in ts:
            ps = " ".join(["%s:%s" % (k, v) for k, v in t.parameters.items()])
            cases.append("%s:%s" % (t.event, ps))
        line = '%s [label="%s", shape=box, fontsize=7]' % (id(ts),
                                                           "\\n".join(cases))
        graph_lines.append(line)

        arrow = '%s -> %s' % (id(source), id(ts))
        graph_lines.append(arrow)
        arrow = '%s -> %s' % (id(ts), id(target))
        graph_lines.append(arrow)

    dotcode = graph_base % "\n".join(graph_lines)
    if debug:
        filename = tempfile.mkstemp(prefix='graph-', suffix='.debug')
        a = open(filename, "w")
        a.write(dotcode)
        a.close()

    # go for it!
    print "Drawing...        (%s)" % time.ctime()
    window = xdot.DotWindow()
    window.set_dotcode(dotcode)
    window.connect('destroy', gtk.main_quit)
    gtk.main()