mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 07:37:03 +08:00
graph/encoding: provide attribute handling out of the box
This commit is contained in:
121
graph/encoding/encoding_test.go
Normal file
121
graph/encoding/encoding_test.go
Normal file
@@ -0,0 +1,121 @@
|
||||
// Copyright ©2021 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 encoding
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var setAttributesTests = []struct {
|
||||
attr *Attributes
|
||||
opName string
|
||||
op func(AttributeSetter) error
|
||||
want *Attributes
|
||||
}{
|
||||
{
|
||||
attr: &Attributes{},
|
||||
opName: "noop",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "", Value: "bar"})
|
||||
},
|
||||
want: &Attributes{},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{},
|
||||
opName: "add attr to empty",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "foo", Value: "bar"})
|
||||
},
|
||||
want: &Attributes{{Key: "foo", Value: "bar"}},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{},
|
||||
opName: "remove attr from empty",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "foo", Value: ""})
|
||||
},
|
||||
want: &Attributes{},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}},
|
||||
opName: "add attr to non-empty",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "bif", Value: "fud"})
|
||||
},
|
||||
want: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "fud"}},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}},
|
||||
opName: "remove attr from singleton",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "foo", Value: ""})
|
||||
},
|
||||
want: &Attributes{},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "fud"}},
|
||||
opName: "remove first attr from pair",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "foo", Value: ""})
|
||||
},
|
||||
want: &Attributes{{Key: "bif", Value: "fud"}},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "fud"}},
|
||||
opName: "remove second attr from pair",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "bif", Value: ""})
|
||||
},
|
||||
want: &Attributes{{Key: "foo", Value: "bar"}},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "fud"}},
|
||||
opName: "replace first attr in pair",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "foo", Value: "not bar"})
|
||||
},
|
||||
want: &Attributes{{Key: "foo", Value: "not bar"}, {Key: "bif", Value: "fud"}},
|
||||
},
|
||||
{
|
||||
attr: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "fud"}},
|
||||
opName: "replace second attr in pair",
|
||||
op: func(a AttributeSetter) error {
|
||||
return a.SetAttribute(Attribute{Key: "bif", Value: "not fud"})
|
||||
},
|
||||
want: &Attributes{{Key: "foo", Value: "bar"}, {Key: "bif", Value: "not fud"}},
|
||||
},
|
||||
}
|
||||
|
||||
func TestSetAttributes(t *testing.T) {
|
||||
for _, test := range setAttributesTests {
|
||||
err := test.op(test.attr)
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error for %q: %v", test.opName, err)
|
||||
continue
|
||||
}
|
||||
if !sameAttributes(test.attr, test.want) {
|
||||
t.Errorf("unexpected result from %q:\ngot: %+v\nwant:%+v", test.opName, test.attr, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sameAttributes(a, b Attributer) bool {
|
||||
aAttr := a.Attributes()
|
||||
bAttr := b.Attributes()
|
||||
if len(aAttr) != len(bAttr) {
|
||||
return false
|
||||
}
|
||||
aAttr = append(aAttr[:0:0], aAttr...)
|
||||
sort.Slice(aAttr, func(i, j int) bool { return aAttr[i].Key < aAttr[j].Key })
|
||||
bAttr = append(bAttr[:0:0], bAttr...)
|
||||
sort.Slice(bAttr, func(i, j int) bool { return bAttr[i].Key < bAttr[j].Key })
|
||||
for i, a := range aAttr {
|
||||
if bAttr[i] != a {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
Reference in New Issue
Block a user