varasto/test/storage_test_ffi.mjs
2023-09-14 21:18:49 +03:00

90 lines
1.6 KiB
JavaScript

const ITEM_LIMIT = 5;
class Storage {
#items;
constructor() {
this.#items = new Map();
}
get length() {
return this.#items.size;
}
key(index) {
let i = 0;
for (const k of this.#items.keys()) {
if (i === index) {
return k;
}
++i;
}
return null;
}
getItem(k) {
return this.#items.get(k) || null;
}
setItem(k, v) {
if (this.#items.size === ITEM_LIMIT) {
throw new Error("Full!");
}
this.#items.set(k, v);
}
removeItem(k) {
this.#items.delete(k);
}
clear() {
this.#items.clear();
}
}
function getter(type) {
return new Storage();
}
export function runWithMockStorage(callback) {
const oldStorage = globalThis.Storage;
const oldLocal = globalThis.localStorage;
const oldSession = globalThis.sessionStorage;
Object.defineProperty(globalThis, "Storage", {
value: Storage,
configurable: true,
});
Object.defineProperty(globalThis, "localStorage", {
get() {
return getter("localStorage");
},
configurable: true,
});
Object.defineProperty(globalThis, "sessionStorage", {
get() {
return getter("sessionStorage");
},
configurable: true,
});
try {
callback();
} finally {
Object.defineProperty(globalThis, "Storage", {
value: oldStorage,
configurable: true,
});
Object.defineProperty(globalThis, "localStorage", {
value: oldLocal,
configurable: true,
});
Object.defineProperty(globalThis, "sessionStorage", {
value: oldSession,
configurable: true,
});
}
}