From 157ce1c9042d03a337d91b97a42bd70ae616dd75 Mon Sep 17 00:00:00 2001 From: smhg Date: Tue, 21 Oct 2014 09:10:26 +0200 Subject: [PATCH] trim returns a copy --- src/Timespan/Timespan.php | 22 ++++++++++++++++------ test/Timespan.php | 33 +++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/Timespan/Timespan.php b/src/Timespan/Timespan.php index 7abe4b7..51aa4a9 100644 --- a/src/Timespan/Timespan.php +++ b/src/Timespan/Timespan.php @@ -101,19 +101,29 @@ public function merge(Timespan $span) * Trim timespan to fit within boundaries * @param DateTime $start * @param DateTime $end - * @return Timespan + * @return Timespan A new, trimmed, timespan */ public function trim(DateTime $start, DateTime $end) { - if ($this->start < $start) { - $this->start = $start; + $trimmed = clone $this; + + if ($start > $trimmed->end || $end < $trimmed->start) { + return; + } + + if ($trimmed->start < $start) { + $trimmed->start = $start; + } + + if ($trimmed->end > $end) { + $trimmed->end = $end; } - if ($this->end > $end) { - $this->end = $end; + if ($trimmed->start == $trimmed->end) { + return; } - return $this; + return $trimmed; } /** diff --git a/test/Timespan.php b/test/Timespan.php index c0658b3..10ccf22 100644 --- a/test/Timespan.php +++ b/test/Timespan.php @@ -184,17 +184,34 @@ public function testMerge($span) */ public function testTrim($span) { - $tmp = clone $span; - $start = clone $tmp->start; + $start = clone $span->start; $start->modify('+1 day'); - $tmp->trim($start, $tmp->end); - $this->assertEquals($start, $tmp->start); + $trimmed = $span->trim($start, $span->end); + $this->assertTrue($trimmed !== $span, 'Trim should not mutate the original span, but return a new one.'); + $this->assertEquals($start, $trimmed->start); + $this->assertNotEquals($span->start, $trimmed->start); - $tmp = clone $span; - $end = clone $tmp->end; + $end = clone $span->end; $end->modify('-1 day'); - $tmp->trim($tmp->start, $end); - $this->assertEquals($end, $tmp->end); + $trimmed = $span->trim($span->start, $end); + $this->assertEquals($end, $trimmed->end); + $this->assertNotEquals($span->end, $trimmed->end); + + $start = clone $span->start; + $start->modify('+2 week'); + $end = clone $span->end; + $end->modify('+2 week'); + $this->assertTrue(!$span->trim($start, $end), 'Trim should not return anything if no time is left inside the span.'); + + $start = clone $span->start; + $start->modify('-2 week'); + $end = clone $span->end; + $end->modify('-2 week'); + $this->assertTrue(!$span->trim($start, $end), 'Trim should not return anything if no time is left inside the span.'); + + $start = clone $span->start; + $start->modify('+1 day'); + $this->assertTrue(!$span->trim($start, $start), 'Trim should not return anything if no time is left inside the span.'); } /**