From badf11b0a5b23b669e3bd7202eaf5f9613c68b45 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:14:26 -0600 Subject: [PATCH 01/20] Add skipped test_custom_max_min_bottles_song integration test --- test/bottles_test.rb | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/test/bottles_test.rb b/test/bottles_test.rb index 55db7ee..f248bcd 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -181,7 +181,7 @@ def test_song end class Bottles99IntegrationTest < Minitest::Test - def test_partial_7_bottles_song + def test_custom_max_bottles_song expected = <<-SONG 7 bottles of beer on the wall, 7 bottles of beer. Take one down and pass it around, 1 six-pack of beer on the wall. @@ -212,8 +212,39 @@ def test_partial_7_bottles_song expected, CountdownSong.new( verse_template: BottleVerse, - max: 7, - min: 0 + max: 7 + ).song + ) + end + + def test_custom_max_min_bottles_song + skip + expected = <<-SONG +1 six-pack of beer on the wall, 1 six-pack of beer. +Take one down and pass it around, 5 bottles of beer on the wall. + +5 bottles of beer on the wall, 5 bottles of beer. +Take one down and pass it around, 4 bottles of beer on the wall. + +4 bottles of beer on the wall, 4 bottles of beer. +Take one down and pass it around, 3 bottles of beer on the wall. + +3 bottles of beer on the wall, 3 bottles of beer. +Take one down and pass it around, 2 bottles of beer on the wall. + +2 bottles of beer on the wall, 2 bottles of beer. +Take one down and pass it around, 1 bottle of beer on the wall. + +1 bottle of beer on the wall, 1 bottle of beer. +Go to the store and buy some more, 1 six-pack of beer on the wall. + SONG + + assert_equal( + expected, + CountdownSong.new( + verse_template: BottleVerse, + max: 6, + min: 1 ).song ) end From 2b7413226a0ddd09b420dc11aaea66c1472e0938 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:18:58 -0600 Subject: [PATCH 02/20] Add min parameter with default value of 0 to BottleNumber.for --- lib/bottles.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 27aee4d..43135fd 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -51,7 +51,7 @@ def lyrics class BottleNumber - def self.for(number, max:) + def self.for(number, max:, min: 0) case number when 0 BottleNumber0 From cb2715611eb1a8c26c74003fee70a2d1b5afd24e Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:23:24 -0600 Subject: [PATCH 03/20] Add min to BottleNumber constructor with a default of 0 --- lib/bottles.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 43135fd..2e0c338 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -64,10 +64,11 @@ def self.for(number, max:, min: 0) end.new(number, max: max) end - attr_reader :number, :max - def initialize(number, max:) + attr_reader :number, :max, :min + def initialize(number, max:, min: 0) @number = number @max = max + @min = min end def to_s From b84d4e72e688afe58ac80819118924718f0054cf Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:24:33 -0600 Subject: [PATCH 04/20] Pass the minimum value in BottleNumber.for to the BottleNumber constructor --- lib/bottles.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 2e0c338..9d4471a 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -61,11 +61,11 @@ def self.for(number, max:, min: 0) BottleNumber6 else BottleNumber - end.new(number, max: max) + end.new(number, max: max, min: min) end attr_reader :number, :max, :min - def initialize(number, max:, min: 0) + def initialize(number, max:, min:) @number = number @max = max @min = min From 35b1794ea4c4a80626a76cd7bf33479cc50f2f48 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:25:41 -0600 Subject: [PATCH 05/20] Pass the min parameter to BottleNumber.for in BottleNumber classes --- lib/bottles.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 9d4471a..c604b1a 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -92,7 +92,7 @@ def pronoun end def successor - BottleNumber.for(number - 1, max: max) + BottleNumber.for(number - 1, max: max, min: min) end end @@ -106,7 +106,7 @@ def action end def successor - BottleNumber.for(max, max: max) + BottleNumber.for(max, max: max, min: min) end end From 441f7db27d4924c9dd776a4f84a3c062aca8e230 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:26:48 -0600 Subject: [PATCH 06/20] Add the min parameter to BottleVerse.lyrics --- lib/bottles.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index c604b1a..0bef36a 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -30,8 +30,8 @@ def min 0 end - def lyrics(number, max: self.max) - new(BottleNumber.for(number, max: max)).lyrics + def lyrics(number, max: self.max, min: self.min) + new(BottleNumber.for(number, max: max, min: self.min)).lyrics end end From 47847ff542bd73e44efe5c311e845c319f5d8890 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:27:25 -0600 Subject: [PATCH 07/20] Remove the default value for min in BottleNumber.for --- lib/bottles.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 0bef36a..ee2cbae 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -51,7 +51,7 @@ def lyrics class BottleNumber - def self.for(number, max:, min: 0) + def self.for(number, max:, min:) case number when 0 BottleNumber0 From 17bf1aeee12e30d2017a9944882b4d7a369424ac Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:28:44 -0600 Subject: [PATCH 08/20] Add min parameter to VerseFake.lyrics --- test/bottles_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/bottles_test.rb b/test/bottles_test.rb index f248bcd..d615df0 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -21,7 +21,7 @@ def min 5 end - def lyrics(number, max: nil) + def lyrics(number, max: nil, min: nil) "This is verse #{number}.\n" end end From 010831157f61e306be49629bfb121e645e07b8ef Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:31:01 -0600 Subject: [PATCH 09/20] Add skipped BottleVerse unit test test_verse_1_with_explicit_min_value --- test/bottles_test.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/bottles_test.rb b/test/bottles_test.rb index d615df0..1dfa241 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -97,6 +97,16 @@ def test_verse_1 assert_equal expected, BottleVerse.lyrics(1) end + def test_verse_1_with_explicit_min_value + skip + expected = + "1 bottle of beer on the wall, " + + "1 bottle of beer.\n" + + "Go to the store and buy some more, " + + "99 bottles of beer on the wall.\n" + assert_equal expected, BottleVerse.lyrics(1, min: 1) + end + def test_verse_0 expected = "No more bottles of beer on the wall, " + From a7082544b3124b1516c0344e9b34fd754d002fe9 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:44:39 -0600 Subject: [PATCH 10/20] Add naive implementation of BottleNumberMin and unit test --- lib/bottles.rb | 18 ++++++++++++++++++ test/bottles_test.rb | 12 ++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/bottles.rb b/lib/bottles.rb index ee2cbae..18dc223 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -129,3 +129,21 @@ def container "six-pack" end end + +class BottleNumberMin < BottleNumber + def quantity + "1" + end + + def container + "bottle" + end + + def action + "Go to the store and buy some more" + end + + def successor + BottleNumber.for(max, max: max, min: min) + end +end diff --git a/test/bottles_test.rb b/test/bottles_test.rb index 1dfa241..b7b069d 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -126,6 +126,18 @@ def test_verse_0_with_explicit_max_value end end +class BottleNumberMinTest < Minitest::Test + def test_verse_1 + expected = + "1 bottle of beer on the wall, " + + "1 bottle of beer.\n" + + "Go to the store and buy some more, " + + "99 bottles of beer on the wall.\n" + assert_equal expected, BottleVerse.new( + BottleNumberMin.new(1, max: 99, min: 1) + ).lyrics + end +end class CountdownSongTest < Minitest::Test def test_verse From e99af66b1bc6944c549b0f1cd53772d5ff94fb42 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:50:59 -0600 Subject: [PATCH 11/20] Update BottleNumberMin to proxy quantity and container from BottleNumber --- lib/bottles.rb | 9 +++++++-- test/bottles_test.rb | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 18dc223..a2b8829 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -131,12 +131,17 @@ def container end class BottleNumberMin < BottleNumber + def initialize(number, max:, min:) + super + @bottle_number = BottleNumber.for(number, max: max, min: nil) + end + def quantity - "1" + @bottle_number.quantity end def container - "bottle" + @bottle_number.container end def action diff --git a/test/bottles_test.rb b/test/bottles_test.rb index b7b069d..732ab9c 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -137,6 +137,17 @@ def test_verse_1 BottleNumberMin.new(1, max: 99, min: 1) ).lyrics end + + def test_verse_0 + expected = + "No more bottles of beer on the wall, " + + "no more bottles of beer.\n" + + "Go to the store and buy some more, " + + "1 six-pack of beer on the wall.\n" + assert_equal expected, BottleVerse.new( + BottleNumberMin.new(0, max: 6, min: 0) + ).lyrics + end end class CountdownSongTest < Minitest::Test From b6996bafb56497d448400faee2cdc07528a30e16 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 18:59:19 -0600 Subject: [PATCH 12/20] Update BottleNumber.for to use BottleNumberMin if number matches min --- lib/bottles.rb | 8 +++++++- test/bottles_test.rb | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index a2b8829..e811a4f 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -31,7 +31,7 @@ def min end def lyrics(number, max: self.max, min: self.min) - new(BottleNumber.for(number, max: max, min: self.min)).lyrics + new(BottleNumber.for(number, max: max, min: min)).lyrics end end @@ -52,6 +52,12 @@ def lyrics class BottleNumber def self.for(number, max:, min:) + return BottleNumberMin.new( + number, + max: max, + min: min + ) if number == min + case number when 0 BottleNumber0 diff --git a/test/bottles_test.rb b/test/bottles_test.rb index 732ab9c..fb10109 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -98,7 +98,6 @@ def test_verse_1 end def test_verse_1_with_explicit_min_value - skip expected = "1 bottle of beer on the wall, " + "1 bottle of beer.\n" + From 7e21245f62752fa3ca504d2b3e57009d79f5e696 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Fri, 13 Jan 2023 19:00:40 -0600 Subject: [PATCH 13/20] Pass min parameter to verse_template.lyrics and unskip integration test --- lib/bottles.rb | 2 +- test/bottles_test.rb | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index e811a4f..d1dadc6 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -15,7 +15,7 @@ def verses(upper, lower) end def verse(number) - verse_template.lyrics(number, max: max) + verse_template.lyrics(number, max: max, min: min) end end diff --git a/test/bottles_test.rb b/test/bottles_test.rb index fb10109..6eb64b7 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -250,7 +250,6 @@ def test_custom_max_bottles_song end def test_custom_max_min_bottles_song - skip expected = <<-SONG 1 six-pack of beer on the wall, 1 six-pack of beer. Take one down and pass it around, 5 bottles of beer on the wall. From 54cb31d3e9aab1fb0a2931940eaacc3c0eb42296 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 15:11:09 -0600 Subject: [PATCH 14/20] Remove unnecessary duplicate methods from BottleNumber0 --- lib/bottles.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index d1dadc6..f30b69c 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -106,14 +106,6 @@ class BottleNumber0 < BottleNumber def quantity "no more" end - - def action - "Go to the store and buy some more" - end - - def successor - BottleNumber.for(max, max: max, min: min) - end end class BottleNumber1 < BottleNumber From 2d9134bc393c25eb50d06da1eff5524eaafda626 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:24:52 -0600 Subject: [PATCH 15/20] Introduce bottle_number: parameter with nil default to BottleNumberMin#new --- lib/bottles.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index f30b69c..490ebf5 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -129,8 +129,8 @@ def container end class BottleNumberMin < BottleNumber - def initialize(number, max:, min:) - super + def initialize(number, max:, min:, bottle_number: nil) + super(number, max: max, min: min) @bottle_number = BottleNumber.for(number, max: max, min: nil) end From a5f5fdbf6811b429ab70d9ded83a6d30905c02bb Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:26:39 -0600 Subject: [PATCH 16/20] Update BottleNumber.for to prepare to pass bottle_number to BottleNumberMin#new --- lib/bottles.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 490ebf5..2129ca1 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -52,13 +52,7 @@ def lyrics class BottleNumber def self.for(number, max:, min:) - return BottleNumberMin.new( - number, - max: max, - min: min - ) if number == min - - case number + bottle_number = case number when 0 BottleNumber0 when 1 @@ -68,6 +62,16 @@ def self.for(number, max:, min:) else BottleNumber end.new(number, max: max, min: min) + + if (number == min) + BottleNumberMin.new( + number, + max: max, + min: min + ) + else + bottle_number + end end attr_reader :number, :max, :min From aa115433045b0dd060f03626d1aaeb36ee63d41e Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:29:21 -0600 Subject: [PATCH 17/20] Update BottleNumberMinTest tests to pass bottle_number: to BottleNumberMin#new --- test/bottles_test.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/bottles_test.rb b/test/bottles_test.rb index 6eb64b7..2a6053d 100644 --- a/test/bottles_test.rb +++ b/test/bottles_test.rb @@ -133,7 +133,12 @@ def test_verse_1 "Go to the store and buy some more, " + "99 bottles of beer on the wall.\n" assert_equal expected, BottleVerse.new( - BottleNumberMin.new(1, max: 99, min: 1) + BottleNumberMin.new( + 1, + max: 99, + min: 1, + bottle_number: BottleNumber.for(1, max: 99, min: 1) + ) ).lyrics end @@ -144,7 +149,12 @@ def test_verse_0 "Go to the store and buy some more, " + "1 six-pack of beer on the wall.\n" assert_equal expected, BottleVerse.new( - BottleNumberMin.new(0, max: 6, min: 0) + BottleNumberMin.new( + 0, + max: 6, + min: 0, + bottle_number: BottleNumber.for(0, max: 6, min: 0) + ) ).lyrics end end From 609c6084ff9706ccac01af2886068702980c6408 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:30:21 -0600 Subject: [PATCH 18/20] Update BottleNumberMin#new to use bottle_number if it is not nil --- lib/bottles.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 2129ca1..664f95f 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -135,7 +135,7 @@ def container class BottleNumberMin < BottleNumber def initialize(number, max:, min:, bottle_number: nil) super(number, max: max, min: min) - @bottle_number = BottleNumber.for(number, max: max, min: nil) + @bottle_number = bottle_number ? bottle_number : BottleNumber.for(number, max: max, min: nil) end def quantity From 0911e00ebaff36864ebbf2c92eab0a516300dc4f Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:31:07 -0600 Subject: [PATCH 19/20] Update BottleNumber.for to pass bottle_number to BottleNumberMin#new --- lib/bottles.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 664f95f..5b48a2c 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -67,7 +67,8 @@ def self.for(number, max:, min:) BottleNumberMin.new( number, max: max, - min: min + min: min, + bottle_number: bottle_number ) else bottle_number From 439cbcf69a312f6f7053306441389ebc763b7529 Mon Sep 17 00:00:00 2001 From: Trish Rempel Date: Sun, 15 Jan 2023 22:31:50 -0600 Subject: [PATCH 20/20] Remove default value for bottle_number: in BottleNumberMin#new --- lib/bottles.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bottles.rb b/lib/bottles.rb index 5b48a2c..3d769a4 100644 --- a/lib/bottles.rb +++ b/lib/bottles.rb @@ -134,9 +134,9 @@ def container end class BottleNumberMin < BottleNumber - def initialize(number, max:, min:, bottle_number: nil) + def initialize(number, max:, min:, bottle_number:) super(number, max: max, min: min) - @bottle_number = bottle_number ? bottle_number : BottleNumber.for(number, max: max, min: nil) + @bottle_number = bottle_number end def quantity