public function test__serialization()
    {
        $ed = new EntityDescriptor();
        $ed->setEntityID($entityID = 'http://vendor.com/id')->setID($edID = '_127800fe-39ac-46ad-b073-6fb6106797a0')->addItem((new IdpSsoDescriptor())->addSingleSignOnService((new SingleSignOnService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_POST)->setLocation('http://idp.example.com/sso/post'))->addSingleSignOnService((new SingleSignOnService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_REDIRECT)->setLocation('http://idp.example.com/slo/get'))->addSingleLogoutService((new SingleLogoutService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_REDIRECT)->setLocation('http://idp.example.com/slo/redirect'))->addAttribute((new Attribute())->setName(ClaimTypes::COMMON_NAME)->setFriendlyName('Common Name')->addAttributeValue('common name value'))->addNameIDFormat(SamlConstants::NAME_ID_FORMAT_EMAIL)->addNameIDFormat(SamlConstants::NAME_ID_FORMAT_PERSISTENT)->addKeyDescriptor((new KeyDescriptor())->setCertificate((new X509Certificate())->loadFromFile(__DIR__ . '/../../../../../resources/sample/Certificate/saml.crt')))->addOrganization((new Organization())->setOrganizationName('Organization Name')->setOrganizationDisplayName('Display Name')->setOrganizationURL('http://organization.org'))->addContactPerson((new ContactPerson())->setContactType(ContactPerson::TYPE_SUPPORT)->setGivenName('Support')->setSurName('Smith')->setEmailAddress('*****@*****.**')))->addItem((new SpSsoDescriptor())->addSingleLogoutService((new SingleLogoutService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_POST)->setLocation('http://sp.example.com/slo/post'))->addAssertionConsumerService((new AssertionConsumerService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_POST)->setLocation('http://sp.example.com/acs/post')->setIndex(0)->setIsDefault(true))->addAssertionConsumerService((new AssertionConsumerService())->setBinding(SamlConstants::BINDING_SAML2_HTTP_REDIRECT)->setLocation('http://sp.example.com/acs/redirect')->setIndex(1)->setIsDefault(false))->addNameIDFormat(SamlConstants::NAME_ID_FORMAT_PERSISTENT)->addNameIDFormat(SamlConstants::NAME_ID_FORMAT_TRANSIENT));
        $context = new SerializationContext();
        $ed->serialize($context->getDocument(), $context);
        $context->getDocument()->formatOutput = true;
        $xml = $context->getDocument()->saveXML();
        $expectedXml = <<<EOT
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" entityID="http://vendor.com/id" ID="_127800fe-39ac-46ad-b073-6fb6106797a0">
  <IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>MIIDrDCCApSgAwIBAgIJAIxzbGLou3BjMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlJTMQ8wDQYDVQQIEwZTZXJiaWExDDAKBgNVBAoTA0JPUzEUMBIGA1UEAxMLbXQuZXZvLnRlYW0wHhcNMTMxMDA4MTg1OTMyWhcNMjMxMDA4MTg1OTMyWjBCMQswCQYDVQQGEwJSUzEPMA0GA1UECBMGU2VyYmlhMQwwCgYDVQQKEwNCT1MxFDASBgNVBAMTC210LmV2by50ZWFtMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAws7jML47jTQbWleRwihk15wOjuspoKPcxW1aERexAMWe8BMs1MeeTOMXjnA35breGa9PwJi2KjtDz3gkhVCglZzLZGBLLO7uchZvagFhTomZa20jTqO6JQbDli3pYNP0fBIrmEbH9cfhgm91Fm+6bTVnJ4xQhT4aPWrPAVKU2FDTBFBf4QNMIb1iI1oNErt3iocsbRTbIyjjvIe8yLVrtmZXA0DnkxB/riym0GT+4gpOEKV6GUMTF1x0eQMUzw4dkxhFs7fv6YrJymtEMmHOeiA5vVPEtxEr84JAXJyZUaZfufkj/jHUlX+POFWx2JRv+428ghrXpNvqUNqv7ozfFwIDAQABo4GkMIGhMB0GA1UdDgQWBBRomf3Xyc5ck3ceIXq0n45pxUkgwjByBgNVHSMEazBpgBRomf3Xyc5ck3ceIXq0n45pxUkgwqFGpEQwQjELMAkGA1UEBhMCUlMxDzANBgNVBAgTBlNlcmJpYTEMMAoGA1UEChMDQk9TMRQwEgYDVQQDEwttdC5ldm8udGVhbYIJAIxzbGLou3BjMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGAXc8pe6+6owl9z2iqybE6pbjXTKqjSclMGrdeooItU1xGqBhYu/b2q6hEvYZCzlqYe5euf3r8C7GAAKEYyuwu3xuLDYV4n6l6eWTIl1doug+r0Bl8Z3157A4BcgmUT64QkekI2VDHO8WAdDOWQg1UTEoqCryTOtmRaC391iGAqbz1wtZtV95boGdur8SChK9LKcPrbCDxpo64BMgtPk2HkRgE7h5YWkLHxmxwZrYi3EAfS6IucblY3wwY4GEix8DQh1lYgpv5TOD8IMVf+oUWdp81Un/IqHqLhnSupwk6rBYbUFhN/ClK5UcoDqWHcj27tGKD6aNlxTdSwcYBl3Ts=</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <Organization>
      <OrganizationName>Organization Name</OrganizationName>
      <OrganizationDisplayName>Display Name</OrganizationDisplayName>
      <OrganizationURL>http://organization.org</OrganizationURL>
    </Organization>
    <ContactPerson contactType="support">
      <GivenName>Support</GivenName>
      <SurName>Smith</SurName>
      <EmailAddress>support@idp.com</EmailAddress>
    </ContactPerson>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://idp.example.com/slo/redirect"/>
    <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://idp.example.com/sso/post"/>
    <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://idp.example.com/slo/get"/>
    <Attribute xmlns="urn:oasis:names:tc:SAML:2.0:assertion" Name="http://schemas.xmlsoap.org/claims/CommonName" FriendlyName="Common Name">
      <AttributeValue>common name value</AttributeValue>
    </Attribute>
  </IDPSSODescriptor>
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://sp.example.com/slo/post"/>
    <AssertionConsumerService index="0" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://sp.example.com/acs/post"/>
    <AssertionConsumerService index="1" isDefault="false" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="http://sp.example.com/acs/redirect"/>
  </SPSSODescriptor>
</EntityDescriptor>
EOT;
        $xml = trim(str_replace("\r", '', $xml));
        $expectedXml = trim(str_replace("\r", '', $expectedXml));
        $this->assertEquals($expectedXml, $xml);
    }