<?php
// IpAddressRangeTest.php
// Created: 2021-04-27
// Updated: 2024-10-02

declare(strict_types=1);

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\{CoversClass,UsesClass};
use Index\Net\{IpAddress,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));
        }
    }
}