| // Copyright ©2018 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sigmajs |
| |
| import ( |
| "encoding/json" |
| "io/ioutil" |
| "path/filepath" |
| "reflect" |
| "testing" |
| ) |
| |
| var sigmajsExampleTests = []struct { |
| path string |
| wantNodes int |
| wantEdges int |
| wantGraph *Graph |
| wantAttributes map[string]bool |
| }{ |
| { |
| path: "geolocalized.json", |
| wantNodes: 17, |
| wantEdges: 35, |
| wantGraph: &Graph{ |
| Nodes: []Node{ |
| { |
| ID: "n1", |
| Attributes: map[string]interface{}{ |
| "label": "n1", |
| "longitude": 2.48, |
| "latitude": 50.93, |
| "size": "5.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n2", |
| Attributes: map[string]interface{}{ |
| "label": "n2", |
| "latitude": 50.88, |
| "longitude": 2.0, |
| "size": "5.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n4", |
| Attributes: map[string]interface{}{ |
| "label": "n4", |
| "latitude": 49.4, |
| "longitude": 0.19, |
| "size": "6.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n5", |
| Attributes: map[string]interface{}{ |
| "label": "n5", |
| "latitude": 48.49, |
| "longitude": -1.92, |
| "size": "6.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n6", |
| Attributes: map[string]interface{}{ |
| "label": "n6", |
| "latitude": 48.26, |
| "longitude": -4.38, |
| "size": "4.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n7", |
| Attributes: map[string]interface{}{ |
| "label": "n7", |
| "latitude": 47.15, |
| "longitude": -2.09, |
| "size": "6.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n8", |
| Attributes: map[string]interface{}{ |
| "label": "n8", |
| "latitude": 46.02, |
| "longitude": -1.04, |
| "size": "6.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n9", |
| Attributes: map[string]interface{}{ |
| "label": "n9", |
| "latitude": 43.22, |
| "longitude": -1.85, |
| "size": "5.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n10", |
| Attributes: map[string]interface{}{ |
| "label": "n10", |
| "latitude": 42.38, |
| "longitude": 3.18, |
| "color": "rgb(1,179,255)", |
| "size": "4.0", |
| }, |
| }, |
| { |
| ID: "n11", |
| Attributes: map[string]interface{}{ |
| "label": "n11", |
| "latitude": 43.47, |
| "longitude": 4.04, |
| "size": "5.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n12", |
| Attributes: map[string]interface{}{ |
| "label": "n12", |
| "latitude": 42.9, |
| "longitude": 6.59, |
| "size": "5.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n13", |
| Attributes: map[string]interface{}{ |
| "label": "n13", |
| "latitude": 43.62, |
| "longitude": 7.66, |
| "size": "6.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n14", |
| Attributes: map[string]interface{}{ |
| "label": "n14", |
| "latitude": 46.05, |
| "longitude": 6.19, |
| "size": "6.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n15", |
| Attributes: map[string]interface{}{ |
| "label": "n15", |
| "latitude": 47.43, |
| "longitude": 7.65, |
| "size": "6.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n16", |
| Attributes: map[string]interface{}{ |
| "label": "n16", |
| "latitude": 48.9, |
| "longitude": 8.32, |
| "size": "5.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "n17", |
| Attributes: map[string]interface{}{ |
| "label": "n17", |
| "latitude": 49.83, |
| "longitude": 4.94, |
| "size": "6.5", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| { |
| ID: "Paris", |
| Attributes: map[string]interface{}{ |
| "label": "Paris", |
| "latitude": 48.72, |
| "longitude": 2.46, |
| "size": "9.0", |
| "color": "rgb(1,179,255)", |
| }, |
| }, |
| }, |
| Edges: []Edge{ |
| {ID: "8", Source: "n1", Target: "Paris"}, |
| {ID: "7", Source: "n2", Target: "n4"}, |
| {ID: "28", Source: "n4", Target: "n1"}, |
| {ID: "30", Source: "n4", Target: "n7"}, |
| {ID: "26", Source: "n5", Target: "n1"}, |
| {ID: "27", Source: "n5", Target: "n2"}, |
| {ID: "0", Source: "n6", Target: "n5"}, |
| {ID: "29", Source: "n7", Target: "n5"}, |
| {ID: "1", Source: "n7", Target: "n8"}, |
| {ID: "17", Source: "n7", Target: "Paris"}, |
| {ID: "10", Source: "n8", Target: "n13"}, |
| {ID: "18", Source: "n8", Target: "Paris"}, |
| {ID: "15", Source: "n9", Target: "n8"}, |
| {ID: "34", Source: "n10", Target: "n9"}, |
| {ID: "31", Source: "n10", Target: "n11"}, |
| {ID: "11", Source: "n11", Target: "n13"}, |
| {ID: "13", Source: "n11", Target: "n14"}, |
| {ID: "32", Source: "n12", Target: "n10"}, |
| {ID: "12", Source: "n12", Target: "n11"}, |
| {ID: "23", Source: "n12", Target: "n13"}, |
| {ID: "33", Source: "n13", Target: "n10"}, |
| {ID: "25", Source: "n13", Target: "n14"}, |
| {ID: "14", Source: "n14", Target: "n9"}, |
| {ID: "5", Source: "n14", Target: "n17"}, |
| {ID: "19", Source: "n14", Target: "Paris"}, |
| {ID: "6", Source: "n15", Target: "n8"}, |
| {ID: "22", Source: "n15", Target: "n16"}, |
| {ID: "20", Source: "n15", Target: "Paris"}, |
| {ID: "4", Source: "n16", Target: "n15"}, |
| {ID: "24", Source: "n16", Target: "Paris"}, |
| {ID: "9", Source: "n17", Target: "n7"}, |
| {ID: "21", Source: "n17", Target: "n17"}, |
| {ID: "2", Source: "Paris", Target: "n4"}, |
| {ID: "3", Source: "Paris", Target: "n17"}, |
| {ID: "16", Source: "Paris", Target: "Paris"}, |
| }, |
| }, |
| }, |
| { |
| path: "arctic.json", |
| wantNodes: 1715, |
| wantEdges: 6676, |
| wantAttributes: map[string]bool{ |
| "label": true, |
| "x": true, |
| "y": true, |
| "color": true, |
| "size": true, |
| "attributes": true, |
| "attributes.nodedef": true, |
| }, |
| }, |
| } |
| |
| func TestUnmarshal(t *testing.T) { |
| for _, test := range sigmajsExampleTests { |
| data, err := ioutil.ReadFile(filepath.Join("testdata", test.path)) |
| if err != nil { |
| t.Errorf("failed to read %q: %v", test.path, err) |
| continue |
| } |
| var got Graph |
| err = json.Unmarshal(data, &got) |
| if err != nil { |
| t.Errorf("failed to unmarshal %q: %v", test.path, err) |
| continue |
| } |
| if len(got.Nodes) != test.wantNodes { |
| t.Errorf("unexpected result for order of %q: got:%d want:%d", test.path, len(got.Nodes), test.wantNodes) |
| } |
| if len(got.Edges) != test.wantEdges { |
| t.Errorf("unexpected result for size of %q: got:%d want:%d", test.path, len(got.Edges), test.wantEdges) |
| } |
| if test.wantGraph != nil && !reflect.DeepEqual(&got, test.wantGraph) { |
| t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, got, test.wantGraph) |
| } |
| if test.wantAttributes != nil { |
| var paths []string |
| for _, n := range got.Nodes { |
| paths = attrPaths(paths, "", n.Attributes) |
| } |
| gotAttrs := make(map[string]bool) |
| for _, p := range paths { |
| gotAttrs[p] = true |
| } |
| if !reflect.DeepEqual(gotAttrs, test.wantAttributes) { |
| t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, gotAttrs, test.wantAttributes) |
| } |
| } |
| } |
| } |
| |
| func attrPaths(dst []string, prefix string, m map[string]interface{}) []string { |
| for k, v := range m { |
| path := prefix |
| if path != "" { |
| path += "." |
| } |
| if v, ok := v.(map[string]interface{}); ok { |
| dst = attrPaths(dst, path+k, v) |
| } |
| dst = append(dst, path+k) |
| } |
| return dst |
| } |
| |
| func TestMarshal(t *testing.T) { |
| for _, test := range sigmajsExampleTests { |
| data, err := ioutil.ReadFile(filepath.Join("testdata", test.path)) |
| if err != nil { |
| t.Errorf("failed to read %q: %v", test.path, err) |
| continue |
| } |
| var want Graph |
| err = json.Unmarshal(data, &want) |
| if err != nil { |
| t.Errorf("failed to unmarshal %q: %v", test.path, err) |
| continue |
| } |
| marshaled, err := json.Marshal(want) |
| if err != nil { |
| t.Errorf("failed to unmarshal %q: %v", test.path, err) |
| continue |
| } |
| var got Graph |
| err = json.Unmarshal(marshaled, &got) |
| if err != nil { |
| t.Errorf("failed to unmarshal %q: %v", test.path, err) |
| continue |
| } |
| if !reflect.DeepEqual(got, want) { |
| t.Errorf("unexpected result for %q:\ngot:\n%#v\nwant:\n%#v", test.path, got, want) |
| } |
| } |
| } |