Skip to content

Validation

The test suite runs on synthetic inputs, so it needs no game data. The experiments on this page check nnnotes against a whole game version, which you supply yourself: each one names what it checks, how to run it with your own configuration, and the result for the version named. Only commands and checks are listed. The outputs stay with whoever runs them.

The results below are for the Traditional Chinese release, client 1.0.1, catalog language zh-Hant, with its master data. The Japanese release has its own section.

Setup

nnnotes config check                          # every setting the commands below need is valid
nnnotes master download --latest -o work/master-bin --json > work/download.json
nnnotes master decode work/master-bin -o work/master --json > work/decode.json
nnnotes config set paths.master work/master

The lists of subjects come from the master data and the catalog:

python -c "from nnnotes.source.master import table; print(*sorted(r['_id'] for r in table('work/master', 'MasterAdv')), sep='\n')" > work/episodes.txt
nnnotes catalog keys --prefix Character/Live2D/ --limit 0 > work/live2d-keys.txt

Experiments

Experiment How to run it Result (client 1.0.1, zh-Hant)
Master data master download checks every file against the SHA-256 of MasterManifest.json; master decode reports each table it could not decode under failed every file verified, every table decoded
ADV episodes export episode ID for every id of episodes.txt 946 / 946 exported
Stories export story ID -o out/stories/ID for every id, all with the same models directory; then read every JSON file and resolve every path story.json and the files it indexes name 946 / 946 exported; every JSON file parses, every named file, model and cue exists
Story reproducibility export the stories that use frames, effects, post effects, stills, chats, talk windows or videos twice into two directories and compare them byte by byte 235 such episodes; the two exports are equal except the models directory path in story.json
Live2D models export live2d KEY for every model key of live2d-keys.txt (the keys ending in /model/<name>) 239 / 239 exported, 185 of them used by stories
CRI audio export audio CUE_SHEET for every cue sheet under Cri/Sound/ 681 / 681 decoded
Lives export live MUSIC_ID --difficulty D for every music and difficulty with a MasterLiveMusicScore row 336 / 336 exported
Spots and rooms export spot ID for every MasterHomeSpot row and export room KEY for every room background prefab; validate every .glb with the Khronos glTF-Validator 39 / 39 spots, 20 / 20 rooms; every reference resolves; every glb has 0 validator errors
Site, one region site build --all --all-live2d --all-stories --story-languages en --no-audio twice into two empty directories, then compare them 336 charts, 239 models, 946 stories; no failures file; the two sites are byte-identical
Site, every region site build --all --all-regions --format aac twice into two empty directories, then compare them 340 charts of 85 songs from the regions' current master data, five languages; no failures file; the two sites are byte-identical
Regions for each region and language, catalog keys --limit 0 and the catalog's bundles; compare the master tables a chart build reads across regions the regions serve the same catalog and bundles for a language with the same keys; the chart tables are equal across the three regions; the text tables have all five languages

Checks of every run

These hold for every command and are checked by the test suite on synthetic data:

  • A key, id or model that the catalog or the master data does not have stops the command with exit status 2 before any bundle is fetched or file written.
  • The documents of an asset export run (plan, tasks, results, artifacts, run manifest, layout, coverage, failures, cost) and the music data file validate against their JSON schemas.
  • The same inputs give byte-identical outputs (determinism).