/**
* @covers ::__construct
* @covers ::getCountryCode
* @covers ::getLocale
* @covers ::getFormat
* @covers ::getLocalFormat
* @covers ::getUsedFields
* @covers ::getUsedSubdivisionFields
* @covers ::getRequiredFields
* @covers ::getUppercaseFields
* @covers ::getAdministrativeAreaType
* @covers ::getLocalityType
* @covers ::getDependentLocalityType
* @covers ::getPostalCodeType
* @covers ::getPostalCodePattern
* @covers ::getPostalCodePrefix
* @covers ::getSubdivisionDepth
*/
public function testValid()
{
$definition = ['country_code' => 'US', 'locale' => 'en', 'format' => "%givenName %familyName\n%organization\n%addressLine1\n%addressLine2\n%locality, %administrativeArea %postalCode", 'local_format' => '%postalCode\\n%addressLine1\\n%organization\\n%givenName %familyName', 'required_fields' => [AddressField::ADMINISTRATIVE_AREA, AddressField::LOCALITY, AddressField::POSTAL_CODE, AddressField::ADDRESS_LINE1], 'uppercase_fields' => [AddressField::ADMINISTRATIVE_AREA, AddressField::LOCALITY], 'administrative_area_type' => AdministrativeAreaType::STATE, 'locality_type' => LocalityType::CITY, 'dependent_locality_type' => DependentLocalityType::DISTRICT, 'postal_code_type' => PostalCodeType::ZIP, 'postal_code_pattern' => '(\\d{5})(?:[ \\-](\\d{4}))?', 'postal_code_prefix' => 'US', 'subdivision_depth' => 1];
$addressFormat = new AddressFormat($definition);
$this->assertEquals($definition['country_code'], $addressFormat->getCountryCode());
$this->assertEquals($definition['locale'], $addressFormat->getLocale());
$this->assertEquals($definition['format'], $addressFormat->getFormat());
$this->assertEquals($definition['local_format'], $addressFormat->getLocalFormat());
$this->assertEquals($definition['required_fields'], $addressFormat->getRequiredFields());
$this->assertEquals($definition['uppercase_fields'], $addressFormat->getUppercaseFields());
$this->assertEquals($definition['administrative_area_type'], $addressFormat->getAdministrativeAreaType());
$this->assertEquals($definition['locality_type'], $addressFormat->getLocalityType());
// The format has no %dependentLocality, the type must be NULL.
$this->assertNull($addressFormat->getDependentLocalityType());
$this->assertEquals($definition['postal_code_type'], $addressFormat->getPostalCodeType());
$this->assertEquals($definition['postal_code_pattern'], $addressFormat->getPostalCodePattern());
$this->assertEquals($definition['postal_code_prefix'], $addressFormat->getPostalCodePrefix());
$this->assertEquals($definition['subdivision_depth'], $addressFormat->getSubdivisionDepth());
$expectedUsedFields = [AddressField::ADMINISTRATIVE_AREA, AddressField::LOCALITY, AddressField::POSTAL_CODE, AddressField::ADDRESS_LINE1, AddressField::ADDRESS_LINE2, AddressField::ORGANIZATION, AddressField::GIVEN_NAME, AddressField::FAMILY_NAME];
$this->assertEquals($expectedUsedFields, $addressFormat->getUsedFields());
$expectedUsedSubdivisionFields = [AddressField::ADMINISTRATIVE_AREA, AddressField::LOCALITY];
$this->assertEquals($expectedUsedSubdivisionFields, $addressFormat->getUsedSubdivisionFields());
}