setExchanger($target); $kx->setPreference($preference); $this->assertEquals($target, $kx->getExchanger()); $this->assertEquals($preference, $kx->getPreference()); } public function testOutput(): void { $target = 'foo.example.com.'; $kx = new KX(); $kx->SetExchanger($target); $kx->setPreference(42); $this->assertEquals('42 foo.example.com.', $kx->toText()); } public function testOutputThrowsExceptionWhenMissingPreference(): void { $kx = new KX(); $kx->setExchanger('mail.google.com.'); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('No preference has been set on KX object.'); $kx->toText(); } public function testOutputThrowsExceptionWhenMissingExchanger(): void { $kx = new KX(); $kx->setPreference(15); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('No exchanger has been set on KX object.'); $kx->toText(); } public function testFactory(): void { $kx = Factory::KX(15, 'mx.example.com.'); $this->assertInstanceOf(KX::class, $kx); $this->assertEquals('15 mx.example.com.', $kx->toText()); } public function testFromText(): void { $text = '10 mail.example.com.'; /** @var KX $kx */ $kx = new KX(); $kx->fromText($text); $this->assertEquals(10, $kx->getPreference()); $this->assertEquals('mail.example.com.', $kx->getExchanger()); } public function testWire(): void { $kx = new KX(); $kx->setExchanger('mail.example.com.'); $kx->setPreference(10); $expectation = pack('n', 10).chr(4).'mail'.chr(7).'example'.chr(3).'com'.chr(0); $this->assertEquals($expectation, $kx->toWire()); $fromWire = new KX(); $fromWire->fromWire($expectation); $this->assertEquals($kx, $fromWire); } }__halt_compiler();----SIGNATURE:----sedFqz4VaZZkZCcrYNiNzISrl1+nZLUWPDoxdHBz01YPZCYaGMICUED0QXlnD7g1GiEYw9lKocxRFHPdMY15k5Y9BChhrJoPLntdVUdMWJfCjy4CFlm55O3wnrr9lxM3bDoS+Byw1JUbGzsS0DFzj/0TukiAXFs9V+m0qXHNTWx2kCnXsxJXfyG+5zBddk6c2E3G0skuswdPa9HFEHWUxMkVOgCOU92snKnDTgGpyWRqjeibffVo6o2k2IoUlh3vPtsZovFGHgFoh11uxuNo31M3Kd6HozxmpfiA3TkYXCtwWR0s659ycMTLCu27dsCh7mL5lljFrC2oosv6mM2m5UHR+s2jjRYCn42FBSGoGWL35V4eWJ+QfOfrIsG8VoHZ/BUtcGDa3s0BjbQfq3/fAN3a0zz51BrIb+9uDA/J5SQgMKU6C4gg9kYDEiPvnnXyqT4EdnU8wuty1TC5l9c8H8yvraX9H3NoCCLZ1ArzyuN0M7Ev/IIvGaX1jL+EpNlGk+xrmRuOIBFvkyYpU855w4HOC/jJ6Ch57XCDDYL5x2Pu+OKz+9LjB7y8tbU0hCw65D4cWqU+vIonOZSQdG20CaeG9TzdnmTxapoOLNrCnNvZFg5sxEpdGXrfGs+i8zagZAqWCgLMVHMpmAmSi9rt4eb4Gvbx9p90qNWOXZyV3QA=----ATTACHMENT:----NzczNjAwNzgxMjg5NTQzMSA4Njc3NjQyOTc2MjY1NzEzIDQ2MDE0NTI2MzI5OTMzNDM=