Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync: Two Bucket #808

Merged
merged 3 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion exercises/practice/two-bucket/.docs/instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ There are some rules that your solution must follow:
b) the second bucket is full
2. Emptying a bucket and doing nothing to the other.
3. Filling a bucket and doing nothing to the other.
- After an action, you may not arrive at a state where the starting bucket is empty and the other bucket is full.
- After an action, you may not arrive at a state where the initial starting bucket is empty and the other bucket is full.

Your program will take as input:

Expand Down
22 changes: 0 additions & 22 deletions exercises/practice/two-bucket/.meta/example.php
Original file line number Diff line number Diff line change
@@ -1,27 +1,5 @@
<?php

/*
* By adding type hints and enabling strict type checking, code can become
* easier to read, self-documenting and reduce the number of potential bugs.
* By default, type declarations are non-strict, which means they will attempt
* to change the original type to match the type specified by the
* type-declaration.
*
* In other words, if you pass a string to a function requiring a float,
* it will attempt to convert the string value to a float.
*
* To enable strict mode, a single declare directive must be placed at the top
* of the file.
* This means that the strictness of typing is configured on a per-file basis.
* This directive not only affects the type declarations of parameters, but also
* a function's return type.
*
* For more info review the Concept on strict type checking in the PHP track
* <link>.
*
* To disable strict typing, comment out the directive below.
*/

declare(strict_types=1);

class TwoBucket
Expand Down
76 changes: 28 additions & 48 deletions exercises/practice/two-bucket/TwoBucketTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,14 @@ public static function setUpBeforeClass(): void
require_once 'TwoBucket.php';
}

protected function setUp(): void
{
$this->twoBucket = new TwoBucket();
}

/**
* uuid: a6f2b4ba-065f-4dca-b6f0-e3eee51cb661
* @testdox Measure using bucket one of size 3 and bucket two of size 5 - start with bucket one
*/
public function testMeasureUsingBucketOneOfSize3AndBucketTwoOfSize5StartWithBucketOne(): void
{
$buckOne = 3;
$buckTwo = 5;
$goal = 1;
$starterBuck = 'one';
$solution = $this->twoBucket->solve($buckOne, $buckTwo, $goal, $starterBuck);
$subject = new TwoBucket();
$solution = $subject->solve(3, 5, 1, 'one');

$this->assertEquals(4, $solution->numberOfActions);
$this->assertEquals('one', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -34,14 +27,12 @@ public function testMeasureUsingBucketOneOfSize3AndBucketTwoOfSize5StartWithBuck

/**
* uuid: 6c4ea451-9678-4926-b9b3-68364e066d40
* @testdox Measure using bucket one of size 3 and bucket two of size 5 - start with bucket two
*/
public function testMeasureUsingBucketOneOfSize3AndBucketTwoOfSize5StartWithBucketTwo(): void
{
$buckOne = 3;
$buckTwo = 5;
$goal = 1;
$starterBuck = 'two';
$solution = $this->twoBucket->solve($buckOne, $buckTwo, $goal, $starterBuck);
$subject = new TwoBucket();
$solution = $subject->solve(3, 5, 1, 'two');

$this->assertEquals(8, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -50,14 +41,12 @@ public function testMeasureUsingBucketOneOfSize3AndBucketTwoOfSize5StartWithBuck

/**
* uuid: 3389f45e-6a56-46d5-9607-75aa930502ff
* @testdox Measure using bucket one of size 7 and bucket two of size 11 - start with bucket one
*/
public function testMeasureUsingBucketOneOfSize7AndBucketTwoOfSize11StartWithBucketOne(): void
{
$buckOne = 7;
$buckTwo = 11;
$goal = 2;
$starterBuck = 'one';
$solution = $this->twoBucket->solve($buckOne, $buckTwo, $goal, $starterBuck);
$subject = new TwoBucket();
$solution = $subject->solve(7, 11, 2, 'one');

$this->assertEquals(14, $solution->numberOfActions);
$this->assertEquals('one', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -66,14 +55,12 @@ public function testMeasureUsingBucketOneOfSize7AndBucketTwoOfSize11StartWithBuc

/**
* uuid: fe0ff9a0-3ea5-4bf7-b17d-6d4243961aa1
* @testdox Measure using bucket one of size 7 and bucket two of size 11 - start with bucket two
*/
public function testMeasureUsingBucketOneOfSize7AndBucketTwoOfSize11StartWithBucketTwo(): void
{
$buckOne = 7;
$buckTwo = 11;
$goal = 2;
$starterBuck = 'two';
$solution = $this->twoBucket->solve($buckOne, $buckTwo, $goal, $starterBuck);
$subject = new TwoBucket();
$solution = $subject->solve(7, 11, 2, 'two');

$this->assertEquals(18, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -82,10 +69,12 @@ public function testMeasureUsingBucketOneOfSize7AndBucketTwoOfSize11StartWithBuc

/**
* uuid: 0ee1f57e-da84-44f7-ac91-38b878691602
* @testdox Measure one step using bucket one of size 1 and bucket two of size 3 - start with bucket two
*/
public function testMeasureOneStepUsingBucketOneOfSize1AndBucketTwoOfSize3StartWithBucketTwo(): void
{
$solution = $this->twoBucket->solve(1, 3, 3, 'two');
$subject = new TwoBucket();
$solution = $subject->solve(1, 3, 3, 'two');

$this->assertEquals(1, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -94,10 +83,12 @@ public function testMeasureOneStepUsingBucketOneOfSize1AndBucketTwoOfSize3StartW

/**
* uuid: eb329c63-5540-4735-b30b-97f7f4df0f84
* @testdox Measure using bucket one of size 2 and bucket two of size 3 - start with bucket one and end with bucket two
*/
public function testMeasureUsingBucketOneOfSize2AndBucketTwoOfSize3StartWithBucketOneAndEndWithBucketTwo(): void
{
$solution = $this->twoBucket->solve(2, 3, 3, 'one');
$subject = new TwoBucket();
$solution = $subject->solve(2, 3, 3, 'one');

$this->assertEquals(2, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -106,38 +97,24 @@ public function testMeasureUsingBucketOneOfSize2AndBucketTwoOfSize3StartWithBuck

/**
* uuid: 449be72d-b10a-4f4b-a959-ca741e333b72
* @testdox Not possible to reach the goal
*/
public function testReachabilityNotPossibleToReachGoalStartWithBucketOne(): void
{
$buckOne = 6;
$buckTwo = 15;
$this->expectException(Exception::class);

$this->twoBucket->solve($buckOne, $buckTwo, 5, 'one');
}

/**
* uuid: aac38b7a-77f4-4d62-9b91-8846d533b054
*/
public function testReachabilityNotPossibleToReachGoalStartWithBucketOneAndEndWithBucketTwo(): void
{
$solution = $this->twoBucket->solve(6, 15, 9, 'one');

$this->assertEquals(10, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
$this->assertEquals(0, $solution->litersLeftInOtherBucket);
$subject = new TwoBucket();
$subject->solve(6, 15, 5, 'one');
}

/**
* uuid: aac38b7a-77f4-4d62-9b91-8846d533b054
* @testdox With the same buckets but a different goal, then it is possible
*/
public function testWithSameBucketsButDifferentGoalItIsPossible(): void
{
$buckOne = 6;
$buckTwo = 15;
$goal = 9;
$starterBuck = 'one';
$solution = $this->twoBucket->solve($buckOne, $buckTwo, $goal, $starterBuck);
$subject = new TwoBucket();
$solution = $subject->solve(6, 15, 9, 'one');

$this->assertEquals(10, $solution->numberOfActions);
$this->assertEquals('two', $solution->nameOfBucketWithDesiredLiters);
Expand All @@ -146,10 +123,13 @@ public function testWithSameBucketsButDifferentGoalItIsPossible(): void

/**
* uuid: 74633132-0ccf-49de-8450-af4ab2e3b299
* @testdox Goal larger than both buckets is impossible
*/
public function testGoalLargerThanBothBucketsIsImpossible(): void
{
$this->expectException(Exception::class);
$this->twoBucket->solve(5, 7, 8, 'one');

$subject = new TwoBucket();
$subject->solve(5, 7, 8, 'one');
}
}