package warnings_test import ( "errors" "reflect" "testing" w "gopkg.in/warnings.v0" ) var _ error = w.List{} type warn string func (w warn) Error() string { return string(w) } func warning(s string) error { return warn(s) } func fatal(s string) error { return errors.New(s) } func isFatal(err error) bool { _, ok := err.(warn) return !ok } func omitNils(errs []error) []error { if errs == nil { return nil } res := []error{} for _, err := range errs { if err != nil { res = append(res, err) } } return res } var collectorTests = [...]struct { collector w.Collector warnings []error fatal error }{ {w.Collector{IsFatal: isFatal}, nil, nil}, {w.Collector{IsFatal: isFatal}, nil, fatal("1f")}, {w.Collector{IsFatal: isFatal}, []error{warning("1w")}, nil}, {w.Collector{IsFatal: isFatal}, []error{warning("1w")}, fatal("2f")}, {w.Collector{IsFatal: isFatal}, []error{warning("1w"), warning("2w")}, fatal("3f")}, {w.Collector{IsFatal: isFatal}, []error{warning("1w"), nil, warning("2w")}, fatal("3f")}, {w.Collector{IsFatal: isFatal, FatalWithWarnings: true}, []error{warning("1w")}, fatal("2f")}, } func TestCollector(t *testing.T) { for _, tt := range collectorTests { c := tt.collector for _, warn := range tt.warnings { err := c.Collect(warn) if err != nil { t.Fatalf("Collect(%v) = %v; want nil", warn, err) } } if tt.fatal != nil { err := c.Collect(tt.fatal) if err == nil || w.FatalOnly(err) != tt.fatal { t.Fatalf("Collect(%v) = %v; want fatal %v", tt.fatal, err, tt.fatal) } } err := c.Done() if tt.fatal != nil { if err == nil || w.FatalOnly(err) != tt.fatal { t.Fatalf("Done() = %v; want fatal %v", err, tt.fatal) } } if tt.fatal == nil || c.FatalWithWarnings { warns := w.WarningsOnly(err) if !reflect.DeepEqual(warns, omitNils(tt.warnings)) { t.Fatalf("Done() = %v; want warnings %v", err, omitNils(tt.warnings)) } } } }