flesh out typescript implementation [#27, #28]

This commit is contained in:
Brandon Liu
2022-02-17 11:46:39 +08:00
parent bfa8d178a6
commit faea10dd7c
2 changed files with 453 additions and 96 deletions

View File

@@ -1,83 +1,115 @@
import { test } from "zora";
import { unshift, getUint24, getUint48, getLeafdir, getTile } from "./pmtiles";
import {
unshift,
getUint24,
getUint48,
queryLeafdir,
queryTile,
Entry,
createDirectory,
} from "./pmtiles";
interface StubEntry {
z:number;
x:number;
y:number;
offset:number;
length:number;
is_dir:boolean;
}
const stubData = (entries:StubEntry[]) => {
// sort entries
let buffer = new ArrayBuffer(17*entries.length);
let arr = new Uint8Array(buffer);
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
var z = entry.z;
if (entry.is_dir) z = z | 0x80;
arr[i*17] = z;
arr[i*17+1] = entry.x & 0xFF;
arr[i*17+2] = (entry.x >> 8) & 0xFF;
arr[i*17+3] = (entry.x >> 16) & 0xFF;
``
arr[i*17+4] = entry.y & 0xFF;
arr[i*17+5] = (entry.y >> 8) & 0xFF;
arr[i*17+6] = (entry.y >> 16) & 0xFF;
arr[i*17+7] = entry.offset & 0xFF;
arr[i*17+8] = unshift(entry.offset,8) & 0xFF;
arr[i*17+9] = unshift(entry.offset,16) & 0xFF;
arr[i*17+10] = unshift(entry.offset,24) & 0xFF;
arr[i*17+11] = unshift(entry.offset,32) & 0xFF;
arr[i*17+12] = unshift(entry.offset,48) & 0xFF;
arr[i*17+13] = entry.length & 0xFF;
arr[i*17+14] = (entry.length >> 8) & 0xFF;
arr[i*17+15] = (entry.length >> 16) & 0xFF;
arr[i*17+16] = (entry.length >> 24) & 0xFF;
}
return buffer;
}
test("stub data", assertion => {
let data = stubData([
{z:5,x:1000,y:2000,offset:1000,length:2000,is_dir:false},
{z:14,x:16383,y:16383,offset:999999,length:999,is_dir:false}
test("stub data", (assertion) => {
let data = createDirectory([
{ z: 5, x: 1000, y: 2000, offset: 1000, length: 2000, is_dir: false },
{
z: 14,
x: 16383,
y: 16383,
offset: 999999,
length: 999,
is_dir: false,
},
]);
let dataview = new DataView(data);
let dataview = new DataView(data);
var z_raw = dataview.getUint8(17+0);
var x = getUint24(dataview,17+1);
var y = getUint24(dataview,17+4);
var offset = getUint48(dataview,17+7);
var length = dataview.getUint32(17+13,true);
assertion.ok(z_raw === 14);
assertion.ok(x === 16383);
assertion.ok(y === 16383);
var z_raw = dataview.getUint8(17 + 0);
var x = getUint24(dataview, 17 + 1);
var y = getUint24(dataview, 17 + 4);
var offset = getUint48(dataview, 17 + 7);
var length = dataview.getUint32(17 + 13, true);
assertion.ok(z_raw === 14);
assertion.ok(x === 16383);
assertion.ok(y === 16383);
});
test("get entry", assertion => {
let data = stubData([
{z:5,x:1000,y:2000,offset:1000,length:2000,is_dir:false},
{z:14,x:16383,y:16383,offset:999999,length:999,is_dir:false}
test("get entry", (assertion) => {
let data = createDirectory([
{ z: 5, x: 1000, y: 2000, offset: 1000, length: 2000, is_dir: false },
{
z: 14,
x: 16383,
y: 16383,
offset: 999999,
length: 999,
is_dir: false,
},
]);
let view = new DataView(data);
let entry = getTile(view,14,16383,16383);
let entry = queryTile(view, 14, 16383, 16383);
assertion.ok(entry!.z === 14);
assertion.ok(entry!.x === 16383);
assertion.ok(entry!.y === 16383);
assertion.ok(entry!.offset === 999999);
assertion.ok(entry!.length = 999);
})
assertion.ok(entry!.length === 999);
assertion.ok(entry!.is_dir === false);
assertion.ok(queryLeafdir(view, 14, 16383, 16383) === null);
});
test("get leafdir", assertion => {
let data = stubData([
{z:14,x:16383,y:16383,offset:999999,length:999,is_dir:true}
test("get leafdir", (assertion) => {
let data = createDirectory([
{
z: 14,
x: 16383,
y: 16383,
offset: 999999,
length: 999,
is_dir: true,
},
]);
let view = new DataView(data);
let entry = getLeafdir(view,14,16383,16383);
let entry = queryLeafdir(view, 14, 16383, 16383);
assertion.ok(entry!.z === 14);
assertion.ok(entry!.x === 16383);
assertion.ok(entry!.y === 16383);
assertion.ok(entry!.offset === 999999);
assertion.ok(entry!.length = 999);
assertion.ok(getTile(view,14,16383,16383) === null);
})
assertion.ok(entry!.length === 999);
assertion.ok(entry!.is_dir === true);
assertion.ok(queryTile(view, 14, 16383, 16383) === null);
});
test("convert spec v1 directory to spec v2 directory", (assertion) => {
let data = createDirectory([
{
z: 7,
x: 3,
y: 3,
offset: 3,
length: 3,
is_dir: true,
},
{
z: 6,
x: 2,
y: 2,
offset: 2,
length: 2,
is_dir: false,
},
{
z: 6,
x: 2,
y: 1,
offset: 1,
length: 1,
is_dir: false,
},
]);
let view = new DataView(data);
let entry = queryLeafdir(view, 7, 3, 3);
assertion.ok(entry!.offset === 3);
entry = queryTile(view, 6, 2, 2);
assertion.ok(entry!.offset === 2);
entry = queryTile(view, 6, 2, 1);
assertion.ok(entry!.offset === 1);
});