xref: /aosp_15_r20/external/starlark-go/syntax/quote_test.go (revision 4947cdc739c985f6d86941e22894f5cefe7c9e9a)
1*4947cdc7SCole Faust// Copyright 2017 The Bazel Authors. All rights reserved.
2*4947cdc7SCole Faust// Use of this source code is governed by a BSD-style
3*4947cdc7SCole Faust// license that can be found in the LICENSE file.
4*4947cdc7SCole Faust
5*4947cdc7SCole Faustpackage syntax
6*4947cdc7SCole Faust
7*4947cdc7SCole Faustimport (
8*4947cdc7SCole Faust	"strings"
9*4947cdc7SCole Faust	"testing"
10*4947cdc7SCole Faust)
11*4947cdc7SCole Faust
12*4947cdc7SCole Faustvar quoteTests = []struct {
13*4947cdc7SCole Faust	q   string // quoted
14*4947cdc7SCole Faust	s   string // unquoted (actual string)
15*4947cdc7SCole Faust	std bool   // q is standard form for s
16*4947cdc7SCole Faust}{
17*4947cdc7SCole Faust	{`""`, "", true},
18*4947cdc7SCole Faust	{`''`, "", false},
19*4947cdc7SCole Faust	{`"hello"`, `hello`, true},
20*4947cdc7SCole Faust	{`'hello'`, `hello`, false},
21*4947cdc7SCole Faust	{`"quote\"here"`, `quote"here`, true},
22*4947cdc7SCole Faust	{`'quote"here'`, `quote"here`, false},
23*4947cdc7SCole Faust	{`"quote'here"`, `quote'here`, true},
24*4947cdc7SCole Faust	{`'quote\'here'`, `quote'here`, false},
25*4947cdc7SCole Faust
26*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f"`, "\a\b\f\n\r\t\v\000\x7F", true},
27*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f"`, "\a\b\f\n\r\t\v\000\x7F", false},
28*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f"`, "\a\b\f\n\r\t\v\000\x7F", false},
29*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f\"'\\\x03"`, "\a\b\f\n\r\t\v\x00\x7F\"'\\\x03", true},
30*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f\"'\\\x03"`, "\a\b\f\n\r\t\v\x00\x7F\"'\\\x03", false},
31*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f\"'\\\x03"`, "\a\b\f\n\r\t\v\x00\x7F\"'\\\x03", false},
32*4947cdc7SCole Faust	{`"\a\b\f\n\r\t\v\x00\x7f\"\\\x03"`, "\a\b\f\n\r\t\v\x00\x7F\"\\\x03", false},
33*4947cdc7SCole Faust	{
34*4947cdc7SCole Faust		`"cat $(SRCS) | grep '\\s*ip_block:' | sed -e 's/\\s*ip_block: \"\\([^ ]*\\)\"/    \x27\\1\x27,/g' >> $@; "`,
35*4947cdc7SCole Faust		"cat $(SRCS) | grep '\\s*ip_block:' | sed -e 's/\\s*ip_block: \"\\([^ ]*\\)\"/    '\\1',/g' >> $@; ",
36*4947cdc7SCole Faust		false,
37*4947cdc7SCole Faust	},
38*4947cdc7SCole Faust	{
39*4947cdc7SCole Faust		`"cat $(SRCS) | grep '\\s*ip_block:' | sed -e 's/\\s*ip_block: \"\\([^ ]*\\)\"/    '\\1',/g' >> $@; "`,
40*4947cdc7SCole Faust		"cat $(SRCS) | grep '\\s*ip_block:' | sed -e 's/\\s*ip_block: \"\\([^ ]*\\)\"/    '\\1',/g' >> $@; ",
41*4947cdc7SCole Faust		true,
42*4947cdc7SCole Faust	},
43*4947cdc7SCole Faust}
44*4947cdc7SCole Faust
45*4947cdc7SCole Faustfunc TestQuote(t *testing.T) {
46*4947cdc7SCole Faust	for _, tt := range quoteTests {
47*4947cdc7SCole Faust		if !tt.std {
48*4947cdc7SCole Faust			continue
49*4947cdc7SCole Faust		}
50*4947cdc7SCole Faust		q := Quote(tt.s, false)
51*4947cdc7SCole Faust		if q != tt.q {
52*4947cdc7SCole Faust			t.Errorf("quote(%#q) = %s, want %s", tt.s, q, tt.q)
53*4947cdc7SCole Faust		}
54*4947cdc7SCole Faust	}
55*4947cdc7SCole Faust}
56*4947cdc7SCole Faust
57*4947cdc7SCole Faustfunc TestUnquote(t *testing.T) {
58*4947cdc7SCole Faust	for _, tt := range quoteTests {
59*4947cdc7SCole Faust		s, triple, _, err := unquote(tt.q)
60*4947cdc7SCole Faust		wantTriple := strings.HasPrefix(tt.q, `"""`) || strings.HasPrefix(tt.q, `'''`)
61*4947cdc7SCole Faust		if s != tt.s || triple != wantTriple || err != nil {
62*4947cdc7SCole Faust			t.Errorf("unquote(%s) = %#q, %v, %v want %#q, %v, nil", tt.q, s, triple, err, tt.s, wantTriple)
63*4947cdc7SCole Faust		}
64*4947cdc7SCole Faust	}
65*4947cdc7SCole Faust}
66