1package reporting 2 3import "fmt" 4 5type problem struct { 6 silent bool 7 out *Printer 8 errors []*AssertionResult 9 failures []*AssertionResult 10} 11 12func (self *problem) BeginStory(story *StoryReport) {} 13 14func (self *problem) Enter(scope *ScopeReport) {} 15 16func (self *problem) Report(report *AssertionResult) { 17 if report.Error != nil { 18 self.errors = append(self.errors, report) 19 } else if report.Failure != "" { 20 self.failures = append(self.failures, report) 21 } 22} 23 24func (self *problem) Exit() {} 25 26func (self *problem) EndStory() { 27 self.show(self.showErrors, redColor) 28 self.show(self.showFailures, yellowColor) 29 self.prepareForNextStory() 30} 31func (self *problem) show(display func(), color string) { 32 if !self.silent { 33 fmt.Print(color) 34 } 35 display() 36 if !self.silent { 37 fmt.Print(resetColor) 38 } 39 self.out.Dedent() 40} 41func (self *problem) showErrors() { 42 for i, e := range self.errors { 43 if i == 0 { 44 self.out.Println("\nErrors:\n") 45 self.out.Indent() 46 } 47 self.out.Println(errorTemplate, e.File, e.Line, e.Error, e.StackTrace) 48 } 49} 50func (self *problem) showFailures() { 51 for i, f := range self.failures { 52 if i == 0 { 53 self.out.Println("\nFailures:\n") 54 self.out.Indent() 55 } 56 self.out.Println(failureTemplate, f.File, f.Line, f.Failure) 57 } 58} 59 60func (self *problem) Write(content []byte) (written int, err error) { 61 return len(content), nil // no-op 62} 63 64func NewProblemReporter(out *Printer) *problem { 65 self := new(problem) 66 self.out = out 67 self.prepareForNextStory() 68 return self 69} 70 71func NewSilentProblemReporter(out *Printer) *problem { 72 self := NewProblemReporter(out) 73 self.silent = true 74 return self 75} 76 77func (self *problem) prepareForNextStory() { 78 self.errors = []*AssertionResult{} 79 self.failures = []*AssertionResult{} 80} 81