package assertions import ( "encoding/json" "fmt" "strings" "github.com/smartystreets/assertions/internal/go-render/render" ) type Serializer interface { serialize(expected, actual interface{}, message string) string serializeDetailed(expected, actual interface{}, message string) string } type failureSerializer struct{} func (self *failureSerializer) serializeDetailed(expected, actual interface{}, message string) string { if index := strings.Index(message, " Diff:"); index > 0 { message = message[:index] } view := FailureView{ Message: message, Expected: render.Render(expected), Actual: render.Render(actual), } serialized, _ := json.Marshal(view) return string(serialized) } func (self *failureSerializer) serialize(expected, actual interface{}, message string) string { if index := strings.Index(message, " Diff:"); index > 0 { message = message[:index] } view := FailureView{ Message: message, Expected: fmt.Sprintf("%+v", expected), Actual: fmt.Sprintf("%+v", actual), } serialized, _ := json.Marshal(view) return string(serialized) } func newSerializer() *failureSerializer { return &failureSerializer{} } /////////////////////////////////////////////////////////////////////////////// // This struct is also declared in github.com/smartystreets/goconvey/convey/reporting. // The json struct tags should be equal in both declarations. type FailureView struct { Message string `json:"Message"` Expected string `json:"Expected"` Actual string `json:"Actual"` } /////////////////////////////////////////////////////// // noopSerializer just gives back the original message. This is useful when we are using // the assertions from a context other than the GoConvey Web UI, that requires the JSON // structure provided by the failureSerializer. type noopSerializer struct{} func (self *noopSerializer) serialize(expected, actual interface{}, message string) string { return message } func (self *noopSerializer) serializeDetailed(expected, actual interface{}, message string) string { return message }