forked from cadey/xesite
227 lines
3.8 KiB
Go
227 lines
3.8 KiB
Go
|
// Copyright 2012 The Go Authors. All rights reserved.
|
|||
|
// Use of this source code is governed by a BSD-style
|
|||
|
// license that can be found in the LICENSE file.
|
|||
|
|
|||
|
package build
|
|||
|
|
|||
|
import (
|
|||
|
"io"
|
|||
|
"strings"
|
|||
|
"testing"
|
|||
|
)
|
|||
|
|
|||
|
const quote = "`"
|
|||
|
|
|||
|
type readTest struct {
|
|||
|
// Test input contains ℙ where readImports should stop.
|
|||
|
in string
|
|||
|
err string
|
|||
|
}
|
|||
|
|
|||
|
var readImportsTests = []readTest{
|
|||
|
{
|
|||
|
`package p`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import "x"`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import . "x"`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import "x";ℙvar x = 1`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p
|
|||
|
|
|||
|
// comment
|
|||
|
|
|||
|
import "x"
|
|||
|
import _ "x"
|
|||
|
import a "x"
|
|||
|
|
|||
|
/* comment */
|
|||
|
|
|||
|
import (
|
|||
|
"x" /* comment */
|
|||
|
_ "x"
|
|||
|
a "x" // comment
|
|||
|
` + quote + `x` + quote + `
|
|||
|
_ /*comment*/ ` + quote + `x` + quote + `
|
|||
|
a ` + quote + `x` + quote + `
|
|||
|
)
|
|||
|
import (
|
|||
|
)
|
|||
|
import ()
|
|||
|
import()import()import()
|
|||
|
import();import();import()
|
|||
|
|
|||
|
ℙvar x = 1
|
|||
|
`,
|
|||
|
"",
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
var readCommentsTests = []readTest{
|
|||
|
{
|
|||
|
`ℙpackage p`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`ℙpackage p; import "x"`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`ℙpackage p; import . "x"`,
|
|||
|
"",
|
|||
|
},
|
|||
|
{
|
|||
|
`// foo
|
|||
|
|
|||
|
/* bar */
|
|||
|
|
|||
|
/* quux */ // baz
|
|||
|
|
|||
|
/*/ zot */
|
|||
|
|
|||
|
// asdf
|
|||
|
ℙHello, world`,
|
|||
|
"",
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
func testRead(t *testing.T, tests []readTest, read func(io.Reader) ([]byte, error)) {
|
|||
|
for i, tt := range tests {
|
|||
|
var in, testOut string
|
|||
|
j := strings.Index(tt.in, "ℙ")
|
|||
|
if j < 0 {
|
|||
|
in = tt.in
|
|||
|
testOut = tt.in
|
|||
|
} else {
|
|||
|
in = tt.in[:j] + tt.in[j+len("ℙ"):]
|
|||
|
testOut = tt.in[:j]
|
|||
|
}
|
|||
|
r := strings.NewReader(in)
|
|||
|
buf, err := read(r)
|
|||
|
if err != nil {
|
|||
|
if tt.err == "" {
|
|||
|
t.Errorf("#%d: err=%q, expected success (%q)", i, err, string(buf))
|
|||
|
continue
|
|||
|
}
|
|||
|
if !strings.Contains(err.Error(), tt.err) {
|
|||
|
t.Errorf("#%d: err=%q, expected %q", i, err, tt.err)
|
|||
|
continue
|
|||
|
}
|
|||
|
continue
|
|||
|
}
|
|||
|
if err == nil && tt.err != "" {
|
|||
|
t.Errorf("#%d: success, expected %q", i, tt.err)
|
|||
|
continue
|
|||
|
}
|
|||
|
|
|||
|
out := string(buf)
|
|||
|
if out != testOut {
|
|||
|
t.Errorf("#%d: wrong output:\nhave %q\nwant %q\n", i, out, testOut)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func TestReadImports(t *testing.T) {
|
|||
|
testRead(t, readImportsTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
|
|||
|
}
|
|||
|
|
|||
|
func TestReadComments(t *testing.T) {
|
|||
|
testRead(t, readCommentsTests, readComments)
|
|||
|
}
|
|||
|
|
|||
|
var readFailuresTests = []readTest{
|
|||
|
{
|
|||
|
`package`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
"package p\n\x00\nimport `math`\n",
|
|||
|
"unexpected NUL in input",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import "`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
"package p; import ` \n\n",
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import "x`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import _`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import _ "`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import _ "x`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import .`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import . "`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import . "x`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import (`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import ("`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import ("x`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
{
|
|||
|
`package p; import ("x"`,
|
|||
|
"syntax error",
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
func TestReadFailures(t *testing.T) {
|
|||
|
// Errors should be reported (true arg to readImports).
|
|||
|
testRead(t, readFailuresTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
|
|||
|
}
|
|||
|
|
|||
|
func TestReadFailuresIgnored(t *testing.T) {
|
|||
|
// Syntax errors should not be reported (false arg to readImports).
|
|||
|
// Instead, entire file should be the output and no error.
|
|||
|
// Convert tests not to return syntax errors.
|
|||
|
tests := make([]readTest, len(readFailuresTests))
|
|||
|
copy(tests, readFailuresTests)
|
|||
|
for i := range tests {
|
|||
|
tt := &tests[i]
|
|||
|
if !strings.Contains(tt.err, "NUL") {
|
|||
|
tt.err = ""
|
|||
|
}
|
|||
|
}
|
|||
|
testRead(t, tests, func(r io.Reader) ([]byte, error) { return readImports(r, false, nil) })
|
|||
|
}
|