mirror of https://github.com/nextcloud/calendar
141 lines
3.9 KiB
PHP
141 lines
3.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* @copyright 2021 Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
*
|
|
* @author 2021 Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
*
|
|
* @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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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);
|
|
}
|
|
}
|