Documentation
¶
Overview ¶
Package notice simplifies building structured assertion messages.
Index ¶
- Variables
- func Indent(n int, r rune, lns string) string
- func Join(ers ...error) error
- func Pad(str string, length int) string
- func TrialCmp(x, y *Notice) int
- type Notice
- func (msg *Notice) Append(name, format string, args ...any) *Notice
- func (msg *Notice) AppendRow(desc ...Row) *Notice
- func (msg *Notice) Chain(prev *Notice) *Notice
- func (msg *Notice) Error() string
- func (msg *Notice) Have(format string, args ...any) *Notice
- func (msg *Notice) Head() *Notice
- func (msg *Notice) Is(target error) bool
- func (msg *Notice) MetaLookup(key string) (any, bool)
- func (msg *Notice) MetaSet(key string, val any) *Notice
- func (msg *Notice) Next() *Notice
- func (msg *Notice) Prepend(name, format string, args ...any) *Notice
- func (msg *Notice) Prev() *Notice
- func (msg *Notice) Remove(name string) *Notice
- func (msg *Notice) SetHeader(header string, args ...any) *Notice
- func (msg *Notice) SetTrail(trail string) *Notice
- func (msg *Notice) Unwrap() error
- func (msg *Notice) Want(format string, args ...any) *Notice
- func (msg *Notice) Wrap(err error) *Notice
- type Row
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNotice = errors.New("notice error")
ErrNotice is a sentinel error automatically wrapped by all instances of Notice unless changed with the Notice.Wrap method.
Functions ¶
func Indent ¶
Indent indents lines with n number of runes. Lines are indented only if there are more than one line.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
lines := notice.Indent(4, ' ', "line1\nline2\nline3")
fmt.Println(lines)
}
Output: line1 line2 line3
func Join ¶ added in v0.6.0
Join joins multiple notices into one. Returns the last not nil joined notice.
Types ¶
type Notice ¶
type Notice struct {
Header string // Header message.
// Is a trail to the field, element or key the notice message is about.
Trail string
Rows []Row // Context rows.
Meta map[string]any // Useful metadata.
// contains filtered or unexported fields
}
Notice represents a structured expectation violation message consisting of a header, trail and multiple named rows with context.
nolint: errname
func From ¶
From returns instance of Notice if it is in err's tree. If the prefix is not empty, the header will be prefixed with the first element in the slice. If "err" is not an instance of Notice, it will create a new one and wrap the "err".
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
var err error
err = notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz")
msg := notice.From(err, "optional prefix").
Append("my", "%s", "value")
fmt.Println(msg)
}
Output: [optional prefix] expected values to be equal: want: abc have: xyz my: value
func New ¶
New creates a new Notice with a header formatted using fmt.Sprintf from the provided format string and optional arguments. The resulting Notice has its base error set to ErrNotice. The header is set by calling. If no arguments are provided, the format string is used as-is.
Example:
n := New("header: %s", "name") // Header: "header: name"
n := New("generic error") // Header: "generic error"
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz")
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: xyz
Example (FormatedHeader) ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected %s to be equal", "values").
Want("%s", "abc").
Have("%s", "xyz")
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: xyz
func SortNotices ¶ added in v0.11.0
SortNotices sorts a doubly linked list of Notice instances starting at head, ordering nodes by their values in ascending order. It modifies the list in-place by updating prev and next pointers. The "cmp" function takes two Notice instances and returns -1 if "a" should come before "b", 0 if equal, or 1 if "a" should come after "b". If the head is nil or the list has one node, it returns the unchanged head. Returns the tail of the sorted list so it can be used directly with Join or [Node.Chain] to add more nodes.
func (*Notice) Append ¶
Append appends a new row with the specified name and value build using fmt.Sprintf from format and args. Implements fluent interface.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz").
Append("name", "%d", 5)
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: xyz name: 5
Example (ForceNexLine) ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("\n%s", "xyz").
Append("name", "%d", 5)
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: xyz name: 5
Example (MultiLine) ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "x\ny\nz").
Append("name", "%d", 5)
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: x y z name: 5
func (*Notice) AppendRow ¶
AppendRow appends description rows to the message.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
row0 := notice.NewRow("number", "%d", 5)
row1 := notice.NewRow("string", "%s", "abc")
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz").
AppendRow(row0, row1)
fmt.Println(msg)
}
Output: expected values to be equal: want: abc have: xyz number: 5 string: abc
func (*Notice) Chain ¶ added in v0.11.0
Chain adds the current Notice as next in the chain after "prev" and returns the current instance.
func (*Notice) Error ¶
Notice returns a formatted string representation of the Notice.
nolint: gocognit, cyclop
func (*Notice) Have ¶
Have uses the Append method to append a row with the "have" name. If the "have" row already exists, it will just replace its value.
func (*Notice) Head ¶ added in v0.11.0
Head returns the head of the notice chain, if the current notice instance is the head, it returns self.
func (*Notice) MetaLookup ¶ added in v0.11.0
MetaLookup returns the data set by Notice.MetaSet. Returns nil and false if the key was never set.
func (*Notice) MetaSet ¶ added in v0.11.0
MetaSet sets data. To get it back, use the Notice.MetaLookup method.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz").
MetaSet("key", 123)
fmt.Println(msg.MetaLookup("key"))
}
Output: 123 true
func (*Notice) Prepend ¶
Prepend prepends a new row with the specified name and value built using fmt.Sprintf from format and args. Implements fluent interface.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
SetTrail("type.field").
Want("%s", "abc").
Have("%s", "xyz").
Prepend("name", "%d", 5)
fmt.Println(msg)
}
Output: expected values to be equal: trail: type.field name: 5 want: abc have: xyz
func (*Notice) SetHeader ¶
SetHeader sets the header message. Implements fluent interface.
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz")
_ = msg.SetHeader("some other %s", "header")
fmt.Println(msg)
}
Output: some other header: want: abc have: xyz
func (*Notice) SetTrail ¶ added in v0.11.0
SetTrail adds trail row if "tr" is not an empty string. If the trail row already exists, it overwrites it. Implements fluent interface.
SetTrail examples:
- Type
- Type[1].Field
- Type["key"].Field
Example ¶
package main
import (
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
msg := notice.New("expected values to be equal").
SetTrail("type.field").
Want("%s", "abc").
Have("%s", "xyz")
fmt.Println(msg)
}
Output: expected values to be equal: trail: type.field want: abc have: xyz
func (*Notice) Unwrap ¶ added in v0.6.0
Unwrap returns wrapped error. By default, it returns ErrNotice unless a different error was specified using Notice.Wrap.
Example ¶
package main
import (
"errors"
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
ErrMy := errors.New("my error")
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz").
Wrap(ErrMy)
fmt.Println(msg.Unwrap())
}
Output: my error
func (*Notice) Want ¶
Want uses the Append method to append a row with the "want" name. If the "want" row already exists, it will just replace its value.
func (*Notice) Wrap ¶
Wrap sets base error with provided one.
Example ¶
package main
import (
"errors"
"fmt"
"github.com/ctx42/testing/pkg/notice"
)
func main() {
ErrMy := errors.New("my error")
msg := notice.New("expected values to be equal").
Want("%s", "abc").
Have("%s", "xyz").
Wrap(ErrMy)
is := errors.Is(msg, ErrMy)
fmt.Println(is)
}
Output: true