* * @author 2021 Christoph Wurst * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace OCA\Calendar\Tests\Unit\Service\Appointments; use ChristophWurst\Nextcloud\Testing\TestCase; use OCA\Calendar\Db\AppointmentConfig; use OCA\Calendar\Service\Appointments\Interval; use OCA\Calendar\Service\Appointments\SlotExtrapolator; use OCP\Calendar\ICalendarQuery; class SlotExtrapolatorTest extends TestCase { /** @var SlotExtrapolator */ private $extrapolator; protected function setUp(): void { parent::setUp(); if (!interface_exists(ICalendarQuery::class)) { self::markTestIncomplete(); } $this->extrapolator = new SlotExtrapolator(); } public function testNoAvailability(): void { $config = new AppointmentConfig(); $config->setLength(60 * 60); $config->setIncrement(15 * 60); $availabilityIntervals = []; $slots = $this->extrapolator->extrapolate($config, $availabilityIntervals); self::assertEmpty($slots); } /** * A half our availability can't fit an hour long appointment */ public function testNoneFits(): void { $config = new AppointmentConfig(); $config->setLength(60 * 60); $config->setIncrement(15 * 60); $availabilityIntervals = [ new Interval(0, 30 * 60), ]; $slots = $this->extrapolator->extrapolate($config, $availabilityIntervals); self::assertEmpty($slots); } /** * An hour long availability fits exactly one hour long appointment */ public function testExactlyOne(): void { $config = new AppointmentConfig(); $config->setLength(60 * 60); $config->setIncrement(15 * 60); $availabilityIntervals = [ new Interval(0, 60 * 60), ]; $slots = $this->extrapolator->extrapolate($config, $availabilityIntervals); self::assertCount(1, $slots); } /** * An hour long availability fits exactly one hour long appointment from availability generator * but use an example that could be generated by the slot extrapolator * i. e. Start Time is 3601 and end time is 7201, which would be * parsed to 7200 and 7201 */ public function testExactlyOneButRoundedUpFromAvailability(): void { $config = new AppointmentConfig(); $config->setLength(3600); $config->setIncrement(3600); $slots = [new Interval(7200, 7201)]; $slots = $this->extrapolator->extrapolate($config, $slots); self::assertCount(0, $slots); } /** * 1.5h available allow three hour long appointments with 15m increments */ public function testOverlaps(): void { $config = new AppointmentConfig(); $config->setLength(60 * 60); $config->setIncrement(15 * 60); $availabilityIntervals = [ new Interval(0, 90 * 60), ]; $slots = $this->extrapolator->extrapolate($config, $availabilityIntervals); self::assertCount(3, $slots); } /** * More than one availability that fits an appointments means multiple slots */ public function testMultipleIntervals(): void { $config = new AppointmentConfig(); $config->setLength(60 * 60); $config->setIncrement(15 * 60); $availabilityIntervals = [ new Interval(0, 60 * 60), new Interval(100 * 60, 160 * 60), ]; $slots = $this->extrapolator->extrapolate($config, $availabilityIntervals); self::assertCount(2, $slots); } }