Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vuexのコマンドのsnapshotテストを追加 #2175

Merged
merged 12 commits into from
Jul 24, 2024
3 changes: 2 additions & 1 deletion src/backend/browser/fileImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { openDB } from "./browserConfig";
import { SandboxKey } from "@/type/preload";
import { failure, success } from "@/type/result";
import { createLogger } from "@/domain/frontend/log";
import { uuid4 } from "@/helpers/random";

const log = createLogger("fileImpl");

Expand Down Expand Up @@ -200,7 +201,7 @@ export const showOpenFilePickerImpl = async (options: {
});
const paths = [];
for (const handle of handles) {
const fakePath = `<browser-dummy-${crypto.randomUUID()}>-${handle.name}`;
const fakePath = `<browser-dummy-${uuid4()}>-${handle.name}`;
fileHandleMap.set(fakePath, handle);
paths.push(fakePath);
}
Expand Down
3 changes: 2 additions & 1 deletion src/components/Sing/ScoreSequencer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ import {
import { applyGaussianFilter, linearInterpolation } from "@/sing/utility";
import { useLyricInput } from "@/composables/useLyricInput";
import { ExhaustiveError } from "@/type/utility";
import { uuid4 } from "@/helpers/random";

type PreviewMode =
| "ADD_NOTE"
Expand Down Expand Up @@ -720,7 +721,7 @@ const startPreview = (event: MouseEvent, mode: PreviewMode, note?: Note) => {
return;
}
note = {
id: NoteId(crypto.randomUUID()),
id: NoteId(uuid4()),
position: guideLineTicks,
duration: snapTicks.value,
noteNumber: cursorNoteNumber,
Expand Down
27 changes: 27 additions & 0 deletions src/helpers/random.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* 乱数値を生成する。モックに対応している。
* モックモードでは呼ばれた回数に応じて固定の値を返す。
*/

let mockMode = false;
let mockCount = 0;

/**
* モックモードにし、呼ばれた回数をリセットする。
*/
export function resetMockMode(): void {
mockMode = true;
mockCount = 0;
}

/**
* v4 UUID を生成する。
Hiroshiba marked this conversation as resolved.
Show resolved Hide resolved
*/
export function uuid4(): string {
if (!mockMode) {
return crypto.randomUUID();
} else {
mockCount++;
return `00000000-0000-4000-0000-${mockCount.toString().padStart(12, "0")}`;
}
}
3 changes: 2 additions & 1 deletion src/sing/utaformatixProject/toVoicevox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { DEFAULT_TPQN, createDefaultTrack } from "@/sing/domain";
import { getDoremiFromNoteNumber } from "@/sing/viewHelper";
import { NoteId } from "@/type/preload";
import { Note, Tempo, TimeSignature, Track } from "@/store/type";
import { uuid4 } from "@/helpers/random";

/** UtaformatixのプロジェクトをVoicevoxの楽譜データに変換する */
export const ufProjectToVoicevox = (project: UfProject): VoicevoxScore => {
Expand Down Expand Up @@ -72,7 +73,7 @@ export const ufProjectToVoicevox = (project: UfProject): VoicevoxScore => {

const notes = trackNotes.map((value): Note => {
return {
id: NoteId(crypto.randomUUID()),
id: NoteId(uuid4()),
position: convertPosition(value.tickOn, projectTpqn, tpqn),
duration: convertDuration(
value.tickOn,
Expand Down
3 changes: 2 additions & 1 deletion src/store/audio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,10 @@ import { AudioQuery, AccentPhrase, Speaker, SpeakerInfo } from "@/openapi";
import { base64ImageToUri, base64ToUri } from "@/helpers/base64Helper";
import { getValueOrThrow, ResultError } from "@/type/result";
import { generateWriteErrorMessage } from "@/helpers/fileHelper";
import { uuid4 } from "@/helpers/random";

function generateAudioKey() {
return AudioKey(crypto.randomUUID());
return AudioKey(uuid4());
}

function parseTextFile(
Expand Down
3 changes: 2 additions & 1 deletion src/store/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
MutationTree,
} from "@/store/vuex";
import { CommandId, EditorType } from "@/type/preload";
import { uuid4 } from "@/helpers/random";

enablePatches();
enableMapSet();
Expand Down Expand Up @@ -67,7 +68,7 @@ const recordPatches =
(draft: S) => recipe(draft, payload),
);
return {
id: CommandId(crypto.randomUUID()),
id: CommandId(uuid4()),
redoPatches: doPatches,
undoPatches: undoPatches,
};
Expand Down
3 changes: 2 additions & 1 deletion src/store/preset.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { createPartialStore } from "./vuex";
import { uuid4 } from "@/helpers/random";
import { PresetStoreState, PresetStoreTypes, State } from "@/store/type";
import { Preset, PresetKey, Voice, VoiceId } from "@/type/preload";

Expand Down Expand Up @@ -181,7 +182,7 @@ export const presetStore = createPartialStore<PresetStoreTypes>({

ADD_PRESET: {
async action(context, { presetData }: { presetData: Preset }) {
const newKey = PresetKey(crypto.randomUUID());
const newKey = PresetKey(uuid4());
const newPresetItems = {
...context.state.presetItems,
[newKey]: presetData,
Expand Down
5 changes: 3 additions & 2 deletions src/store/singing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ import { createLogger } from "@/domain/frontend/log";
import { noteSchema } from "@/domain/project/schema";
import { getOrThrow } from "@/helpers/mapHelper";
import { ufProjectToVoicevox } from "@/sing/utaformatixProject/toVoicevox";
import { uuid4 } from "@/helpers/random";

const logger = createLogger("store/singing");

Expand Down Expand Up @@ -1724,7 +1725,7 @@ export const singingStore = createPartialStore<SingingStoreTypes>({
const track = tracks[trackIndex];
const notes = track.notes.map((note) => ({
...note,
id: NoteId(crypto.randomUUID()),
id: NoteId(uuid4()),
}));

if (tpqn !== state.tpqn) {
Expand Down Expand Up @@ -2144,7 +2145,7 @@ export const singingStore = createPartialStore<SingingStoreTypes>({
const quantizedPastePos =
Math.round(pasteOriginPos / snapTicks) * snapTicks;
return {
id: NoteId(crypto.randomUUID()),
id: NoteId(uuid4()),
position: quantizedPastePos,
duration: Number(note.duration),
noteNumber: Number(note.noteNumber),
Expand Down
3 changes: 2 additions & 1 deletion tests/unit/lib/selectPriorPhrase.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
} from "@/store/type";
import { DEFAULT_TPQN, selectPriorPhrase } from "@/sing/domain";
import { NoteId } from "@/type/preload";
import { uuid4 } from "@/helpers/random";

const createPhrase = (
firstRestDuration: number,
Expand All @@ -18,7 +19,7 @@ const createPhrase = (
firstRestDuration: firstRestDuration * DEFAULT_TPQN,
notes: [
{
id: NoteId(crypto.randomUUID()),
id: NoteId(uuid4()),
position: start * DEFAULT_TPQN,
duration: (end - start) * DEFAULT_TPQN,
noteNumber: 60,
Expand Down
3 changes: 2 additions & 1 deletion tests/unit/lib/utaformatixProject/export.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import {
createDefaultTrack,
} from "@/sing/domain";
import { NoteId } from "@/type/preload";
import { uuid4 } from "@/helpers/random";

const createNoteId = () => NoteId(crypto.randomUUID());
const createNoteId = () => NoteId(uuid4());

it("トラックを変換できる", async () => {
const track = createDefaultTrack();
Expand Down
41 changes: 41 additions & 0 deletions tests/unit/store/__snapshots__/command.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`コマンド実行で履歴が作られる 1`] = `
{
"audioKeys": [
"00000000-0000-4000-0000-000000000001",
],
"redoCommands": {
"song": [],
"talk": [],
},
"undoCommands": {
"song": [],
"talk": [
{
"id": "00000000-0000-4000-0000-000000000002",
"redoPatches": [
{
"op": "replace",
"path": [
"audioKeys",
],
"value": [
"00000000-0000-4000-0000-000000000001",
],
},
],
"undoPatches": [
{
"op": "replace",
"path": [
"audioKeys",
],
"value": [],
},
],
},
],
},
}
`;
19 changes: 19 additions & 0 deletions tests/unit/store/command.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { toRaw } from "vue";
import { store } from "@/store";
import { AudioKey } from "@/type/preload";
import { resetMockMode, uuid4 } from "@/helpers/random";

const initialState = structuredClone(toRaw(store.state));
beforeEach(() => {
store.replaceState(initialState);

resetMockMode();
});

test("コマンド実行で履歴が作られる", async () => {
await store.dispatch("COMMAND_SET_AUDIO_KEYS", {
audioKeys: [AudioKey(uuid4())],
});
const { audioKeys, redoCommands, undoCommands } = store.state;
expect({ audioKeys, redoCommands, undoCommands }).toMatchSnapshot();
});
5 changes: 3 additions & 2 deletions tests/unit/store/utility.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
isOnCommandOrCtrlKeyDown,
filterCharacterInfosByStyleType,
} from "@/store/utility";
import { uuid4 } from "@/helpers/random";

function createDummyMora(text: string): Mora {
return {
Expand Down Expand Up @@ -305,13 +306,13 @@ describe("filterCharacterInfosByStyleType", () => {
const createCharacterInfo = (
styleTypes: (undefined | "talk" | "frame_decode" | "sing")[],
): CharacterInfo => {
const engineId = EngineId(crypto.randomUUID());
const engineId = EngineId(uuid4());
return {
portraitPath: "path/to/portrait",
metas: {
policy: "policy",
speakerName: "speakerName",
speakerUuid: SpeakerId(crypto.randomUUID()),
speakerUuid: SpeakerId(uuid4()),
styles: styleTypes.map((styleType) => ({
styleType,
styleName: "styleName",
Expand Down
Loading