<?php
// IPAddressRangeTest.php
// Created: 2021-04-27
// Updated: 2024-07-31

declare(strict_types=1);

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\UsesClass;
use Index\Net\IPAddress;
use Index\Net\IPAddressRange;

#[CoversClass(IPAddressRange::class)]
#[UsesClass(IPAddress::class)]
final class IPAddressRangeTest extends TestCase {
    public function testParsing(): void {
        $v4 = IPAddressRange::parse('127.0.0.1/23');
        $v6 = IPAddressRange::parse('::1/128');

        $this->expectException(InvalidArgumentException::class);
        $v0 = IPAddressRange::parse('12.4:424::1/128');
    }

    public function testToString(): void {
        $v4 = IPAddressRange::parse('53.64.123.86/18');
        $this->assertEquals('53.64.123.86/18', (string)$v4);

        $v6 = IPAddressRange::parse('abcd:1234::43:211a/86');
        $this->assertEquals('abcd:1234::43:211a/86', (string)$v6);
    }

    public function testMatch(): void {
        $v41 = IPAddress::parse('53.64.123.86');
        $v42 = IPAddress::parse('53.64.130.86');
        $v61 = IPAddress::parse('abcd:1234::43:211a');
        $v62 = IPAddress::parse('bbce:1535::73:212a');

        $r4 = IPAddressRange::parse('53.64.123.0/22');
        $r6 = IPAddressRange::parse('abcd:1234::43:211a/86');

        $this->assertTrue($r4->match($v41));
        $this->assertFalse($r4->match($v42));

        $this->assertTrue($r6->match($v61));
        $this->assertFalse($r6->match($v62));
    }

    public function testSerializable(): void {
        $cidrs = [
            '53.64.123.0/22',
            'abcd:1234::43:211a/86',
        ];

        foreach($cidrs as $cidr) {
            $obj = IPAddressRange::parse($cidr);
            $ser = serialize($obj);
            $unser = unserialize($ser);
            $this->assertTrue($obj->equals($unser));
        }
    }
}