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