bitburner-src/test/jest/Save.test.ts

169 lines
4.9 KiB
TypeScript
Raw Normal View History

import "../../src/Player";
import { loadAllServers, saveAllServers } from "../../src/Server/AllServers";
// Direct tests of loading and saving.
// Tests here should try to be comprehensive (cover as much stuff as possible)
// without requiring burdensome levels of maintenance when legitimate changes
// are made.
// Get a stable clock so we don't have time-based diffs.
function freezeTime() {
// You're about to hack time, are you sure? YES/NO
const RealDate = Date;
Date = function () {
return new RealDate(1678834800000);
};
Date.now = () => 1678834800000;
}
// Savegame generated from dev on 2023-03-12, mostly empty game with a few
// tweaks. A RunningScript was added in-game to test the one bit of
// non-trivial machinery involved in save/load.
//
// Most of the Servers have been removed to reduce space. Default values have
// been removed both for space, and to test that they are added correctly.
function loadStandardServers() {
loadAllServers(String.raw`{
"home": {
"ctor": "Server",
"data": {
"hasAdminRights": true,
"hostname": "home",
"ip": "67.4.8.1",
"isConnectedTo": true,
"maxRam": 8,
"messages": [
"hackers-starting-handbook.lit"
],
"organizationName": "Home PC",
"programs": [
"NUKE.exe"
],
"ramUsed": 1.6,
"runningScripts": [
{
"ctor": "RunningScript",
"data": {
"args": [],
"filename": "script.js",
"logs": [
"I shouldn't even be saved, since I'm temporary"
],
"logUpd": true,
"offlineRunningTime": 0.01,
"onlineRunningTime": 7.210000000000004,
"pid": 3,
"ramUsage": 1.6,
"server": "home",
"temporary": true,
"dependencies": [
{
"filename": "script.js",
"url": "blob:http://localhost/302fe9e5-2ec3-4ed7-bb5a-4f8f4a85f46d",
"moduleSequenceNumber": 2
}
]
}
},
{
"ctor": "RunningScript",
"data": {
"args": [],
"filename": "script.js",
"logs": [
"I'm a log line that should be pruned",
"Another log line"
],
"logUpd": true,
"offlineRunningTime": 0.01,
"onlineRunningTime": 7.210000000000004,
"pid": 2,
"ramUsage": 1.6,
"server": "home",
"dependencies": [
{
"filename": "script.js",
"url": "blob:http://localhost/302fe9e5-2ec3-4ed7-bb5a-4f8f4a85f46d",
"moduleSequenceNumber": 2
}
]
}
}
],
"scripts": [
{
"ctor": "Script",
"data": {
"code": "/** @param {NS} ns */\\nexport async function main(ns) {\\n return ns.asleep(1000000);\\n}",
"filename": "script.js",
"module": {},
"dependencies": [
{
"filename": "script.js",
"url": "blob:http://localhost/e0abfafd-2c73-42fc-9eea-288c03820c47",
"moduleSequenceNumber": 5
}
],
"ramUsage": 1.6,
"server": "home",
"moduleSequenceNumber": 5,
"ramUsageEntries": [
{
"type": "misc",
"name": "baseCost",
"cost": 1.6
}
]
}
}
],
"serversOnNetwork": [
"n00dles"
],
"purchasedByPlayer": true
}
},
"n00dles": {
"ctor": "Server",
"data": {
"hostname": "n00dles",
"ip": "61.6.6.2",
"maxRam": 4,
"organizationName": "Noodle Bar",
"serversOnNetwork": [
"home"
],
"moneyAvailable": 70000,
"moneyMax": 1750000,
"numOpenPortsRequired": 0,
"serverGrowth": 3000
}
}
}`); // Fix confused highlighting `
}
test("load/saveAllServers", () => {
// Feed a JSON object through loadAllServers/saveAllServers.
// The object is a pruned set of servers that was extracted from a real (dev) game.
freezeTime();
loadStandardServers();
// Re-stringify with indenting for nicer diffs
const result = saveAllServers(/*excludeRunningScripts=*/ false);
expect(JSON.stringify(JSON.parse(result), null, 2)).toMatchSnapshot();
});
test("load/saveAllServers pruning RunningScripts", () => {
// Feed a JSON object through loadAllServers/saveAllServers.
// The object is a pruned set of servers that was extracted from a real (dev) game.
freezeTime();
loadStandardServers();
// Re-stringify with indenting for nicer diffs
const result = saveAllServers(/*excludeRunningScripts=*/ true);
expect(JSON.stringify(JSON.parse(result), null, 2)).toMatchSnapshot();
});