CGFX textures and static geometry validation — 2026-10-23
All 23 recorded commands returned the expected exit code.
Native: 7 C suites, 8 container tests, 7 texture-viewer tests, 6 model-viewer tests.
Regression: 8 reconstructed C suites; 38 analysis tests, with 2 optional dependency skips.
ASan/UBSan: four changed core suites plus both complete viewer runtime suites pass.
LeakSanitizer was disabled due to the environment ptrace restriction; no leak-scan claim.
Independent textures: 11 images, 2,088,960 RGBA bytes, 23,616 ETC blocks; zero mismatches.
Independent geometry: all 767 positions and 2,808 indices match (6 shapes, 936 triangles).
Actual SDL x11/software windows, injected controls, BMP captures, and Windows-to-WSL model launcher pass.
539 reconstruction checksums verified; 32 baseline native files verified from Git; 12 earlier reproduction files unchanged.
Source digests, commands, environment, and captured outputs are in validation.json.
No playable movement, map placement, materials, animation, battle UI, or save/load is established.

Recorded command outputs:

[regression] make -C reconstructed test
exit_code=0
make: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed'
make -C call_wild_battle test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/call_wild_battle'
./build/test_call_wild_battle
PASS: 9 cases; argument snapshot, narrowing, call order, context identity, zero return
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/call_wild_battle'
make -C wild_battle_setup test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/wild_battle_setup'
./build/test_wild_battle_setup
PASS: 65536 flag values; initializer holes; row decoding; optional paths; call order; mutation timing; return propagation; finisher; original wrapper integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/wild_battle_setup'
make -C battle_task test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/battle_task'
./build/test_battle_task
PASS: 65536 selector/category pairs; 65536 key pairs; task factory and registration; optional paths; count boundaries; pointer mutation timing; full submit; all three source milestones integrated
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/battle_task'
make -C encounter_builder test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/encounter_builder'
./build/test_encounter_builder
PASS: parameter bytes and holes; branch boundaries; callback timing; 768 weighted draws; signed dynamic counts; 512 config cases; four-milestone integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/encounter_builder'
make -C pokemon_constructor test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_constructor'
./build/test_pokemon_constructor
PASS: 66388 parameter normalization cases; 65536 levels; 256 stat counts; 256 ability selectors; 255 explicit forms; sentinel pairs; retries; callback mutation; narrowing and unsigned wrap
PASS: constructor sequencing; raw zero allocations; preserved parameter holes; XOR vectors/round trip; 256 acquire states and 2304 restore masks; callback mutation; parameter normalization; five-milestone integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_constructor'
make -C pokemon_data test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_data'
./build/test_pokemon_data
PASS: all 26 setters; 8320 mapping/width cases; 12288 packed-byte cases; 520 corrupt fallback cases; 768 block selections; 4 absent-extra guards; 52 encrypted setter round trips
PASS: 130 population cases; species-zero encoding; 32 block-order rows; 258 ability slots; growth bounds; resource mutation; complete payload comparisons
PASS: Pokemon data population, field setters, storage codec, and six-module integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_data'
make -C pokemon_state test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_state'
./build/test_pokemon_state
PASS: 1536 slot field cases; 32 block rows; encoded/locked input; narrowing; invalid slot guards
PASS: direct value widths; name-bit mask; distinct corrupt read/write fallbacks; absent extra
PASS: extra clear; 512 encoded/lock combinations; null extra; four alignment width/order traces; bounds
PASS: derived order; 1792 initial/final lock cases; mode width; manager replacement
PASS: refresh dynamic moves; repeated PP reads; wraparound; unsigned minima; early byte narrowing
PASS: base clear and callback order; captured species; count reload; unsigned levels; 16-bit learnset index wrap; name scratch
PASS: Pokemon state orchestration and seven-module integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_state'
make -C pokemon_stats test
make[1]: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_stats'
./build/test_pokemon_stats
PASS: fixed HP/stat/nature arithmetic; reciprocal boundary; overflow; signed table bytes; full-width nature indices
PASS: growth levels1..100; exact threshold boundaries; unsigned growth; selected resource mutation
PASS: 768 six-stat field cases;32 block rows; codec states; complete extra buffers; fallback and absent-extra guards
PASS: all five stat updates; captured inputs and manager replacement; HP rise/fall/faint/mode/overflow cases
PASS: object cached/fallback level and max HP; repeated no-extra resource computations
PASS: Pokemon stats reconstruction and eight-module integration
make[1]: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed/pokemon_stats'
make: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/reconstructed'

[regression] python3 -m unittest discover -s tests -v
exit_code=0
test_32_bit_section_overflow_is_rejected (test_inspect_code.IntakeTests.test_32_bit_section_overflow_is_rejected) ... ok
test_bss_32_bit_overflow_is_rejected (test_inspect_code.IntakeTests.test_bss_32_bit_overflow_is_rejected) ... ok
test_bss_cannot_overlap_other_sections (test_inspect_code.IntakeTests.test_bss_cannot_overlap_other_sections) ... ok
test_bss_only_data_address_must_be_page_aligned (test_inspect_code.IntakeTests.test_bss_only_data_address_must_be_page_aligned) ... ok
test_bss_only_data_is_supported (test_inspect_code.IntakeTests.test_bss_only_data_is_supported) ... ok
test_bss_starts_after_actual_data_not_its_padding (test_inspect_code.IntakeTests.test_bss_starts_after_actual_data_not_its_padding) ... ok
test_cli_cannot_overwrite_inputs (test_inspect_code.IntakeTests.test_cli_cannot_overwrite_inputs) ... error: Output must not overwrite either input
ok
test_cli_writes_json (test_inspect_code.IntakeTests.test_cli_writes_json) ... ok
test_compression_flag_requires_explicit_assertion (test_inspect_code.IntakeTests.test_compression_flag_requires_explicit_assertion) ... ok
test_decompressed_assertion_does_not_bypass_length_check (test_inspect_code.IntakeTests.test_decompressed_assertion_does_not_bypass_length_check) ... ok
test_full_exheader_is_accepted (test_inspect_code.IntakeTests.test_full_exheader_is_accepted) ... ok
test_hashes_and_metadata (test_inspect_code.IntakeTests.test_hashes_and_metadata) ... ok
test_nonzero_size_with_zero_pages_is_rejected (test_inspect_code.IntakeTests.test_nonzero_size_with_zero_pages_is_rejected) ... ok
test_other_exheader_lengths_are_rejected (test_inspect_code.IntakeTests.test_other_exheader_lengths_are_rejected) ... ok
test_overlapping_page_allocations_are_rejected (test_inspect_code.IntakeTests.test_overlapping_page_allocations_are_rejected) ... ok
test_packed_map (test_inspect_code.IntakeTests.test_packed_map) ... ok
test_padded_map_uses_actual_sizes_and_page_strides (test_inspect_code.IntakeTests.test_padded_map_uses_actual_sizes_and_page_strides) ... ok
test_size_cannot_exceed_page_count (test_inspect_code.IntakeTests.test_size_cannot_exceed_page_count) ... ok
test_truncated_extra_and_partially_padded_code_are_rejected (test_inspect_code.IntakeTests.test_truncated_extra_and_partially_padded_code_are_rejected) ... ok
test_unaligned_section_address_is_rejected (test_inspect_code.IntakeTests.test_unaligned_section_address_is_rejected) ... ok
test_zero_bss_is_omitted (test_inspect_code.IntakeTests.test_zero_bss_is_omitted) ... ok
test_crs_external_segments_are_not_treated_as_file_offsets (test_inspect_cro.InspectCroTests.test_crs_external_segments_are_not_treated_as_file_offsets) ... ok
test_import_ownership_and_terminal_batches (test_inspect_cro.InspectCroTests.test_import_ownership_and_terminal_batches) ... ok
test_negative_addend_preserves_raw_and_signed_interpretations (test_inspect_cro.InspectCroTests.test_negative_addend_preserves_raw_and_signed_interpretations) ... ok
test_preserves_outside_target_addend_as_inspection_warning (test_inspect_cro.InspectCroTests.test_preserves_outside_target_addend_as_inspection_warning) ... ok
test_rejects_large_table_before_iteration (test_inspect_cro.InspectCroTests.test_rejects_large_table_before_iteration) ... ok
test_rejects_missing_relocation_target_segment (test_inspect_cro.InspectCroTests.test_rejects_missing_relocation_target_segment) ... ok
test_rejects_module_import_subarray_outside_table (test_inspect_cro.InspectCroTests.test_rejects_module_import_subarray_outside_table) ... ok
test_rejects_patch_site_outside_segment (test_inspect_cro.InspectCroTests.test_rejects_patch_site_outside_segment) ... ok
test_rejects_unterminated_import_batch (test_inspect_cro.InspectCroTests.test_rejects_unterminated_import_batch) ... ok
test_rejects_unterminated_string_at_declared_boundary (test_inspect_cro.InspectCroTests.test_rejects_unterminated_string_at_declared_boundary) ... ok
test_segment_table_indices_and_thumb_pointer_are_preserved (test_inspect_cro.InspectCroTests.test_segment_table_indices_and_thumb_pointer_are_preserved) ... ok
test_unknown_patch_type_is_inspected_but_explicitly_warned (test_inspect_cro.InspectCroTests.test_unknown_patch_type_is_inspected_but_explicitly_warned) ... ok
test_unknown_static_symbol_table_fails_closed (test_inspect_cro.InspectCroTests.test_unknown_static_symbol_table_fails_closed) ... ok
test_explicit_addend_and_32_bit_negative_addend (test_prepare_cro_analysis.RelocationTests.test_explicit_addend_and_32_bit_negative_addend) ... ok
test_preparation_links_both_directions_preserves_inputs_and_unknown_bss (test_prepare_cro_analysis.RelocationTests.test_preparation_links_both_directions_preserves_inputs_and_unknown_bss) ... ok
test_unsupported_operation_is_not_silently_applied (test_prepare_cro_analysis.RelocationTests.test_unsupported_operation_is_not_silently_applied) ... ok
setUpClass (test_windows_extract.WindowsExtractionTests) ... skipped 'Required local tools/script missing: /mnt/d/Projects/pokemon-x-decomp-local/tools/pwsh/pwsh, /mnt/d/Projects/pokemon-x-decomp-local/tools/3dstool-linux/3dstool'
test_modules_preserve_paths_exclude_assets_and_preserve_input (test_windows_modules_extract.ModulesExtractionTests.test_modules_preserve_paths_exclude_assets_and_preserve_input) ... skipped 'Required tool/script missing: /mnt/d/Projects/pokemon-x-decomp-local/tools/pwsh/pwsh'

----------------------------------------------------------------------
Ran 38 tests in 0.133s

OK (skipped=2)
Validated page-padded code; wrote /tmp/tmpttiqhpwz/out/manifest.json

[native] make -C native all test test-runtime
exit_code=0
make: Entering directory '/mnt/d/Projects/pokemon-x-decomp-local/native'
cc  -std=c11 -O2 -Wall -Wextra -Wpedantic -Werror -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/SDL2 -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/x86_64-linux-gnu -D_REENTRANT model_app.c assets/cgfx_model.c assets/garc.c assets/lz.c  -L/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu/pulseaudio -Wl,-rpath-link,/usr/lib/x86_64-linux-gnu -lSDL2  -lm -o build/pokemon_model_viewer
cc  -std=c11 -O2 -Wall -Wextra -Wpedantic -Werror assets/bclim.c assets/texture.c assets/etc1.c assets/test_bclim.c   -o build/test_bclim
cc  -std=c11 -O2 -Wall -Wextra -Wpedantic -Werror assets/texture.c assets/etc1.c assets/test_texture.c   -o build/test_texture
cc  -std=c11 -O2 -Wall -Wextra -Wpedantic -Werror assets/cgfx.c assets/texture.c assets/etc1.c assets/test_cgfx.c   -o build/test_cgfx
cc  -std=c11 -O2 -Wall -Wextra -Wpedantic -Werror assets/cgfx_model.c assets/test_cgfx_model.c   -lm -o build/test_cgfx_model
./build/test_garc
PASS: GARC v4 sparse subentries, bounded selected reads, ownership, malformed tables, all truncations
./build/test_lz
PASS: LZ10/LZ11 fixed vectors, overlap, all token lengths, extended size, budgets, malformed input
./build/test_bclim
PASS: BCLIM raw/ETC1/ETC1A4 formats, fixed tile/orientation/color/alpha vectors, crop/stride variants, bounded malformed-input handling
./build/test_etc1
PASS: ETC1 fixed individual/differential vectors, all modifier/selector bits, PICA alpha order, bounds and ETC2 rejection
./build/test_texture
PASS: shared PICA payload format widths, explicit non-power-of-two stride, crop, palette separation and bounded cleanup
./build/test_cgfx
PASS: CGFX 14 PICA formats, borrowed names, backward pointers, selection, crop, layout rejection and bounded malformed cleanup
./build/test_cgfx_model
CGFX static geometry: fixed vectors, shape rebasing, finite/bounds/format rejection passed
python3 -m unittest discover -s tests -p test_container.py -v
test_bad_sizes_counts_offsets_and_payloads_rejected (test_container.ContainerTests.test_bad_sizes_counts_offsets_and_payloads_rejected) ... ok
test_fixed_index_offsets_names_model_and_texture_metadata (test_container.ContainerTests.test_fixed_index_offsets_names_model_and_texture_metadata) ... ok
test_magic_and_endian_rejections (test_container.ContainerTests.test_magic_and_endian_rejections) ... ok
test_names_must_terminate_inside_data (test_container.ContainerTests.test_names_must_terminate_inside_data) ... ok
test_relocated_image_descriptor_and_missing_pointer (test_container.ContainerTests.test_relocated_image_descriptor_and_missing_pointer) ... ok
test_selected_garc_member_and_cli_errors (test_container.ContainerTests.test_selected_garc_member_and_cli_errors) ... ok
test_truncated_prefixes_rejected (test_container.ContainerTests.test_truncated_prefixes_rejected) ... ok
test_unknown_texture_variant_stays_explicit_and_unparsed (test_container.ContainerTests.test_unknown_texture_variant_stays_explicit_and_unparsed) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.136s

OK
./build/pokemon_asset_viewer --demo --inspect
source=synthetic-demo width=256 height=192 pixels=RGBA8
SDL_VIDEODRIVER=dummy ./build/pokemon_asset_viewer --demo --software --frames 3 --self-test-input
[asset-viewer] Video=dummy renderer=software image=256x192. This viewer does not run gameplay.
[asset-viewer] Input self-test passed: pan, zoom, reset, resize, Escape.
[asset-viewer] Exit after 3 rendered frames, 0.034 seconds.
source=synthetic-demo width=256 height=192 pixels=RGBA8
python3 -m unittest discover -s tests -p test_viewer.py -v
test_cgfx_bad_descriptor_and_unsupported_mips (test_viewer.ViewerTests.test_cgfx_bad_descriptor_and_unsupported_mips) ... ok
test_cgfx_selection_listing_and_exported_pixels (test_viewer.ViewerTests.test_cgfx_selection_listing_and_exported_pixels) ... ok
test_etc_archive_pipeline_crop_and_exported_alpha (test_viewer.ViewerTests.test_etc_archive_pipeline_crop_and_exported_alpha) ... ok
test_export_does_not_overwrite_existing_files_or_input (test_viewer.ViewerTests.test_export_does_not_overwrite_existing_files_or_input) ... ok
test_invalid_selection_and_options (test_viewer.ViewerTests.test_invalid_selection_and_options) ... ok
test_missing_member_truncated_archive_and_unsupported_texture (test_viewer.ViewerTests.test_missing_member_truncated_archive_and_unsupported_texture) ... ok
test_raw_and_compressed_pipeline_and_exported_pixels (test_viewer.ViewerTests.test_raw_and_compressed_pipeline_and_exported_pixels) ... ok

----------------------------------------------------------------------
Ran 7 tests in 12.486s

OK
SDL_VIDEODRIVER=dummy ./build/pokemon_model_viewer --demo --software --frames 3 --self-test-input
[model-viewer] Input self-test passed: orbit, zoom, reset, Escape.
[model-viewer] Video=dummy renderer=software; orthographic wireframe.
[model-viewer] Exit after 3 frames.
name="synthetic tetrahedron" vertices=4 triangles=4 shapes=1 bounds_min=(-1,-1,-1) bounds_max=(1,1,1)
python3 -m unittest discover -s tests -p test_model_viewer.py -v
test_archive_and_compression_errors_create_no_capture (test_model_viewer.ModelViewerTests.test_archive_and_compression_errors_create_no_capture) ... ok
test_capture_preserves_existing_file_and_symlink_target (test_model_viewer.ModelViewerTests.test_capture_preserves_existing_file_and_symlink_target) ... ok
test_demo_frame_capture_and_input (test_model_viewer.ModelViewerTests.test_demo_frame_capture_and_input) ... ok
test_demo_inspection_and_help (test_model_viewer.ModelViewerTests.test_demo_inspection_and_help) ... ok
test_invalid_options_are_rejected_before_loading (test_model_viewer.ModelViewerTests.test_invalid_options_are_rejected_before_loading) ... ok
test_raw_and_lz_model_pipeline (test_model_viewer.ModelViewerTests.test_raw_and_lz_model_pipeline) ... ok

----------------------------------------------------------------------
Ran 6 tests in 10.714s

OK
make: Leaving directory '/mnt/d/Projects/pokemon-x-decomp-local/native'

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/0/3/7 --entry 0 --texture 0 --software --frames 3 --self-test-input --screenshot /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/heart-pixels.bmp --capture-frame /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/heart-frame.bmp
exit_code=0
[asset-viewer] Saved decoded image at original size: /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/heart-pixels.bmp
[asset-viewer] Video=x11 renderer=software image=64x64. This viewer does not run gameplay.
[asset-viewer] Input self-test passed: pan, zoom, reset, resize, Escape.
[asset-viewer] Saved rendered frame 960x640: /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/heart-frame.bmp
[asset-viewer] Exit after 3 rendered frames, 0.278 seconds.
container=CGFX textures=2 texture=0 name="k_heart_o" format_namespace=PICA mipmap_levels=1
archive=a/0/3/7 entry=0 subentry=0 members=16 member_bytes=41216 compression=none decoded_bytes=41216 width=64 height=64 format=0 pixels=RGBA8

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/1/0/2 --entry 0 --texture 1 --software --frames 3 --self-test-input --screenshot /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/embedded-etc-pixels.bmp --capture-frame /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/embedded-etc-frame.bmp
exit_code=0
[asset-viewer] Saved decoded image at original size: /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/embedded-etc-pixels.bmp
[asset-viewer] Video=x11 renderer=software image=512x256. This viewer does not run gameplay.
[asset-viewer] Input self-test passed: pan, zoom, reset, resize, Escape.
[asset-viewer] Saved rendered frame 960x640: /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/embedded-etc-frame.bmp
[asset-viewer] Exit after 3 rendered frames, 0.165 seconds.
container=CGFX textures=6 texture=1 name="collision02_kumo01" format_namespace=PICA mipmap_levels=1
archive=a/1/0/2 entry=0 subentry=0 members=161 member_bytes=442880 compression=none decoded_bytes=442880 width=512 height=256 format=13 pixels=RGBA8

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/1/0/2 --entry 0 --list-textures
exit_code=0
container=CGFX textures=6
texture=0 name="collision02_floor" width=128 height=128 format=12 mipmap_levels=1 status=success
texture=1 name="collision02_kumo01" width=512 height=256 format=13 mipmap_levels=1 status=success
texture=2 name="collision02_kumo00" width=512 height=256 format=13 mipmap_levels=1 status=success
texture=3 name="collision02_rainbow" width=256 height=128 format=13 mipmap_levels=1 status=success
texture=4 name="collision02_shabon" width=256 height=256 format=13 mipmap_levels=1 status=success
texture=5 name="collision02_wall" width=32 height=32 format=12 mipmap_levels=1 status=success
archive=a/1/0/2 entry=0 subentry=0 members=161 member_bytes=442880 compression=none decoded_bytes=442880

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/1/6/0 --entry 0 --inspect
exit_code=0
archive=a/1/6/0 entry=0 subentry=0 members=26 member_bytes=987 compression=LZ11 decoded_bytes=8232 width=40 height=40 format=8 pixels=RGBA8

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/0/0/5 --entry 35 --inspect
exit_code=0
archive=a/0/0/5 entry=35 subentry=0 members=50 member_bytes=65576 compression=none decoded_bytes=65576 width=320 height=240 format=10 pixels=RGBA8

[native] native/build/pokemon_asset_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/1/5/9 --entry 0 --inspect
exit_code=0
archive=a/1/5/9 entry=0 subentry=0 members=241 member_bytes=704 compression=LZ11 decoded_bytes=4136 width=40 height=40 format=11 pixels=RGBA8

[native] native/build/pokemon_model_viewer --romfs /mnt/d/Downloads/PokemonX-modules-20261023-104349-3eee2a4b/work/romfs --archive a/1/0/2 --entry 0 --software --frames 3 --self-test-input --capture-frame /mnt/d/Projects/pokemon-x-decomp-local/outputs/native-cgfx/model-frame.bmp
exit_code=0
[model-viewer] Input self-test passed: orbit, zoom, reset, Escape.
[model-viewer] Video=x11 renderer=software; orthographic wireframe.
[model-viewer] Exit after 3 frames.
archive=a/1/0/2 entry=0 subentry=0 model=0 compression=none
name="collision02" vertices=767 triangles=936 shapes=6 bounds_min=(-499.450012,-3.05176e-05,-496.713989) bounds_max=(499.450012,1637.37,496.713989)

[native] /mnt/c/Windows/System32/cmd.exe /c D:\Projects\pokemon-x-decomp-local\outputs\native-cgfx\Open-Model-Viewer.cmd --frames 3
exit_code=0
[model-viewer] Video=x11 renderer=software; orthographic wireframe.
[model-viewer] Exit after 3 frames.
archive=a/1/0/2 entry=0 subentry=0 model=0 compression=none
name="collision02" vertices=767 triangles=936 shapes=6 bounds_min=(-499.450012,-3.05176e-05,-496.713989) bounds_max=(499.450012,1637.37,496.713989)

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer native/assets/bclim.c native/assets/texture.c native/assets/etc1.c native/assets/test_bclim.c -lm -o native/build/test_bclim_sanitized
exit_code=0


[sanitizers] native/build/test_bclim_sanitized
exit_code=0
PASS: BCLIM raw/ETC1/ETC1A4 formats, fixed tile/orientation/color/alpha vectors, crop/stride variants, bounded malformed-input handling

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer native/assets/texture.c native/assets/etc1.c native/assets/test_texture.c -lm -o native/build/test_texture_sanitized
exit_code=0


[sanitizers] native/build/test_texture_sanitized
exit_code=0
PASS: shared PICA payload format widths, explicit non-power-of-two stride, crop, palette separation and bounded cleanup

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer native/assets/cgfx.c native/assets/texture.c native/assets/etc1.c native/assets/test_cgfx.c -lm -o native/build/test_cgfx_sanitized
exit_code=0


[sanitizers] native/build/test_cgfx_sanitized
exit_code=0
PASS: CGFX 14 PICA formats, borrowed names, backward pointers, selection, crop, layout rejection and bounded malformed cleanup

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer native/assets/cgfx_model.c native/assets/test_cgfx_model.c -lm -o native/build/test_cgfx_model_sanitized
exit_code=0


[sanitizers] native/build/test_cgfx_model_sanitized
exit_code=0
CGFX static geometry: fixed vectors, shape rebasing, finite/bounds/format rejection passed

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/SDL2 -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/x86_64-linux-gnu -D_REENTRANT native/app.c native/assets/garc.c native/assets/lz.c native/assets/bclim.c native/assets/texture.c native/assets/etc1.c native/assets/cgfx.c -L/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu/pulseaudio -Wl,-rpath-link,/usr/lib/x86_64-linux-gnu -lSDL2 -lm -o native/build/pokemon_asset_viewer_sanitized
exit_code=0


[sanitizers] python3 -m unittest discover -s native/tests -p test_viewer.py -v
exit_code=0
test_cgfx_bad_descriptor_and_unsupported_mips (test_viewer.ViewerTests.test_cgfx_bad_descriptor_and_unsupported_mips) ... ok
test_cgfx_selection_listing_and_exported_pixels (test_viewer.ViewerTests.test_cgfx_selection_listing_and_exported_pixels) ... ok
test_etc_archive_pipeline_crop_and_exported_alpha (test_viewer.ViewerTests.test_etc_archive_pipeline_crop_and_exported_alpha) ... ok
test_export_does_not_overwrite_existing_files_or_input (test_viewer.ViewerTests.test_export_does_not_overwrite_existing_files_or_input) ... ok
test_invalid_selection_and_options (test_viewer.ViewerTests.test_invalid_selection_and_options) ... ok
test_missing_member_truncated_archive_and_unsupported_texture (test_viewer.ViewerTests.test_missing_member_truncated_archive_and_unsupported_texture) ... ok
test_raw_and_compressed_pipeline_and_exported_pixels (test_viewer.ViewerTests.test_raw_and_compressed_pipeline_and_exported_pixels) ... ok

----------------------------------------------------------------------
Ran 7 tests in 11.280s

OK

[sanitizers] cc -std=c11 -O1 -g -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined -fno-omit-frame-pointer -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/SDL2 -I/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/include/x86_64-linux-gnu -D_REENTRANT native/model_app.c native/assets/garc.c native/assets/lz.c native/assets/cgfx_model.c -L/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath-link,/mnt/d/Projects/pokemon-x-decomp-local/tools/native-sdl/sysroot/usr/lib/x86_64-linux-gnu/pulseaudio -Wl,-rpath-link,/usr/lib/x86_64-linux-gnu -lSDL2 -lm -o native/build/pokemon_model_viewer_sanitized
exit_code=0


[sanitizers] python3 -m unittest discover -s native/tests -p test_model_viewer.py -v
exit_code=0
test_archive_and_compression_errors_create_no_capture (test_model_viewer.ModelViewerTests.test_archive_and_compression_errors_create_no_capture) ... ok
test_capture_preserves_existing_file_and_symlink_target (test_model_viewer.ModelViewerTests.test_capture_preserves_existing_file_and_symlink_target) ... ok
test_demo_frame_capture_and_input (test_model_viewer.ModelViewerTests.test_demo_frame_capture_and_input) ... ok
test_demo_inspection_and_help (test_model_viewer.ModelViewerTests.test_demo_inspection_and_help) ... ok
test_invalid_options_are_rejected_before_loading (test_model_viewer.ModelViewerTests.test_invalid_options_are_rejected_before_loading) ... ok
test_raw_and_lz_model_pipeline (test_model_viewer.ModelViewerTests.test_raw_and_lz_model_pipeline) ... ok

----------------------------------------------------------------------
Ran 6 tests in 24.257s

OK
