diff options
| author | Li Zhineng <[email protected]> | 2025-04-28 17:53:19 +0800 |
|---|---|---|
| committer | Li Zhineng <[email protected]> | 2025-04-28 17:53:19 +0800 |
| commit | cb8ad9567a940db0434b9ca8991422ac9d2ce795 (patch) | |
| tree | 55c571e331228ec3713530fee420e5bc5c50b155 | |
| parent | e1acfb0b977a38a8c465f3c6d5cc1aed49b79656 (diff) | |
| download | region-china-cb8ad9567a940db0434b9ca8991422ac9d2ce795.tar.gz region-china-cb8ad9567a940db0434b9ca8991422ac9d2ce795.zip | |
region manager
| -rw-r--r-- | src/RegionException.php | 10 | ||||
| -rw-r--r-- | src/RegionManager.php | 58 | ||||
| -rw-r--r-- | tests/RegionManagerTest.php | 52 |
3 files changed, 120 insertions, 0 deletions
diff --git a/src/RegionException.php b/src/RegionException.php new file mode 100644 index 0000000..f33adec --- /dev/null +++ b/src/RegionException.php @@ -0,0 +1,10 @@ +<?php + +declare(strict_types=1); + +namespace Zhineng\Region; + +final class RegionException extends \Exception +{ + // +} diff --git a/src/RegionManager.php b/src/RegionManager.php new file mode 100644 index 0000000..9b8b969 --- /dev/null +++ b/src/RegionManager.php @@ -0,0 +1,58 @@ +<?php + +declare(strict_types=1); + +namespace Zhineng\Region; + +final class RegionManager +{ + /** + * @param array<string, string> $codeToName + * @param array<string, int[]> $relationships + * @param array<int, int[]> $topLevels + */ + public function __construct( + private array $codeToName, + private array $relationships, + private array $topLevels + ) { + // + } + + public static function createFromBuiltIn(): static + { + return new self( + require __DIR__.'/../resources/code-to-name.php', + require __DIR__.'/../resources/relationships.php', + require __DIR__.'/../resources/top-levels.php' + ); + } + + public function getName(int $code): string + { + return $this->codeToName[$this->groupKey($code)] + ?? throw new RegionException('The region code does not exist.'); + } + + /** + * @return int[] + */ + public function getTopLevelNodes(): array + { + return $this->topLevels; + } + + /** + * @return int[] + */ + public function getNodes(int $code): array + { + return $this->relationships[$this->groupKey($code)] + ?? throw new RegionException('Could not find any nodes under the region code.'); + } + + private function groupKey(int $code): string + { + return '_'.$code; + } +} diff --git a/tests/RegionManagerTest.php b/tests/RegionManagerTest.php new file mode 100644 index 0000000..2536a7c --- /dev/null +++ b/tests/RegionManagerTest.php @@ -0,0 +1,52 @@ +<?php + +declare(strict_types=1); + +namespace Zhineng\Region\Tests; + +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\TestCase; +use Zhineng\Region\RegionException; +use Zhineng\Region\RegionManager; + +#[CoversClass(RegionManager::class)] +final class RegionManagerTest extends TestCase +{ + public function test_name_resolution(): void + { + $manager = new RegionManager( + ['_110000' => '北京市'], + [], + [] + ); + $this->assertSame('北京市', $manager->getName(110000)); + } + + public function test_name_resolution_with_non_existent_code(): void + { + $this->expectException(RegionException::class); + $this->expectExceptionMessage('The region code does not exist.'); + $manager = new RegionManager([], [], []); + $manager->getName(110000); + } + + public function test_top_level_nodes_resolution(): void + { + $manager = new RegionManager([], [], [1, 2, 3]); + $this->assertSame([1, 2, 3], $manager->getTopLevelNodes()); + } + + public function test_nodes_resolution(): void + { + $manager = new RegionManager([], ['_1' => [2]], []); + $this->assertSame([2], $manager->getNodes(1)); + } + + public function test_nodes_resolution_with_non_existent_code(): void + { + $this->expectException(RegionException::class); + $this->expectExceptionMessage('Could not find any nodes under the region code.'); + $manager = new RegionManager([], [], []); + $manager->getNodes(1); + } +} |
