"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(); });