blob: d2dcf199df018abca5eaff59998af98656b9194a [file] [log] [blame]
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +09001package main
2
3import (
4 "reflect"
5 "testing"
6)
7
Shinichiro Hamaji7825b652015-06-04 13:47:14 +09008func parseExprForTest(e string) Value {
9 v, _, err := parseExpr([]byte(e), nil)
10 if err != nil {
11 panic(err)
12 }
13 return v
14}
15
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090016func TestRuleParser(t *testing.T) {
17 for _, tc := range []struct {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090018 in string
19 want Rule
20 assign *AssignAST
21 err string
22 }{
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090023 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090024 in: "foo: bar",
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090025 want: Rule{
26 outputs: []string{"foo"},
27 inputs: []string{"bar"},
28 },
29 },
30 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090031 in: "foo: bar baz",
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090032 want: Rule{
33 outputs: []string{"foo"},
34 inputs: []string{"bar", "baz"},
35 },
36 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090037 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090038 in: "foo:: bar",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090039 want: Rule{
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090040 outputs: []string{"foo"},
41 inputs: []string{"bar"},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090042 isDoubleColon: true,
43 },
44 },
45 {
46 in: "foo",
47 err: "*** missing separator.",
48 },
49 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090050 in: "%.o: %.c",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090051 want: Rule{
Fumitoshi Ukai935de962015-04-28 17:08:20 +090052 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090053 inputs: []string{"%.c"},
54 },
55 },
56 {
57 in: "foo %.o: %.c",
58 err: "*** mixed implicit and normal rules: deprecated syntax",
59 },
60 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090061 in: "foo.o: %.o: %.c %.h",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090062 want: Rule{
63 outputs: []string{"foo.o"},
Fumitoshi Ukai935de962015-04-28 17:08:20 +090064 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090065 inputs: []string{"%.c", "%.h"},
66 },
67 },
68 {
69 in: "%.x: %.y: %.z",
70 err: "*** mixed implicit and normal rules: deprecated syntax",
71 },
72 {
73 in: "foo.o: : %.c",
74 err: "*** missing target pattern.",
75 },
76 {
77 in: "foo.o: %.o %.o: %.c",
78 err: "*** multiple target patterns.",
79 },
80 {
81 in: "foo.o: foo.o: %.c",
82 err: "*** target pattern contains no '%'.",
83 },
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090084 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090085 in: "foo: bar | baz",
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090086 want: Rule{
87 outputs: []string{"foo"},
88 inputs: []string{"bar"},
89 orderOnlyInputs: []string{"baz"},
90 },
91 },
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090092 {
93 in: "foo: CFLAGS = -g",
94 want: Rule{
95 outputs: []string{"foo"},
96 },
97 assign: &AssignAST{
Shinichiro Hamaji7825b652015-06-04 13:47:14 +090098 lhs: parseExprForTest("CFLAGS"),
99 rhs: parseExprForTest("-g"),
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900100 op: "=",
101 },
102 },
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900103 {
104 in: "foo: CFLAGS=-g",
105 want: Rule{
106 outputs: []string{"foo"},
107 },
108 assign: &AssignAST{
Shinichiro Hamaji7825b652015-06-04 13:47:14 +0900109 lhs: parseExprForTest("CFLAGS"),
110 rhs: parseExprForTest("-g"),
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900111 op: "=",
112 },
113 },
114 {
115 in: "foo: CFLAGS := -g",
116 want: Rule{
117 outputs: []string{"foo"},
118 },
119 assign: &AssignAST{
Shinichiro Hamaji7825b652015-06-04 13:47:14 +0900120 lhs: parseExprForTest("CFLAGS"),
121 rhs: parseExprForTest("-g"),
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900122 op: ":=",
123 },
124 },
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900125 {
126 in: "%.o: CFLAGS := -g",
127 want: Rule{
Fumitoshi Ukai935de962015-04-28 17:08:20 +0900128 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900129 },
130 assign: &AssignAST{
Shinichiro Hamaji7825b652015-06-04 13:47:14 +0900131 lhs: parseExprForTest("CFLAGS"),
132 rhs: parseExprForTest("-g"),
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900133 op: ":=",
134 },
135 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900136 /* TODO
137 {
138 in: "foo.o: %.c: %.c",
139 err: "*** target 'foo.o' doesn't match the target pattern",
140 },
141 */
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900142 } {
143 got := &Rule{}
Fumitoshi Ukai0b9e8132015-04-30 10:20:18 +0900144 assign, err := got.parse([]byte(tc.in))
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900145 if tc.err != "" {
146 if err == nil {
147 t.Errorf(`r.parse(%q)=_, <nil>, want _, %q`, tc.in, tc.err)
148 continue
149 }
150 if got, want := err.Error(), tc.err; got != want {
151 t.Errorf(`r.parse(%q)=_, %s, want %s`, tc.in, got, want)
152 }
153 continue
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900154 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900155 if err != nil {
156 t.Errorf(`r.parse(%q)=_, %v; want nil error`, tc.in, err)
157 continue
158 }
159 if !reflect.DeepEqual(*got, tc.want) {
Fumitoshi Ukai36c510b2015-06-08 10:21:13 +0900160 t.Errorf(`r.parse(%q); r=%#v, want %#v`, tc.in, *got, tc.want)
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900161 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900162 if tc.assign != nil {
163 if assign == nil {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900164 t.Errorf(`r.parse(%q)=<nil>; want=%#v`, tc.in, tc.assign)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900165 continue
166 }
167 if got, want := assign, tc.assign; !reflect.DeepEqual(got, want) {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900168 t.Errorf(`r.parse(%q)=%#v; want=%#v`, tc.in, got, want)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900169 }
170 continue
171 }
172 if assign != nil {
173 t.Errorf(`r.parse(%q)=%v; want=<nil>`, tc.in, assign)
174 }
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900175 }
176}