From 6eca038b481f261f8ea3a78d6b13a3c1a7f86865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erko=20Sten=20H=C3=BCrges?= Date: Fri, 21 Mar 2025 15:15:29 +0200 Subject: [PATCH 1/3] json serialize range --- src/Ranges/Range.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Ranges/Range.php b/src/Ranges/Range.php index 30d61cc..eab642b 100644 --- a/src/Ranges/Range.php +++ b/src/Ranges/Range.php @@ -2,7 +2,9 @@ namespace Belamov\PostgresRange\Ranges; -abstract class Range +use JsonSerializable; + +abstract class Range implements JsonSerializable { protected string $fromBound; protected string $toBound; @@ -91,4 +93,9 @@ public function toBound(): string { return $this->toBound; } + + public function jsonSerialize(): mixed + { + return $this->__toString(); + } } From 13455954e5b106474d170bfaad69258c4d07f45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erko=20Sten=20H=C3=BCrges?= Date: Mon, 24 Mar 2025 09:21:01 +0200 Subject: [PATCH 2/3] added test --- tests/Unit/RangesJsonSerializationTest.php | 132 +++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/Unit/RangesJsonSerializationTest.php diff --git a/tests/Unit/RangesJsonSerializationTest.php b/tests/Unit/RangesJsonSerializationTest.php new file mode 100644 index 0000000..9fe68cc --- /dev/null +++ b/tests/Unit/RangesJsonSerializationTest.php @@ -0,0 +1,132 @@ +assertEquals('"[\"2010-01-01 14:30:30\",\"2010-01-01 15:30:30\"]"', json_encode($range)); + + $range = new TimestampRange('2010-01-01 14:30:30', '2010-01-01 15:30:30', '(', ']'); + $this->assertEquals('"(\"2010-01-01 14:30:30\",\"2010-01-01 15:30:30\"]"', json_encode($range)); + + $range = new TimestampRange('2010-01-01 14:30:30', '2010-01-01 15:30:30', '(', ')'); + $this->assertEquals('"(\"2010-01-01 14:30:30\",\"2010-01-01 15:30:30\")"', json_encode($range)); + + $range = new TimestampRange(null, '2010-01-01 15:30:30', '[', ']'); + $this->assertEquals('"[,\"2010-01-01 15:30:30\"]"', json_encode($range)); + + $range = new TimestampRange('2010-01-01 14:30:30', null, '[', ']'); + $this->assertEquals('"[\"2010-01-01 14:30:30\",]"', json_encode($range)); + + $range = new TimestampRange(null, null, '[', ']'); + $this->assertEquals('"[,]"', json_encode($range)); + } + + /** @test */ + public function time_range_json_serializes_correctly(): void + { + $range = new TimeRange('14:30', '15:30', '[', ']'); + $this->assertEquals('"[14:30,15:30]"', json_encode($range)); + + $range = new TimeRange('14:30', '15:30', '(', ']'); + $this->assertEquals('"(14:30,15:30]"', json_encode($range)); + + $range = new TimeRange('14:30', '15:30', '(', ')'); + $this->assertEquals('"(14:30,15:30)"', json_encode($range)); + + $range = new TimeRange(null, '15:30', '[', ']'); + $this->assertEquals('"[,15:30]"', json_encode($range)); + + $range = new TimeRange('14:30', null, '[', ']'); + $this->assertEquals('"[14:30,]"', json_encode($range)); + + $range = new TimeRange(null, null, '[', ']'); + $this->assertEquals('"[,]"', json_encode($range)); + } + + /** @test */ + public function numeric_range_json_serializes_correctly(): void + { + $range = new FloatRange(1.5, 2.5, '[', ']'); + $this->assertEquals('"[1.5,2.5]"', json_encode($range)); + + $range = new FloatRange(1.5, 2.5, '(', ']'); + $this->assertEquals('"(1.5,2.5]"', json_encode($range)); + + $range = new FloatRange(1.5, 2.5, '(', ')'); + $this->assertEquals('"(1.5,2.5)"', json_encode($range)); + + $range = new FloatRange(null, 2.5, '[', ']'); + $this->assertEquals('"[,2.5]"', json_encode($range)); + + $range = new FloatRange(1.5, null, '[', ']'); + $this->assertEquals('"[1.5,]"', json_encode($range)); + + $range = new FloatRange(null, null, '[', ']'); + $this->assertEquals('"[,]"', json_encode($range)); + } + + /** @test */ + public function integer_range_json_serializes_correctly(): void + { + $range = new IntegerRange(10, 20, '[', ']'); + $this->assertEquals('"[10,21)"', json_encode($range)); + + $range = new IntegerRange(10, 20, '(', ']'); + $this->assertEquals('"[11,21)"', json_encode($range)); + + $range = new IntegerRange(10, 20, '(', ')'); + $this->assertEquals('"[11,20)"', json_encode($range)); + + $range = new IntegerRange(null, 20, '[', ']'); + $this->assertEquals('"[,21)"', json_encode($range)); + + $range = new IntegerRange(null, 20, '(', ']'); + $this->assertEquals('"[,21)"', json_encode($range)); + + $range = new IntegerRange(10, null, '[', ']'); + $this->assertEquals('"[10,)"', json_encode($range)); + + $range = new IntegerRange(null, null, '[', ']'); + $this->assertEquals('"[,)"', json_encode($range)); + } + + /** @test */ + public function date_range_json_serializes_correctly(): void + { + $from = CarbonImmutable::parse('2010-01-10'); + $to = CarbonImmutable::parse('2010-01-15'); + $range = new DateRange($from->toDateString(), $to->toDateString(), '[', ']'); + $this->assertEquals("\"[{$from->toDateString()},{$to->addDay()->toDateString()})\"", json_encode($range)); + + $range = new DateRange($from->toDateString(), $to->toDateString(), '(', ']'); + $this->assertEquals("\"[{$from->addDay()->toDateString()},{$to->addDay()->toDateString()})\"", json_encode($range)); + + $range = new DateRange($from->toDateString(), $to->toDateString(), '(', ')'); + $this->assertEquals("\"[{$from->addDay()->toDateString()},{$to->toDateString()})\"", json_encode($range)); + + $range = new DateRange(null, $to->toDateString(), '[', ']'); + $this->assertEquals("\"[,{$to->addDay()->toDateString()})\"", json_encode($range)); + + $range = new DateRange(null, $to->toDateString(), '(', ']'); + $this->assertEquals("\"[,{$to->addDay()->toDateString()})\"", json_encode($range)); + + $range = new DateRange($from->toDateString(), null, '[', ']'); + $this->assertEquals("\"[{$from->toDateString()},)\"", json_encode($range)); + + $range = new DateRange(null, null, '[', ']'); + $this->assertEquals('"[,)"', json_encode($range)); + } +} From 222c8a2559e6eb86615d849256f34c8f8d273eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erko=20Sten=20H=C3=BCrges?= Date: Mon, 24 Mar 2025 09:27:38 +0200 Subject: [PATCH 3/3] fix test --- src/Ranges/Range.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ranges/Range.php b/src/Ranges/Range.php index eab642b..7b3c799 100644 --- a/src/Ranges/Range.php +++ b/src/Ranges/Range.php @@ -94,7 +94,7 @@ public function toBound(): string return $this->toBound; } - public function jsonSerialize(): mixed + public function jsonSerialize(): string { return $this->__toString(); }