* tree-ssa-reassoc.c (reassociate_bb): Clarify code slighly.
[official-gcc.git] / libgo / go / go / build / read_test.go
blob9cef657e13fc145c8ffc22c07db0cf0889a2251a
1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package build
7 import (
8 "io"
9 "strings"
10 "testing"
13 const quote = "`"
15 type readTest struct {
16 // Test input contains ℙ where readImports should stop.
17 in string
18 err string
21 var readImportsTests = []readTest{
23 `package p`,
24 "",
27 `package p; import "x"`,
28 "",
31 `package p; import . "x"`,
32 "",
35 `package p; import "x";ℙvar x = 1`,
36 "",
39 `package p
41 // comment
43 import "x"
44 import _ "x"
45 import a "x"
47 /* comment */
49 import (
50 "x" /* comment */
51 _ "x"
52 a "x" // comment
53 ` + quote + `x` + quote + `
54 _ /*comment*/ ` + quote + `x` + quote + `
55 a ` + quote + `x` + quote + `
57 import (
59 import ()
60 import()import()import()
61 import();import();import()
63 ℙvar x = 1
65 "",
69 var readCommentsTests = []readTest{
71 `ℙpackage p`,
72 "",
75 `ℙpackage p; import "x"`,
76 "",
79 `ℙpackage p; import . "x"`,
80 "",
83 `// foo
85 /* bar */
87 /* quux */ // baz
89 /*/ zot */
91 // asdf
92 ℙHello, world`,
93 "",
97 func testRead(t *testing.T, tests []readTest, read func(io.Reader) ([]byte, error)) {
98 for i, tt := range tests {
99 var in, testOut string
100 j := strings.Index(tt.in, "ℙ")
101 if j < 0 {
102 in = tt.in
103 testOut = tt.in
104 } else {
105 in = tt.in[:j] + tt.in[j+len("ℙ"):]
106 testOut = tt.in[:j]
108 r := strings.NewReader(in)
109 buf, err := read(r)
110 if err != nil {
111 if tt.err == "" {
112 t.Errorf("#%d: err=%q, expected success (%q)", i, err, string(buf))
113 continue
115 if !strings.Contains(err.Error(), tt.err) {
116 t.Errorf("#%d: err=%q, expected %q", i, err, tt.err)
117 continue
119 continue
121 if err == nil && tt.err != "" {
122 t.Errorf("#%d: success, expected %q", i, tt.err)
123 continue
126 out := string(buf)
127 if out != testOut {
128 t.Errorf("#%d: wrong output:\nhave %q\nwant %q\n", i, out, testOut)
133 func TestReadImports(t *testing.T) {
134 testRead(t, readImportsTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
137 func TestReadComments(t *testing.T) {
138 testRead(t, readCommentsTests, readComments)
141 var readFailuresTests = []readTest{
143 `package`,
144 "syntax error",
147 "package p\n\x00\nimport `math`\n",
148 "unexpected NUL in input",
151 `package p; import`,
152 "syntax error",
155 `package p; import "`,
156 "syntax error",
159 "package p; import ` \n\n",
160 "syntax error",
163 `package p; import "x`,
164 "syntax error",
167 `package p; import _`,
168 "syntax error",
171 `package p; import _ "`,
172 "syntax error",
175 `package p; import _ "x`,
176 "syntax error",
179 `package p; import .`,
180 "syntax error",
183 `package p; import . "`,
184 "syntax error",
187 `package p; import . "x`,
188 "syntax error",
191 `package p; import (`,
192 "syntax error",
195 `package p; import ("`,
196 "syntax error",
199 `package p; import ("x`,
200 "syntax error",
203 `package p; import ("x"`,
204 "syntax error",
208 func TestReadFailures(t *testing.T) {
209 // Errors should be reported (true arg to readImports).
210 testRead(t, readFailuresTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
213 func TestReadFailuresIgnored(t *testing.T) {
214 // Syntax errors should not be reported (false arg to readImports).
215 // Instead, entire file should be the output and no error.
216 // Convert tests not to return syntax errors.
217 tests := make([]readTest, len(readFailuresTests))
218 copy(tests, readFailuresTests)
219 for i := range tests {
220 tt := &tests[i]
221 if !strings.Contains(tt.err, "NUL") {
222 tt.err = ""
225 testRead(t, tests, func(r io.Reader) ([]byte, error) { return readImports(r, false, nil) })