minotor 1.0.6 → 2.0.0
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.
- package/CHANGELOG.md +9 -3
- package/README.md +3 -2
- package/dist/cli.mjs +604 -531
- package/dist/cli.mjs.map +1 -1
- package/dist/gtfs/stops.d.ts +19 -5
- package/dist/gtfs/transfers.d.ts +5 -4
- package/dist/gtfs/trips.d.ts +7 -5
- package/dist/gtfs/utils.d.ts +7 -8
- package/dist/parser.cjs.js +569 -501
- package/dist/parser.cjs.js.map +1 -1
- package/dist/parser.esm.js +569 -501
- package/dist/parser.esm.js.map +1 -1
- package/dist/router.cjs.js +1 -1
- package/dist/router.cjs.js.map +1 -1
- package/dist/router.d.ts +3 -3
- package/dist/router.esm.js +1 -1
- package/dist/router.esm.js.map +1 -1
- package/dist/router.umd.js +1 -1
- package/dist/router.umd.js.map +1 -1
- package/dist/routing/__tests__/route.test.d.ts +1 -0
- package/dist/routing/query.d.ts +7 -7
- package/dist/routing/result.d.ts +3 -3
- package/dist/routing/route.d.ts +1 -0
- package/dist/stops/proto/stops.d.ts +5 -4
- package/dist/stops/stops.d.ts +10 -1
- package/dist/stops/stopsIndex.d.ts +21 -4
- package/dist/timetable/proto/timetable.d.ts +21 -18
- package/dist/timetable/timetable.d.ts +38 -14
- package/package.json +4 -3
- package/src/cli/repl.ts +13 -10
- package/src/gtfs/__tests__/parser.test.ts +50 -579
- package/src/gtfs/__tests__/stops.test.ts +181 -112
- package/src/gtfs/__tests__/transfers.test.ts +170 -12
- package/src/gtfs/__tests__/trips.test.ts +212 -141
- package/src/gtfs/__tests__/utils.test.ts +4 -4
- package/src/gtfs/parser.ts +22 -13
- package/src/gtfs/stops.ts +63 -28
- package/src/gtfs/transfers.ts +14 -6
- package/src/gtfs/trips.ts +110 -47
- package/src/gtfs/utils.ts +11 -11
- package/src/router.ts +2 -4
- package/src/routing/__tests__/route.test.ts +112 -0
- package/src/routing/__tests__/router.test.ts +234 -244
- package/src/routing/query.ts +7 -7
- package/src/routing/result.ts +9 -6
- package/src/routing/route.ts +11 -0
- package/src/routing/router.ts +26 -24
- package/src/stops/__tests__/io.test.ts +9 -8
- package/src/stops/__tests__/stopFinder.test.ts +45 -36
- package/src/stops/io.ts +8 -5
- package/src/stops/proto/stops.proto +8 -7
- package/src/stops/proto/stops.ts +68 -38
- package/src/stops/stops.ts +13 -1
- package/src/stops/stopsIndex.ts +50 -7
- package/src/timetable/__tests__/io.test.ts +40 -49
- package/src/timetable/__tests__/timetable.test.ts +50 -58
- package/src/timetable/io.ts +69 -56
- package/src/timetable/proto/timetable.proto +22 -17
- package/src/timetable/proto/timetable.ts +94 -184
- package/src/timetable/timetable.ts +62 -29
|
@@ -22,40 +22,36 @@ describe('Router', () => {
|
|
|
22
22
|
|
|
23
23
|
beforeEach(() => {
|
|
24
24
|
const stopsAdjacency: StopsAdjacency = new Map([
|
|
25
|
-
[
|
|
26
|
-
[
|
|
27
|
-
[
|
|
25
|
+
[0, { transfers: [], routes: ['route1'] }],
|
|
26
|
+
[1, { transfers: [], routes: ['route1'] }],
|
|
27
|
+
[2, { transfers: [], routes: ['route1'] }],
|
|
28
28
|
]);
|
|
29
29
|
|
|
30
30
|
const routesAdjacency: RoutesAdjacency = new Map([
|
|
31
31
|
[
|
|
32
32
|
'route1',
|
|
33
33
|
{
|
|
34
|
-
stopTimes: [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
dropOffType: 'REGULAR',
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
stops: ['stop1', 'stop2', 'stop3'],
|
|
34
|
+
stopTimes: new Uint32Array([
|
|
35
|
+
Time.fromString('08:00:00').toSeconds(),
|
|
36
|
+
Time.fromString('08:10:00').toSeconds(),
|
|
37
|
+
Time.fromString('08:15:00').toSeconds(),
|
|
38
|
+
Time.fromString('08:25:00').toSeconds(),
|
|
39
|
+
Time.fromString('08:35:00').toSeconds(),
|
|
40
|
+
Time.fromString('08:45:00').toSeconds(),
|
|
41
|
+
]),
|
|
42
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
43
|
+
0,
|
|
44
|
+
0, // REGULAR
|
|
45
|
+
0,
|
|
46
|
+
0, // REGULAR
|
|
47
|
+
0,
|
|
48
|
+
0, // REGULAR
|
|
49
|
+
]),
|
|
50
|
+
stops: new Uint32Array([0, 1, 2]),
|
|
55
51
|
stopIndices: new Map([
|
|
56
|
-
[
|
|
57
|
-
[
|
|
58
|
-
[
|
|
52
|
+
[0, 0],
|
|
53
|
+
[1, 1],
|
|
54
|
+
[2, 2],
|
|
59
55
|
]),
|
|
60
56
|
serviceRouteId: 'service_route1',
|
|
61
57
|
},
|
|
@@ -75,9 +71,10 @@ describe('Router', () => {
|
|
|
75
71
|
timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
|
|
76
72
|
const stopsMap: StopsMap = new Map([
|
|
77
73
|
[
|
|
78
|
-
|
|
74
|
+
0,
|
|
79
75
|
{
|
|
80
|
-
id:
|
|
76
|
+
id: 0,
|
|
77
|
+
sourceStopId: 'stop1',
|
|
81
78
|
name: 'Stop 1',
|
|
82
79
|
lat: 1.0,
|
|
83
80
|
lon: 1.0,
|
|
@@ -86,9 +83,10 @@ describe('Router', () => {
|
|
|
86
83
|
},
|
|
87
84
|
],
|
|
88
85
|
[
|
|
89
|
-
|
|
86
|
+
1,
|
|
90
87
|
{
|
|
91
|
-
id:
|
|
88
|
+
id: 1,
|
|
89
|
+
sourceStopId: 'stop2',
|
|
92
90
|
name: 'Stop 2',
|
|
93
91
|
lat: 2.0,
|
|
94
92
|
lon: 2.0,
|
|
@@ -97,9 +95,10 @@ describe('Router', () => {
|
|
|
97
95
|
},
|
|
98
96
|
],
|
|
99
97
|
[
|
|
100
|
-
|
|
98
|
+
2,
|
|
101
99
|
{
|
|
102
|
-
id:
|
|
100
|
+
id: 2,
|
|
101
|
+
sourceStopId: 'stop3',
|
|
103
102
|
name: 'Stop 3',
|
|
104
103
|
lat: 3.0,
|
|
105
104
|
lon: 3.0,
|
|
@@ -159,42 +158,37 @@ describe('Router', () => {
|
|
|
159
158
|
|
|
160
159
|
beforeEach(() => {
|
|
161
160
|
const stopsAdjacency: StopsAdjacency = new Map([
|
|
162
|
-
[
|
|
163
|
-
[
|
|
164
|
-
[
|
|
165
|
-
[
|
|
166
|
-
[
|
|
161
|
+
[0, { transfers: [], routes: ['route1'] }],
|
|
162
|
+
[1, { transfers: [], routes: ['route1', 'route2'] }],
|
|
163
|
+
[2, { transfers: [], routes: ['route1'] }],
|
|
164
|
+
[3, { transfers: [], routes: ['route2'] }],
|
|
165
|
+
[4, { transfers: [], routes: ['route2'] }],
|
|
167
166
|
]);
|
|
168
|
-
|
|
169
167
|
const routesAdjacency: RoutesAdjacency = new Map([
|
|
170
168
|
[
|
|
171
169
|
'route1',
|
|
172
170
|
{
|
|
173
|
-
stopTimes: [
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
dropOffType: 'REGULAR',
|
|
191
|
-
},
|
|
192
|
-
],
|
|
193
|
-
stops: ['stop1', 'stop2', 'stop3'],
|
|
171
|
+
stopTimes: new Uint32Array([
|
|
172
|
+
Time.fromString('08:00:00').toSeconds(),
|
|
173
|
+
Time.fromString('08:15:00').toSeconds(),
|
|
174
|
+
Time.fromString('08:30:00').toSeconds(),
|
|
175
|
+
Time.fromString('08:45:00').toSeconds(),
|
|
176
|
+
Time.fromString('09:00:00').toSeconds(),
|
|
177
|
+
Time.fromString('09:10:00').toSeconds(),
|
|
178
|
+
]),
|
|
179
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
180
|
+
0, // REGULAR
|
|
181
|
+
0, // REGULAR
|
|
182
|
+
0, // REGULAR
|
|
183
|
+
0, // REGULAR
|
|
184
|
+
0, // REGULAR
|
|
185
|
+
0, // REGULAR
|
|
186
|
+
]),
|
|
187
|
+
stops: new Uint32Array([0, 1, 2]),
|
|
194
188
|
stopIndices: new Map([
|
|
195
|
-
[
|
|
196
|
-
[
|
|
197
|
-
[
|
|
189
|
+
[0, 0],
|
|
190
|
+
[1, 1],
|
|
191
|
+
[2, 2],
|
|
198
192
|
]),
|
|
199
193
|
serviceRouteId: 'service_route1',
|
|
200
194
|
},
|
|
@@ -202,31 +196,27 @@ describe('Router', () => {
|
|
|
202
196
|
[
|
|
203
197
|
'route2',
|
|
204
198
|
{
|
|
205
|
-
stopTimes: [
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
dropOffType: 'REGULAR',
|
|
223
|
-
},
|
|
224
|
-
],
|
|
225
|
-
stops: ['stop4', 'stop2', 'stop5'],
|
|
199
|
+
stopTimes: new Uint32Array([
|
|
200
|
+
Time.fromString('08:05:00').toSeconds(),
|
|
201
|
+
Time.fromString('08:20:00').toSeconds(),
|
|
202
|
+
Time.fromString('09:00:00').toSeconds(),
|
|
203
|
+
Time.fromString('09:15:00').toSeconds(),
|
|
204
|
+
Time.fromString('09:20:00').toSeconds(),
|
|
205
|
+
Time.fromString('09:35:00').toSeconds(),
|
|
206
|
+
]),
|
|
207
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
208
|
+
0, // REGULAR
|
|
209
|
+
0, // REGULAR
|
|
210
|
+
0, // REGULAR
|
|
211
|
+
0, // REGULAR
|
|
212
|
+
0, // REGULAR
|
|
213
|
+
0, // REGULAR
|
|
214
|
+
]),
|
|
215
|
+
stops: new Uint32Array([3, 1, 4]),
|
|
226
216
|
stopIndices: new Map([
|
|
227
|
-
[
|
|
228
|
-
[
|
|
229
|
-
[
|
|
217
|
+
[3, 0],
|
|
218
|
+
[1, 1],
|
|
219
|
+
[4, 2],
|
|
230
220
|
]),
|
|
231
221
|
serviceRouteId: 'service_route2',
|
|
232
222
|
},
|
|
@@ -251,11 +241,13 @@ describe('Router', () => {
|
|
|
251
241
|
]);
|
|
252
242
|
|
|
253
243
|
timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
|
|
244
|
+
|
|
254
245
|
const stopsMap: StopsMap = new Map([
|
|
255
246
|
[
|
|
256
|
-
|
|
247
|
+
0,
|
|
257
248
|
{
|
|
258
|
-
id:
|
|
249
|
+
id: 0,
|
|
250
|
+
sourceStopId: 'stop1',
|
|
259
251
|
name: 'Stop 1',
|
|
260
252
|
lat: 1.0,
|
|
261
253
|
lon: 1.0,
|
|
@@ -264,9 +256,10 @@ describe('Router', () => {
|
|
|
264
256
|
},
|
|
265
257
|
],
|
|
266
258
|
[
|
|
267
|
-
|
|
259
|
+
1,
|
|
268
260
|
{
|
|
269
|
-
id:
|
|
261
|
+
id: 1,
|
|
262
|
+
sourceStopId: 'stop2',
|
|
270
263
|
name: 'Stop 2',
|
|
271
264
|
lat: 2.0,
|
|
272
265
|
lon: 2.0,
|
|
@@ -275,9 +268,10 @@ describe('Router', () => {
|
|
|
275
268
|
},
|
|
276
269
|
],
|
|
277
270
|
[
|
|
278
|
-
|
|
271
|
+
2,
|
|
279
272
|
{
|
|
280
|
-
id:
|
|
273
|
+
id: 2,
|
|
274
|
+
sourceStopId: 'stop3',
|
|
281
275
|
name: 'Stop 3',
|
|
282
276
|
lat: 3.0,
|
|
283
277
|
lon: 3.0,
|
|
@@ -286,9 +280,10 @@ describe('Router', () => {
|
|
|
286
280
|
},
|
|
287
281
|
],
|
|
288
282
|
[
|
|
289
|
-
|
|
283
|
+
3,
|
|
290
284
|
{
|
|
291
|
-
id:
|
|
285
|
+
id: 3,
|
|
286
|
+
sourceStopId: 'stop4',
|
|
292
287
|
name: 'Stop 4',
|
|
293
288
|
lat: 4.0,
|
|
294
289
|
lon: 4.0,
|
|
@@ -297,9 +292,10 @@ describe('Router', () => {
|
|
|
297
292
|
},
|
|
298
293
|
],
|
|
299
294
|
[
|
|
300
|
-
|
|
295
|
+
4,
|
|
301
296
|
{
|
|
302
|
-
id:
|
|
297
|
+
id: 4,
|
|
298
|
+
sourceStopId: 'stop5',
|
|
303
299
|
name: 'Stop 5',
|
|
304
300
|
lat: 5.0,
|
|
305
301
|
lon: 5.0,
|
|
@@ -308,6 +304,7 @@ describe('Router', () => {
|
|
|
308
304
|
},
|
|
309
305
|
],
|
|
310
306
|
]);
|
|
307
|
+
|
|
311
308
|
const stopsIndex = new StopsIndex(stopsMap);
|
|
312
309
|
router = new Router(timetable, stopsIndex);
|
|
313
310
|
});
|
|
@@ -347,13 +344,13 @@ describe('Router', () => {
|
|
|
347
344
|
|
|
348
345
|
beforeEach(() => {
|
|
349
346
|
const stopsAdjacency: StopsAdjacency = new Map([
|
|
350
|
-
[
|
|
347
|
+
[0, { transfers: [], routes: ['route1'] }],
|
|
351
348
|
[
|
|
352
|
-
|
|
349
|
+
1,
|
|
353
350
|
{
|
|
354
351
|
transfers: [
|
|
355
352
|
{
|
|
356
|
-
destination:
|
|
353
|
+
destination: 4,
|
|
357
354
|
type: 'REQUIRES_MINIMAL_TIME',
|
|
358
355
|
minTransferTime: Duration.fromSeconds(300),
|
|
359
356
|
},
|
|
@@ -361,41 +358,37 @@ describe('Router', () => {
|
|
|
361
358
|
routes: ['route1'],
|
|
362
359
|
},
|
|
363
360
|
],
|
|
364
|
-
[
|
|
365
|
-
[
|
|
366
|
-
[
|
|
367
|
-
[
|
|
361
|
+
[2, { transfers: [], routes: ['route1'] }],
|
|
362
|
+
[3, { transfers: [], routes: ['route2'] }],
|
|
363
|
+
[4, { transfers: [], routes: ['route2'] }],
|
|
364
|
+
[5, { transfers: [], routes: ['route2'] }],
|
|
368
365
|
]);
|
|
369
366
|
|
|
370
367
|
const routesAdjacency: RoutesAdjacency = new Map([
|
|
371
368
|
[
|
|
372
369
|
'route1',
|
|
373
370
|
{
|
|
374
|
-
stopTimes: [
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
dropOffType: 'REGULAR',
|
|
392
|
-
},
|
|
393
|
-
],
|
|
394
|
-
stops: ['stop1', 'stop2', 'stop3'],
|
|
371
|
+
stopTimes: new Uint32Array([
|
|
372
|
+
Time.fromString('08:00:00').toSeconds(),
|
|
373
|
+
Time.fromString('08:15:00').toSeconds(),
|
|
374
|
+
Time.fromString('08:25:00').toSeconds(),
|
|
375
|
+
Time.fromString('08:35:00').toSeconds(),
|
|
376
|
+
Time.fromString('08:45:00').toSeconds(),
|
|
377
|
+
Time.fromString('08:55:00').toSeconds(),
|
|
378
|
+
]),
|
|
379
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
380
|
+
0, // REGULAR
|
|
381
|
+
0, // REGULAR
|
|
382
|
+
0, // REGULAR
|
|
383
|
+
0, // REGULAR
|
|
384
|
+
0, // REGULAR
|
|
385
|
+
0, // REGULAR
|
|
386
|
+
]),
|
|
387
|
+
stops: new Uint32Array([0, 1, 2]),
|
|
395
388
|
stopIndices: new Map([
|
|
396
|
-
[
|
|
397
|
-
[
|
|
398
|
-
[
|
|
389
|
+
[0, 0],
|
|
390
|
+
[1, 1],
|
|
391
|
+
[2, 2],
|
|
399
392
|
]),
|
|
400
393
|
serviceRouteId: 'service_route1',
|
|
401
394
|
},
|
|
@@ -403,31 +396,27 @@ describe('Router', () => {
|
|
|
403
396
|
[
|
|
404
397
|
'route2',
|
|
405
398
|
{
|
|
406
|
-
stopTimes: [
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
dropOffType: 'REGULAR',
|
|
424
|
-
},
|
|
425
|
-
],
|
|
426
|
-
stops: ['stop4', 'stop5', 'stop6'],
|
|
399
|
+
stopTimes: new Uint32Array([
|
|
400
|
+
Time.fromString('08:10:00').toSeconds(),
|
|
401
|
+
Time.fromString('08:20:00').toSeconds(),
|
|
402
|
+
Time.fromString('08:40:00').toSeconds(),
|
|
403
|
+
Time.fromString('08:50:00').toSeconds(),
|
|
404
|
+
Time.fromString('09:00:00').toSeconds(),
|
|
405
|
+
Time.fromString('09:10:00').toSeconds(),
|
|
406
|
+
]),
|
|
407
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
408
|
+
0, // REGULAR
|
|
409
|
+
0, // REGULAR
|
|
410
|
+
0, // REGULAR
|
|
411
|
+
0, // REGULAR
|
|
412
|
+
0, // REGULAR
|
|
413
|
+
0, // REGULAR
|
|
414
|
+
]),
|
|
415
|
+
stops: new Uint32Array([3, 4, 5]),
|
|
427
416
|
stopIndices: new Map([
|
|
428
|
-
[
|
|
429
|
-
[
|
|
430
|
-
[
|
|
417
|
+
[3, 0],
|
|
418
|
+
[4, 1],
|
|
419
|
+
[5, 2],
|
|
431
420
|
]),
|
|
432
421
|
serviceRouteId: 'service_route2',
|
|
433
422
|
},
|
|
@@ -454,9 +443,10 @@ describe('Router', () => {
|
|
|
454
443
|
timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
|
|
455
444
|
const stopsMap: StopsMap = new Map([
|
|
456
445
|
[
|
|
457
|
-
|
|
446
|
+
0,
|
|
458
447
|
{
|
|
459
|
-
id:
|
|
448
|
+
id: 0,
|
|
449
|
+
sourceStopId: 'stop1',
|
|
460
450
|
name: 'Stop 1',
|
|
461
451
|
lat: 1.0,
|
|
462
452
|
lon: 1.0,
|
|
@@ -465,9 +455,10 @@ describe('Router', () => {
|
|
|
465
455
|
},
|
|
466
456
|
],
|
|
467
457
|
[
|
|
468
|
-
|
|
458
|
+
1,
|
|
469
459
|
{
|
|
470
|
-
id:
|
|
460
|
+
id: 1,
|
|
461
|
+
sourceStopId: 'stop2',
|
|
471
462
|
name: 'Stop 2',
|
|
472
463
|
lat: 2.0,
|
|
473
464
|
lon: 2.0,
|
|
@@ -476,9 +467,10 @@ describe('Router', () => {
|
|
|
476
467
|
},
|
|
477
468
|
],
|
|
478
469
|
[
|
|
479
|
-
|
|
470
|
+
2,
|
|
480
471
|
{
|
|
481
|
-
id:
|
|
472
|
+
id: 2,
|
|
473
|
+
sourceStopId: 'stop3',
|
|
482
474
|
name: 'Stop 3',
|
|
483
475
|
lat: 3.0,
|
|
484
476
|
lon: 3.0,
|
|
@@ -487,9 +479,10 @@ describe('Router', () => {
|
|
|
487
479
|
},
|
|
488
480
|
],
|
|
489
481
|
[
|
|
490
|
-
|
|
482
|
+
3,
|
|
491
483
|
{
|
|
492
|
-
id:
|
|
484
|
+
id: 3,
|
|
485
|
+
sourceStopId: 'stop4',
|
|
493
486
|
name: 'Stop 4',
|
|
494
487
|
lat: 4.0,
|
|
495
488
|
lon: 4.0,
|
|
@@ -498,9 +491,10 @@ describe('Router', () => {
|
|
|
498
491
|
},
|
|
499
492
|
],
|
|
500
493
|
[
|
|
501
|
-
|
|
494
|
+
4,
|
|
502
495
|
{
|
|
503
|
-
id:
|
|
496
|
+
id: 4,
|
|
497
|
+
sourceStopId: 'stop5',
|
|
504
498
|
name: 'Stop 5',
|
|
505
499
|
lat: 5.0,
|
|
506
500
|
lon: 5.0,
|
|
@@ -509,9 +503,10 @@ describe('Router', () => {
|
|
|
509
503
|
},
|
|
510
504
|
],
|
|
511
505
|
[
|
|
512
|
-
|
|
506
|
+
5,
|
|
513
507
|
{
|
|
514
|
-
id:
|
|
508
|
+
id: 5,
|
|
509
|
+
sourceStopId: 'stop6',
|
|
515
510
|
name: 'Stop 6',
|
|
516
511
|
lat: 6.0,
|
|
517
512
|
lon: 6.0,
|
|
@@ -559,42 +554,38 @@ describe('Router', () => {
|
|
|
559
554
|
|
|
560
555
|
beforeEach(() => {
|
|
561
556
|
const stopsAdjacency: StopsAdjacency = new Map([
|
|
562
|
-
[
|
|
563
|
-
[
|
|
564
|
-
[
|
|
565
|
-
[
|
|
566
|
-
[
|
|
557
|
+
[0, { transfers: [], routes: ['route1'] }],
|
|
558
|
+
[1, { transfers: [], routes: ['route1', 'route2'] }],
|
|
559
|
+
[2, { transfers: [], routes: ['route1'] }],
|
|
560
|
+
[3, { transfers: [], routes: ['route2'] }],
|
|
561
|
+
[4, { transfers: [], routes: ['route2'] }],
|
|
567
562
|
]);
|
|
568
563
|
|
|
569
564
|
const routesAdjacency: RoutesAdjacency = new Map([
|
|
570
565
|
[
|
|
571
566
|
'route1',
|
|
572
567
|
{
|
|
573
|
-
stopTimes: [
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
dropOffType: 'REGULAR',
|
|
591
|
-
},
|
|
592
|
-
],
|
|
593
|
-
stops: ['stop1', 'stop2', 'stop3'],
|
|
568
|
+
stopTimes: new Uint32Array([
|
|
569
|
+
Time.fromString('08:00:00').toSeconds(),
|
|
570
|
+
Time.fromString('08:15:00').toSeconds(),
|
|
571
|
+
Time.fromString('08:30:00').toSeconds(),
|
|
572
|
+
Time.fromString('08:45:00').toSeconds(),
|
|
573
|
+
Time.fromString('09:00:00').toSeconds(),
|
|
574
|
+
Time.fromString('09:15:00').toSeconds(),
|
|
575
|
+
]),
|
|
576
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
577
|
+
0, // REGULAR
|
|
578
|
+
0, // REGULAR
|
|
579
|
+
0, // REGULAR
|
|
580
|
+
0, // REGULAR
|
|
581
|
+
0, // REGULAR
|
|
582
|
+
0, // REGULAR
|
|
583
|
+
]),
|
|
584
|
+
stops: new Uint32Array([0, 1, 2]),
|
|
594
585
|
stopIndices: new Map([
|
|
595
|
-
[
|
|
596
|
-
[
|
|
597
|
-
[
|
|
586
|
+
[0, 0],
|
|
587
|
+
[1, 1],
|
|
588
|
+
[2, 2],
|
|
598
589
|
]),
|
|
599
590
|
serviceRouteId: 'service_route1',
|
|
600
591
|
},
|
|
@@ -602,31 +593,27 @@ describe('Router', () => {
|
|
|
602
593
|
[
|
|
603
594
|
'route2',
|
|
604
595
|
{
|
|
605
|
-
stopTimes: [
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
dropOffType: 'REGULAR',
|
|
623
|
-
},
|
|
624
|
-
],
|
|
625
|
-
stops: ['stop4', 'stop2', 'stop5'],
|
|
596
|
+
stopTimes: new Uint32Array([
|
|
597
|
+
Time.fromString('08:10:00').toSeconds(),
|
|
598
|
+
Time.fromString('08:25:00').toSeconds(),
|
|
599
|
+
Time.fromString('08:50:00').toSeconds(),
|
|
600
|
+
Time.fromString('09:05:00').toSeconds(),
|
|
601
|
+
Time.fromString('09:10:00').toSeconds(),
|
|
602
|
+
Time.fromString('09:25:00').toSeconds(),
|
|
603
|
+
]),
|
|
604
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
605
|
+
0, // REGULAR
|
|
606
|
+
0, // REGULAR
|
|
607
|
+
0, // REGULAR
|
|
608
|
+
0, // REGULAR
|
|
609
|
+
0, // REGULAR
|
|
610
|
+
0, // REGULAR
|
|
611
|
+
]),
|
|
612
|
+
stops: new Uint32Array([3, 1, 4]),
|
|
626
613
|
stopIndices: new Map([
|
|
627
|
-
[
|
|
628
|
-
[
|
|
629
|
-
[
|
|
614
|
+
[3, 0],
|
|
615
|
+
[1, 1],
|
|
616
|
+
[4, 2],
|
|
630
617
|
]),
|
|
631
618
|
serviceRouteId: 'service_route2',
|
|
632
619
|
},
|
|
@@ -634,24 +621,22 @@ describe('Router', () => {
|
|
|
634
621
|
[
|
|
635
622
|
'route3',
|
|
636
623
|
{
|
|
637
|
-
stopTimes: [
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
],
|
|
651
|
-
stops: ['stop1', 'stop5'],
|
|
624
|
+
stopTimes: new Uint32Array([
|
|
625
|
+
Time.fromString('08:00:00').toSeconds(),
|
|
626
|
+
Time.fromString('08:15:00').toSeconds(),
|
|
627
|
+
Time.fromString('09:45:00').toSeconds(),
|
|
628
|
+
Time.fromString('10:00:00').toSeconds(),
|
|
629
|
+
]),
|
|
630
|
+
pickUpDropOffTypes: new Uint8Array([
|
|
631
|
+
0, // REGULAR
|
|
632
|
+
0, // REGULAR
|
|
633
|
+
0, // REGULAR
|
|
634
|
+
0, // REGULAR
|
|
635
|
+
]),
|
|
636
|
+
stops: new Uint32Array([0, 4]),
|
|
652
637
|
stopIndices: new Map([
|
|
653
|
-
[
|
|
654
|
-
[
|
|
638
|
+
[0, 0],
|
|
639
|
+
[4, 1],
|
|
655
640
|
]),
|
|
656
641
|
serviceRouteId: 'service_route3',
|
|
657
642
|
},
|
|
@@ -685,9 +670,10 @@ describe('Router', () => {
|
|
|
685
670
|
timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
|
|
686
671
|
const stopsMap: StopsMap = new Map([
|
|
687
672
|
[
|
|
688
|
-
|
|
673
|
+
0,
|
|
689
674
|
{
|
|
690
|
-
id:
|
|
675
|
+
id: 0,
|
|
676
|
+
sourceStopId: 'stop1',
|
|
691
677
|
name: 'Stop 1',
|
|
692
678
|
lat: 1.0,
|
|
693
679
|
lon: 1.0,
|
|
@@ -696,9 +682,10 @@ describe('Router', () => {
|
|
|
696
682
|
},
|
|
697
683
|
],
|
|
698
684
|
[
|
|
699
|
-
|
|
685
|
+
1,
|
|
700
686
|
{
|
|
701
|
-
id:
|
|
687
|
+
id: 1,
|
|
688
|
+
sourceStopId: 'stop2',
|
|
702
689
|
name: 'Stop 2',
|
|
703
690
|
lat: 2.0,
|
|
704
691
|
lon: 2.0,
|
|
@@ -707,9 +694,10 @@ describe('Router', () => {
|
|
|
707
694
|
},
|
|
708
695
|
],
|
|
709
696
|
[
|
|
710
|
-
|
|
697
|
+
2,
|
|
711
698
|
{
|
|
712
|
-
id:
|
|
699
|
+
id: 2,
|
|
700
|
+
sourceStopId: 'stop3',
|
|
713
701
|
name: 'Stop 3',
|
|
714
702
|
lat: 3.0,
|
|
715
703
|
lon: 3.0,
|
|
@@ -718,9 +706,10 @@ describe('Router', () => {
|
|
|
718
706
|
},
|
|
719
707
|
],
|
|
720
708
|
[
|
|
721
|
-
|
|
709
|
+
3,
|
|
722
710
|
{
|
|
723
|
-
id:
|
|
711
|
+
id: 3,
|
|
712
|
+
sourceStopId: 'stop4',
|
|
724
713
|
name: 'Stop 4',
|
|
725
714
|
lat: 4.0,
|
|
726
715
|
lon: 4.0,
|
|
@@ -729,9 +718,10 @@ describe('Router', () => {
|
|
|
729
718
|
},
|
|
730
719
|
],
|
|
731
720
|
[
|
|
732
|
-
|
|
721
|
+
4,
|
|
733
722
|
{
|
|
734
|
-
id:
|
|
723
|
+
id: 4,
|
|
724
|
+
sourceStopId: 'stop5',
|
|
735
725
|
name: 'Stop 5',
|
|
736
726
|
lat: 5.0,
|
|
737
727
|
lon: 5.0,
|