 4deda6ea98
			
		
	
	4deda6ea98
	
	
	
		
			
			* Changes to make vendored packages accept new home. * Fix go2idl to import vendored packages.
		
			
				
	
	
		
			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) })
 | ||
| }
 |