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  }