// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license

package caps

import "testing"
import "reflect"

func TestSets(t *testing.T) {
	s1 := NewSet()

	s1.Enable(AccountTag, EchoMessage, UserhostInNames)

	if !s1.Has(AccountTag, EchoMessage, UserhostInNames) {
		t.Error("Did not have the tags we expected")
	}

	if s1.Has(AccountTag, EchoMessage, STS, UserhostInNames) {
		t.Error("Has() returned true when we don't have all the given capabilities")
	}

	s1.Disable(AccountTag)

	if s1.Has(AccountTag) {
		t.Error("Disable() did not correctly disable the given capability")
	}

	enabledCaps := make(map[Capability]bool)
	for _, capab := range s1.List() {
		enabledCaps[capab] = true
	}
	expectedCaps := map[Capability]bool{
		EchoMessage:     true,
		UserhostInNames: true,
	}
	if !reflect.DeepEqual(enabledCaps, expectedCaps) {
		t.Errorf("Enabled and expected capability lists do not match: %v, %v", enabledCaps, expectedCaps)
	}

	// make sure re-enabling doesn't add to the count or something weird like that
	s1.Enable(EchoMessage)

	if s1.Count() != 2 {
		t.Error("Count() did not match expected capability count")
	}

	// make sure add and remove work fine
	s1.Add(InviteNotify)
	s1.Remove(EchoMessage)

	if s1.Count() != 2 {
		t.Error("Count() did not match expected capability count")
	}

	// test String()
	values := NewValues()
	values.Set(InviteNotify, "invitemepls")

	actualCap301ValuesString := s1.String(Cap301, values)
	expectedCap301ValuesString := "invite-notify userhost-in-names"
	if actualCap301ValuesString != expectedCap301ValuesString {
		t.Errorf("Generated Cap301 values string [%s] did not match expected values string [%s]", actualCap301ValuesString, expectedCap301ValuesString)
	}

	actualCap302ValuesString := s1.String(Cap302, values)
	expectedCap302ValuesString := "invite-notify=invitemepls userhost-in-names"
	if actualCap302ValuesString != expectedCap302ValuesString {
		t.Errorf("Generated Cap302 values string [%s] did not match expected values string [%s]", actualCap302ValuesString, expectedCap302ValuesString)
	}
}