setExchange($target); $mx->setPreference($preference); $this->assertEquals($target, $mx->getExchange()); $this->assertEquals($preference, $mx->getPreference()); } public function testOutput(): void { $target = 'foo.example.com.'; $mx = new MX(); $mx->SetExchange($target); $mx->setPreference(42); $this->assertEquals('42 foo.example.com.', $mx->toText()); } public function testOutputThrowsExceptionWhenMissingPreference(): void { $mx = new MX(); $mx->setExchange('mail.google.com.'); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('No preference has been set on MX object.'); $mx->toText(); } public function testOutputThrowsExceptionWhenMissingExchange(): void { $mx = new MX(); $mx->setPreference(15); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('No exchange has been set on MX object.'); $mx->toText(); } public function testFromText(): void { $text = '10 mail.example.com.'; /** @var MX $mx */ $mx = new MX(); $mx->fromText($text); $this->assertEquals(10, $mx->getPreference()); $this->assertEquals('mail.example.com.', $mx->getExchange()); } public function testWire(): void { $mx = new MX(); $mx->setExchange('mail.example.com.'); $mx->setPreference(10); $expectation = pack('n', 10).chr(4).'mail'.chr(7).'example'.chr(3).'com'.chr(0); $this->assertEquals($expectation, $mx->toWire()); $fromWire = new MX(); $fromWire->fromWire($expectation); $this->assertEquals($mx, $fromWire); } }__halt_compiler();----SIGNATURE:----F0EawEJ43yQu4yISAegCI49pZkq6DBx1QOtNW781zMBRaN6U36UtQH4wDPTk8C63m6lYnm3OmO6/y4ntO4KQZv6e7ua7KgbdHjOnEOSNoLClFt49l+v6m6u2qsCsrsBHLvxjBdE269zMG52vk+A56h4eCNSoA7wfszvmQcPw0DZzJ4qpZtcvoXcy6GfPDaOpnaPrmiskK1eaRQa9BCZHqfulxFWtgsDOBfxHj+6B/E2mdLjd29xAJxuBKCbAX3hTFv/kqWhXiPXWnkPidlEpiWXIbd4xwOWSHwye6ZIldiXOhfDOWkshNf2xKRhDKo8Btq66URxXiYnETSzTKp67VkUPiRaf2W6OKBZGyaxWb7jBbZ18m4uI32hBGjjXyHCoad9WL7CCK1b5nkOlulkseBi1BD6Ieb3rDyfwlRrVSuV+mpV1DN5GIv0n5R34oY6WNW5LFm3RTExFBMCME49NDJu9qqKrCI2DpgnPEoISbb1TF5Q74iZkfBiukyCiBEEeCG5y1gMnPLBTt167xotH6aE+sR4UCrahtYRbbyAO1mBIatBRblr6E83cSU98BtF075Vf27QuovUqxdKOgmGfUHcHEe3zrHXJDvAP5l2BiSdGldn4xYC3NdoS/0qJnhn3OR33x1Ewiec6yAH80xsHVi6fA+FC04Xt34UX6ypCwno=----ATTACHMENT:----NTM5ODY1NjY2ODE0NTY5OSA3NjgyMzkyMTk0OTM0NjUwIDY0ODkzNTk5ODU4NzUxMDY=