mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
Add options to pass map seed, map exchange string, map gen settings and/or map settings when creating a save either through the create save request or the load scenario request.
74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
"use strict";
|
|
const assert = require("assert").strict;
|
|
const zlib = require("zlib");
|
|
|
|
const libFactorio = require("@clusterio/lib/factorio");
|
|
|
|
const testStrings = require("./test_strings");
|
|
|
|
|
|
// Simple linear congruential random number generator
|
|
class Random {
|
|
constructor(seed) {
|
|
this.prev = seed;
|
|
}
|
|
|
|
next() {
|
|
let curr = (1103515245 * this.prev + 12345) & 0x7fffffff;
|
|
this.prev = curr;
|
|
return curr >> 16;
|
|
}
|
|
}
|
|
|
|
describe("lib/factorio/exchange_string", function() {
|
|
describe("readMapExchangeString", function() {
|
|
it("should parse a valid string", function() {
|
|
let result = libFactorio.readMapExchangeString(testStrings.default);
|
|
assert.equal(result.map_gen_settings.seed, 1234567890);
|
|
|
|
result = libFactorio.readMapExchangeString(testStrings.modified);
|
|
assert.equal(result.checksum, 4092204126);
|
|
});
|
|
|
|
it("should handle malformed strings", function() {
|
|
assert.throws(
|
|
() => libFactorio.readMapExchangeString("<<blah>>"),
|
|
new Error("Not a map exchange string")
|
|
);
|
|
|
|
assert.throws(
|
|
() => libFactorio.readMapExchangeString(testStrings.default.slice(0, 100)),
|
|
new Error("Not a map exchange string")
|
|
);
|
|
|
|
assert.throws(
|
|
() => libFactorio.readMapExchangeString(`>>>${Buffer.from("abk430ia404ah3b4").toString("base64")}<<<`),
|
|
new Error("Malformed map exchange string: zlib inflate failed")
|
|
);
|
|
|
|
for (let i = 0; i < 100; i++) {
|
|
let gen = new Random(i);
|
|
let size = gen.next() % 200 + 100;
|
|
let data = Buffer.alloc(size);
|
|
for (let j = 0; j < size; j++) {
|
|
data[j] = gen.next() % 256;
|
|
}
|
|
// eslint-disable-next-line node/no-sync
|
|
data = zlib.deflateSync(data);
|
|
assert.throws(
|
|
() => libFactorio.readMapExchangeString(`>>>${data.toString("base64")}<<<`),
|
|
new Error("Malformed map exchange string: reached end before finishing parsing")
|
|
);
|
|
}
|
|
|
|
let pastEnd = Buffer.from(testStrings.default.replace(/><\n/g, ""), "base64");
|
|
// eslint-disable-next-line node/no-sync
|
|
pastEnd = zlib.deflateSync(Buffer.concat([zlib.inflateSync(pastEnd), Buffer.from("junk")]));
|
|
assert.throws(
|
|
() => libFactorio.readMapExchangeString(`>>>${pastEnd.toString("base64")}<<<`),
|
|
new Error("Malformed map exchange string: data after end")
|
|
);
|
|
});
|
|
});
|
|
});
|