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