package irc

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestParseFeatures(t *testing.T) {
	s := NewFeatures()
	featureTransforms["CAKE"] = toInt
	s.Parse([]string{"bob", "CAKE=31", "PIE", ":durr"})
	assert.Equal(t, 31, s.Int("CAKE"))
	assert.Equal(t, "", s.String("CAKE"))
	assert.True(t, s.Has("CAKE"))
	assert.True(t, s.Has("PIE"))
	assert.False(t, s.Has("APPLES"))
	assert.Equal(t, "", s.String("APPLES"))
	assert.Equal(t, 0, s.Int("APPLES"))

	s.Parse([]string{"bob", "-PIE", ":hurr"})
	assert.False(t, s.Has("PIE"))

	s.Parse([]string{"bob", "CAKE=1337", ":durr"})
	assert.Equal(t, 1337, s.Int("CAKE"))

	s.Parse([]string{"bob", "CAKE=", ":durr"})
	assert.Equal(t, "", s.String("CAKE"))
	assert.True(t, s.Has("CAKE"))

	delete(featureTransforms, "CAKE")
	s.Parse([]string{"bob", "CAKE===", ":durr"})
	assert.Equal(t, "==", s.String("CAKE"))

	s.Parse([]string{"bob", "-CAKE=31", ":durr"})
	assert.False(t, s.Has("CAKE"))

	s.Parse([]string{"bob", "CHANLIMIT=#&:50", ":durr"})
	assert.Equal(t, map[string]int{"#": 50, "&": 50}, s.Get("CHANLIMIT"))

	s.Parse([]string{"bob", "CHANLIMIT=#:50,&:25", ":durr"})
	assert.Equal(t, map[string]int{"#": 50, "&": 25}, s.Get("CHANLIMIT"))

	s.Parse([]string{"bob", "CHANLIMIT=&:50,#:", ":durr"})
	assert.Equal(t, map[string]int{"#": 0, "&": 50}, s.Get("CHANLIMIT"))

	s.Parse([]string{"bob", "CHANTYPES=#&", ":durr"})
	assert.Equal(t, []string{"#", "&"}, s.Get("CHANTYPES"))
}