From 406dcdd66cbc84c3e4b993eb5b6b36c92f94061a Mon Sep 17 00:00:00 2001 From: Pedro Gaspar Date: Fri, 5 Oct 2018 13:33:33 +0100 Subject: [PATCH 1/2] change: Regenerate Tests Update generator to use the standard error indicator. Update solution to pass updated tests. --- exercises/change/.meta/generator/change_case.rb | 12 +++++++++++- exercises/change/.meta/solutions/change.rb | 3 ++- exercises/change/change_test.rb | 14 ++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/exercises/change/.meta/generator/change_case.rb b/exercises/change/.meta/generator/change_case.rb index 7aedeb8297..2885e9b56d 100644 --- a/exercises/change/.meta/generator/change_case.rb +++ b/exercises/change/.meta/generator/change_case.rb @@ -2,6 +2,16 @@ class ChangeCase < Generator::ExerciseCase def workload - assert_equal(expected, "Change.generate(#{coins}, #{target})") + if error_expected? + assert_raises(ArgumentError, subject_of_test) + else + assert_equal(expected, subject_of_test) + end + end + + private + + def subject_of_test + "Change.generate(#{coins}, #{target})" end end diff --git a/exercises/change/.meta/solutions/change.rb b/exercises/change/.meta/solutions/change.rb index 6449bdb6e4..93b712db3a 100644 --- a/exercises/change/.meta/solutions/change.rb +++ b/exercises/change/.meta/solutions/change.rb @@ -11,8 +11,9 @@ def generate return [] if target.zero? calculate_change(coins, [], target) + raise ArgumentError if total_change.none? - total_change.any? ? total_change.sort : -1 + total_change.sort end def self.generate(coins, target) diff --git a/exercises/change/change_test.rb b/exercises/change/change_test.rb index 57e2ea9f44..dbb5ca15be 100644 --- a/exercises/change/change_test.rb +++ b/exercises/change/change_test.rb @@ -1,7 +1,7 @@ require 'minitest/autorun' require_relative 'change' -# Common test data version: 1.2.0 044d09a +# Common test data version: 1.3.0 258c807 class ChangeTest < Minitest::Test def test_single_coin_change # skip @@ -45,16 +45,22 @@ def test_no_coins_make_0_change def test_error_testing_for_change_smaller_than_the_smallest_of_coins skip - assert_equal -1, Change.generate([5, 10], 3) + assert_raises(ArgumentError) do + Change.generate([5, 10], 3) + end end def test_error_if_no_combination_can_add_up_to_target skip - assert_equal -1, Change.generate([5, 10], 94) + assert_raises(ArgumentError) do + Change.generate([5, 10], 94) + end end def test_cannot_find_negative_change_values skip - assert_equal -1, Change.generate([1, 2, 5], -5) + assert_raises(ArgumentError) do + Change.generate([1, 2, 5], -5) + end end end From 6c023f53e32c5d0d2ffc21f5180c2123079948b6 Mon Sep 17 00:00:00 2001 From: Pedro Gaspar Date: Fri, 19 Oct 2018 02:50:02 +0100 Subject: [PATCH 2/2] change: Replace ArgumentError with custom errors --- exercises/change/.meta/generator/change_case.rb | 11 ++++++++++- exercises/change/.meta/solutions/change.rb | 6 +++++- exercises/change/change_test.rb | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/exercises/change/.meta/generator/change_case.rb b/exercises/change/.meta/generator/change_case.rb index 2885e9b56d..99369d768c 100644 --- a/exercises/change/.meta/generator/change_case.rb +++ b/exercises/change/.meta/generator/change_case.rb @@ -3,7 +3,7 @@ class ChangeCase < Generator::ExerciseCase def workload if error_expected? - assert_raises(ArgumentError, subject_of_test) + handle_errors else assert_equal(expected, subject_of_test) end @@ -11,6 +11,15 @@ def workload private + def handle_errors + case test_name + when 'test_cannot_find_negative_change_values' + assert_raises('Change::NegativeTargetError', subject_of_test) + else + assert_raises('Change::ImpossibleCombinationError', subject_of_test) + end + end + def subject_of_test "Change.generate(#{coins}, #{target})" end diff --git a/exercises/change/.meta/solutions/change.rb b/exercises/change/.meta/solutions/change.rb index 93b712db3a..dd5662ef58 100644 --- a/exercises/change/.meta/solutions/change.rb +++ b/exercises/change/.meta/solutions/change.rb @@ -1,6 +1,9 @@ class Change attr_reader :coins, :target + class NegativeTargetError < ArgumentError; end + class ImpossibleCombinationError < StandardError; end + def initialize(coins, target) @coins = coins.sort.reverse @target = target @@ -8,10 +11,11 @@ def initialize(coins, target) end def generate + raise NegativeTargetError if target < 0 return [] if target.zero? calculate_change(coins, [], target) - raise ArgumentError if total_change.none? + raise ImpossibleCombinationError if total_change.none? total_change.sort end diff --git a/exercises/change/change_test.rb b/exercises/change/change_test.rb index dbb5ca15be..4f25756eaf 100644 --- a/exercises/change/change_test.rb +++ b/exercises/change/change_test.rb @@ -45,21 +45,21 @@ def test_no_coins_make_0_change def test_error_testing_for_change_smaller_than_the_smallest_of_coins skip - assert_raises(ArgumentError) do + assert_raises(Change::ImpossibleCombinationError) do Change.generate([5, 10], 3) end end def test_error_if_no_combination_can_add_up_to_target skip - assert_raises(ArgumentError) do + assert_raises(Change::ImpossibleCombinationError) do Change.generate([5, 10], 94) end end def test_cannot_find_negative_change_values skip - assert_raises(ArgumentError) do + assert_raises(Change::NegativeTargetError) do Change.generate([1, 2, 5], -5) end end