| // 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 ( | 
 | 	. "strconv" | 
 | 	"testing" | 
 | 	"unicode" | 
 | ) | 
 |  | 
 | // Verify that our isPrint agrees with unicode.IsPrint | 
 | func TestIsPrint(t *testing.T) { | 
 | 	n := 0 | 
 | 	for r := rune(0); r <= unicode.MaxRune; r++ { | 
 | 		if IsPrint(r) != unicode.IsPrint(r) { | 
 | 			t.Errorf("IsPrint(%U)=%t incorrect", r, IsPrint(r)) | 
 | 			n++ | 
 | 			if n > 10 { | 
 | 				return | 
 | 			} | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | type quoteTest struct { | 
 | 	in    string | 
 | 	out   string | 
 | 	ascii string | 
 | } | 
 |  | 
 | var quotetests = []quoteTest{ | 
 | 	{"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`, `"\a\b\f\r\n\t\v"`}, | 
 | 	{"\\", `"\\"`, `"\\"`}, | 
 | 	{"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`}, | 
 | 	{"\u263a", `"☺"`, `"\u263a"`}, | 
 | 	{"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`}, | 
 | 	{"\x04", `"\x04"`, `"\x04"`}, | 
 | } | 
 |  | 
 | func TestQuote(t *testing.T) { | 
 | 	for _, tt := range quotetests { | 
 | 		if out := Quote(tt.in); out != tt.out { | 
 | 			t.Errorf("Quote(%s) = %s, want %s", tt.in, out, tt.out) | 
 | 		} | 
 | 		if out := AppendQuote([]byte("abc"), tt.in); string(out) != "abc"+tt.out { | 
 | 			t.Errorf("AppendQuote(%q, %s) = %s, want %s", "abc", tt.in, out, "abc"+tt.out) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func TestQuoteToASCII(t *testing.T) { | 
 | 	for _, tt := range quotetests { | 
 | 		if out := QuoteToASCII(tt.in); out != tt.ascii { | 
 | 			t.Errorf("QuoteToASCII(%s) = %s, want %s", tt.in, out, tt.ascii) | 
 | 		} | 
 | 		if out := AppendQuoteToASCII([]byte("abc"), tt.in); string(out) != "abc"+tt.ascii { | 
 | 			t.Errorf("AppendQuoteToASCII(%q, %s) = %s, want %s", "abc", tt.in, out, "abc"+tt.ascii) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | type quoteRuneTest struct { | 
 | 	in    rune | 
 | 	out   string | 
 | 	ascii string | 
 | } | 
 |  | 
 | var quoterunetests = []quoteRuneTest{ | 
 | 	{'a', `'a'`, `'a'`}, | 
 | 	{'\a', `'\a'`, `'\a'`}, | 
 | 	{'\\', `'\\'`, `'\\'`}, | 
 | 	{0xFF, `'ÿ'`, `'\u00ff'`}, | 
 | 	{0x263a, `'☺'`, `'\u263a'`}, | 
 | 	{0xfffd, `'�'`, `'\ufffd'`}, | 
 | 	{0x0010ffff, `'\U0010ffff'`, `'\U0010ffff'`}, | 
 | 	{0x0010ffff + 1, `'�'`, `'\ufffd'`}, | 
 | 	{0x04, `'\x04'`, `'\x04'`}, | 
 | } | 
 |  | 
 | func TestQuoteRune(t *testing.T) { | 
 | 	for _, tt := range quoterunetests { | 
 | 		if out := QuoteRune(tt.in); out != tt.out { | 
 | 			t.Errorf("QuoteRune(%U) = %s, want %s", tt.in, out, tt.out) | 
 | 		} | 
 | 		if out := AppendQuoteRune([]byte("abc"), tt.in); string(out) != "abc"+tt.out { | 
 | 			t.Errorf("AppendQuoteRune(%q, %U) = %s, want %s", "abc", tt.in, out, "abc"+tt.out) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func TestQuoteRuneToASCII(t *testing.T) { | 
 | 	for _, tt := range quoterunetests { | 
 | 		if out := QuoteRuneToASCII(tt.in); out != tt.ascii { | 
 | 			t.Errorf("QuoteRuneToASCII(%U) = %s, want %s", tt.in, out, tt.ascii) | 
 | 		} | 
 | 		if out := AppendQuoteRuneToASCII([]byte("abc"), tt.in); string(out) != "abc"+tt.ascii { | 
 | 			t.Errorf("AppendQuoteRuneToASCII(%q, %U) = %s, want %s", "abc", tt.in, out, "abc"+tt.ascii) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | type canBackquoteTest struct { | 
 | 	in  string | 
 | 	out bool | 
 | } | 
 |  | 
 | var canbackquotetests = []canBackquoteTest{ | 
 | 	{"`", false}, | 
 | 	{string(0), false}, | 
 | 	{string(1), false}, | 
 | 	{string(2), false}, | 
 | 	{string(3), false}, | 
 | 	{string(4), false}, | 
 | 	{string(5), false}, | 
 | 	{string(6), false}, | 
 | 	{string(7), false}, | 
 | 	{string(8), false}, | 
 | 	{string(9), true}, // \t | 
 | 	{string(10), false}, | 
 | 	{string(11), false}, | 
 | 	{string(12), false}, | 
 | 	{string(13), false}, | 
 | 	{string(14), false}, | 
 | 	{string(15), false}, | 
 | 	{string(16), false}, | 
 | 	{string(17), false}, | 
 | 	{string(18), false}, | 
 | 	{string(19), false}, | 
 | 	{string(20), false}, | 
 | 	{string(21), false}, | 
 | 	{string(22), false}, | 
 | 	{string(23), false}, | 
 | 	{string(24), false}, | 
 | 	{string(25), false}, | 
 | 	{string(26), false}, | 
 | 	{string(27), false}, | 
 | 	{string(28), false}, | 
 | 	{string(29), false}, | 
 | 	{string(30), false}, | 
 | 	{string(31), false}, | 
 | 	{string(0x7F), false}, | 
 | 	{`' !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, true}, | 
 | 	{`0123456789`, true}, | 
 | 	{`ABCDEFGHIJKLMNOPQRSTUVWXYZ`, true}, | 
 | 	{`abcdefghijklmnopqrstuvwxyz`, true}, | 
 | 	{`☺`, true}, | 
 | 	{"\x80", false}, | 
 | 	{"a\xe0\xa0z", false}, | 
 | 	{"\ufeffabc", false}, | 
 | 	{"a\ufeffz", false}, | 
 | } | 
 |  | 
 | func TestCanBackquote(t *testing.T) { | 
 | 	for _, tt := range canbackquotetests { | 
 | 		if out := CanBackquote(tt.in); out != tt.out { | 
 | 			t.Errorf("CanBackquote(%q) = %v, want %v", tt.in, out, tt.out) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | type unQuoteTest struct { | 
 | 	in  string | 
 | 	out string | 
 | } | 
 |  | 
 | var unquotetests = []unQuoteTest{ | 
 | 	{`""`, ""}, | 
 | 	{`"a"`, "a"}, | 
 | 	{`"abc"`, "abc"}, | 
 | 	{`"☺"`, "☺"}, | 
 | 	{`"hello world"`, "hello world"}, | 
 | 	{`"\xFF"`, "\xFF"}, | 
 | 	{`"\377"`, "\377"}, | 
 | 	{`"\u1234"`, "\u1234"}, | 
 | 	{`"\U00010111"`, "\U00010111"}, | 
 | 	{`"\U0001011111"`, "\U0001011111"}, | 
 | 	{`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""}, | 
 | 	{`"'"`, "'"}, | 
 |  | 
 | 	{`'a'`, "a"}, | 
 | 	{`'☹'`, "☹"}, | 
 | 	{`'\a'`, "\a"}, | 
 | 	{`'\x10'`, "\x10"}, | 
 | 	{`'\377'`, "\377"}, | 
 | 	{`'\u1234'`, "\u1234"}, | 
 | 	{`'\U00010111'`, "\U00010111"}, | 
 | 	{`'\t'`, "\t"}, | 
 | 	{`' '`, " "}, | 
 | 	{`'\''`, "'"}, | 
 | 	{`'"'`, "\""}, | 
 |  | 
 | 	{"``", ``}, | 
 | 	{"`a`", `a`}, | 
 | 	{"`abc`", `abc`}, | 
 | 	{"`☺`", `☺`}, | 
 | 	{"`hello world`", `hello world`}, | 
 | 	{"`\\xFF`", `\xFF`}, | 
 | 	{"`\\377`", `\377`}, | 
 | 	{"`\\`", `\`}, | 
 | 	{"`\n`", "\n"}, | 
 | 	{"`	`", `	`}, | 
 | 	{"` `", ` `}, | 
 | } | 
 |  | 
 | var misquoted = []string{ | 
 | 	``, | 
 | 	`"`, | 
 | 	`"a`, | 
 | 	`"'`, | 
 | 	`b"`, | 
 | 	`"\"`, | 
 | 	`"\9"`, | 
 | 	`"\19"`, | 
 | 	`"\129"`, | 
 | 	`'\'`, | 
 | 	`'\9'`, | 
 | 	`'\19'`, | 
 | 	`'\129'`, | 
 | 	`'ab'`, | 
 | 	`"\x1!"`, | 
 | 	`"\U12345678"`, | 
 | 	`"\z"`, | 
 | 	"`", | 
 | 	"`xxx", | 
 | 	"`\"", | 
 | 	`"\'"`, | 
 | 	`'\"'`, | 
 | 	"\"\n\"", | 
 | 	"\"\\n\n\"", | 
 | 	"'\n'", | 
 | } | 
 |  | 
 | func TestUnquote(t *testing.T) { | 
 | 	for _, tt := range unquotetests { | 
 | 		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 _, tt := range quotetests { | 
 | 		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 _, s := range misquoted { | 
 | 		if out, err := Unquote(s); out != "" || err != ErrSyntax { | 
 | 			t.Errorf("Unquote(%#q) = %q, %v want %q, %v", s, out, err, "", ErrSyntax) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func BenchmarkUnquoteEasy(b *testing.B) { | 
 | 	for i := 0; i < b.N; i++ { | 
 | 		Unquote(`"Give me a rock, paper and scissors and I will move the world."`) | 
 | 	} | 
 | } | 
 |  | 
 | func BenchmarkUnquoteHard(b *testing.B) { | 
 | 	for i := 0; i < b.N; i++ { | 
 | 		Unquote(`"\x47ive me a \x72ock, \x70aper and \x73cissors and \x49 will move the world."`) | 
 | 	} | 
 | } |