From 1da67e2b28208882ffc929a16f432f1c6e4ddfb3 Mon Sep 17 00:00:00 2001 From: florentdevk Date: Tue, 23 Jun 2026 20:49:11 +0200 Subject: [PATCH 1/5] feat: add HiLoCounter with running count --- src/Domain/HiLoCounter.php | 18 ++++++++++++++++++ tests/Domain/BasicStrategyTest.php | 13 +++++++++++++ tests/Domain/HiLoCounterTest.php | 18 ++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/Domain/HiLoCounter.php create mode 100644 tests/Domain/HiLoCounterTest.php diff --git a/src/Domain/HiLoCounter.php b/src/Domain/HiLoCounter.php new file mode 100644 index 0000000..05f2f27 --- /dev/null +++ b/src/Domain/HiLoCounter.php @@ -0,0 +1,18 @@ +count++; + } + + public function runningCount(): int + { + return $this->count; + } +} \ No newline at end of file diff --git a/tests/Domain/BasicStrategyTest.php b/tests/Domain/BasicStrategyTest.php index c2802da..18543c0 100644 --- a/tests/Domain/BasicStrategyTest.php +++ b/tests/Domain/BasicStrategyTest.php @@ -516,4 +516,17 @@ public function testPairOf10sShouldNotSplit(): void $this->assertSame(Decision::Stand, $strategy->decide($hand, $dealerCard)); } + + public function testPairOf9sAgainstDealerTenShouldStand(): void + { + $strategy = new BasicStrategy(); + + $hand = new Hand(); + $hand->addCard(new Card('9', 'Hearts')); + $hand->addCard(new Card('9', 'Spades')); + + $dealerCard = new Card('10', 'Diamonds'); + + $this->assertSame(Decision::Stand, $strategy->decide($hand, $dealerCard)); + } } \ No newline at end of file diff --git a/tests/Domain/HiLoCounterTest.php b/tests/Domain/HiLoCounterTest.php new file mode 100644 index 0000000..5bbb7d3 --- /dev/null +++ b/tests/Domain/HiLoCounterTest.php @@ -0,0 +1,18 @@ +count(new Card('5', 'Hearts')); + + $this->assertSame(1, $counter->runningCount()); + } +} \ No newline at end of file From 5db400b717b0d4357ecb796026631bb21f3a511c Mon Sep 17 00:00:00 2001 From: florentdevk Date: Tue, 23 Jun 2026 20:50:30 +0200 Subject: [PATCH 2/5] feat: HiLoCounter implements Hi-Lo counting logic --- src/Domain/HiLoCounter.php | 8 +++++++- tests/Domain/HiLoCounterTest.php | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Domain/HiLoCounter.php b/src/Domain/HiLoCounter.php index 05f2f27..849bcba 100644 --- a/src/Domain/HiLoCounter.php +++ b/src/Domain/HiLoCounter.php @@ -8,7 +8,13 @@ final class HiLoCounter public function count(Card $card): void { - $this->count++; + $value = $card->numericValue(); + + if ($value >= 2 && $value <= 6) { + $this->count++; + } elseif ($value >= 10) { + $this->count--; + } } public function runningCount(): int diff --git a/tests/Domain/HiLoCounterTest.php b/tests/Domain/HiLoCounterTest.php index 5bbb7d3..92e77da 100644 --- a/tests/Domain/HiLoCounterTest.php +++ b/tests/Domain/HiLoCounterTest.php @@ -15,4 +15,12 @@ public function testLowCardIncrementsCount(): void $this->assertSame(1, $counter->runningCount()); } + + public function testNeutralCardDoesNotChangeCount(): void + { + $counter = new HiLoCounter(); + $counter->count(new Card('7', 'Hearts')); + + $this->assertSame(0, $counter->runningCount()); + } } \ No newline at end of file From 6ec9a382850fa437ea05828e980fc0b549622b54 Mon Sep 17 00:00:00 2001 From: florentdevk Date: Tue, 23 Jun 2026 20:51:03 +0200 Subject: [PATCH 3/5] test: high card decrements Hi-Lo count --- tests/Domain/HiLoCounterTest.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/Domain/HiLoCounterTest.php b/tests/Domain/HiLoCounterTest.php index 92e77da..bf52354 100644 --- a/tests/Domain/HiLoCounterTest.php +++ b/tests/Domain/HiLoCounterTest.php @@ -23,4 +23,12 @@ public function testNeutralCardDoesNotChangeCount(): void $this->assertSame(0, $counter->runningCount()); } + + public function testHighCardDecrementsCount(): void + { + $counter = new HiLoCounter(); + $counter->count(new Card('King', 'Hearts')); + + $this->assertSame(-1, $counter->runningCount()); + } } \ No newline at end of file From 2040b4fa0a43a108b5b61f0141b9f486e8595609 Mon Sep 17 00:00:00 2001 From: florentdevk Date: Tue, 23 Jun 2026 20:51:53 +0200 Subject: [PATCH 4/5] test: multiple cards accumulate Hi-Lo count --- tests/Domain/HiLoCounterTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/Domain/HiLoCounterTest.php b/tests/Domain/HiLoCounterTest.php index bf52354..b3bafa0 100644 --- a/tests/Domain/HiLoCounterTest.php +++ b/tests/Domain/HiLoCounterTest.php @@ -31,4 +31,15 @@ public function testHighCardDecrementsCount(): void $this->assertSame(-1, $counter->runningCount()); } + + public function testMultipleCardsAccumulateCount(): void + { + $counter = new HiLoCounter(); + $counter->count(new Card('2', 'Hearts')); + $counter->count(new Card('King', 'Spades')); + $counter->count(new Card('5', 'Diamonds')); + $counter->count(new Card('7', 'Clubs')); + + $this->assertSame(1, $counter->runningCount()); + } } \ No newline at end of file From fe03332bf32946736d1d0588f8b2305c22f35e08 Mon Sep 17 00:00:00 2001 From: florentdevk Date: Tue, 23 Jun 2026 20:55:20 +0200 Subject: [PATCH 5/5] feat: HiLoCounter can be reset --- src/Domain/HiLoCounter.php | 5 +++++ tests/Domain/HiLoCounterTest.php | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/Domain/HiLoCounter.php b/src/Domain/HiLoCounter.php index 849bcba..65965e9 100644 --- a/src/Domain/HiLoCounter.php +++ b/src/Domain/HiLoCounter.php @@ -21,4 +21,9 @@ public function runningCount(): int { return $this->count; } + + public function reset(): void + { + $this->count = 0; + } } \ No newline at end of file diff --git a/tests/Domain/HiLoCounterTest.php b/tests/Domain/HiLoCounterTest.php index b3bafa0..809f9d5 100644 --- a/tests/Domain/HiLoCounterTest.php +++ b/tests/Domain/HiLoCounterTest.php @@ -42,4 +42,14 @@ public function testMultipleCardsAccumulateCount(): void $this->assertSame(1, $counter->runningCount()); } + + public function testResetCounterReturnsToZero(): void + { + $counter = new HiLoCounter(); + $counter->count(new Card('2', 'Hearts')); + $counter->count(new Card('3', 'Spades')); + $counter->reset(); + + $this->assertSame(0, $counter->runningCount()); + } } \ No newline at end of file