From d715255392d9e0c425fa1e8567ccb97d535f2b5f Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Sat, 20 Jul 2024 10:50:07 -0500 Subject: [PATCH 1/8] Added version adapter - new adapter added to common_types that can read a version number, and optionally validate it against an integer, string or tuple(int, int, int) - applied this to all formats using version strings - fixed a bug where standard_format.game_model would ignore the name and version passed to it - fixed a bug where the bmssd tests wouldn't run --- .../common_types.py | 30 ++++++++++++ .../formats/bapd.py | 2 +- .../formats/bldef.py | 2 +- .../formats/blsnd.py | 6 +-- .../formats/bmbls.py | 2 +- .../formats/bmdefs.py | 5 +- .../formats/bmmap.py | 2 +- .../formats/bmmdef.py | 2 +- .../formats/bmsad.py | 14 ++++-- .../formats/bmsas.py | 4 +- .../formats/bmsbk.py | 4 +- .../formats/bmscc.py | 6 +-- .../formats/bmscu.py | 2 +- .../formats/bmsem.py | 4 +- .../formats/bmses.py | 4 +- .../formats/bmsld.py | 11 ++++- .../formats/bmslgroup.py | 2 +- .../formats/bmslink.py | 4 +- .../formats/bmsmd.py | 4 +- .../formats/bmsmsd.py | 4 +- .../formats/bmsnav.py | 4 +- .../formats/bmssd.py | 4 +- .../formats/bmtre.py | 4 +- .../formats/bmtun.py | 4 +- .../formats/brem.py | 2 +- .../formats/bres.py | 2 +- .../formats/brev.py | 2 +- .../formats/brfld.py | 2 +- .../formats/brsa.py | 2 +- .../formats/bsmat.py | 4 +- .../formats/gui_files.py | 6 +-- .../formats/standard_format.py | 13 ++--- .../formats/txt.py | 6 +-- tests/formats/test_bmssd.py | 49 +++++++++++++++---- 34 files changed, 146 insertions(+), 72 deletions(-) diff --git a/src/mercury_engine_data_structures/common_types.py b/src/mercury_engine_data_structures/common_types.py index 4f1d9b2e..8f0c56e2 100644 --- a/src/mercury_engine_data_structures/common_types.py +++ b/src/mercury_engine_data_structures/common_types.py @@ -1,5 +1,6 @@ import copy import functools +import struct import typing import construct @@ -19,6 +20,35 @@ CVector3D = construct.Array(3, Float) CVector4D = construct.Array(4, Float) +class VersionAdapter(Adapter): + def __init__(self, value: int | str | tuple[int, int, int] | None = None): + if isinstance(value, str): + value = tuple([int(i) for i in value.split(".")]) + elif isinstance(value, int): + value = struct.pack(" str: """Specialized construct compile for CVector2/3/4D""" diff --git a/src/mercury_engine_data_structures/formats/bapd.py b/src/mercury_engine_data_structures/formats/bapd.py index ee81afc0..996157ec 100644 --- a/src/mercury_engine_data_structures/formats/bapd.py +++ b/src/mercury_engine_data_structures/formats/bapd.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.standard_format import game_model from mercury_engine_data_structures.game_check import Game -BAPD = game_model('sound::CAudioPresets', 0x02030002) +BAPD = game_model('sound::CAudioPresets', "2.3.2") class Bapd(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bldef.py b/src/mercury_engine_data_structures/formats/bldef.py index 68003553..92cbc4a4 100644 --- a/src/mercury_engine_data_structures/formats/bldef.py +++ b/src/mercury_engine_data_structures/formats/bldef.py @@ -8,7 +8,7 @@ class Bldef(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: - return standard_format.game_model('CLightManager', 0x02000001) + return standard_format.game_model('CLightManager', "1.0.2") @property def lightdefs(self) -> Container: diff --git a/src/mercury_engine_data_structures/formats/blsnd.py b/src/mercury_engine_data_structures/formats/blsnd.py index d319fdf5..c8ec4ae1 100644 --- a/src/mercury_engine_data_structures/formats/blsnd.py +++ b/src/mercury_engine_data_structures/formats/blsnd.py @@ -10,7 +10,7 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game, current_game_at_most @@ -18,8 +18,8 @@ "_magic" / Const(b"LSND"), "version" / IfThenElse( current_game_at_most(Game.SAMUS_RETURNS), - Const(0x000B0001, Hex(Int32ul)), - Const(0x000C0001, Hex(Int32ul)) + VersionAdapter("1.11.0"), + VersionAdapter("1.12.0") ), "unk" / Int32ul, "sound_limits" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmbls.py b/src/mercury_engine_data_structures/formats/bmbls.py index 5a3bca90..03b4372d 100644 --- a/src/mercury_engine_data_structures/formats/bmbls.py +++ b/src/mercury_engine_data_structures/formats/bmbls.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMBLS = standard_format.create('base::animation::CBlendSpaceResource', 0x02020001) +BMBLS = standard_format.create('base::animation::CBlendSpaceResource', "1.2.2") class Bmbls(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmdefs.py b/src/mercury_engine_data_structures/formats/bmdefs.py index cbc63c69..2d711ce9 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -9,7 +9,7 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -67,8 +67,7 @@ BMDEFS = Struct( _magic=Const(b"MDEF"), - major_version=Int16ul, - minor_version=Int16ul, + version=VersionAdapter(), unk1=Int32ul, sounds=make_vector(Struct( "sound_name" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmmap.py b/src/mercury_engine_data_structures/formats/bmmap.py index 38204ad9..66a870fc 100644 --- a/src/mercury_engine_data_structures/formats/bmmap.py +++ b/src/mercury_engine_data_structures/formats/bmmap.py @@ -6,7 +6,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMMAP = standard_format.create('CMinimapData', 0x02000001) +BMMAP = standard_format.create('CMinimapData', "1.0.2") class Bmmap(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmmdef.py b/src/mercury_engine_data_structures/formats/bmmdef.py index 3cbeb8ad..fcf1a9e6 100644 --- a/src/mercury_engine_data_structures/formats/bmmdef.py +++ b/src/mercury_engine_data_structures/formats/bmmdef.py @@ -6,7 +6,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMMDEF = standard_format.create('CMinimapDef', 0x02000001) +BMMDEF = standard_format.create('CMinimapDef', "1.0.2") class Bmmdef(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsad.py b/src/mercury_engine_data_structures/formats/bmsad.py index 51b2fcd2..79cd87e8 100644 --- a/src/mercury_engine_data_structures/formats/bmsad.py +++ b/src/mercury_engine_data_structures/formats/bmsad.py @@ -22,7 +22,15 @@ from construct.lib.containers import Container, ListContainer from mercury_engine_data_structures import common_types, type_lib -from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict, make_vector +from mercury_engine_data_structures.common_types import ( + Char, + CVector3D, + Float, + StrId, + make_dict, + make_vector, + VersionAdapter +) from mercury_engine_data_structures.construct_extensions.alignment import PrefixedAllowZeroLen from mercury_engine_data_structures.construct_extensions.function_complex import ComplexIf, SwitchComplexKey from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage @@ -320,7 +328,7 @@ def _not_implemented(code): # BMSAD BMSAD_SR = Struct( "_magic" / Const(b"MSAD"), - "version" / Const(0x002C0001, Hex(Int32ul)), + "version" / VersionAdapter("1.44.0"), "name" / StrId, @@ -349,7 +357,7 @@ def _not_implemented(code): BMSAD_Dread = Struct( "_magic" / Const(b"MSAD"), - "version" / Const(0x0200000F, Hex(Int32ul)), + "version" / VersionAdapter("15.0.2"), "name" / StrId, "type" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmsas.py b/src/mercury_engine_data_structures/formats/bmsas.py index a1999ca4..b37e016c 100644 --- a/src/mercury_engine_data_structures/formats/bmsas.py +++ b/src/mercury_engine_data_structures/formats/bmsas.py @@ -17,7 +17,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, make_vector +from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, make_vector, VersionAdapter from mercury_engine_data_structures.common_types import StrId as StrIdSR from mercury_engine_data_structures.construct_extensions.strings import PascalStringRobust from mercury_engine_data_structures.formats.base_resource import BaseResource @@ -266,7 +266,7 @@ def build_arg_list_sr(obj_data: dict, io, this): BMSAS_Dread = Struct( _magic=Const(b"MSAS"), - _version=Const(0x00170003, Hex(Int32ul)), + _version=VersionAdapter("3.23.0"), name=StrId, unk=Hex(Int32ul), animations=make_vector(AnimationDread), diff --git a/src/mercury_engine_data_structures/formats/bmsbk.py b/src/mercury_engine_data_structures/formats/bmsbk.py index 427e99f5..e4a793ba 100644 --- a/src/mercury_engine_data_structures/formats/bmsbk.py +++ b/src/mercury_engine_data_structures/formats/bmsbk.py @@ -14,7 +14,7 @@ Terminated, ) -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -45,7 +45,7 @@ def _rebuild_types(ctx: Container) -> int: BMSBK = Struct( "magic" / Const(b"MSBK"), - "version" / Hex(Int32ul), + "version" / VersionAdapter(), "block_groups" / make_vector(BlockGroup), "collision_cameras" / make_vector(Struct( "name" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmscc.py b/src/mercury_engine_data_structures/formats/bmscc.py index 0c826825..c4943e8c 100644 --- a/src/mercury_engine_data_structures/formats/bmscc.py +++ b/src/mercury_engine_data_structures/formats/bmscc.py @@ -12,7 +12,7 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import StrId, UInt, make_vector +from mercury_engine_data_structures.common_types import StrId, UInt, make_vector, VersionAdapter from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.formats.collision import collision_formats @@ -47,8 +47,8 @@ _magic=Const(b"MSCD"), _version=IfThenElse( game_check.current_game_at_most(Game.SAMUS_RETURNS), - Const(0x000D0001, Hex(UInt)), - Const(0x00100001, Hex(UInt)), + VersionAdapter("1.14.0"), + VersionAdapter("1.16.0"), ), layers=make_vector(CollisionLayer), eof=GreedyBytes, diff --git a/src/mercury_engine_data_structures/formats/bmscu.py b/src/mercury_engine_data_structures/formats/bmscu.py index 499a4292..3ff63cd2 100644 --- a/src/mercury_engine_data_structures/formats/bmscu.py +++ b/src/mercury_engine_data_structures/formats/bmscu.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSCU = standard_format.create('CCutSceneDef', 0x02030008) +BMSCU = standard_format.create('CCutSceneDef', "8.3.2") class Bmscu(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsem.py b/src/mercury_engine_data_structures/formats/bmsem.py index 82e53257..f4415912 100644 --- a/src/mercury_engine_data_structures/formats/bmsem.py +++ b/src/mercury_engine_data_structures/formats/bmsem.py @@ -8,13 +8,13 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSEM = Struct( _magic=Const(b"MSEM"), - _version=Const(0x00030001, Hex(Int32ul)), + _version=VersionAdapter("1.3.0"), groups=make_vector(Struct( "group_name" / StrId, "layers" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmses.py b/src/mercury_engine_data_structures/formats/bmses.py index 5442169c..b8e54250 100644 --- a/src/mercury_engine_data_structures/formats/bmses.py +++ b/src/mercury_engine_data_structures/formats/bmses.py @@ -11,13 +11,13 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSES = Struct( "_magic" / Const(b"MSES"), - "version" / Const(0x00050001, Hex(Int32ul)), + "version" / VersionAdapter("1.5.0"), "sounds" / make_vector(Struct( "name" / StrId, "sound_file" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmsld.py b/src/mercury_engine_data_structures/formats/bmsld.py index 89884e09..c98022bc 100644 --- a/src/mercury_engine_data_structures/formats/bmsld.py +++ b/src/mercury_engine_data_structures/formats/bmsld.py @@ -4,7 +4,14 @@ import construct from construct import Const, Construct, Container, Flag, Float32l, Hex, Int32ul, Struct, Switch -from mercury_engine_data_structures.common_types import CVector3D, Float, StrId, make_dict, make_vector +from mercury_engine_data_structures.common_types import ( + CVector3D, + Float, + StrId, + make_dict, + make_vector, + VersionAdapter +) from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.crc import crc32 @@ -81,7 +88,7 @@ BMSLD = Struct( _magic=Const(b"MSLD"), - version=Const(0x00140001, Hex(Int32ul)), + version=VersionAdapter("1.20.0"), unk1=Int32ul, unk2=Int32ul, diff --git a/src/mercury_engine_data_structures/formats/bmslgroup.py b/src/mercury_engine_data_structures/formats/bmslgroup.py index c9cf9380..80ea19c4 100644 --- a/src/mercury_engine_data_structures/formats/bmslgroup.py +++ b/src/mercury_engine_data_structures/formats/bmslgroup.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSLGROUP = standard_format.create('navmesh::CDynamicSmartLinkGroup', 0x02000001) +BMSLGROUP = standard_format.create('navmesh::CDynamicSmartLinkGroup', "1.0.2") class Bmslgroup(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmslink.py b/src/mercury_engine_data_structures/formats/bmslink.py index d7484fd4..ff34a00e 100644 --- a/src/mercury_engine_data_structures/formats/bmslink.py +++ b/src/mercury_engine_data_structures/formats/bmslink.py @@ -10,7 +10,7 @@ Struct, ) -from mercury_engine_data_structures.common_types import Float, StrId +from mercury_engine_data_structures.common_types import Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -54,7 +54,7 @@ BMSLINK = Struct( _magic = Const(b"LINK"), - version = Const(0x001F0001, Hex(Int32ul)), + version = VersionAdapter("1.31.0"), unk_bool = Byte, location = LocationStruct, diff --git a/src/mercury_engine_data_structures/formats/bmsmd.py b/src/mercury_engine_data_structures/formats/bmsmd.py index ba01cd41..29f75df7 100644 --- a/src/mercury_engine_data_structures/formats/bmsmd.py +++ b/src/mercury_engine_data_structures/formats/bmsmd.py @@ -11,13 +11,13 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSMD = Struct( "_magic" / Const(b"MSMD"), - "version" / Const(0x000D0001, Hex(Int32ul)), + "version" / VersionAdapter("1.13.0"), "map_data" / make_vector(Struct( "icon" / StrId, "scenarios" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index c34de497..c676fac8 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -3,7 +3,7 @@ import construct from construct.core import Const, Construct, Enum, FlagsEnum, Float32l, Hex, Int32sl, Int32ul, Struct -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, make_vector, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -41,7 +41,7 @@ # BMSMSD BMSMSD = Struct( "_magic" / Const(b"MMSD"), - "version" / Const(0x00070001, Hex(Int32ul)), + "version" / VersionAdapter("1.7.0"), "scenario" / StrId, "tile_size" / construct.Array(2, Float32l), "x_tiles" / Int32sl, diff --git a/src/mercury_engine_data_structures/formats/bmsnav.py b/src/mercury_engine_data_structures/formats/bmsnav.py index c03433ea..fd104bf6 100644 --- a/src/mercury_engine_data_structures/formats/bmsnav.py +++ b/src/mercury_engine_data_structures/formats/bmsnav.py @@ -1,6 +1,6 @@ from construct.core import Array, Byte, Const, Construct, Flag, Hex, Int32ul, PrefixedArray, Struct, Terminated -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, make_dict +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, make_dict, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -162,7 +162,7 @@ ) BMSNAV = Struct( _magic=Const(b'MNAV'), - version=Const(0x00030002, Hex(Int32ul)), + version=VersionAdapter("2.3.0"), aNavmeshGeos=PrefixedArray(Int32ul, CVector2D), # giant list of all of the navmesh geos in the scenario. referenced by index all over the rest of the format. geo_connections=PrefixedArray(Int32ul, geo_connections), # maybe mapping the geo connections? diff --git a/src/mercury_engine_data_structures/formats/bmssd.py b/src/mercury_engine_data_structures/formats/bmssd.py index 8376b073..901ecf9a 100644 --- a/src/mercury_engine_data_structures/formats/bmssd.py +++ b/src/mercury_engine_data_structures/formats/bmssd.py @@ -10,14 +10,14 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector, VersionAdapter from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSSD = Struct( _magic=Const(b"MSSD"), - unk1=Int32ul, + unk1=VersionAdapter(), part_info=game_check.is_at_most( Game.SAMUS_RETURNS, make_vector( diff --git a/src/mercury_engine_data_structures/formats/bmtre.py b/src/mercury_engine_data_structures/formats/bmtre.py index b9be6280..71985fd4 100644 --- a/src/mercury_engine_data_structures/formats/bmtre.py +++ b/src/mercury_engine_data_structures/formats/bmtre.py @@ -14,7 +14,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Float, StrId +from mercury_engine_data_structures.common_types import Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.formats.property_enum import PropertyEnum from mercury_engine_data_structures.game_check import Game @@ -56,7 +56,7 @@ BMTRE = Struct( _magic = Const(b"BTRE"), - version = Const(0x00050001, Hex(Int32ul)), # for dread, unsure if it exists in SR + version = VersionAdapter("1.5.0"), args = PrefixedArray(Int32ul, StrKeyArgument), behavior = Behavior, ) diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index c05719d8..094baf74 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -12,7 +12,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict +from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict, VersionAdapter from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -40,7 +40,7 @@ # BMTUN BMTUN = Struct( "_magic" / Const(b"MTUN"), - "version" / Const(0x00050001, Hex(Int32ul)), + "version" / VersionAdapter("1.5.0"), "classes" / make_dict(TunableClass), construct.Terminated, ) diff --git a/src/mercury_engine_data_structures/formats/brem.py b/src/mercury_engine_data_structures/formats/brem.py index da41b063..568725b3 100644 --- a/src/mercury_engine_data_structures/formats/brem.py +++ b/src/mercury_engine_data_structures/formats/brem.py @@ -8,4 +8,4 @@ class Brem(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentMusicPresets', 0x02000004) + return standard_format.game_model('CEnvironmentMusicPresets', "4.0.2") diff --git a/src/mercury_engine_data_structures/formats/bres.py b/src/mercury_engine_data_structures/formats/bres.py index 3f3ad88c..f4af7700 100644 --- a/src/mercury_engine_data_structures/formats/bres.py +++ b/src/mercury_engine_data_structures/formats/bres.py @@ -8,4 +8,4 @@ class Bres(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentSoundPresets', 0x02020001) + return standard_format.game_model('CEnvironmentSoundPresets', "1.2.2") diff --git a/src/mercury_engine_data_structures/formats/brev.py b/src/mercury_engine_data_structures/formats/brev.py index ffcd431b..a46389bb 100644 --- a/src/mercury_engine_data_structures/formats/brev.py +++ b/src/mercury_engine_data_structures/formats/brev.py @@ -8,4 +8,4 @@ class Brev(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentVisualPresets', 0x02020004) + return standard_format.game_model('CEnvironmentVisualPresets', "4.2.2") diff --git a/src/mercury_engine_data_structures/formats/brfld.py b/src/mercury_engine_data_structures/formats/brfld.py index 5c1e964a..a898291b 100644 --- a/src/mercury_engine_data_structures/formats/brfld.py +++ b/src/mercury_engine_data_structures/formats/brfld.py @@ -15,7 +15,7 @@ class Brfld(BaseResource): @classmethod @functools.lru_cache def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CScenario', 0x02000031) + return standard_format.game_model('CScenario', "49.0.2") def actors_for_layer(self, name: str) -> dict: return self.raw.Root.pScenario.rEntitiesLayer.dctSublayers[name].dctActors diff --git a/src/mercury_engine_data_structures/formats/brsa.py b/src/mercury_engine_data_structures/formats/brsa.py index 03f94b82..23b574c9 100644 --- a/src/mercury_engine_data_structures/formats/brsa.py +++ b/src/mercury_engine_data_structures/formats/brsa.py @@ -12,7 +12,7 @@ class Brsa(BaseResource): @classmethod @functools.lru_cache def construct_class(cls, target_game: Game) -> Construct: - return standard_format.game_model('CSubAreaManager', 0x02010002) + return standard_format.game_model('CSubAreaManager', "2.1.2") @property def subarea_setups(self) -> Iterator[Container]: diff --git a/src/mercury_engine_data_structures/formats/bsmat.py b/src/mercury_engine_data_structures/formats/bsmat.py index 4f647564..59046e57 100644 --- a/src/mercury_engine_data_structures/formats/bsmat.py +++ b/src/mercury_engine_data_structures/formats/bsmat.py @@ -15,7 +15,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, Float, StrId +from mercury_engine_data_structures.common_types import Char, Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -222,7 +222,7 @@ BSMAT = Struct( _magic = Const(b"MSUR"), - _ver = Const(0x00110002, Hex(Int32ul)), + _ver = VersionAdapter("2.17.0"), name = StrId, # Binary shader data diff --git a/src/mercury_engine_data_structures/formats/gui_files.py b/src/mercury_engine_data_structures/formats/gui_files.py index ec4aa52f..199d46fd 100644 --- a/src/mercury_engine_data_structures/formats/gui_files.py +++ b/src/mercury_engine_data_structures/formats/gui_files.py @@ -4,9 +4,9 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSCP = standard_format.create('GUI::CDisplayObjectContainer', 0x02020001, explicit_root=True) -BMSSK = standard_format.create('GUI::CGUIManager::SkinContainer', 0x02020001, explicit_root=True) -BMSSS = standard_format.create('GUI::CGUIManager::SpriteSheetContainer', 0x02020001, explicit_root=True) +BMSCP = standard_format.create('GUI::CDisplayObjectContainer', "1.2.2", explicit_root=True) +BMSSK = standard_format.create('GUI::CGUIManager::SkinContainer', "1.2.2", explicit_root=True) +BMSSS = standard_format.create('GUI::CGUIManager::SpriteSheetContainer', "1.2.2", explicit_root=True) class Bmscp(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/standard_format.py b/src/mercury_engine_data_structures/formats/standard_format.py index 5e09242d..3eedc95c 100644 --- a/src/mercury_engine_data_structures/formats/standard_format.py +++ b/src/mercury_engine_data_structures/formats/standard_format.py @@ -4,6 +4,7 @@ import construct +from mercury_engine_data_structures.common_types import VersionAdapter from mercury_engine_data_structures.formats.property_enum import PropertyEnum from mercury_engine_data_structures.game_check import Game, GameSpecificStruct from mercury_engine_data_structures.type_lib import get_type_lib_dread @@ -13,7 +14,7 @@ def _const_if_present(con: construct.Construct, value: typing.Any | None) -> con return construct.Const(value, con) if value is not None else con -def create(name: Optional[str], version: Optional[int], root_name: Optional[str] = None, explicit_root: bool = False): +def create(name: Optional[str], version: Optional[int | str | tuple[int, int, int]], root_name: Optional[str] = None, explicit_root: bool = False): # this maybe needs to change in the future if SR and Dread have different formats for type using this type_lib = get_type_lib_dread() if root_name is None: @@ -30,7 +31,7 @@ def create(name: Optional[str], version: Optional[int], root_name: Optional[str] result = GameSpecificStruct(construct.Struct( _class_crc=_const_if_present(PropertyEnum, name), - _version=_const_if_present(construct.Hex(construct.Int32ul), version), + _version=VersionAdapter(version), root_type=construct.Const('Root', PropertyEnum), Root=root, @@ -42,9 +43,9 @@ def create(name: Optional[str], version: Optional[int], root_name: Optional[str] @functools.lru_cache -def _cached_game_model(): - return create(None, None, "gameeditor::CGameModelRoot").compile() +def _cached_game_model(name: Optional[str], version: Optional[int | str | tuple[int, int, int]]): + return create(name, version, "gameeditor::CGameModelRoot").compile() -def game_model(name: str, version: int): - return _cached_game_model() +def game_model(name: Optional[str], version: Optional[int | str | tuple[int, int, int]]): + return _cached_game_model(name, version) diff --git a/src/mercury_engine_data_structures/formats/txt.py b/src/mercury_engine_data_structures/formats/txt.py index da2dac8c..789db228 100644 --- a/src/mercury_engine_data_structures/formats/txt.py +++ b/src/mercury_engine_data_structures/formats/txt.py @@ -4,7 +4,7 @@ import construct from construct.core import Const, Construct, GreedyRange, Struct -from mercury_engine_data_structures.common_types import DictAdapter, DictElement +from mercury_engine_data_structures.common_types import DictAdapter, DictElement, VersionAdapter from mercury_engine_data_structures.construct_extensions.strings import CStringRobust from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game, is_sr_or_else @@ -39,8 +39,8 @@ def _parse_{n}(io, this): TXT = Struct( "magic" / Const(b'BTXT'), "version" / is_sr_or_else( - Const(b'\x01\x00\x08\x00'), - Const(b'\x01\x00\x0a\x00'), + VersionAdapter("1.8.0"), + VersionAdapter("1.10.0"), ), "strings" / DictAdapter(_string_range), "_end" / construct.Terminated, diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 1d4e072f..ba17c663 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -1,15 +1,44 @@ -from tests.test_lib import parse_and_build_compare +import contextlib +import pytest +from tests.test_lib import parse_build_compare_editor -from mercury_engine_data_structures.formats.bmssd import BMSSD +from mercury_engine_data_structures import dread_data, samus_returns_data +from mercury_engine_data_structures.formats.bmssd import Bmssd from mercury_engine_data_structures.game_check import Game -def test_compare_dread(dread_path): - parse_and_build_compare( - BMSSD, Game.DREAD, dread_path.joinpath("packs/maps/s060_quarantine/s060_quarantine.bmssd") - ) +dread_bmssd = [name for name in dread_data.all_name_to_asset_id().keys() + if name.endswith(".bmssd")] -def test_compare_msr(samus_returns_path): - parse_and_build_compare( - BMSSD, Game.SAMUS_RETURNS, samus_returns_path.joinpath("packs/maps/s050_area5/s050_area5.bmssd") - ) +sr_bmssd = [name for name in samus_returns_data.all_name_to_asset_id().keys() + if name.endswith(".bmssd")] + +expected_sr_failures = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmssd", + "maps/levels/c10_samus/s904_omega/s904_omega.bmssd", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmssd", + "maps/levels/c10_samus/s905_queen/s905_queen.bmssd", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmssd", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmssd", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmssd", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmssd", + "maps/levels/c10_samus/s910_gym/s910_gym.bmssd", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmssd", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmssd", +] + +@pytest.mark.parametrize("bmssd_path", dread_bmssd) +def test_compare_dread(dread_file_tree, bmssd_path): + parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) + +@pytest.mark.parametrize("bmssd_path", sr_bmssd) +def test_compare_msr(samus_returns_tree, bmssd_path): + if bmssd_path in expected_sr_failures: + expectation = pytest.raises(FileNotFoundError) + else: + expectation = contextlib.nullcontext() + + with expectation: + parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) From 9adc56f26a764987432acd66d1f165bb009da666 Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Sat, 20 Jul 2024 11:33:16 -0500 Subject: [PATCH 2/8] test overhaul - added parse/build of dread .bmdefs (standard format) - added functions to dread_data and samus_returns_data to get a list of all files ending in an extension - applied this change to all tests that were using list comp to do this already - fixed some tests that were only testing a subset of the total files --- README.md | 2 +- .../dread_data.py | 6 ++++++ .../formats/bmdefs.py | 8 ++++++-- .../samus_returns_data.py | 6 ++++++ tests/formats/test_bapd.py | 5 +---- tests/formats/test_bcmdl.py | 4 +--- tests/formats/test_bctex.py | 5 ++--- tests/formats/test_blsnd.py | 9 ++------- tests/formats/test_bmbls.py | 16 +++++++--------- tests/formats/test_bmdefs.py | 5 ++++- tests/formats/test_bmmap.py | 15 ++------------- tests/formats/test_bmsad.py | 9 ++------- tests/formats/test_bmsas.py | 5 +---- tests/formats/test_bmsbk.py | 5 +---- tests/formats/test_bmscu.py | 10 +++++----- tests/formats/test_bmsem.py | 8 +++----- tests/formats/test_bmses.py | 5 +---- tests/formats/test_bmsld.py | 8 ++++++-- tests/formats/test_bmsmd.py | 10 +++++----- tests/formats/test_bmsmsd.py | 5 +---- tests/formats/test_bmsnav.py | 10 +++++++--- tests/formats/test_bmssd.py | 10 ++-------- tests/formats/test_bmtre.py | 5 +---- tests/formats/test_bmtun.py | 4 +--- tests/formats/test_brfld.py | 15 ++------------- tests/formats/test_bsmat.py | 5 +---- tests/formats/test_gui.py | 19 ++++++++++++------- tests/formats/test_minimap.py | 9 +++------ tests/formats/test_pkg.py | 11 +++-------- tests/formats/test_txt.py | 12 ++++++++---- 30 files changed, 103 insertions(+), 143 deletions(-) diff --git a/README.md b/README.md index 1dc1ad86..cbfa311c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Construct type definitions for Mercury Engine | BLSND | ✓ | ✓ | ✓ | ✓ | | BLUT | Missing | Missing | ✗ | ✗ | | BMBLS | Missing | Missing | ✓ | ✓ | -| BMDEFS | ✓ | ✓ | ✗ | ✗ | +| BMDEFS | ✓ | ✓ | ✓ | ✓ | | BMMAP | Missing | Missing | ✓ | ✓ | | BMMDEF | Missing | Missing | ✓ | ✓ | | BMSAD | ✓ | ✓ | ✓ | ✓ | diff --git a/src/mercury_engine_data_structures/dread_data.py b/src/mercury_engine_data_structures/dread_data.py index 470bb3cc..0dc2b1f4 100644 --- a/src/mercury_engine_data_structures/dread_data.py +++ b/src/mercury_engine_data_structures/dread_data.py @@ -58,3 +58,9 @@ def all_property_id_to_name() -> Dict[int, str]: asset_id: name for name, asset_id in names.items() } + +def all_files_ending_with(ext: str) -> list[str]: + if not ext.startswith("."): + ext = "." + ext + + return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] \ No newline at end of file diff --git a/src/mercury_engine_data_structures/formats/bmdefs.py b/src/mercury_engine_data_structures/formats/bmdefs.py index 2d711ce9..65abd523 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -10,6 +10,7 @@ ) from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.formats import standard_format from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -67,7 +68,7 @@ BMDEFS = Struct( _magic=Const(b"MDEF"), - version=VersionAdapter(), + version=VersionAdapter("1.5.0"), unk1=Int32ul, sounds=make_vector(Struct( "sound_name" / StrId, @@ -91,4 +92,7 @@ class Bmdefs(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: - return BMDEFS + if target_game == Game.SAMUS_RETURNS: + return BMDEFS + else: + return standard_format.game_model("sound::CMusicManager", "4.0.2") diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index 62e9e274..3aa834de 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -59,3 +59,9 @@ def all_property_id_to_name() -> Dict[int, str]: asset_id: name for name, asset_id in names.items() } + +def all_files_ending_with(ext: str) -> list[str]: + if not ext.startswith("."): + ext = "." + ext + + return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] \ No newline at end of file diff --git a/tests/formats/test_bapd.py b/tests/formats/test_bapd.py index 8ee1ad60..5c91d7b1 100644 --- a/tests/formats/test_bapd.py +++ b/tests/formats/test_bapd.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bapd import Bapd -all_dread_bapd = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bapd")] - -@pytest.mark.parametrize("bapd_path", all_dread_bapd) +@pytest.mark.parametrize("bapd_path", dread_data.all_files_ending_with(".bapd")) def test_bmtre(dread_file_tree, bapd_path): parse_build_compare_editor(Bapd, dread_file_tree, bapd_path) diff --git a/tests/formats/test_bcmdl.py b/tests/formats/test_bcmdl.py index 07bf43e9..4d62b894 100644 --- a/tests/formats/test_bcmdl.py +++ b/tests/formats/test_bcmdl.py @@ -6,8 +6,6 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bcmdl import Bcmdl -all_dread_bcmdl = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bcmdl")] dread_bcmdl_expected_failure = [ 'actors/characters/morphball/models/labase.bcmdl', @@ -27,7 +25,7 @@ ] -@pytest.mark.parametrize("bcmdl_path", all_dread_bcmdl) +@pytest.mark.parametrize("bcmdl_path", dread_data.all_files_ending_with(".bcmdl")) def test_compare_dread_all(dread_file_tree, bcmdl_path): if bcmdl_path in dread_bcmdl_expected_failure: expectation = pytest.raises(AssertionError) diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index 73d3db43..3745a58e 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -12,10 +12,9 @@ def test_compare_dread(dread_path): print_data=True, ) -all_sr_bctex = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bctex")] +#all_sr_bctex = samus_returns_data.all_files_ending_with(".bctex") -@pytest.mark.parametrize("bctex_path", all_sr_bctex) +@pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex")) def test_compare_sr(samus_returns_path, bctex_path): parse_and_build_compare_parsed( BCTEX_SR, Game.SAMUS_RETURNS, samus_returns_path.joinpath(bctex_path), diff --git a/tests/formats/test_blsnd.py b/tests/formats/test_blsnd.py index a4af6abe..790ca210 100644 --- a/tests/formats/test_blsnd.py +++ b/tests/formats/test_blsnd.py @@ -4,16 +4,11 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.blsnd import Blsnd -all_sr_blsnd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".blsnd")] -all_dread_blsnd = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".blsnd")] - -@pytest.mark.parametrize("blsnd_path", all_sr_blsnd) +@pytest.mark.parametrize("blsnd_path", samus_returns_data.all_files_ending_with(".blsnd")) def test_blsnd(samus_returns_tree, blsnd_path): parse_build_compare_editor(Blsnd, samus_returns_tree, blsnd_path) -@pytest.mark.parametrize("blsnd_path", all_dread_blsnd) +@pytest.mark.parametrize("blsnd_path", dread_data.all_files_ending_with(".blsnd")) def test_blsnd_dread(dread_file_tree, blsnd_path): parse_build_compare_editor(Blsnd, dread_file_tree, blsnd_path) diff --git a/tests/formats/test_bmbls.py b/tests/formats/test_bmbls.py index f8bd60ad..a41b3d1e 100644 --- a/tests/formats/test_bmbls.py +++ b/tests/formats/test_bmbls.py @@ -1,13 +1,11 @@ -from tests.test_lib import parse_and_build_compare +import pytest +from tests.test_lib import parse_build_compare_editor -from mercury_engine_data_structures.formats.bmbls import BMBLS +from mercury_engine_data_structures import dread_data +from mercury_engine_data_structures.formats.bmbls import Bmbls from mercury_engine_data_structures.game_check import Game -def test_compare_dread(dread_path): - parse_and_build_compare( - BMBLS, Game.DREAD, dread_path.joinpath( - "packs/maps/s010_cave/subareas/subareapack_scorpius/actors/characters/" - "scorpius/animations/blendspaces/walktailinit.bmbls" - ) - ) +@pytest.mark.parametrize("bmbls_path", dread_data.all_files_ending_with(".bmbls")) +def test_compare_dread(dread_file_tree, bmbls_path): + parse_build_compare_editor(Bmbls, dread_file_tree, bmbls_path) diff --git a/tests/formats/test_bmdefs.py b/tests/formats/test_bmdefs.py index 495b5ce1..0d002045 100644 --- a/tests/formats/test_bmdefs.py +++ b/tests/formats/test_bmdefs.py @@ -3,5 +3,8 @@ from mercury_engine_data_structures.formats.bmdefs import Bmdefs -def test_bmdefs(samus_returns_tree): +def test_bmdefs_dread(dread_file_tree): + parse_build_compare_editor(Bmdefs, dread_file_tree, "system/snd/scenariomusicdefs.bmdefs") + +def test_bmdefs_sr(samus_returns_tree): parse_build_compare_editor(Bmdefs, samus_returns_tree, "system/snd/scenariomusicdefs.bmdefs") diff --git a/tests/formats/test_bmmap.py b/tests/formats/test_bmmap.py index 820dc7fb..da83edf9 100644 --- a/tests/formats/test_bmmap.py +++ b/tests/formats/test_bmmap.py @@ -1,22 +1,11 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmmap import Bmmap -dread_bmmap = [ - "maps/levels/c10_samus/s010_cave/s010_cave.bmmap", - "maps/levels/c10_samus/s020_magma/s020_magma.bmmap", - "maps/levels/c10_samus/s030_baselab/s030_baselab.bmmap", - "maps/levels/c10_samus/s040_aqua/s040_aqua.bmmap", - "maps/levels/c10_samus/s050_forest/s050_forest.bmmap", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.bmmap", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.bmmap", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.bmmap", - "maps/levels/c10_samus/s090_skybase/s090_skybase.bmmap", -] - -@pytest.mark.parametrize("bmmap_path", dread_bmmap) +@pytest.mark.parametrize("bmmap_path", dread_data.all_files_ending_with(".bmmap")) def test_dread_bmmap(dread_file_tree, bmmap_path): parse_build_compare_editor(Bmmap, dread_file_tree, bmmap_path) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index fdd05fa8..d0e82eb4 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -9,11 +9,6 @@ from mercury_engine_data_structures.formats import dread_types from mercury_engine_data_structures.formats.bmsad import ActorDefFunc, Bmsad -all_sr_bmsad = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsad")] - -all_dread_bmsad = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmsad")] expected_dread_failures = { "actors/props/pf_mushr_fr/charclasses/pf_mushr_fr.bmsad", @@ -21,7 +16,7 @@ expected_sr_failures = set() -@pytest.mark.parametrize("bmsad_path", all_dread_bmsad) +@pytest.mark.parametrize("bmsad_path", dread_data.all_files_ending_with(".bmsad")) def test_compare_dread_all(dread_file_tree, bmsad_path): if bmsad_path in expected_dread_failures: expectation = pytest.raises(construct.ConstructError) @@ -34,7 +29,7 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): ) -@pytest.mark.parametrize("bmsad_path", all_sr_bmsad) +@pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad")) def test_compare_sr_all(samus_returns_tree, bmsad_path): if not samus_returns_tree.does_asset_exists(bmsad_path): return pytest.skip() diff --git a/tests/formats/test_bmsas.py b/tests/formats/test_bmsas.py index 0dc4cc9a..d2357238 100644 --- a/tests/formats/test_bmsas.py +++ b/tests/formats/test_bmsas.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmsas import Bmsas -all_dread_bmsas = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmsas")] - -@pytest.mark.parametrize("bmsas_path", all_dread_bmsas) +@pytest.mark.parametrize("bmsas_path", dread_data.all_files_ending_with(".bmsas")) def test_bmsas(dread_file_tree, bmsas_path): parse_build_compare_editor(Bmsas, dread_file_tree, bmsas_path) diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index edc9be57..7c97ac12 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -4,11 +4,8 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsbk import Bmsbk -all_sr_bmsbk = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsbk")] - -@pytest.mark.parametrize("bmsbk_path", all_sr_bmsbk) +@pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk")) def test_bmsbk(samus_returns_tree, bmsbk_path): try: parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmscu.py b/tests/formats/test_bmscu.py index 60f0f72b..5ec7bc83 100644 --- a/tests/formats/test_bmscu.py +++ b/tests/formats/test_bmscu.py @@ -1,10 +1,10 @@ +import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmscu import Bmscu -def test_compare_dread(dread_file_tree): - parse_build_compare_editor( - Bmscu, dread_file_tree, - "cutscenes/0037emmycaveappears/0037emmycaveappears.bmscu" - ) +@pytest.mark.parametrize("bmscu_path", dread_data.all_files_ending_with(".bmscu")) +def test_compare_dread(dread_file_tree, bmscu_path): + parse_build_compare_editor(Bmscu, dread_file_tree, bmscu_path) diff --git a/tests/formats/test_bmsem.py b/tests/formats/test_bmsem.py index 9e91de71..25a246f5 100644 --- a/tests/formats/test_bmsem.py +++ b/tests/formats/test_bmsem.py @@ -4,9 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsem import Bmsem -all_sr_bmsmsd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsem")] -@pytest.mark.parametrize("bmsmsd_path", all_sr_bmsmsd) -def test_bmsem(samus_returns_tree, bmsmsd_path): - parse_build_compare_editor(Bmsem, samus_returns_tree, bmsmsd_path, print_data=True) +@pytest.mark.parametrize("bmsem_path", samus_returns_data.all_files_ending_with(".bmsem")) +def test_bmsem(samus_returns_tree, bmsem_path): + parse_build_compare_editor(Bmsem, samus_returns_tree, bmsem_path, print_data=True) diff --git a/tests/formats/test_bmses.py b/tests/formats/test_bmses.py index 880d6851..b60ba854 100644 --- a/tests/formats/test_bmses.py +++ b/tests/formats/test_bmses.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmses import Bmses -all_sr_bmses = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmses")] - -@pytest.mark.parametrize("bmses_path", all_sr_bmses) +@pytest.mark.parametrize("bmses_path", samus_returns_data.all_files_ending_with(".bmses")) def test_bmses(samus_returns_tree, bmses_path): parse_build_compare_editor(Bmses, samus_returns_tree, bmses_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index e672c4f2..8f9fdbe3 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -1,6 +1,7 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsld import Bmsld all_bmsld = [ @@ -30,9 +31,12 @@ def surface_bmsld(samus_returns_tree) -> Bmsld: return samus_returns_tree.get_parsed_asset(all_bmsld[0], type_hint=Bmsld) -@pytest.mark.parametrize("bmsld_path", all_bmsld) +@pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld")) def test_bmsld(samus_returns_tree, bmsld_path): - parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) + try: + parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) + except FileNotFoundError: + pytest.skip() def test_all_actor_groups(surface_bmsld: Bmsld): all_groups = surface_bmsld.all_actor_groups() diff --git a/tests/formats/test_bmsmd.py b/tests/formats/test_bmsmd.py index 09b9c52d..4ad4a5ef 100644 --- a/tests/formats/test_bmsmd.py +++ b/tests/formats/test_bmsmd.py @@ -1,9 +1,9 @@ +import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsmd import Bmsmd - -def test_bmsmd(samus_returns_tree): - parse_build_compare_editor( - Bmsmd, samus_returns_tree, r"gui/minimaps/c10_samus.bmsmd" - ) +@pytest.mark.parametrize("bmsmd_path", samus_returns_data.all_files_ending_with(".bmsmd")) +def test_bmsmd(samus_returns_tree, bmsmd_path): + parse_build_compare_editor(Bmsmd, samus_returns_tree, bmsmd_path) diff --git a/tests/formats/test_bmsmsd.py b/tests/formats/test_bmsmsd.py index e51e6385..8a84c8c8 100644 --- a/tests/formats/test_bmsmsd.py +++ b/tests/formats/test_bmsmsd.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsmsd import Bmsmsd -all_sr_bmsmsd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsmsd")] - -@pytest.mark.parametrize("bmsmsd_path", all_sr_bmsmsd) +@pytest.mark.parametrize("bmsmsd_path", samus_returns_data.all_files_ending_with(".bmsmsd")) def test_bmsmsd(samus_returns_tree, bmsmsd_path): parse_build_compare_editor(Bmsmsd, samus_returns_tree, bmsmsd_path) diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 1f79f29d..1420c492 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -1,6 +1,7 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmsnav import Bmsnav dread_bmsnav = [ @@ -36,10 +37,13 @@ ] -@pytest.mark.parametrize("bmsnav_path", dread_bmsnav) +@pytest.mark.parametrize("bmsnav_path", dread_data.all_files_ending_with(".bmsnav")) def test_dread_bmsnav(dread_file_tree, bmsnav_path): parse_build_compare_editor(Bmsnav, dread_file_tree, bmsnav_path) -@pytest.mark.parametrize("bmsnav_path", sr_bmsnav) +@pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav")) def test_sr_bmsnav(samus_returns_tree, bmsnav_path): - parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) + try: + parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) + except FileNotFoundError: + pytest.skip() diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index ba17c663..cfc2b577 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -7,12 +7,6 @@ from mercury_engine_data_structures.game_check import Game -dread_bmssd = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmssd")] - -sr_bmssd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmssd")] - expected_sr_failures = [ "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", @@ -29,11 +23,11 @@ "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmssd", ] -@pytest.mark.parametrize("bmssd_path", dread_bmssd) +@pytest.mark.parametrize("bmssd_path", dread_data.all_files_ending_with(".bmssd")) def test_compare_dread(dread_file_tree, bmssd_path): parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) -@pytest.mark.parametrize("bmssd_path", sr_bmssd) +@pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd")) def test_compare_msr(samus_returns_tree, bmssd_path): if bmssd_path in expected_sr_failures: expectation = pytest.raises(FileNotFoundError) diff --git a/tests/formats/test_bmtre.py b/tests/formats/test_bmtre.py index 82d7bf6c..c079e490 100644 --- a/tests/formats/test_bmtre.py +++ b/tests/formats/test_bmtre.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmtre import Bmtre -all_dread_bmtre = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmtre")] - -@pytest.mark.parametrize("bmtre_path", all_dread_bmtre) +@pytest.mark.parametrize("bmtre_path", dread_data.all_files_ending_with(".bmtre")) def test_bmtre(dread_file_tree, bmtre_path): parse_build_compare_editor(Bmtre, dread_file_tree, bmtre_path) diff --git a/tests/formats/test_bmtun.py b/tests/formats/test_bmtun.py index 1491796e..02755a3a 100644 --- a/tests/formats/test_bmtun.py +++ b/tests/formats/test_bmtun.py @@ -4,10 +4,8 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmtun import Bmtun -all_sr_bmtun = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmtun")] -@pytest.mark.parametrize("bmtun_path", all_sr_bmtun) +@pytest.mark.parametrize("bmtun_path", samus_returns_data.all_files_ending_with(".bmtun")) def test_bmtun(samus_returns_tree, bmtun_path): parse_build_compare_editor(Bmtun, samus_returns_tree, bmtun_path) diff --git a/tests/formats/test_brfld.py b/tests/formats/test_brfld.py index 703209c3..5a4704cb 100644 --- a/tests/formats/test_brfld.py +++ b/tests/formats/test_brfld.py @@ -1,22 +1,11 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.brfld import Brfld -all_brfld = [ - "maps/levels/c10_samus/s010_cave/s010_cave.brfld", - "maps/levels/c10_samus/s020_magma/s020_magma.brfld", - "maps/levels/c10_samus/s030_baselab/s030_baselab.brfld", - "maps/levels/c10_samus/s040_aqua/s040_aqua.brfld", - "maps/levels/c10_samus/s050_forest/s050_forest.brfld", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.brfld", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.brfld", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.brfld", - "maps/levels/c10_samus/s090_skybase/s090_skybase.brfld", -] - -@pytest.mark.parametrize("brfld_path", all_brfld) +@pytest.mark.parametrize("brfld_path", dread_data.all_files_ending_with(".brfld")) def test_brfld(dread_file_tree, brfld_path): parse_build_compare_editor(Brfld, dread_file_tree, brfld_path) diff --git a/tests/formats/test_bsmat.py b/tests/formats/test_bsmat.py index d3e206a7..7658e594 100644 --- a/tests/formats/test_bsmat.py +++ b/tests/formats/test_bsmat.py @@ -5,11 +5,8 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bsmat import Bsmat -all_dread_bsmat = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bsmat")] - -@pytest.mark.parametrize("bsmat_path", all_dread_bsmat) +@pytest.mark.parametrize("bsmat_path", dread_data.all_files_ending_with(".bsmat")) def test_compare_dread_all(dread_file_tree, bsmat_path): parse_build_compare_editor(Bsmat, dread_file_tree, bsmat_path) diff --git a/tests/formats/test_gui.py b/tests/formats/test_gui.py index e19f2b92..63e0ff5c 100644 --- a/tests/formats/test_gui.py +++ b/tests/formats/test_gui.py @@ -1,20 +1,25 @@ -from tests.test_lib import parse_and_build_compare, parse_and_build_compare_parsed +import pytest +from tests.test_lib import parse_and_build_compare, parse_and_build_compare_parsed, parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.gui_files import BMSCP, BMSSK, BMSSS from mercury_engine_data_structures.game_check import Game -def test_compare_bmscp_dread(dread_path): +@pytest.mark.parametrize("bmscp_path", dread_data.all_files_ending_with(".bmscp")) +def test_compare_bmscp_dread(dread_path, bmscp_path): parse_and_build_compare_parsed( - BMSCP, Game.DREAD, dread_path.joinpath("gui/scripts/samusmenucomposition.bmscp"), + BMSCP, Game.DREAD, dread_path.joinpath(bmscp_path), ) -def test_compare_bmssk_dread(dread_path): +@pytest.mark.parametrize("bmssk_path", dread_data.all_files_ending_with(".bmssk")) +def test_compare_bmssk_dread(dread_path, bmssk_path): parse_and_build_compare( - BMSSK, Game.DREAD, dread_path.joinpath("gui/scripts/samusmenucomposition.bmssk"), + BMSSK, Game.DREAD, dread_path.joinpath(bmssk_path), ) -def test_compare_bmsss_dread(dread_path): +@pytest.mark.parametrize("bmsss_path", dread_data.all_files_ending_with(".bmsss")) +def test_compare_bmsss_dread(dread_path, bmsss_path): parse_and_build_compare( - BMSSS, Game.DREAD, dread_path.joinpath("gui/scripts/sprites_companylogo.bmsss") + BMSSS, Game.DREAD, dread_path.joinpath(bmsss_path), ) diff --git a/tests/formats/test_minimap.py b/tests/formats/test_minimap.py index 65a3dbd0..3298a47b 100644 --- a/tests/formats/test_minimap.py +++ b/tests/formats/test_minimap.py @@ -5,13 +5,10 @@ from mercury_engine_data_structures.formats.bmmap import Bmmap from mercury_engine_data_structures.formats.bmmdef import Bmmdef -all_dread_bmmap = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmmap")] - -@pytest.mark.parametrize("path", all_dread_bmmap) -def test_dread_bmsnav(dread_file_tree, path): - parse_build_compare_editor(Bmmap, dread_file_tree, path) +@pytest.mark.parametrize("bmmap_path", dread_data.all_files_ending_with(".bmmap")) +def test_dread_bmmap(dread_file_tree, bmmap_path): + parse_build_compare_editor(Bmmap, dread_file_tree, bmmap_path) def test_compare_bmmdef_dread(dread_file_tree): diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index 98569d58..9bbcd967 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -6,13 +6,8 @@ from mercury_engine_data_structures.formats.pkg import Pkg from mercury_engine_data_structures.game_check import Game -_EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') - -all_dread_pkg = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".pkg")] -all_sr_pkg = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".pkg")] +_EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') wrong_build_sr = [ # MSCU, no padding in vanilla @@ -39,13 +34,13 @@ "packs/players/common_fusion.pkg", ] -@pytest.mark.parametrize("pkg_path", all_dread_pkg) +@pytest.mark.parametrize("pkg_path", dread_data.all_files_ending_with(".pkg")) def test_compare_dread(dread_path, pkg_path): parse_and_build_compare( Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path) ) -@pytest.mark.parametrize("pkg_path", all_sr_pkg) +@pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg")) def test_compare_sr(samus_returns_path, pkg_path): if pkg_path in wrong_build_sr: raw = samus_returns_path.joinpath(pkg_path).read_bytes() diff --git a/tests/formats/test_txt.py b/tests/formats/test_txt.py index 14d37c5e..6902f417 100644 --- a/tests/formats/test_txt.py +++ b/tests/formats/test_txt.py @@ -1,17 +1,21 @@ +import pytest from tests.test_lib import parse_and_build_compare +from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.txt import TXT from mercury_engine_data_structures.game_check import Game -def test_compare_dread(dread_path): - file_path = dread_path.joinpath("system/localization/us_english.txt") +@pytest.mark.parametrize("txt_path", dread_data.all_files_ending_with(".txt")) +def test_compare_dread(dread_path, txt_path): + file_path = dread_path.joinpath(txt_path) parse_and_build_compare( TXT, Game.DREAD, file_path ) -def test_compare_sr(samus_returns_path): - file_path = samus_returns_path.joinpath("system/localization/us_english.txt") +@pytest.mark.parametrize("txt_path", samus_returns_data.all_files_ending_with(".txt")) +def test_compare_sr(samus_returns_path, txt_path): + file_path = samus_returns_path.joinpath(txt_path) parse_and_build_compare( TXT, Game.SAMUS_RETURNS, file_path ) From 727a9eca02e5eb43fcc8935754ae41332d047f6e Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Sat, 20 Jul 2024 12:46:29 -0500 Subject: [PATCH 3/8] cleaned up some testing functions - removed test_lib functions that operate on only files, since the FileTreeEditor can handle these - added a parse_build_compare_editor_parsed function that compares a parsed file to its rebuilt and reparsed contents - added/simplified some checks to skip missing files --- tests/formats/test_bctex.py | 26 +++++++----------- tests/formats/test_bmsad.py | 12 ++------- tests/formats/test_bmsbk.py | 8 +++--- tests/formats/test_bmsld.py | 8 +++--- tests/formats/test_bmsmd.py | 1 + tests/formats/test_bmsnav.py | 40 +++------------------------- tests/formats/test_bmssd.py | 27 +++---------------- tests/formats/test_bmtun.py | 1 - tests/formats/test_brfld.py | 1 - tests/formats/test_gui.py | 22 ++++++---------- tests/formats/test_pkg.py | 18 ++++++------- tests/formats/test_txt.py | 18 +++++-------- tests/test_lib.py | 51 +++++++++++------------------------- 13 files changed, 67 insertions(+), 166 deletions(-) diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index 3745a58e..4ee47f8a 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -1,22 +1,16 @@ import pytest -from tests.test_lib import parse_and_build_compare_parsed +from tests.test_lib import parse_build_compare_editor_parsed -from mercury_engine_data_structures import samus_returns_data -from mercury_engine_data_structures.formats.bctex import BCTEX_SR, BCTEX_Dread -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data, samus_returns_data +from mercury_engine_data_structures.formats.bctex import Bctex -def test_compare_dread(dread_path): - parse_and_build_compare_parsed( - BCTEX_Dread, Game.DREAD, dread_path.joinpath("textures/system/minimap/icons/icons.bctex"), - print_data=True, - ) - -#all_sr_bctex = samus_returns_data.all_files_ending_with(".bctex") +@pytest.mark.parametrize("bctex_path", dread_data.all_files_ending_with(".bctex")) +def test_compare_dread(dread_file_tree, bctex_path): + parse_build_compare_editor_parsed(Bctex, dread_file_tree, bctex_path) @pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex")) -def test_compare_sr(samus_returns_path, bctex_path): - parse_and_build_compare_parsed( - BCTEX_SR, Game.SAMUS_RETURNS, samus_returns_path.joinpath(bctex_path), - print_data=True, - ) +def test_compare_sr(samus_returns_tree, bctex_path): + if not samus_returns_tree.does_asset_exists(bctex_path): + pytest.skip(f"{bctex_path} does not exist!") + parse_build_compare_editor_parsed(Bctex, samus_returns_tree, bctex_path) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index d0e82eb4..e06bed58 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -33,16 +33,8 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): def test_compare_sr_all(samus_returns_tree, bmsad_path): if not samus_returns_tree.does_asset_exists(bmsad_path): return pytest.skip() - - if bmsad_path in expected_sr_failures: - expectation = pytest.raises(construct.core.ConstError) - else: - expectation = contextlib.nullcontext() - - with expectation: - parse_build_compare_editor( - Bmsad, samus_returns_tree, bmsad_path - ) + + parse_build_compare_editor(Bmsad, samus_returns_tree, bmsad_path) def test_api_dread_actordef(dread_file_tree: FileTreeEditor): diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index 7c97ac12..d1e24e26 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -7,7 +7,7 @@ @pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk")) def test_bmsbk(samus_returns_tree, bmsbk_path): - try: - parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) - except FileNotFoundError: - pytest.skip(f"{bmsbk_path} does not exist") + if not samus_returns_tree.does_asset_exists(bmsbk_path): + pytest.skip(f"{bmsbk_path} does not exist!") + + parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index 8f9fdbe3..6e3742f6 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -33,10 +33,10 @@ def surface_bmsld(samus_returns_tree) -> Bmsld: @pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld")) def test_bmsld(samus_returns_tree, bmsld_path): - try: - parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) - except FileNotFoundError: - pytest.skip() + if not samus_returns_tree.does_asset_exists(bmsld_path): + pytest.skip(f"{bmsld_path} does not exist!") + + parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) def test_all_actor_groups(surface_bmsld: Bmsld): all_groups = surface_bmsld.all_actor_groups() diff --git a/tests/formats/test_bmsmd.py b/tests/formats/test_bmsmd.py index 4ad4a5ef..8a293e57 100644 --- a/tests/formats/test_bmsmd.py +++ b/tests/formats/test_bmsmd.py @@ -4,6 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsmd import Bmsmd + @pytest.mark.parametrize("bmsmd_path", samus_returns_data.all_files_ending_with(".bmsmd")) def test_bmsmd(samus_returns_tree, bmsmd_path): parse_build_compare_editor(Bmsmd, samus_returns_tree, bmsmd_path) diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 1420c492..201f72f8 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -4,38 +4,6 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmsnav import Bmsnav -dread_bmsnav = [ - "maps/levels/c10_samus/s010_cave/s010_cave.bmsnav", - "maps/levels/c10_samus/s020_magma/s020_magma.bmsnav", - "maps/levels/c10_samus/s030_baselab/s030_baselab.bmsnav", - "maps/levels/c10_samus/s040_aqua/s040_aqua.bmsnav", - "maps/levels/c10_samus/s050_forest/s050_forest.bmsnav", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.bmsnav", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.bmsnav", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.bmsnav", - "maps/levels/c10_samus/s090_skybase/s090_skybase.bmsnav", -] - -sr_bmsnav = [ - "maps/levels/c10_samus/s000_surface/s000_surface.bmsnav", - "maps/levels/c10_samus/s010_area1/s010_area1.bmsnav", - "maps/levels/c10_samus/s020_area2/s020_area2.bmsnav", - "maps/levels/c10_samus/s025_area2b/s025_area2b.bmsnav", - "maps/levels/c10_samus/s028_area2c/s028_area2c.bmsnav", - "maps/levels/c10_samus/s030_area3/s030_area3.bmsnav", - "maps/levels/c10_samus/s033_area3b/s033_area3b.bmsnav", - "maps/levels/c10_samus/s036_area3c/s036_area3c.bmsnav", - "maps/levels/c10_samus/s040_area4/s040_area4.bmsnav", - "maps/levels/c10_samus/s050_area5/s050_area5.bmsnav", - "maps/levels/c10_samus/s060_area6/s060_area6.bmsnav", - "maps/levels/c10_samus/s065_area6b/s065_area6b.bmsnav", - "maps/levels/c10_samus/s067_area6c/s067_area6c.bmsnav", - "maps/levels/c10_samus/s070_area7/s070_area7.bmsnav", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsnav", - "maps/levels/c10_samus/s100_area10/s100_area10.bmsnav", - "maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsnav", -] - @pytest.mark.parametrize("bmsnav_path", dread_data.all_files_ending_with(".bmsnav")) def test_dread_bmsnav(dread_file_tree, bmsnav_path): @@ -43,7 +11,7 @@ def test_dread_bmsnav(dread_file_tree, bmsnav_path): @pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav")) def test_sr_bmsnav(samus_returns_tree, bmsnav_path): - try: - parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) - except FileNotFoundError: - pytest.skip() + if not samus_returns_tree.does_asset_exists(bmsnav_path): + pytest.skip(f"{bmsnav_path} does not exist!") + + parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index cfc2b577..273ccb7f 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -7,32 +7,13 @@ from mercury_engine_data_structures.game_check import Game -expected_sr_failures = [ - "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", - "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", - "maps/levels/c10_samus/s903_zeta/s903_zeta.bmssd", - "maps/levels/c10_samus/s904_omega/s904_omega.bmssd", - "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmssd", - "maps/levels/c10_samus/s905_queen/s905_queen.bmssd", - "maps/levels/c10_samus/s906_metroid/s906_metroid.bmssd", - "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmssd", - "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmssd", - "maps/levels/c10_samus/s909_ridley/s909_ridley.bmssd", - "maps/levels/c10_samus/s910_gym/s910_gym.bmssd", - "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmssd", - "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmssd", -] - @pytest.mark.parametrize("bmssd_path", dread_data.all_files_ending_with(".bmssd")) def test_compare_dread(dread_file_tree, bmssd_path): parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) @pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd")) def test_compare_msr(samus_returns_tree, bmssd_path): - if bmssd_path in expected_sr_failures: - expectation = pytest.raises(FileNotFoundError) - else: - expectation = contextlib.nullcontext() - - with expectation: - parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) + if not samus_returns_tree.does_asset_exists(bmssd_path): + pytest.skip(f"{bmssd_path} does not exist!") + + parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) diff --git a/tests/formats/test_bmtun.py b/tests/formats/test_bmtun.py index 02755a3a..f67a382e 100644 --- a/tests/formats/test_bmtun.py +++ b/tests/formats/test_bmtun.py @@ -5,7 +5,6 @@ from mercury_engine_data_structures.formats.bmtun import Bmtun - @pytest.mark.parametrize("bmtun_path", samus_returns_data.all_files_ending_with(".bmtun")) def test_bmtun(samus_returns_tree, bmtun_path): parse_build_compare_editor(Bmtun, samus_returns_tree, bmtun_path) diff --git a/tests/formats/test_brfld.py b/tests/formats/test_brfld.py index 5a4704cb..a8834534 100644 --- a/tests/formats/test_brfld.py +++ b/tests/formats/test_brfld.py @@ -5,7 +5,6 @@ from mercury_engine_data_structures.formats.brfld import Brfld - @pytest.mark.parametrize("brfld_path", dread_data.all_files_ending_with(".brfld")) def test_brfld(dread_file_tree, brfld_path): parse_build_compare_editor(Brfld, dread_file_tree, brfld_path) diff --git a/tests/formats/test_gui.py b/tests/formats/test_gui.py index 63e0ff5c..0545fd16 100644 --- a/tests/formats/test_gui.py +++ b/tests/formats/test_gui.py @@ -1,25 +1,19 @@ import pytest -from tests.test_lib import parse_and_build_compare, parse_and_build_compare_parsed, parse_build_compare_editor +from tests.test_lib import parse_build_compare_editor, parse_build_compare_editor_parsed from mercury_engine_data_structures import dread_data -from mercury_engine_data_structures.formats.gui_files import BMSCP, BMSSK, BMSSS +from mercury_engine_data_structures.formats.gui_files import Bmscp, Bmssk, Bmsss from mercury_engine_data_structures.game_check import Game @pytest.mark.parametrize("bmscp_path", dread_data.all_files_ending_with(".bmscp")) -def test_compare_bmscp_dread(dread_path, bmscp_path): - parse_and_build_compare_parsed( - BMSCP, Game.DREAD, dread_path.joinpath(bmscp_path), - ) +def test_compare_bmscp_dread(dread_file_tree, bmscp_path): + parse_build_compare_editor_parsed(Bmscp, dread_file_tree, bmscp_path) @pytest.mark.parametrize("bmssk_path", dread_data.all_files_ending_with(".bmssk")) -def test_compare_bmssk_dread(dread_path, bmssk_path): - parse_and_build_compare( - BMSSK, Game.DREAD, dread_path.joinpath(bmssk_path), - ) +def test_compare_bmssk_dread(dread_file_tree, bmssk_path): + parse_build_compare_editor(Bmssk, dread_file_tree, bmssk_path) @pytest.mark.parametrize("bmsss_path", dread_data.all_files_ending_with(".bmsss")) -def test_compare_bmsss_dread(dread_path, bmsss_path): - parse_and_build_compare( - BMSSS, Game.DREAD, dread_path.joinpath(bmsss_path), - ) +def test_compare_bmsss_dread(dread_file_tree, bmsss_path): + parse_build_compare_editor(Bmsss, dread_file_tree, bmsss_path) diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index 9bbcd967..473ea8a9 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -1,6 +1,6 @@ import pytest from construct import Container, ListContainer -from tests.test_lib import parse_and_build_compare +from tests.test_lib import parse_build_compare_editor from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.pkg import Pkg @@ -35,15 +35,15 @@ ] @pytest.mark.parametrize("pkg_path", dread_data.all_files_ending_with(".pkg")) -def test_compare_dread(dread_path, pkg_path): - parse_and_build_compare( - Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path) - ) +def test_compare_dread(dread_file_tree, pkg_path): + parse_build_compare_editor(Pkg, dread_file_tree, pkg_path) @pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg")) -def test_compare_sr(samus_returns_path, pkg_path): +def test_compare_sr(samus_returns_tree, pkg_path): + if not samus_returns_tree.does_asset_exists(pkg_path): + pytest.skip(f"{pkg_path} does not exist!") if pkg_path in wrong_build_sr: - raw = samus_returns_path.joinpath(pkg_path).read_bytes() + raw = samus_returns_tree.root.joinpath(pkg_path).read_bytes() target_game = Game.SAMUS_RETURNS module = Pkg.construct_class(target_game) @@ -59,9 +59,7 @@ def test_compare_sr(samus_returns_path, pkg_path): assert raw[5:min_len] == encoded[5:min_len] assert abs(len(raw) - len(encoded)) <= 3 else: - parse_and_build_compare( - Pkg.construct_class(Game.SAMUS_RETURNS), Game.SAMUS_RETURNS, samus_returns_path.joinpath(pkg_path) - ) + parse_build_compare_editor(Pkg, samus_returns_tree, pkg_path) def test_build_empty_pkg(): pkg = Pkg(Container(files=ListContainer()), Game.DREAD) diff --git a/tests/formats/test_txt.py b/tests/formats/test_txt.py index 6902f417..8804aa83 100644 --- a/tests/formats/test_txt.py +++ b/tests/formats/test_txt.py @@ -1,21 +1,15 @@ import pytest -from tests.test_lib import parse_and_build_compare +from tests.test_lib import parse_build_compare_editor from mercury_engine_data_structures import dread_data, samus_returns_data -from mercury_engine_data_structures.formats.txt import TXT +from mercury_engine_data_structures.formats.txt import Txt, TXT from mercury_engine_data_structures.game_check import Game @pytest.mark.parametrize("txt_path", dread_data.all_files_ending_with(".txt")) -def test_compare_dread(dread_path, txt_path): - file_path = dread_path.joinpath(txt_path) - parse_and_build_compare( - TXT, Game.DREAD, file_path - ) +def test_compare_dread(dread_file_tree, txt_path): + parse_build_compare_editor(Txt, dread_file_tree, txt_path) @pytest.mark.parametrize("txt_path", samus_returns_data.all_files_ending_with(".txt")) -def test_compare_sr(samus_returns_path, txt_path): - file_path = samus_returns_path.joinpath(txt_path) - parse_and_build_compare( - TXT, Game.SAMUS_RETURNS, file_path - ) +def test_compare_sr(samus_returns_tree, txt_path): + parse_build_compare_editor(Txt, samus_returns_tree, txt_path) diff --git a/tests/test_lib.py b/tests/test_lib.py index 24c70682..c26bbd29 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -10,54 +10,35 @@ from mercury_engine_data_structures.game_check import Game, GameSpecificStruct -def _parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): - if not file_path.is_file(): - return pytest.skip(f"missing {file_path}") - - raw = file_path.read_bytes() +def _parse_build_compare(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + construct_class = module.construct_class(editor.target_game) + raw = editor.get_raw_asset(file_name) - data = module.parse(raw, target_game=game) + data = construct_class.parse(raw, target_game=editor.target_game) if print_data: print(data) - encoded = module.build(data, target_game=game) - - if save_file: - file_path.parent.joinpath(save_file).write_bytes(encoded) - + encoded = construct_class.build(data, target_game=editor.target_game) + return raw, encoded, data +def parse_build_compare_editor(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + raw, encoded, _ = _parse_build_compare(module, editor, file_name, print_data) -def parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): - raw, encoded, _ = _parse_and_build_compare(module, game, file_path, print_data, save_file) assert encoded == raw +def parse_build_compare_editor_parsed(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + _, encoded, data = _parse_build_compare(module, editor, file_name, print_data) -def parse_and_build_compare_parsed(module, game: Game, file_path: Path, print_data=False, save_file=None): - _, encoded, data = _parse_and_build_compare(module, game, file_path, print_data, save_file) - - data2 = module.parse(encoded, target_game=game) - if print_data: - print(data2) - - assert purge_hidden(data) == purge_hidden(data2) - - -def purge_hidden(data: Container) -> Container: - data = {k: v for k, v in data.items() if not k.startswith("_")} - return {k: purge_hidden(v) if isinstance(v, Container) else v for k, v in data.items()} - - -def parse_build_compare_editor(module: typing.Type[BaseResource], - editor: FileTreeEditor, file_name: str, print_data=False): construct_class = module.construct_class(editor.target_game) - raw = editor.get_raw_asset(file_name) + data2 = construct_class.parse(encoded, target_game=editor.target_game) - data = construct_class.parse(raw, target_game=editor.target_game) if print_data: - print(data) - encoded = construct_class.build(data, target_game=editor.target_game) + print(data2) - assert encoded == raw + assert data == data2 def game_compile_build(con: construct.Construct, data: construct.Container, target_game: Game) -> bytes: From dbc8554d92668d3099813731fe02e38db28da64c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 17:58:45 +0000 Subject: [PATCH 4/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/mercury_engine_data_structures/common_types.py | 4 ++-- src/mercury_engine_data_structures/dread_data.py | 4 ++-- .../formats/blsnd.py | 3 +-- .../formats/bmdefs.py | 3 +-- .../formats/bmsad.py | 14 +++++++------- .../formats/bmsas.py | 2 +- .../formats/bmsbk.py | 3 +-- .../formats/bmscc.py | 3 +-- .../formats/bmsem.py | 3 +-- .../formats/bmses.py | 4 +--- .../formats/bmsld.py | 9 +-------- .../formats/bmslink.py | 1 - .../formats/bmsmd.py | 2 +- .../formats/bmsmsd.py | 4 ++-- .../formats/bmsnav.py | 2 +- .../formats/bmssd.py | 2 +- .../formats/bmtre.py | 1 - .../formats/bmtun.py | 4 +--- .../formats/bsmat.py | 1 - .../samus_returns_data.py | 4 ++-- tests/formats/test_bcmdl.py | 1 - tests/formats/test_bmbls.py | 1 - tests/formats/test_bmsad.py | 3 +-- tests/formats/test_bmsld.py | 2 +- tests/formats/test_bmsnav.py | 2 +- tests/formats/test_bmssd.py | 4 +--- tests/formats/test_gui.py | 1 - tests/formats/test_pkg.py | 1 - tests/formats/test_txt.py | 3 +-- tests/test_lib.py | 5 +---- 30 files changed, 33 insertions(+), 63 deletions(-) diff --git a/src/mercury_engine_data_structures/common_types.py b/src/mercury_engine_data_structures/common_types.py index 8f0c56e2..341bb981 100644 --- a/src/mercury_engine_data_structures/common_types.py +++ b/src/mercury_engine_data_structures/common_types.py @@ -27,7 +27,7 @@ def __init__(self, value: int | str | tuple[int, int, int] | None = None): elif isinstance(value, int): value = struct.pack(" Dict[int, str]: def all_files_ending_with(ext: str) -> list[str]: if not ext.startswith("."): ext = "." + ext - - return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] \ No newline at end of file + + return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] diff --git a/src/mercury_engine_data_structures/formats/blsnd.py b/src/mercury_engine_data_structures/formats/blsnd.py index c8ec4ae1..dbebb640 100644 --- a/src/mercury_engine_data_structures/formats/blsnd.py +++ b/src/mercury_engine_data_structures/formats/blsnd.py @@ -4,13 +4,12 @@ from construct.core import ( Const, Construct, - Hex, IfThenElse, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game, current_game_at_most diff --git a/src/mercury_engine_data_structures/formats/bmdefs.py b/src/mercury_engine_data_structures/formats/bmdefs.py index 65abd523..76f211dc 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -4,12 +4,11 @@ Construct, Flag, Float32l, - Int16ul, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats import standard_format from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmsad.py b/src/mercury_engine_data_structures/formats/bmsad.py index 79cd87e8..5c0b3307 100644 --- a/src/mercury_engine_data_structures/formats/bmsad.py +++ b/src/mercury_engine_data_structures/formats/bmsad.py @@ -23,13 +23,13 @@ from mercury_engine_data_structures import common_types, type_lib from mercury_engine_data_structures.common_types import ( - Char, - CVector3D, - Float, - StrId, - make_dict, - make_vector, - VersionAdapter + Char, + CVector3D, + Float, + StrId, + VersionAdapter, + make_dict, + make_vector, ) from mercury_engine_data_structures.construct_extensions.alignment import PrefixedAllowZeroLen from mercury_engine_data_structures.construct_extensions.function_complex import ComplexIf, SwitchComplexKey diff --git a/src/mercury_engine_data_structures/formats/bmsas.py b/src/mercury_engine_data_structures/formats/bmsas.py index b37e016c..76845975 100644 --- a/src/mercury_engine_data_structures/formats/bmsas.py +++ b/src/mercury_engine_data_structures/formats/bmsas.py @@ -17,7 +17,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, VersionAdapter, make_vector from mercury_engine_data_structures.common_types import StrId as StrIdSR from mercury_engine_data_structures.construct_extensions.strings import PascalStringRobust from mercury_engine_data_structures.formats.base_resource import BaseResource diff --git a/src/mercury_engine_data_structures/formats/bmsbk.py b/src/mercury_engine_data_structures/formats/bmsbk.py index e4a793ba..082cbe37 100644 --- a/src/mercury_engine_data_structures/formats/bmsbk.py +++ b/src/mercury_engine_data_structures/formats/bmsbk.py @@ -7,14 +7,13 @@ Container, Flag, Float32l, - Hex, Int32ul, Rebuild, Struct, Terminated, ) -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmscc.py b/src/mercury_engine_data_structures/formats/bmscc.py index c4943e8c..edef4773 100644 --- a/src/mercury_engine_data_structures/formats/bmscc.py +++ b/src/mercury_engine_data_structures/formats/bmscc.py @@ -3,7 +3,6 @@ Const, Construct, GreedyBytes, - Hex, IfThenElse, Int8ul, Int16ul, @@ -12,7 +11,7 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import StrId, UInt, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.formats.collision import collision_formats diff --git a/src/mercury_engine_data_structures/formats/bmsem.py b/src/mercury_engine_data_structures/formats/bmsem.py index f4415912..0feafc62 100644 --- a/src/mercury_engine_data_structures/formats/bmsem.py +++ b/src/mercury_engine_data_structures/formats/bmsem.py @@ -3,12 +3,11 @@ Const, Construct, Float32l, - Hex, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmses.py b/src/mercury_engine_data_structures/formats/bmses.py index b8e54250..2eeb04b3 100644 --- a/src/mercury_engine_data_structures/formats/bmses.py +++ b/src/mercury_engine_data_structures/formats/bmses.py @@ -5,13 +5,11 @@ Const, Construct, Float32l, - Hex, Int32sl, - Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmsld.py b/src/mercury_engine_data_structures/formats/bmsld.py index c98022bc..5d75e952 100644 --- a/src/mercury_engine_data_structures/formats/bmsld.py +++ b/src/mercury_engine_data_structures/formats/bmsld.py @@ -4,14 +4,7 @@ import construct from construct import Const, Construct, Container, Flag, Float32l, Hex, Int32ul, Struct, Switch -from mercury_engine_data_structures.common_types import ( - CVector3D, - Float, - StrId, - make_dict, - make_vector, - VersionAdapter -) +from mercury_engine_data_structures.common_types import CVector3D, Float, StrId, VersionAdapter, make_dict, make_vector from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.crc import crc32 diff --git a/src/mercury_engine_data_structures/formats/bmslink.py b/src/mercury_engine_data_structures/formats/bmslink.py index ff34a00e..2edf0405 100644 --- a/src/mercury_engine_data_structures/formats/bmslink.py +++ b/src/mercury_engine_data_structures/formats/bmslink.py @@ -3,7 +3,6 @@ from construct.core import ( Byte, Const, - Hex, Int32ul, LazyBound, PrefixedArray, diff --git a/src/mercury_engine_data_structures/formats/bmsmd.py b/src/mercury_engine_data_structures/formats/bmsmd.py index 29f75df7..f1966d31 100644 --- a/src/mercury_engine_data_structures/formats/bmsmd.py +++ b/src/mercury_engine_data_structures/formats/bmsmd.py @@ -11,7 +11,7 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index c676fac8..5bfbbb5e 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -1,9 +1,9 @@ import functools import construct -from construct.core import Const, Construct, Enum, FlagsEnum, Float32l, Hex, Int32sl, Int32ul, Struct +from construct.core import Const, Construct, Enum, FlagsEnum, Float32l, Int32sl, Int32ul, Struct -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmsnav.py b/src/mercury_engine_data_structures/formats/bmsnav.py index fd104bf6..403d94f8 100644 --- a/src/mercury_engine_data_structures/formats/bmsnav.py +++ b/src/mercury_engine_data_structures/formats/bmsnav.py @@ -1,6 +1,6 @@ from construct.core import Array, Byte, Const, Construct, Flag, Hex, Int32ul, PrefixedArray, Struct, Terminated -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, make_dict, VersionAdapter +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, VersionAdapter, make_dict from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmssd.py b/src/mercury_engine_data_structures/formats/bmssd.py index 901ecf9a..91db9b6f 100644 --- a/src/mercury_engine_data_structures/formats/bmssd.py +++ b/src/mercury_engine_data_structures/formats/bmssd.py @@ -10,7 +10,7 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector, VersionAdapter +from mercury_engine_data_structures.common_types import CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bmtre.py b/src/mercury_engine_data_structures/formats/bmtre.py index 71985fd4..8669be34 100644 --- a/src/mercury_engine_data_structures/formats/bmtre.py +++ b/src/mercury_engine_data_structures/formats/bmtre.py @@ -5,7 +5,6 @@ Construct, Container, Flag, - Hex, Int32sl, Int32ul, LazyBound, diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index 094baf74..1bbf008a 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -5,14 +5,12 @@ Const, Construct, Flag, - Hex, Int32sl, - Int32ul, Struct, Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict, VersionAdapter +from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, VersionAdapter, make_dict from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game diff --git a/src/mercury_engine_data_structures/formats/bsmat.py b/src/mercury_engine_data_structures/formats/bsmat.py index 59046e57..998243e2 100644 --- a/src/mercury_engine_data_structures/formats/bsmat.py +++ b/src/mercury_engine_data_structures/formats/bsmat.py @@ -7,7 +7,6 @@ Container, Enum, Flag, - Hex, Int32sl, Int32ul, PrefixedArray, diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index 3aa834de..23d8ae84 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -63,5 +63,5 @@ def all_property_id_to_name() -> Dict[int, str]: def all_files_ending_with(ext: str) -> list[str]: if not ext.startswith("."): ext = "." + ext - - return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] \ No newline at end of file + + return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] diff --git a/tests/formats/test_bcmdl.py b/tests/formats/test_bcmdl.py index 4d62b894..47ebf7fe 100644 --- a/tests/formats/test_bcmdl.py +++ b/tests/formats/test_bcmdl.py @@ -6,7 +6,6 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bcmdl import Bcmdl - dread_bcmdl_expected_failure = [ 'actors/characters/morphball/models/labase.bcmdl', 'actors/characters/morphball/models/ladamage.bcmdl', diff --git a/tests/formats/test_bmbls.py b/tests/formats/test_bmbls.py index a41b3d1e..da29c4da 100644 --- a/tests/formats/test_bmbls.py +++ b/tests/formats/test_bmbls.py @@ -3,7 +3,6 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmbls import Bmbls -from mercury_engine_data_structures.game_check import Game @pytest.mark.parametrize("bmbls_path", dread_data.all_files_ending_with(".bmbls")) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index e06bed58..c0822949 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -9,7 +9,6 @@ from mercury_engine_data_structures.formats import dread_types from mercury_engine_data_structures.formats.bmsad import ActorDefFunc, Bmsad - expected_dread_failures = { "actors/props/pf_mushr_fr/charclasses/pf_mushr_fr.bmsad", } @@ -33,7 +32,7 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): def test_compare_sr_all(samus_returns_tree, bmsad_path): if not samus_returns_tree.does_asset_exists(bmsad_path): return pytest.skip() - + parse_build_compare_editor(Bmsad, samus_returns_tree, bmsad_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index 6e3742f6..e90fa286 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -35,7 +35,7 @@ def surface_bmsld(samus_returns_tree) -> Bmsld: def test_bmsld(samus_returns_tree, bmsld_path): if not samus_returns_tree.does_asset_exists(bmsld_path): pytest.skip(f"{bmsld_path} does not exist!") - + parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) def test_all_actor_groups(surface_bmsld: Bmsld): diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 201f72f8..a642dd8f 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -13,5 +13,5 @@ def test_dread_bmsnav(dread_file_tree, bmsnav_path): def test_sr_bmsnav(samus_returns_tree, bmsnav_path): if not samus_returns_tree.does_asset_exists(bmsnav_path): pytest.skip(f"{bmsnav_path} does not exist!") - + parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 273ccb7f..1aacdf90 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -1,10 +1,8 @@ -import contextlib import pytest from tests.test_lib import parse_build_compare_editor from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmssd import Bmssd -from mercury_engine_data_structures.game_check import Game @pytest.mark.parametrize("bmssd_path", dread_data.all_files_ending_with(".bmssd")) @@ -15,5 +13,5 @@ def test_compare_dread(dread_file_tree, bmssd_path): def test_compare_msr(samus_returns_tree, bmssd_path): if not samus_returns_tree.does_asset_exists(bmssd_path): pytest.skip(f"{bmssd_path} does not exist!") - + parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) diff --git a/tests/formats/test_gui.py b/tests/formats/test_gui.py index 0545fd16..72b18ed0 100644 --- a/tests/formats/test_gui.py +++ b/tests/formats/test_gui.py @@ -3,7 +3,6 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.gui_files import Bmscp, Bmssk, Bmsss -from mercury_engine_data_structures.game_check import Game @pytest.mark.parametrize("bmscp_path", dread_data.all_files_ending_with(".bmscp")) diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index 473ea8a9..db9650c1 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -6,7 +6,6 @@ from mercury_engine_data_structures.formats.pkg import Pkg from mercury_engine_data_structures.game_check import Game - _EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') wrong_build_sr = [ diff --git a/tests/formats/test_txt.py b/tests/formats/test_txt.py index 8804aa83..23fa3d9d 100644 --- a/tests/formats/test_txt.py +++ b/tests/formats/test_txt.py @@ -2,8 +2,7 @@ from tests.test_lib import parse_build_compare_editor from mercury_engine_data_structures import dread_data, samus_returns_data -from mercury_engine_data_structures.formats.txt import Txt, TXT -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures.formats.txt import Txt @pytest.mark.parametrize("txt_path", dread_data.all_files_ending_with(".txt")) diff --git a/tests/test_lib.py b/tests/test_lib.py index c26bbd29..3a37b321 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -1,9 +1,6 @@ import typing -from pathlib import Path import construct -import pytest -from construct.lib.containers import Container from mercury_engine_data_structures.file_tree_editor import FileTreeEditor from mercury_engine_data_structures.formats import BaseResource @@ -19,7 +16,7 @@ def _parse_build_compare(module: typing.Type[BaseResource], if print_data: print(data) encoded = construct_class.build(data, target_game=editor.target_game) - + return raw, encoded, data def parse_build_compare_editor(module: typing.Type[BaseResource], From 45c319b20c0f87ccd18143668e1f1997f8d780d5 Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Sat, 20 Jul 2024 13:00:26 -0500 Subject: [PATCH 5/8] ruff --- src/mercury_engine_data_structures/formats/standard_format.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mercury_engine_data_structures/formats/standard_format.py b/src/mercury_engine_data_structures/formats/standard_format.py index 3eedc95c..ca23ec62 100644 --- a/src/mercury_engine_data_structures/formats/standard_format.py +++ b/src/mercury_engine_data_structures/formats/standard_format.py @@ -14,7 +14,8 @@ def _const_if_present(con: construct.Construct, value: typing.Any | None) -> con return construct.Const(value, con) if value is not None else con -def create(name: Optional[str], version: Optional[int | str | tuple[int, int, int]], root_name: Optional[str] = None, explicit_root: bool = False): +def create(name: Optional[str], version: Optional[int | str | tuple[int, int, int]], + root_name: Optional[str] = None, explicit_root: bool = False): # this maybe needs to change in the future if SR and Dread have different formats for type using this type_lib = get_type_lib_dread() if root_name is None: From 2e843a6b27841641fa25a917a28b0fb21a9d5c76 Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Sat, 20 Jul 2024 17:16:01 -0500 Subject: [PATCH 6/8] added missing files to test files - files are now checked against a list of files expected to be missing before a test is skipped - removed a duplicate bmmap test and changed test_minimap.py to test_bmmdef.py - test_pkg retains old behavior of not using FileTreeEditor --- tests/formats/test_bctex.py | 177 +++++++++++++++++- tests/formats/test_bmmdef.py | 9 + tests/formats/test_bmsad.py | 343 +++++++++++++++++++++++++++++++++- tests/formats/test_bmsbk.py | 9 +- tests/formats/test_bmsld.py | 38 ++-- tests/formats/test_bmsnav.py | 18 +- tests/formats/test_bmssd.py | 18 +- tests/formats/test_minimap.py | 17 -- tests/formats/test_pkg.py | 87 ++++++++- tests/test_lib.py | 23 ++- 10 files changed, 685 insertions(+), 54 deletions(-) create mode 100644 tests/formats/test_bmmdef.py delete mode 100644 tests/formats/test_minimap.py diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index 4ee47f8a..2c0e3f7e 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -5,12 +5,187 @@ from mercury_engine_data_structures.formats.bctex import Bctex +samus_returns_exclusions = [ + "actors/characters/alpha/models/textures/alphab_a.bctex", + "actors/characters/alpha/models/textures/alphab_d.bctex", + "actors/characters/alphacredits/models/textures/alphab_a.bctex", + "actors/characters/alphacredits/models/textures/alphab_d.bctex", + "actors/characters/gamma/models/textures/coreveins.bctex", + "actors/characters/gammacredits/models/textures/coreveins.bctex", + "actors/characters/gammaevolved/models/textures/coreveins.bctex", + "actors/characters/glowflypuzzle/models/textures/glowfly_d.bctex", + "actors/characters/metroid/models/textures/coreveins.bctex", + "actors/characters/moheekwall/models/textures/moheekwall_a.bctex", + "actors/characters/morphball/models/textures/fusionmorph_a.bctex", + "actors/characters/morphball/models/textures/fusionmorphgravity_d.bctex", + "actors/characters/morphball/models/textures/fusionmorphpower_d.bctex", + "actors/characters/morphball/models/textures/fusionmorphvaria_d.bctex", + "actors/characters/morphball/models/textures/samuspowermorphnew_a.bctex", + "actors/characters/morphball/models/textures/samuspowermorphnew_d.bctex", + "actors/characters/morphball/models/textures/samusvariamorph_a.bctex", + "actors/characters/morphball/models/textures/samusvariamorph_d.bctex", + "actors/characters/omega/models/textures/coreveins.bctex", + "actors/characters/omegacredits/models/textures/coreveins.bctex", + "actors/characters/omegaevolved/models/textures/coreveins.bctex", + "actors/characters/queen/models/textures/coreveins.bctex", + "actors/characters/queen/models/textures/queen01_a.bctex", + "actors/characters/queen/models/textures/queen01_d.bctex", + "actors/characters/queen/models/textures/queen02_a.bctex", + "actors/characters/queen/models/textures/queen02_d.bctex", + "actors/characters/queen/models/textures/queen03_a.bctex", + "actors/characters/queen/models/textures/queen03_d.bctex", + "actors/characters/queen/models/textures/queen04_a.bctex", + "actors/characters/queen/models/textures/queen04_d.bctex", + "actors/characters/ridley/models/textures/ridleydeath_d.bctex", + "actors/characters/ridley/models/textures/ridleyhand_a.bctex", + "actors/characters/ridley/models/textures/ridleyhand_d.bctex", + "actors/characters/samus/models/textures/energywave.bctex", + "actors/characters/samus/models/textures/gradientdif.bctex", + "actors/characters/samus/models/textures/grid.bctex", + "actors/characters/samus/models/textures/noise3.bctex", + "actors/characters/samus/models/textures/samusending_a.bctex", + "actors/characters/samus/models/textures/samusending_d.bctex", + "actors/characters/samus/models/textures/samusgravityreward_d.bctex", + "actors/characters/samus/models/textures/samusweaponreward_d.bctex", + "actors/characters/samus/models/textures/samuszeroreward_a.bctex", + "actors/characters/samus/models/textures/samuszeroreward_d.bctex", + "actors/characters/samus/models/textures/samuszeroweapon_d.bctex", + "actors/characters/samusfusion/models/textures/droppables00.bctex", + "actors/characters/samusfusion/models/textures/droppables01.bctex", + "actors/characters/samusfusion/models/textures/energywave.bctex", + "actors/characters/samusfusion/models/textures/gradientdif.bctex", + "actors/characters/samusfusion/models/textures/grid.bctex", + "actors/characters/samusfusion/models/textures/laser_la.bctex", + "actors/characters/samusfusion/models/textures/noise3.bctex", + "actors/characters/samusfusion/models/textures/phasedisplacement.bctex", + "actors/characters/samusfusion/models/textures/scanningpulse.bctex", + "actors/characters/samusrewards/models/textures/energywave.bctex", + "actors/characters/samusrewards/models/textures/gradientdif.bctex", + "actors/characters/samusrewards/models/textures/grid.bctex", + "actors/characters/samusrewards/models/textures/laser_la.bctex", + "actors/characters/samusrewards/models/textures/noise3.bctex", + "actors/characters/samusrewards/models/textures/phasedisplacement.bctex", + "actors/characters/samusrewards/models/textures/samusending_a.bctex", + "actors/characters/samusrewards/models/textures/samusending_d.bctex", + "actors/characters/samusrewards/models/textures/samuspower_a.bctex", + "actors/characters/samusrewards/models/textures/samuspower_d.bctex", + "actors/characters/samusrewards/models/textures/samusvaria_a.bctex", + "actors/characters/samusrewards/models/textures/samusvaria_d.bctex", + "actors/characters/samusrewards/models/textures/samuszeroreward_a.bctex", + "actors/characters/samusrewards/models/textures/samuszeroweapon_d.bctex", + "actors/characters/samusrewards/models/textures/scanningpulse.bctex", + "actors/characters/zeta/models/textures/coreveins.bctex", + "actors/characters/zetacredits/models/textures/coreveins.bctex", + "actors/characters/zetaevolved/models/textures/coreveins.bctex", + "actors/items/itemsphere_spenergygaunlet/models/textures/itemspherespenergygaunlet_d.bctex", + "actors/items/powerup_spinattack/models/textures/itemvariasuit_d.bctex", + "actors/props/blockingplant/models/textures/blockingplantheavy_d.bctex", + "actors/props/creditsfx/models/textures/glow_big.bctex", + "actors/props/creditsfx/models/textures/glowmetroid.bctex", + "actors/props/creditsfx/models/textures/halowind.bctex", + "actors/props/creditsfx/models/textures/xflaremetroid.bctex", + "actors/props/doorcreatureleft/models/textures/doorcreature_d.bctex", + "actors/props/doorcreatureleft/models/textures/spiderweb_d.bctex", + "actors/props/dropprop/models/textures/dropprop_d.bctex", + "actors/props/samusshipinterior/models/textures/samusship_bigpanel2.bctex", + "actors/props/spenergybestowalstatue/models/textures/spenergybestowalstatue_d.bctex", + "actors/weapons/manicminerbotlaser/models/textures/target_circle.bctex", + "actors/weapons/weaponstank/models/textures/tankglow.bctex", + "actors/weapons/weaponstank/models/textures/weaponstank_d.bctex", + "cutscenes/postcredits/models/xparasite/textures/cubemetroids.bctex", + "maps/blocks/weightblock/textures/weightblock_d.bctex", + "maps/objects/chozohologram/textures/chozohologram_d.bctex", + "maps/textures/a1wall01.bctex", + "maps/textures/a2chozocolumn0301_d.bctex", + "maps/textures/a6chozocolumn01_d.bctex", + "maps/textures/a6chozocolumn0204_d.bctex", + "maps/textures/a9chozobg0301_d.bctex", + "maps/textures/brick_wall00.bctex", + "maps/textures/chozohologram01_d.bctex", + "maps/textures/chozointeriortile04.bctex", + "maps/textures/chozopath0902_d.bctex", + "maps/textures/chozopath1002_d.bctex", + "maps/textures/chozotilewall01b_d.bctex", + "maps/textures/chozotilewall04haz_d.bctex", + "maps/textures/chozoverticaldeco01_d.bctex", + "maps/textures/clear_blue_checker.bctex", + "maps/textures/dark_grey_checker.bctex", + "maps/textures/debris0301_d.bctex", + "maps/textures/green_d.bctex", + "maps/textures/insect0702_d.bctex", + "maps/textures/lava2.bctex", + "maps/textures/light_grey_checker.bctex", + "maps/textures/plant0103_d.bctex", + "maps/textures/plant0607_d.bctex", + "maps/textures/ref_rock03.bctex", + "maps/textures/ref_rock05.bctex", + "maps/textures/rock_wall01_d.bctex", + "maps/textures/rock_wall02.bctex", + "maps/textures/rockadorn0604cut_d.bctex", + "maps/textures/rockadornchozo0303_d.bctex", + "maps/textures/rockadornchozo0306_d.bctex", + "maps/textures/rockadorngold0303_d.bctex", + "maps/textures/rockadorngold0306_d.bctex", + "maps/textures/rockbg0601.bctex", + "maps/textures/rockcolumn0301_d.bctex", + "maps/textures/rockcolumn04.bctex", + "maps/textures/rockplatform0101_d.bctex", + "maps/textures/rockplatform0405b_d.bctex", + "maps/textures/rockplatform1002c_d.bctex", + "maps/textures/rockwall0302_d.bctex", + "maps/textures/rockwall0402b_d.bctex", + "maps/textures/rockwalltile0604.bctex", + "maps/textures/rockwalltile0702c_d.bctex", + "maps/textures/sand02_d.bctex", + "maps/textures/smoke0002_d.bctex", + "maps/textures/spaceblackhole_d.bctex", + "maps/textures/surface_sky.bctex", + "maps/textures/surfacebray2c_d.bctex", + "maps/textures/surfacecolumn01.bctex", + "maps/textures/temp/cubemetroids.bctex", + "maps/textures/wall06.bctex", + "maps/textures/water10b_d.bctex", + "maps/textures/waterfall.bctex", + "maps/textures/waterfront01_d.bctex", + "maps/textures/waterop.bctex", + "system/fx/textures/arc.bctex", + "system/fx/textures/arrow3.bctex", + "system/fx/textures/ashes_la.bctex", + "system/fx/textures/blood_red.bctex", + "system/fx/textures/energy.bctex", + "system/fx/textures/energybubble.bctex", + "system/fx/textures/energyray.bctex", + "system/fx/textures/energytrail.bctex", + "system/fx/textures/fireball_l.bctex", + "system/fx/textures/fireballbounce_l.bctex", + "system/fx/textures/fireballbounce_rgba.bctex", + "system/fx/textures/flame.bctex", + "system/fx/textures/flameline.bctex", + "system/fx/textures/fleechswarm.bctex", + "system/fx/textures/laserfalloff_la.bctex", + "system/fx/textures/lightning_fade.bctex", + "system/fx/textures/lightningcore_l.bctex", + "system/fx/textures/noise2.bctex", + "system/fx/textures/ramp_bwbwb.bctex", + "system/fx/textures/raypart_l.bctex", + "system/fx/textures/specialab.bctex", + "system/fx/textures/swarm.bctex", + "system/fx/textures/swirl.bctex", + "system/fx/textures/swirlcircle.bctex", + "system/fx/textures/swirlexplosion.bctex", + "system/fx/textures/target_l.bctex", + "system/fx/textures/threadleak.bctex", + "system/fx/textures/wind.bctex", + "system/fx/textures/wind_arc.bctex", +] + @pytest.mark.parametrize("bctex_path", dread_data.all_files_ending_with(".bctex")) def test_compare_dread(dread_file_tree, bctex_path): parse_build_compare_editor_parsed(Bctex, dread_file_tree, bctex_path) @pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex")) def test_compare_sr(samus_returns_tree, bctex_path): - if not samus_returns_tree.does_asset_exists(bctex_path): + if bctex_path in samus_returns_exclusions: pytest.skip(f"{bctex_path} does not exist!") + parse_build_compare_editor_parsed(Bctex, samus_returns_tree, bctex_path) diff --git a/tests/formats/test_bmmdef.py b/tests/formats/test_bmmdef.py new file mode 100644 index 00000000..742e4d44 --- /dev/null +++ b/tests/formats/test_bmmdef.py @@ -0,0 +1,9 @@ +from tests.test_lib import parse_build_compare_editor + +from mercury_engine_data_structures.formats.bmmdef import Bmmdef + + +def test_compare_bmmdef_dread(dread_file_tree): + parse_build_compare_editor( + Bmmdef, dread_file_tree, "system/minimap/minimap.bmmdef" + ) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index c0822949..ebd77af4 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -14,6 +14,345 @@ } expected_sr_failures = set() +sr_missing = [ + "actors/items/itemsphere_springball/charclasses/itemsphere_springball.bmsad", + "actors/items/life/charclasses/life.bmsad", + "actors/items/lifebig/charclasses/lifebig.bmsad", + "actors/items/powerup_spinattack/charclasses/powerup_spinattack.bmsad", + "actors/props/doorchargeclosed/charclasses/doorchargeclosed.bmsad", + "actors/props/doorcreatureleft/charclasses/doorcreatureleft.bmsad", + "actors/props/doorcreatureright/charclasses/doorcreatureright.bmsad", + "actors/props/grapplemovable4x1/charclasses/grapplemovable4x1.bmsad", + "actors/props/heatzone/charclasses/heatzone.bmsad", + "actors/props/poisonzone/charclasses/poisonzone.bmsad", + "actors/props/unlockarea/charclasses/unlockarea.bmsad", + "actors/props/waterzone/charclasses/waterzone.bmsad", + "actors/spawnpoints/spawnpointfleechswarm/charclasses/spawnpointfleechswarm.bmsad", + "actors/weapons/energywave/charclasses/energywave.bmsad", + "cutscenes/area2cam/takes/01/actors/samus/samus.bmsad", + "cutscenes/area3cam/takes/01/actors/samus/samus.bmsad", + "cutscenes/brokenchozostatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/brokenchozostatue/takes/02/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/01/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/01/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/01/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/02/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/02/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/02/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/03/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/03/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/03/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/04/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/04/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/04/actors/samus/samus.bmsad", + "cutscenes/energyshield/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/energyshield/takes/01/actors/samus/samus.bmsad", + "cutscenes/energyshield/takes/01/actors/statue/statue.bmsad", + "cutscenes/energywave/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/energywave/takes/01/actors/samus/samus.bmsad", + "cutscenes/energywave/takes/01/actors/statue/statue.bmsad", + "cutscenes/firstchozostatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/01/actors/planefade/planefade.bmsad", + "cutscenes/gravitysuit/takes/01/actors/samusvaria/samusvaria.bmsad", + "cutscenes/gravitysuit/takes/02/actors/planefade/planefade.bmsad", + "cutscenes/gravitysuit/takes/02/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/03/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/04/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/05/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/01/actors/metroid/metroid.bmsad", + "cutscenes/introalpha/takes/01/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/02/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/03/actors/alpha/alpha.bmsad", + "cutscenes/introalpha/takes/03/actors/larvacocoon/larvacocoon.bmsad", + "cutscenes/introalpha/takes/03/actors/samus/samus.bmsad", + "cutscenes/introdnastatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/introgamma/takes/01/actors/alphacocoon/alphacocoon.bmsad", + "cutscenes/introgamma/takes/01/actors/gamma/gamma.bmsad", + "cutscenes/introgamma/takes/01/actors/gammalight/gammalight.bmsad", + "cutscenes/introgamma/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/demolish/demolish.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/wall/wall.bmsad", + "cutscenes/intromanicminerbotchaseph/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/intromanicminerbotchaseph/takes/01/actors/samus/samus.bmsad", + "cutscenes/intrometroidboss/takes/01/actors/metroidboss/metroidboss.bmsad", + "cutscenes/intrometroidboss/takes/01/actors/samus/samus.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/hornoad/hornoad.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/metroid/metroid.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/samus/samus.bmsad", + "cutscenes/introomega/takes/10/actors/omega/omega.bmsad", + "cutscenes/introomega/takes/10/actors/samus/samus.bmsad", + "cutscenes/introomega/takes/10/actors/zetacocoon/zetacocoon.bmsad", + "cutscenes/introqueen/takes/01/actors/background/background.bmsad", + "cutscenes/introqueen/takes/01/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/01/actors/samus/samus.bmsad", + "cutscenes/introqueen/takes/02/actors/background/background.bmsad", + "cutscenes/introqueen/takes/02/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/02/actors/samus/samus.bmsad", + "cutscenes/introqueen/takes/03/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/03/actors/samus/samus.bmsad", + "cutscenes/introspenergystatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporter/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/teleporter/teleporter.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/teleporter/teleporter.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/teleporter/teleporter.bmsad", + "cutscenes/introzeta/takes/01/actors/gammacocoon/gammacocoon.bmsad", + "cutscenes/introzeta/takes/01/actors/samus/samus.bmsad", + "cutscenes/introzeta/takes/02/actors/samus/samus.bmsad", + "cutscenes/introzeta/takes/02/actors/zeta/zeta.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/itemspacejump/itemspacejump.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/mouthrocks/mouthrocks.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/wall/wall.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/itemsphere/itemsphere.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/manicbrokenface/manicbrokenface.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/wall/wall.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/manicdoors/manicdoors.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking01/robotsmallworking01.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking02/robotsmallworking02.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking03/robotsmallworking03.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/02/actors/manicvisor/manicvisor.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/02/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/03/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/03/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/04/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/05/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/05/actors/samus/samus.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/sand/sand.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/statueorb/statueorb.bmsad", + "cutscenes/meleetuto/takes/01/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/01/actors/samus/samus.bmsad", + "cutscenes/meleetuto/takes/02/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/02/actors/samus/samus.bmsad", + "cutscenes/meleetuto/takes/03/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/03/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/background/background.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/background/background.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samushd/samushd.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samusnoskin/samusnoskin.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/samusvisor/samusvisor.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/samushd/samushd.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/babyhatchling/babyhatchling.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/samus/samus.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background/background.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background2/background2.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background3/background3.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidqueenspit/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueenspit/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueenspitpowerbomb/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueenspitpowerbomb/takes/01/actors/queen/queen.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/samus/samus.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/statue/statue.bmsad", + "cutscenes/planetarrival/takes/10/actors/planet/planet.bmsad", + "cutscenes/planetarrival/takes/10/actors/shipsmall/shipsmall.bmsad", + "cutscenes/planetarrival/takes/20/actors/cloudssurface/cloudssurface.bmsad", + "cutscenes/planetarrival/takes/20/actors/shipcutscene/shipcutscene.bmsad", + "cutscenes/planetarrival/takes/30/actors/shipcutscene/shipcutscene.bmsad", + "cutscenes/planetarrival/takes/31/actors/samus/samus.bmsad", + "cutscenes/postcredits/takes/10/actors/hornoad/hornoad.bmsad", + "cutscenes/postcredits/takes/10/actors/hornoadmimic/hornoadmimic.bmsad", + "cutscenes/postcredits/takes/10/actors/plants/plants.bmsad", + "cutscenes/postcredits/takes/10/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/postcredits/takes/10/actors/xparasite/xparasite.bmsad", + "cutscenes/ridley1/takes/10/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/10/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/10/actors/ridleyfloor/ridleyfloor.bmsad", + "cutscenes/ridley1/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/10/actors/surfaceplatform/surfaceplatform.bmsad", + "cutscenes/ridley1/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/20/actors/rays/rays.bmsad", + "cutscenes/ridley1/takes/20/actors/ridleystormcs1/ridleystormcs1.bmsad", + "cutscenes/ridley1/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/30/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/30/actors/ridleyfloor/ridleyfloor.bmsad", + "cutscenes/ridley1/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/30/actors/surfaceplatform/surfaceplatform.bmsad", + "cutscenes/ridley1/takes/40/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/40/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/40/actors/rays/rays.bmsad", + "cutscenes/ridley1/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley1/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/60/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/60/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/60/actors/hurricane/hurricane.bmsad", + "cutscenes/ridley1/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley1/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/10/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/100/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/100/actors/rockswall/rockswall.bmsad", + "cutscenes/ridley2/takes/110/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/110/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/110/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/115/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/115/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/115/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/115/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/115/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/120/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/120/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/120/actors/ridleyhead/ridleyhead.bmsad", + "cutscenes/ridley2/takes/120/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/120/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/130/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/130/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/130/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/130/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/130/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/140/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/150/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/150/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/50/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/50/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/70/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/70/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/80/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/80/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/80/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/90/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/90/actors/rockswall/rockswall.bmsad", + "cutscenes/ridley3/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/100/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/100/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/100/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/100/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/110/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/110/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/110/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/110/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/120/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/120/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/140/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/140/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/140/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/140/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/20/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/40/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/50/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/50/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/50/actors/rays/rays.bmsad", + "cutscenes/ridley3/takes/50/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/60/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/ridley3/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/70/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/70/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/70/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/70/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/80/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/80/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/80/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/90/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/90/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/ridley3/takes/90/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/20/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/30/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/40/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/40/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/40/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/50/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/60/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/60/actors/planet/planet.bmsad", + "cutscenes/ridley4/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/60/actors/shipinterior/shipinterior.bmsad", + "cutscenes/ridley4/takes/70/actors/planet/planet.bmsad", + "cutscenes/ridley4/takes/70/actors/shipsmall/shipsmall.bmsad", + "cutscenes/ridleydrained/takes/01/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/01/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/01/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/02/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/02/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/02/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/03/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/03/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/03/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/04/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/04/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/04/actors/samus/samus.bmsad", + "cutscenes/scaningpulse/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/scaningpulse/takes/01/actors/samus/samus.bmsad", + "cutscenes/scaningpulse/takes/01/actors/statue/statue.bmsad", + "cutscenes/teleporter/takes/01/actors/baby/baby.bmsad", + "cutscenes/teleporter/takes/01/actors/samus/samus.bmsad", + "cutscenes/teleporter/takes/01/actors/teleporter/teleporter.bmsad", + "cutscenes/tunel/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/variasuit/takes/01/actors/planefade/planefade.bmsad", + "cutscenes/variasuit/takes/01/actors/samuspower/samuspower.bmsad", + "cutscenes/variasuit/takes/02/actors/planefade/planefade.bmsad", + "cutscenes/variasuit/takes/02/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/03/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/04/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/05/actors/samus/samus.bmsad", +] @pytest.mark.parametrize("bmsad_path", dread_data.all_files_ending_with(".bmsad")) def test_compare_dread_all(dread_file_tree, bmsad_path): @@ -30,8 +369,8 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): @pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad")) def test_compare_sr_all(samus_returns_tree, bmsad_path): - if not samus_returns_tree.does_asset_exists(bmsad_path): - return pytest.skip() + if bmsad_path in sr_missing: + pytest.skip(f"{bmsad_path} does not exist!") parse_build_compare_editor(Bmsad, samus_returns_tree, bmsad_path) diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index d1e24e26..4da0cf56 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -5,9 +5,16 @@ from mercury_engine_data_structures.formats.bmsbk import Bmsbk +sr_missing = [ + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsbk", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsbk", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsbk", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsbk", +] + @pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk")) def test_bmsbk(samus_returns_tree, bmsbk_path): - if not samus_returns_tree.does_asset_exists(bmsbk_path): + if bmsbk_path in sr_missing: pytest.skip(f"{bmsbk_path} does not exist!") parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index e90fa286..9f1a9d2a 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -4,36 +4,30 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsld import Bmsld -all_bmsld = [ - "maps/levels/c10_samus/s000_surface/s000_surface.bmsld", - "maps/levels/c10_samus/s010_area1/s010_area1.bmsld", - "maps/levels/c10_samus/s020_area2/s020_area2.bmsld", - "maps/levels/c10_samus/s025_area2b/s025_area2b.bmsld", - "maps/levels/c10_samus/s028_area2c/s028_area2c.bmsld", - "maps/levels/c10_samus/s030_area3/s030_area3.bmsld", - "maps/levels/c10_samus/s033_area3b/s033_area3b.bmsld", - "maps/levels/c10_samus/s036_area3c/s036_area3c.bmsld", - "maps/levels/c10_samus/s040_area4/s040_area4.bmsld", - "maps/levels/c10_samus/s050_area5/s050_area5.bmsld", - "maps/levels/c10_samus/s060_area6/s060_area6.bmsld", - "maps/levels/c10_samus/s065_area6b/s065_area6b.bmsld", - "maps/levels/c10_samus/s067_area6c/s067_area6c.bmsld", - "maps/levels/c10_samus/s070_area7/s070_area7.bmsld", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsld", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsld", - "maps/levels/c10_samus/s100_area10/s100_area10.bmsld", - "maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsld", +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsld", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsld", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmsld", + "maps/levels/c10_samus/s904_omega/s904_omega.bmsld", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmsld", + "maps/levels/c10_samus/s905_queen/s905_queen.bmsld", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmsld", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmsld", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsld", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmsld", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsld", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsld", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsld", ] - @pytest.fixture() def surface_bmsld(samus_returns_tree) -> Bmsld: - return samus_returns_tree.get_parsed_asset(all_bmsld[0], type_hint=Bmsld) + return samus_returns_tree.get_parsed_asset("maps/levels/c10_samus/s000_surface/s000_surface.bmsld", type_hint=Bmsld) @pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld")) def test_bmsld(samus_returns_tree, bmsld_path): - if not samus_returns_tree.does_asset_exists(bmsld_path): + if bmsld_path in sr_missing: pytest.skip(f"{bmsld_path} does not exist!") parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index a642dd8f..2300d669 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -5,13 +5,29 @@ from mercury_engine_data_structures.formats.bmsnav import Bmsnav +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsnav", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsnav", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmsnav", + "maps/levels/c10_samus/s904_omega/s904_omega.bmsnav", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmsnav", + "maps/levels/c10_samus/s905_queen/s905_queen.bmsnav", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmsnav", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmsnav", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsnav", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmsnav", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsnav", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsnav", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsnav", +] + @pytest.mark.parametrize("bmsnav_path", dread_data.all_files_ending_with(".bmsnav")) def test_dread_bmsnav(dread_file_tree, bmsnav_path): parse_build_compare_editor(Bmsnav, dread_file_tree, bmsnav_path) @pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav")) def test_sr_bmsnav(samus_returns_tree, bmsnav_path): - if not samus_returns_tree.does_asset_exists(bmsnav_path): + if bmsnav_path in sr_missing: pytest.skip(f"{bmsnav_path} does not exist!") parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 1aacdf90..55a1fd0b 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -5,13 +5,29 @@ from mercury_engine_data_structures.formats.bmssd import Bmssd +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmssd", + "maps/levels/c10_samus/s904_omega/s904_omega.bmssd", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmssd", + "maps/levels/c10_samus/s905_queen/s905_queen.bmssd", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmssd", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmssd", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmssd", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmssd", + "maps/levels/c10_samus/s910_gym/s910_gym.bmssd", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmssd", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmssd", +] + @pytest.mark.parametrize("bmssd_path", dread_data.all_files_ending_with(".bmssd")) def test_compare_dread(dread_file_tree, bmssd_path): parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) @pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd")) def test_compare_msr(samus_returns_tree, bmssd_path): - if not samus_returns_tree.does_asset_exists(bmssd_path): + if bmssd_path in sr_missing: pytest.skip(f"{bmssd_path} does not exist!") parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) diff --git a/tests/formats/test_minimap.py b/tests/formats/test_minimap.py deleted file mode 100644 index 3298a47b..00000000 --- a/tests/formats/test_minimap.py +++ /dev/null @@ -1,17 +0,0 @@ -import pytest -from tests.test_lib import parse_build_compare_editor - -from mercury_engine_data_structures import dread_data -from mercury_engine_data_structures.formats.bmmap import Bmmap -from mercury_engine_data_structures.formats.bmmdef import Bmmdef - - -@pytest.mark.parametrize("bmmap_path", dread_data.all_files_ending_with(".bmmap")) -def test_dread_bmmap(dread_file_tree, bmmap_path): - parse_build_compare_editor(Bmmap, dread_file_tree, bmmap_path) - - -def test_compare_bmmdef_dread(dread_file_tree): - parse_build_compare_editor( - Bmmdef, dread_file_tree, "system/minimap/minimap.bmmdef" - ) diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index db9650c1..ecf1c37a 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -1,11 +1,12 @@ import pytest from construct import Container, ListContainer -from tests.test_lib import parse_build_compare_editor +from tests.test_lib import parse_and_build_compare from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.pkg import Pkg from mercury_engine_data_structures.game_check import Game + _EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') wrong_build_sr = [ @@ -33,16 +34,86 @@ "packs/players/common_fusion.pkg", ] +sr_missing = [ + "packs/maps/s901_alpha/s901_alpha.pkg", + "packs/maps/s901_alpha/s901_alpha_discardables.pkg", + "packs/maps/s902_gamma/s902_gamma.pkg", + "packs/maps/s902_gamma/s902_gamma_discardables.pkg", + "packs/maps/s903_zeta/s903_zeta.pkg", + "packs/maps/s903_zeta/s903_zeta_discardables.pkg", + "packs/maps/s904_omega/s904_omega.pkg", + "packs/maps/s904_omega/s904_omega_discardables.pkg", + "packs/maps/s905_arachnus/s905_arachnus.pkg", + "packs/maps/s905_arachnus/s905_arachnus_discardables.pkg", + "packs/maps/s905_queen/s905_queen.pkg", + "packs/maps/s905_queen/s905_queen_discardables.pkg", + "packs/maps/s905_queen/subareas/subarearp0.pkg", + "packs/maps/s905_queen/subareas/subarearp0_discardables.pkg", + "packs/maps/s906_metroid/s906_metroid.pkg", + "packs/maps/s906_metroid/s906_metroid_discardables.pkg", + "packs/maps/s906_metroid/subareas/subarearp0.pkg", + "packs/maps/s906_metroid/subareas/subarearp0_discardables.pkg", + "packs/maps/s907_manicminerbot/s907_manicminerbot.pkg", + "packs/maps/s907_manicminerbot/s907_manicminerbot_discardables.pkg", + "packs/maps/s907_manicminerbot/subareas/subarearp0.pkg", + "packs/maps/s907_manicminerbot/subareas/subarearp0_discardables.pkg", + "packs/maps/s908_manicminerbotrun/s908_manicminerbotrun.pkg", + "packs/maps/s908_manicminerbotrun/s908_manicminerbotrun_discardables.pkg", + "packs/maps/s908_manicminerbotrun/subareas/subarearp0.pkg", + "packs/maps/s908_manicminerbotrun/subareas/subarearp0_discardables.pkg", + "packs/maps/s909_ridley/s909_ridley.pkg", + "packs/maps/s909_ridley/s909_ridley_discardables.pkg", + "packs/maps/s909_ridley/subareas/subarearp0.pkg", + "packs/maps/s909_ridley/subareas/subarearp0_discardables.pkg", + "packs/maps/s910_gym/s910_gym.pkg", + "packs/maps/s910_gym/s910_gym_discardables.pkg", + "packs/maps/s910_gym/subareas/subarearp0.pkg", + "packs/maps/s910_gym/subareas/subarearp0_discardables.pkg", + "packs/maps/s911_swarmgym/s911_swarmgym.pkg", + "packs/maps/s911_swarmgym/s911_swarmgym_discardables.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp0.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp0_discardables.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp1.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp1_discardables.pkg", + "packs/maps/s920_traininggallery/s920_traininggallery.pkg", + "packs/maps/s920_traininggallery/s920_traininggallery_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp0.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp0_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp1.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp10.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp10_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp1_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp2.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp2_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp3.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp3_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp4.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp4_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp5.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp5_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp6.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp6_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp7.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp7_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp8.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp8_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp9.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp9_discardables.pkg", +] + @pytest.mark.parametrize("pkg_path", dread_data.all_files_ending_with(".pkg")) -def test_compare_dread(dread_file_tree, pkg_path): - parse_build_compare_editor(Pkg, dread_file_tree, pkg_path) +def test_compare_dread(dread_path, pkg_path): + parse_and_build_compare( + Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path) + ) @pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg")) -def test_compare_sr(samus_returns_tree, pkg_path): - if not samus_returns_tree.does_asset_exists(pkg_path): +def test_compare_sr(samus_returns_path, pkg_path): + if pkg_path in sr_missing: pytest.skip(f"{pkg_path} does not exist!") + if pkg_path in wrong_build_sr: - raw = samus_returns_tree.root.joinpath(pkg_path).read_bytes() + raw = samus_returns_path.joinpath(pkg_path).read_bytes() target_game = Game.SAMUS_RETURNS module = Pkg.construct_class(target_game) @@ -58,7 +129,9 @@ def test_compare_sr(samus_returns_tree, pkg_path): assert raw[5:min_len] == encoded[5:min_len] assert abs(len(raw) - len(encoded)) <= 3 else: - parse_build_compare_editor(Pkg, samus_returns_tree, pkg_path) + parse_and_build_compare( + Pkg.construct_class(Game.SAMUS_RETURNS), Game.SAMUS_RETURNS, samus_returns_path.joinpath(pkg_path) + ) def test_build_empty_pkg(): pkg = Pkg(Container(files=ListContainer()), Game.DREAD) diff --git a/tests/test_lib.py b/tests/test_lib.py index 3a37b321..c48355db 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -1,12 +1,31 @@ import typing +from pathlib import Path import construct +import pytest +from construct.lib.containers import Container from mercury_engine_data_structures.file_tree_editor import FileTreeEditor from mercury_engine_data_structures.formats import BaseResource from mercury_engine_data_structures.game_check import Game, GameSpecificStruct +def parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): + if not file_path.is_file(): + return pytest.skip(f"missing {file_path}") + + raw = file_path.read_bytes() + + data = module.parse(raw, target_game=game) + if print_data: + print(data) + encoded = module.build(data, target_game=game) + + if save_file: + file_path.parent.joinpath(save_file).write_bytes(encoded) + + assert encoded == raw + def _parse_build_compare(module: typing.Type[BaseResource], editor: FileTreeEditor, file_name: str, print_data=False): construct_class = module.construct_class(editor.target_game) @@ -16,7 +35,7 @@ def _parse_build_compare(module: typing.Type[BaseResource], if print_data: print(data) encoded = construct_class.build(data, target_game=editor.target_game) - + return raw, encoded, data def parse_build_compare_editor(module: typing.Type[BaseResource], @@ -28,7 +47,7 @@ def parse_build_compare_editor(module: typing.Type[BaseResource], def parse_build_compare_editor_parsed(module: typing.Type[BaseResource], editor: FileTreeEditor, file_name: str, print_data=False): _, encoded, data = _parse_build_compare(module, editor, file_name, print_data) - + construct_class = module.construct_class(editor.target_game) data2 = construct_class.parse(encoded, target_game=editor.target_game) From cdd84c7c452f15414c8af893d455b5cb77a0ee61 Mon Sep 17 00:00:00 2001 From: Steven Franklin Date: Mon, 22 Jul 2024 01:36:16 -0500 Subject: [PATCH 7/8] Missing files are no longer tested - added an optional list[str] arg "exclusions" to all_files_ending_with - parametrized test args now use this field to exclude missing files from parametrization, resulting in no skipped tests --- src/mercury_engine_data_structures/dread_data.py | 8 ++++++-- src/mercury_engine_data_structures/samus_returns_data.py | 8 ++++++-- tests/formats/test_bctex.py | 7 ++----- tests/formats/test_bmsad.py | 5 +---- tests/formats/test_bmsbk.py | 5 +---- tests/formats/test_bmsld.py | 5 +---- tests/formats/test_bmsnav.py | 5 +---- tests/formats/test_bmssd.py | 5 +---- tests/formats/test_pkg.py | 5 +---- 9 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/mercury_engine_data_structures/dread_data.py b/src/mercury_engine_data_structures/dread_data.py index b3b8fea0..85c8a51c 100644 --- a/src/mercury_engine_data_structures/dread_data.py +++ b/src/mercury_engine_data_structures/dread_data.py @@ -59,8 +59,12 @@ def all_property_id_to_name() -> Dict[int, str]: for name, asset_id in names.items() } -def all_files_ending_with(ext: str) -> list[str]: +def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> list[str]: if not ext.startswith("."): ext = "." + ext - return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] + if exclusions is None: + exclusions = [] + + return [name for name in all_name_to_asset_id().keys() + if name.endswith(ext) and name not in exclusions] diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index 23d8ae84..cd169067 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -60,8 +60,12 @@ def all_property_id_to_name() -> Dict[int, str]: for name, asset_id in names.items() } -def all_files_ending_with(ext: str) -> list[str]: +def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> list[str]: if not ext.startswith("."): ext = "." + ext - return [name for name in all_name_to_asset_id().keys() if name.endswith(ext)] + if exclusions is None: + exclusions = [] + + return [name for name in all_name_to_asset_id().keys() + if name.endswith(ext) and name not in exclusions] \ No newline at end of file diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index 2c0e3f7e..caf5b761 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -5,7 +5,7 @@ from mercury_engine_data_structures.formats.bctex import Bctex -samus_returns_exclusions = [ +sr_missing = [ "actors/characters/alpha/models/textures/alphab_a.bctex", "actors/characters/alpha/models/textures/alphab_d.bctex", "actors/characters/alphacredits/models/textures/alphab_a.bctex", @@ -183,9 +183,6 @@ def test_compare_dread(dread_file_tree, bctex_path): parse_build_compare_editor_parsed(Bctex, dread_file_tree, bctex_path) -@pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex")) +@pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex", sr_missing)) def test_compare_sr(samus_returns_tree, bctex_path): - if bctex_path in samus_returns_exclusions: - pytest.skip(f"{bctex_path} does not exist!") - parse_build_compare_editor_parsed(Bctex, samus_returns_tree, bctex_path) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index ebd77af4..6c167548 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -367,11 +367,8 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): ) -@pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad")) +@pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad", sr_missing)) def test_compare_sr_all(samus_returns_tree, bmsad_path): - if bmsad_path in sr_missing: - pytest.skip(f"{bmsad_path} does not exist!") - parse_build_compare_editor(Bmsad, samus_returns_tree, bmsad_path) diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index 4da0cf56..a5dd9435 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -12,9 +12,6 @@ "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsbk", ] -@pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk")) +@pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk", sr_missing)) def test_bmsbk(samus_returns_tree, bmsbk_path): - if bmsbk_path in sr_missing: - pytest.skip(f"{bmsbk_path} does not exist!") - parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index 9f1a9d2a..49d0b0a2 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -25,11 +25,8 @@ def surface_bmsld(samus_returns_tree) -> Bmsld: return samus_returns_tree.get_parsed_asset("maps/levels/c10_samus/s000_surface/s000_surface.bmsld", type_hint=Bmsld) -@pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld")) +@pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld", sr_missing)) def test_bmsld(samus_returns_tree, bmsld_path): - if bmsld_path in sr_missing: - pytest.skip(f"{bmsld_path} does not exist!") - parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) def test_all_actor_groups(surface_bmsld: Bmsld): diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 2300d669..c11335ae 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -25,9 +25,6 @@ def test_dread_bmsnav(dread_file_tree, bmsnav_path): parse_build_compare_editor(Bmsnav, dread_file_tree, bmsnav_path) -@pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav")) +@pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav", sr_missing)) def test_sr_bmsnav(samus_returns_tree, bmsnav_path): - if bmsnav_path in sr_missing: - pytest.skip(f"{bmsnav_path} does not exist!") - parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 55a1fd0b..2fc19e04 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -25,9 +25,6 @@ def test_compare_dread(dread_file_tree, bmssd_path): parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) -@pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd")) +@pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd", sr_missing)) def test_compare_msr(samus_returns_tree, bmssd_path): - if bmssd_path in sr_missing: - pytest.skip(f"{bmssd_path} does not exist!") - parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index ecf1c37a..cf0d71d3 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -107,11 +107,8 @@ def test_compare_dread(dread_path, pkg_path): Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path) ) -@pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg")) +@pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg", sr_missing)) def test_compare_sr(samus_returns_path, pkg_path): - if pkg_path in sr_missing: - pytest.skip(f"{pkg_path} does not exist!") - if pkg_path in wrong_build_sr: raw = samus_returns_path.joinpath(pkg_path).read_bytes() target_game = Game.SAMUS_RETURNS From d0e1b6869e05f3ec3c0ffe2f328599f0e866b248 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 06:50:32 +0000 Subject: [PATCH 8/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/mercury_engine_data_structures/dread_data.py | 2 +- src/mercury_engine_data_structures/samus_returns_data.py | 4 ++-- tests/formats/test_bctex.py | 1 - tests/formats/test_bmsbk.py | 1 - tests/formats/test_bmsld.py | 1 - tests/formats/test_bmsnav.py | 1 - tests/formats/test_bmssd.py | 1 - tests/formats/test_pkg.py | 1 - tests/test_lib.py | 5 ++--- 9 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/mercury_engine_data_structures/dread_data.py b/src/mercury_engine_data_structures/dread_data.py index 85c8a51c..55cb20fb 100644 --- a/src/mercury_engine_data_structures/dread_data.py +++ b/src/mercury_engine_data_structures/dread_data.py @@ -65,6 +65,6 @@ def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> l if exclusions is None: exclusions = [] - + return [name for name in all_name_to_asset_id().keys() if name.endswith(ext) and name not in exclusions] diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index cd169067..33a4eac3 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -66,6 +66,6 @@ def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> l if exclusions is None: exclusions = [] - + return [name for name in all_name_to_asset_id().keys() - if name.endswith(ext) and name not in exclusions] \ No newline at end of file + if name.endswith(ext) and name not in exclusions] diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index caf5b761..fa0c82e2 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -4,7 +4,6 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bctex import Bctex - sr_missing = [ "actors/characters/alpha/models/textures/alphab_a.bctex", "actors/characters/alpha/models/textures/alphab_d.bctex", diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index a5dd9435..bbc5acf5 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -4,7 +4,6 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsbk import Bmsbk - sr_missing = [ "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsbk", "maps/levels/c10_samus/s910_gym/s910_gym.bmsbk", diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index 49d0b0a2..d4f3638e 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -4,7 +4,6 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsld import Bmsld - sr_missing = [ "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsld", "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsld", diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index c11335ae..2039b7ae 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -4,7 +4,6 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmsnav import Bmsnav - sr_missing = [ "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsnav", "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsnav", diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 2fc19e04..728456d3 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -4,7 +4,6 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmssd import Bmssd - sr_missing = [ "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index cf0d71d3..6bcb0499 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -6,7 +6,6 @@ from mercury_engine_data_structures.formats.pkg import Pkg from mercury_engine_data_structures.game_check import Game - _EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') wrong_build_sr = [ diff --git a/tests/test_lib.py b/tests/test_lib.py index c48355db..5b25aa17 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -3,7 +3,6 @@ import construct import pytest -from construct.lib.containers import Container from mercury_engine_data_structures.file_tree_editor import FileTreeEditor from mercury_engine_data_structures.formats import BaseResource @@ -35,7 +34,7 @@ def _parse_build_compare(module: typing.Type[BaseResource], if print_data: print(data) encoded = construct_class.build(data, target_game=editor.target_game) - + return raw, encoded, data def parse_build_compare_editor(module: typing.Type[BaseResource], @@ -47,7 +46,7 @@ def parse_build_compare_editor(module: typing.Type[BaseResource], def parse_build_compare_editor_parsed(module: typing.Type[BaseResource], editor: FileTreeEditor, file_name: str, print_data=False): _, encoded, data = _parse_build_compare(module, editor, file_name, print_data) - + construct_class = module.construct_class(editor.target_game) data2 = construct_class.parse(encoded, target_game=editor.target_game)