// 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 }