// 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 strconv_test

import (
	"os"
	. "strconv"
	"testing"
)

type quoteTest struct {
	in  string
	out string
}

var quotetests = []quoteTest{
	quoteTest{"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`},
	quoteTest{"\\", `"\\"`},
	quoteTest{"abc\xffdef", `"abc\xffdef"`},
	quoteTest{"\u263a", `"\u263a"`},
	quoteTest{"\U0010ffff", `"\U0010ffff"`},
	quoteTest{"\x04", `"\x04"`},
}

func TestQuote(t *testing.T) {
	for i := 0; i < len(quotetests); i++ {
		tt := quotetests[i]
		if out := Quote(tt.in); out != tt.out {
			t.Errorf("Quote(%s) = %s, want %s", tt.in, out, tt.out)
		}
	}
}

type canBackquoteTest struct {
	in  string
	out bool
}

var canbackquotetests = []canBackquoteTest{
	canBackquoteTest{"`", false},
	canBackquoteTest{string(0), false},
	canBackquoteTest{string(1), false},
	canBackquoteTest{string(2), false},
	canBackquoteTest{string(3), false},
	canBackquoteTest{string(4), false},
	canBackquoteTest{string(5), false},
	canBackquoteTest{string(6), false},
	canBackquoteTest{string(7), false},
	canBackquoteTest{string(8), false},
	canBackquoteTest{string(9), true}, // \t
	canBackquoteTest{string(10), false},
	canBackquoteTest{string(11), false},
	canBackquoteTest{string(12), false},
	canBackquoteTest{string(13), false},
	canBackquoteTest{string(14), false},
	canBackquoteTest{string(15), false},
	canBackquoteTest{string(16), false},
	canBackquoteTest{string(17), false},
	canBackquoteTest{string(18), false},
	canBackquoteTest{string(19), false},
	canBackquoteTest{string(20), false},
	canBackquoteTest{string(21), false},
	canBackquoteTest{string(22), false},
	canBackquoteTest{string(23), false},
	canBackquoteTest{string(24), false},
	canBackquoteTest{string(25), false},
	canBackquoteTest{string(26), false},
	canBackquoteTest{string(27), false},
	canBackquoteTest{string(28), false},
	canBackquoteTest{string(29), false},
	canBackquoteTest{string(30), false},
	canBackquoteTest{string(31), false},
	canBackquoteTest{`' !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, true},
	canBackquoteTest{`0123456789`, true},
	canBackquoteTest{`ABCDEFGHIJKLMNOPQRSTUVWXYZ`, true},
	canBackquoteTest{`abcdefghijklmnopqrstuvwxyz`, true},
	canBackquoteTest{`☺`, true},
}

func TestCanBackquote(t *testing.T) {
	for i := 0; i < len(canbackquotetests); i++ {
		tt := canbackquotetests[i]
		if out := CanBackquote(tt.in); out != tt.out {
			t.Errorf("CanBackquote(%q) = %v, want %v", tt.in, out, tt.out)
		}
	}
}

var unquotetests = []quoteTest{
	quoteTest{`""`, ""},
	quoteTest{`"a"`, "a"},
	quoteTest{`"abc"`, "abc"},
	quoteTest{`"☺"`, "☺"},
	quoteTest{`"hello world"`, "hello world"},
	quoteTest{`"\xFF"`, "\xFF"},
	quoteTest{`"\377"`, "\377"},
	quoteTest{`"\u1234"`, "\u1234"},
	quoteTest{`"\U00010111"`, "\U00010111"},
	quoteTest{`"\U0001011111"`, "\U0001011111"},
	quoteTest{`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""},
	quoteTest{`"'"`, "'"},

	quoteTest{`'a'`, "a"},
	quoteTest{`'☹'`, "☹"},
	quoteTest{`'\a'`, "\a"},
	quoteTest{`'\x10'`, "\x10"},
	quoteTest{`'\377'`, "\377"},
	quoteTest{`'\u1234'`, "\u1234"},
	quoteTest{`'\U00010111'`, "\U00010111"},
	quoteTest{`'\t'`, "\t"},
	quoteTest{`' '`, " "},
	quoteTest{`'\''`, "'"},
	quoteTest{`'"'`, "\""},

	quoteTest{"``", ``},
	quoteTest{"`a`", `a`},
	quoteTest{"`abc`", `abc`},
	quoteTest{"`☺`", `☺`},
	quoteTest{"`hello world`", `hello world`},
	quoteTest{"`\\xFF`", `\xFF`},
	quoteTest{"`\\377`", `\377`},
	quoteTest{"`\\`", `\`},
	quoteTest{"`	`", `	`},
	quoteTest{"` `", ` `},
}

var misquoted = []string{
	``,
	`"`,
	`"a`,
	`"'`,
	`b"`,
	`"\"`,
	`'\'`,
	`'ab'`,
	`"\x1!"`,
	`"\U12345678"`,
	`"\z"`,
	"`",
	"`xxx",
	"`\"",
	`"\'"`,
	`'\"'`,
}

func TestUnquote(t *testing.T) {
	for i := 0; i < len(unquotetests); i++ {
		tt := unquotetests[i]
		if out, err := Unquote(tt.in); err != nil && out != tt.out {
			t.Errorf("Unquote(%#q) = %q, %v want %q, nil", tt.in, out, err, tt.out)
		}
	}

	// run the quote tests too, backward
	for i := 0; i < len(quotetests); i++ {
		tt := quotetests[i]
		if in, err := Unquote(tt.out); in != tt.in {
			t.Errorf("Unquote(%#q) = %q, %v, want %q, nil", tt.out, in, err, tt.in)
		}
	}

	for i := 0; i < len(misquoted); i++ {
		s := misquoted[i]
		if out, err := Unquote(s); out != "" || err != os.EINVAL {
			t.Errorf("Unquote(%#q) = %q, %v want %q, %v", s, out, err, "", os.EINVAL)
		}
	}
}
