From 98fd54120d0bf7f58f6b6366a6792bf56ab40377 Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 11:35:05 +0200 Subject: [PATCH 1/7] Add OCR Numbers Test Generator --- exercises/ocr-numbers/OcrNumbersTest.cs | 222 ++++++++++++++---------- generators/Exercises/OcrNumbers.cs | 46 +++++ 2 files changed, 180 insertions(+), 88 deletions(-) create mode 100644 generators/Exercises/OcrNumbers.cs diff --git a/exercises/ocr-numbers/OcrNumbersTest.cs b/exercises/ocr-numbers/OcrNumbersTest.cs index 723ccf9d7f..f731324231 100644 --- a/exercises/ocr-numbers/OcrNumbersTest.cs +++ b/exercises/ocr-numbers/OcrNumbersTest.cs @@ -1,154 +1,200 @@ -using Xunit; +// This file was auto-generated based on version 1.0.0 of the canonical data. + +using Xunit; public class OcrNumbersTest { [Fact] - public void Recognizes_zero() + public void Recognizes_0() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - "| |" + "\n" + - "|_|" + "\n" + - " "); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "| |" + "\n" + + "|_|" + "\n" + + " "); Assert.Equal("0", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_one() + public void Recognizes_1() { - var converted = OcrNumbers.Convert(" " + "\n" + - " |" + "\n" + - " |" + "\n" + - " "); + var converted = OcrNumbers.Convert( + " " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "); Assert.Equal("1", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_two() + public void Unreadable_but_correctly_sized_inputs_return_() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - " _|" + "\n" + - "|_ " + "\n" + - " "); - Assert.Equal("2", converted); + var converted = OcrNumbers.Convert( + " " + "\n" + + " _" + "\n" + + " |" + "\n" + + " "); + Assert.Equal("?", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_three() + public void Input_with_a_number_of_lines_that_is_not_a_multiple_of_four_raises_an_error() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - " _|" + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("3", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "| |" + "\n" + + " "); + Assert.Equal("-1", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_four() + public void Input_with_a_number_of_columns_that_is_not_a_multiple_of_three_raises_an_error() { - var converted = OcrNumbers.Convert(" " + "\n" + - "|_|" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("4", converted); + var converted = OcrNumbers.Convert( + " " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "); + Assert.Equal("-1", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_five() + public void Recognizes_110101100() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - "|_ " + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("5", converted); + var converted = OcrNumbers.Convert( + " _ _ _ _ " + "\n" + + " | || | || | | || || |" + "\n" + + " | ||_| ||_| | ||_||_|" + "\n" + + " "); + Assert.Equal("110101100", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_six() + public void Garbled_numbers_in_a_string_are_replaced_with_() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - "|_ " + "\n" + - "|_|" + "\n" + - " "); - Assert.Equal("6", converted); + var converted = OcrNumbers.Convert( + " _ _ _ " + "\n" + + " | || | || | || || |" + "\n" + + " | | _| ||_| | ||_||_|" + "\n" + + " "); + Assert.Equal("11?10?1?0", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_seven() + public void Recognizes_2() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - " |" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("7", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + " _|" + "\n" + + "|_ " + "\n" + + " "); + Assert.Equal("2", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_eight() + public void Recognizes_3() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - "|_|" + "\n" + - "|_|" + "\n" + - " "); - Assert.Equal("8", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + " _|" + "\n" + + " _|" + "\n" + + " "); + Assert.Equal("3", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_nine() + public void Recognizes_4() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - "|_|" + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("9", converted); + var converted = OcrNumbers.Convert( + " " + "\n" + + "|_|" + "\n" + + " |" + "\n" + + " "); + Assert.Equal("4", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_garble() + public void Recognizes_5() { - var converted = OcrNumbers.Convert(" " + "\n" + - "| |" + "\n" + - "| |" + "\n" + - " "); - Assert.Equal("?", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "|_ " + "\n" + + " _|" + "\n" + + " "); + Assert.Equal("5", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_ten() + public void Recognizes_6() { - var converted = OcrNumbers.Convert(" _ " + "\n" + - " || |" + "\n" + - " ||_|" + "\n" + - " "); - Assert.Equal("10", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "|_ " + "\n" + + "|_|" + "\n" + + " "); + Assert.Equal("6", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_110101100() + public void Recognizes_7() { - var converted = OcrNumbers.Convert(" _ _ _ _ " + "\n" + - " | || | || | | || || |" + "\n" + - " | ||_| ||_| | ||_||_|" + "\n" + - " "); - Assert.Equal("110101100", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "); + Assert.Equal("7", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_numbers_and_garble() + public void Recognizes_8() { - var converted = OcrNumbers.Convert(" _ _ _ " + "\n" + - " | || | || | || || |" + "\n" + - " | | _| ||_| | ||_||_|" + "\n" + - " "); - Assert.Equal("11?10?1?0", converted); + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "|_|" + "\n" + + "|_|" + "\n" + + " "); + Assert.Equal("8", converted); + } + + [Fact(Skip = "Remove to run test")] + public void Recognizes_9() + { + var converted = OcrNumbers.Convert( + " _ " + "\n" + + "|_|" + "\n" + + " _|" + "\n" + + " "); + Assert.Equal("9", converted); } [Fact(Skip = "Remove to run test")] - public void Recognizes_1234567890() + public void Recognizes_string_of_decimal_numbers() { - var converted = OcrNumbers.Convert(" _ _ _ _ _ _ _ _ " + "\n" + - " | _| _||_||_ |_ ||_||_|| |" + "\n" + - " ||_ _| | _||_| ||_| _||_|" + "\n" + - " "); + var converted = OcrNumbers.Convert( + " _ _ _ _ _ _ _ _ " + "\n" + + " | _| _||_||_ |_ ||_||_|| |" + "\n" + + " ||_ _| | _||_| ||_| _||_|" + "\n" + + " "); Assert.Equal("1234567890", converted); } + + [Fact(Skip = "Remove to run test")] + public void Numbers_separated_by_empty_lines_are_recognized_lines_are_joined_by_commas_() + { + var converted = OcrNumbers.Convert( + " _ _ " + "\n" + + " | _| _|" + "\n" + + " ||_ _|" + "\n" + + " " + "\n" + + " _ _ " + "\n" + + "|_||_ |_ " + "\n" + + " | _||_|" + "\n" + + " " + "\n" + + " _ _ _ " + "\n" + + " ||_||_|" + "\n" + + " ||_| _|" + "\n" + + " "); + Assert.Equal("123,456,789", converted); + } } \ No newline at end of file diff --git a/generators/Exercises/OcrNumbers.cs b/generators/Exercises/OcrNumbers.cs new file mode 100644 index 0000000000..d112522fe5 --- /dev/null +++ b/generators/Exercises/OcrNumbers.cs @@ -0,0 +1,46 @@ +using System.Text; +using Generators.Input; +using Generators.Output; + +namespace Generators.Exercises +{ + public class OcrNumbers : Exercise + { + protected override void UpdateCanonicalData(CanonicalData canonicalData) + { + foreach (var canonicalDataCase in canonicalData.Cases) + { + canonicalDataCase.Properties["input"] = ToDigit(canonicalDataCase.Properties["input"]); + } + } + + protected override string RenderTestMethodBodyAct(TestMethodBody testMethodBody) + { + const string template = @"var converted = {{MethodInvocation}};"; + + var templateParameters = new + { + MethodInvocation = testMethodBody.Data.TestedMethodInvocation + }; + + return TemplateRenderer.RenderInline(template, templateParameters); + } + + protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody) + { + const string template = @"Assert.Equal(""{{Expected}}"", converted);"; + + var templateParameters = new { Expected = testMethodBody.CanonicalDataCase.Expected }; + + return TemplateRenderer.RenderInline(template, templateParameters); + } + + private UnescapedValue ToDigit(string[] input) + { + const string template = @"{% for item in {{input}} %} +""{{item}}""{% if forloop.last == false %} + ""\n"" +{% endif %}{% endfor %}"; + + return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input })); + } + } +} From b6e0c5d4c18bfe51fd96a2862c4d8ae168506402 Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 11:37:59 +0200 Subject: [PATCH 2/7] - Cleanup using - Rename method to more meaningful --- exercises/ocr-numbers/OcrNumbers.csproj | 2 +- exercises/ocr-numbers/OcrNumbers.csproj.user | 6 ++++++ exercises/two-bucket/TwoBucket.csproj.user | 6 ++++++ generators/Exercises/OcrNumbers.cs | 7 +++---- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 exercises/ocr-numbers/OcrNumbers.csproj.user create mode 100644 exercises/two-bucket/TwoBucket.csproj.user diff --git a/exercises/ocr-numbers/OcrNumbers.csproj b/exercises/ocr-numbers/OcrNumbers.csproj index 49f16de67a..20ec95f58e 100644 --- a/exercises/ocr-numbers/OcrNumbers.csproj +++ b/exercises/ocr-numbers/OcrNumbers.csproj @@ -5,7 +5,7 @@ - + diff --git a/exercises/ocr-numbers/OcrNumbers.csproj.user b/exercises/ocr-numbers/OcrNumbers.csproj.user new file mode 100644 index 0000000000..0b0f24d530 --- /dev/null +++ b/exercises/ocr-numbers/OcrNumbers.csproj.user @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/exercises/two-bucket/TwoBucket.csproj.user b/exercises/two-bucket/TwoBucket.csproj.user new file mode 100644 index 0000000000..0b0f24d530 --- /dev/null +++ b/exercises/two-bucket/TwoBucket.csproj.user @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/generators/Exercises/OcrNumbers.cs b/generators/Exercises/OcrNumbers.cs index d112522fe5..c643b6ac0b 100644 --- a/generators/Exercises/OcrNumbers.cs +++ b/generators/Exercises/OcrNumbers.cs @@ -1,5 +1,4 @@ -using System.Text; -using Generators.Input; +using Generators.Input; using Generators.Output; namespace Generators.Exercises @@ -10,7 +9,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Properties["input"] = ToDigit(canonicalDataCase.Properties["input"]); + canonicalDataCase.Properties["input"] = ToDigitRepresentation(canonicalDataCase.Properties["input"]); } } @@ -35,7 +34,7 @@ protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBo return TemplateRenderer.RenderInline(template, templateParameters); } - private UnescapedValue ToDigit(string[] input) + private UnescapedValue ToDigitRepresentation(string[] input) { const string template = @"{% for item in {{input}} %} ""{{item}}""{% if forloop.last == false %} + ""\n"" +{% endif %}{% endfor %}"; From 2aa71934de148f181f957d631630e1b913d21b94 Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 12:19:59 +0200 Subject: [PATCH 3/7] Revert unwanted .csproj changes --- exercises/ocr-numbers/OcrNumbers.csproj | 2 +- exercises/ocr-numbers/OcrNumbers.csproj.user | 6 ------ exercises/two-bucket/TwoBucket.csproj.user | 6 ------ generators/Exercises/OcrNumbers.cs | 7 ++++--- 4 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 exercises/ocr-numbers/OcrNumbers.csproj.user delete mode 100644 exercises/two-bucket/TwoBucket.csproj.user diff --git a/exercises/ocr-numbers/OcrNumbers.csproj b/exercises/ocr-numbers/OcrNumbers.csproj index 20ec95f58e..49f16de67a 100644 --- a/exercises/ocr-numbers/OcrNumbers.csproj +++ b/exercises/ocr-numbers/OcrNumbers.csproj @@ -5,7 +5,7 @@ - + diff --git a/exercises/ocr-numbers/OcrNumbers.csproj.user b/exercises/ocr-numbers/OcrNumbers.csproj.user deleted file mode 100644 index 0b0f24d530..0000000000 --- a/exercises/ocr-numbers/OcrNumbers.csproj.user +++ /dev/null @@ -1,6 +0,0 @@ - - - - true - - \ No newline at end of file diff --git a/exercises/two-bucket/TwoBucket.csproj.user b/exercises/two-bucket/TwoBucket.csproj.user deleted file mode 100644 index 0b0f24d530..0000000000 --- a/exercises/two-bucket/TwoBucket.csproj.user +++ /dev/null @@ -1,6 +0,0 @@ - - - - true - - \ No newline at end of file diff --git a/generators/Exercises/OcrNumbers.cs b/generators/Exercises/OcrNumbers.cs index c643b6ac0b..d112522fe5 100644 --- a/generators/Exercises/OcrNumbers.cs +++ b/generators/Exercises/OcrNumbers.cs @@ -1,4 +1,5 @@ -using Generators.Input; +using System.Text; +using Generators.Input; using Generators.Output; namespace Generators.Exercises @@ -9,7 +10,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Properties["input"] = ToDigitRepresentation(canonicalDataCase.Properties["input"]); + canonicalDataCase.Properties["input"] = ToDigit(canonicalDataCase.Properties["input"]); } } @@ -34,7 +35,7 @@ protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBo return TemplateRenderer.RenderInline(template, templateParameters); } - private UnescapedValue ToDigitRepresentation(string[] input) + private UnescapedValue ToDigit(string[] input) { const string template = @"{% for item in {{input}} %} ""{{item}}""{% if forloop.last == false %} + ""\n"" +{% endif %}{% endfor %}"; From 1b753283acdbfb24d8029d941046aa29563ad3b0 Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 13:03:04 +0200 Subject: [PATCH 4/7] Simplify test generator --- exercises/ocr-numbers/OcrNumbersTest.cs | 218 ++++++++++++------------ generators/Exercises/OcrNumbers.cs | 37 +--- 2 files changed, 118 insertions(+), 137 deletions(-) diff --git a/exercises/ocr-numbers/OcrNumbersTest.cs b/exercises/ocr-numbers/OcrNumbersTest.cs index f731324231..f32251b98e 100644 --- a/exercises/ocr-numbers/OcrNumbersTest.cs +++ b/exercises/ocr-numbers/OcrNumbersTest.cs @@ -7,194 +7,194 @@ public class OcrNumbersTest [Fact] public void Recognizes_0() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "| |" + "\n" + - "|_|" + "\n" + - " "); - Assert.Equal("0", converted); + var input = " _ " + "\n" + + "| |" + "\n" + + "|_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("0", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_1() { - var converted = OcrNumbers.Convert( - " " + "\n" + - " |" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("1", converted); + var input = " " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("1", actual); } [Fact(Skip = "Remove to run test")] public void Unreadable_but_correctly_sized_inputs_return_() { - var converted = OcrNumbers.Convert( - " " + "\n" + - " _" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("?", converted); + var input = " " + "\n" + + " _" + "\n" + + " |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("?", actual); } [Fact(Skip = "Remove to run test")] public void Input_with_a_number_of_lines_that_is_not_a_multiple_of_four_raises_an_error() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "| |" + "\n" + - " "); - Assert.Equal("-1", converted); + var input = " _ " + "\n" + + "| |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("-1", actual); } [Fact(Skip = "Remove to run test")] public void Input_with_a_number_of_columns_that_is_not_a_multiple_of_three_raises_an_error() { - var converted = OcrNumbers.Convert( - " " + "\n" + - " |" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("-1", converted); + var input = " " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("-1", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_110101100() { - var converted = OcrNumbers.Convert( - " _ _ _ _ " + "\n" + - " | || | || | | || || |" + "\n" + - " | ||_| ||_| | ||_||_|" + "\n" + - " "); - Assert.Equal("110101100", converted); + var input = " _ _ _ _ " + "\n" + + " | || | || | | || || |" + "\n" + + " | ||_| ||_| | ||_||_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("110101100", actual); } [Fact(Skip = "Remove to run test")] public void Garbled_numbers_in_a_string_are_replaced_with_() { - var converted = OcrNumbers.Convert( - " _ _ _ " + "\n" + - " | || | || | || || |" + "\n" + - " | | _| ||_| | ||_||_|" + "\n" + - " "); - Assert.Equal("11?10?1?0", converted); + var input = " _ _ _ " + "\n" + + " | || | || | || || |" + "\n" + + " | | _| ||_| | ||_||_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("11?10?1?0", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_2() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - " _|" + "\n" + - "|_ " + "\n" + - " "); - Assert.Equal("2", converted); + var input = " _ " + "\n" + + " _|" + "\n" + + "|_ " + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("2", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_3() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - " _|" + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("3", converted); + var input = " _ " + "\n" + + " _|" + "\n" + + " _|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("3", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_4() { - var converted = OcrNumbers.Convert( - " " + "\n" + - "|_|" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("4", converted); + var input = " " + "\n" + + "|_|" + "\n" + + " |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("4", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_5() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "|_ " + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("5", converted); + var input = " _ " + "\n" + + "|_ " + "\n" + + " _|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("5", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_6() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "|_ " + "\n" + - "|_|" + "\n" + - " "); - Assert.Equal("6", converted); + var input = " _ " + "\n" + + "|_ " + "\n" + + "|_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("6", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_7() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - " |" + "\n" + - " |" + "\n" + - " "); - Assert.Equal("7", converted); + var input = " _ " + "\n" + + " |" + "\n" + + " |" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("7", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_8() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "|_|" + "\n" + - "|_|" + "\n" + - " "); - Assert.Equal("8", converted); + var input = " _ " + "\n" + + "|_|" + "\n" + + "|_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("8", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_9() { - var converted = OcrNumbers.Convert( - " _ " + "\n" + - "|_|" + "\n" + - " _|" + "\n" + - " "); - Assert.Equal("9", converted); + var input = " _ " + "\n" + + "|_|" + "\n" + + " _|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("9", actual); } [Fact(Skip = "Remove to run test")] public void Recognizes_string_of_decimal_numbers() { - var converted = OcrNumbers.Convert( - " _ _ _ _ _ _ _ _ " + "\n" + - " | _| _||_||_ |_ ||_||_|| |" + "\n" + - " ||_ _| | _||_| ||_| _||_|" + "\n" + - " "); - Assert.Equal("1234567890", converted); + var input = " _ _ _ _ _ _ _ _ " + "\n" + + " | _| _||_||_ |_ ||_||_|| |" + "\n" + + " ||_ _| | _||_| ||_| _||_|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("1234567890", actual); } [Fact(Skip = "Remove to run test")] public void Numbers_separated_by_empty_lines_are_recognized_lines_are_joined_by_commas_() { - var converted = OcrNumbers.Convert( - " _ _ " + "\n" + - " | _| _|" + "\n" + - " ||_ _|" + "\n" + - " " + "\n" + - " _ _ " + "\n" + - "|_||_ |_ " + "\n" + - " | _||_|" + "\n" + - " " + "\n" + - " _ _ _ " + "\n" + - " ||_||_|" + "\n" + - " ||_| _|" + "\n" + - " "); - Assert.Equal("123,456,789", converted); + var input = " _ _ " + "\n" + + " | _| _|" + "\n" + + " ||_ _|" + "\n" + + " " + "\n" + + " _ _ " + "\n" + + "|_||_ |_ " + "\n" + + " | _||_|" + "\n" + + " " + "\n" + + " _ _ _ " + "\n" + + " ||_||_|" + "\n" + + " ||_| _|" + "\n" + + " "; + var actual = OcrNumbers.Convert(input); + Assert.Equal("123,456,789", actual); } } \ No newline at end of file diff --git a/generators/Exercises/OcrNumbers.cs b/generators/Exercises/OcrNumbers.cs index d112522fe5..e481f03db4 100644 --- a/generators/Exercises/OcrNumbers.cs +++ b/generators/Exercises/OcrNumbers.cs @@ -1,5 +1,4 @@ -using System.Text; -using Generators.Input; +using Generators.Input; using Generators.Output; namespace Generators.Exercises @@ -10,35 +9,17 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Properties["input"] = ToDigit(canonicalDataCase.Properties["input"]); + canonicalDataCase.Properties["input"] = ToDigitStringRepresentation(canonicalDataCase.Properties["input"]); + canonicalDataCase.Expected = canonicalDataCase.Expected.ToString(); + canonicalDataCase.UseVariableForTested = true; + canonicalDataCase.UseVariablesForInput = true; } } - - protected override string RenderTestMethodBodyAct(TestMethodBody testMethodBody) - { - const string template = @"var converted = {{MethodInvocation}};"; - - var templateParameters = new - { - MethodInvocation = testMethodBody.Data.TestedMethodInvocation - }; - - return TemplateRenderer.RenderInline(template, templateParameters); - } - - protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody) - { - const string template = @"Assert.Equal(""{{Expected}}"", converted);"; - - var templateParameters = new { Expected = testMethodBody.CanonicalDataCase.Expected }; - - return TemplateRenderer.RenderInline(template, templateParameters); - } - - private UnescapedValue ToDigit(string[] input) + + private UnescapedValue ToDigitStringRepresentation(string[] input) { - const string template = @"{% for item in {{input}} %} -""{{item}}""{% if forloop.last == false %} + ""\n"" +{% endif %}{% endfor %}"; + const string template = @" {% for item in {{input}} %}{% if forloop.first == true %}""{{item}}"" + ""\n"" +{% continue %}{% endif %} + ""{{item}}""{% if forloop.last == false %} + ""\n"" +{% endif %}{% endfor %}"; return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input })); } From b06d8ad527323ab376082f5b98674f545551010b Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 15:21:43 +0200 Subject: [PATCH 5/7] Set Exception for failure cases --- generators/Exercises/OcrNumbers.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generators/Exercises/OcrNumbers.cs b/generators/Exercises/OcrNumbers.cs index e481f03db4..cd18c6df64 100644 --- a/generators/Exercises/OcrNumbers.cs +++ b/generators/Exercises/OcrNumbers.cs @@ -1,4 +1,5 @@ -using Generators.Input; +using System; +using Generators.Input; using Generators.Output; namespace Generators.Exercises @@ -9,6 +10,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { + canonicalDataCase.ExceptionThrown = (canonicalDataCase.Expected is long && canonicalDataCase.Expected <= 0) ? typeof(ArgumentException) : null; canonicalDataCase.Properties["input"] = ToDigitStringRepresentation(canonicalDataCase.Properties["input"]); canonicalDataCase.Expected = canonicalDataCase.Expected.ToString(); canonicalDataCase.UseVariableForTested = true; From 3a6b4ba765319e9a168a011d5907197f82bdcab1 Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 22:56:46 +0200 Subject: [PATCH 6/7] Modify example to cover: - error cases: invalid lines/columns numbers - multiline input joined by commas --- exercises/ocr-numbers/Example.cs | 67 ++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/exercises/ocr-numbers/Example.cs b/exercises/ocr-numbers/Example.cs index abaa4d8f7a..912966ecbd 100644 --- a/exercises/ocr-numbers/Example.cs +++ b/exercises/ocr-numbers/Example.cs @@ -10,10 +10,41 @@ public static class OcrNumbers public static string Convert(string input) { var lines = input.Split('\n'); - + + if (lines.Length > CharacterHeight) + lines = GetTransformedInput(lines); + return Positions(lines).Aggregate("", (str, pos) => str + ConvertCharacter(lines, pos.Item1, pos.Item2)); } + /// + /// Transform multilines input into one line digits separate by comma + /// + /// + /// + private static string[] GetTransformedInput(string[] lines) + { + string[] transformedLines = new string[CharacterHeight]; + + for (int x = 0, characterRow = 0; x < lines.Length; x++, characterRow++) + { + if (characterRow > 3) + characterRow = 0; + + for (int y = 0; y < lines[x].Length; y++) + transformedLines[characterRow] += lines[x][y]; + + //for empty & last line add comma + if (string.IsNullOrWhiteSpace(lines[x]) && lines.Length - 1 != x) + { + for (int i = 0; i < CharacterHeight; i++) + transformedLines[i] += i == CharacterWidth - 1 ? " ," : " "; + } + } + + return transformedLines; + } + private static IEnumerable> Positions(string[] lines) { return from x in Enumerable.Range(0, Rows(lines)) @@ -21,10 +52,25 @@ from y in Enumerable.Range(0, Cols(lines)) select Tuple.Create(x, y); } - private static int Cols(string[] lines) => lines[0].Length / CharacterWidth; + private static int Cols(string[] lines) + { + return lines[0].Length % CharacterWidth == 0 + ? lines[0].Length / CharacterWidth + : throw new ArgumentException(); + } + + private static int Rows(string[] lines) + { + return lines.Length % CharacterHeight == 0 + ? lines.Length / CharacterHeight + : throw new ArgumentException(); + } + + private static bool IsEmptyLine(string line) + { + return string.IsNullOrWhiteSpace(line); + } - private static int Rows(string[] lines) => lines.Length / CharacterHeight; - private static char ConvertCharacter(string[] input, int row, int col) => MatchCharacter(Character(input, row, col)); private static string Character(string[] input, int row, int col) @@ -41,9 +87,9 @@ private static char MatchCharacter(string character) private static readonly IReadOnlyDictionary CharactersMap = new Dictionary { { - " _ " + - "| |" + - "|_|" + + " _ " + + "| |" + + "|_|" + " ", '0' }, @@ -109,6 +155,13 @@ private static char MatchCharacter(string character) " _|" + " ", '9' + }, + { + " " + + " " + + " ," + + " ", + ',' } }; } \ No newline at end of file From 2c3af1847d6db8b9268b1461fd54400963a642be Mon Sep 17 00:00:00 2001 From: Grzegorz Kotfis Date: Mon, 2 Oct 2017 23:14:28 +0200 Subject: [PATCH 7/7] Regenerate tests --- exercises/ocr-numbers/OcrNumbersTest.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/exercises/ocr-numbers/OcrNumbersTest.cs b/exercises/ocr-numbers/OcrNumbersTest.cs index f32251b98e..e4e2d8ae6c 100644 --- a/exercises/ocr-numbers/OcrNumbersTest.cs +++ b/exercises/ocr-numbers/OcrNumbersTest.cs @@ -1,6 +1,7 @@ // This file was auto-generated based on version 1.0.0 of the canonical data. using Xunit; +using System; public class OcrNumbersTest { @@ -43,8 +44,7 @@ public void Input_with_a_number_of_lines_that_is_not_a_multiple_of_four_raises_a var input = " _ " + "\n" + "| |" + "\n" + " "; - var actual = OcrNumbers.Convert(input); - Assert.Equal("-1", actual); + Assert.Throws(() => OcrNumbers.Convert(input)); } [Fact(Skip = "Remove to run test")] @@ -54,8 +54,7 @@ public void Input_with_a_number_of_columns_that_is_not_a_multiple_of_three_raise " |" + "\n" + " |" + "\n" + " "; - var actual = OcrNumbers.Convert(input); - Assert.Equal("-1", actual); + Assert.Throws(() => OcrNumbers.Convert(input)); } [Fact(Skip = "Remove to run test")]