Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
[php][energy_power-01_base] Add base
  • Loading branch information
fabriziofs committed Jun 21, 2022
commit 40b1959787b375d1343c124b2fb63c6e42c1d7a5
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Application;

use CodelyTv\Domain\ContractNotFound;
use CodelyTv\Domain\ContractRepository;
use CodelyTv\Domain\InvalidPower;

final class ChangeContractedPower
{
private ContractRepository $repository;

public function __construct(ContractRepository $repository)
{
$this->repository = $repository;
}

public function run(string $contractId, int $newPower): void
{
$contract = $this->repository->search($contractId);
if (!$contract) {
throw new ContractNotFound($contractId);
}

$validNormalizedPowers = [
1150,
1725,
2300,
3450,
4600,
5750,
6900,
8050,
9200
];

if (!in_array($newPower, $validNormalizedPowers)) {
throw new InvalidPower($newPower);
}

$contract->changePower($newPower);

$this->repository->save($contract);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Application;

use CodelyTv\Domain\ContractNotFound;
use CodelyTv\Domain\ContractRepository;
use CodelyTv\Domain\PowerOptimizer;

final class OptimizeContractedPower
{
private ContractRepository $repository;
private PowerOptimizer $optimizer;

public function __construct(ContractRepository $repository, PowerOptimizer $optimizer)
{
$this->repository = $repository;
$this->optimizer = $optimizer;
}

public function run(string $contractId): void
{
$contract = $this->repository->search($contractId);
if (!$contract) {
throw new ContractNotFound($contractId);
}

$optimizedPower = $this->optimizer->optimize();

if ($optimizedPower <= 1150) {
$power = 1150;
} elseif ($optimizedPower <= 1725) {
$power = 1725;
} elseif ($optimizedPower <= 2300) {
$power = 2300;
} elseif ($optimizedPower <= 3450) {
$power = 3450;
} elseif ($optimizedPower <= 4600) {
$power = 4600;
} elseif ($optimizedPower <= 5750) {
$power = 5750;
} elseif ($optimizedPower <= 6900) {
$power = 6900;
} elseif ($optimizedPower <= 8050) {
$power = 8050;
} else {
$power = 9200;
}

$contract->changePower($power);

$this->repository->save($contract);
}
}
38 changes: 38 additions & 0 deletions examples/php/php-energy_power-01_base/src/Application/SignUp.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Application;

use CodelyTv\Domain\Contract;
use CodelyTv\Domain\ContractRepository;
use CodelyTv\Domain\InvalidPower;

final class SignUp
{
private ContractRepository $repository;

public function __construct(ContractRepository $repository)
{
$this->repository = $repository;
}

public function run(string $contractId, int $power): void
{
if ($power !== 1150 &&
$power !== 1725 &&
$power !== 2300 &&
$power !== 3450 &&
$power !== 4600 &&
$power !== 5750 &&
$power !== 6900 &&
$power !== 8050 &&
$power !== 9200) {
throw new InvalidPower($power);
}

$contract = new Contract($contractId, $power);

$this->repository->save($contract);
}
}
32 changes: 32 additions & 0 deletions examples/php/php-energy_power-01_base/src/Domain/Contract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Domain;

final class Contract
{
private string $id;
private int $contractedPower;

public function __construct(string $id, int $contractedPower)
{
$this->id = $id;
$this->contractedPower = $contractedPower;
}

public function changePower(int $selectedPower): void
{
$this->contractedPower = $selectedPower;
}

public function power(): int
{
return $this->contractedPower;
}

public function id(): string
{
return $this->id;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Domain;

use Exception;

class ContractNotFound extends Exception
{
public function __construct(string $contractId)
{
parent::__construct("Contract of id $contractId not found");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Domain;

interface ContractRepository
{
public function save(Contract $contract): void;
public function search(string $contractId): ?Contract;
}
15 changes: 15 additions & 0 deletions examples/php/php-energy_power-01_base/src/Domain/InvalidPower.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Domain;

use Exception;

class InvalidPower extends Exception
{
public function __construct(int $power)
{
parent::__construct("Invalid power value $power");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace CodelyTv\Domain;

interface PowerOptimizer
{
public function optimize(): int;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?php

namespace CodelyTv\Tests\Application;

use CodelyTv\Application\ChangeContractedPower;
use CodelyTv\Domain\Contract;
use CodelyTv\Domain\ContractNotFound;
use CodelyTv\Domain\InvalidPower;
use CodelyTv\Tests\Domain\ContractRepositoryMock;
use PHPUnit\Framework\TestCase;

class ChangeContractedPowerTest extends TestCase
{
private ContractRepositoryMock $repository;
private ChangeContractedPower $changeContractedPower;

protected function setUp(): void
{
parent::setUp();

$this->repository = new ContractRepositoryMock();
$this->changeContractedPower = new ChangeContractedPower($this->repository);
}

/**
* @test
* @dataProvider powerChangeDataProvider
*/
public function shouldChangeContractedPower(int $initialPower, int $newPower): void
{
$contractId = '1';
$contract = new Contract($contractId, $initialPower);
$this->repository->returnOnSearch($contract);

$this->changeContractedPower->run($contractId, $newPower);

$this->assertEquals($newPower, $contract->power());
}

/**
* @test
*/
public function shouldThrowInvalidPowerErrorForNotNormalizedPowerValues(): void
{
$this->expectException(InvalidPower::class);

$contractId = '1';
$notNormalizedPower = 1234;
$contract = new Contract($contractId, $notNormalizedPower);
$this->repository->returnOnSearch($contract);

$this->changeContractedPower->run($contractId, $notNormalizedPower);
}

/** @test */
public function shouldThrowContractNotFoundError(): void
{
$this->expectException(ContractNotFound::class);

$contractId = '1';
$notNormalizedPower = 1234;

$this->changeContractedPower->run($contractId, $notNormalizedPower);
}

public function powerChangeDataProvider(): array
{
return [
[1150, 1725],
[1725, 2300],
[2300, 3450],
[3450, 4600],
[4600, 5750],
[5750, 6900],
[6900, 8050],
[8050, 9200],
[9200, 1150],
[1150, 1150],
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace CodelyTv\Tests\Application;

use CodelyTv\Application\OptimizeContractedPower;
use CodelyTv\Domain\Contract;
use CodelyTv\Domain\ContractNotFound;
use CodelyTv\Tests\Domain\ContractRepositoryMock;
use CodelyTv\Tests\Domain\PowerOptmizerMock;
use PHPUnit\Framework\TestCase;

class OptimizeContractedPowerTest extends TestCase
{
private ContractRepositoryMock $repository;
private PowerOptmizerMock $powerOptimizer;
private OptimizeContractedPower $optimizeContractedPower;

protected function setUp(): void
{
parent::setUp();

$this->repository = new ContractRepositoryMock();
$this->powerOptimizer = new PowerOptmizerMock();
$this->optimizeContractedPower = new OptimizeContractedPower($this->repository, $this->powerOptimizer);
}

/**
* @test
* @dataProvider powerOptimizedDataProvider
*/
public function shouldChangeContractedPowerFromContract(int $optimizedPower, int $initialPower, int $newPower): void
{
$contractId = '1';
$contract = new Contract($contractId, $initialPower);

$this->repository->returnOnSearch($contract);
$this->powerOptimizer->returnOnOptimize($optimizedPower);

$this->optimizeContractedPower->run($contractId);
$this->repository->assertContractSaved($contract);

$this->assertEquals($contract->power(), $newPower);
}

/** @test */
public function shouldThrowContractNotFoundError(): void
{
$this->expectException(ContractNotFound::class);

$this->optimizeContractedPower->run('1');
}

public function powerOptimizedDataProvider(): array
{
return [
[1150, 1150, 1150],
[1151, 1150, 1725],
[1725, 1150, 1725],
[1726, 1150, 2300],
[2300, 1725, 2300],
[2301, 1725, 3450],
[3450, 2300, 3450],
[3451, 2300, 4600],
[4600, 3450, 4600],
[4601, 3450, 5750],
[5750, 4600, 5750],
[5751, 4600, 6900],
[6900, 5750, 6900],
[6901, 5750, 8050],
[8050, 6900, 8050],
[8051, 6900, 9200],
];
}
}
Loading