// Copyright 2013 Frank Schroeder. All rights reserved. MIT licensed.

package properties

import (
	"fmt"
	"strings"
	"testing"

	. "github.scm.corp.ebay.com/ecg-marktplaats/cas-go/third_party/launchpad.net/gocheck"
)

func Test(t *testing.T) { TestingT(t) }

type LoadSuite struct{}

var _ = Suite(&LoadSuite{})

func (l *LoadSuite) TestKeyWithEmptyValue(c *C) {
	testAllDelimiterCombinations(c, "key", "")
}

func (l *LoadSuite) TestOneKeyValue(c *C) {
	testAllDelimiterCombinations(c, "key", "value")
}

func (l *LoadSuite) TestTwoKeysAndValues(c *C) {
	testKeyValue(c, "key1=value1\nkey2=value2", "key1", "value1", "key2", "value2")
}

func (l *LoadSuite) TestWithBlankLines(c *C) {
	testKeyValue(c, "\n\nkey=value\n\n", "key", "value")
}

func (l *LoadSuite) TestWithComments(c *C) {
	input := `
# this is a comment
! and so is this
key1=value1
key#2=value#2
key!3=value!3
# and another one
! and the final one
`
	testKeyValue(c, input, "key1", "value1", "key#2", "value#2", "key!3", "value!3")
}

func (l *LoadSuite) TestValueWithTrailingSpaces(c *C) {
	testAllDelimiterCombinations(c, "key", "value   ")
}

func (l *LoadSuite) TestEscapedCharsInKey(c *C) {
	testKeyValue(c, "k\\ e\\:y\\= = value", "k e:y=", "value")
}

func (l *LoadSuite) TestUnicodeLiteralInKey(c *C) {
	testKeyValue(c, "key\\u2318 = value", "key⌘", "value")
	testKeyValue(c, "key\\U2318 = value", "key⌘", "value")
}

func (l *LoadSuite) TestEscapedCharsInValue(c *C) {
	testKeyValue(c, "key = v\\ a\\:lu\\=e\\n\\r\\t", "key", "v a:lu=e\n\r\t")
}

func (l *LoadSuite) TestMultilineValue(c *C) {
	testKeyValue(c, "key = valueA,\\\n    valueB", "key", "valueA,valueB")
}

func (l *LoadSuite) TestFailWithPrematureEOF(c *C) {
	testError(c, "key", "premature EOF")
}

func (l *LoadSuite) TestFailWithNonISO8859_1Input(c *C) {
	testError(c, "key₡", "invalid ISO-8859-1 input")
}

func (l *LoadSuite) TestFailWithInvalidUnicodeLiteralInKey(c *C) {
	testError(c, "key\\ugh32 = value", "invalid unicode literal")
}

func BenchmarkNewPropertiesFromString(b *testing.B) {
	input := ""
	for i := 0; i < 1000; i++ {
		input += fmt.Sprintf("key%d=value%d\n", i, i)
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		NewPropertiesFromString(input)
	}
}

// tests all combinations of delimiters plus leading and/or trailing spaces.
func testAllDelimiterCombinations(c *C, key, value string) {
	delimiters := []string{"=", " =", "= ", " = ", ":", " :", ": ", " : "}
	for _, delim := range delimiters {
		testKeyValue(c, fmt.Sprintf("%s%s%s", key, delim, value), key, value)
		testKeyValue(c, fmt.Sprintf("%s%s%s\n", key, delim, value), key, value)
	}
}

// tests key/value pairs for a given input.
func testKeyValue(c *C, input string, keyvalues ...string) {
	p, err := NewPropertiesFromString(input)
	c.Assert(err, IsNil)
	c.Assert(p, NotNil)
	c.Assert(p.Len(), Equals, len(keyvalues)/2)
	for i := 0; i < len(keyvalues)/2; i += 2 {
		assertKeyValue(c, p, keyvalues[i], keyvalues[i+1])
	}
}

// tests whether a given input produces a given error message.
func testError(c *C, input, msg string) {
	_, err := NewPropertiesFromString(input)
	c.Assert(err, NotNil)
	c.Assert(strings.Contains(err.Error(), msg), Equals, true)
}

func assertKeyValue(c *C, p *Properties, key, value string) {
	v, ok := p.Get(key)
	c.Assert(ok, Equals, true)
	c.Assert(v, Equals, value)
}
