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