// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package http

import (
	"testing"
)

type lexTest struct {
	Raw    string
	Parsed int // # of parsed characters
	Result []string
}

var lexTests = []lexTest{
	lexTest{
		Raw:    `"abc"def,:ghi`,
		Parsed: 13,
		Result: []string{"abcdef", "ghi"},
	},
	// My understanding of the RFC is that escape sequences outside of
	// quotes are not interpreted?
	lexTest{
		Raw:    `"\t"\t"\t"`,
		Parsed: 10,
		Result: []string{"\t", "t\t"},
	},
	lexTest{
		Raw:    `"\yab"\r\n`,
		Parsed: 10,
		Result: []string{"?ab", "r", "n"},
	},
	lexTest{
		Raw:    "ab\f",
		Parsed: 3,
		Result: []string{"ab?"},
	},
	lexTest{
		Raw:    "\"ab \" c,de f, gh, ij\n\t\r",
		Parsed: 23,
		Result: []string{"ab ", "c", "de", "f", "gh", "ij"},
	},
}

func min(x, y int) int {
	if x <= y {
		return x
	}
	return y
}

func TestSplitFieldValue(t *testing.T) {
	for k, l := range lexTests {
		parsed, result := httpSplitFieldValue(l.Raw)
		if parsed != l.Parsed {
			t.Errorf("#%d: Parsed %d, expected %d", k, parsed, l.Parsed)
		}
		if len(result) != len(l.Result) {
			t.Errorf("#%d: Result len  %d, expected %d", k, len(result), len(l.Result))
		}
		for i := 0; i < min(len(result), len(l.Result)); i++ {
			if result[i] != l.Result[i] {
				t.Errorf("#%d: %d-th entry mismatch. Have {%s}, expect {%s}",
					k, i, result[i], l.Result[i])
			}
		}
	}
}
