From 38052c54a87df66e203dd06b655c51d36852d079 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Tue, 5 Sep 2017 19:25:10 +0200 Subject: [PATCH 1/8] Make expected property use properties property --- generators/Input/CanonicalDataCase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/generators/Input/CanonicalDataCase.cs b/generators/Input/CanonicalDataCase.cs index 00459fe513..193584fdc4 100644 --- a/generators/Input/CanonicalDataCase.cs +++ b/generators/Input/CanonicalDataCase.cs @@ -23,10 +23,7 @@ public class CanonicalDataCase [JsonIgnore] public IDictionary ConstructorInput { - get - { - return _constructorInput; - } + get => _constructorInput; set { RemoveDuplicateInputEntries(value); @@ -36,7 +33,12 @@ public IDictionary ConstructorInput } } - public object Expected { get; set; } + [JsonIgnore] + public object Expected + { + get => Properties["expected"]; + set => Properties["expected"] = value; + } [JsonIgnore] public IDictionary Properties { get; set; } From cad625457815ac25942f386469fcf6e5f89fdd59 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Tue, 5 Sep 2017 20:20:24 +0200 Subject: [PATCH 2/8] Working on simplifying canonical data types --- exercises/all-your-base/AllYourBaseTest.cs | 177 +++++++++++++++--- exercises/allergies/AllergiesTest.cs | 59 +++++- exercises/anagram/AnagramTest.cs | 151 ++++++++++++--- exercises/binary-search/BinarySearchTest.cs | 104 +++++++++- exercises/book-store/BookStoreTest.cs | 121 ++++++++++-- generators/Exercises/AllYourBase.cs | 2 +- generators/Exercises/Allergies.cs | 5 - generators/Exercises/Anagram.cs | 2 - generators/Exercises/BinarySearch.cs | 2 +- generators/Exercises/BookStore.cs | 2 +- generators/Exercises/Poker.cs | 4 +- generators/Exercises/SecretHandshake.cs | 11 +- generators/Exercises/SumOfMultiples.cs | 14 +- .../Input/CanonicalDataCaseJsonConverter.cs | 58 ++++++ .../Input/CanonicalDataCasesJsonConverter.cs | 35 +++- 15 files changed, 635 insertions(+), 112 deletions(-) diff --git a/exercises/all-your-base/AllYourBaseTest.cs b/exercises/all-your-base/AllYourBaseTest.cs index 796996a598..b2ca14b746 100644 --- a/exercises/all-your-base/AllYourBaseTest.cs +++ b/exercises/all-your-base/AllYourBaseTest.cs @@ -9,9 +9,15 @@ public class AllYourBaseTest public void Single_bit_one_to_decimal() { var inputBase = 2; - var inputDigits = new[] { 1 }; + var inputDigits = + { + 1 + }; var outputBase = 10; - var expected = new[] { 1 }; + var expected = + { + 1 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -19,9 +25,17 @@ public void Single_bit_one_to_decimal() public void Binary_to_single_decimal() { var inputBase = 2; - var inputDigits = new[] { 1, 0, 1 }; + var inputDigits = + { + 1 + 0 + 1 + }; var outputBase = 10; - var expected = new[] { 5 }; + var expected = + { + 5 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -29,9 +43,17 @@ public void Binary_to_single_decimal() public void Single_decimal_to_binary() { var inputBase = 10; - var inputDigits = new[] { 5 }; + var inputDigits = + { + 5 + }; var outputBase = 2; - var expected = new[] { 1, 0, 1 }; + var expected = + { + 1 + 0 + 1 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -39,9 +61,21 @@ public void Single_decimal_to_binary() public void Binary_to_multiple_decimal() { var inputBase = 2; - var inputDigits = new[] { 1, 0, 1, 0, 1, 0 }; + var inputDigits = + { + 1 + 0 + 1 + 0 + 1 + 0 + }; var outputBase = 10; - var expected = new[] { 4, 2 }; + var expected = + { + 4 + 2 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -49,9 +83,21 @@ public void Binary_to_multiple_decimal() public void Decimal_to_binary() { var inputBase = 10; - var inputDigits = new[] { 4, 2 }; + var inputDigits = + { + 4 + 2 + }; var outputBase = 2; - var expected = new[] { 1, 0, 1, 0, 1, 0 }; + var expected = + { + 1 + 0 + 1 + 0 + 1 + 0 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -59,9 +105,19 @@ public void Decimal_to_binary() public void Trinary_to_hexadecimal() { var inputBase = 3; - var inputDigits = new[] { 1, 1, 2, 0 }; + var inputDigits = + { + 1 + 1 + 2 + 0 + }; var outputBase = 16; - var expected = new[] { 2, 10 }; + var expected = + { + 2 + 10 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -69,9 +125,19 @@ public void Trinary_to_hexadecimal() public void Hexadecimal_to_trinary() { var inputBase = 16; - var inputDigits = new[] { 2, 10 }; + var inputDigits = + { + 2 + 10 + }; var outputBase = 3; - var expected = new[] { 1, 1, 2, 0 }; + var expected = + { + 1 + 1 + 2 + 0 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -79,9 +145,19 @@ public void Hexadecimal_to_trinary() public void Number_15_bit_integer() { var inputBase = 97; - var inputDigits = new[] { 3, 46, 60 }; + var inputDigits = + { + 3 + 46 + 60 + }; var outputBase = 73; - var expected = new[] { 6, 10, 45 }; + var expected = + { + 6 + 10 + 45 + }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -98,7 +174,10 @@ public void Empty_list() public void Single_zero() { var inputBase = 10; - var inputDigits = new[] { 0 }; + var inputDigits = + { + 0 + }; var outputBase = 2; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -107,7 +186,12 @@ public void Single_zero() public void Multiple_zeros() { var inputBase = 10; - var inputDigits = new[] { 0, 0, 0 }; + var inputDigits = + { + 0 + 0 + 0 + }; var outputBase = 2; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -116,7 +200,12 @@ public void Multiple_zeros() public void Leading_zeros() { var inputBase = 7; - var inputDigits = new[] { 0, 6, 0 }; + var inputDigits = + { + 0 + 6 + 0 + }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -143,7 +232,10 @@ public void First_base_is_zero() public void First_base_is_negative() { var inputBase = -2; - var inputDigits = new[] { 1 }; + var inputDigits = + { + 1 + }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -152,7 +244,15 @@ public void First_base_is_negative() public void Negative_digit() { var inputBase = 2; - var inputDigits = new[] { 1, -1, 1, 0, 1, 0 }; + var inputDigits = + { + 1 + -1 + 1 + 0 + 1 + 0 + }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -161,7 +261,15 @@ public void Negative_digit() public void Invalid_positive_digit() { var inputBase = 2; - var inputDigits = new[] { 1, 2, 1, 0, 1, 0 }; + var inputDigits = + { + 1 + 2 + 1 + 0 + 1 + 0 + }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -170,7 +278,15 @@ public void Invalid_positive_digit() public void Second_base_is_one() { var inputBase = 2; - var inputDigits = new[] { 1, 0, 1, 0, 1, 0 }; + var inputDigits = + { + 1 + 0 + 1 + 0 + 1 + 0 + }; var outputBase = 1; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -179,7 +295,10 @@ public void Second_base_is_one() public void Second_base_is_zero() { var inputBase = 10; - var inputDigits = new[] { 7 }; + var inputDigits = + { + 7 + }; var outputBase = 0; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -188,7 +307,10 @@ public void Second_base_is_zero() public void Second_base_is_negative() { var inputBase = 2; - var inputDigits = new[] { 1 }; + var inputDigits = + { + 1 + }; var outputBase = -7; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -197,7 +319,10 @@ public void Second_base_is_negative() public void Both_bases_are_negative() { var inputBase = -2; - var inputDigits = new[] { 1 }; + var inputDigits = + { + 1 + }; var outputBase = -7; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } diff --git a/exercises/allergies/AllergiesTest.cs b/exercises/allergies/AllergiesTest.cs index 8d7142a9b7..fae42089a1 100644 --- a/exercises/allergies/AllergiesTest.cs +++ b/exercises/allergies/AllergiesTest.cs @@ -40,7 +40,10 @@ public void No_allergies_at_all() public void Allergic_to_just_eggs() { var sut = new Allergies(1); - var expected = new[] { "eggs" }; + var expected = + { + eggs + }; Assert.Equal(expected, sut.List()); } @@ -48,7 +51,10 @@ public void Allergic_to_just_eggs() public void Allergic_to_just_peanuts() { var sut = new Allergies(2); - var expected = new[] { "peanuts" }; + var expected = + { + peanuts + }; Assert.Equal(expected, sut.List()); } @@ -56,7 +62,10 @@ public void Allergic_to_just_peanuts() public void Allergic_to_just_strawberries() { var sut = new Allergies(8); - var expected = new[] { "strawberries" }; + var expected = + { + strawberries + }; Assert.Equal(expected, sut.List()); } @@ -64,7 +73,11 @@ public void Allergic_to_just_strawberries() public void Allergic_to_eggs_and_peanuts() { var sut = new Allergies(3); - var expected = new[] { "eggs", "peanuts" }; + var expected = + { + eggs + peanuts + }; Assert.Equal(expected, sut.List()); } @@ -72,7 +85,11 @@ public void Allergic_to_eggs_and_peanuts() public void Allergic_to_more_than_eggs_but_not_peanuts() { var sut = new Allergies(5); - var expected = new[] { "eggs", "shellfish" }; + var expected = + { + eggs + shellfish + }; Assert.Equal(expected, sut.List()); } @@ -80,7 +97,14 @@ public void Allergic_to_more_than_eggs_but_not_peanuts() public void Allergic_to_lots_of_stuff() { var sut = new Allergies(248); - var expected = new[] { "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; + var expected = + { + strawberries + tomatoes + chocolate + pollen + cats + }; Assert.Equal(expected, sut.List()); } @@ -88,7 +112,17 @@ public void Allergic_to_lots_of_stuff() public void Allergic_to_everything() { var sut = new Allergies(255); - var expected = new[] { "eggs", "peanuts", "shellfish", "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; + var expected = + { + eggs + peanuts + shellfish + strawberries + tomatoes + chocolate + pollen + cats + }; Assert.Equal(expected, sut.List()); } @@ -96,7 +130,16 @@ public void Allergic_to_everything() public void Ignore_non_allergen_score_parts() { var sut = new Allergies(509); - var expected = new[] { "eggs", "shellfish", "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; + var expected = + { + eggs + shellfish + strawberries + tomatoes + chocolate + pollen + cats + }; Assert.Equal(expected, sut.List()); } } \ No newline at end of file diff --git a/exercises/anagram/AnagramTest.cs b/exercises/anagram/AnagramTest.cs index 01473081a7..487df728e9 100644 --- a/exercises/anagram/AnagramTest.cs +++ b/exercises/anagram/AnagramTest.cs @@ -7,7 +7,13 @@ public class AnagramTest [Fact] public void No_matches() { - var candidates = new[] { "hello", "world", "zombies", "pants" }; + var candidates = + { + hello + world + zombies + pants + }; var sut = new Anagram("diaper"); Assert.Empty(sut.Anagrams(candidates)); } @@ -15,16 +21,27 @@ public void No_matches() [Fact(Skip = "Remove to run test")] public void Detects_simple_anagram() { - var candidates = new[] { "tan", "stand", "at" }; + var candidates = + { + tan + stand + at + }; var sut = new Anagram("ant"); - var expected = new[] { "tan" }; + var expected = + { + tan + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_false_positives() { - var candidates = new[] { "eagle" }; + var candidates = + { + eagle + }; var sut = new Anagram("galea"); Assert.Empty(sut.Anagrams(candidates)); } @@ -32,16 +49,29 @@ public void Does_not_detect_false_positives() [Fact(Skip = "Remove to run test")] public void Detects_two_anagrams() { - var candidates = new[] { "stream", "pigeon", "maters" }; + var candidates = + { + stream + pigeon + maters + }; var sut = new Anagram("master"); - var expected = new[] { "stream", "maters" }; + var expected = + { + stream + maters + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_anagram_subsets() { - var candidates = new[] { "dog", "goody" }; + var candidates = + { + dog + goody + }; var sut = new Anagram("good"); Assert.Empty(sut.Anagrams(candidates)); } @@ -49,34 +79,71 @@ public void Does_not_detect_anagram_subsets() [Fact(Skip = "Remove to run test")] public void Detects_anagram() { - var candidates = new[] { "enlists", "google", "inlets", "banana" }; + var candidates = + { + enlists + google + inlets + banana + }; var sut = new Anagram("listen"); - var expected = new[] { "inlets" }; + var expected = + { + inlets + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_three_anagrams() { - var candidates = new[] { "gallery", "ballerina", "regally", "clergy", "largely", "leading" }; + var candidates = + { + gallery + ballerina + regally + clergy + largely + leading + }; var sut = new Anagram("allergy"); - var expected = new[] { "gallery", "regally", "largely" }; + var expected = + { + gallery + regally + largely + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_identical_words() { - var candidates = new[] { "corn", "dark", "Corn", "rank", "CORN", "cron", "park" }; + var candidates = + { + corn + dark + Corn + rank + CORN + cron + park + }; var sut = new Anagram("corn"); - var expected = new[] { "cron" }; + var expected = + { + cron + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_non_anagrams_with_identical_checksum() { - var candidates = new[] { "last" }; + var candidates = + { + last + }; var sut = new Anagram("mass"); Assert.Empty(sut.Anagrams(candidates)); } @@ -84,34 +151,61 @@ public void Does_not_detect_non_anagrams_with_identical_checksum() [Fact(Skip = "Remove to run test")] public void Detects_anagrams_case_insensitively() { - var candidates = new[] { "cashregister", "Carthorse", "radishes" }; + var candidates = + { + cashregister + Carthorse + radishes + }; var sut = new Anagram("Orchestra"); - var expected = new[] { "Carthorse" }; + var expected = + { + Carthorse + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_anagrams_using_case_insensitive_subject() { - var candidates = new[] { "cashregister", "carthorse", "radishes" }; + var candidates = + { + cashregister + carthorse + radishes + }; var sut = new Anagram("Orchestra"); - var expected = new[] { "carthorse" }; + var expected = + { + carthorse + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_anagrams_using_case_insensitive_possible_matches() { - var candidates = new[] { "cashregister", "Carthorse", "radishes" }; + var candidates = + { + cashregister + Carthorse + radishes + }; var sut = new Anagram("orchestra"); - var expected = new[] { "Carthorse" }; + var expected = + { + Carthorse + }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_a_word_as_its_own_anagram() { - var candidates = new[] { "Banana" }; + var candidates = + { + Banana + }; var sut = new Anagram("banana"); Assert.Empty(sut.Anagrams(candidates)); } @@ -119,7 +213,10 @@ public void Does_not_detect_a_word_as_its_own_anagram() [Fact(Skip = "Remove to run test")] public void Does_not_detect_a_anagram_if_the_original_word_is_repeated() { - var candidates = new[] { "go Go GO" }; + var candidates = + { + go Go GO + }; var sut = new Anagram("go"); Assert.Empty(sut.Anagrams(candidates)); } @@ -127,7 +224,10 @@ public void Does_not_detect_a_anagram_if_the_original_word_is_repeated() [Fact(Skip = "Remove to run test")] public void Anagrams_must_use_all_letters_exactly_once() { - var candidates = new[] { "patter" }; + var candidates = + { + patter + }; var sut = new Anagram("tapper"); Assert.Empty(sut.Anagrams(candidates)); } @@ -135,7 +235,10 @@ public void Anagrams_must_use_all_letters_exactly_once() [Fact(Skip = "Remove to run test")] public void Capital_word_is_not_own_anagram() { - var candidates = new[] { "Banana" }; + var candidates = + { + Banana + }; var sut = new Anagram("BANANA"); Assert.Empty(sut.Anagrams(candidates)); } diff --git a/exercises/binary-search/BinarySearchTest.cs b/exercises/binary-search/BinarySearchTest.cs index e9e3fbbc9d..ee2bc778e8 100644 --- a/exercises/binary-search/BinarySearchTest.cs +++ b/exercises/binary-search/BinarySearchTest.cs @@ -7,7 +7,10 @@ public class BinarySearchTest [Fact] public void Finds_a_value_in_an_array_with_one_element() { - var array = new[] { 6 }; + var array = + { + 6 + }; var sut = new BinarySearch(array); Assert.Equal(0, sut.Find(6)); } @@ -15,7 +18,16 @@ public void Finds_a_value_in_an_array_with_one_element() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_the_middle_of_an_array() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(3, sut.Find(6)); } @@ -23,7 +35,16 @@ public void Finds_a_value_in_the_middle_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_at_the_beginning_of_an_array() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(0, sut.Find(1)); } @@ -31,7 +52,16 @@ public void Finds_a_value_at_the_beginning_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_at_the_end_of_an_array() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(6, sut.Find(11)); } @@ -39,7 +69,22 @@ public void Finds_a_value_at_the_end_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_an_array_of_odd_length() { - var array = new[] { 1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 634 }; + var array = + { + 1 + 3 + 5 + 8 + 13 + 21 + 34 + 55 + 89 + 144 + 233 + 377 + 634 + }; var sut = new BinarySearch(array); Assert.Equal(9, sut.Find(144)); } @@ -47,7 +92,21 @@ public void Finds_a_value_in_an_array_of_odd_length() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_an_array_of_even_length() { - var array = new[] { 1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377 }; + var array = + { + 1 + 3 + 5 + 8 + 13 + 21 + 34 + 55 + 89 + 144 + 233 + 377 + }; var sut = new BinarySearch(array); Assert.Equal(5, sut.Find(21)); } @@ -55,7 +114,16 @@ public void Finds_a_value_in_an_array_of_even_length() [Fact(Skip = "Remove to run test")] public void Identifies_that_a_value_is_not_included_in_the_array() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(7)); } @@ -63,7 +131,16 @@ public void Identifies_that_a_value_is_not_included_in_the_array() [Fact(Skip = "Remove to run test")] public void A_value_smaller_than_the_arrays_smallest_value_is_not_included() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(0)); } @@ -71,7 +148,16 @@ public void A_value_smaller_than_the_arrays_smallest_value_is_not_included() [Fact(Skip = "Remove to run test")] public void A_value_larger_than_the_arrays_largest_value_is_not_included() { - var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; + var array = + { + 1 + 3 + 4 + 6 + 8 + 9 + 11 + }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(13)); } diff --git a/exercises/book-store/BookStoreTest.cs b/exercises/book-store/BookStoreTest.cs index 31d1e6190d..2ffcf4dbf7 100644 --- a/exercises/book-store/BookStoreTest.cs +++ b/exercises/book-store/BookStoreTest.cs @@ -7,14 +7,21 @@ public class BookStoreTest [Fact] public void Only_a_single_book() { - var input = new[] { 1 }; + var input = + { + 1 + }; Assert.Equal(8, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_of_the_same_book() { - var input = new[] { 2, 2 }; + var input = + { + 2 + 2 + }; Assert.Equal(16, BookStore.Total(input)); } @@ -28,70 +35,160 @@ public void Empty_basket() [Fact(Skip = "Remove to run test")] public void Two_different_books() { - var input = new[] { 1, 2 }; + var input = + { + 1 + 2 + }; Assert.Equal(15.2, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_different_books() { - var input = new[] { 1, 2, 3 }; + var input = + { + 1 + 2 + 3 + }; Assert.Equal(21.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Four_different_books() { - var input = new[] { 1, 2, 3, 4 }; + var input = + { + 1 + 2 + 3 + 4 + }; Assert.Equal(25.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Five_different_books() { - var input = new[] { 1, 2, 3, 4, 5 }; + var input = + { + 1 + 2 + 3 + 4 + 5 + }; Assert.Equal(30, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_groups_of_four_is_cheaper_than_group_of_five_plus_group_of_three() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 5 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 5 + }; Assert.Equal(51.2, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Group_of_four_plus_group_of_two_is_cheaper_than_two_groups_of_three() { - var input = new[] { 1, 1, 2, 2, 3, 4 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 4 + }; Assert.Equal(40.8, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_each_of_first_4_books_and_1_copy_each_of_rest() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + }; Assert.Equal(55.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_copies_of_each_book() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + }; Assert.Equal(60, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_copies_of_first_book_and_2_each_of_remaining() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 1 + }; Assert.Equal(68, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_each_of_first_2_books_and_2_each_of_remaining_books() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2 }; + var input = + { + 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 1 + 2 + }; Assert.Equal(75.2, BookStore.Total(input)); } } \ No newline at end of file diff --git a/generators/Exercises/AllYourBase.cs b/generators/Exercises/AllYourBase.cs index 518b28b58a..b07b8773a9 100644 --- a/generators/Exercises/AllYourBase.cs +++ b/generators/Exercises/AllYourBase.cs @@ -9,7 +9,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Input["input_digits"] = canonicalDataCase.Input["input_digits"].ConvertToEnumerable(); + //canonicalDataCase.Input["input_digits"] = canonicalDataCase.Input["input_digits"].ConvertToEnumerable(); canonicalDataCase.ExceptionThrown = canonicalDataCase.Expected is null ? typeof(ArgumentException) : null; canonicalDataCase.UseVariablesForInput = true; diff --git a/generators/Exercises/Allergies.cs b/generators/Exercises/Allergies.cs index 844879fc37..b1f519641a 100644 --- a/generators/Exercises/Allergies.cs +++ b/generators/Exercises/Allergies.cs @@ -13,14 +13,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { if (canonicalDataCase.Property == "allergicTo") - { canonicalDataCase.Property = "IsAllergicTo"; - } else if (canonicalDataCase.Property == "list") - { - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); canonicalDataCase.UseVariableForExpected = true; - } canonicalDataCase.ConstructorInput = new Dictionary { diff --git a/generators/Exercises/Anagram.cs b/generators/Exercises/Anagram.cs index 8a740f71a3..7d2cc584d9 100644 --- a/generators/Exercises/Anagram.cs +++ b/generators/Exercises/Anagram.cs @@ -13,8 +13,6 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { ["subject"] = canonicalDataCase.Input["subject"] }; - canonicalDataCase.Input["candidates"] = canonicalDataCase.Input["candidates"].ConvertToEnumerable(); - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; diff --git a/generators/Exercises/BinarySearch.cs b/generators/Exercises/BinarySearch.cs index 841ba4857d..aa3830fcfc 100644 --- a/generators/Exercises/BinarySearch.cs +++ b/generators/Exercises/BinarySearch.cs @@ -11,7 +11,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.ConstructorInput = new Dictionary { - ["array"] = canonicalDataCase.Input["array"].ConvertToEnumerable() + ["array"] = canonicalDataCase.Input["array"] }; canonicalDataCase.UseVariablesForConstructorParameters = true; diff --git a/generators/Exercises/BookStore.cs b/generators/Exercises/BookStore.cs index 2d78a212e4..dc4d85d0df 100644 --- a/generators/Exercises/BookStore.cs +++ b/generators/Exercises/BookStore.cs @@ -11,7 +11,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.Input = new Dictionary { - ["input"] = canonicalDataCase.Input["basket"].ConvertToEnumerable() + ["input"] = canonicalDataCase.Input["basket"] }; canonicalDataCase.UseVariablesForInput = true; } diff --git a/generators/Exercises/Poker.cs b/generators/Exercises/Poker.cs index 2303a85932..a6a78bbef9 100644 --- a/generators/Exercises/Poker.cs +++ b/generators/Exercises/Poker.cs @@ -11,8 +11,8 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) canonicalDataCase.UseVariableForExpected = true; canonicalDataCase.UseVariableForTested = true; - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); - canonicalDataCase.Input["input"] = canonicalDataCase.Input["input"].ConvertToEnumerable(); + //canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); + //canonicalDataCase.Input["input"] = canonicalDataCase.Input["input"].ConvertToEnumerable(); } } } diff --git a/generators/Exercises/SecretHandshake.cs b/generators/Exercises/SecretHandshake.cs index c5f0085e1a..d0cedbd76d 100644 --- a/generators/Exercises/SecretHandshake.cs +++ b/generators/Exercises/SecretHandshake.cs @@ -1,15 +1,6 @@ -using Generators.Input; - -namespace Generators.Exercises +namespace Generators.Exercises { public class SecretHandshake : Exercise { - protected override void UpdateCanonicalData(CanonicalData canonicalData) - { - foreach (var canonicalDataCase in canonicalData.Cases) - { - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); - } - } } } \ No newline at end of file diff --git a/generators/Exercises/SumOfMultiples.cs b/generators/Exercises/SumOfMultiples.cs index 222b616731..5ce2f06673 100644 --- a/generators/Exercises/SumOfMultiples.cs +++ b/generators/Exercises/SumOfMultiples.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; -using Generators.Input; +using Generators.Input; namespace Generators.Exercises { @@ -10,12 +8,12 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - var hasFactors = canonicalDataCase.Input["factors"].ConvertToEnumerable().Any(); + //var hasFactors = canonicalDataCase.Input["factors"].ConvertToEnumerable().Any(); - if (!hasFactors) - { - canonicalDataCase.Input["factors"] = Enumerable.Empty(); - } + //if (!hasFactors) + //{ + // canonicalDataCase.Input["factors"] = Enumerable.Empty(); + //} } } } diff --git a/generators/Input/CanonicalDataCaseJsonConverter.cs b/generators/Input/CanonicalDataCaseJsonConverter.cs index 2903c25fa0..d255d789d1 100644 --- a/generators/Input/CanonicalDataCaseJsonConverter.cs +++ b/generators/Input/CanonicalDataCaseJsonConverter.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -22,9 +23,66 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist canonicalDataCase.Input = GetInputProperty(jToken); canonicalDataCase.ConstructorInput = new Dictionary(); + NormalizeJsonValues(canonicalDataCase.Properties); + NormalizeJsonValues(canonicalDataCase.Input); + return canonicalDataCase; } + private static void NormalizeJsonValues(IDictionary properties) + { + for (var i = 0; i < properties.Count; i++) + { + var key = properties.Keys.ElementAt(i); + + if (properties[key] is JArray jArray) + { + // We can't determine the type of the array if the array is empty + if (!jArray.Any()) + continue; + + switch (jArray[0].Type) + { + case JTokenType.Object: + // TODO + break; + case JTokenType.Array: + // TODO + break; + case JTokenType.Integer: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Float: + properties[key] = jArray.ToObject(); + break; + case JTokenType.String: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Boolean: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Date: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Bytes: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Guid: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Uri: + properties[key] = jArray.ToObject(); + break; + case JTokenType.TimeSpan: + properties[key] = jArray.ToObject(); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + } + private static IDictionary GetInputProperty(JToken jToken) { var allProperties = jToken.ToObject>(); diff --git a/generators/Input/CanonicalDataCasesJsonConverter.cs b/generators/Input/CanonicalDataCasesJsonConverter.cs index 273149c41b..381f65f3fc 100644 --- a/generators/Input/CanonicalDataCasesJsonConverter.cs +++ b/generators/Input/CanonicalDataCasesJsonConverter.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Linq; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -10,16 +10,45 @@ public class CanonicalDataCasesJsonConverter : JsonConverter { private const string TokensPath = "$..*[?(@.property)]"; - public override bool CanConvert(Type objectType) => typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(objectType); + public override bool CanConvert(Type objectType) => typeof(CanonicalDataCase[]).GetTypeInfo().IsAssignableFrom(objectType); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var casesToken = JToken.ReadFrom(reader); var caseTokens = new JArray(casesToken.SelectTokens(TokensPath)); + var canonicalDataCases = new JArray(caseTokens).ToObject(); - return new JArray(caseTokens).ToObject(objectType); + + foreach (var groupedCanonicalDataCases in canonicalDataCases.ToLookup(c => c.Property)) + { + foreach (var groupedProperties in groupedCanonicalDataCases.SelectMany(x => x.Properties).ToLookup(x => x.Key)) + { + if (groupedProperties.Any(x => x.Value is string[])) + { + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray)) + groupedCanonicalDataCase.Properties[groupedProperties.Key] = new string[0]; + + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray)) + groupedCanonicalDataCase.Input[groupedProperties.Key] = new string[0]; + } + else if (groupedProperties.Any(x => x.Value is int[])) + { + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray)) + groupedCanonicalDataCase.Properties[groupedProperties.Key] = new int[0]; + + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray)) + groupedCanonicalDataCase.Input[groupedProperties.Key] = new int[0]; + } + } + } + + + + return canonicalDataCases; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); + + } } \ No newline at end of file From 5c5a784e5a4e75799a540bb89afadf4578962d2e Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Wed, 6 Sep 2017 21:12:58 +0200 Subject: [PATCH 3/8] Remove ToEnumerable --- exercises/all-your-base/AllYourBaseTest.cs | 177 +++--------------- exercises/allergies/AllergiesTest.cs | 59 +----- exercises/anagram/AnagramTest.cs | 151 +++------------ exercises/binary-search/BinarySearchTest.cs | 104 +--------- exercises/book-store/BookStoreTest.cs | 121 ++---------- .../complex-numbers/ComplexNumbersTest.cs | 80 +++----- generators/Exercises/CollatzConjecture.cs | 4 +- generators/Exercises/ComplexNumbers.cs | 50 ++--- generators/Exercises/Convert.cs | 7 + generators/Exercises/ConvertExtensions.cs | 12 -- generators/Exercises/CryptoSquare.cs | 4 - generators/Exercises/FoodChain.cs | 2 +- generators/Exercises/House.cs | 2 +- generators/Exercises/QueenAttack.cs | 2 +- generators/Exercises/Sieve.cs | 2 +- generators/Exercises/Transpose.cs | 4 +- generators/Input/CanonicalDataCase.cs | 14 +- .../Input/CanonicalDataCaseJsonConverter.cs | 14 +- .../Input/CanonicalDataCasesJsonConverter.cs | 11 +- generators/Output/ValueFormatter.cs | 4 - 20 files changed, 150 insertions(+), 674 deletions(-) create mode 100644 generators/Exercises/Convert.cs delete mode 100644 generators/Exercises/ConvertExtensions.cs diff --git a/exercises/all-your-base/AllYourBaseTest.cs b/exercises/all-your-base/AllYourBaseTest.cs index b2ca14b746..796996a598 100644 --- a/exercises/all-your-base/AllYourBaseTest.cs +++ b/exercises/all-your-base/AllYourBaseTest.cs @@ -9,15 +9,9 @@ public class AllYourBaseTest public void Single_bit_one_to_decimal() { var inputBase = 2; - var inputDigits = - { - 1 - }; + var inputDigits = new[] { 1 }; var outputBase = 10; - var expected = - { - 1 - }; + var expected = new[] { 1 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -25,17 +19,9 @@ public void Single_bit_one_to_decimal() public void Binary_to_single_decimal() { var inputBase = 2; - var inputDigits = - { - 1 - 0 - 1 - }; + var inputDigits = new[] { 1, 0, 1 }; var outputBase = 10; - var expected = - { - 5 - }; + var expected = new[] { 5 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -43,17 +29,9 @@ public void Binary_to_single_decimal() public void Single_decimal_to_binary() { var inputBase = 10; - var inputDigits = - { - 5 - }; + var inputDigits = new[] { 5 }; var outputBase = 2; - var expected = - { - 1 - 0 - 1 - }; + var expected = new[] { 1, 0, 1 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -61,21 +39,9 @@ public void Single_decimal_to_binary() public void Binary_to_multiple_decimal() { var inputBase = 2; - var inputDigits = - { - 1 - 0 - 1 - 0 - 1 - 0 - }; + var inputDigits = new[] { 1, 0, 1, 0, 1, 0 }; var outputBase = 10; - var expected = - { - 4 - 2 - }; + var expected = new[] { 4, 2 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -83,21 +49,9 @@ public void Binary_to_multiple_decimal() public void Decimal_to_binary() { var inputBase = 10; - var inputDigits = - { - 4 - 2 - }; + var inputDigits = new[] { 4, 2 }; var outputBase = 2; - var expected = - { - 1 - 0 - 1 - 0 - 1 - 0 - }; + var expected = new[] { 1, 0, 1, 0, 1, 0 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -105,19 +59,9 @@ public void Decimal_to_binary() public void Trinary_to_hexadecimal() { var inputBase = 3; - var inputDigits = - { - 1 - 1 - 2 - 0 - }; + var inputDigits = new[] { 1, 1, 2, 0 }; var outputBase = 16; - var expected = - { - 2 - 10 - }; + var expected = new[] { 2, 10 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -125,19 +69,9 @@ public void Trinary_to_hexadecimal() public void Hexadecimal_to_trinary() { var inputBase = 16; - var inputDigits = - { - 2 - 10 - }; + var inputDigits = new[] { 2, 10 }; var outputBase = 3; - var expected = - { - 1 - 1 - 2 - 0 - }; + var expected = new[] { 1, 1, 2, 0 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -145,19 +79,9 @@ public void Hexadecimal_to_trinary() public void Number_15_bit_integer() { var inputBase = 97; - var inputDigits = - { - 3 - 46 - 60 - }; + var inputDigits = new[] { 3, 46, 60 }; var outputBase = 73; - var expected = - { - 6 - 10 - 45 - }; + var expected = new[] { 6, 10, 45 }; Assert.Equal(expected, AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -174,10 +98,7 @@ public void Empty_list() public void Single_zero() { var inputBase = 10; - var inputDigits = - { - 0 - }; + var inputDigits = new[] { 0 }; var outputBase = 2; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -186,12 +107,7 @@ public void Single_zero() public void Multiple_zeros() { var inputBase = 10; - var inputDigits = - { - 0 - 0 - 0 - }; + var inputDigits = new[] { 0, 0, 0 }; var outputBase = 2; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -200,12 +116,7 @@ public void Multiple_zeros() public void Leading_zeros() { var inputBase = 7; - var inputDigits = - { - 0 - 6 - 0 - }; + var inputDigits = new[] { 0, 6, 0 }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -232,10 +143,7 @@ public void First_base_is_zero() public void First_base_is_negative() { var inputBase = -2; - var inputDigits = - { - 1 - }; + var inputDigits = new[] { 1 }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -244,15 +152,7 @@ public void First_base_is_negative() public void Negative_digit() { var inputBase = 2; - var inputDigits = - { - 1 - -1 - 1 - 0 - 1 - 0 - }; + var inputDigits = new[] { 1, -1, 1, 0, 1, 0 }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -261,15 +161,7 @@ public void Negative_digit() public void Invalid_positive_digit() { var inputBase = 2; - var inputDigits = - { - 1 - 2 - 1 - 0 - 1 - 0 - }; + var inputDigits = new[] { 1, 2, 1, 0, 1, 0 }; var outputBase = 10; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -278,15 +170,7 @@ public void Invalid_positive_digit() public void Second_base_is_one() { var inputBase = 2; - var inputDigits = - { - 1 - 0 - 1 - 0 - 1 - 0 - }; + var inputDigits = new[] { 1, 0, 1, 0, 1, 0 }; var outputBase = 1; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -295,10 +179,7 @@ public void Second_base_is_one() public void Second_base_is_zero() { var inputBase = 10; - var inputDigits = - { - 7 - }; + var inputDigits = new[] { 7 }; var outputBase = 0; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -307,10 +188,7 @@ public void Second_base_is_zero() public void Second_base_is_negative() { var inputBase = 2; - var inputDigits = - { - 1 - }; + var inputDigits = new[] { 1 }; var outputBase = -7; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } @@ -319,10 +197,7 @@ public void Second_base_is_negative() public void Both_bases_are_negative() { var inputBase = -2; - var inputDigits = - { - 1 - }; + var inputDigits = new[] { 1 }; var outputBase = -7; Assert.Throws(() => AllYourBase.Rebase(inputBase, inputDigits, outputBase)); } diff --git a/exercises/allergies/AllergiesTest.cs b/exercises/allergies/AllergiesTest.cs index fae42089a1..8d7142a9b7 100644 --- a/exercises/allergies/AllergiesTest.cs +++ b/exercises/allergies/AllergiesTest.cs @@ -40,10 +40,7 @@ public void No_allergies_at_all() public void Allergic_to_just_eggs() { var sut = new Allergies(1); - var expected = - { - eggs - }; + var expected = new[] { "eggs" }; Assert.Equal(expected, sut.List()); } @@ -51,10 +48,7 @@ public void Allergic_to_just_eggs() public void Allergic_to_just_peanuts() { var sut = new Allergies(2); - var expected = - { - peanuts - }; + var expected = new[] { "peanuts" }; Assert.Equal(expected, sut.List()); } @@ -62,10 +56,7 @@ public void Allergic_to_just_peanuts() public void Allergic_to_just_strawberries() { var sut = new Allergies(8); - var expected = - { - strawberries - }; + var expected = new[] { "strawberries" }; Assert.Equal(expected, sut.List()); } @@ -73,11 +64,7 @@ public void Allergic_to_just_strawberries() public void Allergic_to_eggs_and_peanuts() { var sut = new Allergies(3); - var expected = - { - eggs - peanuts - }; + var expected = new[] { "eggs", "peanuts" }; Assert.Equal(expected, sut.List()); } @@ -85,11 +72,7 @@ public void Allergic_to_eggs_and_peanuts() public void Allergic_to_more_than_eggs_but_not_peanuts() { var sut = new Allergies(5); - var expected = - { - eggs - shellfish - }; + var expected = new[] { "eggs", "shellfish" }; Assert.Equal(expected, sut.List()); } @@ -97,14 +80,7 @@ public void Allergic_to_more_than_eggs_but_not_peanuts() public void Allergic_to_lots_of_stuff() { var sut = new Allergies(248); - var expected = - { - strawberries - tomatoes - chocolate - pollen - cats - }; + var expected = new[] { "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; Assert.Equal(expected, sut.List()); } @@ -112,17 +88,7 @@ public void Allergic_to_lots_of_stuff() public void Allergic_to_everything() { var sut = new Allergies(255); - var expected = - { - eggs - peanuts - shellfish - strawberries - tomatoes - chocolate - pollen - cats - }; + var expected = new[] { "eggs", "peanuts", "shellfish", "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; Assert.Equal(expected, sut.List()); } @@ -130,16 +96,7 @@ public void Allergic_to_everything() public void Ignore_non_allergen_score_parts() { var sut = new Allergies(509); - var expected = - { - eggs - shellfish - strawberries - tomatoes - chocolate - pollen - cats - }; + var expected = new[] { "eggs", "shellfish", "strawberries", "tomatoes", "chocolate", "pollen", "cats" }; Assert.Equal(expected, sut.List()); } } \ No newline at end of file diff --git a/exercises/anagram/AnagramTest.cs b/exercises/anagram/AnagramTest.cs index 487df728e9..01473081a7 100644 --- a/exercises/anagram/AnagramTest.cs +++ b/exercises/anagram/AnagramTest.cs @@ -7,13 +7,7 @@ public class AnagramTest [Fact] public void No_matches() { - var candidates = - { - hello - world - zombies - pants - }; + var candidates = new[] { "hello", "world", "zombies", "pants" }; var sut = new Anagram("diaper"); Assert.Empty(sut.Anagrams(candidates)); } @@ -21,27 +15,16 @@ public void No_matches() [Fact(Skip = "Remove to run test")] public void Detects_simple_anagram() { - var candidates = - { - tan - stand - at - }; + var candidates = new[] { "tan", "stand", "at" }; var sut = new Anagram("ant"); - var expected = - { - tan - }; + var expected = new[] { "tan" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_false_positives() { - var candidates = - { - eagle - }; + var candidates = new[] { "eagle" }; var sut = new Anagram("galea"); Assert.Empty(sut.Anagrams(candidates)); } @@ -49,29 +32,16 @@ public void Does_not_detect_false_positives() [Fact(Skip = "Remove to run test")] public void Detects_two_anagrams() { - var candidates = - { - stream - pigeon - maters - }; + var candidates = new[] { "stream", "pigeon", "maters" }; var sut = new Anagram("master"); - var expected = - { - stream - maters - }; + var expected = new[] { "stream", "maters" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_anagram_subsets() { - var candidates = - { - dog - goody - }; + var candidates = new[] { "dog", "goody" }; var sut = new Anagram("good"); Assert.Empty(sut.Anagrams(candidates)); } @@ -79,71 +49,34 @@ public void Does_not_detect_anagram_subsets() [Fact(Skip = "Remove to run test")] public void Detects_anagram() { - var candidates = - { - enlists - google - inlets - banana - }; + var candidates = new[] { "enlists", "google", "inlets", "banana" }; var sut = new Anagram("listen"); - var expected = - { - inlets - }; + var expected = new[] { "inlets" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_three_anagrams() { - var candidates = - { - gallery - ballerina - regally - clergy - largely - leading - }; + var candidates = new[] { "gallery", "ballerina", "regally", "clergy", "largely", "leading" }; var sut = new Anagram("allergy"); - var expected = - { - gallery - regally - largely - }; + var expected = new[] { "gallery", "regally", "largely" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_identical_words() { - var candidates = - { - corn - dark - Corn - rank - CORN - cron - park - }; + var candidates = new[] { "corn", "dark", "Corn", "rank", "CORN", "cron", "park" }; var sut = new Anagram("corn"); - var expected = - { - cron - }; + var expected = new[] { "cron" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_non_anagrams_with_identical_checksum() { - var candidates = - { - last - }; + var candidates = new[] { "last" }; var sut = new Anagram("mass"); Assert.Empty(sut.Anagrams(candidates)); } @@ -151,61 +84,34 @@ public void Does_not_detect_non_anagrams_with_identical_checksum() [Fact(Skip = "Remove to run test")] public void Detects_anagrams_case_insensitively() { - var candidates = - { - cashregister - Carthorse - radishes - }; + var candidates = new[] { "cashregister", "Carthorse", "radishes" }; var sut = new Anagram("Orchestra"); - var expected = - { - Carthorse - }; + var expected = new[] { "Carthorse" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_anagrams_using_case_insensitive_subject() { - var candidates = - { - cashregister - carthorse - radishes - }; + var candidates = new[] { "cashregister", "carthorse", "radishes" }; var sut = new Anagram("Orchestra"); - var expected = - { - carthorse - }; + var expected = new[] { "carthorse" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Detects_anagrams_using_case_insensitive_possible_matches() { - var candidates = - { - cashregister - Carthorse - radishes - }; + var candidates = new[] { "cashregister", "Carthorse", "radishes" }; var sut = new Anagram("orchestra"); - var expected = - { - Carthorse - }; + var expected = new[] { "Carthorse" }; Assert.Equal(expected, sut.Anagrams(candidates)); } [Fact(Skip = "Remove to run test")] public void Does_not_detect_a_word_as_its_own_anagram() { - var candidates = - { - Banana - }; + var candidates = new[] { "Banana" }; var sut = new Anagram("banana"); Assert.Empty(sut.Anagrams(candidates)); } @@ -213,10 +119,7 @@ public void Does_not_detect_a_word_as_its_own_anagram() [Fact(Skip = "Remove to run test")] public void Does_not_detect_a_anagram_if_the_original_word_is_repeated() { - var candidates = - { - go Go GO - }; + var candidates = new[] { "go Go GO" }; var sut = new Anagram("go"); Assert.Empty(sut.Anagrams(candidates)); } @@ -224,10 +127,7 @@ go Go GO [Fact(Skip = "Remove to run test")] public void Anagrams_must_use_all_letters_exactly_once() { - var candidates = - { - patter - }; + var candidates = new[] { "patter" }; var sut = new Anagram("tapper"); Assert.Empty(sut.Anagrams(candidates)); } @@ -235,10 +135,7 @@ public void Anagrams_must_use_all_letters_exactly_once() [Fact(Skip = "Remove to run test")] public void Capital_word_is_not_own_anagram() { - var candidates = - { - Banana - }; + var candidates = new[] { "Banana" }; var sut = new Anagram("BANANA"); Assert.Empty(sut.Anagrams(candidates)); } diff --git a/exercises/binary-search/BinarySearchTest.cs b/exercises/binary-search/BinarySearchTest.cs index ee2bc778e8..e9e3fbbc9d 100644 --- a/exercises/binary-search/BinarySearchTest.cs +++ b/exercises/binary-search/BinarySearchTest.cs @@ -7,10 +7,7 @@ public class BinarySearchTest [Fact] public void Finds_a_value_in_an_array_with_one_element() { - var array = - { - 6 - }; + var array = new[] { 6 }; var sut = new BinarySearch(array); Assert.Equal(0, sut.Find(6)); } @@ -18,16 +15,7 @@ public void Finds_a_value_in_an_array_with_one_element() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_the_middle_of_an_array() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(3, sut.Find(6)); } @@ -35,16 +23,7 @@ public void Finds_a_value_in_the_middle_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_at_the_beginning_of_an_array() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(0, sut.Find(1)); } @@ -52,16 +31,7 @@ public void Finds_a_value_at_the_beginning_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_at_the_end_of_an_array() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(6, sut.Find(11)); } @@ -69,22 +39,7 @@ public void Finds_a_value_at_the_end_of_an_array() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_an_array_of_odd_length() { - var array = - { - 1 - 3 - 5 - 8 - 13 - 21 - 34 - 55 - 89 - 144 - 233 - 377 - 634 - }; + var array = new[] { 1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 634 }; var sut = new BinarySearch(array); Assert.Equal(9, sut.Find(144)); } @@ -92,21 +47,7 @@ public void Finds_a_value_in_an_array_of_odd_length() [Fact(Skip = "Remove to run test")] public void Finds_a_value_in_an_array_of_even_length() { - var array = - { - 1 - 3 - 5 - 8 - 13 - 21 - 34 - 55 - 89 - 144 - 233 - 377 - }; + var array = new[] { 1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377 }; var sut = new BinarySearch(array); Assert.Equal(5, sut.Find(21)); } @@ -114,16 +55,7 @@ public void Finds_a_value_in_an_array_of_even_length() [Fact(Skip = "Remove to run test")] public void Identifies_that_a_value_is_not_included_in_the_array() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(7)); } @@ -131,16 +63,7 @@ public void Identifies_that_a_value_is_not_included_in_the_array() [Fact(Skip = "Remove to run test")] public void A_value_smaller_than_the_arrays_smallest_value_is_not_included() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(0)); } @@ -148,16 +71,7 @@ public void A_value_smaller_than_the_arrays_smallest_value_is_not_included() [Fact(Skip = "Remove to run test")] public void A_value_larger_than_the_arrays_largest_value_is_not_included() { - var array = - { - 1 - 3 - 4 - 6 - 8 - 9 - 11 - }; + var array = new[] { 1, 3, 4, 6, 8, 9, 11 }; var sut = new BinarySearch(array); Assert.Equal(-1, sut.Find(13)); } diff --git a/exercises/book-store/BookStoreTest.cs b/exercises/book-store/BookStoreTest.cs index 2ffcf4dbf7..31d1e6190d 100644 --- a/exercises/book-store/BookStoreTest.cs +++ b/exercises/book-store/BookStoreTest.cs @@ -7,21 +7,14 @@ public class BookStoreTest [Fact] public void Only_a_single_book() { - var input = - { - 1 - }; + var input = new[] { 1 }; Assert.Equal(8, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_of_the_same_book() { - var input = - { - 2 - 2 - }; + var input = new[] { 2, 2 }; Assert.Equal(16, BookStore.Total(input)); } @@ -35,160 +28,70 @@ public void Empty_basket() [Fact(Skip = "Remove to run test")] public void Two_different_books() { - var input = - { - 1 - 2 - }; + var input = new[] { 1, 2 }; Assert.Equal(15.2, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_different_books() { - var input = - { - 1 - 2 - 3 - }; + var input = new[] { 1, 2, 3 }; Assert.Equal(21.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Four_different_books() { - var input = - { - 1 - 2 - 3 - 4 - }; + var input = new[] { 1, 2, 3, 4 }; Assert.Equal(25.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Five_different_books() { - var input = - { - 1 - 2 - 3 - 4 - 5 - }; + var input = new[] { 1, 2, 3, 4, 5 }; Assert.Equal(30, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_groups_of_four_is_cheaper_than_group_of_five_plus_group_of_three() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 3 - 4 - 5 - }; + var input = new[] { 1, 1, 2, 2, 3, 3, 4, 5 }; Assert.Equal(51.2, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Group_of_four_plus_group_of_two_is_cheaper_than_two_groups_of_three() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 4 - }; + var input = new[] { 1, 1, 2, 2, 3, 4 }; Assert.Equal(40.8, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_each_of_first_4_books_and_1_copy_each_of_rest() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 3 - 4 - 4 - 5 - }; + var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5 }; Assert.Equal(55.6, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Two_copies_of_each_book() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 3 - 4 - 4 - 5 - 5 - }; + var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; Assert.Equal(60, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_copies_of_first_book_and_2_each_of_remaining() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 3 - 4 - 4 - 5 - 5 - 1 - }; + var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1 }; Assert.Equal(68, BookStore.Total(input)); } [Fact(Skip = "Remove to run test")] public void Three_each_of_first_2_books_and_2_each_of_remaining_books() { - var input = - { - 1 - 1 - 2 - 2 - 3 - 3 - 4 - 4 - 5 - 5 - 1 - 2 - }; + var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2 }; Assert.Equal(75.2, BookStore.Total(input)); } } \ No newline at end of file diff --git a/exercises/complex-numbers/ComplexNumbersTest.cs b/exercises/complex-numbers/ComplexNumbersTest.cs index f2016ece46..d4fa82f6b4 100644 --- a/exercises/complex-numbers/ComplexNumbersTest.cs +++ b/exercises/complex-numbers/ComplexNumbersTest.cs @@ -51,117 +51,95 @@ public void Imaginary_part_of_a_number_with_real_and_imaginary_part() public void Imaginary_unit() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(-1, 0); - Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 1)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 1)).Imaginary(), 15); + Assert.Equal(new[] { -1, 0 }, sut.Mul(new[] { 0, 1 })); } [Fact(Skip = "Remove to run test")] public void Add_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - var expected = new ComplexNumber(3, 0); - Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(2, 0)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(2, 0)).Imaginary(), 15); + Assert.Equal(new[] { 3, 0 }, sut.Add(new[] { 2, 0 })); } [Fact(Skip = "Remove to run test")] public void Add_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(0, 3); - Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(0, 2)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(0, 2)).Imaginary(), 15); + Assert.Equal(new[] { 0, 3 }, sut.Add(new[] { 0, 2 })); } [Fact(Skip = "Remove to run test")] public void Add_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - var expected = new ComplexNumber(4, 6); - Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(3, 4)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(3, 4)).Imaginary(), 15); + Assert.Equal(new[] { 4, 6 }, sut.Add(new[] { 3, 4 })); } [Fact(Skip = "Remove to run test")] public void Subtract_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - var expected = new ComplexNumber(-1, 0); - Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(2, 0)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(2, 0)).Imaginary(), 15); + Assert.Equal(new[] { -1, 0 }, sut.Sub(new[] { 2, 0 })); } [Fact(Skip = "Remove to run test")] public void Subtract_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(0, -1); - Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(0, 2)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(0, 2)).Imaginary(), 15); + Assert.Equal(new[] { 0, -1 }, sut.Sub(new[] { 0, 2 })); } [Fact(Skip = "Remove to run test")] public void Subtract_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - var expected = new ComplexNumber(-2, -2); - Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(3, 4)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(3, 4)).Imaginary(), 15); + Assert.Equal(new[] { -2, -2 }, sut.Sub(new[] { 3, 4 })); } [Fact(Skip = "Remove to run test")] public void Multiply_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - var expected = new ComplexNumber(2, 0); - Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(2, 0)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(2, 0)).Imaginary(), 15); + Assert.Equal(new[] { 2, 0 }, sut.Mul(new[] { 2, 0 })); } [Fact(Skip = "Remove to run test")] public void Multiply_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(-2, 0); - Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 2)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 2)).Imaginary(), 15); + Assert.Equal(new[] { -2, 0 }, sut.Mul(new[] { 0, 2 })); } [Fact(Skip = "Remove to run test")] public void Multiply_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - var expected = new ComplexNumber(-5, 10); - Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(3, 4)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(3, 4)).Imaginary(), 15); + Assert.Equal(new[] { -5, 10 }, sut.Mul(new[] { 3, 4 })); } [Fact(Skip = "Remove to run test")] public void Divide_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - var expected = new ComplexNumber(0.5, 0); - Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(2, 0)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(2, 0)).Imaginary(), 15); + var expected = new ComplexNumber(0,5, 0); + Assert.Equal(expected.Real(), sut.Div(new[] { 2, 0 }).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Div(new[] { 2, 0 }).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Divide_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(0.5, 0); - Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(0, 2)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(0, 2)).Imaginary(), 15); + var expected = new ComplexNumber(0,5, 0); + Assert.Equal(expected.Real(), sut.Div(new[] { 0, 2 }).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Div(new[] { 0, 2 }).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Divide_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - var expected = new ComplexNumber(0.44, 0.08); - Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(3, 4)).Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(3, 4)).Imaginary(), 15); + Assert.Equal(0,440,08, sut.Div(new[] { 3, 4 })); } [Fact(Skip = "Remove to run test")] @@ -203,45 +181,35 @@ public void Absolute_value_of_a_number_with_real_and_imaginary_part() public void Conjugate_a_purely_real_number() { var sut = new ComplexNumber(5, 0); - var expected = new ComplexNumber(5, 0); - Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15); + Assert.Equal(new[] { 5, 0 }, sut.Conjugate()); } [Fact(Skip = "Remove to run test")] public void Conjugate_a_purely_imaginary_number() { var sut = new ComplexNumber(0, 5); - var expected = new ComplexNumber(0, -5); - Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15); + Assert.Equal(new[] { 0, -5 }, sut.Conjugate()); } [Fact(Skip = "Remove to run test")] public void Conjugate_a_number_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 1); - var expected = new ComplexNumber(1, -1); - Assert.Equal(expected.Real(), sut.Conjugate().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), 15); + Assert.Equal(new[] { 1, -1 }, sut.Conjugate()); } [Fact(Skip = "Remove to run test")] public void Eulers_identity_formula() { var sut = new ComplexNumber(0, Math.PI); - var expected = new ComplexNumber(-1, 0); - Assert.Equal(expected.Real(), sut.Exp().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15); + Assert.Equal(new[] { -1, 0 }, sut.Exp()); } [Fact(Skip = "Remove to run test")] public void Exponential_of_0() { var sut = new ComplexNumber(0, 0); - var expected = new ComplexNumber(1, 0); - Assert.Equal(expected.Real(), sut.Exp().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15); + Assert.Equal(new[] { 1, 0 }, sut.Exp()); } [Fact(Skip = "Remove to run test")] @@ -249,7 +217,7 @@ public void Exponential_of_a_purely_real_number() { var sut = new ComplexNumber(1, 0); var expected = new ComplexNumber(Math.E, 0); - Assert.Equal(expected.Real(), sut.Exp().Real(), 15); - Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), 15); + Assert.Equal(expected.Real(), sut.Exp().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), precision: 15); } } \ No newline at end of file diff --git a/generators/Exercises/CollatzConjecture.cs b/generators/Exercises/CollatzConjecture.cs index a832fda10e..a6ada6b4b1 100644 --- a/generators/Exercises/CollatzConjecture.cs +++ b/generators/Exercises/CollatzConjecture.cs @@ -8,9 +8,7 @@ public class CollatzConjecture : Exercise protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) - { - canonicalDataCase.ExceptionThrown = (long)canonicalDataCase.Input["number"] <= 0 ? typeof(ArgumentException) : null; - } + canonicalDataCase.ExceptionThrown = canonicalDataCase.Input["number"] <= 0 ? typeof(ArgumentException) : null; } } } \ No newline at end of file diff --git a/generators/Exercises/ComplexNumbers.cs b/generators/Exercises/ComplexNumbers.cs index 0ef1f04be3..8ac6a8bb4b 100644 --- a/generators/Exercises/ComplexNumbers.cs +++ b/generators/Exercises/ComplexNumbers.cs @@ -29,15 +29,10 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) // Process constructor param var constructorParamName = canonicalDataCase.Input.ContainsKey("input") ? "input" : "z1"; - var constructorParamValues = canonicalDataCase.Input[constructorParamName] - .ConvertToEnumerable() - .Select(v => ConvertMathDouble(v)) - .ToArray(); - canonicalDataCase.ConstructorInput = new Dictionary { - ["real"] = constructorParamValues[0], - ["imaginary"] = constructorParamValues[1] + ["real"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][0]), + ["imaginary"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][1]) }; canonicalDataCase.Input.Remove(constructorParamName); @@ -62,55 +57,36 @@ protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBo private static string RenderComplexNumberAssert(TestMethodBody testMethodBody) { - var template = "Assert.Equal({{ ExpectedParameter }}.Real(), {{ TestedValue }}.Real(), 15);\r\nAssert.Equal({{ ExpectedParameter }}.Imaginary(), {{ TestedValue }}.Imaginary(), 15);"; + const string template = "Assert.Equal({{ ExpectedParameter }}.Real(), {{ TestedValue }}.Real(), precision: 15);\r\nAssert.Equal({{ ExpectedParameter }}.Imaginary(), {{ TestedValue }}.Imaginary(), precision: 15);"; return TemplateRenderer.RenderInline(template, testMethodBody.AssertTemplateParameters); } - protected override HashSet AddAdditionalNamespaces() + protected override HashSet AddAdditionalNamespaces() => new HashSet { - return new HashSet() - { - typeof(Math).Namespace - }; - } + typeof(Math).Namespace + }; - private object ConvertToType(object rawValue) + private static object ConvertToType(dynamic rawValue) { if (IsComplexNumber(rawValue)) - { - var array = rawValue - .ConvertToEnumerable() - .Select(rv => ConvertToType(rv)) - .ToArray(); + return new UnescapedValue($"new ComplexNumber({ConvertMathDouble(rawValue[0])}, {rawValue[1]})"); - return new UnescapedValue($"new ComplexNumber({array[0]}, {array[1]})"); - } - else if (rawValue is string) - { - return ConvertMathDouble((string)rawValue); - } - else - { - return rawValue; - } + return rawValue; } - private bool IsComplexNumber(object rawValue) - { - return rawValue is JArray; - } + private static bool IsComplexNumber(object rawValue) => rawValue is JArray; - private object ConvertMathDouble(string value) + private static object ConvertMathDouble(dynamic value) { - switch (value) + switch (value.ToString()) { case "e": return new UnescapedValue("Math.E"); case "pi": return new UnescapedValue("Math.PI"); default: - return double.Parse(value); + return (double)value; } } } diff --git a/generators/Exercises/Convert.cs b/generators/Exercises/Convert.cs new file mode 100644 index 0000000000..eb37b5f1f6 --- /dev/null +++ b/generators/Exercises/Convert.cs @@ -0,0 +1,7 @@ +namespace Generators.Exercises +{ + public static class Convert + { + public static string ToMultiLineString(this object obj) => string.Join("\n", obj as object[]); + } +} \ No newline at end of file diff --git a/generators/Exercises/ConvertExtensions.cs b/generators/Exercises/ConvertExtensions.cs deleted file mode 100644 index 7ccfa38169..0000000000 --- a/generators/Exercises/ConvertExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json.Linq; - -namespace Generators.Exercises -{ - public static class ConvertExtensions - { - public static string ConvertMultiLineString(this object obj) => string.Join("\n", (JArray)obj); - - public static IEnumerable ConvertToEnumerable(this object obj) => ((JArray) obj).Values(); - } -} diff --git a/generators/Exercises/CryptoSquare.cs b/generators/Exercises/CryptoSquare.cs index c7a27e33b2..310734d154 100644 --- a/generators/Exercises/CryptoSquare.cs +++ b/generators/Exercises/CryptoSquare.cs @@ -1,5 +1,4 @@ using Generators.Input; -using Newtonsoft.Json.Linq; namespace Generators.Exercises { @@ -11,9 +10,6 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; - - if (canonicalDataCase.Expected is JArray expected) - canonicalDataCase.Expected = expected.Values(); } } } diff --git a/generators/Exercises/FoodChain.cs b/generators/Exercises/FoodChain.cs index f02dbef02f..2f4aee7537 100644 --- a/generators/Exercises/FoodChain.cs +++ b/generators/Exercises/FoodChain.cs @@ -8,7 +8,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertMultiLineString(); + canonicalDataCase.Expected = Convert.ToMultiLineString(canonicalDataCase.Expected); canonicalDataCase.UseVariableForExpected = true; } } diff --git a/generators/Exercises/House.cs b/generators/Exercises/House.cs index 8459b20561..9e1d1517d0 100644 --- a/generators/Exercises/House.cs +++ b/generators/Exercises/House.cs @@ -9,7 +9,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertMultiLineString(); + canonicalDataCase.Expected = Convert.ToMultiLineString(canonicalDataCase.Expected); } } } diff --git a/generators/Exercises/QueenAttack.cs b/generators/Exercises/QueenAttack.cs index 2402536ea5..e4025af992 100644 --- a/generators/Exercises/QueenAttack.cs +++ b/generators/Exercises/QueenAttack.cs @@ -68,7 +68,7 @@ private static Tuple GetCoordinatesFromPosition(object rawPosition) private static void SetCreatePropertyData(CanonicalDataCase canonicalDataCase) { - var validExpected = (long)canonicalDataCase.Expected >= 0; + var validExpected = canonicalDataCase.Expected >= 0; canonicalDataCase.UseVariableForTested = validExpected; canonicalDataCase.ExceptionThrown = validExpected ? null : typeof(ArgumentOutOfRangeException); diff --git a/generators/Exercises/Sieve.cs b/generators/Exercises/Sieve.cs index 64a73f8715..d823a1d139 100644 --- a/generators/Exercises/Sieve.cs +++ b/generators/Exercises/Sieve.cs @@ -10,7 +10,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.ExceptionThrown = (long)canonicalDataCase.Input["limit"] < 2 ? typeof(ArgumentOutOfRangeException) : null; + canonicalDataCase.ExceptionThrown = canonicalDataCase.Input["limit"] < 2 ? typeof(ArgumentOutOfRangeException) : null; } } } diff --git a/generators/Exercises/Transpose.cs b/generators/Exercises/Transpose.cs index 2772ccb219..6b7c9cc259 100644 --- a/generators/Exercises/Transpose.cs +++ b/generators/Exercises/Transpose.cs @@ -12,9 +12,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) canonicalDataCase.Property = "String"; canonicalDataCase.Input = new Dictionary { - ["input"] = canonicalDataCase.Input["input"].ConvertMultiLineString() + ["input"] = Convert.ToMultiLineString(canonicalDataCase.Input["input"]) }; - canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertMultiLineString(); + canonicalDataCase.Expected = Convert.ToMultiLineString(canonicalDataCase.Expected); canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; } diff --git a/generators/Input/CanonicalDataCase.cs b/generators/Input/CanonicalDataCase.cs index 193584fdc4..bb914a1d5b 100644 --- a/generators/Input/CanonicalDataCase.cs +++ b/generators/Input/CanonicalDataCase.cs @@ -9,7 +9,7 @@ namespace Generators.Input [JsonConverter(typeof(CanonicalDataCaseJsonConverter))] public class CanonicalDataCase { - private IDictionary _constructorInput; + private IDictionary _constructorInput; [Required] public string Description { get; set; } @@ -18,10 +18,10 @@ public class CanonicalDataCase public string Property { get; set; } [JsonIgnore] - public IDictionary Input { get; set; } + public IDictionary Input { get; set; } [JsonIgnore] - public IDictionary ConstructorInput + public IDictionary ConstructorInput { get => _constructorInput; set @@ -34,14 +34,14 @@ public IDictionary ConstructorInput } [JsonIgnore] - public object Expected + public dynamic Expected { get => Properties["expected"]; set => Properties["expected"] = value; } [JsonIgnore] - public IDictionary Properties { get; set; } + public IDictionary Properties { get; set; } [JsonIgnore] public bool UseVariablesForInput { get; set; } @@ -61,7 +61,7 @@ public object Expected [JsonIgnore] public Type ExceptionThrown { get; set; } - private void RemoveDuplicateInputEntries(IDictionary constructorInputDictionary) + private void RemoveDuplicateInputEntries(IDictionary constructorInputDictionary) { foreach (var key in constructorInputDictionary.Keys) { @@ -72,7 +72,7 @@ private void RemoveDuplicateInputEntries(IDictionary constructor } } - private void UpdateInstanceType(IDictionary constructorInputDictionary) + private void UpdateInstanceType(IDictionary constructorInputDictionary) { if (constructorInputDictionary.Keys.Any()) { diff --git a/generators/Input/CanonicalDataCaseJsonConverter.cs b/generators/Input/CanonicalDataCaseJsonConverter.cs index d255d789d1..5e77c84fe9 100644 --- a/generators/Input/CanonicalDataCaseJsonConverter.cs +++ b/generators/Input/CanonicalDataCaseJsonConverter.cs @@ -19,9 +19,9 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist var canonicalDataCase = new CanonicalDataCase(); serializer.Populate(new JTokenReader(jToken), canonicalDataCase); - canonicalDataCase.Properties = jToken.ToObject>(); + canonicalDataCase.Properties = jToken.ToObject>(); canonicalDataCase.Input = GetInputProperty(jToken); - canonicalDataCase.ConstructorInput = new Dictionary(); + canonicalDataCase.ConstructorInput = new Dictionary(); NormalizeJsonValues(canonicalDataCase.Properties); NormalizeJsonValues(canonicalDataCase.Input); @@ -29,7 +29,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist return canonicalDataCase; } - private static void NormalizeJsonValues(IDictionary properties) + private static void NormalizeJsonValues(IDictionary properties) { for (var i = 0; i < properties.Count; i++) { @@ -41,6 +41,10 @@ private static void NormalizeJsonValues(IDictionary properties) if (!jArray.Any()) continue; + // We can only convert when all values have the same type + if (jArray.Select(x => x.Type).Distinct().Count() != 1) + continue; + switch (jArray[0].Type) { case JTokenType.Object: @@ -83,9 +87,9 @@ private static void NormalizeJsonValues(IDictionary properties) } } - private static IDictionary GetInputProperty(JToken jToken) + private static IDictionary GetInputProperty(JToken jToken) { - var allProperties = jToken.ToObject>(); + var allProperties = jToken.ToObject>(); foreach (var nonInputProperty in NonInputProperties) allProperties.Remove(nonInputProperty); diff --git a/generators/Input/CanonicalDataCasesJsonConverter.cs b/generators/Input/CanonicalDataCasesJsonConverter.cs index 381f65f3fc..d0bbd7519a 100644 --- a/generators/Input/CanonicalDataCasesJsonConverter.cs +++ b/generators/Input/CanonicalDataCasesJsonConverter.cs @@ -18,32 +18,29 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist var caseTokens = new JArray(casesToken.SelectTokens(TokensPath)); var canonicalDataCases = new JArray(caseTokens).ToObject(); - foreach (var groupedCanonicalDataCases in canonicalDataCases.ToLookup(c => c.Property)) { foreach (var groupedProperties in groupedCanonicalDataCases.SelectMany(x => x.Properties).ToLookup(x => x.Key)) { if (groupedProperties.Any(x => x.Value is string[])) { - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray)) + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) groupedCanonicalDataCase.Properties[groupedProperties.Key] = new string[0]; - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray)) + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) groupedCanonicalDataCase.Input[groupedProperties.Key] = new string[0]; } else if (groupedProperties.Any(x => x.Value is int[])) { - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray)) + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) groupedCanonicalDataCase.Properties[groupedProperties.Key] = new int[0]; - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray)) + foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) groupedCanonicalDataCase.Input[groupedProperties.Key] = new int[0]; } } } - - return canonicalDataCases; } diff --git a/generators/Output/ValueFormatter.cs b/generators/Output/ValueFormatter.cs index fbb82fa3f1..7c9807a9c2 100644 --- a/generators/Output/ValueFormatter.cs +++ b/generators/Output/ValueFormatter.cs @@ -50,10 +50,6 @@ public static string[] FormatVariable(object val, string name) { case string str when str.Contains("\n"): return FormatMultiLineString(name, str); - case int[] ints when ints.Any(): - return FormatMultiLineEnumerable(ints.Select(x => x.ToString(CultureInfo.InvariantCulture)), name); - case string[] strings when strings.Any(): - return FormatMultiLineEnumerable(strings, name); case IDictionary dict: return FormatMultiLineEnumerable(dict.Keys.Select((key, i) => $"[{Format(key)}] = {Format(dict[key])}" + (i < dict.Keys.Count - 1 ? "," : "")), name, "new Dictionary"); case IDictionary dict: From 22003a243669e2427c643432166ae63f798a1002 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Thu, 7 Sep 2017 19:52:44 +0200 Subject: [PATCH 4/8] Fix complex numbers generator --- .../complex-numbers/ComplexNumbersTest.cs | 76 +++++++++++++------ generators/Exercises/ComplexNumbers.cs | 10 +-- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/exercises/complex-numbers/ComplexNumbersTest.cs b/exercises/complex-numbers/ComplexNumbersTest.cs index d4fa82f6b4..c1e3380204 100644 --- a/exercises/complex-numbers/ComplexNumbersTest.cs +++ b/exercises/complex-numbers/ComplexNumbersTest.cs @@ -51,95 +51,117 @@ public void Imaginary_part_of_a_number_with_real_and_imaginary_part() public void Imaginary_unit() { var sut = new ComplexNumber(0, 1); - Assert.Equal(new[] { -1, 0 }, sut.Mul(new[] { 0, 1 })); + var expected = new ComplexNumber(-1, 0); + Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 1)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 1)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Add_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - Assert.Equal(new[] { 3, 0 }, sut.Add(new[] { 2, 0 })); + var expected = new ComplexNumber(3, 0); + Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(2, 0)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(2, 0)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Add_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - Assert.Equal(new[] { 0, 3 }, sut.Add(new[] { 0, 2 })); + var expected = new ComplexNumber(0, 3); + Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(0, 2)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(0, 2)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Add_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - Assert.Equal(new[] { 4, 6 }, sut.Add(new[] { 3, 4 })); + var expected = new ComplexNumber(4, 6); + Assert.Equal(expected.Real(), sut.Add(new ComplexNumber(3, 4)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Add(new ComplexNumber(3, 4)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Subtract_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - Assert.Equal(new[] { -1, 0 }, sut.Sub(new[] { 2, 0 })); + var expected = new ComplexNumber(-1, 0); + Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(2, 0)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(2, 0)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Subtract_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - Assert.Equal(new[] { 0, -1 }, sut.Sub(new[] { 0, 2 })); + var expected = new ComplexNumber(0, -1); + Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(0, 2)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(0, 2)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Subtract_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - Assert.Equal(new[] { -2, -2 }, sut.Sub(new[] { 3, 4 })); + var expected = new ComplexNumber(-2, -2); + Assert.Equal(expected.Real(), sut.Sub(new ComplexNumber(3, 4)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Sub(new ComplexNumber(3, 4)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Multiply_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - Assert.Equal(new[] { 2, 0 }, sut.Mul(new[] { 2, 0 })); + var expected = new ComplexNumber(2, 0); + Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(2, 0)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(2, 0)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Multiply_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - Assert.Equal(new[] { -2, 0 }, sut.Mul(new[] { 0, 2 })); + var expected = new ComplexNumber(-2, 0); + Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(0, 2)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(0, 2)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Multiply_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - Assert.Equal(new[] { -5, 10 }, sut.Mul(new[] { 3, 4 })); + var expected = new ComplexNumber(-5, 10); + Assert.Equal(expected.Real(), sut.Mul(new ComplexNumber(3, 4)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Mul(new ComplexNumber(3, 4)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Divide_purely_real_numbers() { var sut = new ComplexNumber(1, 0); - var expected = new ComplexNumber(0,5, 0); - Assert.Equal(expected.Real(), sut.Div(new[] { 2, 0 }).Real(), precision: 15); - Assert.Equal(expected.Imaginary(), sut.Div(new[] { 2, 0 }).Imaginary(), precision: 15); + var expected = new ComplexNumber(0.5, 0); + Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(2, 0)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(2, 0)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Divide_purely_imaginary_numbers() { var sut = new ComplexNumber(0, 1); - var expected = new ComplexNumber(0,5, 0); - Assert.Equal(expected.Real(), sut.Div(new[] { 0, 2 }).Real(), precision: 15); - Assert.Equal(expected.Imaginary(), sut.Div(new[] { 0, 2 }).Imaginary(), precision: 15); + var expected = new ComplexNumber(0.5, 0); + Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(0, 2)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(0, 2)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Divide_numbers_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 2); - Assert.Equal(0,440,08, sut.Div(new[] { 3, 4 })); + var expected = new ComplexNumber(0.44, 0.08); + Assert.Equal(expected.Real(), sut.Div(new ComplexNumber(3, 4)).Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Div(new ComplexNumber(3, 4)).Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] @@ -181,35 +203,45 @@ public void Absolute_value_of_a_number_with_real_and_imaginary_part() public void Conjugate_a_purely_real_number() { var sut = new ComplexNumber(5, 0); - Assert.Equal(new[] { 5, 0 }, sut.Conjugate()); + var expected = new ComplexNumber(5, 0); + Assert.Equal(expected.Real(), sut.Conjugate().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Conjugate_a_purely_imaginary_number() { var sut = new ComplexNumber(0, 5); - Assert.Equal(new[] { 0, -5 }, sut.Conjugate()); + var expected = new ComplexNumber(0, -5); + Assert.Equal(expected.Real(), sut.Conjugate().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Conjugate_a_number_with_real_and_imaginary_part() { var sut = new ComplexNumber(1, 1); - Assert.Equal(new[] { 1, -1 }, sut.Conjugate()); + var expected = new ComplexNumber(1, -1); + Assert.Equal(expected.Real(), sut.Conjugate().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Conjugate().Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Eulers_identity_formula() { var sut = new ComplexNumber(0, Math.PI); - Assert.Equal(new[] { -1, 0 }, sut.Exp()); + var expected = new ComplexNumber(-1, 0); + Assert.Equal(expected.Real(), sut.Exp().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] public void Exponential_of_0() { var sut = new ComplexNumber(0, 0); - Assert.Equal(new[] { 1, 0 }, sut.Exp()); + var expected = new ComplexNumber(1, 0); + Assert.Equal(expected.Real(), sut.Exp().Real(), precision: 15); + Assert.Equal(expected.Imaginary(), sut.Exp().Imaginary(), precision: 15); } [Fact(Skip = "Remove to run test")] diff --git a/generators/Exercises/ComplexNumbers.cs b/generators/Exercises/ComplexNumbers.cs index 8ac6a8bb4b..d04803662d 100644 --- a/generators/Exercises/ComplexNumbers.cs +++ b/generators/Exercises/ComplexNumbers.cs @@ -20,9 +20,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { // Process expected if (IsComplexNumber(canonicalDataCase.Expected)) - { canonicalDataCase.UseVariableForExpected = true; - } canonicalDataCase.Expected = ConvertToType(canonicalDataCase.Expected); @@ -41,9 +39,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) var keys = canonicalDataCase.Input.Keys.ToArray(); foreach (var key in keys) - { canonicalDataCase.Input[key] = ConvertToType(canonicalDataCase.Input[key]); - } } } @@ -70,12 +66,12 @@ private static string RenderComplexNumberAssert(TestMethodBody testMethodBody) private static object ConvertToType(dynamic rawValue) { if (IsComplexNumber(rawValue)) - return new UnescapedValue($"new ComplexNumber({ConvertMathDouble(rawValue[0])}, {rawValue[1]})"); + return new UnescapedValue($"new ComplexNumber({ValueFormatter.Format(ConvertMathDouble(rawValue[0]))}, {ValueFormatter.Format(ConvertMathDouble(rawValue[1]))})"); return rawValue; } - private static bool IsComplexNumber(object rawValue) => rawValue is JArray; + private static bool IsComplexNumber(object rawValue) => rawValue is int[] || rawValue is double[] || rawValue is float[] || rawValue is JArray; private static object ConvertMathDouble(dynamic value) { @@ -86,7 +82,7 @@ private static object ConvertMathDouble(dynamic value) case "pi": return new UnescapedValue("Math.PI"); default: - return (double)value; + return double.Parse(value.ToString()); } } } From ddf1d6e5bf43586e95159c8dd51d283fb86a62b1 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Thu, 7 Sep 2017 19:57:10 +0200 Subject: [PATCH 5/8] Simplify generators --- generators/Exercises/AllYourBase.cs | 2 -- generators/Exercises/Alphametics.cs | 11 ++--------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/generators/Exercises/AllYourBase.cs b/generators/Exercises/AllYourBase.cs index b07b8773a9..29290dc8a3 100644 --- a/generators/Exercises/AllYourBase.cs +++ b/generators/Exercises/AllYourBase.cs @@ -9,8 +9,6 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - //canonicalDataCase.Input["input_digits"] = canonicalDataCase.Input["input_digits"].ConvertToEnumerable(); - canonicalDataCase.ExceptionThrown = canonicalDataCase.Expected is null ? typeof(ArgumentException) : null; canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; diff --git a/generators/Exercises/Alphametics.cs b/generators/Exercises/Alphametics.cs index 711bab80e5..aa0ce88f53 100644 --- a/generators/Exercises/Alphametics.cs +++ b/generators/Exercises/Alphametics.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using Generators.Input; -using Newtonsoft.Json.Linq; namespace Generators.Exercises { @@ -17,16 +16,10 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) if (canonicalDataCase.Expected == null) canonicalDataCase.ExceptionThrown = typeof(ArgumentException); else - canonicalDataCase.Expected = ((JObject)canonicalDataCase.Expected).ToObject>(); + canonicalDataCase.Expected = canonicalDataCase.Expected.ToObject>(); } } - protected override HashSet AddAdditionalNamespaces() - { - return new HashSet() - { - typeof(Dictionary).Namespace - }; - } + protected override HashSet AddAdditionalNamespaces() => new HashSet { typeof(Dictionary).Namespace }; } } \ No newline at end of file From db6e4ab9074094fd9622f5a90b5f7183d09ccec6 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Thu, 7 Sep 2017 20:08:03 +0200 Subject: [PATCH 6/8] Simplify constructor input handling --- generators/Exercises/Allergies.cs | 8 ++---- generators/Exercises/Anagram.cs | 7 +---- generators/Exercises/BinarySearch.cs | 9 ++----- generators/Exercises/ComplexNumbers.cs | 1 + generators/Exercises/RailFenceCipher.cs | 9 ++----- generators/Exercises/SpaceAge.cs | 9 ++----- generators/Input/CanonicalDataCase.cs | 36 +++++-------------------- 7 files changed, 17 insertions(+), 62 deletions(-) diff --git a/generators/Exercises/Allergies.cs b/generators/Exercises/Allergies.cs index b1f519641a..ab4032e00c 100644 --- a/generators/Exercises/Allergies.cs +++ b/generators/Exercises/Allergies.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using Generators.Input; using Generators.Output; using Newtonsoft.Json.Linq; @@ -17,10 +16,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) else if (canonicalDataCase.Property == "list") canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.ConstructorInput = new Dictionary - { - ["score"] = canonicalDataCase.Properties["score"] - }; + canonicalDataCase.AddConstructorParameter("score"); } } diff --git a/generators/Exercises/Anagram.cs b/generators/Exercises/Anagram.cs index 7d2cc584d9..5abf4d220e 100644 --- a/generators/Exercises/Anagram.cs +++ b/generators/Exercises/Anagram.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using Generators.Input; namespace Generators.Exercises @@ -9,13 +8,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.ConstructorInput = new Dictionary - { - ["subject"] = canonicalDataCase.Input["subject"] - }; - canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; + canonicalDataCase.AddConstructorParameter("subject"); } } } diff --git a/generators/Exercises/BinarySearch.cs b/generators/Exercises/BinarySearch.cs index aa3830fcfc..84409c09f9 100644 --- a/generators/Exercises/BinarySearch.cs +++ b/generators/Exercises/BinarySearch.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Generators.Input; +using Generators.Input; namespace Generators.Exercises { @@ -9,12 +8,8 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.ConstructorInput = new Dictionary - { - ["array"] = canonicalDataCase.Input["array"] - }; - canonicalDataCase.UseVariablesForConstructorParameters = true; + canonicalDataCase.AddConstructorParameter("array"); } } } diff --git a/generators/Exercises/ComplexNumbers.cs b/generators/Exercises/ComplexNumbers.cs index d04803662d..4ab1f5655d 100644 --- a/generators/Exercises/ComplexNumbers.cs +++ b/generators/Exercises/ComplexNumbers.cs @@ -32,6 +32,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) ["real"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][0]), ["imaginary"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][1]) }; + canonicalDataCase.TestedMethodType = TestedMethodType.Instance; canonicalDataCase.Input.Remove(constructorParamName); diff --git a/generators/Exercises/RailFenceCipher.cs b/generators/Exercises/RailFenceCipher.cs index 8753152f55..99f6e0cd09 100644 --- a/generators/Exercises/RailFenceCipher.cs +++ b/generators/Exercises/RailFenceCipher.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Generators.Input; +using Generators.Input; namespace Generators.Exercises { @@ -9,13 +8,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.ConstructorInput = new Dictionary - { - ["rails"] = canonicalDataCase.Properties["rails"] - }; - canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; + canonicalDataCase.AddConstructorParameter("rails"); } } } diff --git a/generators/Exercises/SpaceAge.cs b/generators/Exercises/SpaceAge.cs index 9fe7c6ca34..ac7449644b 100644 --- a/generators/Exercises/SpaceAge.cs +++ b/generators/Exercises/SpaceAge.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Generators.Input; +using Generators.Input; namespace Generators.Exercises { @@ -9,13 +8,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.ConstructorInput = new Dictionary - { - ["seconds"] = canonicalDataCase.Properties["seconds"] - }; - canonicalDataCase.Property = $"On_{canonicalDataCase.Input["planet"]}"; canonicalDataCase.Input.Remove("planet"); + canonicalDataCase.AddConstructorParameter("seconds"); } } } diff --git a/generators/Input/CanonicalDataCase.cs b/generators/Input/CanonicalDataCase.cs index bb914a1d5b..90dd85896b 100644 --- a/generators/Input/CanonicalDataCase.cs +++ b/generators/Input/CanonicalDataCase.cs @@ -2,15 +2,12 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using System.Linq; namespace Generators.Input { [JsonConverter(typeof(CanonicalDataCaseJsonConverter))] public class CanonicalDataCase { - private IDictionary _constructorInput; - [Required] public string Description { get; set; } @@ -21,17 +18,7 @@ public class CanonicalDataCase public IDictionary Input { get; set; } [JsonIgnore] - public IDictionary ConstructorInput - { - get => _constructorInput; - set - { - RemoveDuplicateInputEntries(value); - UpdateInstanceType(value); - - _constructorInput = value; - } - } + public IDictionary ConstructorInput { get; set; } [JsonIgnore] public dynamic Expected @@ -61,23 +48,14 @@ public dynamic Expected [JsonIgnore] public Type ExceptionThrown { get; set; } - private void RemoveDuplicateInputEntries(IDictionary constructorInputDictionary) + public void AddConstructorParameter(string parameterName) { - foreach (var key in constructorInputDictionary.Keys) - { - if (Input.ContainsKey(key)) - { - Input.Remove(key); - } - } - } + ConstructorInput[parameterName] = Properties[parameterName]; - private void UpdateInstanceType(IDictionary constructorInputDictionary) - { - if (constructorInputDictionary.Keys.Any()) - { - TestedMethodType = TestedMethodType.Instance; - } + if (Input.ContainsKey(parameterName)) + Input.Remove(parameterName); + + TestedMethodType = TestedMethodType.Instance; } } } \ No newline at end of file From 238165eaa41b366805b1f5722cc1350dec536b3b Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Sep 2017 19:15:14 +0200 Subject: [PATCH 7/8] Make Input and ConstructorInput use Properties field --- exercises/book-store/BookStoreTest.cs | 52 ++++++------ generators/Exercises/Allergies.cs | 2 +- generators/Exercises/Anagram.cs | 2 +- generators/Exercises/BinarySearch.cs | 2 +- generators/Exercises/BookStore.cs | 8 +- generators/Exercises/BracketPush.cs | 2 +- generators/Exercises/ComplexNumbers.cs | 16 ++-- generators/Exercises/Gigasecond.cs | 18 ++-- generators/Exercises/QueenAttack.cs | 9 +- generators/Exercises/RailFenceCipher.cs | 2 +- generators/Exercises/SpaceAge.cs | 4 +- generators/Exercises/Transpose.cs | 7 +- generators/Input/CanonicalDataCase.cs | 32 ++++++-- generators/Input/CanonicalDataCaseJson.cs | 72 ++++++++++++++++ .../Input/CanonicalDataCaseJsonConverter.cs | 82 ++----------------- generators/Input/CanonicalDataCasesJson.cs | 58 +++++++++++++ .../Input/CanonicalDataCasesJsonConverter.cs | 38 +-------- generators/Output/TestMethodBodyData.cs | 2 +- generators/Output/ValueFormatter.cs | 4 +- 19 files changed, 218 insertions(+), 194 deletions(-) create mode 100644 generators/Input/CanonicalDataCaseJson.cs create mode 100644 generators/Input/CanonicalDataCasesJson.cs diff --git a/exercises/book-store/BookStoreTest.cs b/exercises/book-store/BookStoreTest.cs index 31d1e6190d..d8f15bf5af 100644 --- a/exercises/book-store/BookStoreTest.cs +++ b/exercises/book-store/BookStoreTest.cs @@ -7,91 +7,91 @@ public class BookStoreTest [Fact] public void Only_a_single_book() { - var input = new[] { 1 }; - Assert.Equal(8, BookStore.Total(input)); + var basket = new[] { 1 }; + Assert.Equal(8, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Two_of_the_same_book() { - var input = new[] { 2, 2 }; - Assert.Equal(16, BookStore.Total(input)); + var basket = new[] { 2, 2 }; + Assert.Equal(16, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Empty_basket() { - var input = new int[0]; - Assert.Equal(0, BookStore.Total(input)); + var basket = new int[0]; + Assert.Equal(0, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Two_different_books() { - var input = new[] { 1, 2 }; - Assert.Equal(15.2, BookStore.Total(input)); + var basket = new[] { 1, 2 }; + Assert.Equal(15.2, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Three_different_books() { - var input = new[] { 1, 2, 3 }; - Assert.Equal(21.6, BookStore.Total(input)); + var basket = new[] { 1, 2, 3 }; + Assert.Equal(21.6, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Four_different_books() { - var input = new[] { 1, 2, 3, 4 }; - Assert.Equal(25.6, BookStore.Total(input)); + var basket = new[] { 1, 2, 3, 4 }; + Assert.Equal(25.6, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Five_different_books() { - var input = new[] { 1, 2, 3, 4, 5 }; - Assert.Equal(30, BookStore.Total(input)); + var basket = new[] { 1, 2, 3, 4, 5 }; + Assert.Equal(30, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Two_groups_of_four_is_cheaper_than_group_of_five_plus_group_of_three() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 5 }; - Assert.Equal(51.2, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 5 }; + Assert.Equal(51.2, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Group_of_four_plus_group_of_two_is_cheaper_than_two_groups_of_three() { - var input = new[] { 1, 1, 2, 2, 3, 4 }; - Assert.Equal(40.8, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 4 }; + Assert.Equal(40.8, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Two_each_of_first_4_books_and_1_copy_each_of_rest() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5 }; - Assert.Equal(55.6, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5 }; + Assert.Equal(55.6, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Two_copies_of_each_book() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; - Assert.Equal(60, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; + Assert.Equal(60, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Three_copies_of_first_book_and_2_each_of_remaining() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1 }; - Assert.Equal(68, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1 }; + Assert.Equal(68, BookStore.Total(basket)); } [Fact(Skip = "Remove to run test")] public void Three_each_of_first_2_books_and_2_each_of_remaining_books() { - var input = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2 }; - Assert.Equal(75.2, BookStore.Total(input)); + var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2 }; + Assert.Equal(75.2, BookStore.Total(basket)); } } \ No newline at end of file diff --git a/generators/Exercises/Allergies.cs b/generators/Exercises/Allergies.cs index ab4032e00c..a36ec9dda4 100644 --- a/generators/Exercises/Allergies.cs +++ b/generators/Exercises/Allergies.cs @@ -16,7 +16,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) else if (canonicalDataCase.Property == "list") canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.AddConstructorParameter("score"); + canonicalDataCase.SetConstructorInputParameters("score"); } } diff --git a/generators/Exercises/Anagram.cs b/generators/Exercises/Anagram.cs index 5abf4d220e..b632de810b 100644 --- a/generators/Exercises/Anagram.cs +++ b/generators/Exercises/Anagram.cs @@ -10,7 +10,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.AddConstructorParameter("subject"); + canonicalDataCase.SetConstructorInputParameters("subject"); } } } diff --git a/generators/Exercises/BinarySearch.cs b/generators/Exercises/BinarySearch.cs index 84409c09f9..a3cfbc6752 100644 --- a/generators/Exercises/BinarySearch.cs +++ b/generators/Exercises/BinarySearch.cs @@ -9,7 +9,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { canonicalDataCase.UseVariablesForConstructorParameters = true; - canonicalDataCase.AddConstructorParameter("array"); + canonicalDataCase.SetConstructorInputParameters("array"); } } } diff --git a/generators/Exercises/BookStore.cs b/generators/Exercises/BookStore.cs index dc4d85d0df..18f7fb0372 100644 --- a/generators/Exercises/BookStore.cs +++ b/generators/Exercises/BookStore.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Generators.Input; +using Generators.Input; namespace Generators.Exercises { @@ -9,10 +8,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Input = new Dictionary - { - ["input"] = canonicalDataCase.Input["basket"] - }; + canonicalDataCase.SetInputParameters("basket"); canonicalDataCase.UseVariablesForInput = true; } } diff --git a/generators/Exercises/BracketPush.cs b/generators/Exercises/BracketPush.cs index 67fc1eb019..d5c1b619ea 100644 --- a/generators/Exercises/BracketPush.cs +++ b/generators/Exercises/BracketPush.cs @@ -8,7 +8,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Input["input"] = ((string)canonicalDataCase.Input["input"]).Replace("\\", "\\\\"); + canonicalDataCase.Properties["input"] = ((string)canonicalDataCase.Properties["input"]).Replace("\\", "\\\\"); canonicalDataCase.UseVariablesForInput = true; } } diff --git a/generators/Exercises/ComplexNumbers.cs b/generators/Exercises/ComplexNumbers.cs index 4ab1f5655d..141424cc6b 100644 --- a/generators/Exercises/ComplexNumbers.cs +++ b/generators/Exercises/ComplexNumbers.cs @@ -27,23 +27,23 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) // Process constructor param var constructorParamName = canonicalDataCase.Input.ContainsKey("input") ? "input" : "z1"; - canonicalDataCase.ConstructorInput = new Dictionary - { - ["real"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][0]), - ["imaginary"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][1]) - }; - canonicalDataCase.TestedMethodType = TestedMethodType.Instance; + canonicalDataCase.Properties["real"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][0]); + canonicalDataCase.Properties["imaginary"] = ConvertMathDouble(canonicalDataCase.Input[constructorParamName][1]); - canonicalDataCase.Input.Remove(constructorParamName); + canonicalDataCase.SetConstructorInputParameters("real", "imaginary"); + canonicalDataCase.SetInputParameters(GetInputParameters(canonicalDataCase, constructorParamName)); // Process function param var keys = canonicalDataCase.Input.Keys.ToArray(); foreach (var key in keys) - canonicalDataCase.Input[key] = ConvertToType(canonicalDataCase.Input[key]); + canonicalDataCase.Properties[key] = ConvertToType(canonicalDataCase.Properties[key]); } } + private static string[] GetInputParameters(CanonicalDataCase canonicalDataCase, string constructorParamName) + => canonicalDataCase.Input.Keys.Where(x => x != constructorParamName).ToArray(); + protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody) { if (testMethodBody.UseVariableForExpected) diff --git a/generators/Exercises/Gigasecond.cs b/generators/Exercises/Gigasecond.cs index 924c0c6a40..b0623cbacf 100644 --- a/generators/Exercises/Gigasecond.cs +++ b/generators/Exercises/Gigasecond.cs @@ -11,24 +11,16 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - // Update input - var input = DateTime.Parse(canonicalDataCase.Input["input"].ToString()); - canonicalDataCase.Input["input"] = new UnescapedValue(FormatDateTime(input)); - - // Update expected + var input = DateTime.Parse(canonicalDataCase.Properties["input"].ToString()); + canonicalDataCase.Properties["input"] = new UnescapedValue(FormatDateTime(input)); + canonicalDataCase.Expected = new UnescapedValue(FormatDateTime((DateTime)canonicalDataCase.Expected)); } } - protected override HashSet AddAdditionalNamespaces() - { - return new HashSet() - { - typeof(DateTime).Namespace - }; - } + protected override HashSet AddAdditionalNamespaces() => new HashSet { typeof(DateTime).Namespace }; - private string FormatDateTime(DateTime dateTime) + private static string FormatDateTime(DateTime dateTime) { return dateTime.Hour == 0 && dateTime.Minute == 0 && dateTime.Second == 0 ? $"new DateTime({dateTime.Year}, {dateTime.Month}, {dateTime.Day})" diff --git a/generators/Exercises/QueenAttack.cs b/generators/Exercises/QueenAttack.cs index e4025af992..2c90656309 100644 --- a/generators/Exercises/QueenAttack.cs +++ b/generators/Exercises/QueenAttack.cs @@ -75,11 +75,10 @@ private static void SetCreatePropertyData(CanonicalDataCase canonicalDataCase) canonicalDataCase.Description = validExpected ? canonicalDataCase.Description + " does not throw exception" : canonicalDataCase.Description; var coordinates = GetCoordinatesFromPosition(canonicalDataCase.Input["queen"]); - canonicalDataCase.Input = new Dictionary - { - ["X"] = coordinates.Item1, - ["Y"] = coordinates.Item2 - }; + canonicalDataCase.Properties["X"] = coordinates.Item1; + canonicalDataCase.Properties["Y"] = coordinates.Item2; + + canonicalDataCase.SetInputParameters("X", "Y"); } } } diff --git a/generators/Exercises/RailFenceCipher.cs b/generators/Exercises/RailFenceCipher.cs index 99f6e0cd09..255473318e 100644 --- a/generators/Exercises/RailFenceCipher.cs +++ b/generators/Exercises/RailFenceCipher.cs @@ -10,7 +10,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; - canonicalDataCase.AddConstructorParameter("rails"); + canonicalDataCase.SetConstructorInputParameters("rails"); } } } diff --git a/generators/Exercises/SpaceAge.cs b/generators/Exercises/SpaceAge.cs index ac7449644b..3aa7dd7e46 100644 --- a/generators/Exercises/SpaceAge.cs +++ b/generators/Exercises/SpaceAge.cs @@ -9,8 +9,8 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { canonicalDataCase.Property = $"On_{canonicalDataCase.Input["planet"]}"; - canonicalDataCase.Input.Remove("planet"); - canonicalDataCase.AddConstructorParameter("seconds"); + canonicalDataCase.SetInputParameters(); + canonicalDataCase.SetConstructorInputParameters("seconds"); } } } diff --git a/generators/Exercises/Transpose.cs b/generators/Exercises/Transpose.cs index 6b7c9cc259..b0f50cf141 100644 --- a/generators/Exercises/Transpose.cs +++ b/generators/Exercises/Transpose.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using Generators.Input; namespace Generators.Exercises @@ -10,11 +9,9 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { canonicalDataCase.Property = "String"; - canonicalDataCase.Input = new Dictionary - { - ["input"] = Convert.ToMultiLineString(canonicalDataCase.Input["input"]) - }; + canonicalDataCase.Properties["input"] = Convert.ToMultiLineString(canonicalDataCase.Properties["input"]); canonicalDataCase.Expected = Convert.ToMultiLineString(canonicalDataCase.Expected); + canonicalDataCase.UseVariablesForInput = true; canonicalDataCase.UseVariableForExpected = true; } diff --git a/generators/Input/CanonicalDataCase.cs b/generators/Input/CanonicalDataCase.cs index 90dd85896b..a6df34f562 100644 --- a/generators/Input/CanonicalDataCase.cs +++ b/generators/Input/CanonicalDataCase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; using Newtonsoft.Json; namespace Generators.Input @@ -8,6 +9,9 @@ namespace Generators.Input [JsonConverter(typeof(CanonicalDataCaseJsonConverter))] public class CanonicalDataCase { + private readonly HashSet _inputParameters = new HashSet(); + private readonly HashSet _constructorInputParameters = new HashSet(); + [Required] public string Description { get; set; } @@ -15,10 +19,15 @@ public class CanonicalDataCase public string Property { get; set; } [JsonIgnore] - public IDictionary Input { get; set; } + public IReadOnlyDictionary Input + => _inputParameters.ToDictionary(parameter => parameter, parameter => Properties[parameter]); [JsonIgnore] - public IDictionary ConstructorInput { get; set; } + public IReadOnlyDictionary ConstructorInput + => _constructorInputParameters.ToDictionary(parameter => parameter, parameter => Properties[parameter]); + + [JsonIgnore] + public IDictionary Properties { get; set; } [JsonIgnore] public dynamic Expected @@ -27,9 +36,6 @@ public dynamic Expected set => Properties["expected"] = value; } - [JsonIgnore] - public IDictionary Properties { get; set; } - [JsonIgnore] public bool UseVariablesForInput { get; set; } @@ -48,12 +54,20 @@ public dynamic Expected [JsonIgnore] public Type ExceptionThrown { get; set; } - public void AddConstructorParameter(string parameterName) + public void SetInputParameters(params string[] properties) { - ConstructorInput[parameterName] = Properties[parameterName]; + _inputParameters.Clear(); + _inputParameters.UnionWith(properties); - if (Input.ContainsKey(parameterName)) - Input.Remove(parameterName); + _constructorInputParameters.ExceptWith(properties); + } + + public void SetConstructorInputParameters(params string[] properties) + { + _constructorInputParameters.Clear(); + _constructorInputParameters.UnionWith(properties); + + _inputParameters.ExceptWith(properties); TestedMethodType = TestedMethodType.Instance; } diff --git a/generators/Input/CanonicalDataCaseJson.cs b/generators/Input/CanonicalDataCaseJson.cs new file mode 100644 index 0000000000..e23902c821 --- /dev/null +++ b/generators/Input/CanonicalDataCaseJson.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json.Linq; + +namespace Generators.Input +{ + public static class CanonicalDataCaseJson + { + public static IDictionary ToDictionary(JToken jToken) + { + var properties = jToken.ToObject>(); + + for (var i = 0; i < properties.Count; i++) + { + var key = properties.Keys.ElementAt(i); + + if (properties[key] is JArray jArray) + { + // We can't determine the type of the array if the array is empty + if (!jArray.Any()) + continue; + + // We can only convert when all values have the same type + if (jArray.Select(x => x.Type).Distinct().Count() != 1) + continue; + + switch (jArray[0].Type) + { + case JTokenType.Object: + // TODO + break; + case JTokenType.Array: + // TODO + break; + case JTokenType.Integer: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Float: + properties[key] = jArray.ToObject(); + break; + case JTokenType.String: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Boolean: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Date: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Bytes: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Guid: + properties[key] = jArray.ToObject(); + break; + case JTokenType.Uri: + properties[key] = jArray.ToObject(); + break; + case JTokenType.TimeSpan: + properties[key] = jArray.ToObject(); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + return properties; + } + } +} diff --git a/generators/Input/CanonicalDataCaseJsonConverter.cs b/generators/Input/CanonicalDataCaseJsonConverter.cs index 5e77c84fe9..08e9ed93c2 100644 --- a/generators/Input/CanonicalDataCaseJsonConverter.cs +++ b/generators/Input/CanonicalDataCaseJsonConverter.cs @@ -8,7 +8,7 @@ namespace Generators.Input { public class CanonicalDataCaseJsonConverter : JsonConverter { - private static readonly string[] NonInputProperties = {"description", "property", "expected", "comments"}; + private static readonly string[] NonInputProperties = { "description", "property", "expected", "comments" }; public override bool CanConvert(Type objectType) => typeof(CanonicalDataCase) == objectType; @@ -18,84 +18,14 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist var canonicalDataCase = new CanonicalDataCase(); serializer.Populate(new JTokenReader(jToken), canonicalDataCase); - - canonicalDataCase.Properties = jToken.ToObject>(); - canonicalDataCase.Input = GetInputProperty(jToken); - canonicalDataCase.ConstructorInput = new Dictionary(); - - NormalizeJsonValues(canonicalDataCase.Properties); - NormalizeJsonValues(canonicalDataCase.Input); - + + canonicalDataCase.Properties = CanonicalDataCaseJson.ToDictionary(jToken); + canonicalDataCase.SetInputParameters(GetInputProperties(canonicalDataCase.Properties)); + return canonicalDataCase; } - private static void NormalizeJsonValues(IDictionary properties) - { - for (var i = 0; i < properties.Count; i++) - { - var key = properties.Keys.ElementAt(i); - - if (properties[key] is JArray jArray) - { - // We can't determine the type of the array if the array is empty - if (!jArray.Any()) - continue; - - // We can only convert when all values have the same type - if (jArray.Select(x => x.Type).Distinct().Count() != 1) - continue; - - switch (jArray[0].Type) - { - case JTokenType.Object: - // TODO - break; - case JTokenType.Array: - // TODO - break; - case JTokenType.Integer: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Float: - properties[key] = jArray.ToObject(); - break; - case JTokenType.String: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Boolean: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Date: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Bytes: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Guid: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Uri: - properties[key] = jArray.ToObject(); - break; - case JTokenType.TimeSpan: - properties[key] = jArray.ToObject(); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - } - } - - private static IDictionary GetInputProperty(JToken jToken) - { - var allProperties = jToken.ToObject>(); - - foreach (var nonInputProperty in NonInputProperties) - allProperties.Remove(nonInputProperty); - - return allProperties; - } + private static string[] GetInputProperties(IDictionary properties) => properties.Keys.Except(NonInputProperties).ToArray(); public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); } diff --git a/generators/Input/CanonicalDataCasesJson.cs b/generators/Input/CanonicalDataCasesJson.cs new file mode 100644 index 0000000000..a32b486831 --- /dev/null +++ b/generators/Input/CanonicalDataCasesJson.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json.Linq; + +namespace Generators.Input +{ + public static class CanonicalDataCasesJson + { + private const string TokensPath = "$..*[?(@.property)]"; + + public static CanonicalDataCase[] ToArray(JToken casesToken) + { + var caseTokens = new JArray(casesToken.SelectTokens(TokensPath)); + var canonicalDataCases = new JArray(caseTokens).ToObject(); + + ConvertEmptyJArrayToArray(canonicalDataCases); + + return canonicalDataCases; + } + + private static void ConvertEmptyJArrayToArray(CanonicalDataCase[] canonicalDataCases) + { + foreach (var groupedCanonicalDataCases in canonicalDataCases.ToLookup(c => c.Property)) + { + foreach (var groupedProperties in groupedCanonicalDataCases.SelectMany(x => x.Properties).ToLookup(x => x.Key)) + { + var arrayType = GetArrayType(groupedProperties); + if (arrayType == null) + continue; + + foreach (var groupedCanonicalDataCase in GetEmptyJArrays(groupedCanonicalDataCases, groupedProperties)) + groupedCanonicalDataCase.Properties[groupedProperties.Key] = Array.CreateInstance(arrayType, 0); + } + } + } + + private static Type GetArrayType(IGrouping> groupedProperties) + { + if (groupedProperties.Any(x => x.Value is string[])) + return typeof(string); + + if (groupedProperties.Any(x => x.Value is int[])) + return typeof(int); + + if (groupedProperties.Any(x => x.Value is float[])) + return typeof(float); + + return null; + } + + private static IEnumerable GetEmptyJArrays(IGrouping groupedCanonicalDataCases, IGrouping> groupedProperties) + => groupedCanonicalDataCases.Where(canonicalDataCase => IsEmptyJArray(canonicalDataCase, groupedProperties)); + + private static bool IsEmptyJArray(CanonicalDataCase x, IGrouping> groupedProperties) + => x.Properties[groupedProperties.Key] is JArray jArray && jArray.Count == 0; + } +} \ No newline at end of file diff --git a/generators/Input/CanonicalDataCasesJsonConverter.cs b/generators/Input/CanonicalDataCasesJsonConverter.cs index d0bbd7519a..571ab5a726 100644 --- a/generators/Input/CanonicalDataCasesJsonConverter.cs +++ b/generators/Input/CanonicalDataCasesJsonConverter.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -8,44 +7,11 @@ namespace Generators.Input { public class CanonicalDataCasesJsonConverter : JsonConverter { - private const string TokensPath = "$..*[?(@.property)]"; - public override bool CanConvert(Type objectType) => typeof(CanonicalDataCase[]).GetTypeInfo().IsAssignableFrom(objectType); - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - var casesToken = JToken.ReadFrom(reader); - var caseTokens = new JArray(casesToken.SelectTokens(TokensPath)); - var canonicalDataCases = new JArray(caseTokens).ToObject(); - - foreach (var groupedCanonicalDataCases in canonicalDataCases.ToLookup(c => c.Property)) - { - foreach (var groupedProperties in groupedCanonicalDataCases.SelectMany(x => x.Properties).ToLookup(x => x.Key)) - { - if (groupedProperties.Any(x => x.Value is string[])) - { - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) - groupedCanonicalDataCase.Properties[groupedProperties.Key] = new string[0]; - - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) - groupedCanonicalDataCase.Input[groupedProperties.Key] = new string[0]; - } - else if (groupedProperties.Any(x => x.Value is int[])) - { - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Properties[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) - groupedCanonicalDataCase.Properties[groupedProperties.Key] = new int[0]; - - foreach (var groupedCanonicalDataCase in groupedCanonicalDataCases.Where(x => x.Input.ContainsKey(groupedProperties.Key) && x.Input[groupedProperties.Key] is JArray jArray && jArray.Count == 0)) - groupedCanonicalDataCase.Input[groupedProperties.Key] = new int[0]; - } - } - } - - return canonicalDataCases; - } + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + => CanonicalDataCasesJson.ToArray(JToken.ReadFrom(reader)); public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); - - } } \ No newline at end of file diff --git a/generators/Output/TestMethodBodyData.cs b/generators/Output/TestMethodBodyData.cs index 694d401108..588cc6ae1e 100644 --- a/generators/Output/TestMethodBodyData.cs +++ b/generators/Output/TestMethodBodyData.cs @@ -19,7 +19,7 @@ public TestMethodBodyData(TestMethodBody testMethodBody) } public object TestedValue => _testMethodBody.UseVariableForTested ? TestedVariableName : TestedMethodInvocation; - public object InputParameters => _testMethodBody.UseVariablesForInput ? string.Join(", ", CanonicalDataCase.Input.Keys.Select(key => NameExtensions.ToVariableName(key))) : Input; + public object InputParameters => _testMethodBody.UseVariablesForInput ? string.Join(", ", CanonicalDataCase.Input.Keys.Select(key => key.ToVariableName())) : Input; public object ExpectedParameter => _testMethodBody.UseVariableForExpected ? ExpectedVariableName : Expected; public object ConstructorParameters => _testMethodBody.UseVariablesForConstructorParameters ? string.Join(", ", CanonicalDataCase.ConstructorInput.Keys.Select(key => key.ToVariableName())) : ConstructorInput; diff --git a/generators/Output/ValueFormatter.cs b/generators/Output/ValueFormatter.cs index 7c9807a9c2..129d9992ff 100644 --- a/generators/Output/ValueFormatter.cs +++ b/generators/Output/ValueFormatter.cs @@ -41,8 +41,8 @@ public static object Format(object val) } } - public static string[] FormatVariables(IDictionary dict) - => dict.Keys.SelectMany((key, i) => FormatVariable(dict[key], key.ToVariableName())).ToArray(); + public static string[] FormatVariables(IReadOnlyDictionary dict) + => dict.Keys.SelectMany(key => FormatVariable(dict[key], key.ToVariableName())).ToArray(); public static string[] FormatVariable(object val, string name) { From f71269ae807b1d9d37da83c403ed5034aee2cdb5 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Sep 2017 20:02:20 +0200 Subject: [PATCH 8/8] Further simplifications --- generators/Exercises/Allergies.cs | 17 +--- generators/Exercises/Alphametics.cs | 6 +- generators/Exercises/BracketPush.cs | 2 +- generators/Exercises/Grains.cs | 12 +-- generators/Exercises/Hamming.cs | 2 - generators/Exercises/PerfectNumbers.cs | 5 +- generators/Exercises/Poker.cs | 3 - generators/Exercises/QueenAttack.cs | 20 ++--- generators/Exercises/RnaTranscription.cs | 2 - generators/Exercises/SumOfMultiples.cs | 16 +--- generators/Exercises/WordCount.cs | 15 ++-- generators/Input/CanonicalDataCaseJson.cs | 101 +++++++++++----------- 12 files changed, 77 insertions(+), 124 deletions(-) diff --git a/generators/Exercises/Allergies.cs b/generators/Exercises/Allergies.cs index a36ec9dda4..b8fe732146 100644 --- a/generators/Exercises/Allergies.cs +++ b/generators/Exercises/Allergies.cs @@ -1,7 +1,5 @@ -using System.Linq; -using Generators.Input; +using Generators.Input; using Generators.Output; -using Newtonsoft.Json.Linq; namespace Generators.Exercises { @@ -32,17 +30,10 @@ private static string RenderIsAllergicToAssert(TestMethodBody testMethodBody) { const string template = @"{%- for allergy in Allergies -%} -Assert.{% if allergy.Result %}True{% else %}False{% endif %}(sut.IsAllergicTo(""{{ allergy.Substance }}"")); +Assert.{% if allergy.result %}True{% else %}False{% endif %}(sut.IsAllergicTo(""{{ allergy.substance }}"")); {%- endfor -%}"; - - var templateParameters = new - { - Allergies = ((JArray) testMethodBody.CanonicalDataCase.Expected) - .Children() - .Select(x => new {Result = x["result"].Value(), Substance = x["substance"].Value()}) - .ToArray() - }; - + + var templateParameters = new { Allergies = testMethodBody.CanonicalDataCase.Expected }; return TemplateRenderer.RenderInline(template, templateParameters); } } diff --git a/generators/Exercises/Alphametics.cs b/generators/Exercises/Alphametics.cs index aa0ce88f53..5fc5de598e 100644 --- a/generators/Exercises/Alphametics.cs +++ b/generators/Exercises/Alphametics.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Generators.Input; namespace Generators.Exercises @@ -16,10 +17,13 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) if (canonicalDataCase.Expected == null) canonicalDataCase.ExceptionThrown = typeof(ArgumentException); else - canonicalDataCase.Expected = canonicalDataCase.Expected.ToObject>(); + canonicalDataCase.Expected = ConvertExpected(canonicalDataCase); } } + private static dynamic ConvertExpected(CanonicalDataCase canonicalDataCase) + => ((Dictionary)canonicalDataCase.Expected).ToDictionary(kv => kv.Key[0], kv => int.Parse(kv.Value.ToString())); + protected override HashSet AddAdditionalNamespaces() => new HashSet { typeof(Dictionary).Namespace }; } } \ No newline at end of file diff --git a/generators/Exercises/BracketPush.cs b/generators/Exercises/BracketPush.cs index d5c1b619ea..2577d376a3 100644 --- a/generators/Exercises/BracketPush.cs +++ b/generators/Exercises/BracketPush.cs @@ -8,7 +8,7 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.Properties["input"] = ((string)canonicalDataCase.Properties["input"]).Replace("\\", "\\\\"); + canonicalDataCase.Properties["input"] = canonicalDataCase.Properties["input"].Replace("\\", "\\\\"); canonicalDataCase.UseVariablesForInput = true; } } diff --git a/generators/Exercises/Grains.cs b/generators/Exercises/Grains.cs index cba4865dce..95928069d8 100644 --- a/generators/Exercises/Grains.cs +++ b/generators/Exercises/Grains.cs @@ -10,20 +10,12 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) foreach (var canonicalDataCase in canonicalData.Cases) { if (ShouldThrowException(canonicalDataCase.Expected)) - { canonicalDataCase.ExceptionThrown = typeof(ArgumentOutOfRangeException); - } else - { - canonicalDataCase.Expected = ulong.Parse(canonicalDataCase.Expected.ToString()); - } + canonicalDataCase.Expected = (ulong)canonicalDataCase.Expected; } } - private static bool ShouldThrowException(object value) - { - return int.TryParse(value.ToString(), out int result) - && result == -1; - } + private static bool ShouldThrowException(dynamic value) => value == -1; } } \ No newline at end of file diff --git a/generators/Exercises/Hamming.cs b/generators/Exercises/Hamming.cs index c971de2db3..4a6ec24a61 100644 --- a/generators/Exercises/Hamming.cs +++ b/generators/Exercises/Hamming.cs @@ -8,9 +8,7 @@ public class Hamming : Exercise protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) - { canonicalDataCase.ExceptionThrown = canonicalDataCase.Expected is long ? null : typeof(ArgumentException); - } } } } diff --git a/generators/Exercises/PerfectNumbers.cs b/generators/Exercises/PerfectNumbers.cs index 2b35b211f3..bbbe8f4278 100644 --- a/generators/Exercises/PerfectNumbers.cs +++ b/generators/Exercises/PerfectNumbers.cs @@ -2,7 +2,6 @@ using Generators.Input; using Generators.Output; using Humanizer; -using Newtonsoft.Json.Linq; namespace Generators.Exercises { @@ -12,10 +11,10 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) { - canonicalDataCase.ExceptionThrown = canonicalDataCase.Expected is JObject ? typeof(ArgumentOutOfRangeException) : null; - if (canonicalDataCase.Expected is string classificationType) canonicalDataCase.Expected = new UnescapedValue($"Classification.{classificationType.Transform(To.SentenceCase)}"); + else + canonicalDataCase.ExceptionThrown = typeof(ArgumentOutOfRangeException); } } } diff --git a/generators/Exercises/Poker.cs b/generators/Exercises/Poker.cs index a6a78bbef9..e19da3dbed 100644 --- a/generators/Exercises/Poker.cs +++ b/generators/Exercises/Poker.cs @@ -10,9 +10,6 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.UseVariableForExpected = true; canonicalDataCase.UseVariableForTested = true; - - //canonicalDataCase.Expected = canonicalDataCase.Expected.ConvertToEnumerable(); - //canonicalDataCase.Input["input"] = canonicalDataCase.Input["input"].ConvertToEnumerable(); } } } diff --git a/generators/Exercises/QueenAttack.cs b/generators/Exercises/QueenAttack.cs index 2c90656309..c63d722bec 100644 --- a/generators/Exercises/QueenAttack.cs +++ b/generators/Exercises/QueenAttack.cs @@ -1,8 +1,7 @@ using Generators.Input; using Generators.Output; -using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; +using System.Linq; namespace Generators.Exercises { @@ -10,26 +9,17 @@ public class QueenAttack : Exercise { protected override void UpdateCanonicalData(CanonicalData canonicalData) { - foreach (var canonicalDataCase in canonicalData.Cases) - { - if (canonicalDataCase.Property == "create") - { - SetCreatePropertyData(canonicalDataCase); - } - } + foreach (var canonicalDataCase in canonicalData.Cases.Where(canonicalDataCase => canonicalDataCase.Property == "create")) + SetCreatePropertyData(canonicalDataCase); } protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody) { if (testMethodBody.CanonicalDataCase.Property == "canAttack") - { return RenderCanAttackAssert(testMethodBody); - } if (testMethodBody.UseVariableForTested) - { return string.Empty; - } return base.RenderTestMethodBodyAssert(testMethodBody); } @@ -56,9 +46,9 @@ private static string RenderCanAttackAssert(TestMethodBody testMethodBody) return TemplateRenderer.RenderInline(template, templateParameters); } - private static Tuple GetCoordinatesFromPosition(object rawPosition) + private static Tuple GetCoordinatesFromPosition(dynamic expected) { - var coordinates = ((JObject)rawPosition).ToObject>()["position"].Split(','); + var coordinates = expected["position"].Split(','); var positionX = int.Parse(coordinates[0].TrimStart('(')); var positionY = int.Parse(coordinates[1].TrimEnd(')')); diff --git a/generators/Exercises/RnaTranscription.cs b/generators/Exercises/RnaTranscription.cs index 747046172f..05bc2b6e95 100644 --- a/generators/Exercises/RnaTranscription.cs +++ b/generators/Exercises/RnaTranscription.cs @@ -8,9 +8,7 @@ public class RnaTranscription : Exercise protected override void UpdateCanonicalData(CanonicalData canonicalData) { foreach (var canonicalDataCase in canonicalData.Cases) - { canonicalDataCase.ExceptionThrown = canonicalDataCase.Expected is null ? typeof(ArgumentException) : null; - } } } } \ No newline at end of file diff --git a/generators/Exercises/SumOfMultiples.cs b/generators/Exercises/SumOfMultiples.cs index 5ce2f06673..7b745f242b 100644 --- a/generators/Exercises/SumOfMultiples.cs +++ b/generators/Exercises/SumOfMultiples.cs @@ -1,20 +1,6 @@ -using Generators.Input; - -namespace Generators.Exercises +namespace Generators.Exercises { public class SumOfMultiples : Exercise { - protected override void UpdateCanonicalData(CanonicalData canonicalData) - { - foreach (var canonicalDataCase in canonicalData.Cases) - { - //var hasFactors = canonicalDataCase.Input["factors"].ConvertToEnumerable().Any(); - - //if (!hasFactors) - //{ - // canonicalDataCase.Input["factors"] = Enumerable.Empty(); - //} - } - } } } \ No newline at end of file diff --git a/generators/Exercises/WordCount.cs b/generators/Exercises/WordCount.cs index 5a3c68241c..2b5258e834 100644 --- a/generators/Exercises/WordCount.cs +++ b/generators/Exercises/WordCount.cs @@ -1,6 +1,6 @@ using Generators.Input; -using Newtonsoft.Json.Linq; using System.Collections.Generic; +using System.Linq; namespace Generators.Exercises { @@ -12,16 +12,13 @@ protected override void UpdateCanonicalData(CanonicalData canonicalData) { canonicalDataCase.UseVariableForExpected = true; canonicalDataCase.UseVariableForTested = true; - canonicalDataCase.Expected = ((JObject)canonicalDataCase.Expected).ToObject>(); + canonicalDataCase.Expected = ConvertExpected(canonicalDataCase.Expected); } } - protected override HashSet AddAdditionalNamespaces() - { - return new HashSet() - { - typeof(Dictionary).Namespace - }; - } + private static dynamic ConvertExpected(dynamic expected) + => ((Dictionary)expected).ToDictionary(kv => kv.Key, kv => int.Parse(kv.Value.ToString())); + + protected override HashSet AddAdditionalNamespaces() => new HashSet { typeof(Dictionary).Namespace }; } } diff --git a/generators/Input/CanonicalDataCaseJson.cs b/generators/Input/CanonicalDataCaseJson.cs index e23902c821..89b1eae89a 100644 --- a/generators/Input/CanonicalDataCaseJson.cs +++ b/generators/Input/CanonicalDataCaseJson.cs @@ -7,66 +7,67 @@ namespace Generators.Input { public static class CanonicalDataCaseJson { - public static IDictionary ToDictionary(JToken jToken) + public static IDictionary ToDictionary(JToken jToken) => ConvertProperty(jToken); + + private static dynamic ConvertProperty(dynamic property) + { + if (property is JArray jArray) + return ConvertArrayProperty(property, jArray); + + if (property is JToken jToken) + return ConvertTokenProperty(jToken); + + return property; + } + + private static dynamic ConvertTokenProperty(JToken jToken) { var properties = jToken.ToObject>(); for (var i = 0; i < properties.Count; i++) { var key = properties.Keys.ElementAt(i); + properties[key] = ConvertProperty(properties[key]); + } - if (properties[key] is JArray jArray) - { - // We can't determine the type of the array if the array is empty - if (!jArray.Any()) - continue; + return properties; + } - // We can only convert when all values have the same type - if (jArray.Select(x => x.Type).Distinct().Count() != 1) - continue; + private static dynamic ConvertArrayProperty(dynamic property, JArray jArray) + { + // We can't determine the type of the array if the array is empty + if (!jArray.Any()) + return property; - switch (jArray[0].Type) - { - case JTokenType.Object: - // TODO - break; - case JTokenType.Array: - // TODO - break; - case JTokenType.Integer: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Float: - properties[key] = jArray.ToObject(); - break; - case JTokenType.String: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Boolean: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Date: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Bytes: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Guid: - properties[key] = jArray.ToObject(); - break; - case JTokenType.Uri: - properties[key] = jArray.ToObject(); - break; - case JTokenType.TimeSpan: - properties[key] = jArray.ToObject(); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - } + // We can only convert when all values have the same type + if (jArray.Select(x => x.Type).Distinct().Count() != 1) + return property; - return properties; + switch (jArray[0].Type) + { + case JTokenType.Object: + return jArray.Select(ConvertProperty).ToArray(); + case JTokenType.Integer: + return jArray.ToObject(); + case JTokenType.Float: + return jArray.ToObject(); + case JTokenType.String: + return jArray.ToObject(); + case JTokenType.Boolean: + return jArray.ToObject(); + case JTokenType.Date: + return jArray.ToObject(); + case JTokenType.Bytes: + return jArray.ToObject(); + case JTokenType.Guid: + return jArray.ToObject(); + case JTokenType.Uri: + return jArray.ToObject(); + case JTokenType.TimeSpan: + return jArray.ToObject(); + default: + return property; + } } } }