123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- // 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."`)
- }
- }
|