mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
Migrate the usage of CommonJS specific code and imports to ESM. Roughly summarised this: - Changes all require() calls to import statement or expressions. - Changes usage of module.exports to export statements. - Replaces require.resolve with import.meta.resolve. - Replaces conditional imports with conditional subpath imports. - Replaces module === require.main with import.meta.main. - Adds the full filename with extention to all relative imports. - Changes all usage of __dirname and __filename to their import.meta equivalents. - Sets "type": "module" in package.json files. - Removes usage of "use strict". - Adds .ts an an alias of .js for the webpack build. Due to differences in how require and import resolves files the plugin entrypoints will have to include the filename and extension after this migration in order to work.
295 lines
8.3 KiB
JavaScript
295 lines
8.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
|
|
import * as lib from "@clusterio/lib";
|
|
|
|
describe("lib/database", function() {
|
|
describe("mapToObject()", function() {
|
|
it("should throw on non-string key", function() {
|
|
assert.throws(
|
|
() => lib.mapToObject(new Map([[1, 1]])),
|
|
new Error("Expected all keys to be string but got number")
|
|
);
|
|
assert.throws(
|
|
() => lib.mapToObject(new Map([[Symbol("test"), 1]])),
|
|
new Error("Expected all keys to be string but got symbol")
|
|
);
|
|
});
|
|
|
|
it("should throw convert a map to an object", function() {
|
|
assert.deepEqual(
|
|
lib.mapToObject(new Map([["a", 1], ["b", true]])),
|
|
{ "a": 1, "b": true }
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("loadJsonAsMap()", function() {
|
|
let badTypes = ["null", "array", "number", "string", "boolean"];
|
|
|
|
for (let type of badTypes) {
|
|
it(`should reject on ${type} JSON`, async function() {
|
|
await assert.rejects(
|
|
lib.loadJsonAsMap(path.join("test", "file", "json", `${type}.json`)),
|
|
new Error(`Expected object but got ${type}`)
|
|
);
|
|
});
|
|
}
|
|
|
|
it("should work on empty object JSON", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonAsMap(path.join("test", "file", "json", "object.json")),
|
|
new Map()
|
|
);
|
|
});
|
|
|
|
it("should work on object JSON", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonAsMap(path.join("test", "file", "json", "load_map.json")),
|
|
new Map([["a", 1], ["b", true]])
|
|
);
|
|
});
|
|
|
|
it("should give an empty Map for non-existant file", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonAsMap(path.join("test", "file", "json", "does-not-exist")),
|
|
new Map()
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("saveMapAsJson()", function() {
|
|
it("should save a mapping as JSON", async function() {
|
|
let testFile = path.join("temp", "test", "save_map.json");
|
|
async function deleteTestFile() {
|
|
try {
|
|
await fs.unlink(testFile);
|
|
} catch (err) {
|
|
/* istanbul ignore if */
|
|
if (err.code !== "ENOENT") {
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
await deleteTestFile();
|
|
await lib.saveMapAsJson(
|
|
testFile, new Map([["c", {}], ["d", "foo"]])
|
|
);
|
|
|
|
assert.equal(
|
|
await fs.readFile(testFile, { encoding: "utf-8" }),
|
|
'{\n\t"c": {},\n\t"d": "foo"\n}'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("loadJsonArrayAsMap()", function() {
|
|
let badTypes = ["null", "object", "number", "string", "boolean"];
|
|
|
|
for (let type of badTypes) {
|
|
it(`should reject on ${type} JSON`, async function() {
|
|
await assert.rejects(
|
|
lib.loadJsonArrayAsMap(path.join("test", "file", "json", `${type}.json`)),
|
|
new Error(`Expected array but got ${type}`)
|
|
);
|
|
});
|
|
}
|
|
|
|
it("should reject on null element", async function() {
|
|
await assert.rejects(
|
|
lib.loadJsonArrayAsMap(path.join("test", "file", "json", "array_null.json")),
|
|
new Error("Expected all elements to be objects")
|
|
);
|
|
});
|
|
|
|
it("should reject on element missing id", async function() {
|
|
await assert.rejects(
|
|
lib.loadJsonArrayAsMap(path.join("test", "file", "json", "array_object.json")),
|
|
new Error("Expected all elements to have an id property")
|
|
);
|
|
});
|
|
|
|
it("should work on empty array JSON", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonArrayAsMap(path.join("test", "file", "json", "array.json")),
|
|
new Map()
|
|
);
|
|
});
|
|
|
|
it("should work on array JSON", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonArrayAsMap(path.join("test", "file", "json", "load_array_map.json")),
|
|
new Map([["a", { id: "a" }], ["b", { id: "b" }]])
|
|
);
|
|
});
|
|
|
|
it("should give an empty Map for non-existant file", async function() {
|
|
assert.deepEqual(
|
|
await lib.loadJsonArrayAsMap(path.join("test", "file", "json", "does-not-exist")),
|
|
new Map()
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("saveMapAsJsonArray()", function() {
|
|
it("should save a mapping as JSON", async function() {
|
|
let testFile = path.join("temp", "test", "save_array_map.json");
|
|
async function deleteTestFile() {
|
|
try {
|
|
await fs.unlink(testFile);
|
|
} catch (err) {
|
|
/* istanbul ignore if */
|
|
if (err.code !== "ENOENT") {
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
await deleteTestFile();
|
|
await lib.saveMapAsJsonArray(
|
|
testFile, new Map([["c", { id: "c" }], ["d", { id: "d" }]])
|
|
);
|
|
|
|
assert.equal(
|
|
await fs.readFile(testFile, { encoding: "utf-8" }),
|
|
'[\n\t{\n\t\t"id": "c"\n\t},\n\t{\n\t\t"id": "d"\n\t}\n]'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("class ItemDatabase", function() {
|
|
describe("constructor()", function() {
|
|
it("should create an empty database with no args", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.deepEqual(items._items, new Map());
|
|
});
|
|
|
|
it("should restore the passed serialized database", function() {
|
|
let items = new lib.ItemDatabase({ "a": 1, "b": 2 });
|
|
assert.deepEqual(items._items, new Map([["a", { normal: 1 }], ["b", { normal: 2 }]]));
|
|
});
|
|
|
|
it("should throw on invalid serialized database", function() {
|
|
assert.throws(
|
|
() => new lib.ItemDatabase({ "a": NaN }),
|
|
new Error("count must be a number")
|
|
);
|
|
|
|
assert.throws(
|
|
() => new lib.ItemDatabase({ "a": "a" }),
|
|
new Error("count must be a number")
|
|
);
|
|
});
|
|
});
|
|
|
|
describe(".serialize()", function() {
|
|
it("should return a serialized database", function() {
|
|
let items = new lib.ItemDatabase({ "a": 10 });
|
|
assert.deepEqual(items.serialize(), { "a": { normal: 10 } });
|
|
});
|
|
|
|
it("should remove zero count entries", function() {
|
|
let items = new lib.ItemDatabase({ "a": 0 });
|
|
assert.deepEqual(items.serialize(), {});
|
|
});
|
|
});
|
|
|
|
describe(".size", function() {
|
|
it("should give an approximate size of the database", function() {
|
|
let items = new lib.ItemDatabase({ "a": 10 });
|
|
assert.equal(items.size, 1);
|
|
});
|
|
});
|
|
|
|
describe(".getItemCount()", function() {
|
|
it("should return the count of the given item", function() {
|
|
let items = new lib.ItemDatabase({ "a": 10 });
|
|
assert.equal(items.getItemCount("a", "normal"), 10);
|
|
});
|
|
|
|
it("should return zero if item does not exist", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.equal(items.getItemCount("b", "normal"), 0);
|
|
});
|
|
|
|
it("should throw on invalid name", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.throws(
|
|
() => items.getItemCount(2, "normal"),
|
|
new Error("name must be a string")
|
|
);
|
|
});
|
|
});
|
|
|
|
describe(".addItem()", function() {
|
|
it("should add a new item", function() {
|
|
let items = new lib.ItemDatabase();
|
|
items.addItem("a", 10, "normal");
|
|
assert.deepEqual(items._items, new Map([["a", { normal: 10 }]]));
|
|
});
|
|
|
|
it("should add an existing item", function() {
|
|
let items = new lib.ItemDatabase({ "a": 10 });
|
|
items.addItem("a", 10, "normal");
|
|
assert.deepEqual(items._items, new Map([["a", { normal: 20 }]]));
|
|
});
|
|
|
|
it("should throw on invalid name", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.throws(
|
|
() => items.addItem(2, 10, "normal"),
|
|
new Error("name must be a string")
|
|
);
|
|
});
|
|
|
|
it("should throw on invalid count", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.throws(
|
|
() => items.addItem("a", NaN, "normal"),
|
|
new Error("count must be a number")
|
|
);
|
|
assert.throws(
|
|
() => items.addItem("a", "1", "normal"),
|
|
new Error("count must be a number")
|
|
);
|
|
});
|
|
});
|
|
|
|
describe(".removeItem()", function() {
|
|
it("should remove an existing item", function() {
|
|
let items = new lib.ItemDatabase({ "a": 20 });
|
|
items.removeItem("a", 10, "normal");
|
|
assert.deepEqual(items._items, new Map([["a", { normal: 10 }]]));
|
|
});
|
|
|
|
it("should turn a non-existing item negative", function() {
|
|
let items = new lib.ItemDatabase();
|
|
items.removeItem("a", 10, "normal");
|
|
assert.deepEqual(items._items, new Map([["a", { normal: -10 }]]));
|
|
});
|
|
|
|
it("should throw on invalid name", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.throws(
|
|
() => items.removeItem(2, 10, "normal"),
|
|
new Error("name must be a string")
|
|
);
|
|
});
|
|
|
|
it("should throw on invalid count", function() {
|
|
let items = new lib.ItemDatabase();
|
|
assert.throws(
|
|
() => items.removeItem("a", "b", "normal"),
|
|
new Error("count must be a number")
|
|
);
|
|
assert.throws(
|
|
() => items.removeItem("a", "1", "normal"),
|
|
new Error("count must be a number")
|
|
);
|
|
});
|
|
});
|
|
});
|
|
});
|