github.com/shijuvar/go@v0.0.0-20141209052335-e8f13700b70c/src/go/build/read_test.go (about)

     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.
     4  
     5  package build
     6  
     7  import (
     8  	"io"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  const quote = "`"
    14  
    15  type readTest struct {
    16  	// Test input contains ℙ where readImports should stop.
    17  	in  string
    18  	err string
    19  }
    20  
    21  var readImportsTests = []readTest{
    22  	{
    23  		`package p`,
    24  		"",
    25  	},
    26  	{
    27  		`package p; import "x"`,
    28  		"",
    29  	},
    30  	{
    31  		`package p; import . "x"`,
    32  		"",
    33  	},
    34  	{
    35  		`package p; import "x";ℙvar x = 1`,
    36  		"",
    37  	},
    38  	{
    39  		`package p
    40  		
    41  		// comment
    42  		
    43  		import "x"
    44  		import _ "x"
    45  		import a "x"
    46  		
    47  		/* comment */
    48  		
    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 + `
    56  		)
    57  		import (
    58  		)
    59  		import ()
    60  		import()import()import()
    61  		import();import();import()
    62  		
    63  		ℙvar x = 1
    64  		`,
    65  		"",
    66  	},
    67  }
    68  
    69  var readCommentsTests = []readTest{
    70  	{
    71  		`ℙpackage p`,
    72  		"",
    73  	},
    74  	{
    75  		`ℙpackage p; import "x"`,
    76  		"",
    77  	},
    78  	{
    79  		`ℙpackage p; import . "x"`,
    80  		"",
    81  	},
    82  	{
    83  		`// foo
    84  
    85  		/* bar */
    86  
    87  		/* quux */ // baz
    88  		
    89  		/*/ zot */
    90  
    91  		// asdf
    92  		ℙHello, world`,
    93  		"",
    94  	},
    95  }
    96  
    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]
   107  		}
   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
   114  			}
   115  			if !strings.Contains(err.Error(), tt.err) {
   116  				t.Errorf("#%d: err=%q, expected %q", i, err, tt.err)
   117  				continue
   118  			}
   119  			continue
   120  		}
   121  		if err == nil && tt.err != "" {
   122  			t.Errorf("#%d: success, expected %q", i, tt.err)
   123  			continue
   124  		}
   125  
   126  		out := string(buf)
   127  		if out != testOut {
   128  			t.Errorf("#%d: wrong output:\nhave %q\nwant %q\n", i, out, testOut)
   129  		}
   130  	}
   131  }
   132  
   133  func TestReadImports(t *testing.T) {
   134  	testRead(t, readImportsTests, func(r io.Reader) ([]byte, error) { return readImports(r, true) })
   135  }
   136  
   137  func TestReadComments(t *testing.T) {
   138  	testRead(t, readCommentsTests, readComments)
   139  }
   140  
   141  var readFailuresTests = []readTest{
   142  	{
   143  		`package`,
   144  		"syntax error",
   145  	},
   146  	{
   147  		"package p\n\x00\nimport `math`\n",
   148  		"unexpected NUL in input",
   149  	},
   150  	{
   151  		`package p; import`,
   152  		"syntax error",
   153  	},
   154  	{
   155  		`package p; import "`,
   156  		"syntax error",
   157  	},
   158  	{
   159  		"package p; import ` \n\n",
   160  		"syntax error",
   161  	},
   162  	{
   163  		`package p; import "x`,
   164  		"syntax error",
   165  	},
   166  	{
   167  		`package p; import _`,
   168  		"syntax error",
   169  	},
   170  	{
   171  		`package p; import _ "`,
   172  		"syntax error",
   173  	},
   174  	{
   175  		`package p; import _ "x`,
   176  		"syntax error",
   177  	},
   178  	{
   179  		`package p; import .`,
   180  		"syntax error",
   181  	},
   182  	{
   183  		`package p; import . "`,
   184  		"syntax error",
   185  	},
   186  	{
   187  		`package p; import . "x`,
   188  		"syntax error",
   189  	},
   190  	{
   191  		`package p; import (`,
   192  		"syntax error",
   193  	},
   194  	{
   195  		`package p; import ("`,
   196  		"syntax error",
   197  	},
   198  	{
   199  		`package p; import ("x`,
   200  		"syntax error",
   201  	},
   202  	{
   203  		`package p; import ("x"`,
   204  		"syntax error",
   205  	},
   206  }
   207  
   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) })
   211  }
   212  
   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 = ""
   223  		}
   224  	}
   225  	testRead(t, tests, func(r io.Reader) ([]byte, error) { return readImports(r, false) })
   226  }