package model import ( "strings" "testing" ) func TestScopedOptionsOrder(t *testing.T) { s := NewState() add := func(scope string, names ...string) { for i, n := range names { id := int64(len(s.Options) + 1) s.Options[id] = &Option{ID: id, Scope: scope, Name: n, Position: i} } } // Added in an arbitrary order; listen-on twice. add(ScopeView, "zzz-unknown", "forwarders", "listen-on", "recursion", "dnssec-validation", "aaa-unknown", "allow-query", "forward", "directory", "listen-on", "allow-transfer") var got []string for _, o := range s.ScopedOptions(ScopeView, 0) { got = append(got, o.Name) } want := "directory listen-on listen-on allow-query forward forwarders recursion dnssec-validation allow-transfer aaa-unknown zzz-unknown" if strings.Join(got, " ") != want { t.Errorf("order:\n got %s\nwant %s", strings.Join(got, " "), want) } // An option given twice keeps the order it was added in. l := s.ScopedOptions(ScopeView, 0) if l[1].Position > l[2].Position { t.Error("repeated listen-on swapped") } // Top-level statements stay as entered. add(ScopeTopLevel, "logging", "acl", "key") got = nil for _, o := range s.ScopedOptions(ScopeTopLevel, 0) { got = append(got, o.Name) } if strings.Join(got, " ") != "logging acl key" { t.Errorf("top level: %v", got) } }