1// Copyright 2016 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package android
16
17import (
18	"fmt"
19	"testing"
20)
21
22var vars = map[string]string{
23	"var1": "abc",
24	"var2": "",
25	"var3": "def",
26	"��":    "��",
27}
28
29func expander(s string) (string, error) {
30	if val, ok := vars[s]; ok {
31		return val, nil
32	} else {
33		return "", fmt.Errorf("unknown variable %q", s)
34	}
35}
36
37var expandTestCases = []struct {
38	in  string
39	out string
40	err bool
41}{
42	{
43		in:  "$(var1)",
44		out: "abc",
45	},
46	{
47		in:  "$( var1 )",
48		out: "abc",
49	},
50	{
51		in:  "def$(var1)",
52		out: "defabc",
53	},
54	{
55		in:  "$(var1)def",
56		out: "abcdef",
57	},
58	{
59		in:  "def$(var1)def",
60		out: "defabcdef",
61	},
62	{
63		in:  "$(var2)",
64		out: "",
65	},
66	{
67		in:  "def$(var2)",
68		out: "def",
69	},
70	{
71		in:  "$(var2)def",
72		out: "def",
73	},
74	{
75		in:  "def$(var2)def",
76		out: "defdef",
77	},
78	{
79		in:  "$(var1)$(var3)",
80		out: "abcdef",
81	},
82	{
83		in:  "$(var1)g$(var3)",
84		out: "abcgdef",
85	},
86	{
87		in:  "$$",
88		out: "$$",
89	},
90	{
91		in:  "$$(var1)",
92		out: "$$(var1)",
93	},
94	{
95		in:  "$$$(var1)",
96		out: "$$abc",
97	},
98	{
99		in:  "$(var1)$$",
100		out: "abc$$",
101	},
102	{
103		in:  "$(��)",
104		out: "��",
105	},
106
107	// Errors
108	{
109		in:  "$",
110		err: true,
111	},
112	{
113		in:  "$$$",
114		err: true,
115	},
116	{
117		in:  "$(var1)$",
118		err: true,
119	},
120	{
121		in:  "$(var1)$",
122		err: true,
123	},
124	{
125		in:  "$(var4)",
126		err: true,
127	},
128	{
129		in:  "$var1",
130		err: true,
131	},
132	{
133		in:  "$(var1",
134		err: true,
135	},
136	{
137		in:  "$a��c",
138		err: true,
139	},
140}
141
142func TestExpand(t *testing.T) {
143	for _, test := range expandTestCases {
144		got, err := Expand(test.in, expander)
145		if err != nil && !test.err {
146			t.Errorf("%q: unexpected error %s", test.in, err.Error())
147		} else if err == nil && test.err {
148			t.Errorf("%q: expected error, got %q", test.in, got)
149		} else if !test.err && got != test.out {
150			t.Errorf("%q: expected %q, got %q", test.in, test.out, got)
151		}
152	}
153}
154