Skip to content

Commit 30a7b0c

Browse files
authored
Merge pull request #84 from qmuntal/accum
graph: deduplicate similar lines
2 parents ad13c0f + cb02f26 commit 30a7b0c

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

assets/phone-graph.png

-2.62 KB
Loading

go.sum

Whitespace-only changes.

graph.go

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,35 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
123123
return fmt.Sprint(ti) < fmt.Sprint(tj)
124124
})
125125

126+
type line struct {
127+
source State
128+
destination State
129+
}
130+
131+
lines := make(map[line][]string, len(triggerList))
132+
order := make([]line, 0, len(triggerList))
126133
for _, trigger := range triggerList {
127134
switch t := trigger.(type) {
128135
case *ignoredTriggerBehaviour:
129-
sb.WriteString(g.formatOneTransition(sm, sr.State, sr.State, t.Trigger, nil, t.Guard))
136+
ln := line{sr.State, sr.State}
137+
if _, ok := lines[ln]; !ok {
138+
order = append(order, ln)
139+
}
140+
lines[ln] = append(lines[ln], g.formatOneTransition(t.Trigger, nil, t.Guard))
130141
case *reentryTriggerBehaviour:
131142
actions := g.getEntryActions(sr.EntryActions, t.Trigger)
132-
sb.WriteString(g.formatOneTransition(sm, sr.State, t.Destination, t.Trigger, actions, t.Guard))
143+
ln := line{sr.State, t.Destination}
144+
if _, ok := lines[ln]; !ok {
145+
order = append(order, ln)
146+
}
147+
lines[ln] = append(lines[ln], g.formatOneTransition(t.Trigger, actions, t.Guard))
133148
case *internalTriggerBehaviour:
134149
actions := g.getEntryActions(sr.EntryActions, t.Trigger)
135-
sb.WriteString(g.formatOneTransition(sm, sr.State, sr.State, t.Trigger, actions, t.Guard))
150+
ln := line{sr.State, sr.State}
151+
if _, ok := lines[ln]; !ok {
152+
order = append(order, ln)
153+
}
154+
lines[ln] = append(lines[ln], g.formatOneTransition(t.Trigger, actions, t.Guard))
136155
case *transitioningTriggerBehaviour:
137156
src := sm.stateConfig[sr.State]
138157
if src == nil {
@@ -149,15 +168,25 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
149168
} else {
150169
destState = dest.State
151170
}
152-
sb.WriteString(g.formatOneTransition(sm, src.State, destState, t.Trigger, actions, t.Guard))
171+
ln := line{sr.State, destState}
172+
if _, ok := lines[ln]; !ok {
173+
order = append(order, ln)
174+
}
175+
lines[ln] = append(lines[ln], g.formatOneTransition(t.Trigger, actions, t.Guard))
153176
case *dynamicTriggerBehaviour:
154177
// TODO: not supported yet
155178
}
156179
}
180+
181+
for _, ln := range order {
182+
content := lines[ln]
183+
sb.WriteString(g.formatOneLine(str(ln.source, true), str(ln.destination, true), strings.Join(content, "\\n")))
184+
}
185+
157186
return sb.String()
158187
}
159188

160-
func (g *graph) formatOneTransition(sm *StateMachine, source, destination State, trigger Trigger, actions []string, guards transitionGuard) string {
189+
func (g *graph) formatOneTransition(trigger Trigger, actions []string, guards transitionGuard) string {
161190
var sb strings.Builder
162191
sb.WriteString(str(trigger, false))
163192
if len(actions) > 0 {
@@ -170,7 +199,7 @@ func (g *graph) formatOneTransition(sm *StateMachine, source, destination State,
170199
}
171200
sb.WriteString(fmt.Sprintf("[%s]", esc(info.Description.String(), false)))
172201
}
173-
return g.formatOneLine(str(source, true), str(destination, true), sb.String())
202+
return sb.String()
174203
}
175204

176205
func (g *graph) formatOneLine(fromNodeName, toNodeName, label string) string {

graph_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ func TestStateMachine_ToGraph(t *testing.T) {
139139
got := fn().ToGraph()
140140
name := "testdata/golden/" + name + ".dot"
141141
want, err := os.ReadFile(name)
142+
want = bytes.ReplaceAll(want, []byte("\r\n"), []byte("\n"))
142143
if *update {
143144
if !bytes.Equal([]byte(got), want) {
144145
os.WriteFile(name, []byte(got), 0666)
@@ -147,6 +148,9 @@ func TestStateMachine_ToGraph(t *testing.T) {
147148
if err != nil {
148149
t.Fatal(err)
149150
}
151+
if !bytes.Equal([]byte(got), want) {
152+
t.Fatalf("got:\n%swant:\n%s", got, want)
153+
}
150154
}
151155
})
152156
}

testdata/golden/phoneCall.dot

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@ digraph {
77
subgraph cluster_Connected {
88
label="Substates of\nConnected";
99
style="dashed";
10-
OnHold [label="OnHold"];
10+
OnHold [label="OnHold|exit / func6"];
1111
}
1212
OffHook [label="OffHook"];
1313
Ringing [label="Ringing"];
1414
Connected -> OffHook [label="LeftMessage"];
15-
Connected -> Connected [label="MuteMicrophone"];
15+
Connected -> Connected [label="MuteMicrophone\nSetVolume\nUnmuteMicrophone"];
1616
Connected -> OnHold [label="PlacedOnHold"];
17-
Connected -> Connected [label="SetVolume"];
18-
Connected -> Connected [label="UnmuteMicrophone"];
1917
OffHook -> Ringing [label="CallDialed / func1"];
2018
OnHold -> PhoneDestroyed [label="PhoneHurledAgainstWall"];
2119
OnHold -> Connected [label="TakenOffHold"];

0 commit comments

Comments
 (0)