智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

120 lines
4.2 KiB

<?php
declare(strict_types=1);
namespace Location\CardinalDirection;
use Generator;
use Location\Coordinate;
use Location\Distance\Vincenty;
use PHPUnit\Framework\TestCase;
class CardinalDirectionDistancesCalculatorTest extends TestCase
{
/** @dataProvider getCardinalDirectionDistancesProvider */
public function testGetCardinalDirectionDistances(
Coordinate $point1,
Coordinate $point2,
CardinalDirectionDistances $expected
): void {
$cardinalDirectionDistancesCalculator = new CardinalDirectionDistancesCalculator();
$this->assertEquals(
$expected,
$cardinalDirectionDistancesCalculator->getCardinalDirectionDistances($point1, $point2, new Vincenty())
);
}
public function getCardinalDirectionDistancesProvider(): Generator
{
$point2 = new Coordinate(51, 13);
$directDistanceWestEast = 70197.14;
yield 'point1 equals point2' => [
'point1' => $point2,
'point2' => $point2,
'expected' => CardinalDirectionDistances::create(),
];
yield 'point1 north from point2' => [
'point1' => $this->moveToNorth($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setSouth(111257.827),
];
yield 'point1 east from point2' => [
'point1' => $this->moveToEast($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setWest($directDistanceWestEast),
];
yield 'point1 south from point2' => [
'point1' => $this->moveToSouth($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setNorth(111238.681),
];
yield 'point1 west from point2' => [
'point1' => $this->moveToWest($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setEast($directDistanceWestEast),
];
yield 'point1 north west from point2' => [
'point1' => $this->moveToNorthWest($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setEast(68677.475)->setSouth(111257.827),
];
yield 'point1 north east from point2' => [
'point1' => $this->moveToNorthEast($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setSouth(111257.827)->setWest(68677.475),
];
yield 'point1 south east from point2' => [
'point1' => $this->moveToSouthEast($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setNorth(111238.681)->setWest(71695.22),
];
yield 'point1 south west from point2' => [
'point1' => $this->moveToSouthWest($point2),
'point2' => $point2,
'expected' => CardinalDirectionDistances::create()->setNorth(111238.681)->setEast(71695.22),
];
}
private function moveToNorth(Coordinate $coordinate): Coordinate
{
return new Coordinate($coordinate->getLat() + 1, $coordinate->getLng());
}
private function moveToEast(Coordinate $coordinate): Coordinate
{
return new Coordinate($coordinate->getLat(), $coordinate->getLng() + 1);
}
private function moveToSouth(Coordinate $coordinate): Coordinate
{
return new Coordinate($coordinate->getLat() - 1, $coordinate->getLng());
}
private function moveToWest(Coordinate $coordinate): Coordinate
{
return new Coordinate($coordinate->getLat(), $coordinate->getLng() - 1);
}
private function moveToNorthEast(Coordinate $coordinate): Coordinate
{
return self::moveToNorth(self::moveToEast($coordinate));
}
private function moveToSouthEast(Coordinate $coordinate): Coordinate
{
return self::moveToSouth(self::moveToEast($coordinate));
}
private function moveToSouthWest(Coordinate $coordinate): Coordinate
{
return self::moveToSouth(self::moveToWest($coordinate));
}
private function moveToNorthWest(Coordinate $coordinate): Coordinate
{
return self::moveToNorth(self::moveToWest($coordinate));
}
}