From 35601a9f31eb7c606aa051f04b9304eb0f8f07c2 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 6 Nov 2021 21:25:38 -0300 Subject: [PATCH 1/7] add readme instruct for to execute unit tests --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5e4f01e..adeded3 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,14 @@ Casos você queira se aprofundar no tema, não deixe de conheceu o site Growth ## Organização do Projeto: - `src/` + - `Behavioral/` + - `Creational/` + - `Structural/` +- `tests/` - `Behavioral/` - `Creational/` - `Structural/` + A estrutura da pastas de `tests/` segue a mesma estrutura @@ -36,7 +41,9 @@ Este projetos tem um arquivo `Makefile` para a execução dos testes `make test` +5. Para executar os testes de uma classe especídica: + `make test NomeDaClass` ## Sobre nós Este projeto foi desenvoldido por Walmir Silva autor do blog [https://growthdev.com.br](https://growthdev.com.br/) From 3807682bd9c89d66e4847ba41077175e40060d52 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Thu, 11 Nov 2021 23:34:29 -0300 Subject: [PATCH 2/7] create example Strategy with Method Factory --- .../AcousticGuitarStrategy.php | 26 +++++++++++++ .../ElectricGuitarStrategy.php | 25 ++++++++++++ .../MusicalInstrumentFactory.php | 19 +++++++++ .../MusicalInstrumentStrategy.php | 12 ++++++ .../MusicalInstrumentFactory.php | 6 ++- .../MusicalInstrumentFactoryTest.php | 39 +++++++++++++++++++ .../MusicalInstrumentFactoryTest.php | 2 +- 7 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 src/Behavioral/Strategy/WithMethodFactory/AcousticGuitarStrategy.php create mode 100644 src/Behavioral/Strategy/WithMethodFactory/ElectricGuitarStrategy.php create mode 100644 src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactory.php create mode 100644 src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategy.php create mode 100644 tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php diff --git a/src/Behavioral/Strategy/WithMethodFactory/AcousticGuitarStrategy.php b/src/Behavioral/Strategy/WithMethodFactory/AcousticGuitarStrategy.php new file mode 100644 index 0000000..07005bd --- /dev/null +++ b/src/Behavioral/Strategy/WithMethodFactory/AcousticGuitarStrategy.php @@ -0,0 +1,26 @@ +brand = $brand; + } + + public function build(): MusicalInstrument + { + return (new AcousticGuitarFactory()) + ->createMusicalInstrument($this->brand); + } +} diff --git a/src/Behavioral/Strategy/WithMethodFactory/ElectricGuitarStrategy.php b/src/Behavioral/Strategy/WithMethodFactory/ElectricGuitarStrategy.php new file mode 100644 index 0000000..c0f2c63 --- /dev/null +++ b/src/Behavioral/Strategy/WithMethodFactory/ElectricGuitarStrategy.php @@ -0,0 +1,25 @@ +brand = $brand; + } + + public function build(): MusicalInstrument + { + return (new ElectricGuitarFactory()) + ->createMusicalInstrument($this->brand); + } +} diff --git a/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactory.php b/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactory.php new file mode 100644 index 0000000..b5920fc --- /dev/null +++ b/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactory.php @@ -0,0 +1,19 @@ +build(); + } +} + + + diff --git a/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategy.php b/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategy.php new file mode 100644 index 0000000..72955af --- /dev/null +++ b/src/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategy.php @@ -0,0 +1,12 @@ +createMusicalInstrument($brand); + return (new AcousticGuitarFactory()) + ->createMusicalInstrument($brand); case self::ELECTRIC_GUITAR: - return (new ElectricGuitarFactory())->createMusicalInstrument($brand); + return (new ElectricGuitarFactory()) + ->createMusicalInstrument($brand); default: throw new \InvalidArgumentException('Invalid musical instrument type'); } diff --git a/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php b/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php new file mode 100644 index 0000000..195a7be --- /dev/null +++ b/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php @@ -0,0 +1,39 @@ +createMusicalInstrument( + new AcousticGuitarStrategy('Giannini Model') + ); + + $acousticGuitar->make(); + + $this->assertInstanceOf(AcousticGuitar::class, $acousticGuitar); + } + + public function testCanCreateEletricGuitar(): void + { + $factory = new MusicalInstrumentFactory(); + $eletricGuitar = $factory->createMusicalInstrument( + new ElectricGuitarStrategy('Tagima Model') + ); + + $eletricGuitar->make(); + + $this->assertInstanceOf(ElectricGuitar::class, $eletricGuitar); + } +} diff --git a/tests/Creational/FactoryMethod/MusicalInstrumentFactoryTest.php b/tests/Creational/FactoryMethod/MusicalInstrumentFactoryTest.php index 52a3bcb..29f3682 100644 --- a/tests/Creational/FactoryMethod/MusicalInstrumentFactoryTest.php +++ b/tests/Creational/FactoryMethod/MusicalInstrumentFactoryTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DesignPatterns\Creational\FactoryMethod; +namespace Growthdev\DesignPatterns\Tests\Creational\FactoryMethod; use Growthdev\DesignPatterns\Creational\FactoryMethod\MusicalInstrumentFactory; use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\AcousticGuitar; From 3d4f9597f9c3641865533cc233c7015ca0765b90 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 13 Nov 2021 10:33:32 -0300 Subject: [PATCH 3/7] rename test class for strategy with method factory pattern --- ...t.php => MusicalInstrumentStrategyWithMethodFactoryTest.php} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/Behavioral/Strategy/WithMethodFactory/{MusicalInstrumentFactoryTest.php => MusicalInstrumentStrategyWithMethodFactoryTest.php} (94%) diff --git a/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php b/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategyWithMethodFactoryTest.php similarity index 94% rename from tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php rename to tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategyWithMethodFactoryTest.php index 195a7be..d6647dd 100644 --- a/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentFactoryTest.php +++ b/tests/Behavioral/Strategy/WithMethodFactory/MusicalInstrumentStrategyWithMethodFactoryTest.php @@ -11,7 +11,7 @@ use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\ElectricGuitar; use PHPUnit\Framework\TestCase; -final class MusicalInstrumentFactoryTest extends TestCase +final class MusicalInstrumentStrategyWithMethodFactoryTest extends TestCase { public function testCanCreateAcousticGuitar(): void { From e66ea172faae934ed5c96133dc5183ee16bf72cf Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 13 Nov 2021 11:21:18 -0300 Subject: [PATCH 4/7] create strategy pattern with payment processor exammple --- .../Strategy/Payment/ByCashPaymentMethod.php | 17 ++++++++ .../Payment/CreditCardPaymentMethod.php | 17 ++++++++ .../Payment/DebitCardPaymentMethod.php | 17 ++++++++ .../Payment/PaymentMethodStrategy.php | 10 +++++ .../Strategy/Payment/PaymentProcessor.php | 20 ++++++++++ .../PaymentProcessorWithoutStrategy.php | 39 +++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php create mode 100644 src/Behavioral/Strategy/Payment/CreditCardPaymentMethod.php create mode 100644 src/Behavioral/Strategy/Payment/DebitCardPaymentMethod.php create mode 100644 src/Behavioral/Strategy/Payment/PaymentMethodStrategy.php create mode 100644 src/Behavioral/Strategy/Payment/PaymentProcessor.php create mode 100644 src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php diff --git a/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php b/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php new file mode 100644 index 0000000..8c3a07f --- /dev/null +++ b/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php @@ -0,0 +1,17 @@ +paymentMethod = $paymentMethod; + } + + public function processPayment(float $amount): void + { + $this->paymentMethod->pay($amount); + } +} diff --git a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php new file mode 100644 index 0000000..b583ba8 --- /dev/null +++ b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php @@ -0,0 +1,39 @@ +paymentMethod = $paymentMethod; + } + + public function processPayment(float $amount): void + { + switch ($this->paymentMethod) { + case self::PAYMENT_TYPE_CREDIT_CARD: + $creditCard = new CreditCardPaymentMethod(); + $creditCard->pay($amount); + break; + case self::PAYMENT_TYPE_DEBIT_CARD: + $debitCard = new DebitCardPaymentMethod(); + $debitCard->pay($amount); + break; + case self::PAYMENT_TYPE_BY_CASH: + $byCash = new ByCashPaymentMethod(); + $byCash->pay($amount); + break; + default: + throw new \InvalidArgumentException('Invalid payment method'); + } + } +} From 06099b4fe20b3809e8f61814e652ec273ea22522 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 13 Nov 2021 11:37:16 -0300 Subject: [PATCH 5/7] create Payment Processor test --- .../Strategy/Payment/ByCashPaymentMethod.php | 17 --------- .../Strategy/Payment/CashPaymentMethod.php | 15 ++++++++ .../Payment/CreditCardPaymentMethod.php | 8 ++-- .../Payment/DebitCardPaymentMethod.php | 8 ++-- .../Payment/PaymentMethodStrategy.php | 2 +- .../Strategy/Payment/PaymentProcessor.php | 8 +++- .../PaymentProcessorWithoutStrategy.php | 12 ++++-- .../Strategy/Payment/PaymentProcessorTest.php | 38 +++++++++++++++++++ 8 files changed, 76 insertions(+), 32 deletions(-) delete mode 100644 src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php create mode 100644 src/Behavioral/Strategy/Payment/CashPaymentMethod.php create mode 100644 tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php diff --git a/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php b/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php deleted file mode 100644 index 8c3a07f..0000000 --- a/src/Behavioral/Strategy/Payment/ByCashPaymentMethod.php +++ /dev/null @@ -1,17 +0,0 @@ -paymentMethod->pay($amount); + $this->amount = $this->paymentMethod->pay($amount); + } + + public function getAmount(): float + { + return $this->amount; } } diff --git a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php index b583ba8..a16752b 100644 --- a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php +++ b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php @@ -11,6 +11,7 @@ final class PaymentProcessorWithoutStrategy const PAYMENT_TYPE_BY_CASH = 'by_cash'; private string $paymentMethod; + private float $amount; public function __construct(string $paymentMethod) { @@ -22,18 +23,23 @@ public function processPayment(float $amount): void switch ($this->paymentMethod) { case self::PAYMENT_TYPE_CREDIT_CARD: $creditCard = new CreditCardPaymentMethod(); - $creditCard->pay($amount); + $this->amount = $creditCard->pay($amount); break; case self::PAYMENT_TYPE_DEBIT_CARD: $debitCard = new DebitCardPaymentMethod(); - $debitCard->pay($amount); + $this->amount = $debitCard->pay($amount); break; case self::PAYMENT_TYPE_BY_CASH: $byCash = new ByCashPaymentMethod(); - $byCash->pay($amount); + $this->amount = $byCash->pay($amount); break; default: throw new \InvalidArgumentException('Invalid payment method'); } } + + public function getAmount(): float + { + return $this->amount; + } } diff --git a/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php b/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php new file mode 100644 index 0000000..66a6391 --- /dev/null +++ b/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php @@ -0,0 +1,38 @@ +processPayment(100.00); + + $this->assertEquals(90.00, $paymentProcessor->getAmount()); + } + + public function testCanProcessPaymentWithCreditCardPaymentMethod(): void + { + $paymentProcessor = new PaymentProcessor(new CreditCardPaymentMethod()); + $paymentProcessor->processPayment(100.00); + + $this->assertEquals(95.00, $paymentProcessor->getAmount()); + } + + public function testCanProcessPaymentWithDebitCardPaymentMethod(): void + { + $paymentProcessor = new PaymentProcessor(new DebitCardPaymentMethod()); + $paymentProcessor->processPayment(100.00); + + $this->assertEquals(100.00, $paymentProcessor->getAmount()); + } +} \ No newline at end of file From 83aa43576db9f5b0d58d28e8161bf27ae0e57992 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 13 Nov 2021 11:40:17 -0300 Subject: [PATCH 6/7] adjusty constant name --- .../Strategy/Payment/PaymentProcessorWithoutStrategy.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php index a16752b..31ee091 100644 --- a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php +++ b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php @@ -8,7 +8,7 @@ final class PaymentProcessorWithoutStrategy { const PAYMENT_TYPE_CREDIT_CARD = 'credit_card'; const PAYMENT_TYPE_DEBIT_CARD = 'debit_card'; - const PAYMENT_TYPE_BY_CASH = 'by_cash'; + const PAYMENT_TYPE_CASH = 'by_cash'; private string $paymentMethod; private float $amount; @@ -29,9 +29,9 @@ public function processPayment(float $amount): void $debitCard = new DebitCardPaymentMethod(); $this->amount = $debitCard->pay($amount); break; - case self::PAYMENT_TYPE_BY_CASH: - $byCash = new ByCashPaymentMethod(); - $this->amount = $byCash->pay($amount); + case self::PAYMENT_TYPE_CASH: + $cash = new CashPaymentMethod(); + $this->amount = $cash->pay($amount); break; default: throw new \InvalidArgumentException('Invalid payment method'); From 4a78694cae1092d44dad51b87f948a1149192943 Mon Sep 17 00:00:00 2001 From: Walmir Silva Date: Sat, 13 Nov 2021 11:50:47 -0300 Subject: [PATCH 7/7] create Payment Processor withou strategy pattern test --- .../Payment/CreditCardPaymentMethod.php | 2 +- .../Payment/DebitCardPaymentMethod.php | 2 +- .../PaymentProcessorWithoutStrategy.php | 6 +-- .../Strategy/Payment/PaymentProcessorTest.php | 9 ++-- .../PaymentProcessorWithoutStrategyTest | 44 +++++++++++++++++++ 5 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 tests/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategyTest diff --git a/src/Behavioral/Strategy/Payment/CreditCardPaymentMethod.php b/src/Behavioral/Strategy/Payment/CreditCardPaymentMethod.php index f1b4b1c..ce7a16a 100644 --- a/src/Behavioral/Strategy/Payment/CreditCardPaymentMethod.php +++ b/src/Behavioral/Strategy/Payment/CreditCardPaymentMethod.php @@ -6,7 +6,7 @@ class CreditCardPaymentMethod implements PaymentMethodStrategy { - private const DISCOUNT_PERCENT = 0.05; // 5% + private const DISCOUNT_PERCENT = 0.00; // 0% public function pay(float $amount): float { diff --git a/src/Behavioral/Strategy/Payment/DebitCardPaymentMethod.php b/src/Behavioral/Strategy/Payment/DebitCardPaymentMethod.php index 472b533..884b2c0 100644 --- a/src/Behavioral/Strategy/Payment/DebitCardPaymentMethod.php +++ b/src/Behavioral/Strategy/Payment/DebitCardPaymentMethod.php @@ -6,7 +6,7 @@ class DebitCardPaymentMethod implements PaymentMethodStrategy { - private const DISCOUNT_PERCENT = 0.00; // 0% + private const DISCOUNT_PERCENT = 0.05; // 5% public function pay(float $amount): float { diff --git a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php index 31ee091..1c2b54c 100644 --- a/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php +++ b/src/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategy.php @@ -6,9 +6,9 @@ final class PaymentProcessorWithoutStrategy { - const PAYMENT_TYPE_CREDIT_CARD = 'credit_card'; - const PAYMENT_TYPE_DEBIT_CARD = 'debit_card'; - const PAYMENT_TYPE_CASH = 'by_cash'; + public const PAYMENT_TYPE_CREDIT_CARD = 'credit_card'; + public const PAYMENT_TYPE_DEBIT_CARD = 'debit_card'; + public const PAYMENT_TYPE_CASH = 'by_cash'; private string $paymentMethod; private float $amount; diff --git a/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php b/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php index 66a6391..8f58ca7 100644 --- a/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php +++ b/tests/Behavioral/Strategy/Payment/PaymentProcessorTest.php @@ -20,19 +20,20 @@ public function testCanProcessPaymentWithCashPaymentMethod(): void $this->assertEquals(90.00, $paymentProcessor->getAmount()); } - public function testCanProcessPaymentWithCreditCardPaymentMethod(): void + public function testCanProcessPaymentWithDebitCardPaymentMethod(): void { - $paymentProcessor = new PaymentProcessor(new CreditCardPaymentMethod()); + $paymentProcessor = new PaymentProcessor(new DebitCardPaymentMethod()); $paymentProcessor->processPayment(100.00); $this->assertEquals(95.00, $paymentProcessor->getAmount()); } - public function testCanProcessPaymentWithDebitCardPaymentMethod(): void + public function testCanProcessPaymentWithCreditCardPaymentMethod(): void { - $paymentProcessor = new PaymentProcessor(new DebitCardPaymentMethod()); + $paymentProcessor = new PaymentProcessor(new CreditCardPaymentMethod()); $paymentProcessor->processPayment(100.00); $this->assertEquals(100.00, $paymentProcessor->getAmount()); } + } \ No newline at end of file diff --git a/tests/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategyTest b/tests/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategyTest new file mode 100644 index 0000000..1986246 --- /dev/null +++ b/tests/Behavioral/Strategy/Payment/PaymentProcessorWithoutStrategyTest @@ -0,0 +1,44 @@ +processPayment(100.00); + + $this->assertEquals(90.00, $paymentProcessor->getAmount()); + } + + public function testCanProcessPaymentWithDebitCardPaymentMethod(): void + { + $paymentProcessor = new PaymentProcessorWithoutStrategy( + PaymentProcessorWithoutStrategy::PAYMENT_TYPE_DEBIT_CARD + ); + $paymentProcessor->processPayment(100.00); + + $this->assertEquals(95.00, $paymentProcessor->getAmount()); + } + + public function testCanProcessPaymentWithCreditCardPaymentMethod(): void + { + $paymentProcessor = new PaymentProcessorWithoutStrategy( + PaymentProcessorWithoutStrategy::PAYMENT_TYPE_CREDIT_CARD + ); + $paymentProcessor->processPayment(100.00); + + $this->assertEquals(100.00, $paymentProcessor->getAmount()); + } +}