blob: b685f3d9d0f5074696f2a032bed4168d5b1f0b02 [file] [log] [blame]
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +09001package main
2
3import (
4 "reflect"
5 "testing"
6)
7
8func TestRuleParser(t *testing.T) {
9 for _, tc := range []struct {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090010 in string
11 want Rule
12 assign *AssignAST
13 err string
14 }{
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090015 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090016 in: "foo: bar",
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090017 want: Rule{
18 outputs: []string{"foo"},
19 inputs: []string{"bar"},
20 },
21 },
22 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090023 in: "foo: bar baz",
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090024 want: Rule{
25 outputs: []string{"foo"},
26 inputs: []string{"bar", "baz"},
27 },
28 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090029 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090030 in: "foo:: bar",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090031 want: Rule{
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090032 outputs: []string{"foo"},
33 inputs: []string{"bar"},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090034 isDoubleColon: true,
35 },
36 },
37 {
38 in: "foo",
39 err: "*** missing separator.",
40 },
41 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090042 in: "%.o: %.c",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090043 want: Rule{
44 outputPatterns: []string{"%.o"},
45 inputs: []string{"%.c"},
46 },
47 },
48 {
49 in: "foo %.o: %.c",
50 err: "*** mixed implicit and normal rules: deprecated syntax",
51 },
52 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090053 in: "foo.o: %.o: %.c %.h",
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090054 want: Rule{
55 outputs: []string{"foo.o"},
56 outputPatterns: []string{"%.o"},
57 inputs: []string{"%.c", "%.h"},
58 },
59 },
60 {
61 in: "%.x: %.y: %.z",
62 err: "*** mixed implicit and normal rules: deprecated syntax",
63 },
64 {
65 in: "foo.o: : %.c",
66 err: "*** missing target pattern.",
67 },
68 {
69 in: "foo.o: %.o %.o: %.c",
70 err: "*** multiple target patterns.",
71 },
72 {
73 in: "foo.o: foo.o: %.c",
74 err: "*** target pattern contains no '%'.",
75 },
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090076 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090077 in: "foo: bar | baz",
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090078 want: Rule{
79 outputs: []string{"foo"},
80 inputs: []string{"bar"},
81 orderOnlyInputs: []string{"baz"},
82 },
83 },
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090084 {
85 in: "foo: CFLAGS = -g",
86 want: Rule{
87 outputs: []string{"foo"},
88 },
89 assign: &AssignAST{
90 lhs: "CFLAGS",
91 rhs: "-g",
92 op: "=",
93 },
94 },
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +090095 {
96 in: "foo: CFLAGS=-g",
97 want: Rule{
98 outputs: []string{"foo"},
99 },
100 assign: &AssignAST{
101 lhs: "CFLAGS",
102 rhs: "-g",
103 op: "=",
104 },
105 },
106 {
107 in: "foo: CFLAGS := -g",
108 want: Rule{
109 outputs: []string{"foo"},
110 },
111 assign: &AssignAST{
112 lhs: "CFLAGS",
113 rhs: "-g",
114 op: ":=",
115 },
116 },
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900117 {
118 in: "%.o: CFLAGS := -g",
119 want: Rule{
120 outputPatterns: []string{"%.o"},
121 },
122 assign: &AssignAST{
123 lhs: "CFLAGS",
124 rhs: "-g",
125 op: ":=",
126 },
127 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900128 /* TODO
129 {
130 in: "foo.o: %.c: %.c",
131 err: "*** target 'foo.o' doesn't match the target pattern",
132 },
133 */
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900134 } {
135 got := &Rule{}
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900136 assign, err := got.parse(tc.in)
137 if tc.err != "" {
138 if err == nil {
139 t.Errorf(`r.parse(%q)=_, <nil>, want _, %q`, tc.in, tc.err)
140 continue
141 }
142 if got, want := err.Error(), tc.err; got != want {
143 t.Errorf(`r.parse(%q)=_, %s, want %s`, tc.in, got, want)
144 }
145 continue
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900146 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900147 if err != nil {
148 t.Errorf(`r.parse(%q)=_, %v; want nil error`, tc.in, err)
149 continue
150 }
151 if !reflect.DeepEqual(*got, tc.want) {
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900152 t.Errorf(`r.parse(%q); r=%q, want %q`, tc.in, *got, tc.want)
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900153 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900154 if tc.assign != nil {
155 if assign == nil {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900156 t.Errorf(`r.parse(%q)=<nil>; want=%#v`, tc.in, tc.assign)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900157 continue
158 }
159 if got, want := assign, tc.assign; !reflect.DeepEqual(got, want) {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900160 t.Errorf(`r.parse(%q)=%#v; want=%#v`, tc.in, got, want)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900161 }
162 continue
163 }
164 if assign != nil {
165 t.Errorf(`r.parse(%q)=%v; want=<nil>`, tc.in, assign)
166 }
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900167 }
168}