diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index 68b2261..90b41e4 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -92,6 +92,51 @@ $bank = new BankAccount('Bank of America', '1234567890'); $asString = (string)$bank; // "Bank of America, 1234567890" ``` +### Company + +##### Namespace + +`Meritoo\Common\ValueObject\Company` + +##### Info + +Represents a company. Contains properties: +1. `$name` - name of company +2. `$address` - address of company +3. `$bankAccount` - bank account of company + +##### New instance + +New instance can be created using constructor: + +```php +new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') +); +``` + +##### Methods + +Has getters for each property `getName()`, `getAddress()` and `getBankAccount()`. + +##### Conversion to string (the `__toString()` method) + +Instance of `Company` may be represented as string that contains all non-empty properties separated by `, `. + +Example: + +```php +$company = new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') +); + +$asString = (string)$company; // "Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345" +``` + ### Version ##### Namespace diff --git a/src/ValueObject/Company.php b/src/ValueObject/Company.php new file mode 100644 index 0000000..05facea --- /dev/null +++ b/src/ValueObject/Company.php @@ -0,0 +1,101 @@ + + * @copyright Meritoo + */ +class Company +{ + /** + * Name of company + * + * @var string + */ + protected $name; + + /** + * Address of company + * + * @var Address + */ + protected $address; + + /** + * Bank account of company + * + * @var BankAccount + */ + protected $bankAccount; + + /** + * Class constructor + * + * @param string $name Name of company + * @param Address $address Address of company + * @param BankAccount|null $bankAccount (optional) Bank account of company + */ + public function __construct($name, Address $address, BankAccount $bankAccount = null) + { + $this->name = $name; + $this->address = $address; + $this->bankAccount = $bankAccount; + } + + /** + * Returns representation of object as string + * + * @return string + */ + public function __toString() + { + $values = [ + $this->name, + $this->address, + $this->bankAccount, + ]; + + return Arrays::getNonEmptyValuesAsString($values); + } + + /** + * Returns name of company + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Returns address of company + * + * @return Address + */ + public function getAddress() + { + return $this->address; + } + + /** + * Returns bank account of company + * + * @return BankAccount|null + */ + public function getBankAccount() + { + return $this->bankAccount; + } +} diff --git a/tests/ValueObject/CompanyTest.php b/tests/ValueObject/CompanyTest.php new file mode 100644 index 0000000..d6da00b --- /dev/null +++ b/tests/ValueObject/CompanyTest.php @@ -0,0 +1,98 @@ + + * @copyright Meritoo + */ +class CompanyTest extends BaseTestCase +{ + /** + * @var Company + */ + private $company; + + /** + * @var Company + */ + private $companyWithoutBankAccount; + + public function testConstructor() + { + static::assertConstructorVisibilityAndArguments( + Company::class, + OopVisibilityType::IS_PUBLIC, + 3, + 2 + ); + } + + public function testGetName() + { + static::assertSame('Test 1', $this->company->getName()); + static::assertSame('Test 2', $this->companyWithoutBankAccount->getName()); + } + + public function testGetAddress() + { + static::assertEquals( + new Address('New York', '00123', '4th Avenue', '10', '200'), + $this->company->getAddress() + ); + + static::assertEquals( + new Address('San Francisco', '00456', 'Green Street', '22'), + $this->companyWithoutBankAccount->getAddress() + ); + } + + public function testGetBankAccount() + { + static::assertEquals( + new BankAccount('Bank 1', '12345'), + $this->company->getBankAccount() + ); + + static::assertNull($this->companyWithoutBankAccount->getBankAccount()); + } + + public function testToString() + { + static::assertSame('Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345', (string)$this->company); + static::assertSame('Test 2, Green Street 22, 00456, San Francisco', (string)$this->companyWithoutBankAccount); + } + + /** + * {@inheritdoc} + */ + protected function setUp() + { + parent::setUp(); + + $this->company = new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') + ); + + $this->companyWithoutBankAccount = new Company( + 'Test 2', + new Address('San Francisco', '00456', 'Green Street', '22') + ); + } +}