From 09b50bb568d04e0d75de6b640ddb50ffa89e3c1f Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Fri, 30 Aug 2019 15:49:36 -0700 Subject: [PATCH 1/6] Added the PlayBehavior property to SsmlOutputSpeech. --- Alexa.NET/Response/SsmlOutputSpeech.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Alexa.NET/Response/SsmlOutputSpeech.cs b/Alexa.NET/Response/SsmlOutputSpeech.cs index 725a389..94d2bad 100644 --- a/Alexa.NET/Response/SsmlOutputSpeech.cs +++ b/Alexa.NET/Response/SsmlOutputSpeech.cs @@ -1,4 +1,6 @@ +using Alexa.NET.Response.Directive; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Alexa.NET.Response { @@ -14,5 +16,9 @@ public string Type [JsonRequired] [JsonProperty("ssml")] public string Ssml { get; set; } + + [JsonProperty("playBehavior", NullValueHandling = NullValueHandling.Ignore)] + [JsonConverter(typeof(StringEnumConverter))] + public PlayBehavior PlayBehavior { get; set; } = PlayBehavior.Enqueue; } } \ No newline at end of file From 20535e54efe7ec41477fbd742a4977efef751ec3 Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Fri, 30 Aug 2019 21:14:57 -0700 Subject: [PATCH 2/6] Added PlayBehavior to IOutputSpeech. Made it optional. --- Alexa.NET/Response/IOutputSpeech.cs | 2 ++ Alexa.NET/Response/PlainTextOutputSpeech.cs | 6 ++++++ Alexa.NET/Response/SsmlOutputSpeech.cs | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Alexa.NET/Response/IOutputSpeech.cs b/Alexa.NET/Response/IOutputSpeech.cs index d267e8c..22be932 100644 --- a/Alexa.NET/Response/IOutputSpeech.cs +++ b/Alexa.NET/Response/IOutputSpeech.cs @@ -1,4 +1,5 @@ using Alexa.NET.Response.Converters; +using Alexa.NET.Response.Directive; using Newtonsoft.Json; namespace Alexa.NET.Response @@ -6,5 +7,6 @@ namespace Alexa.NET.Response [JsonConverter(typeof(OutputSpeechConverter))] public interface IOutputSpeech : IResponse { + PlayBehavior? PlayBehavior { get; set; } } } \ No newline at end of file diff --git a/Alexa.NET/Response/PlainTextOutputSpeech.cs b/Alexa.NET/Response/PlainTextOutputSpeech.cs index ffc747b..8f34d47 100644 --- a/Alexa.NET/Response/PlainTextOutputSpeech.cs +++ b/Alexa.NET/Response/PlainTextOutputSpeech.cs @@ -1,4 +1,6 @@ +using Alexa.NET.Response.Directive; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Alexa.NET.Response { @@ -14,5 +16,9 @@ public string Type [JsonRequired] [JsonProperty("text")] public string Text { get; set; } + + [JsonProperty("playBehavior", NullValueHandling = NullValueHandling.Ignore)] + [JsonConverter(typeof(StringEnumConverter))] + public PlayBehavior? PlayBehavior { get; set; } } } \ No newline at end of file diff --git a/Alexa.NET/Response/SsmlOutputSpeech.cs b/Alexa.NET/Response/SsmlOutputSpeech.cs index 94d2bad..2d7ef90 100644 --- a/Alexa.NET/Response/SsmlOutputSpeech.cs +++ b/Alexa.NET/Response/SsmlOutputSpeech.cs @@ -19,6 +19,6 @@ public string Type [JsonProperty("playBehavior", NullValueHandling = NullValueHandling.Ignore)] [JsonConverter(typeof(StringEnumConverter))] - public PlayBehavior PlayBehavior { get; set; } = PlayBehavior.Enqueue; + public PlayBehavior? PlayBehavior { get; set; } } } \ No newline at end of file From b77c4e346e75802dceebce1a7bff2c73af499fd9 Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Fri, 30 Aug 2019 22:05:29 -0700 Subject: [PATCH 3/6] Added more deserialization tests for PlainTextOutputSpeech and SsmlOutputSpeech. --- Alexa.NET.Tests/Alexa.NET.Tests.csproj | 6 ++++ ...PlainTextOutputSpeechWithPlayBehavior.json | 5 ++++ .../SsmlOutputSpeechWithPlayBehavior.json | 5 ++++ Alexa.NET.Tests/ResponseTests.cs | 29 +++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 Alexa.NET.Tests/Examples/PlainTextOutputSpeechWithPlayBehavior.json create mode 100644 Alexa.NET.Tests/Examples/SsmlOutputSpeechWithPlayBehavior.json diff --git a/Alexa.NET.Tests/Alexa.NET.Tests.csproj b/Alexa.NET.Tests/Alexa.NET.Tests.csproj index 53fe502..5cb5154 100644 --- a/Alexa.NET.Tests/Alexa.NET.Tests.csproj +++ b/Alexa.NET.Tests/Alexa.NET.Tests.csproj @@ -68,6 +68,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -110,6 +113,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Alexa.NET.Tests/Examples/PlainTextOutputSpeechWithPlayBehavior.json b/Alexa.NET.Tests/Examples/PlainTextOutputSpeechWithPlayBehavior.json new file mode 100644 index 0000000..4b7c224 --- /dev/null +++ b/Alexa.NET.Tests/Examples/PlainTextOutputSpeechWithPlayBehavior.json @@ -0,0 +1,5 @@ +{ + "type": "PlainText", + "text": "text content", + "playBehavior": "REPLACE_ALL" +} \ No newline at end of file diff --git a/Alexa.NET.Tests/Examples/SsmlOutputSpeechWithPlayBehavior.json b/Alexa.NET.Tests/Examples/SsmlOutputSpeechWithPlayBehavior.json new file mode 100644 index 0000000..7c51c48 --- /dev/null +++ b/Alexa.NET.Tests/Examples/SsmlOutputSpeechWithPlayBehavior.json @@ -0,0 +1,5 @@ +{ + "type": "SSML", + "ssml": "ssml content", + "playBehavior": "REPLACE_ENQUEUED" +} \ No newline at end of file diff --git a/Alexa.NET.Tests/ResponseTests.cs b/Alexa.NET.Tests/ResponseTests.cs index 93aed76..5379e75 100644 --- a/Alexa.NET.Tests/ResponseTests.cs +++ b/Alexa.NET.Tests/ResponseTests.cs @@ -259,6 +259,21 @@ public void DeserializesExamplePlainTextOutputSpeechJson() Assert.Equal("PlainText", outputSpeech.Type); Assert.Equal("text content", outputSpeech.Text); + Assert.Equal(null, outputSpeech.PlayBehavior); + } + + [Fact] + public void DeserializesExamplePlainTextOutputSpeechWithPlayBehaviorJson() + { + var deserialized = Utility.ExampleFileContent("PlainTextOutputSpeechWithPlayBehavior.json"); + + Assert.Equal(typeof(PlainTextOutputSpeech), deserialized.GetType()); + + var outputSpeech = (PlainTextOutputSpeech)deserialized; + + Assert.Equal("PlainText", outputSpeech.Type); + Assert.Equal("text content", outputSpeech.Text); + Assert.Equal(PlayBehavior.ReplaceAll, outputSpeech.PlayBehavior); } [Fact] @@ -274,6 +289,20 @@ public void DeserializesExampleSsmlOutputSpeechJson() Assert.Equal("ssml content", outputSpeech.Ssml); } + [Fact] + public void DeserializesExampleSsmlOutputSpeechWithPlayBehaviorJson() + { + var deserialized = Utility.ExampleFileContent("SsmlOutputSpeechWithPlayBehavior.json"); + + Assert.Equal(typeof(SsmlOutputSpeech), deserialized.GetType()); + + var outputSpeech = (SsmlOutputSpeech)deserialized; + + Assert.Equal("SSML", outputSpeech.Type); + Assert.Equal("ssml content", outputSpeech.Ssml); + Assert.Equal(PlayBehavior.ReplaceEnqueued, outputSpeech.PlayBehavior); + } + [Fact] public void DeserializesExampleAudioPlayerWithMetadataJson() { From 1567fb16968e78c4216d4e8fe658092272c66d97 Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Fri, 30 Aug 2019 23:31:26 -0700 Subject: [PATCH 4/6] Added serialization tests for PlainTextOutputSpeech and SsmlOutputSpeech. --- Alexa.NET.Tests/ResponseTests.cs | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/Alexa.NET.Tests/ResponseTests.cs b/Alexa.NET.Tests/ResponseTests.cs index 5379e75..14c9225 100644 --- a/Alexa.NET.Tests/ResponseTests.cs +++ b/Alexa.NET.Tests/ResponseTests.cs @@ -248,6 +248,24 @@ public void DeserializesExampleAskForPermissionsConsentJson() Assert.Equal("read::alexa:household:list", card.Permissions.First()); } + [Fact] + public void SerializesPlainTextOutputSpeechToJson() + { + var plainTextOutputSpeech = new PlainTextOutputSpeech { Text = "text content" }; + var json = JsonConvert.SerializeObject(plainTextOutputSpeech, Formatting.Indented, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + const string example = "PlainTextOutputSpeech.json"; + var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); + + workingJson = Regex.Replace(workingJson, @"\s", ""); + json = Regex.Replace(json, @"\s", ""); + + Assert.Equal(workingJson, json); + } + [Fact] public void DeserializesExamplePlainTextOutputSpeechJson() { @@ -262,6 +280,24 @@ public void DeserializesExamplePlainTextOutputSpeechJson() Assert.Equal(null, outputSpeech.PlayBehavior); } + [Fact] + public void SerializesPlainTextOutputSpeechWithPlayBehaviorToJson() + { + var plainTextOutputSpeech = new PlainTextOutputSpeech { Text = "text content", PlayBehavior = PlayBehavior.ReplaceAll }; + var json = JsonConvert.SerializeObject(plainTextOutputSpeech, Formatting.Indented, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + const string example = "PlainTextOutputSpeechWithPlayBehavior.json"; + var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); + + workingJson = Regex.Replace(workingJson, @"\s", ""); + json = Regex.Replace(json, @"\s", ""); + + Assert.Equal(workingJson, json); + } + [Fact] public void DeserializesExamplePlainTextOutputSpeechWithPlayBehaviorJson() { @@ -276,6 +312,24 @@ public void DeserializesExamplePlainTextOutputSpeechWithPlayBehaviorJson() Assert.Equal(PlayBehavior.ReplaceAll, outputSpeech.PlayBehavior); } + [Fact] + public void SerializesSsmlOutputSpeechToJson() + { + var ssmlOutputSpeech = new SsmlOutputSpeech { Ssml = "ssml content" }; + var json = JsonConvert.SerializeObject(ssmlOutputSpeech, Formatting.Indented, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + const string example = "SsmlOutputSpeech.json"; + var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); + + workingJson = Regex.Replace(workingJson, @"\s", ""); + json = Regex.Replace(json, @"\s", ""); + + Assert.Equal(workingJson, json); + } + [Fact] public void DeserializesExampleSsmlOutputSpeechJson() { @@ -289,6 +343,24 @@ public void DeserializesExampleSsmlOutputSpeechJson() Assert.Equal("ssml content", outputSpeech.Ssml); } + [Fact] + public void SerializesSsmlOutputSpeechWithPlayBehaviorToJson() + { + var ssmlOutputSpeech = new SsmlOutputSpeech { Ssml = "ssml content", PlayBehavior = PlayBehavior.ReplaceEnqueued }; + var json = JsonConvert.SerializeObject(ssmlOutputSpeech, Formatting.Indented, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + + const string example = "SsmlOutputSpeechWithPlayBehavior.json"; + var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); + + workingJson = Regex.Replace(workingJson, @"\s", ""); + json = Regex.Replace(json, @"\s", ""); + + Assert.Equal(workingJson, json); + } + [Fact] public void DeserializesExampleSsmlOutputSpeechWithPlayBehaviorJson() { From 4e4d60eccb6c2c712f26fcd539a7ad041d4f6875 Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Fri, 30 Aug 2019 23:36:08 -0700 Subject: [PATCH 5/6] Fixed the test DeserializesExampleSsmlOutputSpeechJson. --- Alexa.NET.Tests/ResponseTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Alexa.NET.Tests/ResponseTests.cs b/Alexa.NET.Tests/ResponseTests.cs index 14c9225..d99275d 100644 --- a/Alexa.NET.Tests/ResponseTests.cs +++ b/Alexa.NET.Tests/ResponseTests.cs @@ -341,6 +341,7 @@ public void DeserializesExampleSsmlOutputSpeechJson() Assert.Equal("SSML", outputSpeech.Type); Assert.Equal("ssml content", outputSpeech.Ssml); + Assert.Equal(null, outputSpeech.PlayBehavior); } [Fact] From fa6c490d61a658a65cb222012a73ee1724a396ee Mon Sep 17 00:00:00 2001 From: Evgeny Nabokov Date: Sat, 31 Aug 2019 23:21:33 -0700 Subject: [PATCH 6/6] Tidied up serialization tests. --- Alexa.NET.Tests/ResponseTests.cs | 65 +++----------------------------- 1 file changed, 5 insertions(+), 60 deletions(-) diff --git a/Alexa.NET.Tests/ResponseTests.cs b/Alexa.NET.Tests/ResponseTests.cs index d99275d..4ad7086 100644 --- a/Alexa.NET.Tests/ResponseTests.cs +++ b/Alexa.NET.Tests/ResponseTests.cs @@ -54,18 +54,7 @@ public void Should_create_same_json_response_as_example() } }; - var json = JsonConvert.SerializeObject(skillResponse, Formatting.Indented, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - const string example = "Response.json"; - var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); - - workingJson = Regex.Replace(workingJson, @"\s", ""); - json = Regex.Replace(json, @"\s", ""); - - Assert.Equal(workingJson, json); + Assert.True(Utility.CompareJson(skillResponse, "Response.json")); } [Fact] @@ -252,18 +241,7 @@ public void DeserializesExampleAskForPermissionsConsentJson() public void SerializesPlainTextOutputSpeechToJson() { var plainTextOutputSpeech = new PlainTextOutputSpeech { Text = "text content" }; - var json = JsonConvert.SerializeObject(plainTextOutputSpeech, Formatting.Indented, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - const string example = "PlainTextOutputSpeech.json"; - var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); - - workingJson = Regex.Replace(workingJson, @"\s", ""); - json = Regex.Replace(json, @"\s", ""); - - Assert.Equal(workingJson, json); + Assert.True(Utility.CompareJson(plainTextOutputSpeech, "PlainTextOutputSpeech.json")); } [Fact] @@ -284,18 +262,7 @@ public void DeserializesExamplePlainTextOutputSpeechJson() public void SerializesPlainTextOutputSpeechWithPlayBehaviorToJson() { var plainTextOutputSpeech = new PlainTextOutputSpeech { Text = "text content", PlayBehavior = PlayBehavior.ReplaceAll }; - var json = JsonConvert.SerializeObject(plainTextOutputSpeech, Formatting.Indented, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - const string example = "PlainTextOutputSpeechWithPlayBehavior.json"; - var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); - - workingJson = Regex.Replace(workingJson, @"\s", ""); - json = Regex.Replace(json, @"\s", ""); - - Assert.Equal(workingJson, json); + Assert.True(Utility.CompareJson(plainTextOutputSpeech, "PlainTextOutputSpeechWithPlayBehavior.json")); } [Fact] @@ -316,18 +283,7 @@ public void DeserializesExamplePlainTextOutputSpeechWithPlayBehaviorJson() public void SerializesSsmlOutputSpeechToJson() { var ssmlOutputSpeech = new SsmlOutputSpeech { Ssml = "ssml content" }; - var json = JsonConvert.SerializeObject(ssmlOutputSpeech, Formatting.Indented, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - const string example = "SsmlOutputSpeech.json"; - var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); - - workingJson = Regex.Replace(workingJson, @"\s", ""); - json = Regex.Replace(json, @"\s", ""); - - Assert.Equal(workingJson, json); + Assert.True(Utility.CompareJson(ssmlOutputSpeech, "SsmlOutputSpeech.json")); } [Fact] @@ -348,18 +304,7 @@ public void DeserializesExampleSsmlOutputSpeechJson() public void SerializesSsmlOutputSpeechWithPlayBehaviorToJson() { var ssmlOutputSpeech = new SsmlOutputSpeech { Ssml = "ssml content", PlayBehavior = PlayBehavior.ReplaceEnqueued }; - var json = JsonConvert.SerializeObject(ssmlOutputSpeech, Formatting.Indented, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }); - - const string example = "SsmlOutputSpeechWithPlayBehavior.json"; - var workingJson = File.ReadAllText(Path.Combine(ExamplesPath, example)); - - workingJson = Regex.Replace(workingJson, @"\s", ""); - json = Regex.Replace(json, @"\s", ""); - - Assert.Equal(workingJson, json); + Assert.True(Utility.CompareJson(ssmlOutputSpeech, "SsmlOutputSpeechWithPlayBehavior.json")); } [Fact]