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

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);
		}
	}
}
