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

package isupport

import (
	"reflect"
	"testing"
)

func TestISUPPORT(t *testing.T) {
	// test multiple output replies
	tListLong := NewList()
	tListLong.AddNoValue("1")
	tListLong.AddNoValue("2")
	tListLong.AddNoValue("3")
	tListLong.AddNoValue("4")
	tListLong.AddNoValue("5")
	tListLong.AddNoValue("6")
	tListLong.AddNoValue("7")
	tListLong.AddNoValue("8")
	tListLong.AddNoValue("9")
	tListLong.AddNoValue("A")
	tListLong.AddNoValue("B")
	tListLong.AddNoValue("C")
	tListLong.AddNoValue("D")
	tListLong.AddNoValue("E")
	tListLong.AddNoValue("F")
	err := tListLong.RegenerateCachedReply()
	if err != nil {
		t.Error(err)
	}

	longReplies := [][]string{
		{"1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"},
		{"E", "F"},
	}

	if !reflect.DeepEqual(tListLong.CachedReply, longReplies) {
		t.Errorf("Multiple output replies did not match, got [%v]", longReplies)
	}

	// create first list
	tList1 := NewList()
	tList1.Add("SASL", "yes")
	tList1.Add("CASEMAPPING", "rfc1459-strict")
	tList1.Add("INVEX", "i")
	tList1.AddNoValue("EXTBAN")
	tList1.Add("RANDKILL", "whenever")
	err = tList1.RegenerateCachedReply()
	if err != nil {
		t.Error(err)
	}

	expected := [][]string{{"CASEMAPPING=rfc1459-strict", "EXTBAN", "INVEX=i", "RANDKILL=whenever", "SASL=yes"}}
	if !reflect.DeepEqual(tList1.CachedReply, expected) {
		t.Error("tList1's cached reply does not match expected cached reply")
	}

	// create second list
	tList2 := NewList()
	tList2.Add("SASL", "yes")
	tList2.Add("CASEMAPPING", "ascii")
	tList2.AddNoValue("INVEX")
	tList2.Add("EXTBAN", "TestBah")
	tList2.AddNoValue("STABLEKILL")
	err = tList2.RegenerateCachedReply()
	if err != nil {
		t.Error(err)
	}

	expected = [][]string{{"CASEMAPPING=ascii", "EXTBAN=TestBah", "INVEX", "SASL=yes", "STABLEKILL"}}
	if !reflect.DeepEqual(tList2.CachedReply, expected) {
		t.Error("tList2's cached reply does not match expected cached reply")
	}

	// compare lists
	actual := tList1.GetDifference(tList2)
	expected = [][]string{{"-RANDKILL", "CASEMAPPING=ascii", "EXTBAN=TestBah", "INVEX", "STABLEKILL"}}
	if !reflect.DeepEqual(actual, expected) {
		t.Error("difference reply does not match expected difference reply")
	}
}

func TestBadToken(t *testing.T) {
	list := NewList()
	list.Add("NETWORK", "Bad Network Name")
	list.Add("SASL", "yes")
	list.Add("CASEMAPPING", "rfc1459-strict")
	list.Add("INVEX", "i")
	list.AddNoValue("EXTBAN")

	err := list.RegenerateCachedReply()
	if err == nil {
		t.Error("isupport token generation should fail due to space in network name")
	}

	// should produce a list containing the other, valid params
	numParams := 0
	for _, tokenLine := range list.CachedReply {
		numParams += len(tokenLine)
	}
	if numParams != 4 {
		t.Errorf("expected the other 4 params to be generated, got %v", list.CachedReply)
	}
}