const RAM = require('random-access-memory') const eyros = { 2: require('../2d'), 3: require('../3d'), 4: require('../4d'), 5: require('../5d'), 6: require('../6d'), 7: require('../7d'), 8: require('../8d'), } const fs = require('fs') const test = require('tape') const randomBytes = require('crypto').randomBytes test('dimension sweep', async function (t) { t.plan(7) for (var n = 2; n <= 8; n++) { var db = await eyros[n]({ storage: RAM, wasmSource: fs.readFileSync(require.resolve(`../${n}d.wasm`)) }) var batch = [] for (var i = 0; i < 1000; i++) { var point = [] for (var j = 0; j < n; j++) { point.push((Math.random()*2-1)*15) } batch.push({ type: 'insert', point, value: Uint8Array.from(randomBytes(Math.floor(Math.random()*10+1))) }) } await db.batch(batch) var bbox = [] for (var j = 0; j < n; j++) bbox.push(-10) for (var j = 0; j < n; j++) bbox.push(+10) var rows = await collect(await db.query(bbox)) t.deepEqual( rows.map(row => [ round(row[0]), row[1] ]).sort(cmp), batch .filter(row => intersect(row.point, bbox)) .map(row => [ round(row.point), row.value ]) .sort(cmp) ) } }) function intersect (x, bbox) { var dim = bbox.length/2 for (var i = 0; i < dim; i++) { if (Array.isArray(x[i])) { if (x[i][0] > bbox[i+dim] || x[i][1] < bbox[i]) return false } else if (x[i] < bbox[i] || x[i] > bbox[i+dim]) { return false } } return true } function round (x) { if (Array.isArray(x)) return x.map(round) var n = 1e2 return Math.round(x*n)/n } function cmp (a, b) { return JSON.stringify(a) < JSON.stringify(b) ? -1 : +1 } async function collect (iter) { var row, rows = [] while (row = await iter.next()) { rows.push(row) } return rows }