quote_test.go 1.7 KB

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