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 util = require('util'); | ||||||
| 
 | 
 | ||||||
|  | var flatbuffers = require('../support/flatbuffers').flatbuffers; | ||||||
|  | var FBResult = require('../support/fbresult_generated').osrm.engine.api.fbresult.FBResult; | ||||||
|  | 
 | ||||||
| module.exports = function () { | module.exports = function () { | ||||||
|     const durationsRegex = new RegExp(/^I request a travel time matrix I should get$/); |     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 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 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 DURATIONS_NO_ROUTE = 2147483647;     // MAX_INT
 | ||||||
|     const DISTANCES_NO_ROUTE = 3.40282e+38;    // MAX_FLOAT
 |     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)); |     const FORMAT_JSON = 'json'; | ||||||
|     this.When(distancesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'distances', callback);}.bind(this)); |     const FORMAT_FB = 'flatbuffers'; | ||||||
|     this.When(estimatesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'fallback_speed_cells', callback);}.bind(this)); | 
 | ||||||
|  |     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 durationsParse = function(v) { return isNaN(parseInt(v)); }; | ||||||
| const distancesParse = function(v) { return isNaN(parseFloat(v)); }; | const distancesParse = function(v) { return isNaN(parseFloat(v)); }; | ||||||
| const estimatesParse = 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 parse = annotation == 'distances' ? distancesParse : (annotation == 'durations' ? durationsParse : estimatesParse); | ||||||
|     const params = this.queryParams; |     const params = this.queryParams; | ||||||
|     params.annotations = ['durations','fallback_speed_cells'].indexOf(annotation) !== -1 ? 'duration' : 'distance'; |     params.annotations = ['durations','fallback_speed_cells'].indexOf(annotation) !== -1 ? 'duration' : 'distance'; | ||||||
|  |     params.output = format; | ||||||
| 
 | 
 | ||||||
|     var tableRows = table.raw(); |     var tableRows = table.raw(); | ||||||
| 
 | 
 | ||||||
| @ -62,27 +73,53 @@ function tableParse(table, noRoute, annotation, callback) { | |||||||
|             if (err) return callback(err); |             if (err) return callback(err); | ||||||
|             if (!response.body.length) return callback(new Error('Invalid response body')); |             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') { | ||||||
|             if (annotation === 'fallback_speed_cells') { |                     result = table.raw().map(row => row.map(() => '')); | ||||||
|                 result = table.raw().map(row => row.map(() => '')); |                     json[annotation].forEach(pair => { | ||||||
|                 json[annotation].forEach(pair => { |                         result[pair[0]+1][pair[1]+1] = 'Y'; | ||||||
|                     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; |  | ||||||
|                     }); |                     }); | ||||||
|                     return hashes; |                     result = result.slice(1).map(row => { | ||||||
|                 }); |                         var hashes = {}; | ||||||
|             } else { |                         row.slice(1).forEach((v,i) => { | ||||||
|                 result = json[annotation].map(row => { |                             hashes[tableRows[0][i+1]] = v; | ||||||
|                     var hashes = {}; |                         }); | ||||||
|                     row.forEach((v, i) => { hashes[tableRows[0][i+1]] = parse(v) ? '' : v; }); |                         return hashes; | ||||||
|                     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) => { |             var testRow = (row, ri, cb) => { | ||||||
|  | |||||||
| @ -21,6 +21,21 @@ Feature: Basic Duration Matrix | |||||||
|             | a | 0  | 10 | |             | a | 0  | 10 | | ||||||
|             | b | 10 | 0  | |             | 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 |     @ch | ||||||
|     Scenario: Testbot - Travel time matrix of minimal network with toll exclude |     Scenario: Testbot - Travel time matrix of minimal network with toll exclude | ||||||
|         Given the query options |         Given the query options | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user