Skip to content

Commit

Permalink
Merge branch '2.1.x' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
gapple committed Sep 25, 2024
2 parents 4a40a27 + 7e94f43 commit 0447404
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/Serializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,14 @@ private static function serializeInnerList(array $value, ?object $parameters = n

while ($item = array_shift($value)) {
if ($item instanceof TupleInterface) {
if ($item instanceof InnerList) {
throw new SerializeException("Inner lists cannot be nested");
}
$returnValue .= self::serializeItem($item);
} else {
if (is_array($item[0])) {
throw new SerializeException("Inner lists cannot be nested");
}
$returnValue .= self::serializeItem($item[0], $item[1]);
}

Expand Down
59 changes: 59 additions & 0 deletions tests/SerializeListTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace gapple\Tests\StructuredFields;

use gapple\StructuredFields\InnerList;
use gapple\StructuredFields\Item;
use gapple\StructuredFields\OuterList;
use gapple\StructuredFields\Parameters;
Expand Down Expand Up @@ -80,4 +81,62 @@ public function testArray(): void
$serialized
);
}

public function testInnerList(): void
{
$list = [
InnerList::fromArray(["test"]),
new Item(42),
];

$serialized = Serializer::serializeList($list);

$this->assertEquals(
'("test"), 42',
$serialized
);
}

public function testNestedInnerListTuple(): void
{
// InnerList object validates its values, so use array format tuples.
$list = [
[ // Outer Inner List Tuple
[ // Outer Inner Items
[ // Inner Inner List Tuple
[ // Inner Inner List Items
new Item("test"),
new Item(23),
],
new \stdClass(), // Inner Inner List Parameters
],
new Item(42)
],
new \stdClass(), // Outer Inner Parameters
],
new Item(42), // List Parameters
];

$this->expectException(SerializeException::class);
$this->expectExceptionMessage("Inner lists cannot be nested");
Serializer::serializeList($list);
}

public function testNestedInnerListObject(): void
{
// InnerList object validates its values, so use array format tuple for first layer inner list.
$list = [
[ // Outer Inner List Tuple
[ // Outer Inner Items
new InnerList([new Item("test")], Parameters::fromArray(["p" => true])),
],
new \stdClass(), // Outer Inner Parameters
],
new Item(42), // List Parameters
];

$this->expectException(SerializeException::class);
$this->expectExceptionMessage("Inner lists cannot be nested");
Serializer::serializeList($list);
}
}

0 comments on commit 0447404

Please sign in to comment.