Skip to content
Snippets Groups Projects
gofmt_test.go 1.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • // Copyright 2011 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 main
    
    import (
    	"bytes"
    	"io/ioutil"
    	"path/filepath"
    	"strings"
    	"testing"
    )
    
    
    func runTest(t *testing.T, dirname, in, out, flags string) {
    	in = filepath.Join(dirname, in)
    	out = filepath.Join(dirname, out)
    
    	// process flags
    	*simplifyAST = false
    	*rewriteRule = ""
    	for _, flag := range strings.Split(flags, " ", -1) {
    		elts := strings.Split(flag, "=", 2)
    		name := elts[0]
    		value := ""
    		if len(elts) == 2 {
    			value = elts[1]
    		}
    		switch name {
    		case "":
    			// no flags
    		case "-r":
    			*rewriteRule = value
    		case "-s":
    			*simplifyAST = true
    		default:
    			t.Errorf("unrecognized flag name: %s", name)
    		}
    	}
    
    	initParserMode()
    	initPrinterMode()
    	initRewrite()
    
    	var buf bytes.Buffer
    	err := processFile(in, nil, &buf)
    	if err != nil {
    		t.Error(err)
    		return
    	}
    
    	expected, err := ioutil.ReadFile(out)
    	if err != nil {
    		t.Error(err)
    		return
    	}
    
    	if got := buf.Bytes(); bytes.Compare(got, expected) != 0 {
    		t.Errorf("(gofmt %s) != %s (see %s.gofmt)", in, out, in)
    		ioutil.WriteFile(in+".gofmt", got, 0666)
    	}
    }
    
    
    // TODO(gri) Add more test cases!
    var tests = []struct {
    	dirname, in, out, flags string
    }{
    	{".", "gofmt.go", "gofmt.go", ""},
    	{".", "gofmt_test.go", "gofmt_test.go", ""},
    	{"testdata", "composites.input", "composites.golden", "-s"},
    	{"testdata", "rewrite1.input", "rewrite1.golden", "-r=Foo->Bar"},
    
    	{"testdata", "rewrite2.input", "rewrite2.golden", "-r=int->bool"},
    
    }
    
    
    func TestRewrite(t *testing.T) {
    	for _, test := range tests {
    		runTest(t, test.dirname, test.in, test.out, test.flags)
    	}
    }