From cdc45d29c5c5be0b791e320e3699f7c9287f26f2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 8 Nov 2026 04:33:09 +0000 Subject: [PATCH 1/2] Initial plan From d8b5d4ce564fb82098e8c319b22030cd2676ffe4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 8 Nov 2026 04:34:41 +0000 Subject: [PATCH 2/2] Fix scalar split and average edge cases Co-authored-by: asika32764 <1639206+asika32764@users.noreply.github.com> --- packages/scalars/src/ArrayObject.php | 6 +++--- packages/scalars/src/StringObject.php | 5 ++++- packages/scalars/test/ArrayObjectTest.php | 9 ++++++++- packages/scalars/test/StringObjectTest.php | 9 +++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/scalars/src/ArrayObject.php b/packages/scalars/src/ArrayObject.php index 573f482d7..cd33db42f 100644 --- a/packages/scalars/src/ArrayObject.php +++ b/packages/scalars/src/ArrayObject.php @@ -318,13 +318,13 @@ public function sum(): float|int */ public function avg(): float|int|null { - $sum = $this->sum(); + $count = $this->count(); - if ($sum === 0 || $sum === 0.0) { + if ($count === 0) { return null; } - return $sum / $this->count(); + return $this->sum() / $count; } /** diff --git a/packages/scalars/src/StringObject.php b/packages/scalars/src/StringObject.php index f57e5bbfb..78e20c7b1 100644 --- a/packages/scalars/src/StringObject.php +++ b/packages/scalars/src/StringObject.php @@ -149,6 +149,10 @@ public static function wrap(mixed $string = '', ?string $encoding = self::ENCODI */ public function __call(string $name, array $args): mixed { + if ($name === 'split') { + return $this->explode(...$args); + } + $class = Str::class; if (is_callable([$class, $name])) { @@ -158,7 +162,6 @@ public function __call(string $name, array $args): mixed $maps = [ 'toUpperCase' => [Utf8String::class, 'strtoupper'], 'toLowerCase' => [Utf8String::class, 'strtolower'], - 'split' => [$this, 'explode'], ]; if ($maps[$name] ?? null) { diff --git a/packages/scalars/test/ArrayObjectTest.php b/packages/scalars/test/ArrayObjectTest.php index 0bdfb55b2..40709c3df 100644 --- a/packages/scalars/test/ArrayObjectTest.php +++ b/packages/scalars/test/ArrayObjectTest.php @@ -691,11 +691,18 @@ public function searchWithClosureReturnsFalseWhenNothingMatches(): void } #[Test] - public function avgReturnsNullWhenSumIsZero(): void + public function avgReturnsNullWhenArrayIsEmpty(): void { self::assertNull(arr([])->avg()); } + #[Test] + public function avgReturnsZeroWhenSumIsZero(): void + { + self::assertSame(0, arr([1, -1])->avg()); + self::assertSame(0, arr([0, 0])->avg()); + } + #[Test] public function wrapReturnsSameInstanceWhenAlreadyWrapped(): void { diff --git a/packages/scalars/test/StringObjectTest.php b/packages/scalars/test/StringObjectTest.php index e2d7ae6a3..c9840e006 100644 --- a/packages/scalars/test/StringObjectTest.php +++ b/packages/scalars/test/StringObjectTest.php @@ -525,6 +525,15 @@ public static function explodeProvider(): array ]; } + #[Test] + public function splitSplitsStringByDelimiter(): void + { + self::assertEquals( + ['Foo', 'Bar', 'Yoo'], + (new StringObject('Foo/Bar/Yoo'))->split('/')->dump() + ); + } + #[Test] public function applyReturnsNewInstanceFromCallbackResult() {