package protocol

import "bytes"
import "testing"

func mapEqual (left, right Map) bool {
	if len(left) != len(right) { return false }
	
	for key, value := range left {
		if !sliceEqual(value, right[key]) { return false }
	}
	
	return true
}

func TestMap (test *testing.T) {
	var conduit bytes.Buffer
	input := Map {
		"thing1": []string { "asdkjas" },
		"thing2": []string { "ooo" },
		"multivalue": []string { "value 1", "value 2", "value 3" },
		"keysmash": []string { "dsijfhlsdkjfhlkjsahdflkjahsdlfjhsadlkfhaslkdjaslkdjlkashd" },
		"Lorem Ipsum\n": []string {`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Blandit aliquam etiam erat velit scelerisque. Euismod elementum nisi quis eleifend. Lorem ipsum dolor sit amet. Pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Tristique sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula. Lacus vel facilisis volutpat est velit egestas dui id. Mi quis hendrerit dolor magna. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus viverra. Purus gravida quis blandit turpis cursus in hac. Enim nulla aliquet porttitor lacus luctus.
			
			Cras adipiscing enim eu turpis egestas pretium aenean pharetra. Mauris vitae ultricies leo integer malesuada nunc vel risus. Quis enim lobortis scelerisque fermentum dui faucibus in ornare. Amet dictum sit amet justo donec enim diam. Vulputate ut pharetra sit amet. Tellus integer feugiat scelerisque varius morbi enim. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Mauris in aliquam sem fringilla ut. Sagittis id consectetur purus ut faucibus pulvinar elementum integer enim. Fermentum odio eu feugiat pretium nibh. Arcu risus quis varius quam quisque.` },
	}

	err := input.Serialize(&conduit)
	if err != nil {
		test.Fatal(err)
		return
	}
	test.Log("wrote map")
	
	output, err := ReadMap(&conduit)
	if err != nil {
		test.Fatal(err)
		return
	}
	test.Log("read map")
	
	if len(input) != len(output) {
		test.Fatalf("len(input) %d != len(output) %d", len(input), len(output))
		return
	}

	if !mapEqual(input, output) {
		test.Fatal("input != output")
		return
	}
}
