diff --git a/src/EdifactParser.php b/src/EdifactParser.php index 0372d28..e5cc7fb 100644 --- a/src/EdifactParser.php +++ b/src/EdifactParser.php @@ -9,7 +9,6 @@ use EdifactParser\Segments\SegmentFactory; use EdifactParser\Segments\SegmentFactoryInterface; -/** @psalmphp-immutable */ final class EdifactParser { private SegmentFactoryInterface $segmentFactory; diff --git a/src/Exception/InvalidFile.php b/src/Exception/InvalidFile.php index 09886ee..5323077 100644 --- a/src/Exception/InvalidFile.php +++ b/src/Exception/InvalidFile.php @@ -7,7 +7,6 @@ use Exception; use function json_encode; -/** @psalmphp-immutable */ final class InvalidFile extends Exception { public static function withErrors(array $errors): self diff --git a/src/SegmentedValues.php b/src/SegmentedValues.php index a833541..1d31836 100644 --- a/src/SegmentedValues.php +++ b/src/SegmentedValues.php @@ -8,7 +8,6 @@ use EdifactParser\Segments\SegmentFactoryInterface; use EdifactParser\Segments\SegmentInterface; -/** @psalmphp-immutable */ final class SegmentedValues { /** @psalm-var list */ diff --git a/src/Segments/BGMBeginningOfMessage.php b/src/Segments/BGMBeginningOfMessage.php index 7baabd9..522eba9 100644 --- a/src/Segments/BGMBeginningOfMessage.php +++ b/src/Segments/BGMBeginningOfMessage.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class BGMBeginningOfMessage implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/CNTControl.php b/src/Segments/CNTControl.php index a2867b7..44c5faa 100644 --- a/src/Segments/CNTControl.php +++ b/src/Segments/CNTControl.php @@ -6,7 +6,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class CNTControl implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/DTMDateTimePeriod.php b/src/Segments/DTMDateTimePeriod.php index e4cbed5..2051dd7 100644 --- a/src/Segments/DTMDateTimePeriod.php +++ b/src/Segments/DTMDateTimePeriod.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class DTMDateTimePeriod implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/MEADimensions.php b/src/Segments/MEADimensions.php index b2c5956..bff08d2 100644 --- a/src/Segments/MEADimensions.php +++ b/src/Segments/MEADimensions.php @@ -6,7 +6,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class MEADimensions implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/NADNameAddress.php b/src/Segments/NADNameAddress.php index 6abe874..42df127 100644 --- a/src/Segments/NADNameAddress.php +++ b/src/Segments/NADNameAddress.php @@ -6,7 +6,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class NADNameAddress implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/PCIPackageId.php b/src/Segments/PCIPackageId.php index 6afd91b..f26171c 100644 --- a/src/Segments/PCIPackageId.php +++ b/src/Segments/PCIPackageId.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class PCIPackageId implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/SegmentFactory.php b/src/Segments/SegmentFactory.php index 456ee8c..287e77e 100644 --- a/src/Segments/SegmentFactory.php +++ b/src/Segments/SegmentFactory.php @@ -4,14 +4,11 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class SegmentFactory implements SegmentFactoryInterface { public function segmentFromArray(array $rawArray): SegmentInterface { - $name = $rawArray[0]; - - switch ($name) { + switch ($rawArray[0]) { case 'UNH': return new UNHMessageHeader($rawArray); case 'DTM': diff --git a/src/Segments/UNHMessageHeader.php b/src/Segments/UNHMessageHeader.php index f4694a9..a50fb3d 100644 --- a/src/Segments/UNHMessageHeader.php +++ b/src/Segments/UNHMessageHeader.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class UNHMessageHeader implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/UNTMessageFooter.php b/src/Segments/UNTMessageFooter.php index 45378ca..ba88234 100644 --- a/src/Segments/UNTMessageFooter.php +++ b/src/Segments/UNTMessageFooter.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class UNTMessageFooter implements SegmentInterface { private array $rawValues; diff --git a/src/Segments/UnknownSegment.php b/src/Segments/UnknownSegment.php index a242c32..c86de61 100644 --- a/src/Segments/UnknownSegment.php +++ b/src/Segments/UnknownSegment.php @@ -4,7 +4,6 @@ namespace EdifactParser\Segments; -/** @psalmphp-immutable */ final class UnknownSegment implements SegmentInterface { private array $rawValues; diff --git a/src/TransactionMessage.php b/src/TransactionMessage.php index d9e300f..7b947bf 100644 --- a/src/TransactionMessage.php +++ b/src/TransactionMessage.php @@ -6,7 +6,6 @@ use EdifactParser\Segments\SegmentInterface; -/** @psalmphp-immutable */ final class TransactionMessage { /** @@ -17,11 +16,15 @@ final class TransactionMessage */ private array $segments = []; - public function __construct(array $segments = []) + public static function withSegments(SegmentInterface...$segments): self { + $self = new self(); + foreach ($segments as $segment) { - $this->addSegment($segment); + $self->addSegment($segment); } + + return $self; } public function addSegment(SegmentInterface $segment): void diff --git a/src/TransactionResult.php b/src/TransactionResult.php index 684fafb..6b12d86 100644 --- a/src/TransactionResult.php +++ b/src/TransactionResult.php @@ -8,8 +8,6 @@ /** * A transactionResult is a list of transactionMessages. - * - * @psalmphp-immutable */ final class TransactionResult { @@ -33,7 +31,6 @@ private function __construct(SegmentedValues $values) if ($message) { $messages[] = $message; } - $message = new TransactionMessage(); } diff --git a/tests/Unit/SegmentedValuesTest.php b/tests/Unit/SegmentedValuesTest.php index 4a13a4b..4bcc037 100644 --- a/tests/Unit/SegmentedValuesTest.php +++ b/tests/Unit/SegmentedValuesTest.php @@ -6,22 +6,33 @@ use EDI\Parser; use EdifactParser\SegmentedValues; -use EdifactParser\Segments\SegmentFactory; +use EdifactParser\Segments\CNTControl; use EdifactParser\Segments\UNHMessageHeader; use PHPUnit\Framework\TestCase; final class SegmentedValuesTest extends TestCase { /** @test */ - public function getListOfSegments(): void + public function listWithOneSegment(): void { - $fileContent = "UNH+1+IFTMIN:S:93A:UN:PN001'\nUNH+2+IFTMIN:S:93A:UN:PN001'"; - $parser = new Parser($fileContent); - $values = (new SegmentedValues(new SegmentFactory()))->fromRaw($parser->get()); + $fileContent = "UNH+1+IFTMIN:S:93A:UN:PN001'"; + $values = SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()); self::assertEquals([ new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), - new UNHMessageHeader(['UNH', '2', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), + ], $values->list()); + } + + /** @test */ + public function listWithMultipleSegments(): void + { + $fileContent = "UNH+1+IFTMIN:S:1A:UN:P1'\nUNH+2+IFTMIN:R:2A:UN:P2'\nCNT+7:0.1:KGM'"; + $values = SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()); + + self::assertEquals([ + new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '1A', 'UN', 'P1']]), + new UNHMessageHeader(['UNH', '2', ['IFTMIN', 'R', '2A', 'UN', 'P2']]), + new CNTControl(['CNT', ['7', '0.1', 'KGM']]), ], $values->list()); } } diff --git a/tests/Unit/TransactionMessageTest.php b/tests/Unit/TransactionMessageTest.php index 495566c..cf4b0e7 100644 --- a/tests/Unit/TransactionMessageTest.php +++ b/tests/Unit/TransactionMessageTest.php @@ -16,10 +16,10 @@ final class TransactionMessageTest extends TestCase /** @test */ public function twoSegmentsWithDifferentNames(): void { - $message = new TransactionMessage([ + $message = TransactionMessage::withSegments( new CNTControl(['CNT', ['7', '0.1', 'KGM']]), new MEADimensions(['MEA', 'WT', 'G', ['KGM', '0.1']]), - ]); + ); self::assertEquals([ CNTControl::class => [ @@ -34,12 +34,12 @@ public function twoSegmentsWithDifferentNames(): void /** @test */ public function twoSegmentsWithTheSameName(): void { - $message = new TransactionMessage([ + $message = TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), new UNTMessageFooter(['UNT', '19', '1']), new MEADimensions(['MEA', 'WT', 'G', ['KGM', '0.1']]), new MEADimensions(['MEA', 'VOL', '', ['MTQ', '0.06822']]), - ]); + ); self::assertEquals([ UNHMessageHeader::class => [ @@ -58,13 +58,13 @@ public function twoSegmentsWithTheSameName(): void /** @test */ public function moreThanTwoSegmentsWithTheSameName(): void { - $message = new TransactionMessage([ + $message = TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), new UNTMessageFooter(['UNT', '19', '1']), new CNTControl(['CNT', ['7', '0.1', 'KGM']]), new CNTControl(['CNT', ['11', '1', 'PCE']]), new CNTControl(['CNT', ['15', '0.068224', 'MTQ']]), - ]); + ); self::assertEquals([ UNHMessageHeader::class => [ diff --git a/tests/Unit/TransactionResultTest.php b/tests/Unit/TransactionResultTest.php index 02ee868..9dbfcc4 100644 --- a/tests/Unit/TransactionResultTest.php +++ b/tests/Unit/TransactionResultTest.php @@ -21,16 +21,12 @@ public function oneMessage(): void { $fileContent = "UNH+1+IFTMIN:S:93A:UN:PN001'\nUNT+19+1'"; - $result = TransactionResult::fromSegmentedValues( - SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()) - ); - self::assertEquals([ - new TransactionMessage([ + TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), new UNTMessageFooter(['UNT', '19', '1']), - ]), - ], $result->messages()); + ), + ], $this->resultFactory($fileContent)->messages()); } /** @test */ @@ -44,21 +40,17 @@ public function twoMessages(): void UNT+19+2' UNZ+2+3' EDI; - $result = TransactionResult::fromSegmentedValues( - SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()) - ); - self::assertEquals([ - new TransactionMessage([ + TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), new UNTMessageFooter(['UNT', '19', '1']), - ]), - new TransactionMessage([ + ), + TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '2', ['IFTMIN', 'S', '94A', 'UN', 'PN002']]), new UNTMessageFooter(['UNT', '19', '2']), new UnknownSegment(['UNZ', '2', '3']), - ]), - ], $result->messages()); + ), + ], $this->resultFactory($fileContent)->messages()); } /** @test */ @@ -73,19 +65,22 @@ public function oneMessageWithMultipleSegmentsWithTheSameName(): void UNT+19+1' UNZ+2+3' EDI; - $result = TransactionResult::fromSegmentedValues( - SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()) - ); - self::assertEquals([ - new TransactionMessage([ + TransactionMessage::withSegments( new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]), new UNTMessageFooter(['UNT', '19', '1']), new CNTControl(['CNT', ['7', '0.1', 'KGM']]), new CNTControl(['CNT', ['11', '1', 'PCE']]), new CNTControl(['CNT', ['15', '0.068224', 'MTQ']]), new UnknownSegment(['UNZ', '2', '3']), - ]), - ], $result->messages()); + ), + ], $this->resultFactory($fileContent)->messages()); + } + + private function resultFactory(string $fileContent): TransactionResult + { + return TransactionResult::fromSegmentedValues( + SegmentedValues::factory()->fromRaw((new Parser($fileContent))->get()) + ); } }