blob: 389b69b7ae28c976191ac4057e7cd2ed668b6aba [file] [log] [blame]
Shinichiro Hamajib69bf8a2015-06-10 14:52:06 +09001// Copyright 2015 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
Fumitoshi Ukai744bb2b2015-06-25 00:10:52 +090015package kati
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090016
17import (
18 "reflect"
19 "testing"
20)
21
22func TestRuleParser(t *testing.T) {
23 for _, tc := range []struct {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090024 in string
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090025 want rule
Fumitoshi Ukai91ed5d72015-06-25 13:08:09 +090026 assign *assignAST
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090027 err string
28 }{
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090029 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090030 in: "foo: bar",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090031 want: rule{
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090032 outputs: []string{"foo"},
33 inputs: []string{"bar"},
34 },
35 },
36 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090037 in: "foo: bar baz",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090038 want: rule{
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +090039 outputs: []string{"foo"},
40 inputs: []string{"bar", "baz"},
41 },
42 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090043 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090044 in: "foo:: bar",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090045 want: rule{
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090046 outputs: []string{"foo"},
47 inputs: []string{"bar"},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090048 isDoubleColon: true,
49 },
50 },
51 {
52 in: "foo",
53 err: "*** missing separator.",
54 },
55 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090056 in: "%.o: %.c",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090057 want: rule{
Fumitoshi Ukai935de962015-04-28 17:08:20 +090058 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090059 inputs: []string{"%.c"},
60 },
61 },
62 {
63 in: "foo %.o: %.c",
64 err: "*** mixed implicit and normal rules: deprecated syntax",
65 },
66 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090067 in: "foo.o: %.o: %.c %.h",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090068 want: rule{
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090069 outputs: []string{"foo.o"},
Fumitoshi Ukai935de962015-04-28 17:08:20 +090070 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +090071 inputs: []string{"%.c", "%.h"},
72 },
73 },
74 {
75 in: "%.x: %.y: %.z",
76 err: "*** mixed implicit and normal rules: deprecated syntax",
77 },
78 {
79 in: "foo.o: : %.c",
80 err: "*** missing target pattern.",
81 },
82 {
83 in: "foo.o: %.o %.o: %.c",
84 err: "*** multiple target patterns.",
85 },
86 {
87 in: "foo.o: foo.o: %.c",
88 err: "*** target pattern contains no '%'.",
89 },
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090090 {
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090091 in: "foo: bar | baz",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +090092 want: rule{
Shinichiro Hamaji5c53b572015-04-02 05:36:42 +090093 outputs: []string{"foo"},
94 inputs: []string{"bar"},
95 orderOnlyInputs: []string{"baz"},
96 },
97 },
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +090098 {
99 in: "foo: CFLAGS = -g",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +0900100 want: rule{
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900101 outputs: []string{"foo"},
102 },
Fumitoshi Ukai91ed5d72015-06-25 13:08:09 +0900103 assign: &assignAST{
Fumitoshi Ukai7c9aa9f2015-06-12 23:51:38 +0900104 lhs: literal("CFLAGS"),
105 rhs: literal("-g"),
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900106 op: "=",
107 },
108 },
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900109 {
110 in: "foo: CFLAGS=-g",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +0900111 want: rule{
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900112 outputs: []string{"foo"},
113 },
Fumitoshi Ukai91ed5d72015-06-25 13:08:09 +0900114 assign: &assignAST{
Fumitoshi Ukai7c9aa9f2015-06-12 23:51:38 +0900115 lhs: literal("CFLAGS"),
116 rhs: literal("-g"),
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900117 op: "=",
118 },
119 },
120 {
121 in: "foo: CFLAGS := -g",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +0900122 want: rule{
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900123 outputs: []string{"foo"},
124 },
Fumitoshi Ukai91ed5d72015-06-25 13:08:09 +0900125 assign: &assignAST{
Fumitoshi Ukai7c9aa9f2015-06-12 23:51:38 +0900126 lhs: literal("CFLAGS"),
127 rhs: literal("-g"),
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900128 op: ":=",
129 },
130 },
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900131 {
132 in: "%.o: CFLAGS := -g",
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +0900133 want: rule{
Fumitoshi Ukai935de962015-04-28 17:08:20 +0900134 outputPatterns: []pattern{pattern{suffix: ".o"}},
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900135 },
Fumitoshi Ukai91ed5d72015-06-25 13:08:09 +0900136 assign: &assignAST{
Fumitoshi Ukai7c9aa9f2015-06-12 23:51:38 +0900137 lhs: literal("CFLAGS"),
138 rhs: literal("-g"),
Shinichiro Hamajia485d2f2015-04-16 14:03:24 +0900139 op: ":=",
140 },
141 },
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900142 /* TODO
143 {
144 in: "foo.o: %.c: %.c",
145 err: "*** target 'foo.o' doesn't match the target pattern",
146 },
147 */
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900148 } {
Fumitoshi Ukaiadc14442015-06-25 16:10:30 +0900149 got := &rule{}
Fumitoshi Ukai0b9e8132015-04-30 10:20:18 +0900150 assign, err := got.parse([]byte(tc.in))
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900151 if tc.err != "" {
152 if err == nil {
153 t.Errorf(`r.parse(%q)=_, <nil>, want _, %q`, tc.in, tc.err)
154 continue
155 }
156 if got, want := err.Error(), tc.err; got != want {
157 t.Errorf(`r.parse(%q)=_, %s, want %s`, tc.in, got, want)
158 }
159 continue
Shinichiro Hamaji21a9b5f2015-04-01 02:42:59 +0900160 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900161 if err != nil {
162 t.Errorf(`r.parse(%q)=_, %v; want nil error`, tc.in, err)
163 continue
164 }
165 if !reflect.DeepEqual(*got, tc.want) {
Fumitoshi Ukai36c510b2015-06-08 10:21:13 +0900166 t.Errorf(`r.parse(%q); r=%#v, want %#v`, tc.in, *got, tc.want)
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900167 }
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900168 if tc.assign != nil {
169 if assign == nil {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900170 t.Errorf(`r.parse(%q)=<nil>; want=%#v`, tc.in, tc.assign)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900171 continue
172 }
173 if got, want := assign, tc.assign; !reflect.DeepEqual(got, want) {
Fumitoshi Ukai3ef5fcc2015-04-06 17:21:43 +0900174 t.Errorf(`r.parse(%q)=%#v; want=%#v`, tc.in, got, want)
Fumitoshi Ukai953ce6f2015-04-04 00:38:53 +0900175 }
176 continue
177 }
178 if assign != nil {
179 t.Errorf(`r.parse(%q)=%v; want=<nil>`, tc.in, assign)
180 }
Shinichiro Hamaji0439a3e2015-04-01 02:01:05 +0900181 }
182}