Added flatbuffers support to Table service cucumber tests
This commit is contained in:
		
							parent
							
								
									6214f16552
								
							
						
					
					
						commit
						50a1c8a08d
					
				| @ -1,27 +1,38 @@ | ||||
| var util = require('util'); | ||||
| 
 | ||||
| var flatbuffers = require('../support/flatbuffers').flatbuffers; | ||||
| var FBResult = require('../support/fbresult_generated').osrm.engine.api.fbresult.FBResult; | ||||
| 
 | ||||
| module.exports = function () { | ||||
|     const durationsRegex = new RegExp(/^I request a travel time matrix I should get$/); | ||||
|     const distancesRegex = new RegExp(/^I request a travel distance matrix I should get$/); | ||||
|     const estimatesRegex = new RegExp(/^I request a travel time matrix I should get estimates for$/); | ||||
|     const durationsRegexFb = new RegExp(/^I request a travel time matrix with flatbuffers I should get$/); | ||||
|     const distancesRegexFb = new RegExp(/^I request a travel distance matrix with flatbuffers I should get$/); | ||||
| 
 | ||||
|     const DURATIONS_NO_ROUTE = 2147483647;     // MAX_INT
 | ||||
|     const DISTANCES_NO_ROUTE = 3.40282e+38;    // MAX_FLOAT
 | ||||
| 
 | ||||
|     this.When(durationsRegex, function(table, callback) {tableParse.call(this, table, DURATIONS_NO_ROUTE, 'durations', callback);}.bind(this)); | ||||
|     this.When(distancesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'distances', callback);}.bind(this)); | ||||
|     this.When(estimatesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'fallback_speed_cells', callback);}.bind(this)); | ||||
|     const FORMAT_JSON = 'json'; | ||||
|     const FORMAT_FB = 'flatbuffers'; | ||||
| 
 | ||||
|     this.When(durationsRegex, function(table, callback) {tableParse.call(this, table, DURATIONS_NO_ROUTE, 'durations', FORMAT_JSON, callback);}.bind(this)); | ||||
|     this.When(distancesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'distances', FORMAT_JSON, callback);}.bind(this)); | ||||
|     this.When(estimatesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'fallback_speed_cells', FORMAT_JSON, callback);}.bind(this)); | ||||
|     this.When(durationsRegexFb, function(table, callback) {tableParse.call(this, table, DURATIONS_NO_ROUTE, 'durations', FORMAT_FB, callback);}.bind(this)); | ||||
|     this.When(distancesRegexFb, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'distances', FORMAT_FB, callback);}.bind(this)); | ||||
| }; | ||||
| 
 | ||||
| const durationsParse = function(v) { return isNaN(parseInt(v)); }; | ||||
| const distancesParse = function(v) { return isNaN(parseFloat(v)); }; | ||||
| const estimatesParse = function(v) { return isNaN(parseFloat(v)); }; | ||||
| 
 | ||||
| function tableParse(table, noRoute, annotation, callback) { | ||||
| function tableParse(table, noRoute, annotation, format, callback) { | ||||
| 
 | ||||
|     const parse = annotation == 'distances' ? distancesParse : (annotation == 'durations' ? durationsParse : estimatesParse); | ||||
|     const params = this.queryParams; | ||||
|     params.annotations = ['durations','fallback_speed_cells'].indexOf(annotation) !== -1 ? 'duration' : 'distance'; | ||||
|     params.output = format; | ||||
| 
 | ||||
|     var tableRows = table.raw(); | ||||
| 
 | ||||
| @ -62,27 +73,53 @@ function tableParse(table, noRoute, annotation, callback) { | ||||
|             if (err) return callback(err); | ||||
|             if (!response.body.length) return callback(new Error('Invalid response body')); | ||||
| 
 | ||||
|             var json = JSON.parse(response.body); | ||||
|             var result = []; | ||||
|             if (format === 'json') { | ||||
|                 var json = JSON.parse(response.body); | ||||
| 
 | ||||
|             var result = {}; | ||||
|             if (annotation === 'fallback_speed_cells') { | ||||
|                 result = table.raw().map(row => row.map(() => '')); | ||||
|                 json[annotation].forEach(pair => { | ||||
|                     result[pair[0]+1][pair[1]+1] = 'Y'; | ||||
|                 }); | ||||
|                 result = result.slice(1).map(row => { | ||||
|                     var hashes = {}; | ||||
|                     row.slice(1).forEach((v,i) => { | ||||
|                         hashes[tableRows[0][i+1]] = v; | ||||
|                 if (annotation === 'fallback_speed_cells') { | ||||
|                     result = table.raw().map(row => row.map(() => '')); | ||||
|                     json[annotation].forEach(pair => { | ||||
|                         result[pair[0]+1][pair[1]+1] = 'Y'; | ||||
|                     }); | ||||
|                     return hashes; | ||||
|                 }); | ||||
|             } else { | ||||
|                 result = json[annotation].map(row => { | ||||
|                     var hashes = {}; | ||||
|                     row.forEach((v, i) => { hashes[tableRows[0][i+1]] = parse(v) ? '' : v; }); | ||||
|                     return hashes; | ||||
|                 }); | ||||
|                     result = result.slice(1).map(row => { | ||||
|                         var hashes = {}; | ||||
|                         row.slice(1).forEach((v,i) => { | ||||
|                             hashes[tableRows[0][i+1]] = v; | ||||
|                         }); | ||||
|                         return hashes; | ||||
|                     }); | ||||
|                 } else { | ||||
|                     result = json[annotation].map(row => { | ||||
|                         var hashes = {}; | ||||
|                         row.forEach((v, i) => { hashes[tableRows[0][i+1]] = parse(v) ? '' : v; }); | ||||
|                         return hashes; | ||||
|                     }); | ||||
|                 } | ||||
|             } else { //flatbuffers
 | ||||
|                 var body = response.body; | ||||
|                 var bytes = new Uint8Array(body.length); | ||||
|                 for (var indx = 0; indx < body.length; ++indx) { | ||||
|                     bytes[indx] = body.charCodeAt(indx); | ||||
|                 } | ||||
|                 var buf = new flatbuffers.ByteBuffer(bytes); | ||||
|                 var fb = FBResult.getRootAsFBResult(buf); | ||||
| 
 | ||||
|                 var matrix; | ||||
|                 if (annotation === 'durations') { | ||||
|                     matrix = fb.table().durationsArray(); | ||||
|                 } | ||||
|                 if (annotation === 'distances') { | ||||
|                     matrix = fb.table().distancesArray(); | ||||
|                 } | ||||
|                 var cols = fb.table().cols(); | ||||
|                 var rows = fb.table().rows(); | ||||
|                 for (let r = 0; r < rows; ++r) { | ||||
|                     result[r]={}; | ||||
|                     for(let c=0; c < cols; ++c) { | ||||
|                         result[r][tableRows[0][c+1]] = matrix[r*cols + c]; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             var testRow = (row, ri, cb) => { | ||||
|  | ||||
| @ -21,6 +21,21 @@ Feature: Basic Duration Matrix | ||||
|             | a | 0  | 10 | | ||||
|             | b | 10 | 0  | | ||||
| 
 | ||||
|     Scenario: Testbot - Travel time matrix of minimal network requested with flatbuffer format | ||||
|         Given the node map | ||||
|             """ | ||||
|             a b | ||||
|             """ | ||||
| 
 | ||||
|         And the ways | ||||
|             | nodes | | ||||
|             | ab    | | ||||
| 
 | ||||
|         When I request a travel time matrix with flatbuffers I should get | ||||
|             |   | a  | b  | | ||||
|             | a | 0  | 10 | | ||||
|             | b | 10 | 0  | | ||||
| 
 | ||||
|     @ch | ||||
|     Scenario: Testbot - Travel time matrix of minimal network with toll exclude | ||||
|         Given the query options | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user