From cf38f92588bf002152ad52e12e6922ce55cd60c6 Mon Sep 17 00:00:00 2001 From: Geoff Appleby Date: Wed, 25 Sep 2024 01:06:37 -0700 Subject: [PATCH 1/2] Add check for nested inner lists when serializing --- src/Serializer.php | 6 ++++ tests/SerializeListTest.php | 59 +++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/Serializer.php b/src/Serializer.php index a3438b0..c7b5d1c 100644 --- a/src/Serializer.php +++ b/src/Serializer.php @@ -124,8 +124,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]); } diff --git a/tests/SerializeListTest.php b/tests/SerializeListTest.php index d1efc74..1d8e4b1 100644 --- a/tests/SerializeListTest.php +++ b/tests/SerializeListTest.php @@ -2,6 +2,7 @@ namespace gapple\Tests\StructuredFields; +use gapple\StructuredFields\InnerList; use gapple\StructuredFields\Item; use gapple\StructuredFields\OuterList; use gapple\StructuredFields\Parameters; @@ -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); + } } From 7e94f430b5950e914f9c715bf292aa382e8d4eab Mon Sep 17 00:00:00 2001 From: Geoff Appleby Date: Wed, 25 Sep 2024 01:17:18 -0700 Subject: [PATCH 2/2] Update branches to test --- .github/workflows/php.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d9730ae..7b0be08 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -4,7 +4,9 @@ on: push: branches: - develop - - v* + - "[0-9]+.[0-9]+.x" + tags: + - v[0-9]+.[0-9]+.[0-9]+ pull_request: workflow_dispatch: jobs: