latlng.spec.ts 5.76 KB
Newer Older
JOE XMG's avatar
update  
JOE XMG committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import * as L from 'leaflet';
import { LatLng } from '../src/geocoders/latlng';

describe('LatLng', () => {
  // test cases from https://github.com/openstreetmap/openstreetmap-website/blob/master/test/controllers/geocoder_controller_test.rb
  let expected;
  beforeEach(() => {
    expected = L.latLng(50.06773, 14.37742);
  });

  it('geocodes basic lat/lon pairs', () => {
    geocode('50.06773 14.37742');
    geocode('50.06773, 14.37742');
    geocode('+50.06773 +14.37742');
    geocode('+50.06773, +14.37742');
  });

  it('does not geocode no-lat-lng', () => {
    const geocoder = new LatLng();
    const callback = jest.fn();
    geocoder.geocode('no-lat-lng', callback);
    expect(callback).toHaveBeenCalledTimes(0);
  });

  it('passes unsupported queries to the next geocoder', () => {
    const next = {
      geocode: (_query, cb) => cb('XXX')
    };
    const geocoder = new LatLng({ next: next });
    const callback = jest.fn();
    geocoder.geocode('no-lat-lng', callback);
    expect(callback).toHaveBeenCalledWith('XXX');
  });

  it('geocodes lat/lon pairs using N/E with degrees', () => {
    geocode('N50.06773 E14.37742');
    geocode('N50.06773, E14.37742');
    geocode('50.06773N 14.37742E');
    geocode('50.06773N, 14.37742E');
  });
  it('geocodes lat/lon pairs using N/W with degrees', () => {
    expected = L.latLng(50.06773, -14.37742);
    geocode('N50.06773 W14.37742');
    geocode('N50.06773, W14.37742');
    geocode('50.06773N 14.37742W');
    geocode('50.06773N, 14.37742W');
  });
  it('geocodes lat/lon pairs using S/E with degrees', () => {
    expected = L.latLng(-50.06773, 14.37742);
    geocode('S50.06773 E14.37742');
    geocode('S50.06773, E14.37742');
    geocode('50.06773S 14.37742E');
    geocode('50.06773S, 14.37742E');
  });
  it('geocodes lat/lon pairs using S/W with degrees', () => {
    expected = L.latLng(-50.06773, -14.37742);
    geocode('S50.06773 W14.37742');
    geocode('S50.06773, W14.37742');
    geocode('50.06773S 14.37742W');
    geocode('50.06773S, 14.37742W');
  });

  it('geocodes lat/lon pairs using N/E with degrees/mins', () => {
    expected = L.latLng(50.06773333333334, 14.377416666666667);
    geocode('N 50° 04.064 E 014° 22.645');
    geocode("N 50° 04.064' E 014° 22.645");
    geocode("N 50° 04.064', E 014° 22.645'");
    geocode('N50° 04.064 E14° 22.645');
    geocode('N 50 04.064 E 014 22.645');
    geocode('N50 4.064 E14 22.645');
    geocode("50° 04.064' N, 014° 22.645' E");
  });
  it('geocodes lat/lon pairs using N/W with degrees/mins', () => {
    expected = L.latLng(50.06773333333334, -14.377416666666667);
    geocode('N 50° 04.064 W 014° 22.645');
    geocode("N 50° 04.064' W 014° 22.645");
    geocode("N 50° 04.064', W 014° 22.645'");
    geocode('N50° 04.064 W14° 22.645');
    geocode('N 50 04.064 W 014 22.645');
    geocode('N50 4.064 W14 22.645');
    geocode("50° 04.064' N, 014° 22.645' W");
  });
  it('geocodes lat/lon pairs using S/E with degrees/mins', () => {
    expected = L.latLng(-50.06773333333334, 14.377416666666667);
    geocode('S 50° 04.064 E 014° 22.645');
    geocode("S 50° 04.064' E 014° 22.645");
    geocode("S 50° 04.064', E 014° 22.645'");
    geocode('S50° 04.064 E14° 22.645');
    geocode('S 50 04.064 E 014 22.645');
    geocode('S50 4.064 E14 22.645');
    geocode("50° 04.064' S, 014° 22.645' E");
  });
  it('geocodes lat/lon pairs using S/W with degrees/mins', () => {
    expected = L.latLng(-50.06773333333334, -14.377416666666667);
    geocode('S 50° 04.064 W 014° 22.645');
    geocode("S 50° 04.064' W 014° 22.645");
    geocode("S 50° 04.064', W 014° 22.645'");
    geocode('S50° 04.064 W14° 22.645');
    geocode('S 50 04.064 W 014 22.645');
    geocode('S50 4.064 W14 22.645');
    geocode("50° 04.064' S, 014° 22.645' W");
  });

  it('geocodes lat/lon pairs using N/E with degrees/mins/secs', () => {
    geocode('N 50° 4\' 03.828" E 14° 22\' 38.712"');
    geocode('N 50° 4\' 03.828", E 14° 22\' 38.712"');
    geocode('N 50° 4′ 03.828″, E 14° 22′ 38.712″');
    geocode('N50 4 03.828 E14 22 38.712');
    geocode('N50 4 03.828, E14 22 38.712');
    geocode('50°4\'3.828"N 14°22\'38.712"E');
  });
  it('geocodes lat/lon pairs using N/W with degrees/mins/secs', () => {
    expected = L.latLng(50.06773, -14.37742);
    geocode('N 50° 4\' 03.828" W 14° 22\' 38.712"');
    geocode('N 50° 4\' 03.828", W 14° 22\' 38.712"');
    geocode('N 50° 4′ 03.828″, W 14° 22′ 38.712″');
    geocode('N50 4 03.828 W14 22 38.712');
    geocode('N50 4 03.828, W14 22 38.712');
    geocode('50°4\'3.828"N 14°22\'38.712"W');
  });
  it('geocodes lat/lon pairs using S/E with degrees/mins/secs', () => {
    expected = L.latLng(-50.06773, 14.37742);
    geocode('S 50° 4\' 03.828" E 14° 22\' 38.712"');
    geocode('S 50° 4\' 03.828", E 14° 22\' 38.712"');
    geocode('S 50° 4′ 03.828″, E 14° 22′ 38.712″');
    geocode('S50 4 03.828 E14 22 38.712');
    geocode('S50 4 03.828, E14 22 38.712');
    geocode('50°4\'3.828"S 14°22\'38.712"E');
  });
  it('geocodes lat/lon pairs using S/W with degrees/mins/secs', () => {
    expected = L.latLng(-50.06773, -14.37742);
    geocode('S 50° 4\' 03.828" W 14° 22\' 38.712"');
    geocode('S 50° 4\' 03.828", W 14° 22\' 38.712"');
    geocode('S 50° 4′ 03.828″, W 14° 22′ 38.712″');
    geocode('S50 4 03.828 W14 22 38.712');
    geocode('S50 4 03.828, W14 22 38.712');
    geocode('50°4\'3.828"S 14°22\'38.712"W');
  });

  function geocode(query) {
    const geocoder = new LatLng();
    const callback = jest.fn();
    geocoder.geocode(query, callback);
    expect(callback).toBeCalledTimes(1);
    const feature = callback.mock.calls[0][0][0];
    expect(feature.name).toBe(query);
    expect(feature.center.lat).toBeCloseTo(expected.lat);
    expect(feature.center.lng).toBeCloseTo(expected.lng);
  }
});