blob: be5b51619bf3d7f6b6c8e3744cf15d022629b6df [file] [log] [blame]
package main
import (
"encoding/xml"
"io"
"os"
"reflect"
"strings"
"testing"
"text/template"
)
type dirInfo struct {
PkgPath string
}
func TestConvertEmpty(t *testing.T) {
data := `mode: set`
pipe2rd, pipe2wr := io.Pipe()
go convert(strings.NewReader(data), pipe2wr)
v := Coverage{}
dec := xml.NewDecoder(pipe2rd)
dec.Decode(&v)
if v.XMLName.Local != "coverage" {
t.Error()
}
if v.Sources == nil {
t.Fatal()
}
if v.Packages != nil {
t.Fatal()
}
}
func TestConvertSetMode(t *testing.T) {
tmpl, err := template.ParseFiles("testdata/testdata_set.txt")
if err != nil {
t.Fatal("Can't parse testdata.")
}
dirInfo := dirInfo{}
dirInfo.PkgPath = reflect.TypeOf(Coverage{}).PkgPath()
pipe1rd, pipe1wr := io.Pipe()
go func() {
err := tmpl.Execute(pipe1wr, dirInfo)
if err != nil {
t.Error("Can't execute template.")
panic("tmpl.Execute failed")
}
pipe1wr.Close()
}()
pipe2rd, pipe2wr := io.Pipe()
var convwr io.Writer = pipe2wr
testwr, err := os.Create("testdata/testdata_set.xml")
if err == nil {
convwr = io.MultiWriter(convwr, testwr)
} else {
t.Log("Can't open output testdata. ignoring...")
}
go convert(pipe1rd, convwr)
v := Coverage{}
dec := xml.NewDecoder(pipe2rd)
dec.Decode(&v)
if v.XMLName.Local != "coverage" {
t.Error()
}
if v.Sources == nil {
t.Fatal()
}
if v.Packages == nil || len(v.Packages) != 1 {
t.Fatal()
}
p := v.Packages[0]
if p.Name != dirInfo.PkgPath+"/testdata" {
t.Fatal()
}
if p.Classes == nil || len(p.Classes) != 2 {
t.Fatal()
}
c := p.Classes[0]
if c.Name != "-" {
t.Error()
}
if c.Filename != dirInfo.PkgPath+"/testdata/func1.go" {
t.Errorf("Expected %s but %s", dirInfo.PkgPath+"/testdata/func1.go", c.Filename)
}
if c.Methods == nil || len(c.Methods) != 1 {
t.Fatal()
}
if c.Lines == nil || len(c.Lines) != 5 { // Why 5 lines? hmm...
t.Fatal()
}
m := c.Methods[0]
if m.Name != "Func1" {
t.Error()
}
if m.Lines == nil || len(m.Lines) != 5 {
t.Fatal()
}
var l *Line
if l = m.Lines[0]; l.Number != 4 || l.Hits != 1 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = m.Lines[1]; l.Number != 5 || l.Hits != 1 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = m.Lines[2]; l.Number != 5 || l.Hits != 0 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = m.Lines[3]; l.Number != 6 || l.Hits != 0 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = m.Lines[4]; l.Number != 7 || l.Hits != 0 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = c.Lines[0]; l.Number != 4 || l.Hits != 1 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = c.Lines[1]; l.Number != 5 || l.Hits != 1 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = c.Lines[2]; l.Number != 5 || l.Hits != 0 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
if l = c.Lines[3]; l.Number != 6 || l.Hits != 0 {
t.Errorf("unmatched line: Number:%d, Hits:%d", l.Number, l.Hits)
}
c = p.Classes[1]
if c.Name != "Type1" {
t.Error()
}
if c.Filename != dirInfo.PkgPath+"/testdata/func2.go" {
t.Errorf("Expected %s but %s", dirInfo.PkgPath+"/testdata/func2.go", c.Filename)
}
if c.Methods == nil || len(c.Methods) != 3 {
t.Fatal()
}
}