You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.6 KiB
JavaScript

"use strict";
const tape = require("tape");
const { Temporal } = require("@js-temporal/polyfill");
const path = require("path");
const seedRandom = require("seed-random");
const filledArray = require("fix-esm").require("filled-array").default;
require("../../src/packages/tape-snapshot").setup(tape, path.join(__dirname, "_snapshots"));
const coders = require("../../src/storage-encoder/coders");
const encodeField = require("../../src/storage-encoder/encode-field");
const namedCartesianProduct = require("../../src/packages/named-cartesian-product");
const zonedTemporal = Temporal.ZonedDateTime.from("2021-11-27T23:43:32.81701281+01:00[Europe/Amsterdam]");
const unzonedTemporal = Temporal.Instant.from("2021-11-27T22:43:32.821012817Z");
const jsDate = new Date("2021-11-27T22:43:32.821012817Z");
tape("date encoding", (test) => {
let encodingConfigurations = namedCartesianProduct({
value: [ zonedTemporal, unzonedTemporal, jsDate ],
withTimezone: [ true, false ],
asIndexKey: [ true, false ]
});
let encoded = encodingConfigurations.map(({ value, withTimezone, asIndexKey }) => {
// NOTE: This uses `doEncode` to ensure that the input gets normalized to the internal data representation first. This needs to eventually be changed to use `coders.encode` directly, with separate tests for normalization!
return encodeField({ value, withTimezone, asIndexKey, fieldType: "date", name: "_", required: true });
});
test.equalsSnapshot(encoded);
// FIXME: Decode values again
test.end();
});
tape("integer encoding", (test) => {
let generateNumber = seedRandom("zapdb-number-test");
let numberLists = [];
// TODO: Add tests for higher numbers using BigInts
for (let magnitude = 1; magnitude < 15; magnitude++) {
let maxNumber = Math.pow(10, magnitude);
numberLists.push(filledArray(() => Math.floor(generateNumber() * maxNumber), 30));
}
let positiveNumbers = numberLists.flat();
let negativeNumbers = positiveNumbers.map((number) => 0 - number);
let allNumbers = [
... positiveNumbers,
... negativeNumbers
];
let encodedNumbers = allNumbers.map((number) => {
return [
coders.encode("integer", number, { asIndexKey: true }),
coders.encode("integer", number, { asIndexKey: false }),
];
});
test.equalsSnapshot(encodedNumbers);
// FIXME: Decode values again
test.end();
});
tape("boolean encoding", (test) => {
test.equalsSnapshot([
coders.encode("boolean", true, { asIndexKey: true }),
coders.encode("boolean", true, { asIndexKey: false }),
coders.encode("boolean", false, { asIndexKey: true }),
coders.encode("boolean", false, { asIndexKey: false }),
]);
// FIXME: Decode values again
test.end();
});