Land HyperTwist roadmap, validation ladder, and domain expansions
This commit is contained in:
parent
ab0d4714db
commit
f3cb1350a6
657 changed files with 114962 additions and 226 deletions
426
.idea/.idea.HyperTwist/.idea/vcs.xml
generated
426
.idea/.idea.HyperTwist/.idea/vcs.xml
generated
|
|
@ -31,6 +31,7 @@
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/apache/echarts" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/apache/echarts" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/brianpeiris/RiftSketch" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/brianpeiris/RiftSketch" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cahidenes/rubiks-cube-solver" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cahidenes/rubiks-cube-solver" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cjpais/Handy" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/coqui-ai/TTS" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/coqui-ai/TTS" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cubing/cubing.js" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cubing/cubing.js" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cutelyaware/magiccube4d" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/cutelyaware/magiccube4d" vcs="Git" />
|
||||||
|
|
@ -56,7 +57,6 @@
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/use-gesture" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/use-gesture" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/xr" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/xr" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/zustand" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/pmndrs/zustand" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/poliva/cubedex" vcs="Git" />
|
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/rhasspy/piper" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/rhasspy/piper" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/roice3/Magic120Cell" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/roice3/Magic120Cell" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/roice3/MagicCube5D" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/permissive/roice3/MagicCube5D" vcs="Git" />
|
||||||
|
|
@ -102,18 +102,442 @@
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/brownan/Rubiks-Cube-Solver" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/brownan/Rubiks-Cube-Solver" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cs0x7f/cstimer" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cs0x7f/cstimer" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/alg.js" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/alg.js" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/mark3" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/qqTimer" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/scramble-display" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/scramble.cubing.net" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/twisty.js" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/cubing/twisty.js" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/efrantar/rob-twophase" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/efrantar/rob-twophase" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/kash/cubedesk" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/kash/cubedesk" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/onionhoney/roux-trainers" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/onionhoney/roux-trainers" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/poliva/cubedex" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/remotion-dev/remotion" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/remotion-dev/remotion" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/screenpipe/screenpipe" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/screenpipe/screenpipe" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/vwcwong/CubeSim" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/HyperTwist/mirrors/restrictive/vwcwong/CubeSim" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/ScriptoriumAI" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/ScriptoriumAI" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell-worktrees/0r-c-2026-05-24-mattpocock-rkn-sqv-btry-mizchi/MayersScott-rkn-block-checker" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell-worktrees/0r-c-2026-05-24-mattpocock-rkn-sqv-btry-mizchi/mattpocock-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell-worktrees/0r-c-2026-05-24-mattpocock-rkn-sqv-btry-mizchi/mendrik-private-sqv" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell-worktrees/0r-c-2026-05-24-mattpocock-rkn-sqv-btry-mizchi/meribold-btry" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell-worktrees/0r-c-2026-05-24-mattpocock-rkn-sqv-btry-mizchi/mizchi-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/0xmassi/stik_app" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/1jehuang/jcode" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/1weiho/next-lens" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/1weiho/open-slide" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/21st-dev/1code" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/99xagency/godmodeskill" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Ademking/MD-This-Page" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/AgentOps-AI/tokencost" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/AgentWorkforce/relay" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/AgriciDaniel/claude-ads" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/AlpinDale/ssh-dashboard" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Anbeeld/WRITING.md" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Beever-AI/beever-atlas" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/BelfrySCAD/BOSL2" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/CadQuery/OCP" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/CadQuery/cadquery" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ChanningLua/prax-agent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ChuprinaDaria/Vibecode-Cleaner-Fartrun" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/CloakHQ/CloakBrowser" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ConardLi/garden-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/DenisSergeevitch/agents-best-practices" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Denvi/FlatCAM" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Dhravya/webpull" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/DodoApps/dodotidy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Doorman11991/smallcode" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/DucPhamNgoc08/CodeVisualizer" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ENTERPILOT/GOModel" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Einsia/OpenChronicle" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Eronred/expo-agent-spinners" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/EvanBacon/serve-sim" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Evokoa/pgGraph" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/FreePeak/LeanKG" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/GIN-SYSTEMS/vigil-tui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/GRVYDEV/marky" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/GammaLabTechnologies/harmonist" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Genymobile/scrcpy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/GridSpace/grid-apps" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Helvesec/rmux" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Infisical/agent-vault" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/KittyCAD/modeling-app" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/LearningCircuit/local-deep-research" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Lyx3314844-03/superspider" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Mark393295827/third-brain-v5-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/MayersScott/rkn-block-checker" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/NV404/gova" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/NYCU-Chung/cc-statusline" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/NikolayS/pgque" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/OpenCoworkAI/open-codesign" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/OpenOSINT/OpenOSINT" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/OpenSquilla/opensquilla" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/PentHertz/LUKSbox" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/PrathamLearnsToCode/paper2code" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/QuinnAho/claudemap" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ReviewStage/stage-cli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/RivoLink/leaf" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/RyanCodrai/turbovec" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/SquareWaveSystems/squarebox" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/TencentCloud/CubeSandbox" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/TheBigRoomXXL/tinyfeed" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/TheOrcDev/8bitcn-ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/Tommy-yw/RunbookHermes" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/VRSEN/OpenSwarm" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/VectifyAI/OpenKB" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/VoltAgent/awesome-design-md" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/XTraceAI/xtrace-sdk" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ZenNotes/zennotes" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ZeroZ-lab/cc-design" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/a2aproject/a2a" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aaif-goose/goose" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aarondfrancis/counselors" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/abdosorour7/git-commands-cheatsheet" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/actuallyepic/background-computer-use" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/addyosmani/agent-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/agavra/tuicr" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/agentscope-ai/agentscope" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/agnetlabs/laddr" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/agno-agi/agno" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/agno-agi/dash" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aguiarsc/wireframe-ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ahmedkhaleel2004/gitdiagram" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aidenybai/react-grab" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aiming-lab/SimpleMem" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aipotheosis-labs/aci" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/aira-security/mcp-armor" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/akazwz/hostc" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/akitaonrails/ai-memory" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/akshayaggarwal99/jarvis-ai-assistant" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/alash3al/stash" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/alez007/modelship" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/alibaba/page-agent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/alvinunreal/claude-pets" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/alvinunreal/openpets" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/areofyl/fetch" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/as0ni/pestats" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/awizemann/harness" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/awslabs/aidlc-workflows" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/b-nnett/codex-plusplus" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/backnotprop/rig" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/bensenescu/downy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/bergside/design-md-chrome" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/besimple-oss/broccoli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/bklit/bklit-ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/borgbackup/borg" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/bradautomates/claude-video" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/browser-use/browser-harness" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/browser-use/browser-harness-js" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/browser-use/bux" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/butthtio/solidity-cot-auditor" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/callstackincubator/agent-device" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cameroncooke/AXe" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cathrynlavery/diagram-design" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/chaosprint/hindsight" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/charlie947/social-media-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/chekusu/wanman" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/chorus-codes/chorus" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/chrisvel/tududi" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cigoria/simpleShare" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cjpais/Handy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cloudflare/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/codejunkie99/agentic-stack" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/coderamp-labs/gitingest" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/colbymchenry/codegraph" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/cosmicstack-labs/mercury-agent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/crafter-station/petdex" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/crynta/terax-ai" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/danish296/codevibes" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/darrylmorley/whatcable" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/dashersw/gea" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/dchu917/ctx" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/debba/gh-dashboard" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/decolua/9router" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/dirac-run/dirac" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/dodo-reach/hermes-desktop" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/doors-dev/doors" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/drasimwagan/mdv" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/drio/unixmagic" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/dropseed/plain" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/duane1024/l123" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/duriantaco/fyn" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/earthtojake/text-to-cad" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ehmo/code-overhaul-skill" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/elalish/manifold" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/endevco/aube" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ericjypark/codex-island" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/evanklem/evanflow" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/facebook/idb" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/facebook/pyrefly" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fancyai-official/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ffuf/ffuf" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fluffypony/dothething" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/flutter/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fogleman/sdf" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fougue/mayo" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fswatcher/fswatcher" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/fuego-wtf/graphyn-code" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/garritfra/cell" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/garrytan/gbrain" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/getagentseal/codeburn" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/gofsnotify/fsnotify" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/google/agents-cli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/google/android-emulator-container-scripts" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/google/android-emulator-webrtc" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/google/osv-scanner" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/greptileai/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/gridex/gridex" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/gumyr/build123d" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/hacktivist123/agent-session-resume" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/haidang1810/md2html" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/hannobraun/fornjot" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/harshkedia177/axon" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/haydenbleasel/files-sdk" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/heyadam/claudedesign-to-swiftui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/jal-co/shieldcn" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/jscad/OpenJSCAD.org" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/kontext-security/kontext-cli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/kunchenguid/autopreso" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/kwakseongjae/oh-my-design" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/lahfir/agent-desktop" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/langchain-ai/open-swe" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/laramint/laravel-brain" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/leopiney/linus-torvalds-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/leox255/loopsy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/lightseekorg/tokenspeed" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/lukeed/comptime" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/magicuidesign/magicui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mandiant/capa-rules" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mandiant/flare-floss" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/manojmallick/sigmap" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/maria-rcks/miri" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/maria-rcks/t1code" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/martian-engineering/lossless-claw" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/matthart1983/syswatch" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mattpocock/sandcastle" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mattpocock/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mendrik-private/sqv" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/microsoft/maker.js" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/microsoft/vscode" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mkeeter/antimony" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mobile-next/mobile-mcp" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/modem-dev/hunk" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/mozman/ezdxf" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nateherkai/AIS-OS" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nateherkai/token-dashboard" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nativewind/nativewind" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ncdai/chanhdai.com" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/neo4j-labs/create-context-graph" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nex-crm/wuphf" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nexu-io/open-design" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nkzw-tech/codiff" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nooga/let-go" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/nxrighthere/UnrealCLR" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/olivier-ls/php-fts" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/open-bias/open-bias" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/open-gsd/gsd-pi" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/open-multi-agent/open-multi-agent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/openai/symphony" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/openclaw/clawsweeper" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/orhun/ratty" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/outcomeops/context-engineering" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/outsourc-e/hermes-workspace" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/owasp-amass/amass" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/oxc-project/oxc" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pacifio/ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/perplexityai/bumblebee" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/phodal/routa" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pithings/ripgrep-node" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pithings/ripgrep-node/vendor/ripgrep" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/plandex-ai/plandex" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pluk-inc/markdown-preview" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/potpie-ai/potpie" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/productdevbook/ceviz" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/projectdiscovery/httpx" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/projectdiscovery/nuclei" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/_example_integration" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/ImAnim/ImAnim" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/ImCoolBar/ImCoolBar" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/ImFileDialog/ImFileDialog" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/ImGuiColorTextEdit/ImGuiColorTextEdit" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/ImGuizmo/ImGuizmo" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/glfw/glfw" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/hello_imgui/hello_imgui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/hello_imgui/hello_imgui/_example_integration" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/hello_imgui/hello_imgui/external/imgui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/hello_imgui/hello_imgui/hello_imgui_cmake/ios-cmake" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui-command-palette/imgui-command-palette" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui-knobs/imgui-knobs" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui-node-editor/imgui-node-editor" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui/imgui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_md/imgui_md" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_md/md4c" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_microtex/MicroTeX" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_test_engine/imgui_test_engine" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_test_engine/imgui_test_engine/imgui_test_suite/thirdparty/implot" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_tex_inspect/imgui_tex_inspect" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/imgui_toggle/imgui_toggle" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/immvision/immvision" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/implot/implot" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/implot3d/implot3d" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/nanovg/MetalNanoVG" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/pthom/imgui_bundle/external/nanovg/nanovg" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/rampstackco/claude-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/regent-vcs/re_gent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/rexa-developer/tiks" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ricosjp/truck" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/rmyndharis/OpenWA" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/rocky-data/rocky" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/rohitg00/agentmemory" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ronaldo-avalos/Maya" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/russellromney/honker" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sandeco/reversa" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/scheidydude/codeindex" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/seochecks-ai/slopless" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sgenoud/replicad" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sigcli/sigcli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sinanata/unity-ui-document-design-system" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sjsyrek/design-council" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/skydoves/compose-performance-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/smithersai/claude-p" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/smol-machines/smolvm" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sqliteai/adam" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/sslboard/throwaway" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/stainlu/hermes-labyrinth" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/stripe/link-cli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/strukto-ai/mirage" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/supermemoryai/codex-supermemory" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/supermemoryai/smfs" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/tashfeenahmed/freellmapi" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/taucad/tau" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/temporalio/samples-java" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/temporalio/sdk-java" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/temporalio/sdk-typescript" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/temporalio/sdk-typescript/packages/core-bridge/sdk-core" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/thClaws/thClaws" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/tintinweb/pi-subagents" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/tolibear/goalbuddy" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/tractorjuice/arc-kit" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/tw93/Kami" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/uesleibros/wasabi" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/ui-layouts/uilayouts" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/vercel-labs/deepsec" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/vincentkoc/tokenjuice" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/vinhnx/VTCode" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/vyfor/animate" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/wedow/ticket" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/wxtsky/byob" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/xigua-wang/skill-doctor" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/yapstudios/sfsym" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/zalo/CascadeStudio" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/zarazhangrui/beautiful-html-templates" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/zilliztech/claude-context" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/permissive/zolotukhin/zinc" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/1panel-dev/1panel" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/49Agents/49Agents" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/666ghj/mirofish" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/7ritn/VaulTLS" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/AIXerum/AI-Telegram-Assistant" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Adam-CAD/CADAM" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/AdamJonsson/CodeVR" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/AgriciDaniel/claude-seo" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/BRL-CAD/brlcad" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/BloodHoundAD/BloodHound" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/DavidHDev/react-bits" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/DavidHDev/svelte-bits" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Devvvmn/ActivSpot" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Dubibubii/usage-limit-reducer" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/FeSens/auto-arch-tournament" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Fmstrat/winapps" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/FreeCAD/FreeCAD" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/FreeCAD/FreeCAD-library" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/HugeCatLab/ChatTutor" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/IfcOpenShell/IfcOpenShell" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Imbad0202/academic-research-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/JacobStoren/SolveSpaceLib" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/LibreCAD/LibreCAD" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/LibreCAD/LibreCAD_3" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Open-Cascade-SAS/OCCT" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/OpenVSP/OpenVSP" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/RyjoxTechnologies/Octopoda-OS" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/SakanaAI/AI-Scientist" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/Salusoft89/planegcs" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/SteveTheKiller/KillerPDF" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus_upstream_pristine" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus_upstream_pristine" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus_working_reference" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/abhigyanpatwari/GitNexus_working_reference" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/ad-si/Coding-Flashcards" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/ad-si/LuaCAD" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/adrianhajdin/acquisitions" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/agentic-in/elephant-agent" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/aliasrobotics/cai" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/alireza0/s-ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/anvie/evonic" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/arcadeai/blueprint-mcp" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/as0ni/youtube-files" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/asciimoo/hister" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/asekachov/Markie" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/bartvantuijn/noton" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/baxy5/scificn-ui" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/browserbase/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/bruin-data/dac" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/brunoclz/br-acc" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/budtmo/docker-android" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/bundui/shadcn-admin-dashboard-free" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/calebwin/gitgres" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/chojs23/concord" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/dani-garcia/vaultwarden" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/donalffons/opencascade.js" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/dubstar-04/Design-Core" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/dune3d/dune3d" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/enchant97/note-mark" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/faiscadev/fakecloud" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/fendouai/CodexSaver" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/fosrl/newt" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/ghuntley/how-to-ralph-wiggum" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/golbin/agent-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/gonemedia/aipointer" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/iampedii/WhiteDNS" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/imtomt/ymawky" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/jasonkneen/agent-simulator" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/kapishdima/soundcn" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/libfive/libfive" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/lsferreira42/nfsdiag" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/manaflow-ai/cmux" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/meribold/btry" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/mizchi/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/mobile-next/mobilecli" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/multica-ai/multica" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/nakagami/grdpwasm" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/netalertx/NetAlertX" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/ogulcancelik/herdr" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/openscad/MCAD" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/openscad/openscad" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/orailnoor/DroidDesk" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/oven-sh/bun" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/qcad/qcad" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/refactoringhq/tolaria" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/rocketchat/rocket.chat" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/semgrep/semgrep" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/shadcnblocks/shadcn-ui-blocks" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/shadcnstudio/shadcn-studio" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/slavingia/skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/solvespace/solvespace" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/supabitapp/supacode" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/superhq-ai/superhq" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/t8y2/dbx" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/thananon/9arm-skills" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/tsurdilo/my-temporal-dockercompose" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/urbanadventurer/WhatWeb" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/vansh-nagar/Pixel-Perfect" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/warpdotdev/warp" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/waydabber/BetterDisplay" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/xiangechen/chili3d" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/xibyte/jsketcher" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/yantrikos/yantrikdb-server" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/yzhao062/agent-style" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/zarazhangrui/codebase-to-course" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/../Workspaces/VectorShell/mirrors/restrictive/zerx-lab/warp" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project/GPT 5.4 HyperTwist parse" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project/GPT 5.4 HyperTwist parse" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project/GPT 5.4 VectorShell parse" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$/../visual_studio_solutions/multi_project/GPT 5.4 VectorShell parse" vcs="Git" />
|
||||||
|
|
|
||||||
27
AGENTS.md
27
AGENTS.md
|
|
@ -6,9 +6,34 @@
|
||||||
## Build, Test, and Development Commands
|
## Build, Test, and Development Commands
|
||||||
Open `UnrealHyperTwist/UnrealHyperTwist.uproject` or `UnrealHyperTwist/UnrealHyperTwist.sln` in Visual Studio 2022 / Unreal Engine 5.7 for normal work. Use `git -C C:\HyperTwist status --short` before and after changes. The bootstrap CI check is defined in `.woodpecker/hypertwist-bootstrap.yml` and validates the presence of the Unreal project, source module root, and docs tree.
|
Open `UnrealHyperTwist/UnrealHyperTwist.uproject` or `UnrealHyperTwist/UnrealHyperTwist.sln` in Visual Studio 2022 / Unreal Engine 5.7 for normal work. Use `git -C C:\HyperTwist status --short` before and after changes. The bootstrap CI check is defined in `.woodpecker/hypertwist-bootstrap.yml` and validates the presence of the Unreal project, source module root, and docs tree.
|
||||||
|
|
||||||
|
For Unreal C++ validation, the canonical Windows build command is:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
"C:\Program Files\Epic Games\UE_5.7\Engine\Build\BatchFiles\Build.bat" UnrealHyperTwistEditor Win64 Development C:\HyperTwist\UnrealHyperTwist\UnrealHyperTwist.uproject -WaitMutex -NoHotReloadFromIDE
|
||||||
|
```
|
||||||
|
|
||||||
|
The governing doctrine for when this build is mandatory is:
|
||||||
|
|
||||||
|
- `C:\HyperTwist\docs\ops\HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md`
|
||||||
|
|
||||||
|
The current verified reverse-SSH Windows build lane is documented here:
|
||||||
|
|
||||||
|
- `C:\HyperTwist\docs\ops\HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md`
|
||||||
|
|
||||||
## Agent Instructions
|
## Agent Instructions
|
||||||
When Visual Studio MCP tools are available, prefer semantic solution/project/document tools over raw filesystem grep for C# or Unreal symbol work. Default the working scope to `UnrealHyperTwist/` and tracked repo docs before exploring mirrors or archived source material. Do not modify `mirrors/`, `zippedreposource/`, or `docs/refs/` unless the task is explicitly about provenance, intake, or operations. If you encounter Rust content under mirrored dependencies, anchor analysis on the nearest `Cargo.toml`; do not fabricate Rust workspace files for this repo.
|
When Visual Studio MCP tools are available, prefer semantic solution/project/document tools over raw filesystem grep for C# or Unreal symbol work. Default the working scope to `UnrealHyperTwist/` and tracked repo docs before exploring mirrors or archived source material. Do not modify `mirrors/`, `zippedreposource/`, or `docs/refs/` unless the task is explicitly about provenance, intake, or operations. If you encounter Rust content under mirrored dependencies, anchor analysis on the nearest `Cargo.toml`; do not fabricate Rust workspace files for this repo.
|
||||||
|
|
||||||
|
For Unreal C++ work, do not describe a slice as landed or fully validated from
|
||||||
|
symbol checks, doc checks, or whitespace checks alone. Unless the user
|
||||||
|
explicitly changes the rule, run the canonical Windows Unreal build once per
|
||||||
|
logical C++ slice and say plainly whether it passed, failed, or was not run.
|
||||||
|
If the build is being done through the Windows reverse tunnel, use the current
|
||||||
|
verified `localhost:22022` path documented in the verification note rather
|
||||||
|
than falling back to guesswork or placeholder ports.
|
||||||
|
The current Linux-side pickup sequence for that lane is now explicitly
|
||||||
|
recorded in the sensitive runbook section `21A`, including the shared VPS key
|
||||||
|
staging step and the Windows password-backed connect-back command.
|
||||||
|
|
||||||
For HyperTwist repo evaluation, repo-custody, or license-audit work, a deep-source closeout is not complete when only the packet and root legal tracker were updated. Before calling the pass closed, explicitly check and update when applicable:
|
For HyperTwist repo evaluation, repo-custody, or license-audit work, a deep-source closeout is not complete when only the packet and root legal tracker were updated. Before calling the pass closed, explicitly check and update when applicable:
|
||||||
- `docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md`
|
- `docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md`
|
||||||
- `docs/ops/HYPERTWIST_RETROACTIVE_AUTHORITY_AND_CLEANUP_BACKFILL_2026-05-20.md` when later evidence changes a relied-on slice or backfill interpretation
|
- `docs/ops/HYPERTWIST_RETROACTIVE_AUTHORITY_AND_CLEANUP_BACKFILL_2026-05-20.md` when later evidence changes a relied-on slice or backfill interpretation
|
||||||
|
|
@ -20,6 +45,8 @@ For HyperTwist repo evaluation, repo-custody, or license-audit work, a deep-sour
|
||||||
- `docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv`
|
- `docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv`
|
||||||
- `docs/generated/license_audit/MIT_LICENSE_TEXTS_2026-05-27/` and `docs/generated/license_audit/THIRD_PARTY_NOTICES_MIT_DRAFT_2026-05-27.txt` when the repo resolves to `MIT`
|
- `docs/generated/license_audit/MIT_LICENSE_TEXTS_2026-05-27/` and `docs/generated/license_audit/THIRD_PARTY_NOTICES_MIT_DRAFT_2026-05-27.txt` when the repo resolves to `MIT`
|
||||||
- `scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1`
|
- `scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1`
|
||||||
|
- `docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md` when Unreal build-validation posture or command changes
|
||||||
|
- `docs/ops/HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md` when the verified reverse-tunnel path or proof details change
|
||||||
|
|
||||||
The current HyperTwist restart endpoint for this sequence is `C:\HyperTwist\docs\ops\HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md`.
|
The current HyperTwist restart endpoint for this sequence is `C:\HyperTwist\docs\ops\HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md`.
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -97,6 +97,32 @@ namespace HyperTwistHttpSpeechClientInternal
|
||||||
return Client.ProviderLabel;
|
return Client.ProviderLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TArray<FString> BuildRetrievedHints(const FHyperTwistSpeechSessionConfig* SessionConfig)
|
||||||
|
{
|
||||||
|
TArray<FString> RetrievedHints;
|
||||||
|
if (SessionConfig == nullptr
|
||||||
|
|| !SessionConfig->OrchestrationProfile.bEnableRetrievedHintAugmentation)
|
||||||
|
{
|
||||||
|
return RetrievedHints;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int32 MaxHintCount =
|
||||||
|
FMath::Max(SessionConfig->OrchestrationProfile.MaxRetrievedHintCount, 0);
|
||||||
|
for (const FString& CommandHint : SessionConfig->CommandHints)
|
||||||
|
{
|
||||||
|
if (!CommandHint.IsEmpty())
|
||||||
|
{
|
||||||
|
RetrievedHints.Add(CommandHint);
|
||||||
|
}
|
||||||
|
if (RetrievedHints.Num() >= MaxHintCount)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return RetrievedHints;
|
||||||
|
}
|
||||||
|
|
||||||
struct FHttpJsonResponse
|
struct FHttpJsonResponse
|
||||||
{
|
{
|
||||||
bool bCompleted = false;
|
bool bCompleted = false;
|
||||||
|
|
@ -308,16 +334,22 @@ FHyperTwistSpeechTranscriptResult UHyperTwistHttpSpeechClient::TranscribeSpeechU
|
||||||
{
|
{
|
||||||
Result.ProcessedClipCount = 1;
|
Result.ProcessedClipCount = 1;
|
||||||
}
|
}
|
||||||
|
if (Result.AppliedBatchCollectionWindowMs <= 0)
|
||||||
|
{
|
||||||
|
Result.AppliedBatchCollectionWindowMs =
|
||||||
|
SessionConfig->OrchestrationProfile.BatchCollectionWindowMs;
|
||||||
|
}
|
||||||
Result.bWordTimestampsRequested =
|
Result.bWordTimestampsRequested =
|
||||||
Result.bWordTimestampsRequested || SessionConfig->OrchestrationProfile.bEnableWordTimestamps;
|
Result.bWordTimestampsRequested || SessionConfig->OrchestrationProfile.bEnableWordTimestamps;
|
||||||
Result.bConditionedOnPreviousText =
|
Result.bConditionedOnPreviousText =
|
||||||
Result.bConditionedOnPreviousText || SessionConfig->OrchestrationProfile.bConditionOnPreviousText;
|
Result.bConditionedOnPreviousText || SessionConfig->OrchestrationProfile.bConditionOnPreviousText;
|
||||||
Result.bUsedBatchedInference =
|
Result.bUsedBatchedInference =
|
||||||
Result.bUsedBatchedInference || SessionConfig->OrchestrationProfile.bEnableBatchedInference;
|
Result.bUsedBatchedInference || SessionConfig->OrchestrationProfile.bEnableBatchedInference;
|
||||||
Result.bUsedPromptHints =
|
if (Result.AppliedPromptRoutingModeId.IsEmpty())
|
||||||
Result.bUsedPromptHints
|
{
|
||||||
|| !SessionConfig->OrchestrationProfile.PrefixHint.IsEmpty()
|
Result.AppliedPromptRoutingModeId =
|
||||||
|| SessionConfig->OrchestrationProfile.HotwordHints.Num() > 0;
|
SessionConfig->OrchestrationProfile.PromptRoutingModeId;
|
||||||
|
}
|
||||||
if (Result.AppliedPrefixHint.IsEmpty())
|
if (Result.AppliedPrefixHint.IsEmpty())
|
||||||
{
|
{
|
||||||
Result.AppliedPrefixHint = SessionConfig->OrchestrationProfile.PrefixHint;
|
Result.AppliedPrefixHint = SessionConfig->OrchestrationProfile.PrefixHint;
|
||||||
|
|
@ -326,6 +358,24 @@ FHyperTwistSpeechTranscriptResult UHyperTwistHttpSpeechClient::TranscribeSpeechU
|
||||||
{
|
{
|
||||||
Result.AppliedHotwordHints = SessionConfig->OrchestrationProfile.HotwordHints;
|
Result.AppliedHotwordHints = SessionConfig->OrchestrationProfile.HotwordHints;
|
||||||
}
|
}
|
||||||
|
if (Result.AppliedRetrievalContextLaneId.IsEmpty())
|
||||||
|
{
|
||||||
|
Result.AppliedRetrievalContextLaneId =
|
||||||
|
SessionConfig->OrchestrationProfile.RetrievalContextLaneId;
|
||||||
|
}
|
||||||
|
if (Result.AppliedRetrievedHints.Num() <= 0)
|
||||||
|
{
|
||||||
|
Result.AppliedRetrievedHints =
|
||||||
|
HyperTwistHttpSpeechClientInternal::BuildRetrievedHints(SessionConfig);
|
||||||
|
}
|
||||||
|
Result.RetrievedHintCount = Result.AppliedRetrievedHints.Num();
|
||||||
|
Result.bUsedRetrievedHintAugmentation =
|
||||||
|
Result.bUsedRetrievedHintAugmentation || Result.RetrievedHintCount > 0;
|
||||||
|
Result.bUsedPromptHints =
|
||||||
|
Result.bUsedPromptHints
|
||||||
|
|| !Result.AppliedPrefixHint.IsEmpty()
|
||||||
|
|| Result.AppliedHotwordHints.Num() > 0
|
||||||
|
|| Result.bUsedRetrievedHintAugmentation;
|
||||||
if (Result.LanguageProbability <= 0.0f
|
if (Result.LanguageProbability <= 0.0f
|
||||||
&& !SessionConfig->LanguageMode.IsEmpty()
|
&& !SessionConfig->LanguageMode.IsEmpty()
|
||||||
&& !SessionConfig->LanguageMode.Equals(TEXT("auto"), ESearchCase::IgnoreCase))
|
&& !SessionConfig->LanguageMode.Equals(TEXT("auto"), ESearchCase::IgnoreCase))
|
||||||
|
|
@ -413,9 +463,12 @@ FHyperTwistSpeechServiceHealth UHyperTwistHttpSpeechClient::GetSpeechServiceHeal
|
||||||
TEXT("streamingPreview"),
|
TEXT("streamingPreview"),
|
||||||
TEXT("manualTranscriptCommit"),
|
TEXT("manualTranscriptCommit"),
|
||||||
TEXT("batchedTranscribe"),
|
TEXT("batchedTranscribe"),
|
||||||
|
TEXT("batchWindowTuning"),
|
||||||
TEXT("wordTimestamps"),
|
TEXT("wordTimestamps"),
|
||||||
TEXT("languageDetection"),
|
TEXT("languageDetection"),
|
||||||
TEXT("promptHints"),
|
TEXT("promptHints"),
|
||||||
|
TEXT("promptRoutingProfiles"),
|
||||||
|
TEXT("retrievalHintAugmentation"),
|
||||||
TEXT("providerProfileCustody"),
|
TEXT("providerProfileCustody"),
|
||||||
TEXT("byokCustody"),
|
TEXT("byokCustody"),
|
||||||
TEXT("providerRoutingPolicy"),
|
TEXT("providerRoutingPolicy"),
|
||||||
|
|
@ -597,9 +650,12 @@ FHyperTwistSpeechServiceHealth UHyperTwistHttpSpeechClient::GetSpeechServiceHeal
|
||||||
Health.Capabilities.AddUnique(TEXT("transport:http"));
|
Health.Capabilities.AddUnique(TEXT("transport:http"));
|
||||||
Health.Capabilities.AddUnique(TEXT("provider-backed-speech"));
|
Health.Capabilities.AddUnique(TEXT("provider-backed-speech"));
|
||||||
Health.Capabilities.AddUnique(TEXT("batchedTranscribe"));
|
Health.Capabilities.AddUnique(TEXT("batchedTranscribe"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("batchWindowTuning"));
|
||||||
Health.Capabilities.AddUnique(TEXT("wordTimestamps"));
|
Health.Capabilities.AddUnique(TEXT("wordTimestamps"));
|
||||||
Health.Capabilities.AddUnique(TEXT("languageDetection"));
|
Health.Capabilities.AddUnique(TEXT("languageDetection"));
|
||||||
Health.Capabilities.AddUnique(TEXT("promptHints"));
|
Health.Capabilities.AddUnique(TEXT("promptHints"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("promptRoutingProfiles"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("retrievalHintAugmentation"));
|
||||||
Health.Capabilities.AddUnique(TEXT("providerProfileCustody"));
|
Health.Capabilities.AddUnique(TEXT("providerProfileCustody"));
|
||||||
Health.Capabilities.AddUnique(TEXT("byokCustody"));
|
Health.Capabilities.AddUnique(TEXT("byokCustody"));
|
||||||
Health.Capabilities.AddUnique(TEXT("providerRoutingPolicy"));
|
Health.Capabilities.AddUnique(TEXT("providerRoutingPolicy"));
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#include "HyperTwistRecognition/HyperTwistVoiceClient.h"
|
#include "HyperTwistRecognition/HyperTwistVoiceClient.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
#include "Dom/JsonObject.h"
|
#include "Dom/JsonObject.h"
|
||||||
#include "Http.h"
|
#include "Http.h"
|
||||||
#include "HttpManager.h"
|
#include "HttpManager.h"
|
||||||
|
|
@ -380,25 +382,18 @@ FHyperTwistNarrationSynthesisResult UHyperTwistHttpVoiceClient::SynthesizeNarrat
|
||||||
|
|
||||||
FHyperTwistVoiceServiceHealth UHyperTwistHttpVoiceClient::GetVoiceServiceHealth() const
|
FHyperTwistVoiceServiceHealth UHyperTwistHttpVoiceClient::GetVoiceServiceHealth() const
|
||||||
{
|
{
|
||||||
FHyperTwistVoiceServiceHealth Health;
|
const auto BuildUnavailableHealth = [this]() -> FHyperTwistVoiceServiceHealth
|
||||||
Health.ProviderLabel = ProviderLabel;
|
{
|
||||||
Health.ServiceVersion = TEXT("provider-unavailable/v1");
|
FHyperTwistVoiceServiceHealth Health = UHyperTwistContractLibrary::MakeMockVoiceServiceHealth();
|
||||||
Health.ServiceEndpoint = ServiceBaseUrl;
|
Health.ProviderLabel = ProviderLabel;
|
||||||
Health.Capabilities = {
|
Health.ServiceVersion = TEXT("provider-unavailable/v1");
|
||||||
TEXT("transport:http"),
|
Health.ServiceEndpoint = ServiceBaseUrl;
|
||||||
TEXT("provider-backed-voice"),
|
Health.Capabilities.AddUnique(TEXT("transport:http"));
|
||||||
TEXT("voiceCatalog"),
|
Health.Capabilities.AddUnique(TEXT("provider-backed-voice"));
|
||||||
TEXT("offlineNarration"),
|
Health.bReady = false;
|
||||||
TEXT("wavOutput"),
|
Health.LastError = LastTransportError;
|
||||||
TEXT("subtitleSeed"),
|
return Health;
|
||||||
TEXT("multiSpeakerNarration"),
|
|
||||||
TEXT("multiLingualNarration"),
|
|
||||||
TEXT("speakerReferenceConditioning"),
|
|
||||||
TEXT("sentenceSplitNarration"),
|
|
||||||
TEXT("modelBindingSelection"),
|
|
||||||
TEXT("vocoderBindingSelection")
|
|
||||||
};
|
};
|
||||||
Health.bReady = false;
|
|
||||||
|
|
||||||
HyperTwistHttpVoiceClientInternal::FHttpResponseState Response;
|
HyperTwistHttpVoiceClientInternal::FHttpResponseState Response;
|
||||||
if (!HyperTwistHttpVoiceClientInternal::ExecuteRequest(
|
if (!HyperTwistHttpVoiceClientInternal::ExecuteRequest(
|
||||||
|
|
@ -411,49 +406,20 @@ FHyperTwistVoiceServiceHealth UHyperTwistHttpVoiceClient::GetVoiceServiceHealth(
|
||||||
Response))
|
Response))
|
||||||
{
|
{
|
||||||
LastTransportError = Response.Error;
|
LastTransportError = Response.Error;
|
||||||
Health.LastError = LastTransportError;
|
return BuildUnavailableHealth();
|
||||||
return Health;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FHyperTwistVoiceServiceHealth Health;
|
||||||
if (!HyperTwistHttpVoiceClientInternal::DeserializeStruct(Response.ResponseBody, Health)
|
if (!HyperTwistHttpVoiceClientInternal::DeserializeStruct(Response.ResponseBody, Health)
|
||||||
|| !Health.IsStructurallyValid())
|
|| !Health.IsStructurallyValid())
|
||||||
{
|
{
|
||||||
LastTransportError = TEXT("invalid-provider-response");
|
LastTransportError = TEXT("invalid-provider-response");
|
||||||
Health = FHyperTwistVoiceServiceHealth();
|
return BuildUnavailableHealth();
|
||||||
Health.ProviderLabel = ProviderLabel;
|
|
||||||
Health.ServiceVersion = TEXT("provider-unavailable/v1");
|
|
||||||
Health.ServiceEndpoint = ServiceBaseUrl;
|
|
||||||
Health.Capabilities = {
|
|
||||||
TEXT("transport:http"),
|
|
||||||
TEXT("provider-backed-voice"),
|
|
||||||
TEXT("voiceCatalog"),
|
|
||||||
TEXT("offlineNarration"),
|
|
||||||
TEXT("wavOutput"),
|
|
||||||
TEXT("subtitleSeed"),
|
|
||||||
TEXT("multiSpeakerNarration"),
|
|
||||||
TEXT("multiLingualNarration"),
|
|
||||||
TEXT("speakerReferenceConditioning"),
|
|
||||||
TEXT("sentenceSplitNarration"),
|
|
||||||
TEXT("modelBindingSelection"),
|
|
||||||
TEXT("vocoderBindingSelection")
|
|
||||||
};
|
|
||||||
Health.SupportedOrchestrationProfiles = {
|
|
||||||
TEXT("local-basic-narration-v1"),
|
|
||||||
TEXT("python-multispeaker-narration-v1")
|
|
||||||
};
|
|
||||||
Health.SupportedModelBindingIds = {
|
|
||||||
TEXT("voice-model/local-offline-medium-v1"),
|
|
||||||
TEXT("voice-model/multilingual-premium-v1")
|
|
||||||
};
|
|
||||||
Health.SupportedVocoderBindingIds = {
|
|
||||||
TEXT("vocoder/default-mono-v1"),
|
|
||||||
TEXT("vocoder/high-fidelity-v1")
|
|
||||||
};
|
|
||||||
Health.bReady = false;
|
|
||||||
Health.LastError = LastTransportError;
|
|
||||||
return Health;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceServiceHealth DefaultHealth =
|
||||||
|
UHyperTwistContractLibrary::MakeMockVoiceServiceHealth();
|
||||||
|
|
||||||
if (Health.ProviderLabel.IsEmpty())
|
if (Health.ProviderLabel.IsEmpty())
|
||||||
{
|
{
|
||||||
Health.ProviderLabel = ProviderLabel;
|
Health.ProviderLabel = ProviderLabel;
|
||||||
|
|
@ -475,12 +441,39 @@ FHyperTwistVoiceServiceHealth UHyperTwistHttpVoiceClient::GetVoiceServiceHealth(
|
||||||
Health.Capabilities.AddUnique(TEXT("sentenceSplitNarration"));
|
Health.Capabilities.AddUnique(TEXT("sentenceSplitNarration"));
|
||||||
Health.Capabilities.AddUnique(TEXT("modelBindingSelection"));
|
Health.Capabilities.AddUnique(TEXT("modelBindingSelection"));
|
||||||
Health.Capabilities.AddUnique(TEXT("vocoderBindingSelection"));
|
Health.Capabilities.AddUnique(TEXT("vocoderBindingSelection"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("downloadableVoiceAssetReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("voiceModelCardReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("downloadableVoiceModelReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("modelLicenseSelectionReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("termsAcceptanceReview"));
|
||||||
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("local-basic-narration-v1"));
|
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("local-basic-narration-v1"));
|
||||||
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("python-multispeaker-narration-v1"));
|
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("python-multispeaker-narration-v1"));
|
||||||
Health.SupportedModelBindingIds.AddUnique(TEXT("voice-model/local-offline-medium-v1"));
|
Health.SupportedModelBindingIds.AddUnique(TEXT("voice-model/local-offline-medium-v1"));
|
||||||
Health.SupportedModelBindingIds.AddUnique(TEXT("voice-model/multilingual-premium-v1"));
|
Health.SupportedModelBindingIds.AddUnique(TEXT("voice-model/multilingual-premium-v1"));
|
||||||
Health.SupportedVocoderBindingIds.AddUnique(TEXT("vocoder/default-mono-v1"));
|
Health.SupportedVocoderBindingIds.AddUnique(TEXT("vocoder/default-mono-v1"));
|
||||||
Health.SupportedVocoderBindingIds.AddUnique(TEXT("vocoder/high-fidelity-v1"));
|
Health.SupportedVocoderBindingIds.AddUnique(TEXT("vocoder/high-fidelity-v1"));
|
||||||
|
if (Health.VoiceAssetReviewProfileId.IsEmpty()
|
||||||
|
|| !Health.VoiceAssetReviewProfileDefinition.IsStructurallyValid())
|
||||||
|
{
|
||||||
|
Health.VoiceAssetReviewProfileId = DefaultHealth.VoiceAssetReviewProfileId;
|
||||||
|
Health.VoiceAssetReviewProfileDefinition = DefaultHealth.VoiceAssetReviewProfileDefinition;
|
||||||
|
}
|
||||||
|
if (Health.SupportedVoiceAssetIds.Num() <= 0 || Health.SupportedVoiceAssets.Num() <= 0)
|
||||||
|
{
|
||||||
|
Health.SupportedVoiceAssetIds = DefaultHealth.SupportedVoiceAssetIds;
|
||||||
|
Health.SupportedVoiceAssets = DefaultHealth.SupportedVoiceAssets;
|
||||||
|
}
|
||||||
|
if (Health.VoiceModelReviewProfileId.IsEmpty()
|
||||||
|
|| !Health.VoiceModelReviewProfileDefinition.IsStructurallyValid())
|
||||||
|
{
|
||||||
|
Health.VoiceModelReviewProfileId = DefaultHealth.VoiceModelReviewProfileId;
|
||||||
|
Health.VoiceModelReviewProfileDefinition = DefaultHealth.VoiceModelReviewProfileDefinition;
|
||||||
|
}
|
||||||
|
if (Health.SupportedVoiceModelReviewIds.Num() <= 0 || Health.SupportedVoiceModelReviews.Num() <= 0)
|
||||||
|
{
|
||||||
|
Health.SupportedVoiceModelReviewIds = DefaultHealth.SupportedVoiceModelReviewIds;
|
||||||
|
Health.SupportedVoiceModelReviews = DefaultHealth.SupportedVoiceModelReviews;
|
||||||
|
}
|
||||||
LastTransportError.Reset();
|
LastTransportError.Reset();
|
||||||
Health.LastError.Reset();
|
Health.LastError.Reset();
|
||||||
return Health;
|
return Health;
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,32 @@ namespace HyperTwistMockSpeechClientInternal
|
||||||
|
|
||||||
return TEXT("ready coach");
|
return TEXT("ready coach");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TArray<FString> BuildRetrievedHints(const FHyperTwistSpeechSessionConfig* SessionConfig)
|
||||||
|
{
|
||||||
|
TArray<FString> RetrievedHints;
|
||||||
|
if (SessionConfig == nullptr
|
||||||
|
|| !SessionConfig->OrchestrationProfile.bEnableRetrievedHintAugmentation)
|
||||||
|
{
|
||||||
|
return RetrievedHints;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int32 MaxHintCount =
|
||||||
|
FMath::Max(SessionConfig->OrchestrationProfile.MaxRetrievedHintCount, 0);
|
||||||
|
for (const FString& CommandHint : SessionConfig->CommandHints)
|
||||||
|
{
|
||||||
|
if (!CommandHint.IsEmpty())
|
||||||
|
{
|
||||||
|
RetrievedHints.Add(CommandHint);
|
||||||
|
}
|
||||||
|
if (RetrievedHints.Num() >= MaxHintCount)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return RetrievedHints;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UHyperTwistMockSpeechClient::OpenSpeechSession(const FHyperTwistSpeechSessionConfig& Config, FString& OutError)
|
bool UHyperTwistMockSpeechClient::OpenSpeechSession(const FHyperTwistSpeechSessionConfig& Config, FString& OutError)
|
||||||
|
|
@ -84,15 +110,26 @@ FHyperTwistSpeechTranscriptResult UHyperTwistMockSpeechClient::TranscribeSpeechU
|
||||||
Result.ServiceLaneId = SessionConfig->OrchestrationProfile.ServiceLaneId;
|
Result.ServiceLaneId = SessionConfig->OrchestrationProfile.ServiceLaneId;
|
||||||
Result.RequestedBatchSize = SessionConfig->OrchestrationProfile.PreferredBatchSize;
|
Result.RequestedBatchSize = SessionConfig->OrchestrationProfile.PreferredBatchSize;
|
||||||
Result.ProcessedClipCount = 1;
|
Result.ProcessedClipCount = 1;
|
||||||
|
Result.AppliedBatchCollectionWindowMs =
|
||||||
|
SessionConfig->OrchestrationProfile.BatchCollectionWindowMs;
|
||||||
Result.bUsedBatchedInference = SessionConfig->OrchestrationProfile.bEnableBatchedInference;
|
Result.bUsedBatchedInference = SessionConfig->OrchestrationProfile.bEnableBatchedInference;
|
||||||
Result.bWordTimestampsRequested = SessionConfig->OrchestrationProfile.bEnableWordTimestamps;
|
Result.bWordTimestampsRequested = SessionConfig->OrchestrationProfile.bEnableWordTimestamps;
|
||||||
Result.bConditionedOnPreviousText = SessionConfig->OrchestrationProfile.bConditionOnPreviousText;
|
Result.bConditionedOnPreviousText = SessionConfig->OrchestrationProfile.bConditionOnPreviousText;
|
||||||
Result.bUsedPromptHints =
|
Result.AppliedPromptRoutingModeId =
|
||||||
!SessionConfig->OrchestrationProfile.PrefixHint.IsEmpty()
|
SessionConfig->OrchestrationProfile.PromptRoutingModeId;
|
||||||
|| SessionConfig->OrchestrationProfile.HotwordHints.Num() > 0;
|
Result.AppliedRetrievalContextLaneId =
|
||||||
|
SessionConfig->OrchestrationProfile.RetrievalContextLaneId;
|
||||||
Result.LanguageProbability = SessionConfig->OrchestrationProfile.bEnableLanguageDetection ? 0.97f : 1.0f;
|
Result.LanguageProbability = SessionConfig->OrchestrationProfile.bEnableLanguageDetection ? 0.97f : 1.0f;
|
||||||
Result.AppliedPrefixHint = SessionConfig->OrchestrationProfile.PrefixHint;
|
Result.AppliedPrefixHint = SessionConfig->OrchestrationProfile.PrefixHint;
|
||||||
Result.AppliedHotwordHints = SessionConfig->OrchestrationProfile.HotwordHints;
|
Result.AppliedHotwordHints = SessionConfig->OrchestrationProfile.HotwordHints;
|
||||||
|
Result.AppliedRetrievedHints =
|
||||||
|
HyperTwistMockSpeechClientInternal::BuildRetrievedHints(SessionConfig);
|
||||||
|
Result.RetrievedHintCount = Result.AppliedRetrievedHints.Num();
|
||||||
|
Result.bUsedRetrievedHintAugmentation = Result.RetrievedHintCount > 0;
|
||||||
|
Result.bUsedPromptHints =
|
||||||
|
!Result.AppliedPrefixHint.IsEmpty()
|
||||||
|
|| Result.AppliedHotwordHints.Num() > 0
|
||||||
|
|| Result.bUsedRetrievedHintAugmentation;
|
||||||
|
|
||||||
FHyperTwistSpeechTranscriptSegment Segment;
|
FHyperTwistSpeechTranscriptSegment Segment;
|
||||||
Segment.SegmentOrdinal = 0;
|
Segment.SegmentOrdinal = 0;
|
||||||
|
|
@ -146,9 +183,12 @@ FHyperTwistSpeechServiceHealth UHyperTwistMockSpeechClient::GetSpeechServiceHeal
|
||||||
Health.Capabilities.AddUnique(TEXT("streamingPreview"));
|
Health.Capabilities.AddUnique(TEXT("streamingPreview"));
|
||||||
Health.Capabilities.AddUnique(TEXT("manualTranscriptCommit"));
|
Health.Capabilities.AddUnique(TEXT("manualTranscriptCommit"));
|
||||||
Health.Capabilities.AddUnique(TEXT("batchedTranscribe"));
|
Health.Capabilities.AddUnique(TEXT("batchedTranscribe"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("batchWindowTuning"));
|
||||||
Health.Capabilities.AddUnique(TEXT("wordTimestamps"));
|
Health.Capabilities.AddUnique(TEXT("wordTimestamps"));
|
||||||
Health.Capabilities.AddUnique(TEXT("languageDetection"));
|
Health.Capabilities.AddUnique(TEXT("languageDetection"));
|
||||||
Health.Capabilities.AddUnique(TEXT("promptHints"));
|
Health.Capabilities.AddUnique(TEXT("promptHints"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("promptRoutingProfiles"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("retrievalHintAugmentation"));
|
||||||
Health.Capabilities.AddUnique(TEXT("providerRoutingPolicy"));
|
Health.Capabilities.AddUnique(TEXT("providerRoutingPolicy"));
|
||||||
Health.Capabilities.AddUnique(TEXT("providerRouteSelection"));
|
Health.Capabilities.AddUnique(TEXT("providerRouteSelection"));
|
||||||
Health.Capabilities.AddUnique(TEXT("workflowPolicyState"));
|
Health.Capabilities.AddUnique(TEXT("workflowPolicyState"));
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,11 @@ FHyperTwistVoiceServiceHealth UHyperTwistMockVoiceClient::GetVoiceServiceHealth(
|
||||||
Health.Capabilities.AddUnique(TEXT("sentenceSplitNarration"));
|
Health.Capabilities.AddUnique(TEXT("sentenceSplitNarration"));
|
||||||
Health.Capabilities.AddUnique(TEXT("modelBindingSelection"));
|
Health.Capabilities.AddUnique(TEXT("modelBindingSelection"));
|
||||||
Health.Capabilities.AddUnique(TEXT("vocoderBindingSelection"));
|
Health.Capabilities.AddUnique(TEXT("vocoderBindingSelection"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("downloadableVoiceAssetReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("voiceModelCardReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("downloadableVoiceModelReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("modelLicenseSelectionReview"));
|
||||||
|
Health.Capabilities.AddUnique(TEXT("termsAcceptanceReview"));
|
||||||
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("local-basic-narration-v1"));
|
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("local-basic-narration-v1"));
|
||||||
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("python-multispeaker-narration-v1"));
|
Health.SupportedOrchestrationProfiles.AddUnique(TEXT("python-multispeaker-narration-v1"));
|
||||||
return Health;
|
return Health;
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,956 @@
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingLearnedSearchLibrary.h"
|
||||||
|
|
||||||
|
namespace HyperTwistTrainingLearnedSearchLibraryInternal
|
||||||
|
{
|
||||||
|
const TCHAR* LearnedSearchLicense = TEXT("MIT");
|
||||||
|
const TCHAR* LearnedSearchRepo = TEXT("yakupbilen/drl-rubiks-cube");
|
||||||
|
|
||||||
|
FHyperTwistTrainingSourceAttribution MakeDirectDonorAttribution(
|
||||||
|
const FString& TrackId,
|
||||||
|
const FString& Notes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingSourceAttribution Attribution;
|
||||||
|
Attribution.SourceMode = EHyperTwistTrainingSourceMode::DirectDonor;
|
||||||
|
Attribution.SourceRepo = LearnedSearchRepo;
|
||||||
|
Attribution.SourceLicense = LearnedSearchLicense;
|
||||||
|
Attribution.SourceTrackId = TrackId;
|
||||||
|
Attribution.SourceNotes = Notes;
|
||||||
|
return Attribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistTrainingSourceAttribution MakeFirstPartyAttribution(
|
||||||
|
const FString& TrackId,
|
||||||
|
const FString& Notes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingSourceAttribution Attribution;
|
||||||
|
Attribution.SourceMode = EHyperTwistTrainingSourceMode::FirstParty;
|
||||||
|
Attribution.SourceRepo = LearnedSearchRepo;
|
||||||
|
Attribution.SourceLicense = LearnedSearchLicense;
|
||||||
|
Attribution.SourceTrackId = TrackId;
|
||||||
|
Attribution.SourceNotes = Notes;
|
||||||
|
return Attribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchPackageReference MakePackageReference(
|
||||||
|
const FString& PackageId,
|
||||||
|
const FString& Label,
|
||||||
|
const FString& ExportPath,
|
||||||
|
const FString& OwnershipRole,
|
||||||
|
const FString& LicensePosture,
|
||||||
|
const FString& Summary,
|
||||||
|
const TArray<FString>& RetainedSurfaceTags,
|
||||||
|
const TArray<FString>& RequiredNoticeActions,
|
||||||
|
const TArray<FString>& ExplicitExclusions,
|
||||||
|
const FHyperTwistTrainingSourceAttribution& SourceAttribution
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchPackageReference Reference;
|
||||||
|
Reference.PackageId = PackageId;
|
||||||
|
Reference.Label = Label;
|
||||||
|
Reference.ExportPath = ExportPath;
|
||||||
|
Reference.OwnershipRole = OwnershipRole;
|
||||||
|
Reference.LicensePosture = LicensePosture;
|
||||||
|
Reference.Summary = Summary;
|
||||||
|
Reference.RetainedSurfaceTags = RetainedSurfaceTags;
|
||||||
|
Reference.RequiredNoticeActions = RequiredNoticeActions;
|
||||||
|
Reference.ExplicitExclusions = ExplicitExclusions;
|
||||||
|
Reference.SourceAttribution = SourceAttribution;
|
||||||
|
return Reference;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppendJoined(FString& OutText, const TArray<FString>& Values)
|
||||||
|
{
|
||||||
|
for (int32 Index = 0; Index < Values.Num(); ++Index)
|
||||||
|
{
|
||||||
|
if (Index > 0)
|
||||||
|
{
|
||||||
|
OutText.Append(TEXT(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
OutText.Append(Values[Index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchReferenceBundle
|
||||||
|
UHyperTwistTrainingLearnedSearchLibrary::BuildBundledLearnedSearchReferenceBundle()
|
||||||
|
{
|
||||||
|
using namespace HyperTwistTrainingLearnedSearchLibraryInternal;
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchReferenceBundle Bundle;
|
||||||
|
Bundle.ReferenceUtc = TEXT("2026-05-31T06:05:00Z");
|
||||||
|
Bundle.PrimaryExperimentProfileContractId = TEXT("learned-search-experiment-profile");
|
||||||
|
Bundle.PrimaryAdiGenerationBoundaryId = TEXT("learned-search-adi-generation-boundary");
|
||||||
|
Bundle.PrimarySearchBenchmarkBoundaryId = TEXT("learned-search-search-benchmark-boundary");
|
||||||
|
Bundle.PrimaryAttributionBoundaryId = TEXT("learned-search-attribution-boundary");
|
||||||
|
Bundle.PrimarySequencePolicyContractId = TEXT("learned-search-sequence-policy-contract");
|
||||||
|
Bundle.PrimarySearchBudgetBoundaryId = TEXT("learned-search-search-budget-boundary");
|
||||||
|
Bundle.PrimaryNodeIdentityContractId = TEXT("learned-search-node-identity-contract");
|
||||||
|
Bundle.PrimaryStateExpansionBoundaryId = TEXT("learned-search-state-expansion-boundary");
|
||||||
|
Bundle.PrimaryFrontierScoringBoundaryId = TEXT("learned-search-frontier-scoring-boundary");
|
||||||
|
Bundle.PrimarySolutionUnwindBoundaryId = TEXT("learned-search-solution-unwind-boundary");
|
||||||
|
Bundle.PrimaryValueNetworkShapeBoundaryId = TEXT("learned-search-value-network-shape-boundary");
|
||||||
|
Bundle.PrimaryGeneratorSyncBoundaryId = TEXT("learned-search-generator-sync-boundary");
|
||||||
|
|
||||||
|
const TArray<FString> CommonNoticeActions =
|
||||||
|
{
|
||||||
|
TEXT("preserve the upstream MIT license text in third-party notices or equivalent release/legal materials"),
|
||||||
|
TEXT("preserve the upstream copyright notice for Yakup Bilen")
|
||||||
|
};
|
||||||
|
|
||||||
|
Bundle.PackageReferences =
|
||||||
|
{
|
||||||
|
MakePackageReference(
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("cube/cube.py"),
|
||||||
|
TEXT("./cube/cube.py"),
|
||||||
|
TEXT("learned-search-state-benchmark-anchor"),
|
||||||
|
TEXT("direct permissive donor benchmark"),
|
||||||
|
TEXT("Compact `54`-sticker state encoding, direct move-transition tables, inverse-solution recovery, and anti-cancellation sequence cleanup for bounded first-party experimentation."),
|
||||||
|
{
|
||||||
|
TEXT("54-sticker state encoding"),
|
||||||
|
TEXT("direct move-transition tables"),
|
||||||
|
TEXT("inverse-solution recovery"),
|
||||||
|
TEXT("anti-cancellation sequence cleanup")
|
||||||
|
},
|
||||||
|
CommonNoticeActions,
|
||||||
|
{
|
||||||
|
TEXT("live camera recognition ownership"),
|
||||||
|
TEXT("committed-face reconstruction ownership"),
|
||||||
|
TEXT("generalized solver backend ownership")
|
||||||
|
},
|
||||||
|
MakeDirectDonorAttribution(
|
||||||
|
TEXT("yakupbilen/cube-state"),
|
||||||
|
TEXT("Preserves the compact sticker-state transition benchmark without promoting it into HyperTwist live recognition, reconstruction, or generalized solver ownership.")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MakePackageReference(
|
||||||
|
TEXT("package/yakupbilen-adi-train-utils"),
|
||||||
|
TEXT("train/train_utils.py"),
|
||||||
|
TEXT("./train/train_utils.py"),
|
||||||
|
TEXT("adi-generation-benchmark-anchor"),
|
||||||
|
TEXT("direct permissive donor benchmark"),
|
||||||
|
TEXT("ADI reverse-rollout generation, distance-bucket state sampling, and weighted target-preparation benchmark material for a narrow first-party experimentation lane."),
|
||||||
|
{
|
||||||
|
TEXT("ADI reverse rollout generation"),
|
||||||
|
TEXT("distance-bucket sampling"),
|
||||||
|
TEXT("weighted target preparation"),
|
||||||
|
TEXT("scramble-depth batch composition")
|
||||||
|
},
|
||||||
|
CommonNoticeActions,
|
||||||
|
{
|
||||||
|
TEXT("live camera recognition ownership"),
|
||||||
|
TEXT("broad model training platform ownership"),
|
||||||
|
TEXT("generalized dataset shipping ownership")
|
||||||
|
},
|
||||||
|
MakeDirectDonorAttribution(
|
||||||
|
TEXT("yakupbilen/adi-train-utils"),
|
||||||
|
TEXT("Preserves the narrow ADI state-generation benchmark beneath a first-party HyperTwist experimentation profile without widening into generic training-platform ownership.")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MakePackageReference(
|
||||||
|
TEXT("package/yakupbilen-search"),
|
||||||
|
TEXT("search/search.py"),
|
||||||
|
TEXT("./search/search.py"),
|
||||||
|
TEXT("neural-search-benchmark-anchor"),
|
||||||
|
TEXT("direct permissive donor benchmark"),
|
||||||
|
TEXT("Batched neural search experimentation, node-expansion ordering, and frontier ranking patterns for bounded offline benchmark use."),
|
||||||
|
{
|
||||||
|
TEXT("batched node expansion"),
|
||||||
|
TEXT("network-scored frontier ranking"),
|
||||||
|
TEXT("offline A* benchmark search"),
|
||||||
|
TEXT("anti-cancellation successor pruning")
|
||||||
|
},
|
||||||
|
CommonNoticeActions,
|
||||||
|
{
|
||||||
|
TEXT("live solve explanation ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("browser shell ownership")
|
||||||
|
},
|
||||||
|
MakeDirectDonorAttribution(
|
||||||
|
TEXT("yakupbilen/search"),
|
||||||
|
TEXT("Preserves the offline neural search benchmark beneath first-party HyperTwist experimentation without turning it into the primary live explanation or solver-oracle owner.")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MakePackageReference(
|
||||||
|
TEXT("package/yakupbilen-modelpaper"),
|
||||||
|
TEXT("networks/modelpaper.py"),
|
||||||
|
TEXT("./networks/modelpaper.py"),
|
||||||
|
TEXT("value-network-benchmark-anchor"),
|
||||||
|
TEXT("direct permissive donor benchmark"),
|
||||||
|
TEXT("Compact value-network benchmark architecture and batched state-evaluation posture for bounded offline experimentation."),
|
||||||
|
{
|
||||||
|
TEXT("small value-network inference"),
|
||||||
|
TEXT("batched state evaluation"),
|
||||||
|
TEXT("offline checkpoint research"),
|
||||||
|
TEXT("neural benchmark scoring")
|
||||||
|
},
|
||||||
|
CommonNoticeActions,
|
||||||
|
{
|
||||||
|
TEXT("deployed inference service ownership"),
|
||||||
|
TEXT("broad provider-backed model serving"),
|
||||||
|
TEXT("voice or assistant platform ownership")
|
||||||
|
},
|
||||||
|
MakeDirectDonorAttribution(
|
||||||
|
TEXT("yakupbilen/modelpaper"),
|
||||||
|
TEXT("Preserves the compact value-network benchmark beneath a first-party experimentation lane without widening into deployed product-side ML service ownership.")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchExperimentProfileContract ExperimentProfile;
|
||||||
|
ExperimentProfile.ContractId = TEXT("learned-search-experiment-profile");
|
||||||
|
ExperimentProfile.Title = TEXT("First-party learned heuristic search experimentation profile");
|
||||||
|
ExperimentProfile.Summary = TEXT("First-party HyperTwist contract for `54`-sticker encoding, ADI batch generation, and offline neural frontier benchmark hooks above existing live recognition and solver-oracle owners.");
|
||||||
|
ExperimentProfile.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-adi-train-utils"),
|
||||||
|
TEXT("package/yakupbilen-search"),
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
ExperimentProfile.StateSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("54-sticker state encoding"),
|
||||||
|
TEXT("direct move-transition tables"),
|
||||||
|
TEXT("inverse-solution recovery"),
|
||||||
|
TEXT("anti-cancellation sequence cleanup")
|
||||||
|
};
|
||||||
|
ExperimentProfile.GenerationSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("ADI reverse rollout generation"),
|
||||||
|
TEXT("distance-labeled state batches"),
|
||||||
|
TEXT("weighted target preparation"),
|
||||||
|
TEXT("scramble-depth batch composition")
|
||||||
|
};
|
||||||
|
ExperimentProfile.SearchSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("batched neural A* frontier scoring"),
|
||||||
|
TEXT("offline benchmark replay"),
|
||||||
|
TEXT("value-network evaluation hooks"),
|
||||||
|
TEXT("oracle-comparison instrumentation")
|
||||||
|
};
|
||||||
|
ExperimentProfile.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live camera recognition ownership"),
|
||||||
|
TEXT("committed-face reconstruction ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("broad deployed ML platform ownership")
|
||||||
|
};
|
||||||
|
ExperimentProfile.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-experiment-profile"),
|
||||||
|
TEXT("Reauthors a bounded first-party HyperTwist ML experimentation lane grounded in the retained yakupbilen benchmark without widening into live perception, reconstruction, or solver-oracle ownership.")
|
||||||
|
);
|
||||||
|
Bundle.ExperimentProfileContracts = {ExperimentProfile};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchAdiGenerationBoundary AdiBoundary;
|
||||||
|
AdiBoundary.BoundaryId = TEXT("learned-search-adi-generation-boundary");
|
||||||
|
AdiBoundary.Title = TEXT("ADI generation and target-preparation boundary");
|
||||||
|
AdiBoundary.Summary = TEXT("First-party HyperTwist boundary for bounded ADI state generation, distance-bucket sampling, and target-preparation posture above the retained learned-search benchmark packages.");
|
||||||
|
AdiBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-adi-train-utils")
|
||||||
|
};
|
||||||
|
AdiBoundary.GenerationSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("ADI reverse rollout generation"),
|
||||||
|
TEXT("goal-state seeded expansion"),
|
||||||
|
TEXT("inverse-solution seeded scrambles"),
|
||||||
|
TEXT("distance-labeled state batches")
|
||||||
|
};
|
||||||
|
AdiBoundary.TargetSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("weighted target preparation"),
|
||||||
|
TEXT("discount-aware target blending"),
|
||||||
|
TEXT("batch supervision assembly"),
|
||||||
|
TEXT("offline evaluation-only posture")
|
||||||
|
};
|
||||||
|
AdiBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("offline experimentation only"),
|
||||||
|
TEXT("generated states are not correctness oracle proof"),
|
||||||
|
TEXT("no live camera or browser shell ownership")
|
||||||
|
};
|
||||||
|
AdiBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live camera recognition ownership"),
|
||||||
|
TEXT("committed-face reconstruction ownership"),
|
||||||
|
TEXT("broad model training platform ownership"),
|
||||||
|
TEXT("generalized dataset shipping ownership")
|
||||||
|
};
|
||||||
|
AdiBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-adi-boundary"),
|
||||||
|
TEXT("Reauthors the bounded ADI generation and target-preparation seam above retained yakupbilen benchmark surfaces without turning the donor row into a generic training-data or product runtime owner.")
|
||||||
|
);
|
||||||
|
Bundle.AdiGenerationBoundaries = {AdiBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary SearchBoundary;
|
||||||
|
SearchBoundary.BoundaryId = TEXT("learned-search-search-benchmark-boundary");
|
||||||
|
SearchBoundary.Title = TEXT("Offline neural search benchmark boundary");
|
||||||
|
SearchBoundary.Summary = TEXT("First-party HyperTwist boundary for bounded neural frontier search benchmarking and small value-model comparison above the retained learned-search packages.");
|
||||||
|
SearchBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-search"),
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
SearchBoundary.SearchSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("batched node expansion"),
|
||||||
|
TEXT("cost-plus-heuristic priority ranking"),
|
||||||
|
TEXT("anti-cancellation successor pruning"),
|
||||||
|
TEXT("goal-test solve extraction")
|
||||||
|
};
|
||||||
|
SearchBoundary.ModelSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("small value-network inference"),
|
||||||
|
TEXT("batched state evaluation"),
|
||||||
|
TEXT("benchmark checkpoint posture"),
|
||||||
|
TEXT("offline experiment scoring")
|
||||||
|
};
|
||||||
|
SearchBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("brownan and efrantar remain correctness/performance oracle owners"),
|
||||||
|
TEXT("qbr and rubix-cube-solver remain live recognition/reconstruction owners"),
|
||||||
|
TEXT("research benchmark latency and accuracy remain non-authoritative")
|
||||||
|
};
|
||||||
|
SearchBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("live solve explanation ownership"),
|
||||||
|
TEXT("broad provider-backed model serving"),
|
||||||
|
TEXT("browser or smart-device shell ownership")
|
||||||
|
};
|
||||||
|
SearchBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-search-boundary"),
|
||||||
|
TEXT("Reauthors the bounded offline search benchmark seam above retained yakupbilen packages while keeping correctness, performance, explanation, and live shell ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.SearchBenchmarkBoundaries = {SearchBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchAttributionBoundary AttributionBoundary;
|
||||||
|
AttributionBoundary.BoundaryId = TEXT("learned-search-attribution-boundary");
|
||||||
|
AttributionBoundary.Title = TEXT("Learned-search benchmark attribution boundary");
|
||||||
|
AttributionBoundary.Summary = TEXT("First-party HyperTwist compliance boundary for using the yakupbilen learned-search stack as a retained permissive benchmark beneath a bounded first-party experimentation lane.");
|
||||||
|
AttributionBoundary.AllowedUseTags =
|
||||||
|
{
|
||||||
|
TEXT("first-party reauthored experimentation lane"),
|
||||||
|
TEXT("direct permissive benchmark reference"),
|
||||||
|
TEXT("bounded offline search and ADI contract use")
|
||||||
|
};
|
||||||
|
AttributionBoundary.RequiredNoticeActions = CommonNoticeActions;
|
||||||
|
AttributionBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("yakupbilen remains a research benchmark rather than a camera/perception donor"),
|
||||||
|
TEXT("qbr and rubix-cube-solver remain live recognition/reconstruction owners"),
|
||||||
|
TEXT("brownan and efrantar remain solver-oracle owners")
|
||||||
|
};
|
||||||
|
AttributionBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("silent donor promotion"),
|
||||||
|
TEXT("treating the benchmark as a live reconstruction owner"),
|
||||||
|
TEXT("claiming deployed product-side ML serving landed")
|
||||||
|
};
|
||||||
|
AttributionBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-attribution-boundary"),
|
||||||
|
TEXT("Records MIT provenance and packet bounds for the learned-search experimentation lane while keeping the donor row benchmark-grounded and non-authoritative for live product ownership.")
|
||||||
|
);
|
||||||
|
Bundle.AttributionBoundaries = {AttributionBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchSequencePolicyContract SequencePolicy;
|
||||||
|
SequencePolicy.ContractId = TEXT("learned-search-sequence-policy-contract");
|
||||||
|
SequencePolicy.Title = TEXT("Learned-search anti-cancellation sequence policy");
|
||||||
|
SequencePolicy.Summary = TEXT("First-party HyperTwist contract for anti-cancellation scramble generation, solved-state inclusion posture, and weighting-policy selection above the retained ADI benchmark seam.");
|
||||||
|
SequencePolicy.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-adi-train-utils")
|
||||||
|
};
|
||||||
|
SequencePolicy.SequenceSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("inverse-pair suppression"),
|
||||||
|
TEXT("triple-repeat suppression"),
|
||||||
|
TEXT("scramble-depth sequence generation"),
|
||||||
|
TEXT("shuffle-after-generation posture")
|
||||||
|
};
|
||||||
|
SequencePolicy.SamplingSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("optional solved-state inclusion"),
|
||||||
|
TEXT("distance-labeled sample distribution"),
|
||||||
|
TEXT("scramble-batch repetition groups"),
|
||||||
|
TEXT("solved-state append-before-shuffle posture")
|
||||||
|
};
|
||||||
|
SequencePolicy.WeightingSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("learn-first-close weighting"),
|
||||||
|
TEXT("lightweight depth weighting"),
|
||||||
|
TEXT("depth-proportional weighting"),
|
||||||
|
TEXT("offline batch-only supervision weighting")
|
||||||
|
};
|
||||||
|
SequencePolicy.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live replay notation ownership"),
|
||||||
|
TEXT("general scramble registry ownership"),
|
||||||
|
TEXT("broad model training platform ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership")
|
||||||
|
};
|
||||||
|
SequencePolicy.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-sequence-policy"),
|
||||||
|
TEXT("Reauthors the narrow anti-cancellation sequence and weighting-policy seam above retained ADI benchmark surfaces without promoting it into HyperTwist live replay, scramble-registry, or solver-oracle ownership.")
|
||||||
|
);
|
||||||
|
Bundle.SequencePolicyContracts = {SequencePolicy};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBudgetBoundary SearchBudgetBoundary;
|
||||||
|
SearchBudgetBoundary.BoundaryId = TEXT("learned-search-search-budget-boundary");
|
||||||
|
SearchBudgetBoundary.Title = TEXT("Learned-search frontier budget boundary");
|
||||||
|
SearchBudgetBoundary.Summary = TEXT("First-party HyperTwist boundary for bounded frontier-budget, time/iteration cap, and model-clone checkpoint posture above the retained offline search benchmark seam.");
|
||||||
|
SearchBudgetBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-search"),
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
SearchBudgetBoundary.BudgetSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("weighted frontier ranking"),
|
||||||
|
TEXT("batch-size frontier cap"),
|
||||||
|
TEXT("iteration-cap search mode"),
|
||||||
|
TEXT("time-cap search mode")
|
||||||
|
};
|
||||||
|
SearchBudgetBoundary.FrontierSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("goal-hit early exit"),
|
||||||
|
TEXT("closed-node depth replacement"),
|
||||||
|
TEXT("benchmark checkpoint clone posture"),
|
||||||
|
TEXT("offline-only heuristic eval mode")
|
||||||
|
};
|
||||||
|
SearchBudgetBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("frontier budgets remain benchmark-only and non-authoritative for live solve UX"),
|
||||||
|
TEXT("model clone posture is a checkpoint benchmark rather than deployed service ownership"),
|
||||||
|
TEXT("search budgets do not supersede retained solver-oracle owners")
|
||||||
|
};
|
||||||
|
SearchBudgetBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live solve explanation ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("deployed model serving ownership"),
|
||||||
|
TEXT("browser or smart-device shell ownership")
|
||||||
|
};
|
||||||
|
SearchBudgetBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-search-budget"),
|
||||||
|
TEXT("Reauthors the narrow frontier-budget and checkpoint posture above retained search benchmark surfaces while keeping live solve UX, deployed serving, and oracle ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.SearchBudgetBoundaries = {SearchBudgetBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchNodeIdentityContract NodeIdentityContract;
|
||||||
|
NodeIdentityContract.ContractId = TEXT("learned-search-node-identity-contract");
|
||||||
|
NodeIdentityContract.Title = TEXT("Learned-search node identity contract");
|
||||||
|
NodeIdentityContract.Summary = TEXT("First-party HyperTwist contract for flattened-byte node hashing, parent-linked lineage, and depth-replacement posture above the retained offline search benchmark seam.");
|
||||||
|
NodeIdentityContract.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-search")
|
||||||
|
};
|
||||||
|
NodeIdentityContract.IdentitySurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("flattened-byte node hash"),
|
||||||
|
TEXT("array-equality identity check"),
|
||||||
|
TEXT("closed-node dedupe posture"),
|
||||||
|
TEXT("shallower-depth replacement policy")
|
||||||
|
};
|
||||||
|
NodeIdentityContract.LineageSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("parent-linked lineage"),
|
||||||
|
TEXT("move-index lineage"),
|
||||||
|
TEXT("depth-tracked node state"),
|
||||||
|
TEXT("solution-path unwind posture")
|
||||||
|
};
|
||||||
|
NodeIdentityContract.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("canonical replay ledger ownership"),
|
||||||
|
TEXT("live solve-history ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("browser or smart-device shell ownership")
|
||||||
|
};
|
||||||
|
NodeIdentityContract.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-node-identity"),
|
||||||
|
TEXT("Reauthors the narrow node identity and lineage seam above retained search benchmark surfaces without promoting it into HyperTwist canonical replay, solve-history, or oracle ownership.")
|
||||||
|
);
|
||||||
|
Bundle.NodeIdentityContracts = {NodeIdentityContract};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchStateExpansionBoundary StateExpansionBoundary;
|
||||||
|
StateExpansionBoundary.BoundaryId = TEXT("learned-search-state-expansion-boundary");
|
||||||
|
StateExpansionBoundary.Title = TEXT("Learned-search vectorized state-expansion boundary");
|
||||||
|
StateExpansionBoundary.Summary = TEXT("First-party HyperTwist boundary for vectorized 12-way successor expansion, solved-state reward tagging, and stacked goal-scan posture above the retained offline search benchmark seam.");
|
||||||
|
StateExpansionBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-search")
|
||||||
|
};
|
||||||
|
StateExpansionBoundary.ExpansionSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("stacked state batching"),
|
||||||
|
TEXT("12-way successor expansion"),
|
||||||
|
TEXT("take-along-axis transition routing"),
|
||||||
|
TEXT("vectorized reward scan")
|
||||||
|
};
|
||||||
|
StateExpansionBoundary.GoalSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("solved-state goal tagging"),
|
||||||
|
TEXT("goal-hit early return posture"),
|
||||||
|
TEXT("per-successor reward flattening"),
|
||||||
|
TEXT("offline-only expansion benchmark")
|
||||||
|
};
|
||||||
|
StateExpansionBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("state expansion remains benchmark-only and non-authoritative for live reconstruction"),
|
||||||
|
TEXT("goal tagging does not supersede retained solver-oracle owners"),
|
||||||
|
TEXT("vectorized expansion is not a browser or camera shell claim")
|
||||||
|
};
|
||||||
|
StateExpansionBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live camera recognition ownership"),
|
||||||
|
TEXT("committed-face reconstruction ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("canonical replay verification ownership")
|
||||||
|
};
|
||||||
|
StateExpansionBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-state-expansion"),
|
||||||
|
TEXT("Reauthors the narrow vectorized successor-expansion seam above retained search benchmark surfaces while keeping live reconstruction, replay, and oracle ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.StateExpansionBoundaries = {StateExpansionBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchFrontierScoringBoundary FrontierScoringBoundary;
|
||||||
|
FrontierScoringBoundary.BoundaryId = TEXT("learned-search-frontier-scoring-boundary");
|
||||||
|
FrontierScoringBoundary.Title = TEXT("Learned-search frontier scoring boundary");
|
||||||
|
FrontierScoringBoundary.Summary = TEXT("First-party HyperTwist boundary for batched frontier pop windows, weighted f-score ordering, categorical heuristic input shaping, and no-grad evaluation posture above the retained offline search benchmark seam.");
|
||||||
|
FrontierScoringBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-search"),
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
FrontierScoringBoundary.FrontierSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("open-list score ordering"),
|
||||||
|
TEXT("batched frontier pop window"),
|
||||||
|
TEXT("weighted f-score depth penalty"),
|
||||||
|
TEXT("generated-node counter growth")
|
||||||
|
};
|
||||||
|
FrontierScoringBoundary.EvaluationSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("one-hot categorical heuristic input"),
|
||||||
|
TEXT("model eval gating"),
|
||||||
|
TEXT("torch no-grad evaluation posture"),
|
||||||
|
TEXT("per-node heuristic score assignment")
|
||||||
|
};
|
||||||
|
FrontierScoringBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("frontier scoring remains benchmark-only and non-authoritative for live coaching"),
|
||||||
|
TEXT("heuristic evaluation does not supersede retained solver-oracle owners"),
|
||||||
|
TEXT("categorical heuristic input is not a live recognition preprocessing claim")
|
||||||
|
};
|
||||||
|
FrontierScoringBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("live solve explanation ownership"),
|
||||||
|
TEXT("deployed model serving ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("browser or camera shell ownership")
|
||||||
|
};
|
||||||
|
FrontierScoringBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-frontier-scoring"),
|
||||||
|
TEXT("Reauthors the narrow frontier scoring and batched heuristic-evaluation seam above retained search benchmark surfaces while keeping live coaching, deployed serving, and oracle ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.FrontierScoringBoundaries = {FrontierScoringBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary SolutionUnwindBoundary;
|
||||||
|
SolutionUnwindBoundary.BoundaryId = TEXT("learned-search-solution-unwind-boundary");
|
||||||
|
SolutionUnwindBoundary.Title = TEXT("Learned-search solution unwind boundary");
|
||||||
|
SolutionUnwindBoundary.Summary = TEXT("First-party HyperTwist boundary for solved-state short-circuit handling, parent-chain solution unwind, move-list normalization, and iteration or timeout result reporting above the retained offline search benchmark seam.");
|
||||||
|
SolutionUnwindBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-cube-state"),
|
||||||
|
TEXT("package/yakupbilen-search")
|
||||||
|
};
|
||||||
|
SolutionUnwindBoundary.RecoverySurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("solved-state short-circuit return"),
|
||||||
|
TEXT("goal-index to parent-chain unwind"),
|
||||||
|
TEXT("move-list reverse ordering"),
|
||||||
|
TEXT("clear-seq normalization posture")
|
||||||
|
};
|
||||||
|
SolutionUnwindBoundary.TerminationSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("iteration-bounded search mode"),
|
||||||
|
TEXT("time-bounded search mode"),
|
||||||
|
TEXT("iteration and generated-node reporting"),
|
||||||
|
TEXT("goal-hit early completion posture")
|
||||||
|
};
|
||||||
|
SolutionUnwindBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("solution unwind remains benchmark-only and non-authoritative for canonical replay"),
|
||||||
|
TEXT("termination reporting does not supersede retained timer or stats owners"),
|
||||||
|
TEXT("generated-node counts remain experiment telemetry rather than user-facing solve records")
|
||||||
|
};
|
||||||
|
SolutionUnwindBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("canonical replay ledger ownership"),
|
||||||
|
TEXT("competition stats ownership"),
|
||||||
|
TEXT("live timer ownership"),
|
||||||
|
TEXT("solve-history explanation ownership")
|
||||||
|
};
|
||||||
|
SolutionUnwindBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-solution-unwind"),
|
||||||
|
TEXT("Reauthors the narrow solution unwind and termination-reporting seam above retained search benchmark surfaces while keeping replay, timer, and solve-history ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.SolutionUnwindBoundaries = {SolutionUnwindBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary ValueNetworkShapeBoundary;
|
||||||
|
ValueNetworkShapeBoundary.BoundaryId = TEXT("learned-search-value-network-shape-boundary");
|
||||||
|
ValueNetworkShapeBoundary.Title = TEXT("Learned-search value-network shape boundary");
|
||||||
|
ValueNetworkShapeBoundary.Summary = TEXT("First-party HyperTwist boundary for compact flattened-input value-network shape, linear-stack depth, and initialization posture above the retained offline learned-search benchmark seam.");
|
||||||
|
ValueNetworkShapeBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
ValueNetworkShapeBoundary.ArchitectureSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("flattened input reshape"),
|
||||||
|
TEXT("4096-2048-512 linear stack"),
|
||||||
|
TEXT("relu activation ladder"),
|
||||||
|
TEXT("single-value scalar head")
|
||||||
|
};
|
||||||
|
ValueNetworkShapeBoundary.InitializationSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("xavier-normal weight init"),
|
||||||
|
TEXT("zero-bias init posture"),
|
||||||
|
TEXT("input-size keyed network shape"),
|
||||||
|
TEXT("state-dict clone-compatible layout")
|
||||||
|
};
|
||||||
|
ValueNetworkShapeBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("value-network shape remains benchmark-only and non-authoritative for deployed serving"),
|
||||||
|
TEXT("model architecture does not supersede retained solver-oracle owners"),
|
||||||
|
TEXT("flattened input shape is not a live perception preprocessing claim")
|
||||||
|
};
|
||||||
|
ValueNetworkShapeBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("deployed model serving ownership"),
|
||||||
|
TEXT("broad training-platform ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership"),
|
||||||
|
TEXT("live recognition preprocessing ownership")
|
||||||
|
};
|
||||||
|
ValueNetworkShapeBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-value-network-shape"),
|
||||||
|
TEXT("Reauthors the narrow value-network shape and initialization seam above retained model benchmark surfaces while keeping deployed serving, training-platform, and oracle ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.ValueNetworkShapeBoundaries = {ValueNetworkShapeBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary GeneratorSyncBoundary;
|
||||||
|
GeneratorSyncBoundary.BoundaryId = TEXT("learned-search-generator-sync-boundary");
|
||||||
|
GeneratorSyncBoundary.Title = TEXT("Learned-search generator sync boundary");
|
||||||
|
GeneratorSyncBoundary.Summary = TEXT("First-party HyperTwist boundary for tau-weighted generator refresh, parameter copy posture, and device-aware sync semantics above the retained offline learned-search benchmark seam.");
|
||||||
|
GeneratorSyncBoundary.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/yakupbilen-adi-train-utils"),
|
||||||
|
TEXT("package/yakupbilen-modelpaper")
|
||||||
|
};
|
||||||
|
GeneratorSyncBoundary.SyncSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("tau-weighted generator refresh"),
|
||||||
|
TEXT("state-dict merge posture"),
|
||||||
|
TEXT("device-aware parameter copy"),
|
||||||
|
TEXT("generator reload-after-sync")
|
||||||
|
};
|
||||||
|
GeneratorSyncBoundary.ParameterSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("online-to-generator parameter blend"),
|
||||||
|
TEXT("per-parameter copy loop"),
|
||||||
|
TEXT("generator return-on-device posture"),
|
||||||
|
TEXT("offline sync-only refresh boundary")
|
||||||
|
};
|
||||||
|
GeneratorSyncBoundary.ProvenanceCaveats =
|
||||||
|
{
|
||||||
|
TEXT("generator sync remains benchmark-only and non-authoritative for deployed training services"),
|
||||||
|
TEXT("tau blending does not supersede retained provider or model-host owners"),
|
||||||
|
TEXT("parameter refresh is not a live session personalization claim")
|
||||||
|
};
|
||||||
|
GeneratorSyncBoundary.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("deployed training service ownership"),
|
||||||
|
TEXT("provider-backed model lifecycle ownership"),
|
||||||
|
TEXT("live user-memory personalization ownership"),
|
||||||
|
TEXT("correctness/performance oracle ownership")
|
||||||
|
};
|
||||||
|
GeneratorSyncBoundary.SourceAttribution = MakeFirstPartyAttribution(
|
||||||
|
TEXT("first-party/learned-search-generator-sync"),
|
||||||
|
TEXT("Reauthors the narrow generator refresh and tau-sync seam above retained learned-search benchmark surfaces while keeping deployed training services, provider lifecycle ownership, and oracle ownership elsewhere in the stack.")
|
||||||
|
);
|
||||||
|
Bundle.GeneratorSyncBoundaries = {GeneratorSyncBoundary};
|
||||||
|
|
||||||
|
return Bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetExperimentProfileContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchExperimentProfileContract& OutContract
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchExperimentProfileContract& Contract : Bundle.ExperimentProfileContracts)
|
||||||
|
{
|
||||||
|
if (Contract.ContractId == ContractId)
|
||||||
|
{
|
||||||
|
OutContract = Contract;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutContract = FHyperTwistTrainingLearnedSearchExperimentProfileContract();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetAdiGenerationBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchAdiGenerationBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchAdiGenerationBoundary& Boundary : Bundle.AdiGenerationBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchAdiGenerationBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetSearchBenchmarkBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary& Boundary : Bundle.SearchBenchmarkBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetAttributionBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchAttributionBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchAttributionBoundary& Boundary : Bundle.AttributionBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchAttributionBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetSequencePolicyContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSequencePolicyContract& OutContract
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchSequencePolicyContract& Contract : Bundle.SequencePolicyContracts)
|
||||||
|
{
|
||||||
|
if (Contract.ContractId == ContractId)
|
||||||
|
{
|
||||||
|
OutContract = Contract;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutContract = FHyperTwistTrainingLearnedSearchSequencePolicyContract();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetSearchBudgetBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBudgetBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchSearchBudgetBoundary& Boundary : Bundle.SearchBudgetBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchSearchBudgetBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetNodeIdentityContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchNodeIdentityContract& OutContract
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchNodeIdentityContract& Contract : Bundle.NodeIdentityContracts)
|
||||||
|
{
|
||||||
|
if (Contract.ContractId == ContractId)
|
||||||
|
{
|
||||||
|
OutContract = Contract;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutContract = FHyperTwistTrainingLearnedSearchNodeIdentityContract();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetStateExpansionBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchStateExpansionBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchStateExpansionBoundary& Boundary : Bundle.StateExpansionBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchStateExpansionBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetFrontierScoringBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchFrontierScoringBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchFrontierScoringBoundary& Boundary : Bundle.FrontierScoringBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchFrontierScoringBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetSolutionUnwindBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary& Boundary : Bundle.SolutionUnwindBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetValueNetworkShapeBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary& Boundary : Bundle.ValueNetworkShapeBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingLearnedSearchLibrary::TryGetGeneratorSyncBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary& OutBoundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary& Boundary : Bundle.GeneratorSyncBoundaries)
|
||||||
|
{
|
||||||
|
if (Boundary.BoundaryId == BoundaryId)
|
||||||
|
{
|
||||||
|
OutBoundary = Boundary;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutBoundary = FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString UHyperTwistTrainingLearnedSearchLibrary::BuildPackageChecklistTsv(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle
|
||||||
|
)
|
||||||
|
{
|
||||||
|
using namespace HyperTwistTrainingLearnedSearchLibraryInternal;
|
||||||
|
|
||||||
|
FString Checklist = TEXT("PackageId\tLabel\tExportPath\tOwnershipRole\tLicensePosture\tRetainedSurfaceTags\tRequiredNoticeActions\tExplicitExclusions\n");
|
||||||
|
for (const FHyperTwistTrainingLearnedSearchPackageReference& Reference : Bundle.PackageReferences)
|
||||||
|
{
|
||||||
|
FString RetainedSurfaceTags;
|
||||||
|
AppendJoined(RetainedSurfaceTags, Reference.RetainedSurfaceTags);
|
||||||
|
|
||||||
|
FString NoticeActions;
|
||||||
|
AppendJoined(NoticeActions, Reference.RequiredNoticeActions);
|
||||||
|
|
||||||
|
FString Exclusions;
|
||||||
|
AppendJoined(Exclusions, Reference.ExplicitExclusions);
|
||||||
|
|
||||||
|
Checklist += FString::Printf(
|
||||||
|
TEXT("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n"),
|
||||||
|
*Reference.PackageId,
|
||||||
|
*Reference.Label,
|
||||||
|
*Reference.ExportPath,
|
||||||
|
*Reference.OwnershipRole,
|
||||||
|
*Reference.LicensePosture,
|
||||||
|
*RetainedSurfaceTags,
|
||||||
|
*NoticeActions,
|
||||||
|
*Exclusions
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Checklist;
|
||||||
|
}
|
||||||
|
|
@ -68,6 +68,7 @@ UHyperTwistTrainingMagic120CellLibrary::BuildBundledMagic120CellReferenceBundle(
|
||||||
Bundle.ReferenceUtc = TEXT("2026-05-22T09:15:00Z");
|
Bundle.ReferenceUtc = TEXT("2026-05-22T09:15:00Z");
|
||||||
Bundle.PrimaryRuntimeProfileContractId = TEXT("magic120cell-runtime-profile");
|
Bundle.PrimaryRuntimeProfileContractId = TEXT("magic120cell-runtime-profile");
|
||||||
Bundle.PrimaryPersistenceBoundaryId = TEXT("magic120cell-persistence-boundary");
|
Bundle.PrimaryPersistenceBoundaryId = TEXT("magic120cell-persistence-boundary");
|
||||||
|
Bundle.PrimaryViewProfileContractId = TEXT("magic120cell-focus-view-profile");
|
||||||
Bundle.PrimaryAttributionBoundaryId = TEXT("magic120cell-mit-attribution-boundary");
|
Bundle.PrimaryAttributionBoundaryId = TEXT("magic120cell-mit-attribution-boundary");
|
||||||
|
|
||||||
const TArray<FString> CommonNoticeActions =
|
const TArray<FString> CommonNoticeActions =
|
||||||
|
|
@ -294,6 +295,60 @@ UHyperTwistTrainingMagic120CellLibrary::BuildBundledMagic120CellReferenceBundle(
|
||||||
);
|
);
|
||||||
Bundle.PersistenceBoundaries = {PersistenceBoundary};
|
Bundle.PersistenceBoundaries = {PersistenceBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingMagic120CellViewProfileContract ViewProfileContract;
|
||||||
|
ViewProfileContract.ContractId = TEXT("magic120cell-focus-view-profile");
|
||||||
|
ViewProfileContract.Title = TEXT("Magic120Cell symmetry-aware focus view profile");
|
||||||
|
ViewProfileContract.Summary = TEXT("First-party HyperTwist contract for Magic120Cell projection, symmetry, visibility, and center-cell focus posture above the dedicated family runtime profile without inheriting the legacy host or renderer shell.");
|
||||||
|
ViewProfileContract.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/magic120cell-family-core"),
|
||||||
|
TEXT("package/magic120cell-settings")
|
||||||
|
};
|
||||||
|
ViewProfileContract.ProjectionSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("4D projection distance"),
|
||||||
|
TEXT("cell-distance spacing"),
|
||||||
|
TEXT("cell-size spacing"),
|
||||||
|
TEXT("sticker-size spacing"),
|
||||||
|
TEXT("1C/2C/3C sticker ratio tuning")
|
||||||
|
};
|
||||||
|
ViewProfileContract.SymmetryPresetTags =
|
||||||
|
{
|
||||||
|
TEXT("full-puzzle default mode"),
|
||||||
|
TEXT("layer-display default symmetry"),
|
||||||
|
TEXT("torus focus preset"),
|
||||||
|
TEXT("hypercube focus preset"),
|
||||||
|
TEXT("ring focus preset")
|
||||||
|
};
|
||||||
|
ViewProfileContract.VisibilityPresetTags =
|
||||||
|
{
|
||||||
|
TEXT("logical visibility depth ladder"),
|
||||||
|
TEXT("12-cell physical visibility vector"),
|
||||||
|
TEXT("draw inverted cells toggle"),
|
||||||
|
TEXT("reverse inverted-cell color toggle"),
|
||||||
|
TEXT("wireframe remains non-authoritative")
|
||||||
|
};
|
||||||
|
ViewProfileContract.FocusSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("center-cell recentering"),
|
||||||
|
TEXT("1C highlight toggle"),
|
||||||
|
TEXT("2C highlight toggle"),
|
||||||
|
TEXT("3C highlight toggle"),
|
||||||
|
TEXT("4C highlight toggle")
|
||||||
|
};
|
||||||
|
ViewProfileContract.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("WinForms/OpenGL host-shell ownership"),
|
||||||
|
TEXT("broad renderer ownership"),
|
||||||
|
TEXT("generic non-Euclidean topology ownership"),
|
||||||
|
TEXT("broad interaction-shell widening")
|
||||||
|
};
|
||||||
|
ViewProfileContract.SourceAttribution = MakeAttribution(
|
||||||
|
TEXT("magic120cell/focus-view-profile"),
|
||||||
|
TEXT("Preserves the Magic120Cell settings-derived focus view posture while keeping HyperTwist first-party for the actual host shell, renderer, and broader immersive interaction runtime.")
|
||||||
|
);
|
||||||
|
Bundle.ViewProfileContracts = {ViewProfileContract};
|
||||||
|
|
||||||
FHyperTwistTrainingMagic120CellAttributionBoundary AttributionBoundary;
|
FHyperTwistTrainingMagic120CellAttributionBoundary AttributionBoundary;
|
||||||
AttributionBoundary.BoundaryId = TEXT("magic120cell-mit-attribution-boundary");
|
AttributionBoundary.BoundaryId = TEXT("magic120cell-mit-attribution-boundary");
|
||||||
AttributionBoundary.Title = TEXT("Magic120Cell donor attribution boundary");
|
AttributionBoundary.Title = TEXT("Magic120Cell donor attribution boundary");
|
||||||
|
|
@ -383,6 +438,25 @@ bool UHyperTwistTrainingMagic120CellLibrary::TryGetAttributionBoundaryById(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingMagic120CellLibrary::TryGetViewProfileContractById(
|
||||||
|
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingMagic120CellViewProfileContract& OutContract
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingMagic120CellViewProfileContract& Contract : Bundle.ViewProfileContracts)
|
||||||
|
{
|
||||||
|
if (Contract.ContractId == ContractId)
|
||||||
|
{
|
||||||
|
OutContract = Contract;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutContract = FHyperTwistTrainingMagic120CellViewProfileContract();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
FString UHyperTwistTrainingMagic120CellLibrary::BuildPackageChecklistTsv(
|
FString UHyperTwistTrainingMagic120CellLibrary::BuildPackageChecklistTsv(
|
||||||
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle
|
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ UHyperTwistTrainingMagicCube5DLibrary::BuildBundledMagicCube5DReferenceBundle()
|
||||||
Bundle.ReferenceUtc = TEXT("2026-05-22T14:05:00Z");
|
Bundle.ReferenceUtc = TEXT("2026-05-22T14:05:00Z");
|
||||||
Bundle.PrimaryRuntimeProfileContractId = TEXT("magiccube5d-runtime-profile");
|
Bundle.PrimaryRuntimeProfileContractId = TEXT("magiccube5d-runtime-profile");
|
||||||
Bundle.PrimaryPersistenceBoundaryId = TEXT("magiccube5d-persistence-boundary");
|
Bundle.PrimaryPersistenceBoundaryId = TEXT("magiccube5d-persistence-boundary");
|
||||||
|
Bundle.PrimaryViewProfileContractId = TEXT("magiccube5d-projection-view-profile");
|
||||||
Bundle.PrimaryAttributionBoundaryId = TEXT("magiccube5d-mit-attribution-boundary");
|
Bundle.PrimaryAttributionBoundaryId = TEXT("magiccube5d-mit-attribution-boundary");
|
||||||
|
|
||||||
const TArray<FString> CommonNoticeActions =
|
const TArray<FString> CommonNoticeActions =
|
||||||
|
|
@ -300,6 +301,61 @@ UHyperTwistTrainingMagicCube5DLibrary::BuildBundledMagicCube5DReferenceBundle()
|
||||||
);
|
);
|
||||||
Bundle.PersistenceBoundaries = {PersistenceBoundary};
|
Bundle.PersistenceBoundaries = {PersistenceBoundary};
|
||||||
|
|
||||||
|
FHyperTwistTrainingMagicCube5DViewProfileContract ViewProfileContract;
|
||||||
|
ViewProfileContract.ContractId = TEXT("magiccube5d-projection-view-profile");
|
||||||
|
ViewProfileContract.Title = TEXT("MagicCube5D projection and focus view profile");
|
||||||
|
ViewProfileContract.Summary = TEXT("First-party HyperTwist contract for MagicCube5D projection distances, stereo posture, face-visibility controls, and accent-driven focus posture above the dedicated 5D runtime profile without inheriting the legacy renderer or host shell.");
|
||||||
|
ViewProfileContract.RequiredPackageIds =
|
||||||
|
{
|
||||||
|
TEXT("package/magiccube5d-family-core"),
|
||||||
|
TEXT("package/magiccube5d-settings"),
|
||||||
|
TEXT("package/magiccube5d-state-transformer")
|
||||||
|
};
|
||||||
|
ViewProfileContract.ProjectionSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("5D projection distance"),
|
||||||
|
TEXT("4D projection distance"),
|
||||||
|
TEXT("face-offset spacing"),
|
||||||
|
TEXT("sticker-offset spacing"),
|
||||||
|
TEXT("sticker-size spacing")
|
||||||
|
};
|
||||||
|
ViewProfileContract.StereoSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("stereo disabled default"),
|
||||||
|
TEXT("cross-eyed stereo posture"),
|
||||||
|
TEXT("anaglyph stereo posture"),
|
||||||
|
TEXT("anaglyph no-color posture"),
|
||||||
|
TEXT("stereo separation tuning")
|
||||||
|
};
|
||||||
|
ViewProfileContract.VisibilitySurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("all-faces visible default"),
|
||||||
|
TEXT("per-face invisibility vector"),
|
||||||
|
TEXT("show-all-cubie-stickers toggle"),
|
||||||
|
TEXT("face-visibility reset"),
|
||||||
|
TEXT("stereo blocks sticker picking")
|
||||||
|
};
|
||||||
|
ViewProfileContract.FocusSurfaceTags =
|
||||||
|
{
|
||||||
|
TEXT("accent emphasis ladder"),
|
||||||
|
TEXT("control-click fifth-axis view rotation"),
|
||||||
|
TEXT("color-signature cubie highlighting"),
|
||||||
|
TEXT("order-three default family mode"),
|
||||||
|
TEXT("view-centered solved-progress readout posture")
|
||||||
|
};
|
||||||
|
ViewProfileContract.ExplicitExclusions =
|
||||||
|
{
|
||||||
|
TEXT("WinForms/OpenGL host-shell ownership"),
|
||||||
|
TEXT("stereo/anaglyph renderer ownership"),
|
||||||
|
TEXT("generic hyper-runtime ownership"),
|
||||||
|
TEXT("broad macro/tutorial shell widening")
|
||||||
|
};
|
||||||
|
ViewProfileContract.SourceAttribution = MakeAttribution(
|
||||||
|
TEXT("magiccube5d/projection-view-profile"),
|
||||||
|
TEXT("Preserves the MagicCube5D settings-derived projection and focus-view posture while keeping HyperTwist first-party for the actual host shell, stereo renderer behavior, and broader immersive runtime ownership.")
|
||||||
|
);
|
||||||
|
Bundle.ViewProfileContracts = {ViewProfileContract};
|
||||||
|
|
||||||
FHyperTwistTrainingMagicCube5DAttributionBoundary AttributionBoundary;
|
FHyperTwistTrainingMagicCube5DAttributionBoundary AttributionBoundary;
|
||||||
AttributionBoundary.BoundaryId = TEXT("magiccube5d-mit-attribution-boundary");
|
AttributionBoundary.BoundaryId = TEXT("magiccube5d-mit-attribution-boundary");
|
||||||
AttributionBoundary.Title = TEXT("MagicCube5D donor attribution boundary");
|
AttributionBoundary.Title = TEXT("MagicCube5D donor attribution boundary");
|
||||||
|
|
@ -391,6 +447,25 @@ bool UHyperTwistTrainingMagicCube5DLibrary::TryGetAttributionBoundaryById(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UHyperTwistTrainingMagicCube5DLibrary::TryGetViewProfileContractById(
|
||||||
|
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingMagicCube5DViewProfileContract& OutContract
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistTrainingMagicCube5DViewProfileContract& Contract : Bundle.ViewProfileContracts)
|
||||||
|
{
|
||||||
|
if (Contract.ContractId == ContractId)
|
||||||
|
{
|
||||||
|
OutContract = Contract;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutContract = FHyperTwistTrainingMagicCube5DViewProfileContract();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
FString UHyperTwistTrainingMagicCube5DLibrary::BuildPackageChecklistTsv(
|
FString UHyperTwistTrainingMagicCube5DLibrary::BuildPackageChecklistTsv(
|
||||||
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle
|
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle
|
||||||
)
|
)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -71,6 +71,18 @@ public:
|
||||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
static TArray<FHyperTwistVoiceProfileSummary> MakeSampleVoiceProfiles();
|
static TArray<FHyperTwistVoiceProfileSummary> MakeSampleVoiceProfiles();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
|
static FHyperTwistVoiceAssetReviewProfile MakeSampleVoiceAssetReviewProfile();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
|
static TArray<FHyperTwistVoiceAssetDescriptor> MakeSampleLocalVoiceAssetDescriptors();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
|
static FHyperTwistVoiceModelReviewProfile MakeSampleVoiceModelReviewProfile();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
|
static TArray<FHyperTwistVoiceModelReviewDescriptor> MakeSampleAdvancedVoiceModelReviewDescriptors();
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
|
||||||
static FHyperTwistNarrationSynthesisRequest MakeSampleNarrationSynthesisRequest();
|
static FHyperTwistNarrationSynthesisRequest MakeSampleNarrationSynthesisRequest();
|
||||||
|
|
||||||
|
|
@ -208,6 +220,37 @@ public:
|
||||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
static FHyperTwistSkillDesignShellState MakeSampleSkillDesignShellState();
|
static FHyperTwistSkillDesignShellState MakeSampleSkillDesignShellState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillWorkflowReviewState MakeSampleSkillWorkflowReviewState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillImplementationDelegationState
|
||||||
|
MakeSampleSkillImplementationDelegationState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillPlanOrchestrationState
|
||||||
|
MakeSampleSkillPlanOrchestrationState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillProviderProfileRoutingState
|
||||||
|
MakeSampleSkillProviderProfileRoutingState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillProviderUsageOperationsAuditState
|
||||||
|
MakeSampleSkillProviderUsageOperationsAuditState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillDomainPackFrameworkState
|
||||||
|
MakeSampleSkillDomainPackFrameworkState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillRetainedDomainPackState
|
||||||
|
MakeSampleSkillRetainedDomainPackState();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillCreativeMediaPackState
|
||||||
|
MakeSampleSkillCreativeMediaPackState();
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
|
||||||
static FHyperTwistTrainingRepositoryIntegrityReport MakeSampleTrainingRepositoryIntegrityReport();
|
static FHyperTwistTrainingRepositoryIntegrityReport MakeSampleTrainingRepositoryIntegrityReport();
|
||||||
|
|
||||||
|
|
@ -462,6 +505,52 @@ public:
|
||||||
const FHyperTwistSkillDesignShellState& SkillDesignShellState
|
const FHyperTwistSkillDesignShellState& SkillDesignShellState
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillWorkflowReviewStateToJson(
|
||||||
|
const FHyperTwistSkillWorkflowReviewState& SkillWorkflowReviewState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillImplementationDelegationStateToJson(
|
||||||
|
const FHyperTwistSkillImplementationDelegationState&
|
||||||
|
SkillImplementationDelegationState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillPlanOrchestrationStateToJson(
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState& SkillPlanOrchestrationState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillProviderProfileRoutingStateToJson(
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState&
|
||||||
|
SkillProviderProfileRoutingState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillProviderUsageOperationsAuditStateToJson(
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState&
|
||||||
|
SkillProviderUsageOperationsAuditState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillDomainPackFrameworkStateToJson(
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState&
|
||||||
|
SkillDomainPackFrameworkState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillRetainedDomainPackStateToJson(
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState&
|
||||||
|
SkillRetainedDomainPackState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
|
static FString SerializeSkillCreativeMediaPackStateToJson(
|
||||||
|
const FHyperTwistSkillCreativeMediaPackState&
|
||||||
|
SkillCreativeMediaPackState
|
||||||
|
);
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
|
||||||
static FString SerializeTrainingTimerExportPacketToJson(const FHyperTwistTrainingTimerExportPacket& TimerExportPacket);
|
static FString SerializeTrainingTimerExportPacketToJson(const FHyperTwistTrainingTimerExportPacket& TimerExportPacket);
|
||||||
|
|
||||||
|
|
@ -612,6 +701,60 @@ public:
|
||||||
FHyperTwistSkillDesignShellState& OutSkillDesignShellState
|
FHyperTwistSkillDesignShellState& OutSkillDesignShellState
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillWorkflowReviewStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillWorkflowReviewState& OutSkillWorkflowReviewState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillImplementationDelegationStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillImplementationDelegationState&
|
||||||
|
OutSkillImplementationDelegationState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillPlanOrchestrationStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillPlanOrchestrationState& OutSkillPlanOrchestrationState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillProviderProfileRoutingStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillProviderProfileRoutingState&
|
||||||
|
OutSkillProviderProfileRoutingState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillProviderUsageOperationsAuditStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillProviderUsageOperationsAuditState&
|
||||||
|
OutSkillProviderUsageOperationsAuditState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillDomainPackFrameworkStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillDomainPackFrameworkState&
|
||||||
|
OutSkillDomainPackFrameworkState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillRetainedDomainPackStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillRetainedDomainPackState&
|
||||||
|
OutSkillRetainedDomainPackState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
|
static bool DeserializeSkillCreativeMediaPackStateFromJson(
|
||||||
|
const FString& Json,
|
||||||
|
FHyperTwistSkillCreativeMediaPackState&
|
||||||
|
OutSkillCreativeMediaPackState
|
||||||
|
);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
|
||||||
static bool DeserializeTrainingTimerExportPacketFromJson(const FString& Json, FHyperTwistTrainingTimerExportPacket& OutTimerExportPacket);
|
static bool DeserializeTrainingTimerExportPacketFromJson(const FString& Json, FHyperTwistTrainingTimerExportPacket& OutTimerExportPacket);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -3,7 +3,11 @@
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "Kismet/BlueprintFunctionLibrary.h"
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
#include "HyperTwistMemory/HyperTwistMemoryTypes.h"
|
#include "HyperTwistMemory/HyperTwistMemoryTypes.h"
|
||||||
|
#include "HyperTwistRecognition/HyperTwistRecognitionTypes.h"
|
||||||
|
#include "HyperTwistReplay/HyperTwistReplayReviewLibrary.h"
|
||||||
#include "HyperTwistSkills/HyperTwistSkillTypes.h"
|
#include "HyperTwistSkills/HyperTwistSkillTypes.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSharedAssetLibrary.h"
|
||||||
#include "HyperTwistSkillCoreLibrary.generated.h"
|
#include "HyperTwistSkillCoreLibrary.generated.h"
|
||||||
|
|
||||||
UCLASS()
|
UCLASS()
|
||||||
|
|
@ -107,4 +111,105 @@ public:
|
||||||
const FHyperTwistSkillExtractionState& ExtractionState,
|
const FHyperTwistSkillExtractionState& ExtractionState,
|
||||||
const FHyperTwistSkillBrowserDiagnosticsState& BrowserDiagnosticsState
|
const FHyperTwistSkillBrowserDiagnosticsState& BrowserDiagnosticsState
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillWorkflowReviewState DeriveSkillWorkflowReviewState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillExtractionState& ExtractionState,
|
||||||
|
const FHyperTwistSkillWorkflowMemoryCaptureState& WorkflowMemoryCaptureState,
|
||||||
|
const FHyperTwistSkillDesignShellState& DesignShellState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillImplementationDelegationState
|
||||||
|
DeriveSkillImplementationDelegationState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillWorkflowReviewState& WorkflowReviewState,
|
||||||
|
const FHyperTwistSkillDesignShellState& DesignShellState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillPlanOrchestrationState
|
||||||
|
DeriveSkillPlanOrchestrationState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillImplementationDelegationState&
|
||||||
|
ImplementationDelegationState,
|
||||||
|
const FHyperTwistSkillWorkflowMemoryCaptureState&
|
||||||
|
WorkflowMemoryCaptureState,
|
||||||
|
const FHyperTwistSkillWorkflowReviewState& WorkflowReviewState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillProviderProfileRoutingState
|
||||||
|
DeriveSkillProviderProfileRoutingState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillAnalyzerWrapperState& AnalyzerWrapperState,
|
||||||
|
const FHyperTwistSpeechSessionConfig& SpeechSessionConfig,
|
||||||
|
const FHyperTwistSpeechServiceHealth& SpeechServiceHealth
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillProviderUsageOperationsAuditState
|
||||||
|
DeriveSkillProviderUsageOperationsAuditState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState&
|
||||||
|
ProviderProfileRoutingState,
|
||||||
|
const FHyperTwistSpeechSessionConfig& SpeechSessionConfig,
|
||||||
|
const FHyperTwistSpeechServiceHealth& SpeechServiceHealth
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillDomainPackFrameworkState
|
||||||
|
DeriveSkillDomainPackFrameworkState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState& PlanOrchestrationState,
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState&
|
||||||
|
ProviderUsageOperationsAuditState
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillRetainedDomainPackState
|
||||||
|
DeriveSkillRetainedDomainPackState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState& DomainPackFrameworkState,
|
||||||
|
const FHyperTwistTrainingRepositoryIntegrityReport&
|
||||||
|
TrainingRepositoryIntegrityReport,
|
||||||
|
const FHyperTwistTrainingDeckHistorySummary& DeckHistorySummary,
|
||||||
|
const FHyperTwistTrainingTimingTrendSummary& TimingTrendSummary,
|
||||||
|
const FHyperTwistTrainingPersonalBestSummary& PersonalBestSummary,
|
||||||
|
const FHyperTwistReplayReviewAnalytics& ReplayReviewAnalytics,
|
||||||
|
const TArray<FHyperTwistContentPack>& RetainedContentPacks,
|
||||||
|
const FHyperTwistTrainingTimerExportPacket& TrainingTimerExportPacket,
|
||||||
|
const FHyperTwistTrainingMediaExportReferenceBundle&
|
||||||
|
MediaExportReferenceBundle
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Skills")
|
||||||
|
static FHyperTwistSkillCreativeMediaPackState
|
||||||
|
DeriveSkillCreativeMediaPackState(
|
||||||
|
const FHyperTwistSkillRegistryState& RegistryState,
|
||||||
|
const FHyperTwistSkillControlState& ControlState,
|
||||||
|
const FHyperTwistSkillAuthoringHarnessState& AuthoringHarnessState,
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState& RetainedDomainPackState,
|
||||||
|
const FHyperTwistReplayReviewAnalytics& ReplayReviewAnalytics,
|
||||||
|
const FHyperTwistTrainingTimerExportPacket& TrainingTimerExportPacket,
|
||||||
|
const FHyperTwistTrainingMediaExportReferenceBundle&
|
||||||
|
MediaExportReferenceBundle,
|
||||||
|
const FHyperTwistTrainingSharedAssetReferenceBundle&
|
||||||
|
SharedAssetReferenceBundle
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,696 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
|
||||||
|
#include "HyperTwistTrainingLearnedSearchLibrary.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchPackageReference
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PackageId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Label;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ExportPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString OwnershipRole;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString LicensePosture;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RetainedSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredNoticeActions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !PackageId.IsEmpty() && !Label.IsEmpty() && !ExportPath.IsEmpty()
|
||||||
|
&& !OwnershipRole.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchExperimentProfileContract
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> StateSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> GenerationSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SearchSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !ContractId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchAdiGenerationBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> GenerationSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> TargetSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SearchSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ModelSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchAttributionBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> AllowedUseTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredNoticeActions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchSequencePolicyContract
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SequenceSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SamplingSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> WeightingSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !ContractId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchSearchBudgetBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> BudgetSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> FrontierSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchNodeIdentityContract
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> IdentitySurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> LineageSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !ContractId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchStateExpansionBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExpansionSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> GoalSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchFrontierScoringBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> FrontierSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> EvaluationSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RecoverySurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> TerminationSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ArchitectureSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> InitializationSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString BoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SyncSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ParameterSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProvenanceCaveats;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !BoundaryId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingLearnedSearchReferenceBundle
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ReferenceUtc;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryExperimentProfileContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryAdiGenerationBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimarySearchBenchmarkBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryAttributionBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimarySequencePolicyContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimarySearchBudgetBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryNodeIdentityContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryStateExpansionBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryFrontierScoringBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimarySolutionUnwindBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryValueNetworkShapeBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryGeneratorSyncBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchPackageReference> PackageReferences;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchExperimentProfileContract> ExperimentProfileContracts;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchAdiGenerationBoundary> AdiGenerationBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary> SearchBenchmarkBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchAttributionBoundary> AttributionBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchSequencePolicyContract> SequencePolicyContracts;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchSearchBudgetBoundary> SearchBudgetBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchNodeIdentityContract> NodeIdentityContracts;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchStateExpansionBoundary> StateExpansionBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchFrontierScoringBoundary> FrontierScoringBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary> SolutionUnwindBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary> ValueNetworkShapeBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary> GeneratorSyncBoundaries;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !PrimaryExperimentProfileContractId.IsEmpty()
|
||||||
|
&& !PrimaryAdiGenerationBoundaryId.IsEmpty()
|
||||||
|
&& !PrimarySearchBenchmarkBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryAttributionBoundaryId.IsEmpty()
|
||||||
|
&& !PrimarySequencePolicyContractId.IsEmpty()
|
||||||
|
&& !PrimarySearchBudgetBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryNodeIdentityContractId.IsEmpty()
|
||||||
|
&& !PrimaryStateExpansionBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryFrontierScoringBoundaryId.IsEmpty()
|
||||||
|
&& !PrimarySolutionUnwindBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryValueNetworkShapeBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryGeneratorSyncBoundaryId.IsEmpty()
|
||||||
|
&& PackageReferences.Num() > 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class UNREALHYPERTWIST_API UHyperTwistTrainingLearnedSearchLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static FHyperTwistTrainingLearnedSearchReferenceBundle BuildBundledLearnedSearchReferenceBundle();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetExperimentProfileContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchExperimentProfileContract& OutContract
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetAdiGenerationBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchAdiGenerationBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetSearchBenchmarkBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetAttributionBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchAttributionBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetSequencePolicyContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSequencePolicyContract& OutContract
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetSearchBudgetBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBudgetBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetNodeIdentityContractById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingLearnedSearchNodeIdentityContract& OutContract
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetStateExpansionBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchStateExpansionBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetFrontierScoringBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchFrontierScoringBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetSolutionUnwindBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetValueNetworkShapeBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static bool TryGetGeneratorSyncBoundaryById(
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle,
|
||||||
|
const FString& BoundaryId,
|
||||||
|
FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary& OutBoundary
|
||||||
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|LearnedSearch")
|
||||||
|
static FString BuildPackageChecklistTsv(const FHyperTwistTrainingLearnedSearchReferenceBundle& Bundle);
|
||||||
|
};
|
||||||
|
|
@ -123,6 +123,47 @@ struct FHyperTwistTrainingMagic120CellPersistenceBoundary
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingMagic120CellViewProfileContract
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProjectionSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> SymmetryPresetTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> VisibilityPresetTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> FocusSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !ContractId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
USTRUCT(BlueprintType)
|
USTRUCT(BlueprintType)
|
||||||
struct FHyperTwistTrainingMagic120CellAttributionBoundary
|
struct FHyperTwistTrainingMagic120CellAttributionBoundary
|
||||||
{
|
{
|
||||||
|
|
@ -172,6 +213,9 @@ struct FHyperTwistTrainingMagic120CellReferenceBundle
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FString PrimaryPersistenceBoundaryId;
|
FString PrimaryPersistenceBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryViewProfileContractId;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FString PrimaryAttributionBoundaryId;
|
FString PrimaryAttributionBoundaryId;
|
||||||
|
|
||||||
|
|
@ -184,6 +228,9 @@ struct FHyperTwistTrainingMagic120CellReferenceBundle
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
TArray<FHyperTwistTrainingMagic120CellPersistenceBoundary> PersistenceBoundaries;
|
TArray<FHyperTwistTrainingMagic120CellPersistenceBoundary> PersistenceBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingMagic120CellViewProfileContract> ViewProfileContracts;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
TArray<FHyperTwistTrainingMagic120CellAttributionBoundary> AttributionBoundaries;
|
TArray<FHyperTwistTrainingMagic120CellAttributionBoundary> AttributionBoundaries;
|
||||||
|
|
||||||
|
|
@ -191,6 +238,7 @@ struct FHyperTwistTrainingMagic120CellReferenceBundle
|
||||||
{
|
{
|
||||||
return !PrimaryRuntimeProfileContractId.IsEmpty()
|
return !PrimaryRuntimeProfileContractId.IsEmpty()
|
||||||
&& !PrimaryPersistenceBoundaryId.IsEmpty()
|
&& !PrimaryPersistenceBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryViewProfileContractId.IsEmpty()
|
||||||
&& !PrimaryAttributionBoundaryId.IsEmpty()
|
&& !PrimaryAttributionBoundaryId.IsEmpty()
|
||||||
&& PackageReferences.Num() > 0;
|
&& PackageReferences.Num() > 0;
|
||||||
}
|
}
|
||||||
|
|
@ -219,6 +267,13 @@ public:
|
||||||
FHyperTwistTrainingMagic120CellPersistenceBoundary& OutBoundary
|
FHyperTwistTrainingMagic120CellPersistenceBoundary& OutBoundary
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Magic120Cell")
|
||||||
|
static bool TryGetViewProfileContractById(
|
||||||
|
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingMagic120CellViewProfileContract& OutContract
|
||||||
|
);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Magic120Cell")
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Magic120Cell")
|
||||||
static bool TryGetAttributionBoundaryById(
|
static bool TryGetAttributionBoundaryById(
|
||||||
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle,
|
const FHyperTwistTrainingMagic120CellReferenceBundle& Bundle,
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,47 @@ struct FHyperTwistTrainingMagicCube5DPersistenceBoundary
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHyperTwistTrainingMagicCube5DViewProfileContract
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString ContractId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Title;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString Summary;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> RequiredPackageIds;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ProjectionSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> StereoSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> VisibilitySurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> FocusSurfaceTags;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FString> ExplicitExclusions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistTrainingSourceAttribution SourceAttribution;
|
||||||
|
|
||||||
|
bool IsStructurallyValid() const
|
||||||
|
{
|
||||||
|
return !ContractId.IsEmpty() && !Title.IsEmpty() && SourceAttribution.IsStructurallyValid();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
USTRUCT(BlueprintType)
|
USTRUCT(BlueprintType)
|
||||||
struct FHyperTwistTrainingMagicCube5DAttributionBoundary
|
struct FHyperTwistTrainingMagicCube5DAttributionBoundary
|
||||||
{
|
{
|
||||||
|
|
@ -175,6 +216,9 @@ struct FHyperTwistTrainingMagicCube5DReferenceBundle
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FString PrimaryPersistenceBoundaryId;
|
FString PrimaryPersistenceBoundaryId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FString PrimaryViewProfileContractId;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FString PrimaryAttributionBoundaryId;
|
FString PrimaryAttributionBoundaryId;
|
||||||
|
|
||||||
|
|
@ -187,6 +231,9 @@ struct FHyperTwistTrainingMagicCube5DReferenceBundle
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
TArray<FHyperTwistTrainingMagicCube5DPersistenceBoundary> PersistenceBoundaries;
|
TArray<FHyperTwistTrainingMagicCube5DPersistenceBoundary> PersistenceBoundaries;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
TArray<FHyperTwistTrainingMagicCube5DViewProfileContract> ViewProfileContracts;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
TArray<FHyperTwistTrainingMagicCube5DAttributionBoundary> AttributionBoundaries;
|
TArray<FHyperTwistTrainingMagicCube5DAttributionBoundary> AttributionBoundaries;
|
||||||
|
|
||||||
|
|
@ -194,6 +241,7 @@ struct FHyperTwistTrainingMagicCube5DReferenceBundle
|
||||||
{
|
{
|
||||||
return !PrimaryRuntimeProfileContractId.IsEmpty()
|
return !PrimaryRuntimeProfileContractId.IsEmpty()
|
||||||
&& !PrimaryPersistenceBoundaryId.IsEmpty()
|
&& !PrimaryPersistenceBoundaryId.IsEmpty()
|
||||||
|
&& !PrimaryViewProfileContractId.IsEmpty()
|
||||||
&& !PrimaryAttributionBoundaryId.IsEmpty()
|
&& !PrimaryAttributionBoundaryId.IsEmpty()
|
||||||
&& PackageReferences.Num() > 0;
|
&& PackageReferences.Num() > 0;
|
||||||
}
|
}
|
||||||
|
|
@ -222,6 +270,13 @@ public:
|
||||||
FHyperTwistTrainingMagicCube5DPersistenceBoundary& OutBoundary
|
FHyperTwistTrainingMagicCube5DPersistenceBoundary& OutBoundary
|
||||||
);
|
);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|MagicCube5D")
|
||||||
|
static bool TryGetViewProfileContractById(
|
||||||
|
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle,
|
||||||
|
const FString& ContractId,
|
||||||
|
FHyperTwistTrainingMagicCube5DViewProfileContract& OutContract
|
||||||
|
);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|MagicCube5D")
|
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|MagicCube5D")
|
||||||
static bool TryGetAttributionBoundaryById(
|
static bool TryGetAttributionBoundaryById(
|
||||||
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle,
|
const FHyperTwistTrainingMagicCube5DReferenceBundle& Bundle,
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1949,6 +1949,9 @@ struct FHyperTwistTrainingCompanionSpeechSessionState
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FHyperTwistSpeechNativeCaptureRouteShellState NativeCaptureRouteShellState;
|
FHyperTwistSpeechNativeCaptureRouteShellState NativeCaptureRouteShellState;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
|
FHyperTwistSpeechExternalDictationShellState ExternalDictationShellState;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||||
FHyperTwistSpeechUsageCostDashboardShellState UsageCostDashboardShellState;
|
FHyperTwistSpeechUsageCostDashboardShellState UsageCostDashboardShellState;
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,198 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
#include "HyperTwistRecognition/HyperTwistVoiceClient.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistCoquiPhase6RARTestInternal
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* MakeMockVoiceClient()
|
||||||
|
{
|
||||||
|
return NewObject<UHyperTwistMockVoiceClient>(GetTransientPackage());
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistHttpVoiceClient* MakeHttpVoiceClient()
|
||||||
|
{
|
||||||
|
return NewObject<UHyperTwistHttpVoiceClient>(GetTransientPackage());
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceModelReviewDescriptor* FindReviewById(
|
||||||
|
const TArray<FHyperTwistVoiceModelReviewDescriptor>& Reviews,
|
||||||
|
const FString& ReviewId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return Reviews.FindByPredicate(
|
||||||
|
[&ReviewId](const FHyperTwistVoiceModelReviewDescriptor& Review)
|
||||||
|
{
|
||||||
|
return Review.VoiceModelReviewId == ReviewId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistCoquiPhase6RARVoiceModelReviewProfileTest,
|
||||||
|
"HyperTwist.Permissive.Coqui.Phase6R.AR.VoiceModelReviewProfile",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistCoquiPhase6RARVoiceModelReviewProfileTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* VoiceClient = HyperTwistCoquiPhase6RARTestInternal::MakeMockVoiceClient();
|
||||||
|
TestNotNull(TEXT("The mock voice client must be constructed for Phase 6R-AR."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
TestTrue(TEXT("The advanced voice-model review health must remain structurally valid."), Health.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The advanced review lane must preserve the voice-model review profile id."),
|
||||||
|
Health.VoiceModelReviewProfileId,
|
||||||
|
TEXT("downloadable-voice-model-review-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The advanced review profile must remain structurally valid."),
|
||||||
|
Health.VoiceModelReviewProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The advanced review lane must advertise downloadable voice-model review."),
|
||||||
|
Health.Capabilities.Contains(TEXT("downloadableVoiceModelReview"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The advanced review lane must advertise model-license selection review."),
|
||||||
|
Health.Capabilities.Contains(TEXT("modelLicenseSelectionReview"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The advanced review lane must advertise terms-acceptance review."),
|
||||||
|
Health.Capabilities.Contains(TEXT("termsAcceptanceReview"))
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The advanced review profile must keep runtime model download deferred."),
|
||||||
|
Health.VoiceModelReviewProfileDefinition.bAllowsRuntimeModelDownloadInCurrentPacket
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The advanced review profile must keep bundled model redistribution disabled."),
|
||||||
|
Health.VoiceModelReviewProfileDefinition.bAllowsBundledModelRedistribution
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The advanced review lane must expose one bounded advanced review descriptor."),
|
||||||
|
Health.SupportedVoiceModelReviewIds.Num(),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The advanced review lane must expose one bounded advanced review record."),
|
||||||
|
Health.SupportedVoiceModelReviews.Num(),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistCoquiPhase6RARAdvancedNarrationReviewAlignmentTest,
|
||||||
|
"HyperTwist.Permissive.Coqui.Phase6R.AR.AdvancedNarrationReviewAlignment",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistCoquiPhase6RARAdvancedNarrationReviewAlignmentTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* VoiceClient = HyperTwistCoquiPhase6RARTestInternal::MakeMockVoiceClient();
|
||||||
|
TestNotNull(TEXT("The mock voice client must be constructed for Phase 6R-AR."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
const FHyperTwistNarrationSynthesisRequest Request =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleAdvancedNarrationSynthesisRequest();
|
||||||
|
const FHyperTwistVoiceModelReviewDescriptor* Review =
|
||||||
|
HyperTwistCoquiPhase6RARTestInternal::FindReviewById(
|
||||||
|
Health.SupportedVoiceModelReviews,
|
||||||
|
TEXT("voice-model-review/coqui/multilingual-premium-v1")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The advanced coqui review descriptor must be present."), Review);
|
||||||
|
if (Review == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review descriptor must align to the advanced narration model binding."),
|
||||||
|
Review->ModelBindingId,
|
||||||
|
Request.OrchestrationProfile.ModelBindingId
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review descriptor must align to the advanced narration vocoder binding."),
|
||||||
|
Review->VocoderBindingId,
|
||||||
|
Request.OrchestrationProfile.VocoderBindingId
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review descriptor must align to the advanced narration voice profile."),
|
||||||
|
Review->VoiceProfileId,
|
||||||
|
Request.VoiceProfileId
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review descriptor must preserve the registry-backed review document path."),
|
||||||
|
Review->ReviewDocumentPath,
|
||||||
|
TEXT("TTS/.models.json")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The advanced descriptor must preserve the terms-acceptance review requirement."),
|
||||||
|
Review->bTosAcceptanceRequired
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The advanced descriptor must not imply bundled redistribution."),
|
||||||
|
Review->bBundledWithCodeDistribution
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistCoquiPhase6RARProviderBackedReviewFallbackTest,
|
||||||
|
"HyperTwist.Permissive.Coqui.Phase6R.AR.ProviderBackedReviewFallback",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistCoquiPhase6RARProviderBackedReviewFallbackTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistHttpVoiceClient* VoiceClient = HyperTwistCoquiPhase6RARTestInternal::MakeHttpVoiceClient();
|
||||||
|
TestNotNull(TEXT("The provider-backed voice client must be constructed for Phase 6R-AR."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
VoiceClient->ServiceBaseUrl.Reset();
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The provider-backed review fallback must remain structurally valid."), Health.IsStructurallyValid());
|
||||||
|
TestFalse(TEXT("The provider-backed review fallback must report not ready."), Health.bReady);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve the missing-endpoint error."),
|
||||||
|
Health.LastError,
|
||||||
|
TEXT("service-base-url-missing")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The provider-backed review fallback must preserve downloadable voice-model review capability."),
|
||||||
|
Health.Capabilities.Contains(TEXT("downloadableVoiceModelReview"))
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve one advanced review id."),
|
||||||
|
Health.SupportedVoiceModelReviewIds.Num(),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve one advanced review descriptor."),
|
||||||
|
Health.SupportedVoiceModelReviews.Num(),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,251 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistFasterWhisperPhase6RAPTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeSpeechDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-ap/fasterwhisper-service-lane-tuning");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AP Faster Whisper Service Lane Tuning");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-ap-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Sequence;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AP Coach Speech");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockSpeechClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* SpeechClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("CompanionSpeechClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
SpeechClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeSpeechSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockSpeechClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeSpeechDeck(),
|
||||||
|
TEXT("phase6r-ap-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasCapability(const TArray<FString>& Capabilities, const FString& ExpectedCapability)
|
||||||
|
{
|
||||||
|
return Capabilities.Contains(ExpectedCapability);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistFasterWhisperPhase6RAPSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.FasterWhisper.Phase6R.AP.SessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistFasterWhisperPhase6RAPSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::MakeSpeechSubsystem(
|
||||||
|
TEXT("phase6r-ap-config-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AP."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The speech session must open for the Phase 6R-AP tuning profile."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingCompanionSpeechSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState();
|
||||||
|
const FHyperTwistSpeechTranscriptionOrchestrationProfile& Profile =
|
||||||
|
SessionState.SessionConfig.OrchestrationProfile;
|
||||||
|
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The tuning profile must preserve the Python orchestration profile id."),
|
||||||
|
Profile.OrchestrationProfileId,
|
||||||
|
TEXT("python-batch-transcribe-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must preserve the batch collection window."),
|
||||||
|
Profile.BatchCollectionWindowMs,
|
||||||
|
150
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must preserve the prompt-routing mode."),
|
||||||
|
Profile.PromptRoutingModeId,
|
||||||
|
TEXT("prefix-hotword-session-hints-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must preserve the retrieval context lane."),
|
||||||
|
Profile.RetrievalContextLaneId,
|
||||||
|
TEXT("speech-command-hint-session-memory")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must preserve the retrieved-hint cap."),
|
||||||
|
Profile.MaxRetrievedHintCount,
|
||||||
|
4
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The bounded tuning profile must keep retrieved-hint augmentation enabled."),
|
||||||
|
Profile.bEnableRetrievedHintAugmentation
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistFasterWhisperPhase6RAPTranscriptTuningTest,
|
||||||
|
"HyperTwist.Permissive.FasterWhisper.Phase6R.AP.TranscriptTuningMetadata",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistFasterWhisperPhase6RAPTranscriptTuningTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::MakeSpeechSubsystem(
|
||||||
|
TEXT("phase6r-ap-transcript-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AP."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistSpeechUtteranceEnvelope Utterance;
|
||||||
|
Utterance.AudioRef = TEXT("mock://coach/next-case");
|
||||||
|
Utterance.SpeechStartMs = 100;
|
||||||
|
Utterance.SpeechEndMs = 900;
|
||||||
|
Utterance.SilenceGapMs = 180;
|
||||||
|
Utterance.SampleCount = 12800;
|
||||||
|
const FHyperTwistSpeechTranscriptResult Result =
|
||||||
|
TrainingSubsystem->SubmitActiveCompanionSpeechUtterance(Utterance);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The transcript result must remain structurally valid."), Result.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The batch collection window must be carried onto the transcript result."),
|
||||||
|
Result.AppliedBatchCollectionWindowMs,
|
||||||
|
150
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The prompt-routing mode must be carried onto the transcript result."),
|
||||||
|
Result.AppliedPromptRoutingModeId,
|
||||||
|
TEXT("prefix-hotword-session-hints-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The retrieval context lane must be carried onto the transcript result."),
|
||||||
|
Result.AppliedRetrievalContextLaneId,
|
||||||
|
TEXT("speech-command-hint-session-memory")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The bounded tuning profile must record retrieved-hint augmentation."),
|
||||||
|
Result.bUsedRetrievedHintAugmentation
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must cap retrieved command hints to four."),
|
||||||
|
Result.RetrievedHintCount,
|
||||||
|
4
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded tuning profile must retain the first command hint."),
|
||||||
|
Result.AppliedRetrievedHints.Num() > 0 ? Result.AppliedRetrievedHints[0] : FString(),
|
||||||
|
TEXT("ready coach")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The bounded tuning profile must still surface prompt-hint usage."),
|
||||||
|
Result.bUsedPromptHints
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistFasterWhisperPhase6RAPServiceHealthTest,
|
||||||
|
"HyperTwist.Permissive.FasterWhisper.Phase6R.AP.ServiceHealth",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistFasterWhisperPhase6RAPServiceHealthTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::MakeSpeechSubsystem(
|
||||||
|
TEXT("phase6r-ap-health-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AP."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistTrainingCompanionSpeechSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState();
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the batch-window tuning capability."),
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("batchWindowTuning")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the prompt-routing profile capability."),
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("promptRoutingProfiles")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the retrieval-hint augmentation capability."),
|
||||||
|
HyperTwistFasterWhisperPhase6RAPTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("retrievalHintAugmentation")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,245 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistHandyPhase6RAJTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeSpeechDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-aj/handy-dictation-adjunct");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AJ Handy Dictation Adjunct");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-aj-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Sequence;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AJ Coach Speech");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockSpeechClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* SpeechClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("CompanionSpeechClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
SpeechClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeSpeechSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem = NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockSpeechClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeSpeechDeck(),
|
||||||
|
TEXT("phase6r-aj-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasActionId(const TArray<FString>& ActionIds, const FString& ExpectedActionId)
|
||||||
|
{
|
||||||
|
return ActionIds.Contains(ExpectedActionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasCapability(const TArray<FString>& Capabilities, const FString& ExpectedCapability)
|
||||||
|
{
|
||||||
|
return Capabilities.Contains(ExpectedCapability);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAJSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AJ.SessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAJSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::MakeSpeechSubsystem(TEXT("phase6r-aj-config-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AJ."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The companion speech session must open for the Handy adjunct."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingCompanionSpeechSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState();
|
||||||
|
TestTrue(TEXT("The speech session config must remain structurally valid."), SessionState.SessionConfig.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The external dictation shell profile id must be present."),
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileId,
|
||||||
|
TEXT("speech-external-dictation-shell-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The external dictation shell profile must remain structurally valid."),
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell kind must stay bounded to the external dictation shell."),
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileDefinition.ShellKind,
|
||||||
|
TEXT("operator-external-dictation-shell")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The retained shell must preserve the cycle-route action id."),
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileDefinition.CycleOutputRouteActionId,
|
||||||
|
TEXT("cycle-external-dictation-output-route")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the external dictation shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("externalDictationShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the transcript-history shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechTranscriptHistoryShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAJShellStateTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AJ.ExternalDictationShellState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAJShellStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::MakeSpeechSubsystem(TEXT("phase6r-aj-shell-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AJ."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(TEXT("The companion speech session must open for shell inspection."), TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError));
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationShellState ShellState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState().ExternalDictationShellState;
|
||||||
|
TestTrue(TEXT("The external dictation shell state must remain structurally valid."), ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The selected route must default to clipboard paste."),
|
||||||
|
ShellState.SelectedOutputRouteId,
|
||||||
|
TEXT("clipboard-paste")
|
||||||
|
);
|
||||||
|
TestEqual(TEXT("The bounded shell must expose three retained output routes."), ShellState.OutputRouteOptions.Num(), 3);
|
||||||
|
TestTrue(TEXT("The transcript-history surface must stay visible."), ShellState.bTranscriptHistoryVisible);
|
||||||
|
TestTrue(TEXT("The output-routing surface must stay visible."), ShellState.bOutputRoutingVisible);
|
||||||
|
TestFalse(TEXT("No retained transcript should exist before the first utterance."), ShellState.bLatestEntryReadyForDispatch);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the copy-transcript action."),
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("copy-latest-dictation-transcript")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the script-dispatch action."),
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("dispatch-dictation-script-output")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAJTranscriptHistoryTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AJ.TranscriptHistoryOutputRouting",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAJTranscriptHistoryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAJTestInternal::MakeSpeechSubsystem(
|
||||||
|
TEXT("phase6r-aj-transcript-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AJ."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistSpeechUtteranceEnvelope Utterance;
|
||||||
|
Utterance.AudioRef = TEXT("mock://coach/repeat-case");
|
||||||
|
Utterance.SpeechStartMs = 140;
|
||||||
|
Utterance.SpeechEndMs = 920;
|
||||||
|
Utterance.SilenceGapMs = 180;
|
||||||
|
Utterance.SampleCount = 12480;
|
||||||
|
const FHyperTwistSpeechTranscriptResult Result =
|
||||||
|
TrainingSubsystem->SubmitActiveCompanionSpeechUtterance(Utterance);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The transcript result must stay structurally valid."), Result.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded mock route must still resolve the repeat-case transcript."),
|
||||||
|
Result.TranscriptText,
|
||||||
|
TEXT("repeat case")
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationShellState ShellState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState().ExternalDictationShellState;
|
||||||
|
TestTrue(TEXT("The external dictation shell state must remain structurally valid after transcript capture."), ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The shell must retain one transcript-history entry."), ShellState.HistoryEntryCount, 1);
|
||||||
|
TestEqual(TEXT("The latest transcript text must stay available for output routing."), ShellState.LatestTranscriptText, TEXT("repeat case"));
|
||||||
|
TestEqual(TEXT("The post-processed text must normalize to the same bounded command text."), ShellState.LatestPostProcessedText, TEXT("repeat case"));
|
||||||
|
TestTrue(TEXT("The latest retained transcript must be ready for output routing."), ShellState.bLatestEntryReadyForDispatch);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The retained transcript must stay aligned to the selected route."),
|
||||||
|
ShellState.HistoryEntries.Num() > 0 ? ShellState.HistoryEntries[0].OutputRouteId : FString(),
|
||||||
|
TEXT("clipboard-paste")
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,313 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistHandyPhase6RAOTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeSpeechDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-ao/handy-hotkey-mute-device-shell");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AO Handy Hotkey Mute Device Shell");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-ao-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Sequence;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AO Coach Speech");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockSpeechClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* SpeechClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("CompanionSpeechClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
SpeechClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeSpeechSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockSpeechClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeSpeechDeck(),
|
||||||
|
TEXT("phase6r-ao-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasCapability(const TArray<FString>& Capabilities, const FString& ExpectedCapability)
|
||||||
|
{
|
||||||
|
return Capabilities.Contains(ExpectedCapability);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasActionId(const TArray<FString>& ActionIds, const FString& ExpectedActionId)
|
||||||
|
{
|
||||||
|
return ActionIds.Contains(ExpectedActionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasProfileActionBinding(
|
||||||
|
const TArray<FHyperTwistSpeechShellActionBinding>& ActionBindings,
|
||||||
|
const FString& ExpectedActionId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return ActionBindings.ContainsByPredicate(
|
||||||
|
[&ExpectedActionId](const FHyperTwistSpeechShellActionBinding& Binding)
|
||||||
|
{
|
||||||
|
return Binding.ActionId == ExpectedActionId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAOSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AO.SessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAOSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::MakeSpeechSubsystem(TEXT("phase6r-ao-config-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AO."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The companion speech session must open for the Handy shell posture."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingCompanionSpeechSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState();
|
||||||
|
const FHyperTwistSpeechExternalDictationShellProfile& Profile =
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileDefinition;
|
||||||
|
|
||||||
|
TestTrue(TEXT("The external dictation shell profile must remain structurally valid."), Profile.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The global hotkey surface must stay bounded to platform-scoped shortcut lifecycle."),
|
||||||
|
Profile.GlobalHotkeySurfaceMode,
|
||||||
|
TEXT("platform-scoped-dictation-shortcut-lifecycle")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The input-device surface must stay bounded to selected device cycling."),
|
||||||
|
Profile.InputDeviceSurfaceMode,
|
||||||
|
TEXT("selected-input-device-cycle")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The output-device surface must stay bounded to selected device cycling."),
|
||||||
|
Profile.OutputDeviceSurfaceMode,
|
||||||
|
TEXT("selected-output-device-cycle")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The mute surface must stay bounded to mute-while-recording posture."),
|
||||||
|
Profile.MuteSurfaceMode,
|
||||||
|
TEXT("mute-while-recording-toggle")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The microphone mode surface must stay bounded to lazy-close and always-on posture."),
|
||||||
|
Profile.MicrophoneModeSurfaceMode,
|
||||||
|
TEXT("lazy-close-and-always-on-mode")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The retained primary hotkey label must stay aligned to the donor shortcut posture."),
|
||||||
|
Profile.PrimaryHotkeyBindingLabel,
|
||||||
|
TEXT("ctrl+space")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The retained post-process hotkey label must stay aligned to the donor shortcut posture."),
|
||||||
|
Profile.PostProcessHotkeyBindingLabel,
|
||||||
|
TEXT("ctrl+shift+space")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the global-hotkey inspection action binding."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("inspect-dictation-global-hotkey")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the input-device cycle action binding."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("cycle-dictation-input-device")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the mute toggle action binding."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("toggle-dictation-mute-while-recording")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the global-hotkey shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechGlobalHotkeyShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the device-selection shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechDeviceSelectionShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the mute-while-recording shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechMuteWhileRecordingShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the microphone-mode shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechMicrophoneModeShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAOShellStateTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AO.HotkeyMuteDeviceShellState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAOShellStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::MakeSpeechSubsystem(TEXT("phase6r-ao-shell-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AO."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The companion speech session must open for shell inspection."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationShellState ShellState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState().ExternalDictationShellState;
|
||||||
|
TestTrue(TEXT("The external dictation shell state must remain structurally valid."), ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The primary global hotkey label must remain aligned to the retained shortcut posture."),
|
||||||
|
ShellState.PrimaryHotkeyBindingLabel,
|
||||||
|
TEXT("ctrl+space")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The post-process hotkey label must remain aligned to the retained shortcut posture."),
|
||||||
|
ShellState.PostProcessHotkeyBindingLabel,
|
||||||
|
TEXT("ctrl+shift+space")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The selected input device id must default to the system route."),
|
||||||
|
ShellState.SelectedInputDeviceId,
|
||||||
|
TEXT("system-default-input")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The selected output device id must default to the system route."),
|
||||||
|
ShellState.SelectedOutputDeviceId,
|
||||||
|
TEXT("system-default-output")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The microphone mode must default to on-demand."),
|
||||||
|
ShellState.MicrophoneModeId,
|
||||||
|
TEXT("on-demand")
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("The shell must surface the global-hotkey card."), ShellState.bGlobalHotkeyVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the input-device selection card."), ShellState.bInputDeviceSelectionVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the output-device selection card."), ShellState.bOutputDeviceSelectionVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the mute-while-recording card."), ShellState.bMuteWhileRecordingVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the microphone-mode card."), ShellState.bMicrophoneModeVisible);
|
||||||
|
TestTrue(TEXT("The shell must keep push-to-talk mode enabled by default."), ShellState.bPushToTalkMode);
|
||||||
|
TestFalse(TEXT("Mute-while-recording must stay disabled by default."), ShellState.bMuteWhileRecordingEnabled);
|
||||||
|
TestEqual(TEXT("The shell must retain three bounded input-device options."), ShellState.InputDeviceOptions.Num(), 3);
|
||||||
|
TestEqual(TEXT("The shell must retain two bounded output-device options."), ShellState.OutputDeviceOptions.Num(), 2);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the global-hotkey inspection action."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("inspect-dictation-global-hotkey")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the input-device cycle action."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("cycle-dictation-input-device")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the output-device cycle action."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("cycle-dictation-output-device")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the mute-while-recording toggle action."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("toggle-dictation-mute-while-recording")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the microphone-mode toggle action."),
|
||||||
|
HyperTwistHandyPhase6RAOTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("toggle-dictation-microphone-mode")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,352 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistHandyPhase6RAUTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeSpeechDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-au/handy-local-model-catalog-shell");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AU Handy Local Model Catalog Shell");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-au-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Sequence;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AU Coach Speech");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockSpeechClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* SpeechClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("CompanionSpeechClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
SpeechClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeSpeechSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockSpeechClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeSpeechDeck(),
|
||||||
|
TEXT("phase6r-au-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasCapability(const TArray<FString>& Capabilities, const FString& ExpectedCapability)
|
||||||
|
{
|
||||||
|
return Capabilities.Contains(ExpectedCapability);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasActionId(const TArray<FString>& ActionIds, const FString& ExpectedActionId)
|
||||||
|
{
|
||||||
|
return ActionIds.Contains(ExpectedActionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasProfileActionBinding(
|
||||||
|
const TArray<FHyperTwistSpeechShellActionBinding>& ActionBindings,
|
||||||
|
const FString& ExpectedActionId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return ActionBindings.ContainsByPredicate(
|
||||||
|
[&ExpectedActionId](const FHyperTwistSpeechShellActionBinding& Binding)
|
||||||
|
{
|
||||||
|
return Binding.ActionId == ExpectedActionId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationModelCatalogEntry* FindCatalogEntry(
|
||||||
|
const TArray<FHyperTwistSpeechExternalDictationModelCatalogEntry>& Entries,
|
||||||
|
const FString& PayloadId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return Entries.FindByPredicate(
|
||||||
|
[&PayloadId](const FHyperTwistSpeechExternalDictationModelCatalogEntry& Entry)
|
||||||
|
{
|
||||||
|
return Entry.PayloadId == PayloadId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAUSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AU.SessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAUSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::MakeSpeechSubsystem(TEXT("phase6r-au-config-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AU."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The companion speech session must open for the Handy local-model-catalog posture."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingCompanionSpeechSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState();
|
||||||
|
const FHyperTwistSpeechExternalDictationShellProfile& Profile =
|
||||||
|
SessionState.SessionConfig.ExternalDictationShellProfileDefinition;
|
||||||
|
|
||||||
|
TestTrue(TEXT("The external dictation shell profile must remain structurally valid."), Profile.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The local model catalog surface must stay bounded to review posture."),
|
||||||
|
Profile.LocalModelCatalogSurfaceMode,
|
||||||
|
TEXT("local-model-catalog-review")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The local model integrity surface must stay bounded to payload-integrity review."),
|
||||||
|
Profile.ModelIntegritySurfaceMode,
|
||||||
|
TEXT("payload-integrity-review")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The local model unload surface must stay bounded to sidecar unload-policy review."),
|
||||||
|
Profile.ModelUnloadSurfaceMode,
|
||||||
|
TEXT("sidecar-model-unload-policy")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the local model catalog inspection action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("inspect-local-model-catalog")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the payload-integrity review action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("review-local-model-integrity")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell profile must expose the unload-policy review action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasProfileActionBinding(
|
||||||
|
Profile.ActionBindings,
|
||||||
|
TEXT("review-local-model-unload-policy")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The session config must preserve a structurally valid payload-custody profile."),
|
||||||
|
SessionState.SessionConfig.PayloadCustodyProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the local model catalog shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechLocalModelCatalogShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the model integrity shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechModelIntegrityShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must expose the model unload-policy shell capability."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("speechModelUnloadPolicyShell")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must preserve payload-custody capability."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("downloadableModelPayloadCustody")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Speech health must preserve payload-integrity review capability."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasCapability(
|
||||||
|
SessionState.ServiceHealth.Capabilities,
|
||||||
|
TEXT("payloadIntegrityReview")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistHandyPhase6RAUShellStateTest,
|
||||||
|
"HyperTwist.Permissive.Handy.Phase6R.AU.LocalModelCatalogShellState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistHandyPhase6RAUShellStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::MakeSpeechSubsystem(TEXT("phase6r-au-shell-session"));
|
||||||
|
TestNotNull(TEXT("The speech subsystem must be constructed for Phase 6R-AU."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The companion speech session must open for local-model-catalog inspection."),
|
||||||
|
TrainingSubsystem->OpenActiveCompanionSpeechSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the speech session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationShellState ShellState =
|
||||||
|
TrainingSubsystem->GetActiveCompanionSpeechSessionState().ExternalDictationShellState;
|
||||||
|
TestTrue(TEXT("The external dictation shell state must remain structurally valid."), ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must preserve the payload-custody profile id."),
|
||||||
|
ShellState.PayloadCustodyProfileId,
|
||||||
|
TEXT("downloadable-model-payload-custody-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must preserve the local model catalog surface id."),
|
||||||
|
ShellState.LocalModelCatalogSurfaceModeId,
|
||||||
|
TEXT("local-model-catalog-review")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must preserve the model integrity surface id."),
|
||||||
|
ShellState.ModelIntegritySurfaceModeId,
|
||||||
|
TEXT("payload-integrity-review")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must preserve the model unload surface id."),
|
||||||
|
ShellState.ModelUnloadSurfaceModeId,
|
||||||
|
TEXT("sidecar-model-unload-policy")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must retain two bounded catalog entries."),
|
||||||
|
ShellState.ModelCatalogEntryCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must retain one optional bounded catalog entry."),
|
||||||
|
ShellState.OptionalModelCatalogEntryCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must keep runtime download deferred for both catalog entries."),
|
||||||
|
ShellState.DownloadDeferredModelEntryCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must require integrity review for the primary whisper payload."),
|
||||||
|
ShellState.IntegrityReviewRequiredEntryCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell must preserve the primary payload selection."),
|
||||||
|
ShellState.SelectedPrimaryPayloadId,
|
||||||
|
TEXT("speech-model/whisper.cpp/base.en")
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("The shell must surface the local model catalog card."), ShellState.bLocalModelCatalogVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the model integrity card."), ShellState.bModelIntegrityVisible);
|
||||||
|
TestTrue(TEXT("The shell must surface the model unload-policy card."), ShellState.bModelUnloadPolicyVisible);
|
||||||
|
TestTrue(TEXT("The shell must keep the bounded model catalog ready for review."), ShellState.bCatalogReady);
|
||||||
|
TestTrue(TEXT("The shell must keep runtime download deferred."), ShellState.bRuntimeDownloadDeferred);
|
||||||
|
TestTrue(TEXT("The shell must keep bundled payload redistribution deferred."), ShellState.bBundledPayloadRedistributionDeferred);
|
||||||
|
TestTrue(TEXT("The shell must preserve user-managed payload support."), ShellState.bSupportsUserManagedPayloads);
|
||||||
|
TestTrue(TEXT("The shell must preserve sidecar-managed payload support."), ShellState.bSupportsSidecarManagedPayloads);
|
||||||
|
TestTrue(TEXT("The shell must preserve integrity-verification requirements."), ShellState.bIntegrityVerificationRequired);
|
||||||
|
TestTrue(TEXT("The shell must keep unload actions deferred to sidecar/out-of-packet policy."), ShellState.bUnloadActionsDeferredToSidecar);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the local model catalog action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("inspect-local-model-catalog")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the payload-integrity action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("review-local-model-integrity")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The shell must expose the unload-policy action."),
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::HasActionId(
|
||||||
|
ShellState.AvailableActionIds,
|
||||||
|
TEXT("review-local-model-unload-policy")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationModelCatalogEntry* PrimaryEntry =
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::FindCatalogEntry(
|
||||||
|
ShellState.ModelCatalogEntries,
|
||||||
|
TEXT("speech-model/whisper.cpp/base.en")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The shell must keep the primary whisper model catalog entry."), PrimaryEntry);
|
||||||
|
if (PrimaryEntry != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(TEXT("The primary catalog entry must remain selected."), PrimaryEntry->bSelectedPrimaryPayload);
|
||||||
|
TestFalse(TEXT("The primary catalog entry must not be optional."), PrimaryEntry->bOptionalForSession);
|
||||||
|
TestTrue(TEXT("The primary catalog entry must require integrity review."), PrimaryEntry->bIntegrityReviewRequired);
|
||||||
|
TestTrue(TEXT("The primary catalog entry must keep runtime download deferred."), PrimaryEntry->bDownloadDeferredInCurrentPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSpeechExternalDictationModelCatalogEntry* VadEntry =
|
||||||
|
HyperTwistHandyPhase6RAUTestInternal::FindCatalogEntry(
|
||||||
|
ShellState.ModelCatalogEntries,
|
||||||
|
TEXT("speech-vad/whisper.cpp/silero-v6.2.0")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The shell must keep the optional VAD payload catalog entry."), VadEntry);
|
||||||
|
if (VadEntry != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(TEXT("The VAD catalog entry must remain optional."), VadEntry->bOptionalForSession);
|
||||||
|
TestFalse(TEXT("The VAD catalog entry must not become the selected primary payload."), VadEntry->bSelectedPrimaryPayload);
|
||||||
|
TestFalse(TEXT("The VAD catalog entry must not force integrity review without a checksum."), VadEntry->bIntegrityReviewRequired);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIAEnvironmentProfileTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIA.EnvironmentProfile",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIAEnvironmentProfileTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveEnvironmentProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive environment profile contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveEnvironmentProfileContract(
|
||||||
|
TEXT("immersive-training-environment-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive environment profile id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-environment-profile")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive environment profile must preserve an alpine ridge family."),
|
||||||
|
Contract.EnvironmentFamilyIds.Contains(TEXT("environment/alpine-ridge"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive environment profile must preserve an observatory family."),
|
||||||
|
Contract.EnvironmentFamilyIds.Contains(TEXT("environment/observatory"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive environment profile must remain a scenic training shell."),
|
||||||
|
Contract.PresenceSurfaceTags.Contains(TEXT("scenic training shell"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive environment profile must keep the generic virtual desktop excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic virtual desktop shell"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIALightingAudioTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIA.LightingAndAudio",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIALightingAudioTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveLightingPresetBoundary LightingBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveLightingPresetBoundary(
|
||||||
|
TEXT("immersive-training-lighting-preset-boundary"),
|
||||||
|
LightingBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting boundary must preserve dawn-focus lighting."),
|
||||||
|
LightingBoundary.LightingPresetIds.Contains(TEXT("preset/dawn-focus"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting boundary must preserve puzzle-face legibility bias."),
|
||||||
|
LightingBoundary.LegibilitySurfaceTags.Contains(TEXT("puzzle-face legibility bias"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting boundary must keep full weather simulation excluded."),
|
||||||
|
LightingBoundary.ExplicitExclusions.Contains(TEXT("full weather simulation ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingImmersiveAmbientAudioBoundary AudioBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ambient audio boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveAmbientAudioBoundary(
|
||||||
|
TEXT("immersive-training-ambient-audio-boundary"),
|
||||||
|
AudioBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ambient audio boundary must preserve the alpine wind bed."),
|
||||||
|
AudioBoundary.AudioFamilyIds.Contains(TEXT("audio/alpine-wind-bed"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ambient audio boundary must preserve replay-safe ducking."),
|
||||||
|
AudioBoundary.ComfortSurfaceTags.Contains(TEXT("replay-safe ducking"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ambient audio boundary must keep voice-assistant playback excluded."),
|
||||||
|
AudioBoundary.ExplicitExclusions.Contains(TEXT("voice-assistant playback ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIAWorldAnchorsTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIA.WorldAnchors",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIAWorldAnchorsTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveWorldAnchorContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive world-anchor contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveWorldAnchorContract(
|
||||||
|
TEXT("immersive-training-world-anchor-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive world-anchor id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-world-anchor-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive world-anchor contract must preserve the puzzle dais anchor."),
|
||||||
|
Contract.AnchorIds.Contains(TEXT("anchor/puzzle-dais"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive world-anchor contract must preserve replay path staging."),
|
||||||
|
Contract.TargetSurfaceTags.Contains(TEXT("replay path staging"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive world-anchor contract must preserve a comfort-safe forward anchor."),
|
||||||
|
Contract.StabilitySurfaceTags.Contains(TEXT("comfort-safe forward anchor"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive world-anchor contract must keep productivity dashboard anchors excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic productivity dashboard anchors"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,145 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIBPresenceControlTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIB.PresenceControl",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIBPresenceControlTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersivePresenceControlContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive presence-control contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersivePresenceControlContract(
|
||||||
|
TEXT("immersive-training-presence-control-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive presence-control id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-presence-control-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive presence-control contract must preserve deep-presence intensity."),
|
||||||
|
Contract.ImmersionIntensityIds.Contains(TEXT("intensity/deep-presence"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive presence-control contract must preserve reduced-distraction review posture."),
|
||||||
|
Contract.ReducedDistractionPresetIds.Contains(TEXT("preset/reduced-distraction-review"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive presence-control contract must preserve session-local presence tuning."),
|
||||||
|
Contract.PresenceSurfaceTags.Contains(TEXT("session-local presence tuning"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive presence-control contract must keep platform-global XR settings excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("platform-global XR settings ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIBComfortPostureTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIB.ComfortAndPosture",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIBComfortPostureTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveComfortBoundary ComfortBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive comfort boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveComfortBoundary(
|
||||||
|
TEXT("immersive-training-comfort-boundary"),
|
||||||
|
ComfortBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive comfort boundary must preserve strong vignette posture."),
|
||||||
|
ComfortBoundary.ComfortOptionIds.Contains(TEXT("comfort/strong-vignette"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive comfort boundary must preserve edge-softening vignette behavior."),
|
||||||
|
ComfortBoundary.VignetteSurfaceTags.Contains(TEXT("edge-softening vignette"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive comfort boundary must keep platform locomotion ownership excluded."),
|
||||||
|
ComfortBoundary.ExplicitExclusions.Contains(TEXT("platform-level locomotion shell ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingImmersivePostureVariantContract PostureContract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive posture-variant contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersivePostureVariantContract(
|
||||||
|
TEXT("immersive-training-posture-variant-contract"),
|
||||||
|
PostureContract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive posture-variant contract must preserve seated stable posture."),
|
||||||
|
PostureContract.PostureVariantIds.Contains(TEXT("posture/seated-stable"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive posture-variant contract must preserve puzzle dais height offset."),
|
||||||
|
PostureContract.AnchorAdjustmentSurfaceTags.Contains(TEXT("puzzle dais height offset"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive posture-variant contract must preserve comfort-safe recentering."),
|
||||||
|
PostureContract.ComfortSurfaceTags.Contains(TEXT("comfort-safe recentering"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive posture-variant contract must keep locomotion rigs excluded."),
|
||||||
|
PostureContract.ExplicitExclusions.Contains(TEXT("full locomotion rig ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIBSessionRecallTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIB.SessionRecall",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIBSessionRecallTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveSessionRecallBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session recall boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveSessionRecallBoundary(
|
||||||
|
TEXT("immersive-training-session-recall-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive session recall id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("immersive-training-session-recall-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session recall boundary must preserve session-local recall."),
|
||||||
|
Boundary.RecallScopeIds.Contains(TEXT("recall/session-local"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session recall boundary must preserve immersion intensity preference recall."),
|
||||||
|
Boundary.PreferenceFieldTags.Contains(TEXT("immersion intensity id"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session recall boundary must preserve manual reset."),
|
||||||
|
Boundary.ResetSurfaceTags.Contains(TEXT("manual reset to default focus posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session recall boundary must keep cloud profile ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("cross-session cloud profile ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,150 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseICCoachCueGhostTargetTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIC.CoachCueAndGhostTarget",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseICCoachCueGhostTargetTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveCoachCueAnchorContract CoachContract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive coach-cue anchor contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveCoachCueAnchorContract(
|
||||||
|
TEXT("immersive-training-coach-cue-anchor-contract"),
|
||||||
|
CoachContract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive coach-cue anchor id must stay stable."),
|
||||||
|
CoachContract.ContractId,
|
||||||
|
TEXT("immersive-training-coach-cue-anchor-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive coach-cue anchor contract must preserve the coach callout arc."),
|
||||||
|
CoachContract.CueAnchorIds.Contains(TEXT("anchor/coach-callout-arc"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive coach-cue anchor contract must preserve guided lesson-step trigger posture."),
|
||||||
|
CoachContract.TriggerSurfaceTags.Contains(TEXT("guided lesson-step trigger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive coach-cue anchor contract must keep generic tooltips excluded."),
|
||||||
|
CoachContract.ExplicitExclusions.Contains(TEXT("generic UI tooltip ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingImmersiveGhostTargetBoundary GhostBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ghost-target boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveGhostTargetBoundary(
|
||||||
|
TEXT("immersive-training-ghost-target-boundary"),
|
||||||
|
GhostBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ghost-target boundary must preserve drill end-state targeting."),
|
||||||
|
GhostBoundary.TargetModeIds.Contains(TEXT("ghost-target/drill-end-state"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ghost-target boundary must preserve semi-transparent target pose visualization."),
|
||||||
|
GhostBoundary.VisualizationSurfaceTags.Contains(TEXT("semi-transparent target pose"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ghost-target boundary must preserve puzzle-local alignment."),
|
||||||
|
GhostBoundary.AlignmentSurfaceTags.Contains(TEXT("puzzle-local alignment"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive ghost-target boundary must keep animation rig ownership excluded."),
|
||||||
|
GhostBoundary.ExplicitExclusions.Contains(TEXT("full animation-rig ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseICReplayEmphasisTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIC.ReplayEmphasis",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseICReplayEmphasisTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveReplayEmphasisBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive replay-emphasis boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveReplayEmphasisBoundary(
|
||||||
|
TEXT("immersive-training-replay-emphasis-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive replay-emphasis boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("immersive-training-replay-emphasis-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive replay-emphasis boundary must preserve path-ribbon mode."),
|
||||||
|
Boundary.EmphasisModeIds.Contains(TEXT("replay-emphasis/path-ribbon"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive replay-emphasis boundary must preserve error-turn highlight."),
|
||||||
|
Boundary.ReplaySurfaceTags.Contains(TEXT("error-turn highlight"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive replay-emphasis boundary must preserve coach-linked replay focus."),
|
||||||
|
Boundary.AttentionSurfaceTags.Contains(TEXT("coach-linked replay focus"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive replay-emphasis boundary must keep cinematic replay ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("full cinematic replay ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseICLessonStateTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIC.LessonState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseICLessonStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveLessonStateContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lesson-state contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveLessonStateContract(
|
||||||
|
TEXT("immersive-training-lesson-state-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive lesson-state id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-lesson-state-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lesson-state contract must preserve drill-focus state."),
|
||||||
|
Contract.LessonStateIds.Contains(TEXT("lesson-state/drill-focus"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lesson-state contract must preserve drill-target spotlighting."),
|
||||||
|
Contract.SpotlightSurfaceTags.Contains(TEXT("drill-target spotlight"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lesson-state contract must preserve lesson-specific environment tone."),
|
||||||
|
Contract.StateSurfaceTags.Contains(TEXT("lesson-specific environment tone"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lesson-state contract must keep mission scripting ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic mission scripting ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,145 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIDSessionStateCueTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseID.SessionStateCues",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIDSessionStateCueTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveSessionStateCueContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session-state cue contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveSessionStateCueContract(
|
||||||
|
TEXT("immersive-training-session-state-cue-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive session-state cue id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-session-state-cue-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session-state cue contract must preserve mastery state."),
|
||||||
|
Contract.SessionStateIds.Contains(TEXT("session-state/mastery"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session-state cue contract must preserve mastery settle glow transition."),
|
||||||
|
Contract.TransitionCueIds.Contains(TEXT("transition-cue/mastery-settle-glow"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session-state cue contract must preserve review-safe environmental fade."),
|
||||||
|
Contract.TransitionSurfaceTags.Contains(TEXT("review-safe environmental fade"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive session-state cue contract must keep spectacle transitions excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("theatrical spectacle transition ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIDLightingAndAudioPacingTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseID.LightingAndAudioPacing",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIDLightingAndAudioPacingTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveLightingReactionBoundary LightingBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting reaction boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveLightingReactionBoundary(
|
||||||
|
TEXT("immersive-training-lighting-reaction-boundary"),
|
||||||
|
LightingBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting reaction boundary must preserve challenge-mode contrast push."),
|
||||||
|
LightingBoundary.LightingSurfaceTags.Contains(TEXT("challenge-mode contrast push"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting reaction boundary must preserve puzzle-face visibility clamp."),
|
||||||
|
LightingBoundary.LegibilityGuardTags.Contains(TEXT("puzzle-face visibility clamp"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive lighting reaction boundary must keep shader FX ownership excluded."),
|
||||||
|
LightingBoundary.ExplicitExclusions.Contains(TEXT("generic shader FX ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingImmersiveAudioPacingBoundary AudioBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive audio pacing boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveAudioPacingBoundary(
|
||||||
|
TEXT("immersive-training-audio-pacing-boundary"),
|
||||||
|
AudioBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive audio pacing boundary must preserve mastery release rise."),
|
||||||
|
AudioBoundary.AudioPacingModeIds.Contains(TEXT("audio-pacing/mastery-release-rise"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive audio pacing boundary must preserve correction-state ducking."),
|
||||||
|
AudioBoundary.AudioSurfaceTags.Contains(TEXT("correction-state ducking"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive audio pacing boundary must preserve challenge-mode tightened pacing."),
|
||||||
|
AudioBoundary.PacingSurfaceTags.Contains(TEXT("challenge-mode tightened pacing"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive audio pacing boundary must keep soundtrack scoring ownership excluded."),
|
||||||
|
AudioBoundary.ExplicitExclusions.Contains(TEXT("full soundtrack scoring ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIDModeDifferentiationTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseID.ModeDifferentiation",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIDModeDifferentiationTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveModeDifferentiationContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive mode-differentiation contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveModeDifferentiationContract(
|
||||||
|
TEXT("immersive-training-mode-differentiation-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive mode-differentiation id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-mode-differentiation-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive mode-differentiation contract must preserve challenge mode."),
|
||||||
|
Contract.ModeIds.Contains(TEXT("mode/challenge"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive mode-differentiation contract must preserve study-mode atmospheric softness."),
|
||||||
|
Contract.DifferentiationSurfaceTags.Contains(TEXT("study-mode atmospheric softness"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive mode-differentiation contract must preserve no-theatrical-overreaction guard."),
|
||||||
|
Contract.GuardSurfaceTags.Contains(TEXT("no-theatrical-overreaction guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive mode-differentiation contract must keep narrative mode ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("broad narrative mode ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIETransitionLegibilityTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIE.TransitionAndLegibility",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIETransitionLegibilityTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveTransitionSafetyBoundary TransitionBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive transition-safety boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveTransitionSafetyBoundary(
|
||||||
|
TEXT("immersive-training-transition-safety-boundary"),
|
||||||
|
TransitionBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive transition-safety boundary must preserve no-snap teleport shift."),
|
||||||
|
TransitionBoundary.ComfortTransitionIds.Contains(TEXT("transition-safety/no-snap-teleport-shift"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive transition-safety boundary must preserve the no-flash-pulse transition guard."),
|
||||||
|
TransitionBoundary.GuardSurfaceTags.Contains(TEXT("no-flash-pulse transition guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive transition-safety boundary must keep broad camera-system ownership excluded."),
|
||||||
|
TransitionBoundary.ExplicitExclusions.Contains(TEXT("broad camera-system ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingImmersiveAccessibilityLegibilityContract AccessibilityContract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive accessibility-legibility contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveAccessibilityLegibilityContract(
|
||||||
|
TEXT("immersive-training-accessibility-legibility-contract"),
|
||||||
|
AccessibilityContract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive accessibility-legibility contract id must stay stable."),
|
||||||
|
AccessibilityContract.ContractId,
|
||||||
|
TEXT("immersive-training-accessibility-legibility-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive accessibility-legibility contract must preserve high-contrast puzzle focus."),
|
||||||
|
AccessibilityContract.AccessibilityModeIds.Contains(TEXT("accessibility/high-contrast-puzzle-focus"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive accessibility-legibility contract must preserve reduced bloom scenic path."),
|
||||||
|
AccessibilityContract.ReducedEffectsSurfaceTags.Contains(TEXT("reduced-bloom scenic path"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive accessibility-legibility contract must keep platform-global accessibility profile ownership excluded."),
|
||||||
|
AccessibilityContract.ExplicitExclusions.Contains(TEXT("platform-global accessibility profile ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIEPerformanceBudgetTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIE.PerformanceBudget",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIEPerformanceBudgetTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersivePerformanceBudgetBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive performance-budget boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersivePerformanceBudgetBoundary(
|
||||||
|
TEXT("immersive-training-performance-budget-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive performance-budget boundary must preserve the reduced-effects-safe budget profile."),
|
||||||
|
Boundary.BudgetProfileIds.Contains(TEXT("performance-budget/reduced-effects-safe"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive performance-budget boundary must preserve coach-and-puzzle first render budget."),
|
||||||
|
Boundary.PerformanceSurfaceTags.Contains(TEXT("coach-and-puzzle first render budget"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive performance-budget boundary must preserve the frame-time regression trigger."),
|
||||||
|
Boundary.FallbackTriggerTags.Contains(TEXT("frame-time regression trigger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive performance-budget boundary must keep renderer feature-matrix ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("renderer feature-matrix ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistImmersivePhaseIEFallbackModeTest,
|
||||||
|
"HyperTwist.FirstParty.Immersive.PhaseIE.FallbackModes",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistImmersivePhaseIEFallbackModeTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingImmersiveFallbackModeContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive fallback-mode contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveFallbackModeContract(
|
||||||
|
TEXT("immersive-training-fallback-mode-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The immersive fallback-mode contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("immersive-training-fallback-mode-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive fallback-mode contract must preserve reduced-effects scenic fallback."),
|
||||||
|
Contract.FallbackModeIds.Contains(TEXT("fallback-mode/reduced-effects-scenic"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive fallback-mode contract must preserve reduced-effects fallback path."),
|
||||||
|
Contract.ReducedEffectsPathTags.Contains(TEXT("reduced-effects fallback path"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive fallback-mode contract must preserve puzzle-and-coach continuity guarantee."),
|
||||||
|
Contract.CompatibilitySurfaceTags.Contains(TEXT("puzzle-and-coach continuity guarantee"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The immersive fallback-mode contract must keep generic graphics settings menu ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic graphics settings menu ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAVReferenceBundleTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AV.ReferenceBundle",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAVReferenceBundleTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
const FHyperTwistTrainingLearnedSearchReferenceBundle Bundle =
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::GetBundledLearnedSearchReferenceBundle();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The learned-search bundle must remain structurally valid after Phase 6R-AV."), Bundle.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The primary learned-search experiment profile id must stay stable."),
|
||||||
|
Bundle.PrimaryExperimentProfileContractId,
|
||||||
|
TEXT("learned-search-experiment-profile")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search bundle must keep the ADI benchmark package reference."),
|
||||||
|
Bundle.PackageReferences.ContainsByPredicate(
|
||||||
|
[](const FHyperTwistTrainingLearnedSearchPackageReference& Reference)
|
||||||
|
{
|
||||||
|
return Reference.PackageId == TEXT("package/yakupbilen-adi-train-utils")
|
||||||
|
&& Reference.SourceAttribution.SourceRepo == TEXT("yakupbilen/drl-rubiks-cube");
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAVExperimentProfileTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AV.ExperimentProfile",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAVExperimentProfileTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchExperimentProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search experiment profile must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchExperimentProfileContract(
|
||||||
|
TEXT("learned-search-experiment-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search experiment profile id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("learned-search-experiment-profile")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search experiment profile must remain first-party."),
|
||||||
|
Contract.SourceAttribution.SourceMode,
|
||||||
|
EHyperTwistTrainingSourceMode::FirstParty
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search experiment profile must require the compact state package."),
|
||||||
|
Contract.RequiredPackageIds.Contains(TEXT("package/yakupbilen-cube-state"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search experiment profile must require the ADI generation package."),
|
||||||
|
Contract.RequiredPackageIds.Contains(TEXT("package/yakupbilen-adi-train-utils"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search experiment profile must preserve batched neural A* frontier scoring."),
|
||||||
|
Contract.SearchSurfaceTags.Contains(TEXT("batched neural A* frontier scoring"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search experiment profile must keep correctness/performance oracle ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("correctness/performance oracle ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAVBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AV.Boundaries",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAVBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBenchmarkBoundary SearchBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search benchmark boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchSearchBenchmarkBoundary(
|
||||||
|
TEXT("learned-search-search-benchmark-boundary"),
|
||||||
|
SearchBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark boundary must require the neural search package."),
|
||||||
|
SearchBoundary.RequiredPackageIds.Contains(TEXT("package/yakupbilen-search"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark boundary must preserve small value-network inference."),
|
||||||
|
SearchBoundary.ModelSurfaceTags.Contains(TEXT("small value-network inference"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark boundary must keep live recognition/reconstruction ownership caveats visible."),
|
||||||
|
SearchBoundary.ProvenanceCaveats.Contains(TEXT("qbr and rubix-cube-solver remain live recognition/reconstruction owners"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingLearnedSearchAttributionBoundary AttributionBoundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search attribution boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchAttributionBoundary(
|
||||||
|
TEXT("learned-search-attribution-boundary"),
|
||||||
|
AttributionBoundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The attribution boundary must preserve first-party reauthored experimentation use."),
|
||||||
|
AttributionBoundary.AllowedUseTags.Contains(TEXT("first-party reauthored experimentation lane"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The attribution boundary must keep silent donor promotion excluded."),
|
||||||
|
AttributionBoundary.ExplicitExclusions.Contains(TEXT("silent donor promotion"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAWSequencePolicyTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AW.SequencePolicy",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAWSequencePolicyTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchSequencePolicyContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search sequence policy contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchSequencePolicyContract(
|
||||||
|
TEXT("learned-search-sequence-policy-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search sequence policy id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("learned-search-sequence-policy-contract")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search sequence policy must remain first-party."),
|
||||||
|
Contract.SourceAttribution.SourceMode,
|
||||||
|
EHyperTwistTrainingSourceMode::FirstParty
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sequence policy must preserve inverse-pair suppression."),
|
||||||
|
Contract.SequenceSurfaceTags.Contains(TEXT("inverse-pair suppression"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sequence policy must preserve triple-repeat suppression."),
|
||||||
|
Contract.SequenceSurfaceTags.Contains(TEXT("triple-repeat suppression"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sequence policy must preserve optional solved-state inclusion."),
|
||||||
|
Contract.SamplingSurfaceTags.Contains(TEXT("optional solved-state inclusion"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sequence policy must preserve learn-first-close weighting."),
|
||||||
|
Contract.WeightingSurfaceTags.Contains(TEXT("learn-first-close weighting"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sequence policy must keep live replay notation ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("live replay notation ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAWSearchBudgetTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AW.SearchBudget",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAWSearchBudgetTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchSearchBudgetBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search search-budget boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchSearchBudgetBoundary(
|
||||||
|
TEXT("learned-search-search-budget-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The search-budget boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-search-budget-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The search-budget boundary must preserve weighted frontier ranking."),
|
||||||
|
Boundary.BudgetSurfaceTags.Contains(TEXT("weighted frontier ranking"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The search-budget boundary must preserve iteration-cap search mode."),
|
||||||
|
Boundary.BudgetSurfaceTags.Contains(TEXT("iteration-cap search mode"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The search-budget boundary must preserve benchmark checkpoint clone posture."),
|
||||||
|
Boundary.FrontierSurfaceTags.Contains(TEXT("benchmark checkpoint clone posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The search-budget boundary must keep correctness/performance oracle ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("correctness/performance oracle ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The search-budget boundary must preserve the benchmark-only live solve UX caveat."),
|
||||||
|
Boundary.ProvenanceCaveats.Contains(TEXT("frontier budgets remain benchmark-only and non-authoritative for live solve UX"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAXNodeIdentityTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AX.NodeIdentity",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAXNodeIdentityTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchNodeIdentityContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search node identity contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchNodeIdentityContract(
|
||||||
|
TEXT("learned-search-node-identity-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search node identity id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("learned-search-node-identity-contract")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search node identity contract must remain first-party."),
|
||||||
|
Contract.SourceAttribution.SourceMode,
|
||||||
|
EHyperTwistTrainingSourceMode::FirstParty
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The node identity contract must preserve flattened-byte node hashing."),
|
||||||
|
Contract.IdentitySurfaceTags.Contains(TEXT("flattened-byte node hash"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The node identity contract must preserve shallower-depth replacement policy."),
|
||||||
|
Contract.IdentitySurfaceTags.Contains(TEXT("shallower-depth replacement policy"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The node identity contract must preserve parent-linked lineage."),
|
||||||
|
Contract.LineageSurfaceTags.Contains(TEXT("parent-linked lineage"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The node identity contract must keep canonical replay ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("canonical replay ledger ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAXStateExpansionTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AX.StateExpansion",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAXStateExpansionTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchStateExpansionBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search state-expansion boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchStateExpansionBoundary(
|
||||||
|
TEXT("learned-search-state-expansion-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The state-expansion boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-state-expansion-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The state-expansion boundary must preserve 12-way successor expansion."),
|
||||||
|
Boundary.ExpansionSurfaceTags.Contains(TEXT("12-way successor expansion"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The state-expansion boundary must preserve vectorized reward scan."),
|
||||||
|
Boundary.ExpansionSurfaceTags.Contains(TEXT("vectorized reward scan"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The state-expansion boundary must preserve solved-state goal tagging."),
|
||||||
|
Boundary.GoalSurfaceTags.Contains(TEXT("solved-state goal tagging"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The state-expansion boundary must keep committed-face reconstruction ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("committed-face reconstruction ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The state-expansion boundary must preserve the benchmark-only reconstruction caveat."),
|
||||||
|
Boundary.ProvenanceCaveats.Contains(TEXT("state expansion remains benchmark-only and non-authoritative for live reconstruction"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAYFrontierScoringTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AY.FrontierScoring",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAYFrontierScoringTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchFrontierScoringBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search frontier scoring boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchFrontierScoringBoundary(
|
||||||
|
TEXT("learned-search-frontier-scoring-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search frontier scoring boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-frontier-scoring-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The frontier scoring boundary must preserve weighted f-score depth penalty."),
|
||||||
|
Boundary.FrontierSurfaceTags.Contains(TEXT("weighted f-score depth penalty"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The frontier scoring boundary must preserve the batched frontier pop window."),
|
||||||
|
Boundary.FrontierSurfaceTags.Contains(TEXT("batched frontier pop window"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The frontier scoring boundary must preserve one-hot categorical heuristic input."),
|
||||||
|
Boundary.EvaluationSurfaceTags.Contains(TEXT("one-hot categorical heuristic input"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The frontier scoring boundary must preserve torch no-grad evaluation posture."),
|
||||||
|
Boundary.EvaluationSurfaceTags.Contains(TEXT("torch no-grad evaluation posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The frontier scoring boundary must keep deployed model serving excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("deployed model serving ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAYSolutionUnwindTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AY.SolutionUnwind",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAYSolutionUnwindTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchSolutionUnwindBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search solution unwind boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchSolutionUnwindBoundary(
|
||||||
|
TEXT("learned-search-solution-unwind-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search solution unwind boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-solution-unwind-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must preserve goal-index to parent-chain unwind."),
|
||||||
|
Boundary.RecoverySurfaceTags.Contains(TEXT("goal-index to parent-chain unwind"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must preserve clear-seq normalization posture."),
|
||||||
|
Boundary.RecoverySurfaceTags.Contains(TEXT("clear-seq normalization posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must preserve time-bounded search mode."),
|
||||||
|
Boundary.TerminationSurfaceTags.Contains(TEXT("time-bounded search mode"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must preserve iteration and generated-node reporting."),
|
||||||
|
Boundary.TerminationSurfaceTags.Contains(TEXT("iteration and generated-node reporting"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must keep canonical replay ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("canonical replay ledger ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solution unwind boundary must preserve the benchmark-only replay caveat."),
|
||||||
|
Boundary.ProvenanceCaveats.Contains(TEXT("solution unwind remains benchmark-only and non-authoritative for canonical replay"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAZValueNetworkShapeTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AZ.ValueNetworkShape",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAZValueNetworkShapeTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchValueNetworkShapeBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search value-network shape boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchValueNetworkShapeBoundary(
|
||||||
|
TEXT("learned-search-value-network-shape-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search value-network shape id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-value-network-shape-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The value-network shape boundary must preserve the flattened input reshape."),
|
||||||
|
Boundary.ArchitectureSurfaceTags.Contains(TEXT("flattened input reshape"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The value-network shape boundary must preserve the 4096-2048-512 linear stack."),
|
||||||
|
Boundary.ArchitectureSurfaceTags.Contains(TEXT("4096-2048-512 linear stack"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The value-network shape boundary must preserve xavier-normal weight init."),
|
||||||
|
Boundary.InitializationSurfaceTags.Contains(TEXT("xavier-normal weight init"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The value-network shape boundary must preserve zero-bias init posture."),
|
||||||
|
Boundary.InitializationSurfaceTags.Contains(TEXT("zero-bias init posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The value-network shape boundary must keep deployed model serving excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("deployed model serving ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistLearnedSearchPhase6RAZGeneratorSyncTest,
|
||||||
|
"HyperTwist.FirstParty.LearnedSearch.Phase6R.AZ.GeneratorSync",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistLearnedSearchPhase6RAZGeneratorSyncTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingLearnedSearchGeneratorSyncBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The learned-search generator sync boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledLearnedSearchGeneratorSyncBoundary(
|
||||||
|
TEXT("learned-search-generator-sync-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The learned-search generator sync id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("learned-search-generator-sync-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must preserve tau-weighted generator refresh."),
|
||||||
|
Boundary.SyncSurfaceTags.Contains(TEXT("tau-weighted generator refresh"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must preserve state-dict merge posture."),
|
||||||
|
Boundary.SyncSurfaceTags.Contains(TEXT("state-dict merge posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must preserve device-aware parameter copy."),
|
||||||
|
Boundary.ParameterSurfaceTags.Contains(TEXT("device-aware parameter copy"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must preserve generator return-on-device posture."),
|
||||||
|
Boundary.ParameterSurfaceTags.Contains(TEXT("generator return-on-device posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must keep provider-backed model lifecycle ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("provider-backed model lifecycle ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The generator sync boundary must preserve the benchmark-only training-service caveat."),
|
||||||
|
Boundary.ProvenanceCaveats.Contains(TEXT("generator sync remains benchmark-only and non-authoritative for deployed training services"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagic120CellPhase6RALReferenceBundleTest,
|
||||||
|
"HyperTwist.Permissive.Magic120Cell.Phase6R.AL.ReferenceBundle",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagic120CellPhase6RALReferenceBundleTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
const FHyperTwistTrainingMagic120CellReferenceBundle Bundle =
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::GetBundledMagic120CellReferenceBundle();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The Magic120Cell bundle must remain structurally valid after Phase 6R-AL."), Bundle.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The primary Magic120Cell view profile id must stay stable."),
|
||||||
|
Bundle.PrimaryViewProfileContractId,
|
||||||
|
TEXT("magic120cell-focus-view-profile")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The Magic120Cell bundle must expose one or more view profile contracts."),
|
||||||
|
Bundle.ViewProfileContracts.Num() >= 1
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagic120CellPhase6RALViewProfileContractTest,
|
||||||
|
"HyperTwist.Permissive.Magic120Cell.Phase6R.AL.ViewProfileContract",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagic120CellPhase6RALViewProfileContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingMagic120CellViewProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The Magic120Cell focus view profile must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledMagic120CellViewProfileContract(
|
||||||
|
TEXT("magic120cell-focus-view-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(TEXT("The view profile id must stay stable."), Contract.ContractId, TEXT("magic120cell-focus-view-profile"));
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep the Magic120Cell settings package as a required input."),
|
||||||
|
Contract.RequiredPackageIds.Contains(TEXT("package/magic120cell-settings"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve 4D projection distance semantics."),
|
||||||
|
Contract.ProjectionSurfaceTags.Contains(TEXT("4D projection distance"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve the layer-display default symmetry preset."),
|
||||||
|
Contract.SymmetryPresetTags.Contains(TEXT("layer-display default symmetry"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve logical visibility depth ladder semantics."),
|
||||||
|
Contract.VisibilityPresetTags.Contains(TEXT("logical visibility depth ladder"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve center-cell recentering focus posture."),
|
||||||
|
Contract.FocusSurfaceTags.Contains(TEXT("center-cell recentering"))
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The view profile must keep the direct donor source repo."),
|
||||||
|
Contract.SourceAttribution.SourceRepo,
|
||||||
|
TEXT("roice3/Magic120Cell")
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagic120CellPhase6RALViewProfileExclusionTest,
|
||||||
|
"HyperTwist.Permissive.Magic120Cell.Phase6R.AL.ViewProfileExclusions",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagic120CellPhase6RALViewProfileExclusionTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingMagic120CellViewProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The Magic120Cell focus view profile must still resolve for exclusion checks."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledMagic120CellViewProfileContract(
|
||||||
|
TEXT("magic120cell-focus-view-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep host-shell ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("WinForms/OpenGL host-shell ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep broad renderer ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("broad renderer ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep broad interaction-shell widening excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("broad interaction-shell widening"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagicCube5DPhase6RAMReferenceBundleTest,
|
||||||
|
"HyperTwist.Permissive.MagicCube5D.Phase6R.AM.ReferenceBundle",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagicCube5DPhase6RAMReferenceBundleTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
const FHyperTwistTrainingMagicCube5DReferenceBundle Bundle =
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::GetBundledMagicCube5DReferenceBundle();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The MagicCube5D bundle must remain structurally valid after Phase 6R-AM."), Bundle.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The primary MagicCube5D view profile id must stay stable."),
|
||||||
|
Bundle.PrimaryViewProfileContractId,
|
||||||
|
TEXT("magiccube5d-projection-view-profile")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The MagicCube5D bundle must expose one or more view profile contracts."),
|
||||||
|
Bundle.ViewProfileContracts.Num() >= 1
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagicCube5DPhase6RAMViewProfileContractTest,
|
||||||
|
"HyperTwist.Permissive.MagicCube5D.Phase6R.AM.ViewProfileContract",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagicCube5DPhase6RAMViewProfileContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingMagicCube5DViewProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The MagicCube5D projection view profile must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledMagicCube5DViewProfileContract(
|
||||||
|
TEXT("magiccube5d-projection-view-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(TEXT("The view profile id must stay stable."), Contract.ContractId, TEXT("magiccube5d-projection-view-profile"));
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep the MagicCube5D settings package as a required input."),
|
||||||
|
Contract.RequiredPackageIds.Contains(TEXT("package/magiccube5d-settings"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve 5D projection distance semantics."),
|
||||||
|
Contract.ProjectionSurfaceTags.Contains(TEXT("5D projection distance"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve cross-eyed stereo posture."),
|
||||||
|
Contract.StereoSurfaceTags.Contains(TEXT("cross-eyed stereo posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve per-face invisibility semantics."),
|
||||||
|
Contract.VisibilitySurfaceTags.Contains(TEXT("per-face invisibility vector"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must preserve fifth-axis view rotation focus posture."),
|
||||||
|
Contract.FocusSurfaceTags.Contains(TEXT("control-click fifth-axis view rotation"))
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The view profile must keep the direct donor source repo."),
|
||||||
|
Contract.SourceAttribution.SourceRepo,
|
||||||
|
TEXT("roice3/MagicCube5D")
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistMagicCube5DPhase6RAMViewProfileExclusionTest,
|
||||||
|
"HyperTwist.Permissive.MagicCube5D.Phase6R.AM.ViewProfileExclusions",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistMagicCube5DPhase6RAMViewProfileExclusionTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingMagicCube5DViewProfileContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The MagicCube5D projection view profile must still resolve for exclusion checks."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledMagicCube5DViewProfileContract(
|
||||||
|
TEXT("magiccube5d-projection-view-profile"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep host-shell ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("WinForms/OpenGL host-shell ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep stereo/anaglyph renderer ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("stereo/anaglyph renderer ownership"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The view profile must keep broad macro/tutorial shell widening excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("broad macro/tutorial shell widening"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistRecognition/HyperTwistVoiceClient.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistPiperPhase6RAQTestInternal
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* MakeMockVoiceClient()
|
||||||
|
{
|
||||||
|
return NewObject<UHyperTwistMockVoiceClient>(GetTransientPackage());
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistHttpVoiceClient* MakeHttpVoiceClient()
|
||||||
|
{
|
||||||
|
return NewObject<UHyperTwistHttpVoiceClient>(GetTransientPackage());
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceProfileSummary* FindProfileById(
|
||||||
|
const TArray<FHyperTwistVoiceProfileSummary>& Profiles,
|
||||||
|
const FString& VoiceProfileId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return Profiles.FindByPredicate(
|
||||||
|
[&VoiceProfileId](const FHyperTwistVoiceProfileSummary& Profile)
|
||||||
|
{
|
||||||
|
return Profile.VoiceProfileId == VoiceProfileId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceAssetDescriptor* FindVoiceAssetById(
|
||||||
|
const TArray<FHyperTwistVoiceAssetDescriptor>& VoiceAssets,
|
||||||
|
const FString& VoiceAssetId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return VoiceAssets.FindByPredicate(
|
||||||
|
[&VoiceAssetId](const FHyperTwistVoiceAssetDescriptor& VoiceAsset)
|
||||||
|
{
|
||||||
|
return VoiceAsset.VoiceAssetId == VoiceAssetId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistPiperPhase6RAQVoiceAssetCatalogAlignmentTest,
|
||||||
|
"HyperTwist.Permissive.Piper.Phase6R.AQ.VoiceAssetCatalogAlignment",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistPiperPhase6RAQVoiceAssetCatalogAlignmentTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* VoiceClient = HyperTwistPiperPhase6RAQTestInternal::MakeMockVoiceClient();
|
||||||
|
TestNotNull(TEXT("The mock voice client must be constructed for Phase 6R-AQ."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TArray<FHyperTwistVoiceProfileSummary> Profiles = VoiceClient->ListVoiceProfiles();
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The local voice catalog must remain non-empty."), Profiles.Num() >= 3);
|
||||||
|
TestTrue(TEXT("The voice review health must remain structurally valid."), Health.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The bounded review lane must expose three local voice assets."), Health.SupportedVoiceAssetIds.Num(), 3);
|
||||||
|
TestEqual(TEXT("The bounded review lane must expose three local voice descriptors."), Health.SupportedVoiceAssets.Num(), 3);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The bounded piper review lane must not implicitly widen into the coqui premium profile."),
|
||||||
|
Health.SupportedVoiceAssetIds.Contains(TEXT("voice-asset/coqui/multilingual-guide-premium"))
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const FHyperTwistVoiceAssetDescriptor& VoiceAsset : Health.SupportedVoiceAssets)
|
||||||
|
{
|
||||||
|
const FHyperTwistVoiceProfileSummary* Profile =
|
||||||
|
HyperTwistPiperPhase6RAQTestInternal::FindProfileById(Profiles, VoiceAsset.VoiceProfileId);
|
||||||
|
TestNotNull(TEXT("Every reviewable local voice asset must map back to a voice profile."), Profile);
|
||||||
|
if (Profile != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The reviewable local voice asset must preserve the model-card review path."),
|
||||||
|
VoiceAsset.ReviewDocumentPath,
|
||||||
|
Profile->ModelCardRelativePath
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceAssetDescriptor* LessacAsset =
|
||||||
|
HyperTwistPiperPhase6RAQTestInternal::FindVoiceAssetById(
|
||||||
|
Health.SupportedVoiceAssets,
|
||||||
|
TEXT("voice-asset/piper/en_US-lessac-medium")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The bounded review lane must preserve the Lessac voice asset descriptor."), LessacAsset);
|
||||||
|
if (LessacAsset != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The Lessac descriptor must preserve the ONNX artifact name."),
|
||||||
|
LessacAsset->ArtifactName,
|
||||||
|
TEXT("en_US-lessac-medium.onnx")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The Lessac descriptor must preserve the donor-grounded relative path hint."),
|
||||||
|
LessacAsset->RelativePathHint,
|
||||||
|
TEXT("en/en_US/lessac/medium/en_US-lessac-medium.onnx")
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("The Lessac descriptor must remain user-supplied in this packet."), LessacAsset->bUserSuppliedOnly);
|
||||||
|
TestFalse(TEXT("The Lessac descriptor must not be bundled by this packet."), LessacAsset->bBundledWithCodeDistribution);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistPiperPhase6RAQVoiceAssetReviewHealthTest,
|
||||||
|
"HyperTwist.Permissive.Piper.Phase6R.AQ.VoiceAssetReviewHealth",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistPiperPhase6RAQVoiceAssetReviewHealthTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistMockVoiceClient* VoiceClient = HyperTwistPiperPhase6RAQTestInternal::MakeMockVoiceClient();
|
||||||
|
TestNotNull(TEXT("The mock voice client must be constructed for Phase 6R-AQ."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
TestTrue(TEXT("The voice review health must remain structurally valid."), Health.IsStructurallyValid());
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The voice review lane must preserve the review profile id."),
|
||||||
|
Health.VoiceAssetReviewProfileId,
|
||||||
|
TEXT("downloadable-voice-asset-review-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The voice review profile must remain structurally valid."),
|
||||||
|
Health.VoiceAssetReviewProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The voice service must advertise downloadable voice-asset review capability."),
|
||||||
|
Health.Capabilities.Contains(TEXT("downloadableVoiceAssetReview"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The voice service must advertise model-card review capability."),
|
||||||
|
Health.Capabilities.Contains(TEXT("voiceModelCardReview"))
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The review profile must keep runtime voice download deferred."),
|
||||||
|
Health.VoiceAssetReviewProfileDefinition.bAllowsRuntimeVoiceDownloadInCurrentPacket
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The review profile must keep bundled redistribution disabled."),
|
||||||
|
Health.VoiceAssetReviewProfileDefinition.bAllowsBundledVoiceAssetRedistribution
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review profile must preserve user-managed voice support."),
|
||||||
|
Health.VoiceAssetReviewProfileDefinition.bSupportsUserManagedVoiceAssets
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review profile must preserve sidecar-managed voice support."),
|
||||||
|
Health.VoiceAssetReviewProfileDefinition.bSupportsSidecarManagedVoiceAssets
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistPiperPhase6RAQProviderBackedVoiceAssetReviewFallbackTest,
|
||||||
|
"HyperTwist.Permissive.Piper.Phase6R.AQ.ProviderBackedVoiceAssetReviewFallback",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistPiperPhase6RAQProviderBackedVoiceAssetReviewFallbackTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistHttpVoiceClient* VoiceClient = HyperTwistPiperPhase6RAQTestInternal::MakeHttpVoiceClient();
|
||||||
|
TestNotNull(TEXT("The provider-backed voice client must be constructed for Phase 6R-AQ."), VoiceClient);
|
||||||
|
if (VoiceClient == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
VoiceClient->ServiceBaseUrl.Reset();
|
||||||
|
const FHyperTwistVoiceServiceHealth Health = VoiceClient->GetVoiceServiceHealth();
|
||||||
|
|
||||||
|
TestTrue(TEXT("The provider-backed review fallback must remain structurally valid."), Health.IsStructurallyValid());
|
||||||
|
TestFalse(TEXT("The provider-backed review fallback must report not ready."), Health.bReady);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve the missing-endpoint error."),
|
||||||
|
Health.LastError,
|
||||||
|
TEXT("service-base-url-missing")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The provider-backed review fallback must preserve downloadable voice-asset review capability."),
|
||||||
|
Health.Capabilities.Contains(TEXT("downloadableVoiceAssetReview"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The provider-backed review fallback must preserve provider-backed voice capability."),
|
||||||
|
Health.Capabilities.Contains(TEXT("provider-backed-voice"))
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve three local voice asset ids."),
|
||||||
|
Health.SupportedVoiceAssetIds.Num(),
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The provider-backed review fallback must preserve three local voice asset descriptors."),
|
||||||
|
Health.SupportedVoiceAssets.Num(),
|
||||||
|
3
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,265 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistQbrPhase6RAKTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeRecognitionDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-ak/qbr-locale-guidance-routing");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AK Qbr Locale Guidance Routing");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-ak-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Recognition;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AK Recognition");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockRecognitionClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* RecognitionClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("RecognitionClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
RecognitionClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeRecognitionSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem = NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockRecognitionClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeRecognitionDeck(),
|
||||||
|
TEXT("phase6r-ak-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitPreviewFrame(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistVisionFrameEnvelope Frame;
|
||||||
|
Frame.FrameOrdinal = FrameOrdinal;
|
||||||
|
Frame.TargetFaceHint = FaceId;
|
||||||
|
TrainingSubsystem->SubmitActiveRecognitionFrame(Frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitResult CommitFace(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
SubmitPreviewFrame(TrainingSubsystem, FaceId, FrameOrdinal);
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitRequest Request;
|
||||||
|
Request.TargetFace = FaceId;
|
||||||
|
return TrainingSubsystem->CommitActiveRecognitionObservation(Request);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasLocaleCode(const TArray<FString>& LocaleCodes, const FString& ExpectedLocaleCode)
|
||||||
|
{
|
||||||
|
return LocaleCodes.Contains(ExpectedLocaleCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* FindLocaleOption(
|
||||||
|
const TArray<FHyperTwistVisionLocaleOption>& LocaleOptions,
|
||||||
|
const FString& ExpectedLocaleCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return LocaleOptions.FindByPredicate(
|
||||||
|
[&ExpectedLocaleCode](const FHyperTwistVisionLocaleOption& Candidate)
|
||||||
|
{
|
||||||
|
return Candidate.LocaleCode == ExpectedLocaleCode;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RAKSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AK.LocaleGuidanceSessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RAKSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RAKTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-ak-config-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AK."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(TEXT("The recognition session must open for the locale-guidance route."), TrainingSubsystem->OpenActiveRecognitionSession(OpenError));
|
||||||
|
TestTrue(TEXT("Opening the recognition session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingRecognitionSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveRecognitionSessionState();
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The qbr webcam shell must expose the ten source-backed locale entries."),
|
||||||
|
SessionState.SessionConfig.ShellProfileDefinition.SupportedLocales.Num(),
|
||||||
|
10
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The webcam shell must default to English."),
|
||||||
|
SessionState.SessionConfig.ShellProfileDefinition.DefaultLocaleCode,
|
||||||
|
TEXT("en")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve-explanation profile must expose the same ten source-backed locale entries."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales.Num(),
|
||||||
|
10
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve-explanation locale overlay must keep the bounded routing mode id."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.LocaleGuidanceMode,
|
||||||
|
TEXT("qbr-locale-guidance-routing-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve-explanation profile must preserve the qbr starting-orientation reminder."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.StartingOrientationHint,
|
||||||
|
TEXT("front: green | top: white")
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* EnglishLocale =
|
||||||
|
HyperTwistQbrPhase6RAKTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("en")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The English locale option must be present."), EnglishLocale);
|
||||||
|
if (EnglishLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(TEXT("The English locale label must remain source-backed."), EnglishLocale->DisplayLabel, TEXT("English"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RAKPartialStateTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AK.LocaleGuidancePartialState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RAKPartialStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RAKTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-ak-partial-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AK."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionCommitResult Result =
|
||||||
|
HyperTwistQbrPhase6RAKTestInternal::CommitFace(TrainingSubsystem, TEXT("F"), 1);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The qbr webcam shell state must stay structurally valid."), Result.ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The shell locale must default to English."), Result.ShellState.LocaleCode, TEXT("en"));
|
||||||
|
TestEqual(TEXT("The shell locale label must remain English by default."), Result.ShellState.LocaleDisplayLabel, TEXT("English"));
|
||||||
|
TestEqual(TEXT("The shell must surface ten supported locale codes."), Result.ShellState.AvailableLocaleCodes.Num(), 10);
|
||||||
|
TestTrue(TEXT("The shell must expose Spanish as a source-backed locale option."), HyperTwistQbrPhase6RAKTestInternal::HasLocaleCode(Result.ShellState.AvailableLocaleCodes, TEXT("es")));
|
||||||
|
TestTrue(TEXT("The shell must expose Farsi as a source-backed locale option."), HyperTwistQbrPhase6RAKTestInternal::HasLocaleCode(Result.ShellState.AvailableLocaleCodes, TEXT("fa")));
|
||||||
|
|
||||||
|
TestTrue(TEXT("The partial solve route must carry a structurally valid solve explanation state."), Result.SolveExplanationState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The solve-guidance locale must default to English."), Result.SolveExplanationState.ActiveLocaleCode, TEXT("en"));
|
||||||
|
TestEqual(TEXT("The solve-guidance locale label must remain English by default."), Result.SolveExplanationState.ActiveLocaleDisplayLabel, TEXT("English"));
|
||||||
|
TestEqual(TEXT("The bounded locale-guidance mode id must be present."), Result.SolveExplanationState.LocaleGuidanceMode, TEXT("qbr-locale-guidance-routing-v1"));
|
||||||
|
TestEqual(TEXT("The qbr starting-orientation reminder must stay visible in the state."), Result.SolveExplanationState.StartingOrientationHint, TEXT("front: green | top: white"));
|
||||||
|
TestTrue(TEXT("Locale cycling must stay visible in the bounded guidance overlay."), Result.SolveExplanationState.bLocaleCycleVisible);
|
||||||
|
TestTrue(TEXT("The starting-orientation reminder must stay visible."), Result.SolveExplanationState.bStartingOrientationHintVisible);
|
||||||
|
TestEqual(TEXT("The partial locale-guidance route must still direct the user back to capture."), Result.SolveExplanationState.RecommendedStageId, TEXT("capture-remaining-faces"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RAKCompleteStateTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AK.LocaleGuidanceCompleteState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RAKCompleteStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RAKTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-ak-complete-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AK."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TArray<FString> FaceOrder = {
|
||||||
|
TEXT("U"),
|
||||||
|
TEXT("R"),
|
||||||
|
TEXT("F"),
|
||||||
|
TEXT("D"),
|
||||||
|
TEXT("L"),
|
||||||
|
TEXT("B")
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitResult Result;
|
||||||
|
for (int32 FaceOrdinal = 0; FaceOrdinal < FaceOrder.Num(); ++FaceOrdinal)
|
||||||
|
{
|
||||||
|
Result = HyperTwistQbrPhase6RAKTestInternal::CommitFace(
|
||||||
|
TrainingSubsystem,
|
||||||
|
FaceOrder[FaceOrdinal],
|
||||||
|
FaceOrdinal + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestTrue(TEXT("The completed locale-guidance route must carry a structurally valid solve explanation state."), Result.SolveExplanationState.IsStructurallyValid());
|
||||||
|
TestTrue(TEXT("Solve guidance must unlock after the full reconstruction completes."), Result.SolveExplanationState.bReadyForExplanation);
|
||||||
|
TestEqual(TEXT("The completed locale-guidance route must recommend the orientation stage first."), Result.SolveExplanationState.RecommendedStageId, TEXT("orient-centers"));
|
||||||
|
TestEqual(TEXT("The completed locale-guidance route must preserve the active locale code."), Result.SolveExplanationState.ActiveLocaleCode, TEXT("en"));
|
||||||
|
TestEqual(TEXT("The completed locale-guidance route must preserve the active locale label."), Result.SolveExplanationState.ActiveLocaleDisplayLabel, TEXT("English"));
|
||||||
|
TestEqual(TEXT("The completed locale-guidance route must preserve the qbr starting-orientation reminder."), Result.SolveExplanationState.StartingOrientationHint, TEXT("front: green | top: white"));
|
||||||
|
TestTrue(TEXT("Locale cycling must remain visible after reconstruction completes."), Result.SolveExplanationState.bLocaleCycleVisible);
|
||||||
|
TestTrue(TEXT("The starting-orientation reminder must remain visible after reconstruction completes."), Result.SolveExplanationState.bStartingOrientationHintVisible);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,221 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistQbrPhase6RANTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeRecognitionDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-an/qbr-locale-presentation");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AN Qbr Locale Presentation");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-an-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Recognition;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AN Recognition");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockRecognitionClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* RecognitionClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("RecognitionClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
RecognitionClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeRecognitionSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem = NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockRecognitionClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeRecognitionDeck(),
|
||||||
|
TEXT("phase6r-an-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitPreviewFrame(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistVisionFrameEnvelope Frame;
|
||||||
|
Frame.FrameOrdinal = FrameOrdinal;
|
||||||
|
Frame.TargetFaceHint = FaceId;
|
||||||
|
TrainingSubsystem->SubmitActiveRecognitionFrame(Frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitResult CommitFace(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
SubmitPreviewFrame(TrainingSubsystem, FaceId, FrameOrdinal);
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitRequest Request;
|
||||||
|
Request.TargetFace = FaceId;
|
||||||
|
return TrainingSubsystem->CommitActiveRecognitionObservation(Request);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* FindLocaleOption(
|
||||||
|
const TArray<FHyperTwistVisionLocaleOption>& LocaleOptions,
|
||||||
|
const FString& ExpectedLocaleCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return LocaleOptions.FindByPredicate(
|
||||||
|
[&ExpectedLocaleCode](const FHyperTwistVisionLocaleOption& Candidate)
|
||||||
|
{
|
||||||
|
return Candidate.LocaleCode == ExpectedLocaleCode;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RANSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AN.LocalePresentationSessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RANSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-an-config-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AN."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(TEXT("The recognition session must open for the locale-presentation route."), TrainingSubsystem->OpenActiveRecognitionSession(OpenError));
|
||||||
|
TestTrue(TEXT("Opening the recognition session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingRecognitionSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveRecognitionSessionState();
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* ArabicLocale =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("ar")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Arabic locale option must be present."), ArabicLocale);
|
||||||
|
if (ArabicLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(TEXT("Arabic must remain right-to-left."), ArabicLocale->ScriptDirectionId, TEXT("rtl"));
|
||||||
|
TestEqual(TEXT("Arabic must keep the RTL text-flow profile."), ArabicLocale->TextFlowProfileId, TEXT("rtl-word-space-delimited"));
|
||||||
|
TestEqual(TEXT("Arabic must use the bounded locale-presentation profile."), ArabicLocale->PresentationProfileId, TEXT("qbr-locale-presentation-v1"));
|
||||||
|
TestTrue(TEXT("Arabic must keep complex text shaping enabled."), ArabicLocale->bRequiresComplexTextShaping);
|
||||||
|
TestTrue(TEXT("Arabic must keep bundled donor font shipping deferred."), ArabicLocale->bBundledFontAssetDeferred);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* FarsiLocale =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("fa")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Farsi locale option must be present."), FarsiLocale);
|
||||||
|
if (FarsiLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(TEXT("Farsi must remain right-to-left."), FarsiLocale->ScriptDirectionId, TEXT("rtl"));
|
||||||
|
TestEqual(TEXT("Farsi must keep the RTL text-flow profile."), FarsiLocale->TextFlowProfileId, TEXT("rtl-word-space-delimited"));
|
||||||
|
TestTrue(TEXT("Farsi must keep complex text shaping enabled."), FarsiLocale->bRequiresComplexTextShaping);
|
||||||
|
TestTrue(TEXT("Farsi must keep bundled donor font shipping deferred."), FarsiLocale->bBundledFontAssetDeferred);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* SimplifiedChineseLocale =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("zh")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Simplified Chinese locale option must be present."), SimplifiedChineseLocale);
|
||||||
|
if (SimplifiedChineseLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(TEXT("Simplified Chinese must keep the CJK text-flow profile."), SimplifiedChineseLocale->TextFlowProfileId, TEXT("cjk-character-wrap"));
|
||||||
|
TestEqual(TEXT("Simplified Chinese must remain left-to-right in the bounded overlay contract."), SimplifiedChineseLocale->ScriptDirectionId, TEXT("ltr"));
|
||||||
|
TestFalse(TEXT("Simplified Chinese must not require complex Arabic-style shaping."), SimplifiedChineseLocale->bRequiresComplexTextShaping);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RANActiveStateTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AN.LocalePresentationActiveState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RANActiveStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-an-state-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AN."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionCommitResult Result =
|
||||||
|
HyperTwistQbrPhase6RANTestInternal::CommitFace(TrainingSubsystem, TEXT("F"), 1);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The webcam shell state must stay structurally valid."), Result.ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The default shell locale must remain English."), Result.ShellState.LocaleCode, TEXT("en"));
|
||||||
|
TestEqual(TEXT("The active shell locale must remain left-to-right by default."), Result.ShellState.ActiveLocaleScriptDirectionId, TEXT("ltr"));
|
||||||
|
TestEqual(TEXT("The active shell locale must keep the word-space text-flow profile by default."), Result.ShellState.ActiveLocaleTextFlowProfileId, TEXT("word-space-delimited"));
|
||||||
|
TestEqual(TEXT("The shell must surface the bounded locale-presentation profile id."), Result.ShellState.ActiveLocalePresentationProfileId, TEXT("qbr-locale-presentation-v1"));
|
||||||
|
TestFalse(TEXT("The default English shell locale must not require complex text shaping."), Result.ShellState.bActiveLocaleRequiresComplexTextShaping);
|
||||||
|
TestTrue(TEXT("The shell must keep bundled donor font shipping deferred."), Result.ShellState.bBundledFontAssetDeferred);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The solve-guidance state must stay structurally valid."), Result.SolveExplanationState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The active solve locale must remain English by default."), Result.SolveExplanationState.ActiveLocaleCode, TEXT("en"));
|
||||||
|
TestEqual(TEXT("The active solve locale must remain left-to-right by default."), Result.SolveExplanationState.ActiveLocaleScriptDirectionId, TEXT("ltr"));
|
||||||
|
TestEqual(TEXT("The active solve locale must keep the word-space text-flow profile by default."), Result.SolveExplanationState.ActiveLocaleTextFlowProfileId, TEXT("word-space-delimited"));
|
||||||
|
TestEqual(TEXT("The solve guidance state must surface the bounded locale-presentation profile id."), Result.SolveExplanationState.ActiveLocalePresentationProfileId, TEXT("qbr-locale-presentation-v1"));
|
||||||
|
TestFalse(TEXT("The default English solve locale must not require complex text shaping."), Result.SolveExplanationState.bActiveLocaleRequiresComplexTextShaping);
|
||||||
|
TestTrue(TEXT("The solve guidance state must keep bundled donor font shipping deferred."), Result.SolveExplanationState.bBundledFontAssetDeferred);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,287 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistQbrPhase6RASTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeRecognitionDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-as/qbr-font-review");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AS Qbr Font Review");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-as-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Recognition;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AS Recognition");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockRecognitionClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* RecognitionClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("RecognitionClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
RecognitionClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeRecognitionSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem = NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockRecognitionClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeRecognitionDeck(),
|
||||||
|
TEXT("phase6r-as-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubmitPreviewFrame(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FHyperTwistVisionFrameEnvelope Frame;
|
||||||
|
Frame.FrameOrdinal = FrameOrdinal;
|
||||||
|
Frame.TargetFaceHint = FaceId;
|
||||||
|
TrainingSubsystem->SubmitActiveRecognitionFrame(Frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitResult CommitFace(
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem,
|
||||||
|
const FString& FaceId,
|
||||||
|
const int32 FrameOrdinal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
SubmitPreviewFrame(TrainingSubsystem, FaceId, FrameOrdinal);
|
||||||
|
|
||||||
|
FHyperTwistVisionCommitRequest Request;
|
||||||
|
Request.TargetFace = FaceId;
|
||||||
|
return TrainingSubsystem->CommitActiveRecognitionObservation(Request);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* FindLocaleOption(
|
||||||
|
const TArray<FHyperTwistVisionLocaleOption>& LocaleOptions,
|
||||||
|
const FString& ExpectedLocaleCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return LocaleOptions.FindByPredicate(
|
||||||
|
[&ExpectedLocaleCode](const FHyperTwistVisionLocaleOption& Candidate)
|
||||||
|
{
|
||||||
|
return Candidate.LocaleCode == ExpectedLocaleCode;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionFontReviewDescriptor* FindFontReviewDescriptor(
|
||||||
|
const TArray<FHyperTwistVisionFontReviewDescriptor>& Reviews,
|
||||||
|
const FString& ExpectedDescriptorId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return Reviews.FindByPredicate(
|
||||||
|
[&ExpectedDescriptorId](const FHyperTwistVisionFontReviewDescriptor& Candidate)
|
||||||
|
{
|
||||||
|
return Candidate.FontReviewDescriptorId == ExpectedDescriptorId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RASSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AS.BundledFontReviewSessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RASSessionConfigTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-as-config-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AS."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(TEXT("The recognition session must open for the font-review route."), TrainingSubsystem->OpenActiveRecognitionSession(OpenError));
|
||||||
|
TestTrue(TEXT("Opening the recognition session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingRecognitionSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveRecognitionSessionState();
|
||||||
|
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The webcam shell must expose the bounded font review profile id."),
|
||||||
|
SessionState.SessionConfig.ShellProfileDefinition.FontReviewProfileId,
|
||||||
|
TEXT("qbr-bundled-font-review-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The webcam shell font review profile must stay structurally valid."),
|
||||||
|
SessionState.SessionConfig.ShellProfileDefinition.FontReviewProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The webcam shell must expose five bounded font review descriptors."),
|
||||||
|
SessionState.SessionConfig.ShellProfileDefinition.SupportedFontReviews.Num(),
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve explanation profile must expose the bounded font review profile id."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.FontReviewProfileId,
|
||||||
|
TEXT("qbr-bundled-font-review-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The solve explanation font review profile must stay structurally valid."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.FontReviewProfileDefinition.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve explanation profile must expose five bounded font review descriptors."),
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedFontReviews.Num(),
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* ArabicLocale =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("ar")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Arabic locale option must be present."), ArabicLocale);
|
||||||
|
if (ArabicLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Arabic must map to the bounded Arabic font review descriptor."),
|
||||||
|
ArabicLocale->FontReviewDescriptorId,
|
||||||
|
TEXT("font-review/qbr/arabic-core")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionLocaleOption* SimplifiedChineseLocale =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::FindLocaleOption(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedLocales,
|
||||||
|
TEXT("zh")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Simplified Chinese locale option must be present."), SimplifiedChineseLocale);
|
||||||
|
if (SimplifiedChineseLocale != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Simplified Chinese must map to the bounded CJK simplified font review descriptor."),
|
||||||
|
SimplifiedChineseLocale->FontReviewDescriptorId,
|
||||||
|
TEXT("font-review/qbr/cjk-simplified")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionFontReviewDescriptor* ArabicFontReview =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::FindFontReviewDescriptor(
|
||||||
|
SessionState.SessionConfig.SolveExplanationProfileDefinition.SupportedFontReviews,
|
||||||
|
TEXT("font-review/qbr/arabic-core")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The Arabic font review descriptor must be present."), ArabicFontReview);
|
||||||
|
if (ArabicFontReview != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The Arabic descriptor must preserve the complex shaping review profile."),
|
||||||
|
ArabicFontReview->ScriptCoverageProfileId,
|
||||||
|
TEXT("rtl-arabic-complex-shaping")
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The Arabic descriptor must not imply bundled font redistribution."),
|
||||||
|
ArabicFontReview->bBundledWithCodeDistribution
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The Arabic descriptor must keep standalone donor rendering deferred."),
|
||||||
|
ArabicFontReview->bStandaloneDonorRenderingDeferred
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistQbrPhase6RASActiveStateTest,
|
||||||
|
"HyperTwist.Permissive.Qbr.Phase6R.AS.BundledFontReviewActiveState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistQbrPhase6RASActiveStateTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::MakeRecognitionSubsystem(TEXT("phase6r-as-state-session"));
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AS."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionCommitResult Result =
|
||||||
|
HyperTwistQbrPhase6RASTestInternal::CommitFace(TrainingSubsystem, TEXT("F"), 1);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The webcam shell state must stay structurally valid."), Result.ShellState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The default shell locale must remain English."), Result.ShellState.LocaleCode, TEXT("en"));
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The shell state must preserve the bounded font review profile id."),
|
||||||
|
Result.ShellState.FontReviewProfileId,
|
||||||
|
TEXT("qbr-bundled-font-review-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The default shell locale must map to the bounded Latin font review descriptor."),
|
||||||
|
Result.ShellState.ActiveFontReviewDescriptorId,
|
||||||
|
TEXT("font-review/qbr/latin-core")
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("The shell must keep bundled donor font shipping deferred."), Result.ShellState.bBundledFontAssetDeferred);
|
||||||
|
|
||||||
|
TestTrue(TEXT("The solve-guidance state must stay structurally valid."), Result.SolveExplanationState.IsStructurallyValid());
|
||||||
|
TestEqual(TEXT("The default solve locale must remain English."), Result.SolveExplanationState.ActiveLocaleCode, TEXT("en"));
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The solve state must preserve the bounded font review profile id."),
|
||||||
|
Result.SolveExplanationState.FontReviewProfileId,
|
||||||
|
TEXT("qbr-bundled-font-review-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The default solve locale must map to the bounded Latin font review descriptor."),
|
||||||
|
Result.SolveExplanationState.ActiveFontReviewDescriptorId,
|
||||||
|
TEXT("font-review/qbr/latin-core")
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("The solve guidance state must keep bundled donor font shipping deferred."), Result.SolveExplanationState.bBundledFontAssetDeferred);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "Engine/GameInstance.h"
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingSubsystem.h"
|
||||||
|
#include "UObject/UnrealType.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistRubixCubeSolverPhase6RATTestInternal
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck MakeRecognitionDeck()
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingDeck Deck;
|
||||||
|
Deck.DeckId = TEXT("phase6r-at/rubix-cube-solver-browser-asset-review");
|
||||||
|
Deck.Title = TEXT("Phase 6R-AT Rubix Cube Solver Browser Asset Review");
|
||||||
|
Deck.DeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
|
||||||
|
FHyperTwistTrainingCase TrainingCase;
|
||||||
|
TrainingCase.CaseId = TEXT("phase6r-at-case");
|
||||||
|
TrainingCase.PuzzleId = TEXT("cube/3x3x3");
|
||||||
|
TrainingCase.PromptKind = EHyperTwistTrainingPromptKind::Recognition;
|
||||||
|
TrainingCase.PromptLabel = TEXT("Phase 6R-AT Recognition");
|
||||||
|
TrainingCase.AllowedDeliveryModes = {
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted,
|
||||||
|
EHyperTwistTrainingDeliveryMode::CoachReviewed
|
||||||
|
};
|
||||||
|
Deck.Cases = {TrainingCase};
|
||||||
|
return Deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceMockRecognitionClient(UHyperTwistTrainingSubsystem* TrainingSubsystem)
|
||||||
|
{
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FStrProperty* RecognitionClientKindProperty = FindFProperty<FStrProperty>(
|
||||||
|
UHyperTwistTrainingSubsystem::StaticClass(),
|
||||||
|
TEXT("RecognitionClientKind")
|
||||||
|
))
|
||||||
|
{
|
||||||
|
RecognitionClientKindProperty->SetPropertyValue_InContainer(TrainingSubsystem, TEXT("mock"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* MakeRecognitionSubsystem(const FString& SessionId)
|
||||||
|
{
|
||||||
|
UGameInstance* GameInstance = NewObject<UGameInstance>(GetTransientPackage());
|
||||||
|
if (GameInstance == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem = NewObject<UHyperTwistTrainingSubsystem>(GameInstance);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForceMockRecognitionClient(TrainingSubsystem);
|
||||||
|
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->StartTrainingRunFromDeck(
|
||||||
|
MakeRecognitionDeck(),
|
||||||
|
TEXT("phase6r-at-user"),
|
||||||
|
SessionId,
|
||||||
|
EHyperTwistTrainingDeliveryMode::RecognitionAssisted
|
||||||
|
);
|
||||||
|
return RunState.IsStructurallyValid() ? TrainingSubsystem : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistVisionBrowserAssetReviewDescriptor* FindBrowserAssetReviewDescriptor(
|
||||||
|
const TArray<FHyperTwistVisionBrowserAssetReviewDescriptor>& Descriptors,
|
||||||
|
const FString& ExpectedDescriptorId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return Descriptors.FindByPredicate(
|
||||||
|
[&ExpectedDescriptorId](const FHyperTwistVisionBrowserAssetReviewDescriptor& Candidate)
|
||||||
|
{
|
||||||
|
return Candidate.BrowserAssetReviewDescriptorId == ExpectedDescriptorId;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistRubixCubeSolverPhase6RATBrowserAssetReviewSessionConfigTest,
|
||||||
|
"HyperTwist.Permissive.RubixCubeSolver.Phase6R.AT.BrowserAssetReviewSessionConfig",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistRubixCubeSolverPhase6RATBrowserAssetReviewSessionConfigTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistRubixCubeSolverPhase6RATTestInternal::MakeRecognitionSubsystem(
|
||||||
|
TEXT("phase6r-at-config-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AT."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FString OpenError;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The recognition session must open for the browser-asset review route."),
|
||||||
|
TrainingSubsystem->OpenActiveRecognitionSession(OpenError)
|
||||||
|
);
|
||||||
|
TestTrue(TEXT("Opening the recognition session must not report an error."), OpenError.IsEmpty());
|
||||||
|
|
||||||
|
const FHyperTwistTrainingRecognitionSessionState SessionState =
|
||||||
|
TrainingSubsystem->GetActiveRecognitionSessionState();
|
||||||
|
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The browser shell must expose the bounded browser asset review profile id."),
|
||||||
|
SessionState.SessionConfig.BrowserShellProfileDefinition.BrowserAssetReviewProfileId,
|
||||||
|
TEXT("rubix-browser-asset-review-v1")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The browser asset review profile must stay structurally valid."),
|
||||||
|
SessionState.SessionConfig.BrowserShellProfileDefinition.BrowserAssetReviewProfileDefinition
|
||||||
|
.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The browser shell must expose one bounded visualization asset review descriptor."),
|
||||||
|
SessionState.SessionConfig.BrowserShellProfileDefinition.SupportedBrowserAssetReviews.Num(),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The browser shell must preserve the bounded default asset review descriptor id."),
|
||||||
|
SessionState.SessionConfig.BrowserShellProfileDefinition.DefaultBrowserAssetReviewDescriptorId,
|
||||||
|
TEXT("browser-asset-review/rubix-cube-solver/twistysim")
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistVisionBrowserAssetReviewDescriptor* Descriptor =
|
||||||
|
HyperTwistRubixCubeSolverPhase6RATTestInternal::FindBrowserAssetReviewDescriptor(
|
||||||
|
SessionState.SessionConfig.BrowserShellProfileDefinition.SupportedBrowserAssetReviews,
|
||||||
|
TEXT("browser-asset-review/rubix-cube-solver/twistysim")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The twistysim review descriptor must be present."), Descriptor);
|
||||||
|
if (Descriptor != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The twistysim review descriptor must preserve the upstream asset path."),
|
||||||
|
Descriptor->AssetPathHint,
|
||||||
|
TEXT("frontend/lib/twistysim.min.js")
|
||||||
|
);
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The twistysim review descriptor must not imply bundled redistribution."),
|
||||||
|
Descriptor->bBundledWithCodeDistribution
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The twistysim review descriptor must keep playback visualization ownership deferred."),
|
||||||
|
Descriptor->bPlaybackVisualizationDeferred
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistRubixCubeSolverPhase6RATBrowserAssetReviewPreviewStateTest,
|
||||||
|
"HyperTwist.Permissive.RubixCubeSolver.Phase6R.AT.BrowserAssetReviewPreviewState",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistRubixCubeSolverPhase6RATBrowserAssetReviewPreviewStateTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UHyperTwistTrainingSubsystem* TrainingSubsystem =
|
||||||
|
HyperTwistRubixCubeSolverPhase6RATTestInternal::MakeRecognitionSubsystem(
|
||||||
|
TEXT("phase6r-at-preview-session")
|
||||||
|
);
|
||||||
|
TestNotNull(TEXT("The recognition subsystem must be constructed for Phase 6R-AT."), TrainingSubsystem);
|
||||||
|
if (TrainingSubsystem == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FHyperTwistVisionFrameEnvelope Frame;
|
||||||
|
Frame.TargetFaceHint = TEXT("F");
|
||||||
|
const FHyperTwistVisionPreviewResult Result = TrainingSubsystem->SubmitActiveRecognitionFrame(Frame);
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The preview result must carry a structurally valid browser shell state."),
|
||||||
|
Result.BrowserShellState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The preview browser shell must preserve the bounded browser asset review profile id."),
|
||||||
|
Result.BrowserShellState.BrowserAssetReviewProfileId,
|
||||||
|
TEXT("rubix-browser-asset-review-v1")
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The preview browser shell must preserve the bounded active asset review descriptor id."),
|
||||||
|
Result.BrowserShellState.ActiveBrowserAssetReviewDescriptorId,
|
||||||
|
TEXT("browser-asset-review/rubix-cube-solver/twistysim")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The preview browser shell must keep bundled browser asset shipping deferred."),
|
||||||
|
Result.BrowserShellState.bBundledBrowserAssetDeferred
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The preview browser shell must still keep playback deferred in this packet."),
|
||||||
|
Result.BrowserShellState.bPlaybackDeferred
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -73,9 +73,9 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
RegistryState.IsStructurallyValid()
|
RegistryState.IsStructurallyValid()
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample S1-A registry must expose nineteen declared skills after S4-C lands."),
|
TEXT("The sample S1-A registry must expose forty declared skills after S7-C lands."),
|
||||||
RegistryState.SkillCount,
|
RegistryState.SkillCount,
|
||||||
19
|
40
|
||||||
);
|
);
|
||||||
TestTrue(
|
TestTrue(
|
||||||
TEXT("The S1-A registry must avoid ad hoc metadata."),
|
TEXT("The S1-A registry must avoid ad hoc metadata."),
|
||||||
|
|
@ -86,12 +86,12 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
RegistryState.bAllSkillsOptionalAssistive
|
RegistryState.bAllSkillsOptionalAssistive
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample S1-A registry must keep sixteen implemented skill entries after S4-C lands."),
|
TEXT("The sample S1-A registry must keep thirty-seven implemented skill entries after S7-C lands."),
|
||||||
HyperTwistSkillPhaseS1ATestInternal::FindStatusCount(
|
HyperTwistSkillPhaseS1ATestInternal::FindStatusCount(
|
||||||
RegistryState,
|
RegistryState,
|
||||||
EHyperTwistSkillStatus::ImplementedNow
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
),
|
),
|
||||||
16
|
37
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample S1-A registry must keep one command-contract-pending entry for note capture."),
|
TEXT("The sample S1-A registry must keep one command-contract-pending entry for note capture."),
|
||||||
|
|
@ -117,6 +117,14 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
),
|
),
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The sample S1-A registry must expose eight analysis/review-family entries after S5-C lands."),
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
||||||
|
RegistryState,
|
||||||
|
EHyperTwistSkillFamily::AnalysisReview
|
||||||
|
),
|
||||||
|
8
|
||||||
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample S1-A registry must expose eight memory-continuity-family entries after S3-C lands."),
|
TEXT("The sample S1-A registry must expose eight memory-continuity-family entries after S3-C lands."),
|
||||||
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
||||||
|
|
@ -133,6 +141,45 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
),
|
),
|
||||||
6
|
6
|
||||||
);
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The sample S1-A registry must expose seven provider/operations-family entries after S6-B lands."),
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
||||||
|
RegistryState,
|
||||||
|
EHyperTwistSkillFamily::ProviderOperations
|
||||||
|
),
|
||||||
|
7
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The sample S1-A registry must expose nine domain/creative-family entries after S7-C lands."),
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindFamilyCount(
|
||||||
|
RegistryState,
|
||||||
|
EHyperTwistSkillFamily::DomainCreative
|
||||||
|
),
|
||||||
|
9
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* ReplayExplainerSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/compose-replay-explainer-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill entry must exist."),
|
||||||
|
ReplayExplainerSkill
|
||||||
|
);
|
||||||
|
if (ReplayExplainerSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill must be implemented now."),
|
||||||
|
ReplayExplainerSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill must bind to the first-party replay-explainer pack service."),
|
||||||
|
ReplayExplainerSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/compose-replay-explainer-pack"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const FHyperTwistSkillManifestEntry* GovernanceSkill =
|
const FHyperTwistSkillManifestEntry* GovernanceSkill =
|
||||||
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
|
@ -207,6 +254,144 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* ImplementationReviewSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/review-implementation")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-implementation skill entry must exist."),
|
||||||
|
ImplementationReviewSkill
|
||||||
|
);
|
||||||
|
if (ImplementationReviewSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-implementation skill must be implemented now."),
|
||||||
|
ImplementationReviewSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-implementation skill must bind to the first-party implementation-review service."),
|
||||||
|
ImplementationReviewSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/specs/review-implementation"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* PlanSynthesisSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/synthesize-plan")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The synthesize-plan skill entry must exist."),
|
||||||
|
PlanSynthesisSkill
|
||||||
|
);
|
||||||
|
if (PlanSynthesisSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The synthesize-plan skill must be implemented now."),
|
||||||
|
PlanSynthesisSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The synthesize-plan skill must bind to the first-party plan-synthesis service."),
|
||||||
|
PlanSynthesisSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/synthesize-plan"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* ProviderProfileSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/inspect-provider-profile")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The inspect-provider-profile skill entry must exist."),
|
||||||
|
ProviderProfileSkill
|
||||||
|
);
|
||||||
|
if (ProviderProfileSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The inspect-provider-profile skill must be implemented now."),
|
||||||
|
ProviderProfileSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The inspect-provider-profile skill must bind to the first-party provider-profile inspection service."),
|
||||||
|
ProviderProfileSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/inspect-provider-profile"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* UsageAuditSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/audit-provider-usage")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The audit-provider-usage skill entry must exist."),
|
||||||
|
UsageAuditSkill
|
||||||
|
);
|
||||||
|
if (UsageAuditSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill must be implemented now."),
|
||||||
|
UsageAuditSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill must bind to the first-party provider-usage audit service."),
|
||||||
|
UsageAuditSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/audit-provider-usage"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* DomainPackagingSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/specify-domain-packaging")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-packaging skill entry must exist."),
|
||||||
|
DomainPackagingSkill
|
||||||
|
);
|
||||||
|
if (DomainPackagingSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill must be implemented now."),
|
||||||
|
DomainPackagingSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill must bind to the first-party domain-packaging service."),
|
||||||
|
DomainPackagingSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/specify-domain-packaging"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* TrainingReplayPackSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/review-training-replay-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-training-replay-pack skill entry must exist."),
|
||||||
|
TrainingReplayPackSkill
|
||||||
|
);
|
||||||
|
if (TrainingReplayPackSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill must be implemented now."),
|
||||||
|
TrainingReplayPackSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill must bind to the first-party training-replay review pack service."),
|
||||||
|
TrainingReplayPackSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/review-training-replay-pack"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const FHyperTwistSkillManifestEntry* DocsExtractionSkill =
|
const FHyperTwistSkillManifestEntry* DocsExtractionSkill =
|
||||||
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
RegistryState,
|
RegistryState,
|
||||||
|
|
@ -276,6 +461,29 @@ bool FHyperTwistSkillPhaseS1ARegistryManifestTest::RunTest(const FString& Parame
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillManifestEntry* WorkflowReviewSkill =
|
||||||
|
HyperTwistSkillPhaseS1ATestInternal::FindSkillById(
|
||||||
|
RegistryState,
|
||||||
|
TEXT("skill/review-proposal")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-proposal skill entry must exist."),
|
||||||
|
WorkflowReviewSkill
|
||||||
|
);
|
||||||
|
if (WorkflowReviewSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-proposal skill must be implemented now."),
|
||||||
|
WorkflowReviewSkill->Status,
|
||||||
|
EHyperTwistSkillStatus::ImplementedNow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-proposal skill must bind to the first-party proposal-review service."),
|
||||||
|
WorkflowReviewSkill->CommandBindings[0].ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/review-proposal"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,9 +71,9 @@ bool FHyperTwistSkillPhaseS1BSettingsVisibilityTest::RunTest(
|
||||||
ControlState.MasterSwitch.bImmediateMenuControlExposed
|
ControlState.MasterSwitch.bImmediateMenuControlExposed
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample S1-B control state must preserve all nineteen installed skills after S4-C lands."),
|
TEXT("The sample S1-B control state must preserve all forty installed skills after S7-C lands."),
|
||||||
ControlState.SkillCount,
|
ControlState.SkillCount,
|
||||||
19
|
40
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The default S1-B control state must keep one effective enabled skill."),
|
TEXT("The default S1-B control state must keep one effective enabled skill."),
|
||||||
|
|
@ -212,6 +212,214 @@ bool FHyperTwistSkillPhaseS1BSettingsVisibilityTest::RunTest(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* WorkflowReviewState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/review-proposal")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-proposal skill state must exist."),
|
||||||
|
WorkflowReviewState
|
||||||
|
);
|
||||||
|
if (WorkflowReviewState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The review-proposal skill must remain opt-in by default."),
|
||||||
|
WorkflowReviewState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review-proposal skill must remain visible by default."),
|
||||||
|
WorkflowReviewState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-proposal skill must use the analysis/review visibility group."),
|
||||||
|
WorkflowReviewState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/analysis-review")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* ReplayExplainerState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/compose-replay-explainer-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill state must exist."),
|
||||||
|
ReplayExplainerState
|
||||||
|
);
|
||||||
|
if (ReplayExplainerState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill must remain opt-in by default."),
|
||||||
|
ReplayExplainerState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill must remain visible by default."),
|
||||||
|
ReplayExplainerState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill must use the domain/creative visibility group."),
|
||||||
|
ReplayExplainerState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/domain-creative")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* ImplementationReviewState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/review-implementation")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-implementation skill state must exist."),
|
||||||
|
ImplementationReviewState
|
||||||
|
);
|
||||||
|
if (ImplementationReviewState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The review-implementation skill must remain opt-in by default."),
|
||||||
|
ImplementationReviewState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review-implementation skill must remain visible by default."),
|
||||||
|
ImplementationReviewState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-implementation skill must use the analysis/review visibility group."),
|
||||||
|
ImplementationReviewState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/analysis-review")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* PlanSynthesisState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/synthesize-plan")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The synthesize-plan skill state must exist."),
|
||||||
|
PlanSynthesisState
|
||||||
|
);
|
||||||
|
if (PlanSynthesisState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The synthesize-plan skill must remain opt-in by default."),
|
||||||
|
PlanSynthesisState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The synthesize-plan skill must remain visible by default."),
|
||||||
|
PlanSynthesisState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The synthesize-plan skill must use the analysis/review visibility group."),
|
||||||
|
PlanSynthesisState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/analysis-review")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* ProviderProfileState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/inspect-provider-profile")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The inspect-provider-profile skill state must exist."),
|
||||||
|
ProviderProfileState
|
||||||
|
);
|
||||||
|
if (ProviderProfileState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The inspect-provider-profile skill must remain opt-in by default."),
|
||||||
|
ProviderProfileState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The inspect-provider-profile skill must remain visible by default."),
|
||||||
|
ProviderProfileState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The inspect-provider-profile skill must use the provider-operations visibility group."),
|
||||||
|
ProviderProfileState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/provider-operations")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* UsageAuditState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/audit-provider-usage")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The audit-provider-usage skill state must exist."),
|
||||||
|
UsageAuditState
|
||||||
|
);
|
||||||
|
if (UsageAuditState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The audit-provider-usage skill must remain opt-in by default."),
|
||||||
|
UsageAuditState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The audit-provider-usage skill must remain visible by default."),
|
||||||
|
UsageAuditState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill must use the provider-operations visibility group."),
|
||||||
|
UsageAuditState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/provider-operations")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* DomainPackagingState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/specify-domain-packaging")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-packaging skill state must exist."),
|
||||||
|
DomainPackagingState
|
||||||
|
);
|
||||||
|
if (DomainPackagingState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The specify-domain-packaging skill must remain opt-in by default."),
|
||||||
|
DomainPackagingState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The specify-domain-packaging skill must remain visible by default."),
|
||||||
|
DomainPackagingState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill must use the domain-creative visibility group."),
|
||||||
|
DomainPackagingState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/domain-creative")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillControlStateEntry* TrainingReplayPackState =
|
||||||
|
HyperTwistSkillPhaseS1BTestInternal::FindSkillStateById(
|
||||||
|
ControlState,
|
||||||
|
TEXT("skill/review-training-replay-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-training-replay-pack skill state must exist."),
|
||||||
|
TrainingReplayPackState
|
||||||
|
);
|
||||||
|
if (TrainingReplayPackState != nullptr)
|
||||||
|
{
|
||||||
|
TestFalse(
|
||||||
|
TEXT("The review-training-replay-pack skill must remain opt-in by default."),
|
||||||
|
TrainingReplayPackState->bEffectiveEnabled
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review-training-replay-pack skill must remain visible by default."),
|
||||||
|
TrainingReplayPackState->bEffectiveVisible
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill must use the domain-creative visibility group."),
|
||||||
|
TrainingReplayPackState->VisibilityGroupId,
|
||||||
|
TEXT("skill-group/domain-creative")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,9 @@ bool FHyperTwistSkillPhaseS1CInvocationProvenanceTest::RunTest(const FString& Pa
|
||||||
AuditLedgerState.IsStructurallyValid()
|
AuditLedgerState.IsStructurallyValid()
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("Sample skill audit ledger should record one invocation per enabled sample skill after S4-C lands."),
|
TEXT("Sample skill audit ledger should record one invocation per enabled sample skill after S7-C lands."),
|
||||||
AuditLedgerState.InvocationCount,
|
AuditLedgerState.InvocationCount,
|
||||||
16
|
37
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("All sample invocations should remain traceable."),
|
TEXT("All sample invocations should remain traceable."),
|
||||||
|
|
@ -109,9 +109,9 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
||||||
AuditLedgerState.bCancelRecordingSupported
|
AuditLedgerState.bCancelRecordingSupported
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample audit ledger should contain the expected successful invocation count after S4-C lands."),
|
TEXT("The sample audit ledger should contain the expected successful invocation count after S7-C lands."),
|
||||||
AuditLedgerState.SuccessfulInvocationCount,
|
AuditLedgerState.SuccessfulInvocationCount,
|
||||||
14
|
35
|
||||||
);
|
);
|
||||||
TestEqual(
|
TestEqual(
|
||||||
TEXT("The sample audit ledger should contain the expected failed invocation count."),
|
TEXT("The sample audit ledger should contain the expected failed invocation count."),
|
||||||
|
|
@ -241,6 +241,29 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* ReplayExplainerRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/compose-replay-explainer-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The compose-replay-explainer-pack invocation should be present in the sample audit ledger."),
|
||||||
|
ReplayExplainerRecord
|
||||||
|
);
|
||||||
|
if (ReplayExplainerRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should record a success outcome."),
|
||||||
|
ReplayExplainerRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should emit the bounded replay-explainer artifact."),
|
||||||
|
ReplayExplainerRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/replay-explainer-pack-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const FHyperTwistSkillInvocationRecord* BrowserTraceRecord =
|
const FHyperTwistSkillInvocationRecord* BrowserTraceRecord =
|
||||||
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
AuditLedgerState,
|
AuditLedgerState,
|
||||||
|
|
@ -264,6 +287,29 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* WorkflowWrapperRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/wrap-bounded-workflow")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The bounded workflow-wrapper skill invocation should be present in the sample audit ledger."),
|
||||||
|
WorkflowWrapperRecord
|
||||||
|
);
|
||||||
|
if (WorkflowWrapperRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded workflow-wrapper skill should record a success outcome."),
|
||||||
|
WorkflowWrapperRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded workflow-wrapper skill should emit the bounded workflow wrapper artifact."),
|
||||||
|
WorkflowWrapperRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/bounded-workflow-wrapper-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const FHyperTwistSkillInvocationRecord* DesignShellRecord =
|
const FHyperTwistSkillInvocationRecord* DesignShellRecord =
|
||||||
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
AuditLedgerState,
|
AuditLedgerState,
|
||||||
|
|
@ -287,6 +333,144 @@ bool FHyperTwistSkillPhaseS1CFailureCancelRecordingTest::RunTest(const FString&
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* DelegationSpecRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/specify-bounded-delegation")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The bounded-delegation spec invocation should be present in the sample audit ledger."),
|
||||||
|
DelegationSpecRecord
|
||||||
|
);
|
||||||
|
if (DelegationSpecRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded-delegation spec should record a success outcome."),
|
||||||
|
DelegationSpecRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded-delegation spec should emit the delegation-spec artifact."),
|
||||||
|
DelegationSpecRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/bounded-delegation-spec-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* WorkflowChainRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/chain-bounded-workflow")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The bounded workflow-chain invocation should be present in the sample audit ledger."),
|
||||||
|
WorkflowChainRecord
|
||||||
|
);
|
||||||
|
if (WorkflowChainRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded workflow-chain skill should record a success outcome."),
|
||||||
|
WorkflowChainRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded workflow-chain skill should emit the workflow-chain artifact."),
|
||||||
|
WorkflowChainRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/bounded-workflow-chain-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* ProviderProfileRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/diagnose-provider-routing")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The diagnose-provider-routing skill invocation should be present in the sample audit ledger."),
|
||||||
|
ProviderProfileRecord
|
||||||
|
);
|
||||||
|
if (ProviderProfileRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The diagnose-provider-routing skill should record a success outcome."),
|
||||||
|
ProviderProfileRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The diagnose-provider-routing skill should emit the bounded provider-routing diagnostic artifact."),
|
||||||
|
ProviderProfileRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/provider-routing-diagnostic-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* UsageAuditRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/audit-provider-usage")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The audit-provider-usage skill invocation should be present in the sample audit ledger."),
|
||||||
|
UsageAuditRecord
|
||||||
|
);
|
||||||
|
if (UsageAuditRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill should record a success outcome."),
|
||||||
|
UsageAuditRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill should emit the bounded provider-usage audit artifact."),
|
||||||
|
UsageAuditRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/provider-usage-audit-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* DomainPackagingRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/specify-domain-packaging")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-packaging skill invocation should be present in the sample audit ledger."),
|
||||||
|
DomainPackagingRecord
|
||||||
|
);
|
||||||
|
if (DomainPackagingRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill should record a success outcome."),
|
||||||
|
DomainPackagingRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill should emit the bounded domain-packaging artifact."),
|
||||||
|
DomainPackagingRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/domain-packaging-rules-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillInvocationRecord* TrainingReplayPackRecord =
|
||||||
|
HyperTwistSkillPhaseS1CTestInternal::FindInvocationRecordBySkillId(
|
||||||
|
AuditLedgerState,
|
||||||
|
TEXT("skill/review-training-replay-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-training-replay-pack skill invocation should be present in the sample audit ledger."),
|
||||||
|
TrainingReplayPackRecord
|
||||||
|
);
|
||||||
|
if (TrainingReplayPackRecord != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill should record a success outcome."),
|
||||||
|
TrainingReplayPackRecord->Outcome,
|
||||||
|
EHyperTwistSkillInvocationOutcome::Succeeded
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill should emit the bounded retained training-replay artifact."),
|
||||||
|
TrainingReplayPackRecord->ProducedArtifacts[0].ArtifactKind,
|
||||||
|
FString(TEXT("artifact/training-replay-review-pack-brief"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,158 @@ bool FHyperTwistSkillPhaseS1DValidationHarnessCoverageTest::RunTest(const FStrin
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* WorkflowReviewEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/review-proposal"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-proposal skill should have an eval validation contract."),
|
||||||
|
WorkflowReviewEval
|
||||||
|
);
|
||||||
|
if (WorkflowReviewEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-proposal skill eval contract should run live after S5-A lands."),
|
||||||
|
WorkflowReviewEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* ImplementationReviewEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/review-implementation"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-implementation skill should have an eval validation contract."),
|
||||||
|
ImplementationReviewEval
|
||||||
|
);
|
||||||
|
if (ImplementationReviewEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-implementation skill eval contract should run live after S5-B lands."),
|
||||||
|
ImplementationReviewEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* PlanSynthesisEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/synthesize-plan"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The synthesize-plan skill should have an eval validation contract."),
|
||||||
|
PlanSynthesisEval
|
||||||
|
);
|
||||||
|
if (PlanSynthesisEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The synthesize-plan skill eval contract should run live after S5-C lands."),
|
||||||
|
PlanSynthesisEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* ProviderProfileEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/inspect-provider-profile"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The inspect-provider-profile skill should have an eval validation contract."),
|
||||||
|
ProviderProfileEval
|
||||||
|
);
|
||||||
|
if (ProviderProfileEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The inspect-provider-profile skill eval contract should run live after S6-A lands."),
|
||||||
|
ProviderProfileEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* UsageAuditEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/audit-provider-usage"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The audit-provider-usage skill should have an eval validation contract."),
|
||||||
|
UsageAuditEval
|
||||||
|
);
|
||||||
|
if (UsageAuditEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill eval contract should run live after S6-B lands."),
|
||||||
|
UsageAuditEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* DomainPackagingEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/specify-domain-packaging"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-packaging skill should have an eval validation contract."),
|
||||||
|
DomainPackagingEval
|
||||||
|
);
|
||||||
|
if (DomainPackagingEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill eval contract should run live after S7-A lands."),
|
||||||
|
DomainPackagingEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* TrainingReplayPackEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/review-training-replay-pack"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-training-replay-pack skill should have an eval validation contract."),
|
||||||
|
TrainingReplayPackEval
|
||||||
|
);
|
||||||
|
if (TrainingReplayPackEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill eval contract should run live after S7-B lands."),
|
||||||
|
TrainingReplayPackEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const FHyperTwistSkillValidationContractCase* ReplayExplainerEval =
|
||||||
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
|
HarnessState,
|
||||||
|
TEXT("skill/compose-replay-explainer-pack"),
|
||||||
|
EHyperTwistSkillValidationContractKind::Eval
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should have an eval validation contract."),
|
||||||
|
ReplayExplainerEval
|
||||||
|
);
|
||||||
|
if (ReplayExplainerEval != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill eval contract should run live after S7-C lands."),
|
||||||
|
ReplayExplainerEval->ExecutionMode,
|
||||||
|
EHyperTwistSkillValidationExecutionMode::LiveContract
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const FHyperTwistSkillValidationContractCase* RouxEval =
|
const FHyperTwistSkillValidationContractCase* RouxEval =
|
||||||
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
HyperTwistSkillPhaseS1DTestInternal::FindValidationCase(
|
||||||
HarnessState,
|
HarnessState,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS5ATestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillWorkflowReviewSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillWorkflowReviewState& WorkflowReviewState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillWorkflowReviewSkill& Skill :
|
||||||
|
WorkflowReviewState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5AWorkflowReviewCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5A.WorkflowReviewCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5AWorkflowReviewCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillWorkflowReviewState WorkflowReviewState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillWorkflowReviewState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-A workflow-review state should be structurally valid."),
|
||||||
|
WorkflowReviewState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-A should expose three workflow/review skills."),
|
||||||
|
WorkflowReviewState.SkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-A should expose three live workflow/review skills."),
|
||||||
|
WorkflowReviewState.LiveSkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-A should expose one proposal-review skill."),
|
||||||
|
WorkflowReviewState.ProposalReviewSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-A should expose one diff-review skill."),
|
||||||
|
WorkflowReviewState.DiffReviewSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-A should expose one bounded workflow-wrapper skill."),
|
||||||
|
WorkflowReviewState.BoundedWorkflowWrapperSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillWorkflowReviewSkill* ProposalReviewSkill =
|
||||||
|
HyperTwistSkillPhaseS5ATestInternal::FindSkillById(
|
||||||
|
WorkflowReviewState,
|
||||||
|
TEXT("skill/review-proposal")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-proposal skill should exist."),
|
||||||
|
ProposalReviewSkill
|
||||||
|
);
|
||||||
|
if (ProposalReviewSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-proposal skill should bind to the bounded proposal-review artifact."),
|
||||||
|
ProposalReviewSkill->OutputArtifactKinds[0],
|
||||||
|
FString(TEXT("artifact/proposal-review-brief"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review-proposal skill should declare proposal-review mode."),
|
||||||
|
ProposalReviewSkill->bReviewsProposal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5ABoundedWorkflowReviewTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5A.BoundedWorkflowReview",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5ABoundedWorkflowReviewTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillWorkflowReviewState WorkflowReviewState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillWorkflowReviewState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-A workflow-review state should be structurally valid."),
|
||||||
|
WorkflowReviewState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S5-A skill should read authoritative workflow and review surfaces."),
|
||||||
|
WorkflowReviewState.bEveryLiveSkillReadsAuthoritativeWorkflowAndReviewSurfaces
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S5-A skill should keep validation-harness coverage."),
|
||||||
|
WorkflowReviewState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A workflow/review wrappers should remain structurally bounded."),
|
||||||
|
WorkflowReviewState.bWorkflowReviewRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A workflow/review wrappers should require the landed extraction substrate."),
|
||||||
|
WorkflowReviewState.bEverySkillRequiresExtractionSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A workflow/review wrappers should require the landed workflow-memory substrate."),
|
||||||
|
WorkflowReviewState.bEverySkillRequiresWorkflowMemorySubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A workflow/review wrappers should require the landed design-shell substrate."),
|
||||||
|
WorkflowReviewState.bEverySkillRequiresDesignShellSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A should avoid implementation-review and delegation widening."),
|
||||||
|
WorkflowReviewState.bNoImplementationReviewDelegationWidening
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-A should avoid plan-synthesis widening."),
|
||||||
|
WorkflowReviewState.bNoPlanSynthesisWidening
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillWorkflowReviewSkill* WorkflowWrapperSkill =
|
||||||
|
HyperTwistSkillPhaseS5ATestInternal::FindSkillById(
|
||||||
|
WorkflowReviewState,
|
||||||
|
TEXT("skill/wrap-bounded-workflow")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The wrap-bounded-workflow skill should exist."),
|
||||||
|
WorkflowWrapperSkill
|
||||||
|
);
|
||||||
|
if (WorkflowWrapperSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The wrap-bounded-workflow skill should declare bounded workflow-wrapper mode."),
|
||||||
|
WorkflowWrapperSkill->bWrapsBoundedWorkflow
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The wrap-bounded-workflow skill should depend on the workflow-memory substrate."),
|
||||||
|
WorkflowWrapperSkill->bRequiresWorkflowMemorySubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The wrap-bounded-workflow skill should explicitly avoid plan-synthesis widening."),
|
||||||
|
WorkflowWrapperSkill->bAvoidsPlanSynthesisWidening
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5ASerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5A.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5ASerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillWorkflowReviewState WorkflowReviewState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillWorkflowReviewState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-A workflow-review state should be structurally valid before serialization."),
|
||||||
|
WorkflowReviewState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillWorkflowReviewStateToJson(
|
||||||
|
WorkflowReviewState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S5-A JSON should include the plan-synthesis guard field."),
|
||||||
|
Json.Contains(TEXT("bNoPlanSynthesisWidening"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillWorkflowReviewState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S5-A workflow-review JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillWorkflowReviewStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S5-A workflow-review state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-A skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
WorkflowReviewState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-A live-skill count should match the original sample."),
|
||||||
|
RoundTrippedState.LiveSkillCount,
|
||||||
|
WorkflowReviewState.LiveSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,220 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS5BTestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillImplementationDelegationSpec* FindSpecBySkillId(
|
||||||
|
const FHyperTwistSkillImplementationDelegationState& ImplementationDelegationState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillImplementationDelegationSpec& Spec :
|
||||||
|
ImplementationDelegationState.Specs)
|
||||||
|
{
|
||||||
|
if (Spec.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Spec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5BImplementationDelegationCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5B.ImplementationDelegationCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5BImplementationDelegationCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillImplementationDelegationState ImplementationDelegationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillImplementationDelegationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-B implementation/delegation state should be structurally valid."),
|
||||||
|
ImplementationDelegationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-B should expose two bounded implementation/delegation specs."),
|
||||||
|
ImplementationDelegationState.SkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-B should expose one implementation-review spec."),
|
||||||
|
ImplementationDelegationState.ImplementationReviewSpecCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-B should expose one bounded delegation spec."),
|
||||||
|
ImplementationDelegationState.DelegationSpecCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillImplementationDelegationSpec* ImplementationReviewSpec =
|
||||||
|
HyperTwistSkillPhaseS5BTestInternal::FindSpecBySkillId(
|
||||||
|
ImplementationDelegationState,
|
||||||
|
TEXT("skill/review-implementation")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The implementation-review spec should exist."),
|
||||||
|
ImplementationReviewSpec
|
||||||
|
);
|
||||||
|
if (ImplementationReviewSpec != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The implementation-review spec should bind to the first-party implementation-review service."),
|
||||||
|
ImplementationReviewSpec->ServiceBindingId,
|
||||||
|
FString(TEXT("service/specs/review-implementation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The implementation-review spec should declare implementation-review mode."),
|
||||||
|
ImplementationReviewSpec->bCoversImplementationReview
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5BBoundedDelegationSafetyTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5B.BoundedDelegationSafety",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5BBoundedDelegationSafetyTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillImplementationDelegationState ImplementationDelegationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillImplementationDelegationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-B implementation/delegation state should be structurally valid."),
|
||||||
|
ImplementationDelegationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should stay in first-party terms."),
|
||||||
|
ImplementationDelegationState.bEverySpecUsesFirstPartyTerms
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should preserve the optional-assistive off-state."),
|
||||||
|
ImplementationDelegationState.bEverySpecPreservesOptionalAssistiveOffState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should require provenance-ledger visibility."),
|
||||||
|
ImplementationDelegationState.bEverySpecRequiresProvenanceLedger
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should remain bounded to implementation review and delegation only."),
|
||||||
|
ImplementationDelegationState.bEverySpecRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should require the landed workflow/review substrate."),
|
||||||
|
ImplementationDelegationState.bEverySpecRequiresWorkflowReviewSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every S5-B spec should require the landed design-shell substrate."),
|
||||||
|
ImplementationDelegationState.bEverySpecRequiresDesignShellSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-B should avoid plan-synthesis widening."),
|
||||||
|
ImplementationDelegationState.bNoPlanSynthesisWidening
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-B should avoid autonomous-execution claims."),
|
||||||
|
ImplementationDelegationState.bNoAutonomousExecutionClaims
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillImplementationDelegationSpec* DelegationSpec =
|
||||||
|
HyperTwistSkillPhaseS5BTestInternal::FindSpecBySkillId(
|
||||||
|
ImplementationDelegationState,
|
||||||
|
TEXT("skill/specify-bounded-delegation")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The bounded-delegation spec should exist."),
|
||||||
|
DelegationSpec
|
||||||
|
);
|
||||||
|
if (DelegationSpec != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The bounded-delegation spec should declare bounded delegation mode."),
|
||||||
|
DelegationSpec->bDefinesBoundedDelegationSpec
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded-delegation spec should depend on three landed workflow/review inputs."),
|
||||||
|
DelegationSpec->RequiredWorkflowReviewSkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The bounded-delegation spec should depend on two landed design-shell inputs."),
|
||||||
|
DelegationSpec->RequiredDesignShellSkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5BSerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5B.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5BSerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillImplementationDelegationState ImplementationDelegationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillImplementationDelegationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-B implementation/delegation state should be structurally valid before serialization."),
|
||||||
|
ImplementationDelegationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillImplementationDelegationStateToJson(
|
||||||
|
ImplementationDelegationState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S5-B JSON should include the autonomous-execution guard field."),
|
||||||
|
Json.Contains(TEXT("bNoAutonomousExecutionClaims"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillImplementationDelegationState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S5-B implementation/delegation JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillImplementationDelegationStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S5-B implementation/delegation state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-B spec count should match the original sample."),
|
||||||
|
RoundTrippedState.SpecCount,
|
||||||
|
ImplementationDelegationState.SpecCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-B safety-rule count should match the original sample."),
|
||||||
|
RoundTrippedState.SafetyRuleCount,
|
||||||
|
ImplementationDelegationState.SafetyRuleCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,225 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS5CTestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillPlanOrchestrationSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState& PlanOrchestrationState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillPlanOrchestrationSkill& Skill :
|
||||||
|
PlanOrchestrationState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5CPlanOrchestrationCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5C.PlanOrchestrationCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5CPlanOrchestrationCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState PlanOrchestrationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillPlanOrchestrationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-C plan/orchestration state should be structurally valid."),
|
||||||
|
PlanOrchestrationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-C should expose two bounded plan/orchestration skills."),
|
||||||
|
PlanOrchestrationState.SkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-C should expose one bounded plan-synthesis skill."),
|
||||||
|
PlanOrchestrationState.PlanSynthesisSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S5-C should expose one bounded workflow-chaining skill."),
|
||||||
|
PlanOrchestrationState.WorkflowChainingSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillPlanOrchestrationSkill* PlanSynthesisSkill =
|
||||||
|
HyperTwistSkillPhaseS5CTestInternal::FindSkillById(
|
||||||
|
PlanOrchestrationState,
|
||||||
|
TEXT("skill/synthesize-plan")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The synthesize-plan skill should exist."),
|
||||||
|
PlanSynthesisSkill
|
||||||
|
);
|
||||||
|
if (PlanSynthesisSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The synthesize-plan skill should bind to the first-party plan-synthesis service."),
|
||||||
|
PlanSynthesisSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/synthesize-plan"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The synthesize-plan skill should declare bounded plan-synthesis mode."),
|
||||||
|
PlanSynthesisSkill->bSynthesizesBoundedPlan
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5CBoundedOrchestrationSafetyTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5C.BoundedOrchestrationSafety",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5CBoundedOrchestrationSafetyTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState PlanOrchestrationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillPlanOrchestrationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-C plan/orchestration state should be structurally valid."),
|
||||||
|
PlanOrchestrationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S5-C skill should read authoritative workflow, implementation, and memory surfaces."),
|
||||||
|
PlanOrchestrationState
|
||||||
|
.bEveryLiveSkillReadsAuthoritativeWorkflowImplementationAndMemorySurfaces
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S5-C skill should keep validation-harness coverage."),
|
||||||
|
PlanOrchestrationState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C plan/orchestration skills should remain structurally bounded."),
|
||||||
|
PlanOrchestrationState.bPlanOrchestrationRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C plan/orchestration skills should require the landed implementation/delegation substrate."),
|
||||||
|
PlanOrchestrationState.bEverySkillRequiresImplementationDelegationSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C plan/orchestration skills should require the landed workflow-memory substrate."),
|
||||||
|
PlanOrchestrationState.bEverySkillRequiresWorkflowMemorySubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C plan/orchestration skills should require the landed workflow/review substrate."),
|
||||||
|
PlanOrchestrationState.bEverySkillRequiresWorkflowReviewSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C should avoid provider widening."),
|
||||||
|
PlanOrchestrationState.bNoProviderWidening
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C should avoid domain skill-pack widening."),
|
||||||
|
PlanOrchestrationState.bNoDomainSkillPackWidening
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S5-C should avoid autonomous-execution claims."),
|
||||||
|
PlanOrchestrationState.bNoAutonomousExecutionClaims
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillPlanOrchestrationSkill* WorkflowChainSkill =
|
||||||
|
HyperTwistSkillPhaseS5CTestInternal::FindSkillById(
|
||||||
|
PlanOrchestrationState,
|
||||||
|
TEXT("skill/chain-bounded-workflow")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The chain-bounded-workflow skill should exist."),
|
||||||
|
WorkflowChainSkill
|
||||||
|
);
|
||||||
|
if (WorkflowChainSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The chain-bounded-workflow skill should declare bounded workflow-chaining mode."),
|
||||||
|
WorkflowChainSkill->bChainsBoundedWorkflow
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The chain-bounded-workflow skill should depend on two landed implementation/delegation inputs."),
|
||||||
|
WorkflowChainSkill->RequiredImplementationDelegationSkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The chain-bounded-workflow skill should depend on two landed workflow-memory inputs."),
|
||||||
|
WorkflowChainSkill->RequiredWorkflowMemorySkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS5CSerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS5C.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS5CSerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillPlanOrchestrationState PlanOrchestrationState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillPlanOrchestrationState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S5-C plan/orchestration state should be structurally valid before serialization."),
|
||||||
|
PlanOrchestrationState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillPlanOrchestrationStateToJson(
|
||||||
|
PlanOrchestrationState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S5-C JSON should include the provider-widening guard field."),
|
||||||
|
Json.Contains(TEXT("bNoProviderWidening"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillPlanOrchestrationState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S5-C plan/orchestration JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillPlanOrchestrationStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S5-C plan/orchestration state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-C skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
PlanOrchestrationState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S5-C workflow-chaining count should match the original sample."),
|
||||||
|
RoundTrippedState.WorkflowChainingSkillCount,
|
||||||
|
PlanOrchestrationState.WorkflowChainingSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,208 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS6ATestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState& ProviderProfileRoutingState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillProviderProfileRoutingSkill& Skill :
|
||||||
|
ProviderProfileRoutingState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6AProviderProfileRoutingCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6A.ProviderProfileRoutingCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6AProviderProfileRoutingCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState ProviderProfileRoutingState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderProfileRoutingState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-A provider-profile/routing state should be structurally valid."),
|
||||||
|
ProviderProfileRoutingState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-A should expose three bounded provider-profile/routing skills."),
|
||||||
|
ProviderProfileRoutingState.SkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-A should expose one provider-profile inspection skill."),
|
||||||
|
ProviderProfileRoutingState.ProviderProfileInspectionSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-A should expose one BYOK-profile setup skill."),
|
||||||
|
ProviderProfileRoutingState.ByokProfileSetupSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-A should expose one provider-routing diagnostic skill."),
|
||||||
|
ProviderProfileRoutingState.RoutingDiagnosticSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingSkill* InspectSkill =
|
||||||
|
HyperTwistSkillPhaseS6ATestInternal::FindSkillById(
|
||||||
|
ProviderProfileRoutingState,
|
||||||
|
TEXT("skill/inspect-provider-profile")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The inspect-provider-profile skill should exist."),
|
||||||
|
InspectSkill
|
||||||
|
);
|
||||||
|
if (InspectSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The inspect-provider-profile skill should bind to the first-party provider-profile inspection service."),
|
||||||
|
InspectSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/inspect-provider-profile"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The inspect-provider-profile skill should declare provider-profile inspection mode."),
|
||||||
|
InspectSkill->bInspectsProviderProfile
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6ACustomEndpointAcceptanceGateTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6A.CustomEndpointAcceptanceGate",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6ACustomEndpointAcceptanceGateTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState ProviderProfileRoutingState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderProfileRoutingState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-A provider-profile/routing state should be structurally valid."),
|
||||||
|
ProviderProfileRoutingState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-A should keep OpenAI-compatible custom endpoints first-class."),
|
||||||
|
ProviderProfileRoutingState.bOpenAiCompatibleCustomEndpointsRemainFirstClass
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-A should preserve user-labeled BYOK profile support."),
|
||||||
|
ProviderProfileRoutingState.bUserLabeledByokProfilesRemainSupported
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-A should preserve provider neutrality."),
|
||||||
|
ProviderProfileRoutingState.bProviderNeutralityRemainsPreserved
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-A should avoid provider-specific overlay widening."),
|
||||||
|
ProviderProfileRoutingState.bNoProviderSpecificOverlayWidening
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingSkill* DiagnoseSkill =
|
||||||
|
HyperTwistSkillPhaseS6ATestInternal::FindSkillById(
|
||||||
|
ProviderProfileRoutingState,
|
||||||
|
TEXT("skill/diagnose-provider-routing")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The diagnose-provider-routing skill should exist."),
|
||||||
|
DiagnoseSkill
|
||||||
|
);
|
||||||
|
if (DiagnoseSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The diagnose-provider-routing skill should depend on the landed provider wrapper."),
|
||||||
|
DiagnoseSkill->RequiredAnalyzerWrapperSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The diagnose-provider-routing skill should declare routing-diagnostic mode."),
|
||||||
|
DiagnoseSkill->bDiagnosesRouting
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The diagnose-provider-routing skill should preserve the custom-endpoint acceptance gate."),
|
||||||
|
DiagnoseSkill->bPreservesOpenAiCompatibleCustomEndpointFirstClass
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6ASerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6A.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6ASerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderProfileRoutingState ProviderProfileRoutingState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderProfileRoutingState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-A provider-profile/routing state should be structurally valid before serialization."),
|
||||||
|
ProviderProfileRoutingState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillProviderProfileRoutingStateToJson(
|
||||||
|
ProviderProfileRoutingState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S6-A JSON should include the custom-endpoint acceptance field."),
|
||||||
|
Json.Contains(TEXT("bOpenAiCompatibleCustomEndpointsRemainFirstClass"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillProviderProfileRoutingState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S6-A provider-profile/routing JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillProviderProfileRoutingStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S6-A provider-profile/routing state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S6-A skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
ProviderProfileRoutingState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S6-A routing-diagnostic count should match the original sample."),
|
||||||
|
RoundTrippedState.RoutingDiagnosticSkillCount,
|
||||||
|
ProviderProfileRoutingState.RoutingDiagnosticSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,204 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS6BTestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState& AuditState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillProviderUsageOperationsAuditSkill& Skill :
|
||||||
|
AuditState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6BUsageOperationsAuditCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6B.UsageOperationsAuditCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6BUsageOperationsAuditCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState AuditState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderUsageOperationsAuditState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-B usage/operations audit state should be structurally valid."),
|
||||||
|
AuditState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-B should expose three bounded provider usage/operations audit skills."),
|
||||||
|
AuditState.SkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-B should expose one usage-audit skill."),
|
||||||
|
AuditState.UsageAuditSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-B should expose one topology-inspection skill."),
|
||||||
|
AuditState.TopologyInspectionSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S6-B should expose one route/service diagnostic skill."),
|
||||||
|
AuditState.RouteServiceDiagnosticSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditSkill* UsageAuditSkill =
|
||||||
|
HyperTwistSkillPhaseS6BTestInternal::FindSkillById(
|
||||||
|
AuditState,
|
||||||
|
TEXT("skill/audit-provider-usage")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The audit-provider-usage skill should exist."),
|
||||||
|
UsageAuditSkill
|
||||||
|
);
|
||||||
|
if (UsageAuditSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The audit-provider-usage skill should bind to the first-party provider-usage audit service."),
|
||||||
|
UsageAuditSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/audit-provider-usage"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The audit-provider-usage skill should declare usage-audit mode."),
|
||||||
|
UsageAuditSkill->bAuditsUsage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6BNormalizedStateAcceptanceGateTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6B.NormalizedStateAcceptanceGate",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6BNormalizedStateAcceptanceGateTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState AuditState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderUsageOperationsAuditState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-B usage/operations audit state should be structurally valid."),
|
||||||
|
AuditState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-B should ensure every live skill reads normalized first-party state."),
|
||||||
|
AuditState.bEveryLiveSkillReadsNormalizedFirstPartyState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-B should preserve normalized first-party accounting ownership."),
|
||||||
|
AuditState.bNormalizedFirstPartyAccountingOwnershipPreserved
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-B should avoid settlement-execution widening."),
|
||||||
|
AuditState.bNoSettlementExecutionWidening
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S6-B should avoid provider-portal widening."),
|
||||||
|
AuditState.bNoProviderPortalWidening
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditSkill* RouteServiceSkill =
|
||||||
|
HyperTwistSkillPhaseS6BTestInternal::FindSkillById(
|
||||||
|
AuditState,
|
||||||
|
TEXT("skill/diagnose-route-service")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The diagnose-route-service skill should exist."),
|
||||||
|
RouteServiceSkill
|
||||||
|
);
|
||||||
|
if (RouteServiceSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The diagnose-route-service skill should depend on the three landed S6-A provider-profile/routing skills."),
|
||||||
|
RouteServiceSkill->RequiredProviderProfileRoutingSkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The diagnose-route-service skill should declare route/service diagnostic mode."),
|
||||||
|
RouteServiceSkill->bDiagnosesRouteService
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS6BSerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS6B.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS6BSerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillProviderUsageOperationsAuditState AuditState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillProviderUsageOperationsAuditState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S6-B usage/operations audit state should be structurally valid before serialization."),
|
||||||
|
AuditState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillProviderUsageOperationsAuditStateToJson(
|
||||||
|
AuditState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S6-B JSON should include the normalized-first-party-state field."),
|
||||||
|
Json.Contains(TEXT("bEveryLiveSkillReadsNormalizedFirstPartyState"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillProviderUsageOperationsAuditState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S6-B usage/operations audit JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillProviderUsageOperationsAuditStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S6-B usage/operations audit state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S6-B skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
AuditState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S6-B route/service diagnostic count should match the original sample."),
|
||||||
|
RoundTrippedState.RouteServiceDiagnosticSkillCount,
|
||||||
|
AuditState.RouteServiceDiagnosticSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,220 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS7ATestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState& FrameworkState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillDomainPackFrameworkSkill& Skill :
|
||||||
|
FrameworkState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7ADomainPackFrameworkCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7A.DomainPackFrameworkCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7ADomainPackFrameworkCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState FrameworkState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillDomainPackFrameworkState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-A domain-pack framework state should be structurally valid."),
|
||||||
|
FrameworkState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-A should expose two bounded domain-pack framework skills."),
|
||||||
|
FrameworkState.SkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-A should expose one packaging-rules skill."),
|
||||||
|
FrameworkState.PackagingRuleSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-A should expose one enable/disable-grouping skill."),
|
||||||
|
FrameworkState.EnableDisableGroupingSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkSkill* PackagingSkill =
|
||||||
|
HyperTwistSkillPhaseS7ATestInternal::FindSkillById(
|
||||||
|
FrameworkState,
|
||||||
|
TEXT("skill/specify-domain-packaging")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-packaging skill should exist."),
|
||||||
|
PackagingSkill
|
||||||
|
);
|
||||||
|
if (PackagingSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-packaging skill should bind to the first-party domain-packaging service."),
|
||||||
|
PackagingSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/specify-domain-packaging"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The specify-domain-packaging skill should declare packaging-rules mode."),
|
||||||
|
PackagingSkill->bSpecifiesPackagingRules
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7ABoundedFrameworkSafetyTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7A.BoundedFrameworkSafety",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7ABoundedFrameworkSafetyTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState FrameworkState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillDomainPackFrameworkState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-A domain-pack framework state should be structurally valid."),
|
||||||
|
FrameworkState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-A skill should read authoritative skill and framework state."),
|
||||||
|
FrameworkState.bEveryLiveSkillReadsAuthoritativeSkillAndFrameworkState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-A skill should keep validation-harness coverage."),
|
||||||
|
FrameworkState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A domain-pack framework skills should remain structurally bounded."),
|
||||||
|
FrameworkState.bDomainPackFrameworkRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A domain-pack framework skills should require the landed plan/orchestration substrate."),
|
||||||
|
FrameworkState.bEverySkillRequiresPlanOrchestrationSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A domain-pack framework skills should require the landed provider usage/ops audit substrate."),
|
||||||
|
FrameworkState.bEverySkillRequiresProviderUsageOperationsAuditSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A should preserve placeholder domain-pack deferral."),
|
||||||
|
FrameworkState.bPlaceholderDomainPackDeferralRemainsPreserved
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A should avoid retained domain-pack claims."),
|
||||||
|
FrameworkState.bNoRetainedDomainPackClaims
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-A should avoid creative/media widening."),
|
||||||
|
FrameworkState.bNoCreativeMediaWidening
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkSkill* GroupingSkill =
|
||||||
|
HyperTwistSkillPhaseS7ATestInternal::FindSkillById(
|
||||||
|
FrameworkState,
|
||||||
|
TEXT("skill/specify-domain-pack-grouping")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The specify-domain-pack-grouping skill should exist."),
|
||||||
|
GroupingSkill
|
||||||
|
);
|
||||||
|
if (GroupingSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The specify-domain-pack-grouping skill should declare enable/disable-grouping mode."),
|
||||||
|
GroupingSkill->bSpecifiesEnableDisableGrouping
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-pack-grouping skill should depend on two landed plan/orchestration inputs."),
|
||||||
|
GroupingSkill->RequiredPlanOrchestrationSkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The specify-domain-pack-grouping skill should depend on three landed provider usage/ops audit inputs."),
|
||||||
|
GroupingSkill->RequiredProviderUsageAuditSkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7ASerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7A.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7ASerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillDomainPackFrameworkState FrameworkState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillDomainPackFrameworkState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-A domain-pack framework state should be structurally valid before serialization."),
|
||||||
|
FrameworkState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillDomainPackFrameworkStateToJson(
|
||||||
|
FrameworkState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S7-A JSON should include the retained-domain-pack guard field."),
|
||||||
|
Json.Contains(TEXT("bNoRetainedDomainPackClaims"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillDomainPackFrameworkState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S7-A domain-pack framework JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillDomainPackFrameworkStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S7-A domain-pack framework state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-A skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
FrameworkState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-A enable/disable-grouping count should match the original sample."),
|
||||||
|
RoundTrippedState.EnableDisableGroupingSkillCount,
|
||||||
|
FrameworkState.EnableDisableGroupingSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS7BTestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillRetainedDomainPackSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState& PackState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillRetainedDomainPackSkill& Skill :
|
||||||
|
PackState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7BRetainedDomainPackCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7B.RetainedDomainPackCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7BRetainedDomainPackCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillRetainedDomainPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-B retained-domain-pack state should be structurally valid."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-B should expose three bounded retained domain-pack skills."),
|
||||||
|
PackState.SkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-B should expose one training/replay review pack skill."),
|
||||||
|
PackState.TrainingReplayPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-B should expose one curriculum/content pack skill."),
|
||||||
|
PackState.CurriculumContentPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-B should expose one media/export pack skill."),
|
||||||
|
PackState.MediaExportPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillRetainedDomainPackSkill* TrainingReplayPackSkill =
|
||||||
|
HyperTwistSkillPhaseS7BTestInternal::FindSkillById(
|
||||||
|
PackState,
|
||||||
|
TEXT("skill/review-training-replay-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The review-training-replay-pack skill should exist."),
|
||||||
|
TrainingReplayPackSkill
|
||||||
|
);
|
||||||
|
if (TrainingReplayPackSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The review-training-replay-pack skill should bind to the first-party retained training/replay pack service."),
|
||||||
|
TrainingReplayPackSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/review-training-replay-pack"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The review-training-replay-pack skill should declare training/replay pack mode."),
|
||||||
|
TrainingReplayPackSkill->bReadsTrainingReplayState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7BBoundedRetainedPackSafetyTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7B.BoundedRetainedPackSafety",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7BBoundedRetainedPackSafetyTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillRetainedDomainPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-B retained-domain-pack state should be structurally valid."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-B skill should read authoritative first-party domain state."),
|
||||||
|
PackState.bEveryLiveSkillReadsAuthoritativeFirstPartyDomainState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-B skill should keep validation-harness coverage."),
|
||||||
|
PackState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-B retained domain packs should remain structurally bounded."),
|
||||||
|
PackState.bRetainedDomainPackLayerRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-B retained domain packs should require the landed domain-pack framework substrate."),
|
||||||
|
PackState.bEverySkillRequiresDomainPackFrameworkSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-B retained pack claims should remain first-party grounded."),
|
||||||
|
PackState.bRetainedPackClaimsRemainFirstPartyGrounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-B should preserve deferral for unlanded packs."),
|
||||||
|
PackState.bUnlandedPackDeferralRemainsPreserved
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-B should avoid creative adjunct widening."),
|
||||||
|
PackState.bNoCreativeAdjunctWidening
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillRetainedDomainPackSkill* MediaExportPackSkill =
|
||||||
|
HyperTwistSkillPhaseS7BTestInternal::FindSkillById(
|
||||||
|
PackState,
|
||||||
|
TEXT("skill/prepare-media-export-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The prepare-media-export-pack skill should exist."),
|
||||||
|
MediaExportPackSkill
|
||||||
|
);
|
||||||
|
if (MediaExportPackSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The prepare-media-export-pack skill should declare media/export pack mode."),
|
||||||
|
MediaExportPackSkill->bReadsMediaExportState
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The prepare-media-export-pack skill should depend on two landed domain-pack framework inputs."),
|
||||||
|
MediaExportPackSkill->RequiredDomainPackFrameworkSkillCount,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7BSerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7B.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7BSerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillRetainedDomainPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillRetainedDomainPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-B retained-domain-pack state should be structurally valid before serialization."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillRetainedDomainPackStateToJson(
|
||||||
|
PackState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S7-B JSON should include the creative-adjunct guard field."),
|
||||||
|
Json.Contains(TEXT("bNoCreativeAdjunctWidening"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillRetainedDomainPackState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S7-B retained-domain-pack JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillRetainedDomainPackStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S7-B retained-domain-pack state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-B skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
PackState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-B media/export pack count should match the original sample."),
|
||||||
|
RoundTrippedState.MediaExportPackSkillCount,
|
||||||
|
PackState.MediaExportPackSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistBootstrap/HyperTwistContractLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
namespace HyperTwistSkillPhaseS7CTestInternal
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillCreativeMediaPackSkill* FindSkillById(
|
||||||
|
const FHyperTwistSkillCreativeMediaPackState& PackState,
|
||||||
|
const FString& SkillId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const FHyperTwistSkillCreativeMediaPackSkill& Skill :
|
||||||
|
PackState.Skills)
|
||||||
|
{
|
||||||
|
if (Skill.SkillId == SkillId)
|
||||||
|
{
|
||||||
|
return &Skill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7CCreativeMediaPackCoverageTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7C.CreativeMediaPackCoverage",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7CCreativeMediaPackCoverageTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillCreativeMediaPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillCreativeMediaPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-C creative/media-pack state should be structurally valid."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-C should expose three bounded optional creative/media pack skills."),
|
||||||
|
PackState.SkillCount,
|
||||||
|
3
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-C should expose one replay-explainer pack skill."),
|
||||||
|
PackState.ReplayExplainerPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-C should expose one media-parser pack skill."),
|
||||||
|
PackState.MediaParserPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("S7-C should expose one shared-fixture pack skill."),
|
||||||
|
PackState.SharedFixturePackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillCreativeMediaPackSkill* ReplayExplainerPackSkill =
|
||||||
|
HyperTwistSkillPhaseS7CTestInternal::FindSkillById(
|
||||||
|
PackState,
|
||||||
|
TEXT("skill/compose-replay-explainer-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should exist."),
|
||||||
|
ReplayExplainerPackSkill
|
||||||
|
);
|
||||||
|
if (ReplayExplainerPackSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should bind to the first-party replay-explainer pack service."),
|
||||||
|
ReplayExplainerPackSkill->ServiceBindingId,
|
||||||
|
FString(TEXT("service/skills/compose-replay-explainer-pack"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The compose-replay-explainer-pack skill should declare replay-explainer mode."),
|
||||||
|
ReplayExplainerPackSkill->bReadsReplayExplainerState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7CCreativeMediaPackSafetyTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7C.CreativeMediaPackSafety",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7CCreativeMediaPackSafetyTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillCreativeMediaPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillCreativeMediaPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-C creative/media-pack state should be structurally valid."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-C skill should read authoritative first-party creative/media state."),
|
||||||
|
PackState.bEveryLiveSkillReadsAuthoritativeFirstPartyCreativeMediaState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Every live S7-C skill should keep validation-harness coverage."),
|
||||||
|
PackState.bEveryLiveSkillHasValidationHarnessCoverage
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-C creative/media packs should remain structurally bounded."),
|
||||||
|
PackState.bCreativeMediaPackLayerRemainsBounded
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-C creative/media packs should require the landed retained-domain-pack substrate."),
|
||||||
|
PackState.bEverySkillRequiresRetainedDomainPackSubstrate
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-C should keep creative/media adjuncts optional."),
|
||||||
|
PackState.bCreativeMediaAdjunctsRemainOptional
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-C should avoid core runtime promotion."),
|
||||||
|
PackState.bNoCoreRuntimePromotion
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("S7-C should keep boundary-sensitive licensing explicit."),
|
||||||
|
PackState.bBoundarySensitiveLicensingRemainsExplicit
|
||||||
|
);
|
||||||
|
|
||||||
|
const FHyperTwistSkillCreativeMediaPackSkill* SharedFixturePackSkill =
|
||||||
|
HyperTwistSkillPhaseS7CTestInternal::FindSkillById(
|
||||||
|
PackState,
|
||||||
|
TEXT("skill/curate-shared-fixture-pack")
|
||||||
|
);
|
||||||
|
TestNotNull(
|
||||||
|
TEXT("The curate-shared-fixture-pack skill should exist."),
|
||||||
|
SharedFixturePackSkill
|
||||||
|
);
|
||||||
|
if (SharedFixturePackSkill != nullptr)
|
||||||
|
{
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The curate-shared-fixture-pack skill should declare shared-fixture mode."),
|
||||||
|
SharedFixturePackSkill->bReadsSharedFixtureState
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The curate-shared-fixture-pack skill should depend on one landed retained-domain-pack input."),
|
||||||
|
SharedFixturePackSkill->RequiredRetainedDomainPackSkillCount,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistSkillPhaseS7CSerializationRoundTripTest,
|
||||||
|
"HyperTwist.FirstParty.Skill.PhaseS7C.SerializationRoundTrip",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistSkillPhaseS7CSerializationRoundTripTest::RunTest(
|
||||||
|
const FString& Parameters
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const FHyperTwistSkillCreativeMediaPackState PackState =
|
||||||
|
UHyperTwistContractLibrary::MakeSampleSkillCreativeMediaPackState();
|
||||||
|
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The sample S7-C creative/media-pack state should be structurally valid before serialization."),
|
||||||
|
PackState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
|
||||||
|
const FString Json =
|
||||||
|
UHyperTwistContractLibrary::SerializeSkillCreativeMediaPackStateToJson(
|
||||||
|
PackState
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Serialized S7-C JSON should include the core-runtime guard field."),
|
||||||
|
Json.Contains(TEXT("bNoCoreRuntimePromotion"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistSkillCreativeMediaPackState RoundTrippedState;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Deserializing the S7-C creative/media-pack JSON should succeed."),
|
||||||
|
UHyperTwistContractLibrary::DeserializeSkillCreativeMediaPackStateFromJson(
|
||||||
|
Json,
|
||||||
|
RoundTrippedState
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("Round-tripped S7-C creative/media-pack state should remain structurally valid."),
|
||||||
|
RoundTrippedState.IsStructurallyValid()
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-C skill count should match the original sample."),
|
||||||
|
RoundTrippedState.SkillCount,
|
||||||
|
PackState.SkillCount
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("Round-tripped S7-C shared-fixture pack count should match the original sample."),
|
||||||
|
RoundTrippedState.SharedFixturePackSkillCount,
|
||||||
|
PackState.SharedFixturePackSkillCount
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAACompositeStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAA.CompositeStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAACompositeStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCompositeStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation composite-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCompositeStatePacketContract(
|
||||||
|
TEXT("validation-composite-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation composite-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-composite-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation composite-state packet contract must preserve benchmark-drift composite packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("composite-state-packet/benchmark-drift-composite"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation composite-state packet contract must preserve the bounded composite-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded composite-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation composite-state packet contract must preserve the no-generic-composite-state-platform guard."),
|
||||||
|
Contract.CompositeGuardTags.Contains(TEXT("no-generic-composite-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation composite-state packet contract must keep generic composite-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic composite-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAAOngoingStateSynthesisBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAA.OngoingStateSyntheses",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAAOngoingStateSynthesisBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateSynthesisBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateSynthesisBoundary(
|
||||||
|
TEXT("validation-ongoing-state-synthesis-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-synthesis-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary must preserve manual-waiver syntheses."),
|
||||||
|
Boundary.SynthesisIds.Contains(TEXT("ongoing-synthesis/manual-waiver-synthesized"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary must preserve the bounded ongoing-state synthesis surface."),
|
||||||
|
Boundary.SynthesisSurfaceTags.Contains(TEXT("bounded ongoing-state synthesis"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary must preserve the no-generic-ongoing-synthesis-platform guard."),
|
||||||
|
Boundary.SynthesisGuardTags.Contains(TEXT("no-generic-ongoing-synthesis-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state synthesis boundary must keep generic ongoing synthesis platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing synthesis platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJABAggregatedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAB.AggregatedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJABAggregatedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationAggregatedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation aggregated-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationAggregatedStateLedgerContract(
|
||||||
|
TEXT("validation-aggregated-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation aggregated-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-aggregated-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation aggregated-state ledger contract must preserve benchmark-drift aggregated entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("aggregated-state-ledger/benchmark-drift-aggregated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation aggregated-state ledger contract must preserve the bounded aggregated-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded aggregated-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation aggregated-state ledger contract must preserve the no-generic-aggregated-state-platform guard."),
|
||||||
|
Contract.AggregatedGuardTags.Contains(TEXT("no-generic-aggregated-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation aggregated-state ledger contract must keep generic aggregated-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic aggregated-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJABOngoingStateConsolidationBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAB.OngoingStateConsolidations",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJABOngoingStateConsolidationBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateConsolidationBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateConsolidationBoundary(
|
||||||
|
TEXT("validation-ongoing-state-consolidation-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-consolidation-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary must preserve manual-waiver consolidations."),
|
||||||
|
Boundary.ConsolidationIds.Contains(TEXT("ongoing-consolidation/manual-waiver-consolidated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary must preserve the bounded ongoing-state consolidation surface."),
|
||||||
|
Boundary.ConsolidationSurfaceTags.Contains(TEXT("bounded ongoing-state consolidation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary must preserve the no-generic-ongoing-consolidation-platform guard."),
|
||||||
|
Boundary.ConsolidationGuardTags.Contains(TEXT("no-generic-ongoing-consolidation-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state consolidation boundary must keep generic ongoing consolidation platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing consolidation platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAReplayIntegrityContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJA.ReplayIntegrity",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAReplayIntegrityContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingReplayIntegrityContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The replay-integrity contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledReplayIntegrityContract(
|
||||||
|
TEXT("validation-replay-integrity-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The replay-integrity contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-replay-integrity-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The replay-integrity contract must preserve the timer-start anchor."),
|
||||||
|
Contract.RequiredAnchorIds.Contains(TEXT("replay-anchor/timer-start"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The replay-integrity contract must preserve the timer-start before solve-end guard."),
|
||||||
|
Contract.IntegrityGuardTags.Contains(TEXT("timer-start before solve-end guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The replay-integrity contract must preserve imported-source sparse-anchor tolerance."),
|
||||||
|
Contract.ImportedReplayToleranceTags.Contains(TEXT("imported-source sparse-anchor tolerance"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The replay-integrity contract must keep generic media timeline ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic media timeline ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAPuzzleValidationAndBenchmarkProfileTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJA.PuzzleValidationAndBenchmarkProfiles",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAPuzzleValidationAndBenchmarkProfileTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingPuzzleValidationContract PuzzleContract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The puzzle-validation contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledPuzzleValidationContract(
|
||||||
|
TEXT("validation-puzzle-state-contract"),
|
||||||
|
PuzzleContract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The puzzle-validation contract must preserve solvability verification."),
|
||||||
|
PuzzleContract.ValidationSurfaceTags.Contains(TEXT("solvability verification"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The puzzle-validation contract must preserve the is-solvable validation flag."),
|
||||||
|
PuzzleContract.RequiredResultFlags.Contains(TEXT("validation-flag/is-solvable"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The puzzle-validation contract must keep external oracle replacement ownership excluded."),
|
||||||
|
PuzzleContract.ExplicitExclusions.Contains(TEXT("external oracle replacement ownership"))
|
||||||
|
);
|
||||||
|
|
||||||
|
FHyperTwistTrainingBenchmarkProfileBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark-profile boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledBenchmarkProfileBoundary(
|
||||||
|
TEXT("validation-benchmark-profile-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark-profile boundary must preserve the replay-review-integrity profile."),
|
||||||
|
Boundary.BenchmarkProfileIds.Contains(TEXT("benchmark-profile/replay-review-integrity"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark-profile boundary must preserve comparison repeatability posture."),
|
||||||
|
Boundary.MetricSurfaceTags.Contains(TEXT("comparison repeatability posture"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The benchmark-profile boundary must keep public benchmark ladder ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("public benchmark ladder ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAScorecardContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJA.Scorecards",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAScorecardContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationScorecardContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation-scorecard contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationScorecardContract(
|
||||||
|
TEXT("validation-scorecard-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation-scorecard contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-scorecard-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation-scorecard contract must preserve the regression-watch section."),
|
||||||
|
Contract.ScorecardSectionIds.Contains(TEXT("scorecard/regression-watch"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation-scorecard contract must preserve benchmark drift note framing."),
|
||||||
|
Contract.OutcomeSurfaceTags.Contains(TEXT("benchmark drift note"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation-scorecard contract must preserve anchor coverage regression."),
|
||||||
|
Contract.RegressionSignalTags.Contains(TEXT("anchor coverage regression"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation-scorecard contract must keep cross-product release gate authority excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("cross-product release gate authority"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJACIntegratedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAC.IntegratedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJACIntegratedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationIntegratedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation integrated-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationIntegratedStatePacketContract(
|
||||||
|
TEXT("validation-integrated-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation integrated-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-integrated-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation integrated-state packet contract must preserve benchmark-drift integrated packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("integrated-state-packet/benchmark-drift-integrated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation integrated-state packet contract must preserve the bounded integrated-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded integrated-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation integrated-state packet contract must preserve the no-generic-integrated-state-platform guard."),
|
||||||
|
Contract.IntegratedGuardTags.Contains(TEXT("no-generic-integrated-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation integrated-state packet contract must keep generic integrated-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic integrated-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJACOngoingStateUnificationBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAC.OngoingStateUnifications",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJACOngoingStateUnificationBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateUnificationBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state unification boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateUnificationBoundary(
|
||||||
|
TEXT("validation-ongoing-state-unification-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state unification boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-unification-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state unification boundary must preserve manual-waiver unifications."),
|
||||||
|
Boundary.UnificationIds.Contains(TEXT("ongoing-unification/manual-waiver-unified"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state unification boundary must preserve the bounded ongoing-state unification surface."),
|
||||||
|
Boundary.UnificationSurfaceTags.Contains(TEXT("bounded ongoing-state unification"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state unification boundary must preserve the no-generic-ongoing-unification-platform guard."),
|
||||||
|
Boundary.UnificationGuardTags.Contains(TEXT("no-generic-ongoing-unification-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state unification boundary must keep generic ongoing unification platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing unification platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJADFusedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAD.FusedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJADFusedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationFusedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fused-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationFusedStateLedgerContract(
|
||||||
|
TEXT("validation-fused-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation fused-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-fused-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fused-state ledger contract must preserve benchmark-drift fused entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("fused-state-ledger/benchmark-drift-fused"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fused-state ledger contract must preserve the bounded fused-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded fused-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fused-state ledger contract must preserve the no-generic-fused-state-platform guard."),
|
||||||
|
Contract.FusedGuardTags.Contains(TEXT("no-generic-fused-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fused-state ledger contract must keep generic fused-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic fused-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJADOngoingStateCoherenceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAD.OngoingStateCoherences",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJADOngoingStateCoherenceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCoherenceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCoherenceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-coherence-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-coherence-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary must preserve manual-waiver coherences."),
|
||||||
|
Boundary.CoherenceIds.Contains(TEXT("ongoing-coherence/manual-waiver-coherent"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary must preserve the bounded ongoing-state coherence surface."),
|
||||||
|
Boundary.CoherenceSurfaceTags.Contains(TEXT("bounded ongoing-state coherence"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary must preserve the no-generic-ongoing-coherence-platform guard."),
|
||||||
|
Boundary.CoherenceGuardTags.Contains(TEXT("no-generic-ongoing-coherence-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state coherence boundary must keep generic ongoing coherence platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing coherence platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAEMergedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAE.MergedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAEMergedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationMergedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merged-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationMergedStatePacketContract(
|
||||||
|
TEXT("validation-merged-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation merged-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-merged-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merged-state packet contract must preserve benchmark-drift merged packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("merged-state-packet/benchmark-drift-merged"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merged-state packet contract must preserve the bounded merged-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded merged-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merged-state packet contract must preserve the no-generic-merged-state-platform guard."),
|
||||||
|
Contract.MergedGuardTags.Contains(TEXT("no-generic-merged-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merged-state packet contract must keep generic merged-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic merged-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAEOngoingStateConcordanceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAE.OngoingStateConcordances",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAEOngoingStateConcordanceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateConcordanceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateConcordanceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-concordance-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-concordance-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary must preserve manual-waiver concordances."),
|
||||||
|
Boundary.ConcordanceIds.Contains(TEXT("ongoing-concordance/manual-waiver-concordant"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary must preserve the bounded ongoing-state concordance surface."),
|
||||||
|
Boundary.ConcordanceSurfaceTags.Contains(TEXT("bounded ongoing-state concordance"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary must preserve the no-generic-ongoing-concordance-platform guard."),
|
||||||
|
Boundary.ConcordanceGuardTags.Contains(TEXT("no-generic-ongoing-concordance-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state concordance boundary must keep generic ongoing concordance platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing concordance platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAFBlendedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAF.BlendedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAFBlendedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationBlendedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation blended-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationBlendedStateLedgerContract(
|
||||||
|
TEXT("validation-blended-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation blended-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-blended-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation blended-state ledger contract must preserve benchmark-drift blended entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("blended-state-ledger/benchmark-drift-blended"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation blended-state ledger contract must preserve the bounded blended-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded blended-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation blended-state ledger contract must preserve the no-generic-blended-state-platform guard."),
|
||||||
|
Contract.BlendedGuardTags.Contains(TEXT("no-generic-blended-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation blended-state ledger contract must keep generic blended-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic blended-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAFOngoingStateCorrespondenceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAF.OngoingStateCorrespondences",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAFOngoingStateCorrespondenceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCorrespondenceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCorrespondenceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-correspondence-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-correspondence-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary must preserve manual-waiver correspondences."),
|
||||||
|
Boundary.CorrespondenceIds.Contains(TEXT("ongoing-correspondence/manual-waiver-correspondent"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary must preserve the bounded ongoing-state correspondence surface."),
|
||||||
|
Boundary.CorrespondenceSurfaceTags.Contains(TEXT("bounded ongoing-state correspondence"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary must preserve the no-generic-ongoing-correspondence-platform guard."),
|
||||||
|
Boundary.CorrespondenceGuardTags.Contains(TEXT("no-generic-ongoing-correspondence-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state correspondence boundary must keep generic ongoing correspondence platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing correspondence platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAGInterlacedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAG.InterlacedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAGInterlacedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationInterlacedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation interlaced-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationInterlacedStatePacketContract(
|
||||||
|
TEXT("validation-interlaced-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation interlaced-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-interlaced-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation interlaced-state packet contract must preserve benchmark-drift interlaced packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("interlaced-state-packet/benchmark-drift-interlaced"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation interlaced-state packet contract must preserve the bounded interlaced-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded interlaced-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation interlaced-state packet contract must preserve the no-generic-interlaced-state-platform guard."),
|
||||||
|
Contract.InterlacedGuardTags.Contains(TEXT("no-generic-interlaced-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation interlaced-state packet contract must keep generic interlaced-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic interlaced-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAGOngoingStateAffinityBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAG.OngoingStateAffinities",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAGOngoingStateAffinityBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateAffinityBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateAffinityBoundary(
|
||||||
|
TEXT("validation-ongoing-state-affinity-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-affinity-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary must preserve manual-waiver affinities."),
|
||||||
|
Boundary.AffinityIds.Contains(TEXT("ongoing-affinity/manual-waiver-affined"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary must preserve the bounded ongoing-state affinity surface."),
|
||||||
|
Boundary.AffinitySurfaceTags.Contains(TEXT("bounded ongoing-state affinity"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary must preserve the no-generic-ongoing-affinity-platform guard."),
|
||||||
|
Boundary.AffinityGuardTags.Contains(TEXT("no-generic-ongoing-affinity-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state affinity boundary must keep generic ongoing affinity platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing affinity platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAHWovenStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAH.WovenStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAHWovenStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationWovenStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation woven-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationWovenStateLedgerContract(
|
||||||
|
TEXT("validation-woven-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation woven-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-woven-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation woven-state ledger contract must preserve benchmark-drift woven entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("woven-state-ledger/benchmark-drift-woven"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation woven-state ledger contract must preserve the bounded woven-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded woven-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation woven-state ledger contract must preserve the no-generic-woven-state-platform guard."),
|
||||||
|
Contract.WovenGuardTags.Contains(TEXT("no-generic-woven-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation woven-state ledger contract must keep generic woven-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic woven-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAHOngoingStateResonanceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAH.OngoingStateResonances",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAHOngoingStateResonanceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateResonanceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateResonanceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-resonance-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-resonance-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary must preserve manual-waiver resonances."),
|
||||||
|
Boundary.ResonanceIds.Contains(TEXT("ongoing-resonance/manual-waiver-resonant"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary must preserve the bounded ongoing-state resonance surface."),
|
||||||
|
Boundary.ResonanceSurfaceTags.Contains(TEXT("bounded ongoing-state resonance"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary must preserve the no-generic-ongoing-resonance-platform guard."),
|
||||||
|
Boundary.ResonanceGuardTags.Contains(TEXT("no-generic-ongoing-resonance-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state resonance boundary must keep generic ongoing resonance platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing resonance platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAIKnottedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAI.KnottedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAIKnottedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationKnottedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation knotted-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationKnottedStatePacketContract(
|
||||||
|
TEXT("validation-knotted-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation knotted-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-knotted-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation knotted-state packet contract must preserve benchmark-drift knotted packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("knotted-state-packet/benchmark-drift-knotted"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation knotted-state packet contract must preserve the bounded knotted-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded knotted-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation knotted-state packet contract must preserve the no-generic-knotted-state-platform guard."),
|
||||||
|
Contract.KnottedGuardTags.Contains(TEXT("no-generic-knotted-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation knotted-state packet contract must keep generic knotted-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic knotted-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAIOngoingStateHarmonicBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAI.OngoingStateHarmonics",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAIOngoingStateHarmonicBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateHarmonicBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateHarmonicBoundary(
|
||||||
|
TEXT("validation-ongoing-state-harmonic-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-harmonic-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary must preserve manual-waiver harmonics."),
|
||||||
|
Boundary.HarmonicIds.Contains(TEXT("ongoing-harmonic/manual-waiver-harmonic"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary must preserve the bounded ongoing-state harmonic surface."),
|
||||||
|
Boundary.HarmonicSurfaceTags.Contains(TEXT("bounded ongoing-state harmonic"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary must preserve the no-generic-ongoing-harmonic-platform guard."),
|
||||||
|
Boundary.HarmonicGuardTags.Contains(TEXT("no-generic-ongoing-harmonic-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state harmonic boundary must keep generic ongoing harmonic platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing harmonic platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAJBraidedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAJ.BraidedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAJBraidedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationBraidedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation braided-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationBraidedStateLedgerContract(
|
||||||
|
TEXT("validation-braided-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation braided-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-braided-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation braided-state ledger contract must preserve benchmark-drift braided entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("braided-state-ledger/benchmark-drift-braided"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation braided-state ledger contract must preserve the bounded braided-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded braided-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation braided-state ledger contract must preserve the no-generic-braided-state-platform guard."),
|
||||||
|
Contract.BraidedGuardTags.Contains(TEXT("no-generic-braided-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation braided-state ledger contract must keep generic braided-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic braided-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAJOngoingStateCadenceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAJ.OngoingStateCadences",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAJOngoingStateCadenceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCadenceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCadenceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-cadence-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-cadence-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary must preserve manual-waiver cadences."),
|
||||||
|
Boundary.CadenceIds.Contains(TEXT("ongoing-cadence/manual-waiver-cadenced"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary must preserve the bounded ongoing-state cadence surface."),
|
||||||
|
Boundary.CadenceSurfaceTags.Contains(TEXT("bounded ongoing-state cadence"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary must preserve the no-generic-ongoing-cadence-platform guard."),
|
||||||
|
Boundary.CadenceGuardTags.Contains(TEXT("no-generic-ongoing-cadence-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state cadence boundary must keep generic ongoing cadence platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing cadence platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAKLoopedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAK.LoopedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAKLoopedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationLoopedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation looped-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationLoopedStatePacketContract(
|
||||||
|
TEXT("validation-looped-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation looped-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-looped-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation looped-state packet contract must preserve benchmark-drift looped packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("looped-state-packet/benchmark-drift-looped"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation looped-state packet contract must preserve the bounded looped-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded looped-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation looped-state packet contract must preserve the no-generic-looped-state-platform guard."),
|
||||||
|
Contract.LoopedGuardTags.Contains(TEXT("no-generic-looped-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation looped-state packet contract must keep generic looped-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic looped-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAKOngoingStateRefrainBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAK.OngoingStateRefrains",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAKOngoingStateRefrainBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateRefrainBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateRefrainBoundary(
|
||||||
|
TEXT("validation-ongoing-state-refrain-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-refrain-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary must preserve manual-waiver refrains."),
|
||||||
|
Boundary.RefrainIds.Contains(TEXT("ongoing-refrain/manual-waiver-refrained"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary must preserve the bounded ongoing-state refrain surface."),
|
||||||
|
Boundary.RefrainSurfaceTags.Contains(TEXT("bounded ongoing-state refrain"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary must preserve the no-generic-ongoing-refrain-platform guard."),
|
||||||
|
Boundary.RefrainGuardTags.Contains(TEXT("no-generic-ongoing-refrain-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state refrain boundary must keep generic ongoing refrain platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing refrain platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJALSpiraledStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAL.SpiraledStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJALSpiraledStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationSpiraledStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation spiraled-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationSpiraledStateLedgerContract(
|
||||||
|
TEXT("validation-spiraled-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation spiraled-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-spiraled-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation spiraled-state ledger contract must preserve benchmark-drift spiraled entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("spiraled-state-ledger/benchmark-drift-spiraled"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation spiraled-state ledger contract must preserve the bounded spiraled-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded spiraled-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation spiraled-state ledger contract must preserve the no-generic-spiraled-state-platform guard."),
|
||||||
|
Contract.SpiraledGuardTags.Contains(TEXT("no-generic-spiraled-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation spiraled-state ledger contract must keep generic spiraled-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic spiraled-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJALOngoingStateChorusBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAL.OngoingStateChoruses",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJALOngoingStateChorusBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateChorusBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateChorusBoundary(
|
||||||
|
TEXT("validation-ongoing-state-chorus-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-chorus-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary must preserve manual-waiver choruses."),
|
||||||
|
Boundary.ChorusIds.Contains(TEXT("ongoing-chorus/manual-waiver-chorused"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary must preserve the bounded ongoing-state chorus surface."),
|
||||||
|
Boundary.ChorusSurfaceTags.Contains(TEXT("bounded ongoing-state chorus"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary must preserve the no-generic-ongoing-chorus-platform guard."),
|
||||||
|
Boundary.ChorusGuardTags.Contains(TEXT("no-generic-ongoing-chorus-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state chorus boundary must keep generic ongoing chorus platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing chorus platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAMCoiledStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAM.CoiledStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAMCoiledStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCoiledStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation coiled-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCoiledStatePacketContract(
|
||||||
|
TEXT("validation-coiled-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation coiled-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-coiled-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation coiled-state packet contract must preserve benchmark-drift coiled packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("coiled-state-packet/benchmark-drift-coiled"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation coiled-state packet contract must preserve the bounded coiled-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded coiled-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation coiled-state packet contract must preserve the no-generic-coiled-state-platform guard."),
|
||||||
|
Contract.CoiledGuardTags.Contains(TEXT("no-generic-coiled-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation coiled-state packet contract must keep generic coiled-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic coiled-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAMOngoingStateRepriseBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAM.OngoingStateReprises",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAMOngoingStateRepriseBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateRepriseBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateRepriseBoundary(
|
||||||
|
TEXT("validation-ongoing-state-reprise-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-reprise-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary must preserve manual-waiver reprises."),
|
||||||
|
Boundary.RepriseIds.Contains(TEXT("ongoing-reprise/manual-waiver-reprised"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary must preserve the bounded ongoing-state reprise surface."),
|
||||||
|
Boundary.RepriseSurfaceTags.Contains(TEXT("bounded ongoing-state reprise"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary must preserve the no-generic-ongoing-reprise-platform guard."),
|
||||||
|
Boundary.RepriseGuardTags.Contains(TEXT("no-generic-ongoing-reprise-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reprise boundary must keep generic ongoing reprise platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing reprise platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJANHelixedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAN.HelixedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJANHelixedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationHelixedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation helixed-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationHelixedStateLedgerContract(
|
||||||
|
TEXT("validation-helixed-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation helixed-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-helixed-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation helixed-state ledger contract must preserve benchmark-drift helixed entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("helixed-state-ledger/benchmark-drift-helixed"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation helixed-state ledger contract must preserve the bounded helixed-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded helixed-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation helixed-state ledger contract must preserve the no-generic-helixed-state-platform guard."),
|
||||||
|
Contract.HelixedGuardTags.Contains(TEXT("no-generic-helixed-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation helixed-state ledger contract must keep generic helixed-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic helixed-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJANOngoingStateEchoBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAN.OngoingStateEchoes",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJANOngoingStateEchoBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateEchoBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state echo boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateEchoBoundary(
|
||||||
|
TEXT("validation-ongoing-state-echo-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state echo boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-echo-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state echo boundary must preserve manual-waiver echoes."),
|
||||||
|
Boundary.EchoIds.Contains(TEXT("ongoing-echo/manual-waiver-echoed"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state echo boundary must preserve the bounded ongoing-state echo surface."),
|
||||||
|
Boundary.EchoSurfaceTags.Contains(TEXT("bounded ongoing-state echo"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state echo boundary must preserve the no-generic-ongoing-echo-platform guard."),
|
||||||
|
Boundary.EchoGuardTags.Contains(TEXT("no-generic-ongoing-echo-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state echo boundary must keep generic ongoing echo platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing echo platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAOTwistedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAO.TwistedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAOTwistedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationTwistedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation twisted-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationTwistedStatePacketContract(
|
||||||
|
TEXT("validation-twisted-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation twisted-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-twisted-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation twisted-state packet contract must preserve benchmark-drift twisted packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("twisted-state-packet/benchmark-drift-twisted"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation twisted-state packet contract must preserve the bounded twisted-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded twisted-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation twisted-state packet contract must preserve the no-generic-twisted-state-platform guard."),
|
||||||
|
Contract.TwistedGuardTags.Contains(TEXT("no-generic-twisted-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation twisted-state packet contract must keep generic twisted-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic twisted-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAOOngoingStateReflectionBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAO.OngoingStateReflections",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAOOngoingStateReflectionBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateReflectionBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateReflectionBoundary(
|
||||||
|
TEXT("validation-ongoing-state-reflection-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-reflection-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary must preserve manual-waiver reflections."),
|
||||||
|
Boundary.ReflectionIds.Contains(TEXT("ongoing-reflection/manual-waiver-reflected"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary must preserve the bounded ongoing-state reflection surface."),
|
||||||
|
Boundary.ReflectionSurfaceTags.Contains(TEXT("bounded ongoing-state reflection"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary must preserve the no-generic-ongoing-reflection-platform guard."),
|
||||||
|
Boundary.ReflectionGuardTags.Contains(TEXT("no-generic-ongoing-reflection-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reflection boundary must keep generic ongoing reflection platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing reflection platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAPWoundStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAP.WoundStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAPWoundStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationWoundStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation wound-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationWoundStateLedgerContract(
|
||||||
|
TEXT("validation-wound-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation wound-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-wound-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation wound-state ledger contract must preserve benchmark-drift wound entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("wound-state-ledger/benchmark-drift-wound"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation wound-state ledger contract must preserve the bounded wound-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded wound-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation wound-state ledger contract must preserve the no-generic-wound-state-platform guard."),
|
||||||
|
Contract.WoundGuardTags.Contains(TEXT("no-generic-wound-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation wound-state ledger contract must keep generic wound-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic wound-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAPOngoingStateReverberationBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAP.OngoingStateReverberations",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAPOngoingStateReverberationBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateReverberationBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateReverberationBoundary(
|
||||||
|
TEXT("validation-ongoing-state-reverberation-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-reverberation-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary must preserve manual-waiver reverberations."),
|
||||||
|
Boundary.ReverberationIds.Contains(TEXT("ongoing-reverberation/manual-waiver-reverberated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary must preserve the bounded ongoing-state reverberation surface."),
|
||||||
|
Boundary.ReverberationSurfaceTags.Contains(TEXT("bounded ongoing-state reverberation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary must preserve the no-generic-ongoing-reverberation-platform guard."),
|
||||||
|
Boundary.ReverberationGuardTags.Contains(TEXT("no-generic-ongoing-reverberation-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state reverberation boundary must keep generic ongoing reverberation platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing reverberation platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAQFoldedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAQ.FoldedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAQFoldedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationFoldedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation folded-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationFoldedStatePacketContract(
|
||||||
|
TEXT("validation-folded-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation folded-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-folded-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation folded-state packet contract must preserve benchmark-drift folded packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("folded-state-packet/benchmark-drift-folded"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation folded-state packet contract must preserve the bounded folded-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded folded-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation folded-state packet contract must preserve the no-generic-folded-state-platform guard."),
|
||||||
|
Contract.FoldedGuardTags.Contains(TEXT("no-generic-folded-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation folded-state packet contract must keep generic folded-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic folded-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAQOngoingStateAftertoneBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAQ.OngoingStateAftertones",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAQOngoingStateAftertoneBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateAftertoneBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateAftertoneBoundary(
|
||||||
|
TEXT("validation-ongoing-state-aftertone-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-aftertone-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary must preserve manual-waiver aftertones."),
|
||||||
|
Boundary.AftertoneIds.Contains(TEXT("ongoing-aftertone/manual-waiver-aftertoned"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary must preserve the bounded ongoing-state aftertone surface."),
|
||||||
|
Boundary.AftertoneSurfaceTags.Contains(TEXT("bounded ongoing-state aftertone"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary must preserve the no-generic-ongoing-aftertone-platform guard."),
|
||||||
|
Boundary.AftertoneGuardTags.Contains(TEXT("no-generic-ongoing-aftertone-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state aftertone boundary must keep generic ongoing aftertone platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing aftertone platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJARCreasedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAR.CreasedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJARCreasedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCreasedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation creased-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCreasedStateLedgerContract(
|
||||||
|
TEXT("validation-creased-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation creased-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-creased-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation creased-state ledger contract must preserve benchmark-drift creased entries."),
|
||||||
|
Contract.LedgerEntryIds.Contains(TEXT("creased-state-ledger/benchmark-drift-creased"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation creased-state ledger contract must preserve the bounded creased-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded creased-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation creased-state ledger contract must preserve the no-generic-creased-state-platform guard."),
|
||||||
|
Contract.CreasedGuardTags.Contains(TEXT("no-generic-creased-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation creased-state ledger contract must keep generic creased-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic creased-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAROngoingStateResidueBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAR.OngoingStateResidues",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAROngoingStateResidueBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateResidueBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state residue boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateResidueBoundary(
|
||||||
|
TEXT("validation-ongoing-state-residue-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state residue boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-residue-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state residue boundary must preserve manual-waiver residues."),
|
||||||
|
Boundary.ResidueIds.Contains(TEXT("ongoing-residue/manual-waiver-residual"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state residue boundary must preserve the bounded ongoing-state residue surface."),
|
||||||
|
Boundary.ResidueSurfaceTags.Contains(TEXT("bounded ongoing-state residue"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state residue boundary must preserve the no-generic-ongoing-residue-platform guard."),
|
||||||
|
Boundary.ResidueGuardTags.Contains(TEXT("no-generic-ongoing-residue-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state residue boundary must keep generic ongoing residue platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing residue platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJASPleatedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAS.PleatedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJASPleatedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationPleatedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation pleated-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationPleatedStatePacketContract(
|
||||||
|
TEXT("validation-pleated-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation pleated-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-pleated-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation pleated-state packet contract must preserve benchmark-drift pleated packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("pleated-state-packet/benchmark-drift-pleated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation pleated-state packet contract must preserve the bounded pleated-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded pleated-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation pleated-state packet contract must preserve the no-generic-pleated-state-platform guard."),
|
||||||
|
Contract.PleatedGuardTags.Contains(TEXT("no-generic-pleated-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation pleated-state packet contract must keep generic pleated-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic pleated-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJASOngoingStateRemnantBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAS.OngoingStateRemnants",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJASOngoingStateRemnantBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateRemnantBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateRemnantBoundary(
|
||||||
|
TEXT("validation-ongoing-state-remnant-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-remnant-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary must preserve manual-waiver remnants."),
|
||||||
|
Boundary.RemnantIds.Contains(TEXT("ongoing-remnant/manual-waiver-remnant"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary must preserve the bounded ongoing-state remnant surface."),
|
||||||
|
Boundary.RemnantSurfaceTags.Contains(TEXT("bounded ongoing-state remnant"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary must preserve the no-generic-ongoing-remnant-platform guard."),
|
||||||
|
Boundary.RemnantGuardTags.Contains(TEXT("no-generic-ongoing-remnant-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state remnant boundary must keep generic ongoing remnant platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing remnant platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJATCrimpedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAT.CrimpedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJATCrimpedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCrimpedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crimped-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCrimpedStateLedgerContract(
|
||||||
|
TEXT("validation-crimped-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation crimped-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-crimped-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crimped-state ledger contract must preserve benchmark-drift crimped ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("crimped-state-ledger/benchmark-drift-crimped"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crimped-state ledger contract must preserve the bounded crimped-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded crimped-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crimped-state ledger contract must preserve the no-generic-crimped-state-platform guard."),
|
||||||
|
Contract.CrimpedGuardTags.Contains(TEXT("no-generic-crimped-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crimped-state ledger contract must keep generic crimped-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic crimped-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJATOngoingStateImprintBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAT.OngoingStateImprints",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJATOngoingStateImprintBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateImprintBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateImprintBoundary(
|
||||||
|
TEXT("validation-ongoing-state-imprint-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-imprint-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary must preserve manual-waiver imprints."),
|
||||||
|
Boundary.ImprintIds.Contains(TEXT("ongoing-imprint/manual-waiver-imprint"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary must preserve the bounded ongoing-state imprint surface."),
|
||||||
|
Boundary.ImprintSurfaceTags.Contains(TEXT("bounded ongoing-state imprint"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary must preserve the no-generic-ongoing-imprint-platform guard."),
|
||||||
|
Boundary.ImprintGuardTags.Contains(TEXT("no-generic-ongoing-imprint-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state imprint boundary must keep generic ongoing imprint platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing imprint platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAUCorrugatedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAU.CorrugatedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAUCorrugatedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCorrugatedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation corrugated-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCorrugatedStatePacketContract(
|
||||||
|
TEXT("validation-corrugated-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation corrugated-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-corrugated-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation corrugated-state packet contract must preserve benchmark-drift corrugated packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("corrugated-state-packet/benchmark-drift-corrugated"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation corrugated-state packet contract must preserve the bounded corrugated-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded corrugated-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation corrugated-state packet contract must preserve the no-generic-corrugated-state-platform guard."),
|
||||||
|
Contract.CorrugatedGuardTags.Contains(TEXT("no-generic-corrugated-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation corrugated-state packet contract must keep generic corrugated-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic corrugated-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAUOngoingStateTraceBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAU.OngoingStateTraces",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAUOngoingStateTraceBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateTraceBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state trace boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateTraceBoundary(
|
||||||
|
TEXT("validation-ongoing-state-trace-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state trace boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-trace-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state trace boundary must preserve manual-waiver traces."),
|
||||||
|
Boundary.TraceIds.Contains(TEXT("ongoing-trace/manual-waiver-trace"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state trace boundary must preserve the bounded ongoing-state trace surface."),
|
||||||
|
Boundary.TraceSurfaceTags.Contains(TEXT("bounded ongoing-state trace"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state trace boundary must preserve the no-generic-ongoing-trace-platform guard."),
|
||||||
|
Boundary.TraceGuardTags.Contains(TEXT("no-generic-ongoing-trace-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state trace boundary must keep generic ongoing trace platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing trace platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAVRibbedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAV.RibbedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAVRibbedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationRibbedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ribbed-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationRibbedStateLedgerContract(
|
||||||
|
TEXT("validation-ribbed-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ribbed-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-ribbed-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ribbed-state ledger contract must preserve benchmark-drift ribbed ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("ribbed-state-ledger/benchmark-drift-ribbed"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ribbed-state ledger contract must preserve the bounded ribbed-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded ribbed-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ribbed-state ledger contract must preserve the no-generic-ribbed-state-platform guard."),
|
||||||
|
Contract.RibbedGuardTags.Contains(TEXT("no-generic-ribbed-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ribbed-state ledger contract must keep generic ribbed-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic ribbed-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAVOngoingStateSignatureBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAV.OngoingStateSignatures",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAVOngoingStateSignatureBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateSignatureBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state signature boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateSignatureBoundary(
|
||||||
|
TEXT("validation-ongoing-state-signature-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state signature boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-signature-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state signature boundary must preserve manual-waiver signatures."),
|
||||||
|
Boundary.SignatureIds.Contains(TEXT("ongoing-signature/manual-waiver-signature"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state signature boundary must preserve the bounded ongoing-state signature surface."),
|
||||||
|
Boundary.SignatureSurfaceTags.Contains(TEXT("bounded ongoing-state signature"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state signature boundary must preserve the no-generic-ongoing-signature-platform guard."),
|
||||||
|
Boundary.SignatureGuardTags.Contains(TEXT("no-generic-ongoing-signature-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state signature boundary must keep generic ongoing signature platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing signature platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAWFlutedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAW.FlutedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAWFlutedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationFlutedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fluted-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationFlutedStatePacketContract(
|
||||||
|
TEXT("validation-fluted-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation fluted-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-fluted-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fluted-state packet contract must preserve benchmark-drift fluted packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("fluted-state-packet/benchmark-drift-fluted"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fluted-state packet contract must preserve the bounded fluted-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded fluted-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fluted-state packet contract must preserve the no-generic-fluted-state-platform guard."),
|
||||||
|
Contract.FlutedGuardTags.Contains(TEXT("no-generic-fluted-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fluted-state packet contract must keep generic fluted-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic fluted-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAWOngoingStateMarkBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAW.OngoingStateMarks",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAWOngoingStateMarkBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateMarkBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state mark boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateMarkBoundary(
|
||||||
|
TEXT("validation-ongoing-state-mark-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state mark boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-mark-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state mark boundary must preserve manual-waiver marks."),
|
||||||
|
Boundary.MarkIds.Contains(TEXT("ongoing-mark/manual-waiver-mark"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state mark boundary must preserve the bounded ongoing-state mark surface."),
|
||||||
|
Boundary.MarkSurfaceTags.Contains(TEXT("bounded ongoing-state mark"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state mark boundary must preserve the no-generic-ongoing-mark-platform guard."),
|
||||||
|
Boundary.MarkGuardTags.Contains(TEXT("no-generic-ongoing-mark-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state mark boundary must keep generic ongoing mark platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing mark platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAXGroovedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAX.GroovedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAXGroovedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationGroovedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation grooved-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationGroovedStateLedgerContract(
|
||||||
|
TEXT("validation-grooved-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation grooved-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-grooved-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation grooved-state ledger contract must preserve benchmark-drift grooved ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("grooved-state-ledger/benchmark-drift-grooved"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation grooved-state ledger contract must preserve the bounded grooved-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded grooved-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation grooved-state ledger contract must preserve the no-generic-grooved-state-platform guard."),
|
||||||
|
Contract.GroovedGuardTags.Contains(TEXT("no-generic-grooved-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation grooved-state ledger contract must keep generic grooved-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic grooved-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAXOngoingStateSealBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAX.OngoingStateSeals",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAXOngoingStateSealBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateSealBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state seal boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateSealBoundary(
|
||||||
|
TEXT("validation-ongoing-state-seal-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state seal boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-seal-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state seal boundary must preserve manual-waiver seals."),
|
||||||
|
Boundary.SealIds.Contains(TEXT("ongoing-seal/manual-waiver-seal"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state seal boundary must preserve the bounded ongoing-state seal surface."),
|
||||||
|
Boundary.SealSurfaceTags.Contains(TEXT("bounded ongoing-state seal"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state seal boundary must preserve the no-generic-ongoing-seal-platform guard."),
|
||||||
|
Boundary.SealGuardTags.Contains(TEXT("no-generic-ongoing-seal-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state seal boundary must keep generic ongoing seal platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing seal platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAYRidgedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAY.RidgedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAYRidgedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationRidgedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ridged-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationRidgedStatePacketContract(
|
||||||
|
TEXT("validation-ridged-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ridged-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-ridged-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ridged-state packet contract must preserve benchmark-drift ridged packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("ridged-state-packet/benchmark-drift-ridged"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ridged-state packet contract must preserve the bounded ridged-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded ridged-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ridged-state packet contract must preserve the no-generic-ridged-state-platform guard."),
|
||||||
|
Contract.RidgedGuardTags.Contains(TEXT("no-generic-ridged-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ridged-state packet contract must keep generic ridged-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic ridged-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAYOngoingStateStampBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAY.OngoingStateStamps",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAYOngoingStateStampBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateStampBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateStampBoundary(
|
||||||
|
TEXT("validation-ongoing-state-stamp-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-stamp-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary must preserve manual-waiver stamps."),
|
||||||
|
Boundary.StampIds.Contains(TEXT("ongoing-stamp/manual-waiver-stamp"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary must preserve the bounded ongoing-state stamp surface."),
|
||||||
|
Boundary.StampSurfaceTags.Contains(TEXT("bounded ongoing-state stamp"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary must preserve the no-generic-ongoing-stamp-platform guard."),
|
||||||
|
Boundary.StampGuardTags.Contains(TEXT("no-generic-ongoing-stamp-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state stamp boundary must keep generic ongoing stamp platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing stamp platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAZTerracedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAZ.TerracedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAZTerracedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationTerracedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation terraced-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationTerracedStateLedgerContract(
|
||||||
|
TEXT("validation-terraced-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation terraced-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-terraced-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation terraced-state ledger contract must preserve benchmark-drift terraced ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("terraced-state-ledger/benchmark-drift-terraced"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation terraced-state ledger contract must preserve the bounded terraced-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded terraced-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation terraced-state ledger contract must preserve the no-generic-terraced-state-platform guard."),
|
||||||
|
Contract.TerracedGuardTags.Contains(TEXT("no-generic-terraced-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation terraced-state ledger contract must keep generic terraced-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic terraced-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJAZOngoingStateImpressionBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJAZ.OngoingStateImpressions",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJAZOngoingStateImpressionBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateImpressionBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state impression boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateImpressionBoundary(
|
||||||
|
TEXT("validation-ongoing-state-impression-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state impression boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-impression-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state impression boundary must preserve manual-waiver impressions."),
|
||||||
|
Boundary.ImpressionIds.Contains(TEXT("ongoing-impression/manual-waiver-impression"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state impression boundary must preserve the bounded ongoing-state impression surface."),
|
||||||
|
Boundary.ImpressionSurfaceTags.Contains(TEXT("bounded ongoing-state impression"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state impression boundary must preserve the no-generic-ongoing-impression-platform guard."),
|
||||||
|
Boundary.ImpressionGuardTags.Contains(TEXT("no-generic-ongoing-impression-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state impression boundary must keep generic ongoing impression platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing impression platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBAButtressedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBA.ButtressedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBAButtressedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationButtressedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation buttressed-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationButtressedStatePacketContract(
|
||||||
|
TEXT("validation-buttressed-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation buttressed-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-buttressed-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation buttressed-state packet contract must preserve benchmark-drift buttressed packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("buttressed-state-packet/benchmark-drift-buttressed"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation buttressed-state packet contract must preserve the bounded buttressed-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded buttressed-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation buttressed-state packet contract must preserve the no-generic-buttressed-state-platform guard."),
|
||||||
|
Contract.ButtressedGuardTags.Contains(TEXT("no-generic-buttressed-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation buttressed-state packet contract must keep generic buttressed-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic buttressed-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBAOngoingStateEtchingBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBA.OngoingStateEtchings",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBAOngoingStateEtchingBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateEtchingBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state etching boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateEtchingBoundary(
|
||||||
|
TEXT("validation-ongoing-state-etching-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state etching boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-etching-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state etching boundary must preserve manual-waiver etchings."),
|
||||||
|
Boundary.EtchingIds.Contains(TEXT("ongoing-etching/manual-waiver-etching"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state etching boundary must preserve the bounded ongoing-state etching surface."),
|
||||||
|
Boundary.EtchingSurfaceTags.Contains(TEXT("bounded ongoing-state etching"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state etching boundary must preserve the no-generic-ongoing-etching-platform guard."),
|
||||||
|
Boundary.EtchingGuardTags.Contains(TEXT("no-generic-ongoing-etching-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state etching boundary must keep generic ongoing etching platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing etching platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBBBastionedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBB.BastionedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBBBastionedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationBastionedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bastioned-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationBastionedStateLedgerContract(
|
||||||
|
TEXT("validation-bastioned-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation bastioned-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-bastioned-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bastioned-state ledger contract must preserve benchmark-drift bastioned ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("bastioned-state-ledger/benchmark-drift-bastioned"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bastioned-state ledger contract must preserve the bounded bastioned-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded bastioned-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bastioned-state ledger contract must preserve the no-generic-bastioned-state-platform guard."),
|
||||||
|
Contract.BastionedGuardTags.Contains(TEXT("no-generic-bastioned-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bastioned-state ledger contract must keep generic bastioned-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic bastioned-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBBOngoingStateEngravingBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBB.OngoingStateEngravings",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBBOngoingStateEngravingBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateEngravingBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateEngravingBoundary(
|
||||||
|
TEXT("validation-ongoing-state-engraving-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-engraving-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary must preserve manual-waiver engravings."),
|
||||||
|
Boundary.EngravingIds.Contains(TEXT("ongoing-engraving/manual-waiver-engraving"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary must preserve the bounded ongoing-state engraving surface."),
|
||||||
|
Boundary.EngravingSurfaceTags.Contains(TEXT("bounded ongoing-state engraving"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary must preserve the no-generic-ongoing-engraving-platform guard."),
|
||||||
|
Boundary.EngravingGuardTags.Contains(TEXT("no-generic-ongoing-engraving-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state engraving boundary must keep generic ongoing engraving platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing engraving platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBCFortifiedStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBC.FortifiedStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBCFortifiedStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationFortifiedStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fortified-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationFortifiedStatePacketContract(
|
||||||
|
TEXT("validation-fortified-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation fortified-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-fortified-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fortified-state packet contract must preserve benchmark-drift fortified packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("fortified-state-packet/benchmark-drift-fortified"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fortified-state packet contract must preserve the bounded fortified-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded fortified-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fortified-state packet contract must preserve the no-generic-fortified-state-platform guard."),
|
||||||
|
Contract.FortifiedGuardTags.Contains(TEXT("no-generic-fortified-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation fortified-state packet contract must keep generic fortified-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic fortified-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBCOngoingStateCarvingBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBC.OngoingStateCarvings",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBCOngoingStateCarvingBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCarvingBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state carving boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCarvingBoundary(
|
||||||
|
TEXT("validation-ongoing-state-carving-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state carving boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-carving-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state carving boundary must preserve manual-waiver carvings."),
|
||||||
|
Boundary.CarvingIds.Contains(TEXT("ongoing-carving/manual-waiver-carving"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state carving boundary must preserve the bounded ongoing-state carving surface."),
|
||||||
|
Boundary.CarvingSurfaceTags.Contains(TEXT("bounded ongoing-state carving"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state carving boundary must preserve the no-generic-ongoing-carving-platform guard."),
|
||||||
|
Boundary.CarvingGuardTags.Contains(TEXT("no-generic-ongoing-carving-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state carving boundary must keep generic ongoing carving platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing carving platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBDBulwarkedStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBD.BulwarkedStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBDBulwarkedStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationBulwarkedStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationBulwarkedStateLedgerContract(
|
||||||
|
TEXT("validation-bulwarked-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-bulwarked-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract must preserve benchmark-drift bulwarked ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("bulwarked-state-ledger/benchmark-drift-bulwarked"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract must preserve the bounded bulwarked-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded bulwarked-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract must preserve the no-generic-bulwarked-state-platform guard."),
|
||||||
|
Contract.BulwarkedGuardTags.Contains(TEXT("no-generic-bulwarked-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation bulwarked-state ledger contract must keep generic bulwarked-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic bulwarked-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBDOngoingStateInscriptionBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBD.OngoingStateInscriptions",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBDOngoingStateInscriptionBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateInscriptionBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateInscriptionBoundary(
|
||||||
|
TEXT("validation-ongoing-state-inscription-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-inscription-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary must preserve manual-waiver inscriptions."),
|
||||||
|
Boundary.InscriptionIds.Contains(TEXT("ongoing-inscription/manual-waiver-inscription"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary must preserve the bounded ongoing-state inscription surface."),
|
||||||
|
Boundary.InscriptionSurfaceTags.Contains(TEXT("bounded ongoing-state inscription"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary must preserve the no-generic-ongoing-inscription-platform guard."),
|
||||||
|
Boundary.InscriptionGuardTags.Contains(TEXT("no-generic-ongoing-inscription-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state inscription boundary must keep generic ongoing inscription platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing inscription platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBERampartStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBE.RampartStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBERampartStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationRampartStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation rampart-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationRampartStatePacketContract(
|
||||||
|
TEXT("validation-rampart-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation rampart-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-rampart-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation rampart-state packet contract must preserve benchmark-drift rampart packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("rampart-state-packet/benchmark-drift-rampart"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation rampart-state packet contract must preserve the bounded rampart-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded rampart-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation rampart-state packet contract must preserve the no-generic-rampart-state-platform guard."),
|
||||||
|
Contract.RampartGuardTags.Contains(TEXT("no-generic-rampart-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation rampart-state packet contract must keep generic rampart-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic rampart-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBEOngoingStateMarkingBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBE.OngoingStateMarkings",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBEOngoingStateMarkingBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateMarkingBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marking boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateMarkingBoundary(
|
||||||
|
TEXT("validation-ongoing-state-marking-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state marking boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-marking-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marking boundary must preserve manual-waiver markings."),
|
||||||
|
Boundary.MarkingIds.Contains(TEXT("ongoing-marking/manual-waiver-marking"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marking boundary must preserve the bounded ongoing-state marking surface."),
|
||||||
|
Boundary.MarkingSurfaceTags.Contains(TEXT("bounded ongoing-state marking"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marking boundary must preserve the no-generic-ongoing-marking-platform guard."),
|
||||||
|
Boundary.MarkingGuardTags.Contains(TEXT("no-generic-ongoing-marking-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marking boundary must keep generic ongoing marking platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing marking platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBFCitadelStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBF.CitadelStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBFCitadelStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCitadelStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation citadel-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCitadelStateLedgerContract(
|
||||||
|
TEXT("validation-citadel-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation citadel-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-citadel-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation citadel-state ledger contract must preserve benchmark-drift citadel ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("citadel-state-ledger/benchmark-drift-citadel"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation citadel-state ledger contract must preserve the bounded citadel-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded citadel-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation citadel-state ledger contract must preserve the no-generic-citadel-state-platform guard."),
|
||||||
|
Contract.CitadelGuardTags.Contains(TEXT("no-generic-citadel-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation citadel-state ledger contract must keep generic citadel-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic citadel-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBFOngoingStateTracingBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBF.OngoingStateTracings",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBFOngoingStateTracingBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateTracingBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateTracingBoundary(
|
||||||
|
TEXT("validation-ongoing-state-tracing-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-tracing-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary must preserve manual-waiver tracings."),
|
||||||
|
Boundary.TracingIds.Contains(TEXT("ongoing-tracing/manual-waiver-tracing"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary must preserve the bounded ongoing-state tracing surface."),
|
||||||
|
Boundary.TracingSurfaceTags.Contains(TEXT("bounded ongoing-state tracing"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary must preserve the no-generic-ongoing-tracing-platform guard."),
|
||||||
|
Boundary.TracingGuardTags.Contains(TEXT("no-generic-ongoing-tracing-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state tracing boundary must keep generic ongoing tracing platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing tracing platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBGKeepStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBG.KeepStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBGKeepStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationKeepStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation keep-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationKeepStatePacketContract(
|
||||||
|
TEXT("validation-keep-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation keep-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-keep-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation keep-state packet contract must preserve benchmark-drift keep packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("keep-state-packet/benchmark-drift-keep"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation keep-state packet contract must preserve the bounded keep-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded keep-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation keep-state packet contract must preserve the no-generic-keep-state-platform guard."),
|
||||||
|
Contract.KeepGuardTags.Contains(TEXT("no-generic-keep-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation keep-state packet contract must keep generic keep-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic keep-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBGOngoingStateNotationBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBG.OngoingStateNotations",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBGOngoingStateNotationBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateNotationBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state notation boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateNotationBoundary(
|
||||||
|
TEXT("validation-ongoing-state-notation-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state notation boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-notation-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state notation boundary must preserve manual-waiver notations."),
|
||||||
|
Boundary.NotationIds.Contains(TEXT("ongoing-notation/manual-waiver-notation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state notation boundary must preserve the bounded ongoing-state notation surface."),
|
||||||
|
Boundary.NotationSurfaceTags.Contains(TEXT("bounded ongoing-state notation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state notation boundary must preserve the no-generic-ongoing-notation-platform guard."),
|
||||||
|
Boundary.NotationGuardTags.Contains(TEXT("no-generic-ongoing-notation-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state notation boundary must keep generic ongoing notation platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing notation platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBHStrongholdStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBH.StrongholdStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBHStrongholdStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationStrongholdStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation stronghold-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationStrongholdStateLedgerContract(
|
||||||
|
TEXT("validation-stronghold-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation stronghold-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-stronghold-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation stronghold-state ledger contract must preserve benchmark-drift stronghold ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("stronghold-state-ledger/benchmark-drift-stronghold"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation stronghold-state ledger contract must preserve the bounded stronghold-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded stronghold-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation stronghold-state ledger contract must preserve the no-generic-stronghold-state-platform guard."),
|
||||||
|
Contract.StrongholdGuardTags.Contains(TEXT("no-generic-stronghold-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation stronghold-state ledger contract must keep generic stronghold-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic stronghold-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBHOngoingStateAnnotationBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBH.OngoingStateAnnotations",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBHOngoingStateAnnotationBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateAnnotationBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateAnnotationBoundary(
|
||||||
|
TEXT("validation-ongoing-state-annotation-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-annotation-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary must preserve manual-waiver annotations."),
|
||||||
|
Boundary.AnnotationIds.Contains(TEXT("ongoing-annotation/manual-waiver-annotation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary must preserve the bounded ongoing-state annotation surface."),
|
||||||
|
Boundary.AnnotationSurfaceTags.Contains(TEXT("bounded ongoing-state annotation"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary must preserve the no-generic-ongoing-annotation-platform guard."),
|
||||||
|
Boundary.AnnotationGuardTags.Contains(TEXT("no-generic-ongoing-annotation-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state annotation boundary must keep generic ongoing annotation platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing annotation platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBIWatchtowerStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBI.WatchtowerStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBIWatchtowerStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationWatchtowerStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation watchtower-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationWatchtowerStatePacketContract(
|
||||||
|
TEXT("validation-watchtower-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation watchtower-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-watchtower-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation watchtower-state packet contract must preserve benchmark-drift watchtower packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("watchtower-state-packet/benchmark-drift-watchtower"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation watchtower-state packet contract must preserve the bounded watchtower-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded watchtower-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation watchtower-state packet contract must preserve the no-generic-watchtower-state-platform guard."),
|
||||||
|
Contract.WatchtowerGuardTags.Contains(TEXT("no-generic-watchtower-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation watchtower-state packet contract must keep generic watchtower-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic watchtower-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBIOngoingStateGlossBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBI.OngoingStateGlosses",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBIOngoingStateGlossBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateGlossBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateGlossBoundary(
|
||||||
|
TEXT("validation-ongoing-state-gloss-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-gloss-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary must preserve manual-waiver glosses."),
|
||||||
|
Boundary.GlossIds.Contains(TEXT("ongoing-gloss/manual-waiver-gloss"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary must preserve the bounded ongoing-state gloss surface."),
|
||||||
|
Boundary.GlossSurfaceTags.Contains(TEXT("bounded ongoing-state gloss"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary must preserve the no-generic-ongoing-gloss-platform guard."),
|
||||||
|
Boundary.GlossGuardTags.Contains(TEXT("no-generic-ongoing-gloss-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state gloss boundary must keep generic ongoing gloss platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing gloss platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBJBattlementStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBJ.BattlementStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBJBattlementStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationBattlementStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation battlement-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationBattlementStateLedgerContract(
|
||||||
|
TEXT("validation-battlement-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation battlement-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-battlement-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation battlement-state ledger contract must preserve benchmark-drift battlement ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("battlement-state-ledger/benchmark-drift-battlement"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation battlement-state ledger contract must preserve the bounded battlement-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded battlement-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation battlement-state ledger contract must preserve the no-generic-battlement-state-platform guard."),
|
||||||
|
Contract.BattlementGuardTags.Contains(TEXT("no-generic-battlement-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation battlement-state ledger contract must keep generic battlement-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic battlement-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBJOngoingStateCaptionBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBJ.OngoingStateCaptions",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBJOngoingStateCaptionBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCaptionBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state caption boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCaptionBoundary(
|
||||||
|
TEXT("validation-ongoing-state-caption-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state caption boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-caption-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state caption boundary must preserve manual-waiver captions."),
|
||||||
|
Boundary.CaptionIds.Contains(TEXT("ongoing-caption/manual-waiver-caption"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state caption boundary must preserve the bounded ongoing-state caption surface."),
|
||||||
|
Boundary.CaptionSurfaceTags.Contains(TEXT("bounded ongoing-state caption"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state caption boundary must preserve the no-generic-ongoing-caption-platform guard."),
|
||||||
|
Boundary.CaptionGuardTags.Contains(TEXT("no-generic-ongoing-caption-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state caption boundary must keep generic ongoing caption platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing caption platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBKParapetStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBK.ParapetStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBKParapetStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationParapetStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation parapet-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationParapetStatePacketContract(
|
||||||
|
TEXT("validation-parapet-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation parapet-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-parapet-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation parapet-state packet contract must preserve benchmark-drift parapet packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("parapet-state-packet/benchmark-drift-parapet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation parapet-state packet contract must preserve the bounded parapet-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded parapet-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation parapet-state packet contract must preserve the no-generic-parapet-state-platform guard."),
|
||||||
|
Contract.ParapetGuardTags.Contains(TEXT("no-generic-parapet-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation parapet-state packet contract must keep generic parapet-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic parapet-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBKOngoingStateLegendBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBK.OngoingStateLegends",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBKOngoingStateLegendBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateLegendBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state legend boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateLegendBoundary(
|
||||||
|
TEXT("validation-ongoing-state-legend-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state legend boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-legend-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state legend boundary must preserve manual-waiver legends."),
|
||||||
|
Boundary.LegendIds.Contains(TEXT("ongoing-legend/manual-waiver-legend"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state legend boundary must preserve the bounded ongoing-state legend surface."),
|
||||||
|
Boundary.LegendSurfaceTags.Contains(TEXT("bounded ongoing-state legend"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state legend boundary must preserve the no-generic-ongoing-legend-platform guard."),
|
||||||
|
Boundary.LegendGuardTags.Contains(TEXT("no-generic-ongoing-legend-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state legend boundary must keep generic ongoing legend platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing legend platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBLMerlonStateLedgerContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBL.MerlonStateLedgers",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBLMerlonStateLedgerContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationMerlonStateLedgerContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merlon-state ledger contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationMerlonStateLedgerContract(
|
||||||
|
TEXT("validation-merlon-state-ledger-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation merlon-state ledger contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-merlon-state-ledger-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merlon-state ledger contract must preserve benchmark-drift merlon ledgers."),
|
||||||
|
Contract.LedgerIds.Contains(TEXT("merlon-state-ledger/benchmark-drift-merlon"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merlon-state ledger contract must preserve the bounded merlon-state ledger surface."),
|
||||||
|
Contract.LedgerSurfaceTags.Contains(TEXT("bounded merlon-state ledger"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merlon-state ledger contract must preserve the no-generic-merlon-state-platform guard."),
|
||||||
|
Contract.MerlonGuardTags.Contains(TEXT("no-generic-merlon-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation merlon-state ledger contract must keep generic merlon-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic merlon-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBLOngoingStateCalloutBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBL.OngoingStateCallouts",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBLOngoingStateCalloutBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateCalloutBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state callout boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateCalloutBoundary(
|
||||||
|
TEXT("validation-ongoing-state-callout-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state callout boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-callout-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state callout boundary must preserve manual-waiver callouts."),
|
||||||
|
Boundary.CalloutIds.Contains(TEXT("ongoing-callout/manual-waiver-callout"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state callout boundary must preserve the bounded ongoing-state callout surface."),
|
||||||
|
Boundary.CalloutSurfaceTags.Contains(TEXT("bounded ongoing-state callout"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state callout boundary must preserve the no-generic-ongoing-callout-platform guard."),
|
||||||
|
Boundary.CalloutGuardTags.Contains(TEXT("no-generic-ongoing-callout-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state callout boundary must keep generic ongoing callout platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing callout platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright HyperTwist, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Misc/AutomationTest.h"
|
||||||
|
|
||||||
|
#include "HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h"
|
||||||
|
|
||||||
|
#if WITH_AUTOMATION_TESTS
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBMCrenelStatePacketContractTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBM.CrenelStatePackets",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBMCrenelStatePacketContractTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationCrenelStatePacketContract Contract;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crenel-state packet contract must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationCrenelStatePacketContract(
|
||||||
|
TEXT("validation-crenel-state-packet-contract"),
|
||||||
|
Contract
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation crenel-state packet contract id must stay stable."),
|
||||||
|
Contract.ContractId,
|
||||||
|
TEXT("validation-crenel-state-packet-contract")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crenel-state packet contract must preserve benchmark-drift crenel packets."),
|
||||||
|
Contract.PacketIds.Contains(TEXT("crenel-state-packet/benchmark-drift-crenel"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crenel-state packet contract must preserve the bounded crenel-state packet surface."),
|
||||||
|
Contract.PacketSurfaceTags.Contains(TEXT("bounded crenel-state packet"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crenel-state packet contract must preserve the no-generic-crenel-state-platform guard."),
|
||||||
|
Contract.CrenelGuardTags.Contains(TEXT("no-generic-crenel-state-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation crenel-state packet contract must keep generic crenel-state platform ownership excluded."),
|
||||||
|
Contract.ExplicitExclusions.Contains(TEXT("generic crenel-state platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||||
|
FHyperTwistValidationPhaseJBMOngoingStateMarginaliaBoundaryTest,
|
||||||
|
"HyperTwist.FirstParty.Validation.PhaseJBM.OngoingStateMarginalia",
|
||||||
|
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||||
|
)
|
||||||
|
|
||||||
|
bool FHyperTwistValidationPhaseJBMOngoingStateMarginaliaBoundaryTest::RunTest(const FString& Parameters)
|
||||||
|
{
|
||||||
|
FHyperTwistTrainingValidationOngoingStateMarginaliaBoundary Boundary;
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary must resolve from the runtime library."),
|
||||||
|
UHyperTwistTrainingRuntimeLibrary::TryGetBundledValidationOngoingStateMarginaliaBoundary(
|
||||||
|
TEXT("validation-ongoing-state-marginalia-boundary"),
|
||||||
|
Boundary
|
||||||
|
)
|
||||||
|
);
|
||||||
|
TestEqual(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary id must stay stable."),
|
||||||
|
Boundary.BoundaryId,
|
||||||
|
TEXT("validation-ongoing-state-marginalia-boundary")
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary must preserve manual-waiver marginalia."),
|
||||||
|
Boundary.MarginaliaIds.Contains(TEXT("ongoing-marginalia/manual-waiver-marginalia"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary must preserve the bounded ongoing-state marginalia surface."),
|
||||||
|
Boundary.MarginaliaSurfaceTags.Contains(TEXT("bounded ongoing-state marginalia"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary must preserve the no-generic-ongoing-marginalia-platform guard."),
|
||||||
|
Boundary.MarginaliaGuardTags.Contains(TEXT("no-generic-ongoing-marginalia-platform guard"))
|
||||||
|
);
|
||||||
|
TestTrue(
|
||||||
|
TEXT("The validation ongoing-state marginalia boundary must keep generic ongoing marginalia platform ownership excluded."),
|
||||||
|
Boundary.ExplicitExclusions.Contains(TEXT("generic ongoing marginalia platform ownership"))
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue