gonum.org/v1/gonum@v0.14.0/graph/formats/sigmajs/sigmajs_test.go (about) 1 // Copyright ©2018 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package sigmajs 6 7 import ( 8 "encoding/json" 9 "os" 10 "path/filepath" 11 "reflect" 12 "testing" 13 ) 14 15 var sigmajsExampleTests = []struct { 16 path string 17 wantNodes int 18 wantEdges int 19 wantGraph *Graph 20 wantAttributes map[string]bool 21 }{ 22 { 23 path: "geolocalized.json", 24 wantNodes: 17, 25 wantEdges: 35, 26 wantGraph: &Graph{ 27 Nodes: []Node{ 28 { 29 ID: "n1", 30 Attributes: map[string]interface{}{ 31 "label": "n1", 32 "longitude": 2.48, 33 "latitude": 50.93, 34 "size": "5.5", 35 "color": "rgb(1,179,255)", 36 }, 37 }, 38 { 39 ID: "n2", 40 Attributes: map[string]interface{}{ 41 "label": "n2", 42 "latitude": 50.88, 43 "longitude": 2.0, 44 "size": "5.0", 45 "color": "rgb(1,179,255)", 46 }, 47 }, 48 { 49 ID: "n4", 50 Attributes: map[string]interface{}{ 51 "label": "n4", 52 "latitude": 49.4, 53 "longitude": 0.19, 54 "size": "6.0", 55 "color": "rgb(1,179,255)", 56 }, 57 }, 58 { 59 ID: "n5", 60 Attributes: map[string]interface{}{ 61 "label": "n5", 62 "latitude": 48.49, 63 "longitude": -1.92, 64 "size": "6.0", 65 "color": "rgb(1,179,255)", 66 }, 67 }, 68 { 69 ID: "n6", 70 Attributes: map[string]interface{}{ 71 "label": "n6", 72 "latitude": 48.26, 73 "longitude": -4.38, 74 "size": "4.5", 75 "color": "rgb(1,179,255)", 76 }, 77 }, 78 { 79 ID: "n7", 80 Attributes: map[string]interface{}{ 81 "label": "n7", 82 "latitude": 47.15, 83 "longitude": -2.09, 84 "size": "6.5", 85 "color": "rgb(1,179,255)", 86 }, 87 }, 88 { 89 ID: "n8", 90 Attributes: map[string]interface{}{ 91 "label": "n8", 92 "latitude": 46.02, 93 "longitude": -1.04, 94 "size": "6.5", 95 "color": "rgb(1,179,255)", 96 }, 97 }, 98 { 99 ID: "n9", 100 Attributes: map[string]interface{}{ 101 "label": "n9", 102 "latitude": 43.22, 103 "longitude": -1.85, 104 "size": "5.0", 105 "color": "rgb(1,179,255)", 106 }, 107 }, 108 { 109 ID: "n10", 110 Attributes: map[string]interface{}{ 111 "label": "n10", 112 "latitude": 42.38, 113 "longitude": 3.18, 114 "color": "rgb(1,179,255)", 115 "size": "4.0", 116 }, 117 }, 118 { 119 ID: "n11", 120 Attributes: map[string]interface{}{ 121 "label": "n11", 122 "latitude": 43.47, 123 "longitude": 4.04, 124 "size": "5.5", 125 "color": "rgb(1,179,255)", 126 }, 127 }, 128 { 129 ID: "n12", 130 Attributes: map[string]interface{}{ 131 "label": "n12", 132 "latitude": 42.9, 133 "longitude": 6.59, 134 "size": "5.0", 135 "color": "rgb(1,179,255)", 136 }, 137 }, 138 { 139 ID: "n13", 140 Attributes: map[string]interface{}{ 141 "label": "n13", 142 "latitude": 43.62, 143 "longitude": 7.66, 144 "size": "6.0", 145 "color": "rgb(1,179,255)", 146 }, 147 }, 148 { 149 ID: "n14", 150 Attributes: map[string]interface{}{ 151 "label": "n14", 152 "latitude": 46.05, 153 "longitude": 6.19, 154 "size": "6.5", 155 "color": "rgb(1,179,255)", 156 }, 157 }, 158 { 159 ID: "n15", 160 Attributes: map[string]interface{}{ 161 "label": "n15", 162 "latitude": 47.43, 163 "longitude": 7.65, 164 "size": "6.0", 165 "color": "rgb(1,179,255)", 166 }, 167 }, 168 { 169 ID: "n16", 170 Attributes: map[string]interface{}{ 171 "label": "n16", 172 "latitude": 48.9, 173 "longitude": 8.32, 174 "size": "5.5", 175 "color": "rgb(1,179,255)", 176 }, 177 }, 178 { 179 ID: "n17", 180 Attributes: map[string]interface{}{ 181 "label": "n17", 182 "latitude": 49.83, 183 "longitude": 4.94, 184 "size": "6.5", 185 "color": "rgb(1,179,255)", 186 }, 187 }, 188 { 189 ID: "Paris", 190 Attributes: map[string]interface{}{ 191 "label": "Paris", 192 "latitude": 48.72, 193 "longitude": 2.46, 194 "size": "9.0", 195 "color": "rgb(1,179,255)", 196 }, 197 }, 198 }, 199 Edges: []Edge{ 200 {ID: "8", Source: "n1", Target: "Paris"}, 201 {ID: "7", Source: "n2", Target: "n4"}, 202 {ID: "28", Source: "n4", Target: "n1"}, 203 {ID: "30", Source: "n4", Target: "n7"}, 204 {ID: "26", Source: "n5", Target: "n1"}, 205 {ID: "27", Source: "n5", Target: "n2"}, 206 {ID: "0", Source: "n6", Target: "n5"}, 207 {ID: "29", Source: "n7", Target: "n5"}, 208 {ID: "1", Source: "n7", Target: "n8"}, 209 {ID: "17", Source: "n7", Target: "Paris"}, 210 {ID: "10", Source: "n8", Target: "n13"}, 211 {ID: "18", Source: "n8", Target: "Paris"}, 212 {ID: "15", Source: "n9", Target: "n8"}, 213 {ID: "34", Source: "n10", Target: "n9"}, 214 {ID: "31", Source: "n10", Target: "n11"}, 215 {ID: "11", Source: "n11", Target: "n13"}, 216 {ID: "13", Source: "n11", Target: "n14"}, 217 {ID: "32", Source: "n12", Target: "n10"}, 218 {ID: "12", Source: "n12", Target: "n11"}, 219 {ID: "23", Source: "n12", Target: "n13"}, 220 {ID: "33", Source: "n13", Target: "n10"}, 221 {ID: "25", Source: "n13", Target: "n14"}, 222 {ID: "14", Source: "n14", Target: "n9"}, 223 {ID: "5", Source: "n14", Target: "n17"}, 224 {ID: "19", Source: "n14", Target: "Paris"}, 225 {ID: "6", Source: "n15", Target: "n8"}, 226 {ID: "22", Source: "n15", Target: "n16"}, 227 {ID: "20", Source: "n15", Target: "Paris"}, 228 {ID: "4", Source: "n16", Target: "n15"}, 229 {ID: "24", Source: "n16", Target: "Paris"}, 230 {ID: "9", Source: "n17", Target: "n7"}, 231 {ID: "21", Source: "n17", Target: "n17"}, 232 {ID: "2", Source: "Paris", Target: "n4"}, 233 {ID: "3", Source: "Paris", Target: "n17"}, 234 {ID: "16", Source: "Paris", Target: "Paris"}, 235 }, 236 }, 237 }, 238 { 239 path: "arctic.json", 240 wantNodes: 1715, 241 wantEdges: 6676, 242 wantAttributes: map[string]bool{ 243 "label": true, 244 "x": true, 245 "y": true, 246 "color": true, 247 "size": true, 248 "attributes": true, 249 "attributes.nodedef": true, 250 }, 251 }, 252 } 253 254 func TestUnmarshal(t *testing.T) { 255 for _, test := range sigmajsExampleTests { 256 data, err := os.ReadFile(filepath.Join("testdata", test.path)) 257 if err != nil { 258 t.Errorf("failed to read %q: %v", test.path, err) 259 continue 260 } 261 var got Graph 262 err = json.Unmarshal(data, &got) 263 if err != nil { 264 t.Errorf("failed to unmarshal %q: %v", test.path, err) 265 continue 266 } 267 if len(got.Nodes) != test.wantNodes { 268 t.Errorf("unexpected result for order of %q: got:%d want:%d", test.path, len(got.Nodes), test.wantNodes) 269 } 270 if len(got.Edges) != test.wantEdges { 271 t.Errorf("unexpected result for size of %q: got:%d want:%d", test.path, len(got.Edges), test.wantEdges) 272 } 273 if test.wantGraph != nil && !reflect.DeepEqual(&got, test.wantGraph) { 274 t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, got, test.wantGraph) 275 } 276 if test.wantAttributes != nil { 277 var paths []string 278 for _, n := range got.Nodes { 279 paths = attrPaths(paths, "", n.Attributes) 280 } 281 gotAttrs := make(map[string]bool) 282 for _, p := range paths { 283 gotAttrs[p] = true 284 } 285 if !reflect.DeepEqual(gotAttrs, test.wantAttributes) { 286 t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, gotAttrs, test.wantAttributes) 287 } 288 } 289 } 290 } 291 292 func attrPaths(dst []string, prefix string, m map[string]interface{}) []string { 293 for k, v := range m { 294 path := prefix 295 if path != "" { 296 path += "." 297 } 298 if v, ok := v.(map[string]interface{}); ok { 299 dst = attrPaths(dst, path+k, v) 300 } 301 dst = append(dst, path+k) 302 } 303 return dst 304 } 305 306 func TestMarshal(t *testing.T) { 307 for _, test := range sigmajsExampleTests { 308 data, err := os.ReadFile(filepath.Join("testdata", test.path)) 309 if err != nil { 310 t.Errorf("failed to read %q: %v", test.path, err) 311 continue 312 } 313 var want Graph 314 err = json.Unmarshal(data, &want) 315 if err != nil { 316 t.Errorf("failed to unmarshal %q: %v", test.path, err) 317 continue 318 } 319 marshaled, err := json.Marshal(want) 320 if err != nil { 321 t.Errorf("failed to unmarshal %q: %v", test.path, err) 322 continue 323 } 324 var got Graph 325 err = json.Unmarshal(marshaled, &got) 326 if err != nil { 327 t.Errorf("failed to unmarshal %q: %v", test.path, err) 328 continue 329 } 330 if !reflect.DeepEqual(got, want) { 331 t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, got, want) 332 } 333 } 334 }