mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 15:09:05 +00:00
added tests
This commit is contained in:
parent
589f5ee7bb
commit
9885721d55
5 changed files with 319 additions and 0 deletions
12
__tests__/core/handleEvent.test.ts
Normal file
12
__tests__/core/handleEvent.test.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { enterSsknScene } from "@/core/events";
|
||||
import handleEvent from "@/core/handleEvent";
|
||||
import { useStore } from "@/store";
|
||||
import { GameScene } from "@/types";
|
||||
|
||||
it("Checks whether handleEvent applies mutations correctly", () => {
|
||||
const initialState = useStore.getState();
|
||||
handleEvent(enterSsknScene);
|
||||
const newState = useStore.getState();
|
||||
expect(newState.scene).toEqual(GameScene.Sskn);
|
||||
expect(newState.prev.scene).toEqual(initialState.scene);
|
||||
});
|
29
__tests__/utils/boot.test.ts
Normal file
29
__tests__/utils/boot.test.ts
Normal file
|
@ -0,0 +1,29 @@
|
|||
import { addCharacter } from "@/utils/boot";
|
||||
|
||||
it("Handles the logic for Japanese characters", () => {
|
||||
// cant be first character check
|
||||
expect(addCharacter("", "ン")).toEqual("");
|
||||
// if its not first, then fine
|
||||
expect(addCharacter("キ", "ン")).toEqual("キン");
|
||||
//「ー」 cannot be added to 「ッ」 and 「ン」or itself
|
||||
expect(addCharacter("キッ", "ー")).toEqual("キッ");
|
||||
expect(addCharacter("キン", "ー")).toEqual("キン");
|
||||
expect(addCharacter("キー", "ー")).toEqual("キー");
|
||||
// characters that can be followed by the lowercase characters
|
||||
expect(addCharacter("キ", "ャ")).toEqual("キャ");
|
||||
// cant be followed by lowercase character
|
||||
expect(addCharacter("ー", "ャ")).toEqual("ー");
|
||||
// for 「ッ」, it can added to any character except itself
|
||||
expect(addCharacter("ャ", "ッ")).toEqual("ャッ");
|
||||
// cant be added
|
||||
expect(addCharacter("ッ", "ッ")).toEqual("ッ");
|
||||
// dakuten
|
||||
expect(addCharacter("カ", "゛")).toEqual("ガ");
|
||||
// cant be appended
|
||||
expect(addCharacter("ガ", "゛")).toEqual("ガ");
|
||||
// handakuten
|
||||
expect(addCharacter("ハ", "゜")).toEqual("パ");
|
||||
// cant be appended
|
||||
expect(addCharacter("キ", "゜")).toEqual("キ");
|
||||
expect(addCharacter("パ", "゜")).toEqual("パ");
|
||||
});
|
125
__tests__/utils/node.test.ts
Normal file
125
__tests__/utils/node.test.ts
Normal file
|
@ -0,0 +1,125 @@
|
|||
import { Direction, GameSite } from "@/types";
|
||||
import {
|
||||
findNode,
|
||||
findNodeFromWord,
|
||||
getNode,
|
||||
isNodeVisible,
|
||||
} from "@/utils/node";
|
||||
import gameProgressJson from "@/json/initial_progress.json";
|
||||
import { useStore } from "@/store";
|
||||
|
||||
it("Finds nodes from words properly", () => {
|
||||
expect(findNodeFromWord("father", getNode("0606b")).name).toEqual("Lda151");
|
||||
expect(findNodeFromWord("father", getNode("0105b")).name).toEqual("Lda155");
|
||||
expect(findNodeFromWord("father", getNode("0123b")).name).toEqual("Lda164");
|
||||
expect(findNodeFromWord("father", getNode("0502b")).name).toEqual("Lda200");
|
||||
expect(findNodeFromWord("father", getNode("1118b")).name).toEqual("Cou041");
|
||||
expect(findNodeFromWord("father", getNode("0606b")).name).toEqual("Lda151");
|
||||
expect(findNodeFromWord("chaos", getNode("0115b")).name).toEqual("Tda056");
|
||||
expect(findNodeFromWord("chaos", getNode("0311b")).name).toEqual("Tda059");
|
||||
expect(findNodeFromWord("prompt", getNode("0115b")).name).toEqual("Tda072");
|
||||
expect(findNodeFromWord("abuse", getNode("1622a")).name).toEqual("Lda005");
|
||||
expect(findNodeFromWord("abuse", getNode("0718a")).name).toEqual("Dc1012");
|
||||
});
|
||||
|
||||
it("Finds node by it's id", () => {
|
||||
expect(getNode("0422a").name).toEqual("Tda028");
|
||||
expect(getNode("0000a").name).toEqual("Env001");
|
||||
expect(getNode("0616a").name).toEqual("Cou015");
|
||||
expect(getNode("0100b").name).toEqual("SSkn04#");
|
||||
expect(getNode("0101b").name).toEqual("Dc1025");
|
||||
});
|
||||
|
||||
it("Checks if the node is visible", () => {
|
||||
const oneViewCount = { ...gameProgressJson, final_video_viewcount: 1 };
|
||||
const twoViewCount = { ...gameProgressJson, final_video_viewcount: 2 };
|
||||
const threeViewCount = { ...gameProgressJson, final_video_viewcount: 3 };
|
||||
const fourViewCount = { ...gameProgressJson, final_video_viewcount: 4 };
|
||||
|
||||
expect(isNodeVisible(getNode("0422a"), gameProgressJson)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0413a"), gameProgressJson)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0406a"), gameProgressJson)).toEqual(false);
|
||||
expect(isNodeVisible(getNode("0410a"), gameProgressJson)).toEqual(false);
|
||||
expect(isNodeVisible(getNode("0406a"), oneViewCount)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0612a"), gameProgressJson)).toEqual(false);
|
||||
expect(isNodeVisible(getNode("0612a"), oneViewCount)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0612a"), twoViewCount)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0801a"), fourViewCount)).toEqual(true);
|
||||
expect(isNodeVisible(getNode("0801a"), threeViewCount)).toEqual(false);
|
||||
});
|
||||
|
||||
/*
|
||||
visual representation of the state we're working with
|
||||
[null, "0517", null, null],
|
||||
[null, null, "0510", "0513"],
|
||||
["0506", null, null, null],
|
||||
|
|
||||
[null, null, null, "0422"], ["0422", "0417", null, null], [null, "0416", "0417", "0420"],
|
||||
[null, null, null, "0414"], - ["0414", null, null, "0413"], - ["0413", null, null, null],
|
||||
[null, null, null, null], [null, null, null, "0405"], ["0405", null, null, null],
|
||||
|
|
||||
[null, null, null, null] [null, null, null, null], [null, null, null, null],
|
||||
[null, null, null, null], [null, null, null, null], [null, null, null, null],
|
||||
[null, null, null, null], [null, null, null, null], [null, null, null, null],
|
||||
*/
|
||||
|
||||
it("Finds which node to go to", () => {
|
||||
const state0414 = useStore.getState();
|
||||
|
||||
// from 0414 left
|
||||
expect(findNode(state0414, Direction.Left, true)).toEqual({
|
||||
node: getNode("0414a"),
|
||||
nodeMatrixIndex: { row: 1, col: 3 },
|
||||
siteSegment: 7,
|
||||
level: 4,
|
||||
didMove: true,
|
||||
});
|
||||
|
||||
// from 0414 down
|
||||
expect(findNode(state0414, Direction.Down, true)).toEqual({
|
||||
node: getNode("0405a"),
|
||||
nodeMatrixIndex: { row: 2, col: 3 },
|
||||
siteSegment: 6,
|
||||
level: 4,
|
||||
didMove: false,
|
||||
});
|
||||
|
||||
const state0405 = {
|
||||
...state0414,
|
||||
node: getNode("0405a"),
|
||||
nodeMatrixIndex: { row: 2, col: 3 },
|
||||
};
|
||||
// from 0405 down
|
||||
expect(findNode(state0405, Direction.Down, true)).toEqual({
|
||||
node: null,
|
||||
nodeMatrixIndex: { row: 2, col: 3 },
|
||||
siteSegment: 6,
|
||||
level: 3,
|
||||
didMove: true,
|
||||
});
|
||||
|
||||
// from 0405 left
|
||||
expect(findNode(state0405, Direction.Left, true)).toEqual({
|
||||
node: getNode("0417a"),
|
||||
nodeMatrixIndex: { row: 0, col: 1 },
|
||||
siteSegment: 6,
|
||||
level: 4,
|
||||
didMove: false,
|
||||
});
|
||||
|
||||
const state0506 = {
|
||||
...state0414,
|
||||
node: getNode("0506a"),
|
||||
nodeMatrixIndex: { row: 3, col: 0 },
|
||||
level: 5,
|
||||
};
|
||||
|
||||
// from 0506 down
|
||||
expect(findNode(state0506, Direction.Down, true)).toEqual({
|
||||
node: getNode("0422a"),
|
||||
nodeMatrixIndex: { row: 0, col: 0 },
|
||||
siteSegment: 6,
|
||||
level: 4,
|
||||
didMove: true,
|
||||
});
|
||||
});
|
98
__tests__/utils/save.test.ts
Normal file
98
__tests__/utils/save.test.ts
Normal file
|
@ -0,0 +1,98 @@
|
|||
import { upgradeLegacySave } from "@/utils/save";
|
||||
import legacySaveJson from "@/json/legacy/save.json";
|
||||
import { GameSite, LegacySaveState } from "@/types";
|
||||
|
||||
it("Checks whether legacy saves get updated correctly", () => {
|
||||
const res = upgradeLegacySave(legacySaveJson as LegacySaveState);
|
||||
|
||||
const siteASaveState = res.siteSaveState[GameSite.A];
|
||||
expect(siteASaveState.level).toEqual(10);
|
||||
expect(siteASaveState.siteSegment).toEqual(0);
|
||||
expect(siteASaveState.nodeMatrixIndex.row).toEqual(1);
|
||||
expect(siteASaveState.nodeMatrixIndex.col).toEqual(0);
|
||||
expect(siteASaveState.node?.id).toEqual("1008a");
|
||||
expect(siteASaveState.node?.image_table_indices).toEqual([18, null, null]);
|
||||
expect(siteASaveState.node?.media_file).toEqual("LAIN09.XA[6]");
|
||||
expect(siteASaveState.node?.name).toEqual("Tda040");
|
||||
expect(siteASaveState.node?.protocol_lines).toEqual([
|
||||
"authorized_il",
|
||||
"decoded file:t",
|
||||
"ftp/tl.S_server",
|
||||
]);
|
||||
expect(siteASaveState.node?.required_final_video_viewcount).toEqual(0);
|
||||
expect(siteASaveState.node?.site).toEqual(GameSite.A);
|
||||
expect(siteASaveState.node?.title).toEqual("TOUKO's DIARY");
|
||||
expect(siteASaveState.node?.triggers_final_video).toEqual(0);
|
||||
expect(siteASaveState.node?.type).toEqual(2);
|
||||
expect(siteASaveState.node?.unlocked_by).toEqual(null);
|
||||
expect(siteASaveState.node?.upgrade_requirement).toEqual(0);
|
||||
expect(siteASaveState.node?.words).toEqual([
|
||||
"telephone",
|
||||
"takeshi",
|
||||
"simplicity",
|
||||
]);
|
||||
|
||||
const siteBSaveState = res.siteSaveState[GameSite.B];
|
||||
expect(siteBSaveState.level).toEqual(13);
|
||||
expect(siteBSaveState.siteSegment).toEqual(4);
|
||||
expect(siteBSaveState.nodeMatrixIndex.row).toEqual(0);
|
||||
expect(siteBSaveState.nodeMatrixIndex.col).toEqual(0);
|
||||
expect(siteBSaveState.node?.id).toEqual("1320b");
|
||||
expect(siteBSaveState.node?.image_table_indices).toEqual([556, 557, null]);
|
||||
expect(siteBSaveState.node?.media_file).toEqual("LAIN18.XA[7]");
|
||||
expect(siteBSaveState.node?.name).toEqual("Lda237");
|
||||
expect(siteBSaveState.node?.protocol_lines).toEqual([
|
||||
"anonymous_user",
|
||||
"active_file:",
|
||||
"ftp/tl.L_server",
|
||||
]);
|
||||
expect(siteBSaveState.node?.required_final_video_viewcount).toEqual(0);
|
||||
expect(siteBSaveState.node?.site).toEqual(GameSite.B);
|
||||
expect(siteBSaveState.node?.title).toEqual("lain's DIARY");
|
||||
expect(siteBSaveState.node?.triggers_final_video).toEqual(1);
|
||||
expect(siteBSaveState.node?.type).toEqual(0);
|
||||
expect(siteBSaveState.node?.unlocked_by).toEqual("1300b");
|
||||
expect(siteBSaveState.node?.upgrade_requirement).toEqual(5);
|
||||
expect(siteBSaveState.node?.words).toEqual([
|
||||
"evolution",
|
||||
"thought",
|
||||
"will&existence",
|
||||
]);
|
||||
|
||||
expect(res.site).toEqual(GameSite.B);
|
||||
expect(res.level).toEqual(1);
|
||||
expect(res.playerName).toEqual("\u30b1\u30ea\u30b9");
|
||||
expect(res.siteSegment).toEqual(7);
|
||||
expect(res.nodeMatrixIndex.row).toEqual(0);
|
||||
expect(res.nodeMatrixIndex.col).toEqual(0);
|
||||
|
||||
const node = res.node;
|
||||
expect(node?.id).toEqual("0123b");
|
||||
expect(node?.image_table_indices).toEqual([512, 96, 366]);
|
||||
expect(node?.media_file).toEqual("LAIN15.XA[21]");
|
||||
expect(node?.name).toEqual("Lda155");
|
||||
expect(node?.protocol_lines).toEqual([
|
||||
"anonymous_user",
|
||||
"active_file:",
|
||||
"ftp/tl.L_server",
|
||||
]);
|
||||
expect(node?.required_final_video_viewcount).toEqual(0);
|
||||
expect(node?.site).toEqual(GameSite.B);
|
||||
expect(node?.title).toEqual("lain's DIARY");
|
||||
expect(node?.triggers_final_video).toEqual(0);
|
||||
expect(node?.type).toEqual(0);
|
||||
expect(node?.unlocked_by).toEqual(null);
|
||||
expect(node?.upgrade_requirement).toEqual(3);
|
||||
expect(node?.words).toEqual(["whereabouts", "father", "proof"]);
|
||||
|
||||
const gameProgress = res.gameProgress;
|
||||
expect(gameProgress.sskn_level).toEqual(7);
|
||||
expect(gameProgress.gate_level).toEqual(4);
|
||||
expect(gameProgress.final_video_viewcount).toEqual(4);
|
||||
expect(
|
||||
Object.values(gameProgress.polytan_unlocked_parts).every((v) => v)
|
||||
).toEqual(true);
|
||||
expect(
|
||||
Object.values(gameProgress.nodes).every((v) => v.is_viewed === true)
|
||||
).toEqual(true);
|
||||
});
|
55
__tests__/utils/site.test.ts
Normal file
55
__tests__/utils/site.test.ts
Normal file
|
@ -0,0 +1,55 @@
|
|||
import { Direction } from "@/types";
|
||||
import { getRotationForSegment } from "@/utils/site";
|
||||
|
||||
const doCircles = (
|
||||
segment: number,
|
||||
count: number,
|
||||
direction: Direction.Left | Direction.Right,
|
||||
startRotation?: number
|
||||
): [number, number] => {
|
||||
let currentCount = 0;
|
||||
let rotation = startRotation ?? getRotationForSegment(segment);
|
||||
let prevRotation = rotation;
|
||||
while (currentCount < count) {
|
||||
if (direction === Direction.Left) {
|
||||
segment -= 1;
|
||||
}
|
||||
|
||||
if (direction === Direction.Right) {
|
||||
segment += 1;
|
||||
}
|
||||
|
||||
if (segment > 7) {
|
||||
currentCount += 1;
|
||||
segment = 0;
|
||||
}
|
||||
|
||||
if (segment < 0) {
|
||||
currentCount += 1;
|
||||
segment = 7;
|
||||
}
|
||||
|
||||
prevRotation = rotation;
|
||||
rotation = getRotationForSegment(segment, prevRotation);
|
||||
if (direction === Direction.Left) {
|
||||
expect(rotation).toBeCloseTo(prevRotation - Math.PI / 4, 6);
|
||||
}
|
||||
|
||||
if (direction === Direction.Right) {
|
||||
expect(rotation).toBeCloseTo(prevRotation + Math.PI / 4, 6);
|
||||
}
|
||||
}
|
||||
|
||||
return [segment, rotation];
|
||||
};
|
||||
|
||||
it("Checks if rotation calculator works", () => {
|
||||
// site is initially positioned like this
|
||||
doCircles(6, 3, Direction.Left);
|
||||
doCircles(6, 3, Direction.Right);
|
||||
doCircles(4, 6, Direction.Left);
|
||||
doCircles(0, 6, Direction.Left);
|
||||
// move to right then move to left based on last coordinates
|
||||
let [segment, rotation] = doCircles(7, 6, Direction.Right);
|
||||
doCircles(segment, 6, Direction.Left, rotation);
|
||||
});
|
Loading…
Reference in a new issue