1package warnings_test
2
3import (
4	"errors"
5	"reflect"
6	"testing"
7
8	w "gopkg.in/warnings.v0"
9)
10
11var _ error = w.List{}
12
13type warn string
14
15func (w warn) Error() string { return string(w) }
16
17func warning(s string) error { return warn(s) }
18func fatal(s string) error   { return errors.New(s) }
19
20func isFatal(err error) bool {
21	_, ok := err.(warn)
22	return !ok
23}
24
25func omitNils(errs []error) []error {
26	if errs == nil {
27		return nil
28	}
29	res := []error{}
30	for _, err := range errs {
31		if err != nil {
32			res = append(res, err)
33		}
34	}
35	return res
36}
37
38var collectorTests = [...]struct {
39	collector w.Collector
40	warnings  []error
41	fatal     error
42}{
43	{w.Collector{IsFatal: isFatal}, nil, nil},
44	{w.Collector{IsFatal: isFatal}, nil, fatal("1f")},
45	{w.Collector{IsFatal: isFatal}, []error{warning("1w")}, nil},
46	{w.Collector{IsFatal: isFatal}, []error{warning("1w")}, fatal("2f")},
47	{w.Collector{IsFatal: isFatal}, []error{warning("1w"), warning("2w")}, fatal("3f")},
48	{w.Collector{IsFatal: isFatal}, []error{warning("1w"), nil, warning("2w")}, fatal("3f")},
49	{w.Collector{IsFatal: isFatal, FatalWithWarnings: true}, []error{warning("1w")}, fatal("2f")},
50}
51
52func TestCollector(t *testing.T) {
53	for _, tt := range collectorTests {
54		c := tt.collector
55		for _, warn := range tt.warnings {
56			err := c.Collect(warn)
57			if err != nil {
58				t.Fatalf("Collect(%v) = %v; want nil", warn, err)
59			}
60		}
61		if tt.fatal != nil {
62			err := c.Collect(tt.fatal)
63			if err == nil || w.FatalOnly(err) != tt.fatal {
64				t.Fatalf("Collect(%v) = %v; want fatal %v", tt.fatal,
65					err, tt.fatal)
66			}
67		}
68		err := c.Done()
69		if tt.fatal != nil {
70			if err == nil || w.FatalOnly(err) != tt.fatal {
71				t.Fatalf("Done() = %v; want fatal %v", err, tt.fatal)
72			}
73		}
74		if tt.fatal == nil || c.FatalWithWarnings {
75			warns := w.WarningsOnly(err)
76			if !reflect.DeepEqual(warns, omitNils(tt.warnings)) {
77				t.Fatalf("Done() = %v; want warnings %v", err,
78					omitNils(tt.warnings))
79			}
80		}
81	}
82}
83