From a45574be373ce3dea7a728d29a6c8925e1321a0d Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Fri, 5 Jan 2018 13:56:48 -0800 Subject: [PATCH 1/6] Add metadata to customskill handlers --- customskill/examples/http.go | 7 +++---- customskill/skill.go | 8 ++++---- customskill/skill_test.go | 24 ++++++++++++------------ customskill/types.go | 6 +++--- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/customskill/examples/http.go b/customskill/examples/http.go index 76c7a79..b364a98 100644 --- a/customskill/examples/http.go +++ b/customskill/examples/http.go @@ -36,10 +36,9 @@ func main() { http.ListenAndServe(":8080", nil) } -func onLaunch(launchRequest *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { +func onLaunch(launchRequest *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { resp := response.New() resp.SetEndSession(response.Bool(true)) - sessAttrs := make(map[string]interface{}) - sessAttrs["hello"] = "world" - return resp, sessAttrs, nil + metadata.Session.Attributes["hello"] = "world" + return resp, metadata.Session.Attributes, nil } diff --git a/customskill/skill.go b/customskill/skill.go index a613eae..6fe6d19 100644 --- a/customskill/skill.go +++ b/customskill/skill.go @@ -40,7 +40,7 @@ func (s *Skill) Handle(w io.Writer, b []byte) error { return errors.New("no OnLaunch handler defined") } lr := e.(*request.LaunchRequest) - resp, sess, err = s.OnLaunch(lr) + resp, sess, err = s.OnLaunch(lr, m) if err != nil { return errors.New("OnLaunch handler failed: " + err.Error()) } @@ -49,7 +49,7 @@ func (s *Skill) Handle(w io.Writer, b []byte) error { return errors.New("no OnIntent handler defined") } ir := e.(*request.IntentRequest) - resp, sess, err = s.OnIntent(ir, &m.Session) + resp, sess, err = s.OnIntent(ir, m) if err != nil { return errors.New("OnIntent handler failed: " + err.Error()) } @@ -58,8 +58,8 @@ func (s *Skill) Handle(w io.Writer, b []byte) error { return errors.New("no OnSessionEnded handler defined") } ser := e.(*request.SessionEndedRequest) - if err = s.OnSessionEnded(ser); err != nil { - return errors.New("OnSessionEnded handler failed: " + err.Error()) + if err = s.OnSessionEnded(ser, m); err != nil { + return errors.New("OnSessionEnded handler failed:" + err.Error()) } // A skill cannot return a response to SessionEndedRequest. return nil diff --git a/customskill/skill_test.go b/customskill/skill_test.go index 68aa563..08ef024 100644 --- a/customskill/skill_test.go +++ b/customskill/skill_test.go @@ -38,7 +38,7 @@ func handleTests(t testingiface) { name: "happy-path-launch-request", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnLaunch: func(request *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { + OnLaunch: func(request *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { sessAttrs := make(map[string]interface{}) sessAttrs["name"] = "happy-path-launch-request" return response.New(), sessAttrs, nil @@ -62,7 +62,7 @@ func handleTests(t testingiface) { name: "happy-path-intent-request", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnIntent: func(intentRequest *request.IntentRequest, session *request.Session) (*response.Response, map[string]interface{}, error) { + OnIntent: func(intentRequest *request.IntentRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { sessAttrs := make(map[string]interface{}) sessAttrs["name"] = "happy-path-intent-request" return response.New(), sessAttrs, nil @@ -86,9 +86,9 @@ func handleTests(t testingiface) { name: "happy-path-intent-request-with-session-attributes", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnIntent: func(intentRequest *request.IntentRequest, session *request.Session) (*response.Response, map[string]interface{}, error) { - session.Attributes["name"] = "happy-path-intent-request-with-session-attributes" - return response.New(), session.Attributes, nil + OnIntent: func(intentRequest *request.IntentRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { + metadata.Session.Attributes["name"] = "happy-path-intent-request-with-session-attributes" + return response.New(), metadata.Session.Attributes, nil }, }, b: ` @@ -110,7 +110,7 @@ func handleTests(t testingiface) { name: "happy-path-session-ended-request", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnSessionEnded: func(endedRequest *request.SessionEndedRequest) error { + OnSessionEnded: func(endedRequest *request.SessionEndedRequest, metadata *request.Metadata) error { return nil }, }, @@ -203,7 +203,7 @@ func handleTests(t testingiface) { name: "on-launch-request-handler-error-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnLaunch: func(request *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { + OnLaunch: func(request *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { return nil, nil, errors.New("dummy error") }, }, @@ -242,7 +242,7 @@ func handleTests(t testingiface) { name: "on-intent-request-handler-error-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnIntent: func(intentRequest *request.IntentRequest, session *request.Session) (*response.Response, map[string]interface{}, error) { + OnIntent: func(intentRequest *request.IntentRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { return nil, nil, errors.New("dummy error") }, }, @@ -281,7 +281,7 @@ func handleTests(t testingiface) { name: "on-session-ended-request-handler-error-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnSessionEnded: func(endedRequest *request.SessionEndedRequest) error { + OnSessionEnded: func(endedRequest *request.SessionEndedRequest, metadata *request.Metadata) error { return errors.New("dummy error") }, }, @@ -302,7 +302,7 @@ func handleTests(t testingiface) { name: "responses-which-cannot-be-marshalled-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnLaunch: func(request *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { + OnLaunch: func(request *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { return nil, nil, nil }, }, @@ -326,7 +326,7 @@ func handleTests(t testingiface) { name: "writer-which-cannot-be-written-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnLaunch: func(request *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { + OnLaunch: func(request *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { return nil, nil, nil }, }, @@ -350,7 +350,7 @@ func handleTests(t testingiface) { name: "writer-which-partially-writes-returns-error", skill: &Skill{ ValidApplicationIDs: []string{"testApplicationId"}, - OnLaunch: func(request *request.LaunchRequest) (*response.Response, map[string]interface{}, error) { + OnLaunch: func(request *request.LaunchRequest, metadata *request.Metadata) (*response.Response, map[string]interface{}, error) { return nil, nil, nil }, }, diff --git a/customskill/types.go b/customskill/types.go index 4a5de06..d4f8190 100644 --- a/customskill/types.go +++ b/customskill/types.go @@ -8,7 +8,7 @@ import ( // A Skill represents an Alexa custom skill. type Skill struct { ValidApplicationIDs []string - OnLaunch func(*request.LaunchRequest) (*response.Response, map[string]interface{}, error) - OnIntent func(*request.IntentRequest, *request.Session) (*response.Response, map[string]interface{}, error) - OnSessionEnded func(*request.SessionEndedRequest) error + OnLaunch func(*request.LaunchRequest, *request.Metadata) (*response.Response, map[string]interface{}, error) + OnIntent func(*request.IntentRequest, *request.Metadata) (*response.Response, map[string]interface{}, error) + OnSessionEnded func(*request.SessionEndedRequest, *request.Metadata) error } From a2ab5a778c5980cec0f505ee45e6a54e2657adf4 Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Wed, 31 Jan 2018 07:57:32 -0800 Subject: [PATCH 2/6] Remove benchmark & testing interface --- customskill/skill_test.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/customskill/skill_test.go b/customskill/skill_test.go index 08ef024..d044d99 100644 --- a/customskill/skill_test.go +++ b/customskill/skill_test.go @@ -14,16 +14,6 @@ import ( ) func TestSkill_Handle(t *testing.T) { - handleTests(t) -} - -func BenchmarkSkill_Handle(b *testing.B) { - for n := 0; n < b.N; n++ { - handleTests(b) - } -} - -func handleTests(t testingiface) { var tests = []struct { name string skill *Skill @@ -408,11 +398,6 @@ func handleTests(t testingiface) { /* Test helper functions */ -type testingiface interface { - Logf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) -} - type badReadWriter struct { n int err error From 8e9f3dc79612be1c37bd01071d3d3c1e29335cd5 Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Wed, 31 Jan 2018 08:01:16 -0800 Subject: [PATCH 3/6] Use t.Run to properly name tests --- customskill/request/request_test.go | 32 +++++++++-------- customskill/skill_test.go | 53 +++++++++++++++-------------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/customskill/request/request_test.go b/customskill/request/request_test.go index f4071e4..9f15c68 100644 --- a/customskill/request/request_test.go +++ b/customskill/request/request_test.go @@ -194,25 +194,27 @@ func TestRequest_BootstrapFromJSON(t *testing.T) { } for _, test := range tests { - jsonUnmarshal = test.jsonUnmarshal + t.Run(test.name, func(t *testing.T) { + jsonUnmarshal = test.jsonUnmarshal - m, r, err := BootstrapFromJSON([]byte(test.payload)) - if !errorContains(err, test.partialErrorMessage) { - t.Errorf("%s: error mismatch:\n\tgot: %v\n\texpected: it to contain %s", test.name, err, pointerStr(test.partialErrorMessage)) - continue - } + m, r, err := BootstrapFromJSON([]byte(test.payload)) + if !errorContains(err, test.partialErrorMessage) { + t.Errorf("error mismatch:\n\tgot: %v\n\texpected: it to contain %s", err, pointerStr(test.partialErrorMessage)) + return + } - if test.partialErrorMessage != nil { - continue - } + if test.partialErrorMessage != nil { + return + } - if !reflect.DeepEqual(*m, *test.metadata) { - t.Errorf("%s: metadata mismatch:\n\tgot: %#v\n\twanted: %#v", test.name, *m, *test.metadata) - } + if !reflect.DeepEqual(*m, *test.metadata) { + t.Errorf("metadata mismatch:\n\tgot: %#v\n\twanted: %#v", *m, *test.metadata) + } - if !reflect.DeepEqual(r, test.request) { - t.Errorf("%s: request mismatch:\n\tgot: %#v\n\twanted: %#v", test.name, r, test.request) - } + if !reflect.DeepEqual(r, test.request) { + t.Errorf("request mismatch:\n\tgot: %#v\n\twanted: %#v", r, test.request) + } + }) } } diff --git a/customskill/skill_test.go b/customskill/skill_test.go index d044d99..b83f24b 100644 --- a/customskill/skill_test.go +++ b/customskill/skill_test.go @@ -363,36 +363,37 @@ func TestSkill_Handle(t *testing.T) { } for _, test := range tests { - t.Logf("Testing: %s", test.name) - // Override mocked functions - if test.requestBootstrapFromJSON != nil { - requestBootstrapFromJSON = test.requestBootstrapFromJSON - } - if test.jsonMarshal != nil { - jsonMarshal = test.jsonMarshal - } - err := test.skill.Handle(test.w, []byte(test.b)) - if !errorContains(err, test.partialErrorMessage) { - t.Errorf("%s: error mismatch:\n\tgot: %v\n\twanted: it to contain '%s'", test.name, err, pointerStr(test.partialErrorMessage)) - continue - } + t.Run(test.name, func(t *testing.T) { + // Override mocked functions + if test.requestBootstrapFromJSON != nil { + requestBootstrapFromJSON = test.requestBootstrapFromJSON + } + if test.jsonMarshal != nil { + jsonMarshal = test.jsonMarshal + } + err := test.skill.Handle(test.w, []byte(test.b)) + if !errorContains(err, test.partialErrorMessage) { + t.Errorf("error mismatch:\n\tgot: %v\n\twanted: it to contain '%s'", err, pointerStr(test.partialErrorMessage)) + return + } - // Restore mocked functions - requestBootstrapFromJSON = request.BootstrapFromJSON - jsonMarshal = json.Marshal + // Restore mocked functions + requestBootstrapFromJSON = request.BootstrapFromJSON + jsonMarshal = json.Marshal - if test.partialErrorMessage != nil { - continue - } + if test.partialErrorMessage != nil { + return + } - b, err := ioutil.ReadAll(test.w) - if err != nil { - t.Errorf("%s: failed to read test writer: %v", test.name, err) - } + b, err := ioutil.ReadAll(test.w) + if err != nil { + t.Errorf("failed to read test writer: %v", err) + } - if string(b) != test.written { - t.Errorf("%s: write mismatch:\n\tgot: %v\n\texpected:%s", test.name, string(b), test.written) - } + if string(b) != test.written { + t.Errorf("write mismatch:\n\tgot: %v\n\texpected:%s", string(b), test.written) + } + }) } } From 2bc3100de46af148ec620286833a10540c71eccd Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Wed, 31 Jan 2018 08:03:50 -0800 Subject: [PATCH 4/6] Properly record and restore mocked functions during testing --- customskill/request/request_test.go | 8 ++++++++ customskill/skill_test.go | 17 +++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/customskill/request/request_test.go b/customskill/request/request_test.go index 9f15c68..02a15e8 100644 --- a/customskill/request/request_test.go +++ b/customskill/request/request_test.go @@ -195,8 +195,16 @@ func TestRequest_BootstrapFromJSON(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + // Record & restore original functions. + jsonUnmarshalOriginal := jsonUnmarshal + defer func() { + jsonUnmarshal = jsonUnmarshalOriginal + }() + + // Override mocked functions. jsonUnmarshal = test.jsonUnmarshal + // Exercise the function being tested. m, r, err := BootstrapFromJSON([]byte(test.payload)) if !errorContains(err, test.partialErrorMessage) { t.Errorf("error mismatch:\n\tgot: %v\n\texpected: it to contain %s", err, pointerStr(test.partialErrorMessage)) diff --git a/customskill/skill_test.go b/customskill/skill_test.go index b83f24b..b0cc212 100644 --- a/customskill/skill_test.go +++ b/customskill/skill_test.go @@ -2,7 +2,6 @@ package customskill import ( "bytes" - "encoding/json" "io" "io/ioutil" "strings" @@ -364,23 +363,29 @@ func TestSkill_Handle(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - // Override mocked functions + // Record & restore original functions. + requestBootstrapFromJSONOriginal := requestBootstrapFromJSON + jsonMarshalOriginal := jsonMarshal + defer func() { + requestBootstrapFromJSON = requestBootstrapFromJSONOriginal + jsonMarshal = jsonMarshalOriginal + }() + + // Override mocked functions. if test.requestBootstrapFromJSON != nil { requestBootstrapFromJSON = test.requestBootstrapFromJSON } if test.jsonMarshal != nil { jsonMarshal = test.jsonMarshal } + + // Exercise the function being tested. err := test.skill.Handle(test.w, []byte(test.b)) if !errorContains(err, test.partialErrorMessage) { t.Errorf("error mismatch:\n\tgot: %v\n\twanted: it to contain '%s'", err, pointerStr(test.partialErrorMessage)) return } - // Restore mocked functions - requestBootstrapFromJSON = request.BootstrapFromJSON - jsonMarshal = json.Marshal - if test.partialErrorMessage != nil { return } From 54e0df4d1d60acf59506c9e50f84d48699cf92dc Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Wed, 31 Jan 2018 08:06:35 -0800 Subject: [PATCH 5/6] Use t.Run to properly name tests --- ssml/builder_test.go | 100 ++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/ssml/builder_test.go b/ssml/builder_test.go index 5dd5347..351b2d5 100644 --- a/ssml/builder_test.go +++ b/ssml/builder_test.go @@ -65,18 +65,20 @@ func TestBuilder_AppendAmazonEffect(t *testing.T) { } for _, test := range tests { - b, _ := NewBuilder() + t.Run(test.name, func(t *testing.T) { + b, _ := NewBuilder() - b.AppendAmazonEffect(test.effect, "text1").AppendAmazonEffect(test.effect, "text2") + b.AppendAmazonEffect(test.effect, "text1").AppendAmazonEffect(test.effect, "text2") - actual, errs := b.Build() - if !errsEqual(nil, errs) { - t.Errorf("%s: error mismatch: expected nil, got %v", test.name, errs) - } + actual, errs := b.Build() + if !errsEqual(nil, errs) { + t.Errorf("error mismatch: expected nil, got %v", errs) + } - if actual != test.expected { - t.Errorf("%s: output mismatch: expected %s, got %s", test.name, test.expected, actual) - } + if actual != test.expected { + t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + } + }) } } @@ -114,18 +116,20 @@ func TestBuilder_AppendAudio(t *testing.T) { } for _, test := range tests { - b, _ := NewBuilder() + t.Run(test.name, func(t *testing.T) { + b, _ := NewBuilder() - b.AppendAudio(test.src).AppendAudio(test.src) + b.AppendAudio(test.src).AppendAudio(test.src) - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("%s: error mismatch: expected %+v, got %+v", test.name, test.errs, errs) - } + actual, errs := b.Build() + if !errsEqual(test.errs, errs) { + t.Errorf("error mismatch: expected %+v, got %+v", test.errs, errs) + } - if actual != test.expected { - t.Errorf("%s: output mismatch: expected %s, got %s", test.name, test.expected, actual) - } + if actual != test.expected { + t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + } + }) } } @@ -202,18 +206,20 @@ func TestBuilder_AppendBreak(t *testing.T) { } for _, test := range tests { - b, _ := NewBuilder() + t.Run(test.name, func(t *testing.T) { + b, _ := NewBuilder() - b.AppendBreak(test.param).AppendBreak(test.param) + b.AppendBreak(test.param).AppendBreak(test.param) - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("%s: error mismatch: expected %v, got %v", test.name, test.errs, errs) - } + actual, errs := b.Build() + if !errsEqual(test.errs, errs) { + t.Errorf("error mismatch: expected %v, got %v", test.errs, errs) + } - if actual != test.expected { - t.Errorf("%s: output mismatch: expected %s, got %s", test.name, test.expected, actual) - } + if actual != test.expected { + t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + } + }) } } @@ -252,18 +258,20 @@ func TestBuilder_AppendEmphasis(t *testing.T) { } for _, test := range tests { - b, _ := NewBuilder() + t.Run(test.name, func(t *testing.T) { + b, _ := NewBuilder() - b.AppendEmphasis(test.level, "text1").AppendEmphasis(test.level, "text2") + b.AppendEmphasis(test.level, "text1").AppendEmphasis(test.level, "text2") - actual, errs := b.Build() - if !errsEqual(nil, errs) { - t.Errorf("%s: error mismatch: expected nil, got %v", test.name, errs) - } + actual, errs := b.Build() + if !errsEqual(nil, errs) { + t.Errorf("error mismatch: expected nil, got %v", errs) + } - if actual != test.expected { - t.Errorf("%s: output mismatch: expected %s, got %s", test.name, test.expected, actual) - } + if actual != test.expected { + t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + } + }) } } @@ -456,18 +464,20 @@ func TestBuilder_AppendProsody(t *testing.T) { } for _, test := range tests { - b, _ := NewBuilder() + t.Run(test.name, func(t *testing.T) { + b, _ := NewBuilder() - b.AppendProsody(test.rate, test.pitch, test.volume, "text1").AppendProsody(test.rate, test.pitch, test.volume, "text2") + b.AppendProsody(test.rate, test.pitch, test.volume, "text1").AppendProsody(test.rate, test.pitch, test.volume, "text2") - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("%s: error mismatch: expected %v, got %v", test.name, test.errs, errs) - } + actual, errs := b.Build() + if !errsEqual(test.errs, errs) { + t.Errorf("error mismatch: expected %v, got %v", test.errs, errs) + } - if actual != test.expected { - t.Errorf("%s: output mismatch: expected %s, got %s", test.name, test.expected, actual) - } + if actual != test.expected { + t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + } + }) } } From 6a51ad37be84187d4558f2b3ef645d43f146275e Mon Sep 17 00:00:00 2001 From: "Harrison H. Jones" Date: Wed, 31 Jan 2018 08:17:56 -0800 Subject: [PATCH 6/6] Migrate got/expected to got/wanted --- customskill/request/request_test.go | 6 +- customskill/skill_test.go | 4 +- ssml/builder_test.go | 474 ++++++++++++++-------------- 3 files changed, 242 insertions(+), 242 deletions(-) diff --git a/customskill/request/request_test.go b/customskill/request/request_test.go index 02a15e8..ee64e47 100644 --- a/customskill/request/request_test.go +++ b/customskill/request/request_test.go @@ -207,7 +207,7 @@ func TestRequest_BootstrapFromJSON(t *testing.T) { // Exercise the function being tested. m, r, err := BootstrapFromJSON([]byte(test.payload)) if !errorContains(err, test.partialErrorMessage) { - t.Errorf("error mismatch:\n\tgot: %v\n\texpected: it to contain %s", err, pointerStr(test.partialErrorMessage)) + t.Errorf("error mismatch:\n\tgot: %v\n\twanted: it to contain %s", err, pointerStr(test.partialErrorMessage)) return } @@ -216,11 +216,11 @@ func TestRequest_BootstrapFromJSON(t *testing.T) { } if !reflect.DeepEqual(*m, *test.metadata) { - t.Errorf("metadata mismatch:\n\tgot: %#v\n\twanted: %#v", *m, *test.metadata) + t.Errorf("metadata mismatch: got: %+v, wanted: %+v", *m, *test.metadata) } if !reflect.DeepEqual(r, test.request) { - t.Errorf("request mismatch:\n\tgot: %#v\n\twanted: %#v", r, test.request) + t.Errorf("request mismatch: got: %+v, wanted: %+v", r, test.request) } }) } diff --git a/customskill/skill_test.go b/customskill/skill_test.go index b0cc212..d24c938 100644 --- a/customskill/skill_test.go +++ b/customskill/skill_test.go @@ -382,7 +382,7 @@ func TestSkill_Handle(t *testing.T) { // Exercise the function being tested. err := test.skill.Handle(test.w, []byte(test.b)) if !errorContains(err, test.partialErrorMessage) { - t.Errorf("error mismatch:\n\tgot: %v\n\twanted: it to contain '%s'", err, pointerStr(test.partialErrorMessage)) + t.Errorf("error mismatch: got: %+v, wanted: it to contain '%s'", err, pointerStr(test.partialErrorMessage)) return } @@ -396,7 +396,7 @@ func TestSkill_Handle(t *testing.T) { } if string(b) != test.written { - t.Errorf("write mismatch:\n\tgot: %v\n\texpected:%s", string(b), test.written) + t.Errorf("write mismatch: got: %+v, wanted: %s", string(b), test.written) } }) } diff --git a/ssml/builder_test.go b/ssml/builder_test.go index 351b2d5..ac68d45 100644 --- a/ssml/builder_test.go +++ b/ssml/builder_test.go @@ -16,17 +16,17 @@ func TestNewBuilder_ReturnsEmptySSML(t *testing.T) { b, err := NewBuilder() if err != nil { - t.Fatalf("failed to get new builder: expected no error, got :%v", err) + t.Fatalf("new error mismatch: got: %+v, wanted: nil", err) } - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("build error mismatch: got: %+v, wanted: nil", errs) } - expected := "" - if actual != expected { - t.Errorf("output mismatch: expected %s, got %s", expected, actual) + wanted := "" + if got != wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, wanted) } } @@ -35,32 +35,32 @@ func TestBuilder_AppendPlainSpeech(t *testing.T) { b.AppendPlainSpeech("hello ").AppendPlainSpeech("world") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - expected := "hello world" - if actual != expected { - t.Errorf("output mismatch: expected %s, got %s", expected, actual) + wanted := "hello world" + if got != wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, wanted) } } func TestBuilder_AppendAmazonEffect(t *testing.T) { tests := []struct { - name string - effect amazoneffect.Effect - expected string + name string + effect amazoneffect.Effect + wanted string }{ { - name: "whispered", - effect: amazoneffect.Whispered, - expected: `text1text2`, + name: "whispered", + effect: amazoneffect.Whispered, + wanted: `text1text2`, }, { - name: "custom", - effect: amazoneffect.Effect("custom"), - expected: `text1text2`, + name: "custom", + effect: amazoneffect.Effect("custom"), + wanted: `text1text2`, }, } @@ -70,13 +70,13 @@ func TestBuilder_AppendAmazonEffect(t *testing.T) { b.AppendAmazonEffect(test.effect, "text1").AppendAmazonEffect(test.effect, "text2") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - if actual != test.expected { - t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + if got != test.wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, test.wanted) } }) } @@ -84,16 +84,16 @@ func TestBuilder_AppendAmazonEffect(t *testing.T) { func TestBuilder_AppendAudio(t *testing.T) { tests := []struct { - name string - src string - errs []error - expected string + name string + src string + errs []error + wanted string }{ { - name: "happyPath", - src: "https://domain.tld", - errs: nil, - expected: ``, + name: "happyPath", + src: "https://domain.tld", + errs: nil, + wanted: ``, }, { name: "nonHTTPSUrl", @@ -102,7 +102,7 @@ func TestBuilder_AppendAudio(t *testing.T) { errors.New("unsupported URL scheme type: must be https"), errors.New("unsupported URL scheme type: must be https"), }, - expected: ``, + wanted: ``, }, { name: "badUrl", @@ -111,7 +111,7 @@ func TestBuilder_AppendAudio(t *testing.T) { errors.New(`failed to parse src into a valid URL: parse %notarealurl: invalid URL escape "%no"`), errors.New(`failed to parse src into a valid URL: parse %notarealurl: invalid URL escape "%no"`), }, - expected: ``, + wanted: ``, }, } @@ -121,13 +121,13 @@ func TestBuilder_AppendAudio(t *testing.T) { b.AppendAudio(test.src).AppendAudio(test.src) - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("error mismatch: expected %+v, got %+v", test.errs, errs) + got, errs := b.Build() + if !errsEqual(errs, test.errs) { + t.Errorf("error mismatch: got: %+v, wanted: %+v", errs, test.errs) } - if actual != test.expected { - t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + if got != test.wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, test.wanted) } }) } @@ -135,64 +135,64 @@ func TestBuilder_AppendAudio(t *testing.T) { func TestBuilder_AppendBreak(t *testing.T) { tests := []struct { - name string - param interface{} - errs []error - expected string + name string + param interface{} + errs []error + wanted string }{ { - name: "default", - param: pause.Default, - errs: nil, - expected: ``, + name: "default", + param: pause.Default, + errs: nil, + wanted: ``, }, { - name: "none", - param: pause.None, - errs: nil, - expected: ``, + name: "none", + param: pause.None, + errs: nil, + wanted: ``, }, { - name: "x-weak", - param: pause.XWeak, - errs: nil, - expected: ``, + name: "x-weak", + param: pause.XWeak, + errs: nil, + wanted: ``, }, { - name: "weak", - param: pause.Weak, - errs: nil, - expected: ``, + name: "weak", + param: pause.Weak, + errs: nil, + wanted: ``, }, { - name: "medium", - param: pause.Medium, - errs: nil, - expected: ``, + name: "medium", + param: pause.Medium, + errs: nil, + wanted: ``, }, { - name: "strong", - param: pause.Strong, - errs: nil, - expected: ``, + name: "strong", + param: pause.Strong, + errs: nil, + wanted: ``, }, { - name: "x-strong", - param: pause.XStrong, - errs: nil, - expected: ``, + name: "x-strong", + param: pause.XStrong, + errs: nil, + wanted: ``, }, { - name: "custom", - param: pause.Strength("custom"), - errs: nil, - expected: ``, + name: "custom", + param: pause.Strength("custom"), + errs: nil, + wanted: ``, }, { - name: "time", - param: time.Second, - errs: nil, - expected: ``, + name: "time", + param: time.Second, + errs: nil, + wanted: ``, }, { name: "invalidType", @@ -201,7 +201,7 @@ func TestBuilder_AppendBreak(t *testing.T) { errors.New("unsupported parameter type: must be either pause.Strength or time.Duration"), errors.New("unsupported parameter type: must be either pause.Strength or time.Duration"), }, - expected: ``, + wanted: ``, }, } @@ -211,13 +211,13 @@ func TestBuilder_AppendBreak(t *testing.T) { b.AppendBreak(test.param).AppendBreak(test.param) - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("error mismatch: expected %v, got %v", test.errs, errs) + got, errs := b.Build() + if !errsEqual(errs, test.errs) { + t.Errorf("error mismatch: got: %+v, wanted: %+v", errs, test.errs) } - if actual != test.expected { - t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + if got != test.wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, test.wanted) } }) } @@ -225,35 +225,35 @@ func TestBuilder_AppendBreak(t *testing.T) { func TestBuilder_AppendEmphasis(t *testing.T) { tests := []struct { - name string - level emphasis.Level - text string - expected string + name string + level emphasis.Level + text string + wanted string }{ { - name: "default", - level: emphasis.Default, - expected: `text1text2`, + name: "default", + level: emphasis.Default, + wanted: `text1text2`, }, { - name: "strong", - level: emphasis.Strong, - expected: `text1text2`, + name: "strong", + level: emphasis.Strong, + wanted: `text1text2`, }, { - name: "moderate", - level: emphasis.Moderate, - expected: `text1text2`, + name: "moderate", + level: emphasis.Moderate, + wanted: `text1text2`, }, { - name: "reduced", - level: emphasis.Reduced, - expected: `text1text2`, + name: "reduced", + level: emphasis.Reduced, + wanted: `text1text2`, }, { - name: "reduced", - level: emphasis.Level("custom"), - expected: `text1text2`, + name: "reduced", + level: emphasis.Level("custom"), + wanted: `text1text2`, }, } @@ -263,13 +263,13 @@ func TestBuilder_AppendEmphasis(t *testing.T) { b.AppendEmphasis(test.level, "text1").AppendEmphasis(test.level, "text2") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - if actual != test.expected { - t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + if got != test.wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, test.wanted) } }) } @@ -280,153 +280,153 @@ func TestBuilder_AppendParagraph(t *testing.T) { b.AppendParagraph("text1").AppendParagraph("text2") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - expected := `

text1

text2

` - if actual != expected { - t.Errorf("expected %s, got %s", expected, actual) + wanted := `

text1

text2

` + if got != wanted { + t.Errorf("got: %s, wanted: %s", got, wanted) } } func TestBuilder_AppendProsody(t *testing.T) { tests := []struct { - name string - rate interface{} - pitch interface{} - volume interface{} - errs []error - expected string + name string + rate interface{} + pitch interface{} + volume interface{} + errs []error + wanted string }{ { - name: "x-slow, x-low, & silent", - rate: prosody.RateXSlow, - pitch: prosody.PitchXLow, - volume: prosody.VolumeSilent, - errs: nil, - expected: `text1text2`, + name: "x-slow, x-low, & silent", + rate: prosody.RateXSlow, + pitch: prosody.PitchXLow, + volume: prosody.VolumeSilent, + errs: nil, + wanted: `text1text2`, }, { - name: "slow, low, & x-soft", - rate: prosody.RateSlow, - pitch: prosody.PitchLow, - volume: prosody.VolumeXSoft, - errs: nil, - expected: `text1text2`, + name: "slow, low, & x-soft", + rate: prosody.RateSlow, + pitch: prosody.PitchLow, + volume: prosody.VolumeXSoft, + errs: nil, + wanted: `text1text2`, }, { - name: "medium, medium, & soft", - rate: prosody.RateMedium, - pitch: prosody.PitchMedium, - volume: prosody.VolumeSoft, - errs: nil, - expected: `text1text2`, + name: "medium, medium, & soft", + rate: prosody.RateMedium, + pitch: prosody.PitchMedium, + volume: prosody.VolumeSoft, + errs: nil, + wanted: `text1text2`, }, { - name: "fast, high, & medium", - rate: prosody.RateFast, - pitch: prosody.PitchHigh, - volume: prosody.VolumeMedium, - errs: nil, - expected: `text1text2`, + name: "fast, high, & medium", + rate: prosody.RateFast, + pitch: prosody.PitchHigh, + volume: prosody.VolumeMedium, + errs: nil, + wanted: `text1text2`, }, { - name: "x-fast, x-high, & loud", - rate: prosody.RateXFast, - pitch: prosody.PitchXHigh, - volume: prosody.VolumeLoud, - errs: nil, - expected: `text1text2`, + name: "x-fast, x-high, & loud", + rate: prosody.RateXFast, + pitch: prosody.PitchXHigh, + volume: prosody.VolumeLoud, + errs: nil, + wanted: `text1text2`, }, { - name: "x-fast, x-high, & x-loud", - rate: prosody.RateXFast, - pitch: prosody.PitchXHigh, - volume: prosody.VolumeXLoud, - errs: nil, - expected: `text1text2`, + name: "x-fast, x-high, & x-loud", + rate: prosody.RateXFast, + pitch: prosody.PitchXHigh, + volume: prosody.VolumeXLoud, + errs: nil, + wanted: `text1text2`, }, { - name: "custom", - rate: prosody.Rate("custom rate"), - pitch: prosody.Pitch("custom pitch"), - volume: prosody.Volume("custom volume"), - errs: nil, - expected: `text1text2`, + name: "custom", + rate: prosody.Rate("custom rate"), + pitch: prosody.Pitch("custom pitch"), + volume: prosody.Volume("custom volume"), + errs: nil, + wanted: `text1text2`, }, { - name: "onlyRate", - rate: prosody.RateXSlow, - pitch: nil, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "onlyRate", + rate: prosody.RateXSlow, + pitch: nil, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { - name: "onlyPitch", - rate: nil, - pitch: prosody.PitchXLow, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "onlyPitch", + rate: nil, + pitch: prosody.PitchXLow, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { - name: "onlyVolume", - rate: nil, - pitch: nil, - volume: prosody.VolumeSilent, - errs: nil, - expected: `text1text2`, + name: "onlyVolume", + rate: nil, + pitch: nil, + volume: prosody.VolumeSilent, + errs: nil, + wanted: `text1text2`, }, { - name: "percentageRate", - rate: 110, - pitch: nil, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "percentageRate", + rate: 110, + pitch: nil, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { - name: "positivePercentagePitch", - rate: nil, - pitch: 10, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "positivePercentagePitch", + rate: nil, + pitch: 10, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { - name: "negativePercentagePitch", - rate: nil, - pitch: -10, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "negativePercentagePitch", + rate: nil, + pitch: -10, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { - name: "positiveDbVolume", - rate: nil, - pitch: nil, - volume: 4, - errs: nil, - expected: `text1text2`, + name: "positiveDbVolume", + rate: nil, + pitch: nil, + volume: 4, + errs: nil, + wanted: `text1text2`, }, { - name: "negativeDbVolume", - rate: nil, - pitch: nil, - volume: -4, - errs: nil, - expected: `text1text2`, + name: "negativeDbVolume", + rate: nil, + pitch: nil, + volume: -4, + errs: nil, + wanted: `text1text2`, }, { - name: "allNil", - rate: nil, - pitch: nil, - volume: nil, - errs: nil, - expected: `text1text2`, + name: "allNil", + rate: nil, + pitch: nil, + volume: nil, + errs: nil, + wanted: `text1text2`, }, { name: "invalidRateType", @@ -437,7 +437,7 @@ func TestBuilder_AppendProsody(t *testing.T) { errors.New("unsupported rate type: must be either prosody.Rate or int"), errors.New("unsupported rate type: must be either prosody.Rate or int"), }, - expected: ``, + wanted: ``, }, { name: "invalidPitchType", @@ -448,7 +448,7 @@ func TestBuilder_AppendProsody(t *testing.T) { errors.New("unsupported pitch type: must be either prosody.Pitch or int"), errors.New("unsupported pitch type: must be either prosody.Pitch or int"), }, - expected: ``, + wanted: ``, }, { name: "invalidVolumeType", @@ -459,7 +459,7 @@ func TestBuilder_AppendProsody(t *testing.T) { errors.New("unsupported volume type: must be either prosody.Volume or int"), errors.New("unsupported volume type: must be either prosody.Volume or int"), }, - expected: ``, + wanted: ``, }, } @@ -469,13 +469,13 @@ func TestBuilder_AppendProsody(t *testing.T) { b.AppendProsody(test.rate, test.pitch, test.volume, "text1").AppendProsody(test.rate, test.pitch, test.volume, "text2") - actual, errs := b.Build() - if !errsEqual(test.errs, errs) { - t.Errorf("error mismatch: expected %v, got %v", test.errs, errs) + got, errs := b.Build() + if !errsEqual(errs, test.errs) { + t.Errorf("error mismatch: got: %+v, wanted: %+v", errs, test.errs) } - if actual != test.expected { - t.Errorf("output mismatch: expected %s, got %s", test.expected, actual) + if got != test.wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, test.wanted) } }) } @@ -487,14 +487,14 @@ func TestBuilder_AppendSentence(t *testing.T) { b.AppendSentence("text1") b.AppendSentence("text2") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - expected := `text1text2` - if actual != expected { - t.Errorf("output mismatch: expected %s, got %s", expected, actual) + wanted := `text1text2` + if got != wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, wanted) } } @@ -504,14 +504,14 @@ func TestBuilder_AppendSubstitution(t *testing.T) { b.AppendSubstitution("alias1", "text1") b.AppendSubstitution("alias2", "text2") - actual, errs := b.Build() + got, errs := b.Build() if !errsEqual(nil, errs) { - t.Errorf("error mismatch: expected nil, got %v", errs) + t.Errorf("error mismatch: got: %+v, wanted: nil", errs) } - expected := `text1text2` - if actual != expected { - t.Errorf("output mismatch: expected %s, got %s", expected, actual) + wanted := `text1text2` + if got != wanted { + t.Errorf("output mismatch: got: %s, wanted: %s", got, wanted) } } @@ -537,10 +537,10 @@ func TestAppendErrorConcurrency(t *testing.T) { wg.Wait() _, errs := b.Build() - actual := len(errs) - expected := numOfWorkers * numOfErrorsPerWorker - if actual != expected { - t.Errorf("error count mismatch: expected %d, got %d", actual, expected) + got := len(errs) + wanted := numOfWorkers * numOfErrorsPerWorker + if got != wanted { + t.Errorf("error count mismatch: got: %d, wanted: %d", got, wanted) } }