1use Test::More tests => 78; 2 3use_ok('Locale::Geocode'); 4 5my $lg; 6my $lgt; 7my $lgd; 8my @lgds; 9my $lgt2; 10 11$lg = new Locale::Geocode; 12ok(defined($lg), 'new Locale::Geocode object'); 13 14$lgt = $lg->lookup('US'); 15ok(defined($lgt), 'lookup territory via ISO 3166-1 alpha-2 code "US"'); 16is($lgt && $lgt->alpha2, 'US', 'US: ISO 3166-1 alpha-2 code: ' . $lgt->alpha2); 17is($lgt && $lgt->alpha3, 'USA', 'US: ISO 3166-1 alpha-3 code: ' . $lgt->alpha3); 18cmp_ok($lgt && $lgt->num, '==', 840, 'US: ISO 3166-1 numeric code: ' . $lgt->num); 19ok($lgt && $lgt->name =~ /United States/, 'US: ISO 3166-1 name: ' . $lgt->name); 20is("$lgt", "US", 'US: object stringifies to "US"'); 21 22$lgt2 = $lg->lookup('CA'); 23ok(defined($lgt2), 'lookup territory via ISO 3166-1 alpha-2 code "CA"'); 24is($lgt2 && $lgt2->alpha2, 'CA', 'CA: ISO 3166-1 alpha-2 code: ' . $lgt2->alpha2); 25is($lgt2 && $lgt2->alpha3, 'CAN', 'CA: ISO 3166-1 alpha-3 code: ' . $lgt2->alpha3); 26cmp_ok($lgt2 && $lgt2->num, '==', 124, 'CA: ISO 3166-1 numeric code: ' . $lgt2->num); 27ok($lgt2 && $lgt2->name =~ /Canada/, 'CA: ISO 3166-1 name: ' . $lgt2->name); 28is("$lgt2", "CA", 'CA: object stringifies to "CA"'); 29 30# we can't use cmp_ok here because Test::Builder tries to add 31# 0 to each argument in order to detect "dualvars" such as $! 32ok($lgt != $lgt2, 'overloaded inequality operator'); 33 34$lgt2 = $lg->lookup('US'); 35ok(defined($lgt2), 'lookup territory via ISO 3166-1 alpha-2 code "US"'); 36is($lgt2 && $lgt2->alpha2, 'US', 'US: ISO 3166-1 alpha-2 code: ' . $lgt2->alpha2); 37is($lgt2 && $lgt2->alpha3, 'USA', 'US: ISO 3166-1 alpha-3 code: ' . $lgt2->alpha3); 38cmp_ok($lgt2 && $lgt2->num, '==', 840, 'US: ISO 3166-1 numeric code: ' . $lgt2->num); 39ok($lgt2 && $lgt2->name =~ /United States/, 'US: ISO 3166-1 name: ' . $lgt2->name); 40is("$lgt2", "US", 'US: object stringifies to "US"'); 41 42# we can't use cmp_ok here because Test::Builder tries to add 43# 0 to each argument in order to detect "dualvars" such as $! 44ok($lgt == $lgt2, 'overloaded equality operator'); 45 46$lgd = $lgt->lookup('TN'); 47ok(defined($lgd), 'US: lookup division via ISO 3166-2 code "TN"'); 48is($lgd && $lgd->code, 'TN', 'US-TN: ISO 3166-2 code: ' . $lgd->code); 49is($lgd && $lgd->name, 'Tennessee', 'US-TN: ISO 3166-2 name: ' . $lgd->name); 50is("$lgd", "TN", 'US-TN: object stringifies to "TN"'); 51 52$lgd = $lgt->lookup('AP'); 53ok(!defined($lgd), 'US: lookup non ISO 3166-2 code "AP"'); 54 55$lgt = $lg->lookup('UK'); 56ok(!defined($lgd), 'lookup ISO 3166-1 reserved alpha-2 code "UK"'); 57 58# enabling single extension for UK->GB mapping 59$lg->ext(qw(uk)); 60ok(eq_array([ sort $lg->ext ], [ qw(uk ust) ]), 'set extensions for reserved ISO 3166-1 alpha-2 code "UK"'); 61 62$lgt = $lg->lookup('UK'); 63ok(!defined($lgd), 'lookup ISO 3166-1 reserved alpha-2 code "UK"'); 64is($lgt && $lgt->alpha2, 'UK', 'UK: ISO 3166-1 alpha-2 code: ' . $lgt->alpha2); 65ok($lgt && !defined($lgt->alpha3), 'UK: ISO 3166-1 alpha-3 code: N/A'); 66ok($lgt && !defined($lgt->num), 'UK: ISO 3166-1 numeric code: N/A'); 67ok($lgt && $lgt->name =~ /United Kingdom/, 'UK: ISO 3166-1 name: ' . $lgt->name); 68 69# usm extension still disabled 70$lgt = $lg->lookup('US'); 71ok(defined($lgt), 'lookup territory via ISO 3166-1 alpha-2 code "US"'); 72 73$lgd = $lgt->lookup('AP'); 74ok(!defined($lgd), 'US: lookup non ISO 3166-2 code "AP"'); 75 76@lgds = $lgt->divisions; 77cmp_ok($lgt->num_divisions, '==', 57, 'US: num_divisions is 57'); 78cmp_ok(scalar(@lgds), '==', 57, 'US: divisions method returns a 57 member list'); 79cmp_ok( 80 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 57, 81 'US: divisions method returns only Locale::Geocode::Division objects' 82); 83 84# disable ust extension with the ext method 85$lg->ext(qw(uk -ust)); 86ok(eq_array([ sort $lg->ext ], [ qw(uk) ]), 'disable ust extension using ext method'); 87 88@lgds = $lgt->divisions; 89cmp_ok($lgt->num_divisions, '==', 51, 'US: num_divisions is 51'); 90cmp_ok(scalar(@lgds), '==', 51, 'US: divisions method returns a 51 member list'); 91cmp_ok( 92 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 51, 93 'US: divisions method returns only Locale::Geocode::Division objects' 94); 95 96# re-enable ust extension using the ext_enable method 97$lg->ext_enable('ust'); 98ok(eq_array([ sort $lg->ext ], [ qw(uk ust) ]), 'enable ust extension using ext_enable method'); 99 100@lgds = $lgt->divisions; 101cmp_ok($lgt->num_divisions, '==', 57, 'US: num_divisions is 57'); 102cmp_ok(scalar(@lgds), '==', 57, 'US: divisions method returns a 57 member list'); 103cmp_ok( 104 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 57, 105 'US: divisions method returns only Locale::Geocode::Division objects' 106); 107 108# re-disable ust extension using the ext_disable method 109$lg->ext_disable('ust'); 110ok(eq_array([ sort $lg->ext ], [ qw(uk) ]), 'disable ust extension using ext_disable method'); 111 112@lgds = $lgt->divisions; 113cmp_ok($lgt->num_divisions, '==', 51, 'US: num_divisions is 51'); 114cmp_ok(scalar(@lgds), '==', 51, 'US: divisions method returns a 51 member list'); 115cmp_ok( 116 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 51, 117 'US: divisions method returns only Locale::Geocode::Division objects' 118); 119 120# enabling multiple extensions at once (US military, UK->GB alias) 121$lg->ext(qw(usm uk)); 122ok(eq_array([ sort $lg->ext ], [ qw(uk usm ust) ]), 'enable extensions for non ISO 3166 United States Military Postal Service Agency codes'); 123 124$lgd = $lgt->lookup('AP'); 125ok(defined($lgd), 'US: lookup non ISO 3166-2 code "AP"'); 126is($lgd && $lgd->name, 'Armed Forces Pacific', 'US MPSA division name: Armed Forces Pacific'); 127is($lgd && $lgd->code, 'AP', 'US MPSA division code: AP'); 128 129$lgd = $lgt->lookup('FM'); 130ok(!defined($lgd), 'US: lookup non 3166-2 code "FM"'); 131 132@lgds = $lgt->divisions; 133cmp_ok($lgt->num_divisions, '==', 60, 'US: num_divisions is 60'); 134cmp_ok(scalar(@lgds), '==', 60, 'US: divisions method returns a 60 member list'); 135cmp_ok( 136 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 60, 137 'US: divisions method returns only Locale::Geocode::Division objects' 138); 139 140# usps extension for blanket coverage of USPS recognized postal abbreviations 141$lg->ext(qw(usps uk)); 142ok(eq_array([ sort $lg->ext ], [ qw(uk usps ust) ]), 'enable extensions for non ISO 3166 United States Postal Service codes'); 143 144$lgd = $lgt->lookup('AP'); 145ok(defined($lgd), 'US: lookup non ISO 3166-2 code "AP"'); 146is($lgd && $lgd->name, 'Armed Forces Pacific', 'US MPSA division name: Armed Forces Pacific'); 147is($lgd && $lgd->code, 'AP', 'USPS division code: AP'); 148 149$lgd = $lgt->lookup('FM'); 150ok(defined($lgd), 'US: lookup non ISO 3166-2 code "FM"'); 151is($lgd && $lgd->name, 'Federated States of Micronesia', 'USPS division name: Federated States of Micronesia'); 152is($lgd && $lgd->code, 'FM', 'USPS division code: FM'); 153 154@lgds = $lgt->divisions; 155ok($lgt->num_divisions == 63, 'US: num_divisions is 63'); 156cmp_ok(scalar(@lgds), '==', 63, 'US: divisions method returns a 63 member list'); 157cmp_ok( 158 scalar(grep { ref $_ eq 'Locale::Geocode::Division' } @lgds), '==', 63, 159 'US: divisions method returns only Locale::Geocode::Division objects' 160); 161 162# enabling multiple extensions at once (European Union and WCO) 163$lg->ext(qw(eu wco)); 164ok(eq_array([ sort $lg->ext ], [ qw(eu ust wco) ]), 'set extensions for reserved ISO 3166 codes for EU/WCO statistical purposes'); 165 166$lgt = $lg->lookup('IC'); 167ok(defined($lgt), 'IC: lookup territory via reserved ISO 3166-1 alpha-2 code "IC"'); 168ok($lgt && $lgt->alpha2 eq 'IC', 'IC: ISO 3166-1 alpha-2 code: ' . $lgt->alpha2); 169ok($lgt && !defined($lgt->alpha3), 'IC: ISO 3166-1 alpha-3 code: N/A'); 170ok($lgt && !defined($lgt->num), 'IC: ISO 3166-1 numeric code: N/A'); 171ok($lgt && $lgt->name eq 'Canary Islands', 'IC: ISO 3166-1 name: ' . $lgt->name); 172ok($lgt && $lgt->has_notes, 'IC: has notes'); 173ok($lgt && $lgt->num_notes == 1, 'IC: number of notes: ' . $lgt->num_notes); 174ok($lgt && $lgt->note(0) eq 'reserved on request of WCO to represent area outside EU customs territory', 'IC: note 0: ' . $lgt->note(0)); 175 176