Skip to content

Commit 0447404

Browse files
committed
Merge branch '2.1.x' into develop
2 parents 4a40a27 + 7e94f43 commit 0447404

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

src/Serializer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,14 @@ private static function serializeInnerList(array $value, ?object $parameters = n
127127

128128
while ($item = array_shift($value)) {
129129
if ($item instanceof TupleInterface) {
130+
if ($item instanceof InnerList) {
131+
throw new SerializeException("Inner lists cannot be nested");
132+
}
130133
$returnValue .= self::serializeItem($item);
131134
} else {
135+
if (is_array($item[0])) {
136+
throw new SerializeException("Inner lists cannot be nested");
137+
}
132138
$returnValue .= self::serializeItem($item[0], $item[1]);
133139
}
134140

tests/SerializeListTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace gapple\Tests\StructuredFields;
44

5+
use gapple\StructuredFields\InnerList;
56
use gapple\StructuredFields\Item;
67
use gapple\StructuredFields\OuterList;
78
use gapple\StructuredFields\Parameters;
@@ -80,4 +81,62 @@ public function testArray(): void
8081
$serialized
8182
);
8283
}
84+
85+
public function testInnerList(): void
86+
{
87+
$list = [
88+
InnerList::fromArray(["test"]),
89+
new Item(42),
90+
];
91+
92+
$serialized = Serializer::serializeList($list);
93+
94+
$this->assertEquals(
95+
'("test"), 42',
96+
$serialized
97+
);
98+
}
99+
100+
public function testNestedInnerListTuple(): void
101+
{
102+
// InnerList object validates its values, so use array format tuples.
103+
$list = [
104+
[ // Outer Inner List Tuple
105+
[ // Outer Inner Items
106+
[ // Inner Inner List Tuple
107+
[ // Inner Inner List Items
108+
new Item("test"),
109+
new Item(23),
110+
],
111+
new \stdClass(), // Inner Inner List Parameters
112+
],
113+
new Item(42)
114+
],
115+
new \stdClass(), // Outer Inner Parameters
116+
],
117+
new Item(42), // List Parameters
118+
];
119+
120+
$this->expectException(SerializeException::class);
121+
$this->expectExceptionMessage("Inner lists cannot be nested");
122+
Serializer::serializeList($list);
123+
}
124+
125+
public function testNestedInnerListObject(): void
126+
{
127+
// InnerList object validates its values, so use array format tuple for first layer inner list.
128+
$list = [
129+
[ // Outer Inner List Tuple
130+
[ // Outer Inner Items
131+
new InnerList([new Item("test")], Parameters::fromArray(["p" => true])),
132+
],
133+
new \stdClass(), // Outer Inner Parameters
134+
],
135+
new Item(42), // List Parameters
136+
];
137+
138+
$this->expectException(SerializeException::class);
139+
$this->expectExceptionMessage("Inner lists cannot be nested");
140+
Serializer::serializeList($list);
141+
}
83142
}

0 commit comments

Comments
 (0)