@@ -152,21 +152,21 @@ func vtaGraphStr(g vtaGraph) []string {
152
152
return vgs
153
153
}
154
154
155
- // subGraph checks if a graph `g1` is a subgraph of graph `g2`.
156
- // Assumes that each element in `g1` and `g2` is an edge set
157
- // for a particular node in a fixed yet arbitrary format.
158
- func subGraph (g1 , g2 []string ) bool {
159
- m := make (map [string ]bool )
160
- for _ , s := range g2 {
161
- m [s ] = true
155
+ // setdiff returns the set difference of `X-Y` or {s | s ∈ X, s ∉ Y }.
156
+ func setdiff (X , Y []string ) []string {
157
+ y := make (map [string ]bool )
158
+ var delta []string
159
+ for _ , s := range Y {
160
+ y [s ] = true
162
161
}
163
162
164
- for _ , s := range g1 {
165
- if _ , ok := m [s ]; ! ok {
166
- return false
163
+ for _ , s := range X {
164
+ if _ , ok := y [s ]; ! ok {
165
+ delta = append ( delta , s )
167
166
}
168
167
}
169
- return true
168
+ sort .Strings (delta )
169
+ return delta
170
170
}
171
171
172
172
func TestVTAGraphConstruction (t * testing.T ) {
@@ -201,8 +201,9 @@ func TestVTAGraphConstruction(t *testing.T) {
201
201
}
202
202
203
203
g , _ := typePropGraph (ssautil .AllFunctions (prog ), cha .CallGraph (prog ))
204
- if gs := vtaGraphStr (g ); ! subGraph (want , gs ) {
205
- t .Errorf ("`%s`: want superset of %v;\n got %v" , file , want , gs )
204
+ got := vtaGraphStr (g )
205
+ if diff := setdiff (want , got ); len (diff ) > 0 {
206
+ t .Errorf ("`%s`: want superset of %v;\n got %v\n diff: %v" , file , want , got , diff )
206
207
}
207
208
})
208
209
}
0 commit comments