blob: dc66d0b1181cb757e109f2c7c4f6490d80247835 [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 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090095 /* TODO
96 {
97 in: "foo.o: %.c: %.c",
98 err: "*** target 'foo.o' doesn't match the target pattern",
99 },
100 */
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900101 } {
102 got := &Rule{}
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900103 assign, err := got.parse(tc.in)
104 if tc.err != "" {
105 if err == nil {
106 t.Errorf(`r.parse(%q)=_, <nil>, want _, %q`, tc.in, tc.err)
107 continue
108 }
109 if got, want := err.Error(), tc.err; got != want {
110 t.Errorf(`r.parse(%q)=_, %s, want %s`, tc.in, got, want)
111 }
112 continue
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900113 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900114 if err != nil {
115 t.Errorf(`r.parse(%q)=_, %v; want nil error`, tc.in, err)
116 continue
117 }
118 if !reflect.DeepEqual(*got, tc.want) {
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900119 t.Errorf(`r.parse(%q); r=%q, want %q`, tc.in, *got, tc.want)
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900120 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900121 if tc.assign != nil {
122 if assign == nil {
123 t.Errorf(`r.parse(%q)=<nil>; want=%v`, tc.in, tc.assign)
124 continue
125 }
126 if got, want := assign, tc.assign; !reflect.DeepEqual(got, want) {
127 t.Errorf(`r.parse(%q)=%v; want=%v`, got, want)
128 }
129 continue
130 }
131 if assign != nil {
132 t.Errorf(`r.parse(%q)=%v; want=<nil>`, tc.in, assign)
133 }
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900134 }
135}