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