// 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(%s) = %q, %s 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(%s) = %q, %s, 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, %s want %q, %s", s, out, err, "", os.EINVAL); } } }