aub-graticule 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG.txt +61 -0
  3. data/LICENSE.txt +30 -0
  4. data/Manifest.txt +84 -0
  5. data/README.txt +41 -0
  6. data/Rakefile +143 -0
  7. data/VERSION +1 -0
  8. data/bin/geocode +5 -0
  9. data/graticule.gemspec +143 -0
  10. data/init.rb +2 -0
  11. data/lib/graticule/cli.rb +64 -0
  12. data/lib/graticule/core_ext.rb +15 -0
  13. data/lib/graticule/distance/haversine.rb +40 -0
  14. data/lib/graticule/distance/spherical.rb +52 -0
  15. data/lib/graticule/distance/vincenty.rb +76 -0
  16. data/lib/graticule/distance.rb +18 -0
  17. data/lib/graticule/geocoder/base.rb +116 -0
  18. data/lib/graticule/geocoder/bogus.rb +15 -0
  19. data/lib/graticule/geocoder/geocoder_ca.rb +54 -0
  20. data/lib/graticule/geocoder/geocoder_us.rb +51 -0
  21. data/lib/graticule/geocoder/google.rb +100 -0
  22. data/lib/graticule/geocoder/host_ip.rb +41 -0
  23. data/lib/graticule/geocoder/local_search_maps.rb +44 -0
  24. data/lib/graticule/geocoder/mapquest.rb +96 -0
  25. data/lib/graticule/geocoder/meta_carta.rb +32 -0
  26. data/lib/graticule/geocoder/multi.rb +46 -0
  27. data/lib/graticule/geocoder/multimap.rb +73 -0
  28. data/lib/graticule/geocoder/postcode_anywhere.rb +63 -0
  29. data/lib/graticule/geocoder/rest.rb +18 -0
  30. data/lib/graticule/geocoder/yahoo.rb +84 -0
  31. data/lib/graticule/geocoder.rb +21 -0
  32. data/lib/graticule/location.rb +61 -0
  33. data/lib/graticule/version.rb +9 -0
  34. data/lib/graticule.rb +26 -0
  35. data/site/index.html +114 -0
  36. data/site/plugin.html +82 -0
  37. data/site/stylesheets/style.css +69 -0
  38. data/test/config.yml.default +36 -0
  39. data/test/fixtures/responses/geocoder_us/success.xml +18 -0
  40. data/test/fixtures/responses/geocoder_us/unknown.xml +1 -0
  41. data/test/fixtures/responses/google/badkey.xml +1 -0
  42. data/test/fixtures/responses/google/limit.xml +10 -0
  43. data/test/fixtures/responses/google/missing_address.xml +1 -0
  44. data/test/fixtures/responses/google/only_coordinates.xml +1 -0
  45. data/test/fixtures/responses/google/partial.xml +1 -0
  46. data/test/fixtures/responses/google/server_error.xml +10 -0
  47. data/test/fixtures/responses/google/success.xml +1 -0
  48. data/test/fixtures/responses/google/success_multiple_results.xml +88 -0
  49. data/test/fixtures/responses/google/unavailable.xml +1 -0
  50. data/test/fixtures/responses/google/unknown_address.xml +1 -0
  51. data/test/fixtures/responses/host_ip/private.txt +4 -0
  52. data/test/fixtures/responses/host_ip/success.txt +4 -0
  53. data/test/fixtures/responses/host_ip/unknown.txt +4 -0
  54. data/test/fixtures/responses/local_search_maps/empty.txt +1 -0
  55. data/test/fixtures/responses/local_search_maps/not_found.txt +1 -0
  56. data/test/fixtures/responses/local_search_maps/success.txt +1 -0
  57. data/test/fixtures/responses/mapquest/multi_result.xml +1 -0
  58. data/test/fixtures/responses/mapquest/success.xml +1 -0
  59. data/test/fixtures/responses/meta_carta/bad_address.xml +17 -0
  60. data/test/fixtures/responses/meta_carta/multiple.xml +33 -0
  61. data/test/fixtures/responses/meta_carta/success.xml +31 -0
  62. data/test/fixtures/responses/multimap/missing_params.xml +4 -0
  63. data/test/fixtures/responses/multimap/no_matches.xml +4 -0
  64. data/test/fixtures/responses/multimap/success.xml +19 -0
  65. data/test/fixtures/responses/postcode_anywhere/badkey.xml +9 -0
  66. data/test/fixtures/responses/postcode_anywhere/canada.xml +16 -0
  67. data/test/fixtures/responses/postcode_anywhere/empty.xml +16 -0
  68. data/test/fixtures/responses/postcode_anywhere/success.xml +16 -0
  69. data/test/fixtures/responses/postcode_anywhere/uk.xml +18 -0
  70. data/test/fixtures/responses/yahoo/success.xml +3 -0
  71. data/test/fixtures/responses/yahoo/unknown_address.xml +6 -0
  72. data/test/mocks/uri.rb +52 -0
  73. data/test/test_helper.rb +31 -0
  74. data/test/unit/graticule/distance_test.rb +58 -0
  75. data/test/unit/graticule/geocoder/geocoder_us_test.rb +43 -0
  76. data/test/unit/graticule/geocoder/geocoders.rb +56 -0
  77. data/test/unit/graticule/geocoder/google_test.rb +112 -0
  78. data/test/unit/graticule/geocoder/host_ip_test.rb +40 -0
  79. data/test/unit/graticule/geocoder/local_search_maps_test.rb +30 -0
  80. data/test/unit/graticule/geocoder/mapquest_test.rb +61 -0
  81. data/test/unit/graticule/geocoder/meta_carta_test.rb +44 -0
  82. data/test/unit/graticule/geocoder/multi_test.rb +43 -0
  83. data/test/unit/graticule/geocoder/multimap_test.rb +52 -0
  84. data/test/unit/graticule/geocoder/postcode_anywhere_test.rb +50 -0
  85. data/test/unit/graticule/geocoder/yahoo_test.rb +48 -0
  86. data/test/unit/graticule/geocoder_test.rb +27 -0
  87. data/test/unit/graticule/location_test.rb +73 -0
  88. metadata +166 -0
@@ -0,0 +1,58 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ module Graticule
4
+ module Distance
5
+ class DistanceFormulaTest < Test::Unit::TestCase
6
+ EARTH_RADIUS_IN_MILES = 3963.1676
7
+ EARTH_RADIUS_IN_KILOMETERS = 6378.135
8
+
9
+ FORMULAS = [Haversine, Spherical, Vincenty]
10
+
11
+ def test_earth_radius
12
+ assert_equal EARTH_RADIUS_IN_MILES, EARTH_RADIUS[:miles]
13
+ assert_equal EARTH_RADIUS_IN_KILOMETERS, EARTH_RADIUS[:kilometers]
14
+ end
15
+
16
+ def test_distance
17
+ washington_dc = Location.new(:latitude => 38.898748, :longitude => -77.037684)
18
+ chicago = Location.new(:latitude => 41.85, :longitude => -87.65)
19
+
20
+ FORMULAS.each do |formula|
21
+ assert_in_delta formula.distance(washington_dc, chicago), formula.distance(chicago, washington_dc), 0.00001
22
+ assert_in_delta 594.820, formula.distance(washington_dc, chicago), 1.0
23
+ assert_in_delta 594.820, formula.distance(washington_dc, chicago, :miles), 1.0
24
+ assert_in_delta 957.275, formula.distance(washington_dc, chicago, :kilometers), 1.0
25
+ end
26
+ end
27
+
28
+ def test_distance_between_antipodal_points
29
+ # The Vincenty formula will be indeterminant with antipodal points.
30
+ # See http://mathworld.wolfram.com/AntipodalPoints.html
31
+ washington_dc = Location.new(:latitude => 38.898748, :longitude => -77.037684)
32
+ chicago = Location.new(:latitude => 41.85, :longitude => -87.65)
33
+
34
+ # First, test the deltas.
35
+ FORMULAS.each do |formula|
36
+ assert_in_delta 12450.6582171051,
37
+ formula.distance(chicago, chicago.antipodal_location), 1.0
38
+ assert_in_delta 12450.6582171051,
39
+ formula.distance(washington_dc, washington_dc.antipodal_location), 1.0
40
+ assert_in_delta 12450.6582171051,
41
+ formula.distance(chicago, chicago.antipodal_location, :miles), 1.0
42
+ assert_in_delta 12450.6582171051,
43
+ formula.distance(washington_dc, washington_dc.antipodal_location, :miles), 1.0
44
+ assert_in_delta 20037.50205960391,
45
+ formula.distance(chicago, chicago.antipodal_location, :kilometers), 1.0
46
+ assert_in_delta 20037.5020596039,
47
+ formula.distance(washington_dc, washington_dc.antipodal_location, :kilometers), 1.0
48
+ end
49
+
50
+ # Next, test Vincenty. Vincenty will use haversine instead of returning NaN on antipodal points
51
+ assert_equal Haversine.distance(washington_dc, washington_dc.antipodal_location),
52
+ Vincenty.distance(washington_dc, washington_dc.antipodal_location)
53
+ assert_equal Haversine.distance(chicago, chicago.antipodal_location),
54
+ Vincenty.distance(chicago, chicago.antipodal_location)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class GeocoderUsTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ URI::HTTP.responses = []
9
+ URI::HTTP.uris = []
10
+
11
+ @geocoder = GeocoderUs.new
12
+ @location = Location.new(
13
+ :street => "1600 Pennsylvania Ave NW, Washington DC 20502",
14
+ :longitude => -77.037684,
15
+ :latitude => 38.898748
16
+ )
17
+ end
18
+
19
+ def test_success
20
+ prepare_response(:success)
21
+ assert_equal @location, @geocoder.locate('1600 Pennsylvania Ave, Washington DC')
22
+ end
23
+
24
+ def test_url
25
+ prepare_response(:success)
26
+ @geocoder.locate('1600 Pennsylvania Ave, Washington DC')
27
+ assert_equal 'http://rpc.geocoder.us/service/rest/geocode?address=1600%20Pennsylvania%20Ave,%20Washington%20DC',
28
+ URI::HTTP.uris.first
29
+ end
30
+
31
+ def test_locate_bad_address
32
+ prepare_response(:unknown)
33
+ assert_raises(AddressError) { @geocoder.locate('yuck') }
34
+ end
35
+
36
+ protected
37
+ def prepare_response(id)
38
+ URI::HTTP.responses << response('geocoder_us', id)
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+
4
+ module Graticule
5
+
6
+ # Generic tests for all geocoders (theoretically)
7
+ module GeocodersTestCase
8
+
9
+ def test_success
10
+ return unless prepare_response(:success)
11
+
12
+ location = Location.new(
13
+ :street => "1600 Amphitheatre Pkwy",
14
+ :city => "Mountain View",
15
+ :state => "CA",
16
+ :zip => "94043",
17
+ :country => "US",
18
+ :longitude => -122.083739,
19
+ :latitude => 37.423021,
20
+ :precision => :address
21
+ )
22
+ assert_equal location, @geocoder.locate('1600 Amphitheatre Parkway, Mountain View, CA')
23
+ end
24
+
25
+ def test_bad_key
26
+ return unless prepare_response(:badkey)
27
+ assert_raises(CredentialsError) { @geocoder.locate('x') }
28
+ end
29
+
30
+ def test_locate_missing_address
31
+ return unless prepare_response(:missing_address)
32
+ assert_raises(AddressError) { @geocoder.locate 'x' }
33
+ end
34
+
35
+ def test_locate_server_error
36
+ return unless prepare_response(:server_error)
37
+ assert_raises(Error) { @geocoder.locate 'x' }
38
+ end
39
+
40
+ def test_locate_too_many_queries
41
+ return unless prepare_response(:limit)
42
+ assert_raises(CredentialsError) { @geocoder.locate 'x' }
43
+ end
44
+
45
+ def test_locate_unavailable_address
46
+ return unless prepare_response(:unavailable)
47
+ assert_raises(AddressError) { @geocoder.locate 'x' }
48
+ end
49
+
50
+ def test_locate_unknown_address
51
+ return unless prepare_response(:unknown_address)
52
+ assert_raises(AddressError) { @geocoder.locate 'x' }
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,112 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class GoogleTest < Test::Unit::TestCase
6
+ def setup
7
+ URI::HTTP.responses = []
8
+ URI::HTTP.uris = []
9
+ @geocoder = Google.new(:key => 'APP_ID')
10
+ end
11
+
12
+ def test_success
13
+ return unless prepare_response(:success)
14
+
15
+ location = Location.new(
16
+ :street => "1600 Amphitheatre Pkwy",
17
+ :locality => "Mountain View",
18
+ :region => "CA",
19
+ :postal_code => "94043",
20
+ :country => "US",
21
+ :longitude => -122.083739,
22
+ :latitude => 37.423021,
23
+ :precision => :address
24
+ )
25
+ assert_equal location, @geocoder.locate('1600 Amphitheatre Parkway, Mountain View, CA')
26
+ end
27
+
28
+
29
+ # The #locate parameters are broad, so the XML response contains
30
+ # multiple results at street-level precision. We expect to get the
31
+ # first result back, and it should not contain a postal code.
32
+ def test_success_multiple_results
33
+ return unless prepare_response(:success_multiple_results)
34
+
35
+ location = Location.new(
36
+ :street => "Queen St W",
37
+ :locality => "Toronto",
38
+ :region => "ON",
39
+ :postal_code => nil,
40
+ :country => "CA",
41
+ :longitude => -79.4125590,
42
+ :latitude => 43.6455030,
43
+ :precision => :street
44
+ )
45
+ assert_equal location, @geocoder.locate('Queen St West, Toronto, ON CA')
46
+ end
47
+
48
+
49
+ # <?xml version='1.0' encoding='UTF-8'?><kml xmlns='http://earth.google.com/kml/2.0'><Response><name>15-17 </name><Status><code>200</code><request>geocode</request></Status><Placemark id='p1'><Point><coordinates>-17.000000,15.000000,0</coordinates></Point></Placemark></Response></kml>
50
+ def test_only_coordinates
51
+ return unless prepare_response(:only_coordinates)
52
+
53
+ location = Location.new(:longitude => -17.000000, :latitude => 15.000000)
54
+ assert_equal location, @geocoder.locate('15-17 & 16 Railroad Square, Nashua, NH, 03064')
55
+ end
56
+
57
+
58
+
59
+ def test_partial
60
+ return unless prepare_response(:partial)
61
+
62
+ location = Location.new(
63
+ :locality => "San Francisco",
64
+ :region => "CA",
65
+ :country => "US",
66
+ :longitude => -122.418333,
67
+ :latitude => 37.775000,
68
+ :precision => :city
69
+ )
70
+
71
+ assert_equal location, @geocoder.locate('sf ca')
72
+ end
73
+
74
+ def test_bad_key
75
+ return unless prepare_response(:badkey)
76
+ assert_raises(CredentialsError) { @geocoder.locate('x') }
77
+ end
78
+
79
+ def test_locate_missing_address
80
+ return unless prepare_response(:missing_address)
81
+ assert_raises(AddressError) { @geocoder.locate 'x' }
82
+ end
83
+
84
+ def test_locate_server_error
85
+ return unless prepare_response(:server_error)
86
+ assert_raises(Error) { @geocoder.locate 'x' }
87
+ end
88
+
89
+ def test_locate_too_many_queries
90
+ return unless prepare_response(:limit)
91
+ assert_raises(CredentialsError) { @geocoder.locate 'x' }
92
+ end
93
+
94
+ def test_locate_unavailable_address
95
+ return unless prepare_response(:unavailable)
96
+ assert_raises(AddressError) { @geocoder.locate 'x' }
97
+ end
98
+
99
+ def test_locate_unknown_address
100
+ return unless prepare_response(:unknown_address)
101
+ assert_raises(AddressError) { @geocoder.locate 'x' }
102
+ end
103
+
104
+ protected
105
+
106
+ def prepare_response(id = :success)
107
+ URI::HTTP.responses << response('google', id)
108
+ end
109
+
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class HostIpTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @geocoder = HostIp.new
9
+ URI::HTTP.responses = []
10
+ URI::HTTP.uris = []
11
+ end
12
+
13
+ def test_success
14
+ prepare_response :success
15
+
16
+ location = Location.new :country => 'US', :locality => 'Mountain View',
17
+ :region => 'CA', :latitude => 37.402, :longitude => -122.078
18
+
19
+ assert_equal location, @geocoder.locate('64.233.167.99')
20
+ end
21
+
22
+ def test_unknown
23
+ prepare_response :unknown
24
+ assert_raises(AddressError) { @geocoder.locate('127.0.0.1') }
25
+ end
26
+
27
+ def test_private_ip
28
+ prepare_response :private
29
+ assert_raises(AddressError) { @geocoder.locate('127.0.0.1') }
30
+ end
31
+
32
+ private
33
+
34
+ def prepare_response(id = :success)
35
+ URI::HTTP.responses << response('host_ip', id, 'txt')
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class LocalSearchMapsTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @geocoder = LocalSearchMaps.new
9
+ URI::HTTP.responses = []
10
+ URI::HTTP.uris = []
11
+ end
12
+
13
+ def test_success
14
+ prepare_response :success
15
+
16
+ location = Location.new :latitude => 51.510036, :longitude => -0.130427
17
+
18
+ assert_equal location, @geocoder.locate(:street => '48 Leicester Square',
19
+ :locality => 'London', :country => 'UK')
20
+ end
21
+
22
+ private
23
+
24
+ def prepare_response(id = :success)
25
+ URI::HTTP.responses << response('local_search_maps', id, 'txt')
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,61 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class MapquestTest < Test::Unit::TestCase
6
+ def setup
7
+ URI::HTTP.responses = []
8
+ URI::HTTP.uris = []
9
+ @geocoder = Mapquest.new('client_id', 'password')
10
+ end
11
+
12
+ def test_success
13
+ prepare_response(:success)
14
+ location = Location.new(
15
+ :country => "US",
16
+ :latitude => 44.152019,
17
+ :locality => "Lovell",
18
+ :longitude => -70.892706,
19
+ :postal_code => "04051-3919",
20
+ :precision => :address,
21
+ :region => "ME",
22
+ :street => "44 Allen Rd"
23
+ )
24
+ assert_equal(location, @geocoder.locate('44 Allen Rd., Lovell, ME 04051'))
25
+ end
26
+
27
+ def test_multi_result
28
+ prepare_response(:multi_result)
29
+ locations = [
30
+ Location.new(
31
+ :country => "US",
32
+ :latitude => 40.925598,
33
+ :locality => "Stony Brook",
34
+ :longitude => -73.141403,
35
+ :postal_code => nil,
36
+ :precision => :city,
37
+ :region => "NY",
38
+ :street => nil
39
+ ),
40
+ Location.new(
41
+ :country => "US",
42
+ :latitude => 41.229401,
43
+ :locality => "Stony Point",
44
+ :longitude => -73.987503,
45
+ :postal_code => nil,
46
+ :precision => :city,
47
+ :region => "NY",
48
+ :street => nil
49
+ )
50
+ ]
51
+ assert_equal(locations, @geocoder.locate_all('217 Union St., NY'))
52
+ end
53
+
54
+ protected
55
+
56
+ def prepare_response(id)
57
+ URI::HTTP.responses << response('mapquest', id)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class MetaCartaTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ URI::HTTP.responses = []
9
+ URI::HTTP.uris = []
10
+
11
+ @geocoder = MetaCarta.new
12
+ end
13
+
14
+ def test_locate
15
+ prepare_response(:success)
16
+
17
+ expected = Location.new :latitude => 44.3939, :longitude => 33.3386
18
+
19
+ assert_equal expected, @geocoder.locate('baghdad')
20
+ assert_equal true, URI::HTTP.responses.empty?
21
+ assert_equal 1, URI::HTTP.uris.length
22
+ assert_equal 'http://labs.metacarta.com/GeoParser/?output=locations&q=baghdad',
23
+ URI::HTTP.uris.first
24
+ end
25
+
26
+ def test_locate_bad_address
27
+ prepare_response(:bad_address)
28
+ assert_raises(AddressError) { @geocoder.locate('aoeueou') }
29
+ end
30
+
31
+ def test_locations
32
+ prepare_response(:multiple)
33
+ expected = Location.new :latitude => -122.33083, :longitude => 47.60639
34
+ assert_equal expected, @geocoder.locate('seattle')
35
+ end
36
+
37
+ protected
38
+ def prepare_response(id = :success)
39
+ URI::HTTP.responses << response('meta_carta', id)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class MultiTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @mock_geocoders = [mock("geocoder 1"), mock("geocoder 2")]
9
+ @mock_geocoders.each {|g| g.stubs(:locate) }
10
+ @geocoder = Multi.new(*@mock_geocoders)
11
+ end
12
+
13
+ def test_locate_calls_each_geocoder_and_raises_error
14
+ @mock_geocoders.each do |g|
15
+ g.expects(:locate).with('test').raises(Graticule::AddressError)
16
+ end
17
+ assert_raises(Graticule::AddressError) { @geocoder.locate 'test' }
18
+ end
19
+
20
+ def test_locate_returns_first_result_without_calling_others
21
+ result = mock("result")
22
+ @mock_geocoders.first.expects(:locate).returns(result)
23
+ @mock_geocoders.last.expects(:locate).never
24
+ assert_equal result, @geocoder.locate('test')
25
+ end
26
+
27
+ def test_locate_with_custom_block
28
+ @mock_geocoders.first.expects(:locate).returns(1)
29
+ @mock_geocoders.last.expects(:locate).returns(2)
30
+ @geocoder = Multi.new(*@mock_geocoders) {|r| r == 2 }
31
+ assert_equal 2, @geocoder.locate('test')
32
+ end
33
+
34
+ def test_locate_with_custom_block_and_no_match
35
+ @mock_geocoders.first.expects(:locate).returns(1)
36
+ @mock_geocoders.last.expects(:locate).returns(2)
37
+ @geocoder = Multi.new(*@mock_geocoders) {|r| r == 3 }
38
+ assert_raises(Graticule::AddressError) { @geocoder.locate('test') }
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class MultimapTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ URI::HTTP.responses = []
9
+ URI::HTTP.uris = []
10
+ @geocoder = Multimap.new 'API_KEY'
11
+ @location = Location.new(
12
+ :street => "Oxford Street",
13
+ :locality => "London",
14
+ :postal_code => "W1",
15
+ :country => "GB",
16
+ :longitude => -0.14839,
17
+ :latitude => 51.51452,
18
+ :precision => :address
19
+ )
20
+ end
21
+
22
+ def test_locate
23
+ prepare_response(:success)
24
+ assert_equal @location, @geocoder.locate('Oxford Street, LONDON, W1')
25
+ end
26
+
27
+ def test_url_from_string
28
+ prepare_response(:success)
29
+ @geocoder.locate('Oxford Street, LONDON, W1')
30
+ assert_equal 'http://clients.multimap.com/API/geocode/1.2/API_KEY?qs=Oxford%20Street,%20LONDON,%20W1', URI::HTTP.uris.first
31
+ end
32
+
33
+ def test_url_from_location
34
+ prepare_response(:success)
35
+ @geocoder.locate(:street => 'Oxford Street', :city => 'London')
36
+ assert_equal 'http://clients.multimap.com/API/geocode/1.2/API_KEY?city=&countryCode=&postalCode=&region=&street=Oxford%20Street', URI::HTTP.uris.first
37
+ end
38
+
39
+
40
+ def test_locate_bad_address
41
+ prepare_response(:no_matches)
42
+ assert_raise(Error) { @geocoder.locate('yucksthoeusthaoeusnhtaosu') }
43
+ end
44
+
45
+ protected
46
+ def prepare_response(id)
47
+ URI::HTTP.responses << response('multimap', id)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,50 @@
1
+ # account code: INDIV30777
2
+ # license key: KG39-HM17-PZ95-NR98
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
4
+
5
+ module Graticule
6
+ module Geocoder
7
+ class PostcodeAnywhereTest < Test::Unit::TestCase
8
+
9
+ def setup
10
+ URI::HTTP.responses = []
11
+ URI::HTTP.uris = []
12
+ @geocoder = PostcodeAnywhere.new 'account_code', 'license_key'
13
+ end
14
+
15
+ def test_locate
16
+ prepare_response(:success)
17
+ location = Location.new(
18
+ :street => "204 Campbell Ave",
19
+ :locality => "Revelstoke",
20
+ :region => "BC",
21
+ :postal_code => "V0E",
22
+ :country => "Canada",
23
+ :longitude => -118.196970002204,
24
+ :latitude => 50.9997350418267
25
+ )
26
+ assert_equal location, @geocoder.locate(:street => "204 Campbell Ave",
27
+ :locality => "Revelstoke", :country => "Canada")
28
+ end
29
+
30
+ def test_locate_uk_address
31
+ prepare_response(:uk)
32
+
33
+ location = Location.new :latitude => 51.5728910186362, :longitude => -0.253788666693255
34
+ assert_equal location, @geocoder.locate(:street => '80 Wood Lane', :locality => 'London', :country => 'UK')
35
+ end
36
+
37
+ def test_empty
38
+ prepare_response(:empty)
39
+
40
+ assert_raises(Graticule::AddressError) { @geocoder.locate :street => 'foobar'}
41
+ end
42
+
43
+ protected
44
+ def prepare_response(id)
45
+ URI::HTTP.responses << response('postcode_anywhere', id)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ module Graticule
4
+ module Geocoder
5
+ class YahooTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ URI::HTTP.responses = []
9
+ URI::HTTP.uris = []
10
+ @geocoder = Yahoo.new 'APP_ID'
11
+ @location = Location.new(
12
+ :street => "701 First Ave",
13
+ :locality => "Sunnyvale",
14
+ :region => "CA",
15
+ :postal_code => "94089-1019",
16
+ :country => "US",
17
+ :longitude => -122.024853,
18
+ :latitude => 37.416384,
19
+ :precision => :address
20
+ )
21
+ end
22
+
23
+ def test_locate
24
+ prepare_response(:success)
25
+ assert_equal @location, @geocoder.locate('701 First Street, Sunnyvale, CA')
26
+ end
27
+
28
+ def test_url
29
+ prepare_response(:success)
30
+ @geocoder.locate('701 First Street, Sunnyvale, CA')
31
+ assert_equal 'http://api.local.yahoo.com/MapsService/V1/geocode?appid=APP_ID&location=701%20First%20Street,%20Sunnyvale,%20CA&output=xml',
32
+ URI::HTTP.uris.first
33
+ end
34
+
35
+
36
+ def test_locate_bad_address
37
+ prepare_response(:unknown_address)
38
+ assert_raise(Error) { @geocoder.locate('yucksthoeusthaoeusnhtaosu') }
39
+ end
40
+
41
+ protected
42
+ def prepare_response(id)
43
+ URI::HTTP.responses << response('yahoo', id)
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ module Graticule
4
+ class GeocoderTest < Test::Unit::TestCase
5
+
6
+ def test_bogus_service
7
+ assert_equal Geocoder::Bogus, Graticule.service(:bogus)
8
+ end
9
+
10
+ def test_yahoo_service
11
+ assert_equal Geocoder::Yahoo, Graticule.service(:yahoo)
12
+ end
13
+
14
+ def test_google_service
15
+ assert_equal Geocoder::Google, Graticule.service(:google)
16
+ end
17
+
18
+ def test_geocoder_us_service
19
+ assert_equal Geocoder::GeocoderUs, Graticule.service(:geocoder_us)
20
+ end
21
+
22
+ def test_meta_carta_service
23
+ assert_equal Geocoder::MetaCarta, Graticule.service(:meta_carta)
24
+ end
25
+
26
+ end
27
+ end