github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/parse/quote_test.go (about) 1 package parse 2 3 import ( 4 "testing" 5 6 . "github.com/markusbkk/elvish/pkg/tt" 7 ) 8 9 func TestQuote(t *testing.T) { 10 Test(t, Fn("Quote", Quote).ArgsFmt("(%q)").RetsFmt("%q"), Table{ 11 // Empty string is single-quoted. 12 Args("").Rets(`''`), 13 14 // Bareword when possible. 15 Args("x-y:z@h/d").Rets("x-y:z@h/d"), 16 17 // Single quote when there are special characters but no unprintable 18 // characters. 19 Args("x$y[]ef'").Rets("'x$y[]ef'''"), 20 21 // Tilde needs quoting only leading the expression. 22 Args("~x").Rets("'~x'"), 23 Args("x~").Rets("x~"), 24 25 // Double quote when there is unprintable char. 26 Args("a\nb").Rets(`"a\nb"`), 27 Args("\x1b\"\\").Rets(`"\e\"\\"`), 28 Args("\x00").Rets(`"\x00"`), 29 Args("\u0600").Rets(`"\u0600"`), // Arabic number sign 30 Args("\U000110BD").Rets(`"\U000110bd"`), // Kathi number sign 31 32 // Commas and equal signs are always quoted, so that the quoted string is 33 // safe for use everywhere. 34 Args("a,b").Rets(`'a,b'`), 35 Args("a=b").Rets(`'a=b'`), 36 }) 37 } 38 39 func TestQuoteAs(t *testing.T) { 40 Test(t, Fn("QuoteAs", QuoteAs).ArgsFmt("(%q, %s)").RetsFmt("(%q, %s)"), Table{ 41 // DoubleQuote is always respected. 42 Args("", DoubleQuoted).Rets(`""`, DoubleQuoted), 43 Args("a", DoubleQuoted).Rets(`"a"`, DoubleQuoted), 44 45 // SingleQuoted is respected when there is no unprintable character. 46 Args("", SingleQuoted).Rets(`''`, SingleQuoted), 47 Args("a", SingleQuoted).Rets(`'a'`, SingleQuoted), 48 Args("\n", SingleQuoted).Rets(`"\n"`, DoubleQuoted), 49 50 // Bareword tested above in TestQuote. 51 }) 52 } 53 54 func TestQuoteVariableName(t *testing.T) { 55 Test(t, Fn("QuoteVariableName", QuoteVariableName).ArgsFmt("(%q)").RetsFmt("%q"), Table{ 56 Args("").Rets("''"), 57 Args("foo").Rets("foo"), 58 Args("a/b").Rets("'a/b'"), 59 Args("\x1b").Rets(`"\e"`), 60 }) 61 }