Two lanes:
Plain-Node Jest (jest.unit.config.mjs), no build, no Blockbench. Covers
pure-logic modules that don't touch host globals.
unit/easing.test.ts— easing curve endpoints,step, arg parsing,EASING_OPTIONSunit/misc.test.ts—roundTo,roundToNth,scrubUndefined,detectCircularReferences,mapObjEntriesunit/stopwatch.test.ts— start/stop contract,Stopwatch.functionunit/minecraftUtil.test.ts— resource-location / data-pack / resource-pack path parsing,toSmallCaps,sanitizeStorageKey,resolveBlockstateValueTypeunit/fileUtil.test.ts— path normalisation, env-var expansion,swapPathRoot, tag-path detectionunit/collectionFile.test.ts—.bpcollectionparsing/validation, member and pack path resolution relative to the collectionunit/trueTypeFont.test.ts— TrueType/OpenType parsing for thettffont provider: cmap formats 4 and 12, outline format (glyf vs CFF), metrics, malformed-file errors
unit/setup.ts binds the PathModule global to node:path; unit/__stubs__/
replaces host-dependent sibling imports (fs accessor, block/registry lookups)
with no-ops so the pure functions can be imported.
jestbench: loads the built plugin into a real headless Blockbench
(jest.config.mjs + blockbench.config.mjs). Needs a production build first and
xvfb-run on Linux. First run downloads Blockbench + Minecraft assets to
~/.envbench.
Some internals are exposed on the AnimatedJava global purely so these tests
can reach them: renderRig, renderProjectAnimations, hashRig,
hashAnimations, and the Interaction outliner element class.
Outliner elements, variants & keyframes
outliner-elements.test.ts— the four types AJ registers (text_display,vanilla_item_display,vanilla_block_display,interaction): type registration, constructor defaults, property accessors,renderRignode mapping, codec round-tripvariants.test.ts—Variantname uniqueness / single-default rule,toJSON/fromJSON,TextureMap(map / remap / prune), codec round-trip,renderRigvariant outputcustom-keyframes.test.ts— the reshapedEffectAnimatorchannels, thevariant/function/execute_condition/repeatkeyframe accessors, animation-renderer frame output, codec round-trip
Format & migration
blueprint-codec-roundtrip.test.ts— bones / cubes / locator / text display / variants / animations / settings survive acompile→parseblueprint-fixtures-load.test.ts— every committed sample project (test_blueprints/,test_ajmodels/, incl. a1.4.ajmodel) migrates through the DFU chain and loadsblueprint-texture-groups.test.ts— regression for #407 (texture groups)texture-name-sanitizer.test.ts— regression for #337 (texture name rules)
Export pipeline
rig-renderer.test.ts— outliner →IRenderedRig: node-type mapping,includes_custom_models, texture collection,hashRigchange detectionanimation-renderer.test.ts— keyframe baking toIRenderedAnimation: per-tick frame count, per-node transforms, animated-channel change,hashAnimationsmolang-baking.test.ts— a Molang expression keyframe bakes identically to its literal;animation_variable_placeholdersround-tripexport-pipeline.test.ts—exportProjectwrites a real data pack + resource pack; runs across five target versions (1.20.4 / 1.21.2 / 1.21.5 / 26.2 / 26.3, one pergetMCBFilesByVersionbranch)export-contents.test.ts— inspects a realplayerexport:pack.mcmetapack_format,summonfunction body, a function per animation, scoreboard setup, block atlas, bone model JSON (geometry + textures), item model definitions, texture PNGsajmeta-incremental.test.ts— delete a bone from an exported project, re-export, assert the stale model file + ajmeta entry are removedplugin-mode-export.test.ts— plugin-mode single-JSON export (pluginCompiler) shapeblueprint-collection.test.ts— Blueprint Collections: the.bpcollectiontab (format, mode, page cards, drag-reorder and remove), saving links/unlinks members and relinks on Save As, folder and zip collection exports, saving unsaved tab edits before exporting, members exporting with the open tab's settings, removing rigs of members that left (but not rigs exported outside the collection), duplicate-ID and plugin-mode refusals
Minecraft asset systems
minecraft-assets.test.ts—assetManagerJSON/PNG lookups,blockModelManager/itemModelManagervanilla mesh builds,getBlockStatevanilla-display-rendering.test.ts—bmrModelRendererblockstate variant selection (stairs facing, slab type) and item-model predicate + display-mode resolutionpreview-resource-pack-font.test.ts— regression for a stale font-layout cachettf-font-provider.test.ts—ttffont providers (test-packs/ttf-font-pack/): FreeType (1.20.5+) vs stb_truetype (1.20.4) metrics,size/oversample/shift/skip, fallthrough to the next provider, CFF refusal on 1.20.5+, font reload on a target-version change, text-display mesh batches
UI & mods
ui-registration.test.ts— the Blueprint format, bar actions, panels and menu bar all register; thesrc/mods/class-property patches (Group,Keyframe,Locator) apply; the publicAnimatedJavaAPI surfaceui-behaviour.test.ts— firing actions does what clicking would: create-element actions add + select a node (and stay disabled off a Blueprint), the variant-panel actions create / duplicate / delete (never the default), and the About / Blueprint Settings / variant config / export-progress dialogs open and close
- deeper
datapackCompileroutput semantics (NBT of summoned entities, macro/storage animation modes, interaction/locator command wiring) — only structural checks today - the resource-pack font generation path (custom fonts, glyph atlas) beyond the stale-cache regression
- multi-variant item model definitions and per-variant model overrides
- dialog form round-trips (reading / writing settings through the Blueprint Settings sidebar UI) and Svelte component rendering — only open/close is checked
animationControllersupport andsrc/mods/behavioural patches (camera plugin bridge, painter, show-default-pose)