Decode packaged byte 0 as separate block-height and block-depth nibbles, including explicit zero dimensions, and size linear compressed textures by pixel rows. Port the driver-derived rules from PR #201 and preserve its attribution to digitalhivehub's PR #11 measurements. Integrate the layout test with current main, correct its BC4 label, add independently addressed CPU markers and packaged GPU mip coverage, and record the mechanisms in the reference docs and symptom index. Validation: 9 driver shapes, 189 CPU texture checks (also ASan/UBSan), 17 GPU deswizzle cases, 154 NVN checks, documentation checks, Mac host build, and iOS compilation of 133 sources pass. No new gameplay or iPhone runtime validation. Co-authored-by: Aleksandr Svidchenkov <a.svidchenkov@gmail.com>
156 lines
6.1 KiB
YAML
156 lines
6.1 KiB
YAML
# Tests that need no game files, keys or GPU. GitHub's macOS runners are virtual Macs without Metal 4 (issue #112), so the tests that go through mtl_init
|
|
# (t_nvn, t_mip_extent, t_rt_range and the rest of dm/gfx/tests' run list) stay local: run `make -C dm/gfx/tests GAME=<id> run` on an Apple-silicon Mac.
|
|
# `profile_guess.py --check` stays local too: it compares the guesses with the extractions of the games (it needs their files).
|
|
name: tests
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: tests-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
GAME: 010015100B514000 # Super Mario Bros. Wonder: the profile the host and gfx tests are built for (any profile does; the tests are about code, not the game)
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
# Actions are pinned to commit SHAs (the tag in the comment): a tag can be moved, a SHA cannot. Dependabot (github-actions) can raise them.
|
|
jobs:
|
|
host-tests:
|
|
name: Host unit tests and CPU-only gfx tests
|
|
runs-on: macos-26
|
|
timeout-minutes: 20
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Host unit tests (dm/host/tests)
|
|
run: |
|
|
mkdir -p logs
|
|
make -C dm/host/tests GAME="$GAME" -j3 run 2>&1 | tee logs/host-tests.log
|
|
- name: ThreadSanitizer (audio and guest memory)
|
|
run: |
|
|
make -C dm/host/tests GAME="$GAME" -j3 tsan memory-tsan 2>&1 | tee logs/tsan.log
|
|
- name: CPU texture layout and deswizzle tests
|
|
run: |
|
|
make -C dm/gfx/tex/tests t_tex 2>&1 | tee logs/texture-build.log
|
|
dm/gfx/tex/tests/t_tex 2>&1 | tee logs/texture-tests.log
|
|
- name: CPU-only gfx tests (dm/gfx/tests)
|
|
run: |
|
|
mkdir -p logs
|
|
cd dm/gfx/tests
|
|
tests="t_dirty_slots t_dirty_race t_tex_layout t_pace t_fstep t_hmap t_cover t_pso_skey t_refl t_rt_range_ro t_present_rescue"
|
|
make GAME="$GAME" -j3 $tests 2>&1 | tee ../../../logs/gfx-build.log
|
|
failed=0
|
|
for t in $tests; do
|
|
echo "::group::$t"
|
|
./$t 2>&1 | tee "../../../logs/$t.log" && rc=0 || rc=1 # pipefail: the test's status
|
|
echo "::endgroup::"
|
|
if [ "$rc" != 0 ]; then echo "::error::$t failed"; failed=1; fi
|
|
done
|
|
exit $failed
|
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
if: failure()
|
|
with:
|
|
name: logs-host-tests
|
|
path: logs
|
|
retention-days: 7
|
|
|
|
tool-tests:
|
|
name: Tool tests
|
|
runs-on: macos-26
|
|
timeout-minutes: 15
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
with:
|
|
python-version: '3.14'
|
|
cache: pip
|
|
cache-dependency-path: .github/workflows/tests.yml # no requirements file: the packages are listed in the step below
|
|
- name: Install the Python packages the tools import
|
|
run: python -m pip install lz4 capstone fonttools # backports.zstd is for Python before 3.14 only
|
|
- name: Run the test files
|
|
env:
|
|
DM_GAME: ${{ env.GAME }} # test_tbdr_budget runs a tool that needs a profile
|
|
run: |
|
|
mkdir -p logs
|
|
failed=0
|
|
for f in dm/tools/tests/test_*.py dm/ios/tests/test_*.py dm/gfx/tests/test_*.py; do
|
|
echo "::group::$f"
|
|
python -m unittest -v "$f" 2>&1 | tee "logs/$(basename "$f").log" || { echo "::error::$f failed"; failed=1; }
|
|
echo "::endgroup::"
|
|
done
|
|
exit $failed
|
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
if: failure()
|
|
with:
|
|
name: logs-tool-tests
|
|
path: logs
|
|
retention-days: 7
|
|
|
|
build:
|
|
name: Build check (Mac host, gfx tests, iOS sources)
|
|
runs-on: macos-26
|
|
timeout-minutes: 40
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Mac host for three profiles (Vulkan, NVN, OpenGL)
|
|
run: |
|
|
mkdir -p logs
|
|
# Wonder: NVN; Hades: Vulkan; Digimon Story Cyber Sleuth: OpenGL. The second and third reuse the libvpx build in dm/host/gen/vpx.
|
|
for g in 010015100B514000 0100535012974000 010014E00DB56000; do
|
|
echo "::group::dmhost $g"
|
|
make -C dm/host GAME=$g -j3 dmhost 2>&1 | tee "logs/dmhost-$g.log"
|
|
test -x dm/host/dmhost
|
|
echo "::endgroup::"
|
|
done
|
|
- name: Every gfx test compiled, not run
|
|
run: |
|
|
mkdir -p logs
|
|
cd dm/gfx/tests
|
|
tests=$(sed -n 's/^\(t_[a-z0-9_]*\):.*/\1/p' Makefile | sort -u)
|
|
echo "$tests" | tr '\n' ' '; echo
|
|
make GAME="$GAME" -j3 $tests 2>&1 | tee ../../../logs/gfx-tests-build.log
|
|
- name: iOS host sources compiled for the iPhone SDK (no signing, no Xcode project)
|
|
run: python3 dm/ios/tools/compile_check.py 2>&1 | tee logs/ios-compile.log
|
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
if: failure()
|
|
with:
|
|
name: logs-build
|
|
path: logs
|
|
retention-days: 7
|
|
|
|
ios-build:
|
|
name: Unsigned iOS app (synthetic modules, Swift and link)
|
|
runs-on: macos-26
|
|
timeout-minutes: 40
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Install XcodeGen
|
|
run: command -v xcodegen || brew install xcodegen
|
|
- name: Build the production iOS project with synthetic inputs
|
|
run: |
|
|
mkdir -p logs
|
|
python3 dm/ios/tools/build_smoke.py --output "$RUNNER_TEMP/ios-smoke" 2>&1 | tee logs/ios-build.log
|
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
if: failure()
|
|
with:
|
|
name: logs-ios-build
|
|
path: logs
|
|
retention-days: 7
|