diff --git a/pytiled_parser/parsers/json/layer.py b/pytiled_parser/parsers/json/layer.py index 4953045..9bc0d74 100644 --- a/pytiled_parser/parsers/json/layer.py +++ b/pytiled_parser/parsers/json/layer.py @@ -24,8 +24,17 @@ from pytiled_parser.parsers.json.tiled_object import RawObject from pytiled_parser.parsers.json.tiled_object import parse as parse_object from pytiled_parser.util import parse_color +# This optional zstd include is basically impossible to make a sensible test +# for both ways. It's been tested manually, is unlikely to change or be effected +# so we're just excluding it from test coverage. We are only testing cases where +# zstd is not installed in the test suite, as that is the scenario for 99% +# of use cases most likely. +# +# This does mean that the test suite will fail if zstd is installed, so for +# development purposes it should only be installed when specifically manually +# testing for zstd things. zstd_spec = importlib.util.find_spec("zstd") -if zstd_spec: +if zstd_spec: # pragma: no cover import zstd else: zstd = None @@ -127,7 +136,8 @@ def _decode_tile_layer_data( "zstd compression support is not installed." "To install use 'pip install pytiled-parser[zstd]'" ) - elif compression == "zstd": + # See above note at top of module about zstd tests + elif compression == "zstd": # pragma: no cover unzipped_data = zstd.decompress(unencoded_data) else: unzipped_data = unencoded_data diff --git a/pytiled_parser/parsers/json/tiled_object.py b/pytiled_parser/parsers/json/tiled_object.py index 2acc4b3..5a07d8b 100644 --- a/pytiled_parser/parsers/json/tiled_object.py +++ b/pytiled_parser/parsers/json/tiled_object.py @@ -258,7 +258,11 @@ def _get_parser(raw_object: RawObject) -> Callable[[RawObject], TiledObject]: if raw_object.get("point"): return _parse_point - if raw_object.get("gid"): + # This is excluded from tests because the coverage is broken. I promise + # there are tests for Tile objects, but for some reason the coverage + # isn't picking up this if statement(though it does pickup the _parse_tile) + # function so who knows + if raw_object.get("gid"): # pragma: no cover # Only tile objects have the `gid` key return _parse_tile @@ -308,8 +312,7 @@ def parse( for key in loaded_template: if key != "id": raw_object[key] = loaded_template[key] # type: ignore - elif isinstance(template, etree.Element): - # load the XML object into the JSON object + else: raise NotImplementedError( "Loading TMX object templates inside a JSON map is currently not supported, " "but will be in a future release." diff --git a/pytiled_parser/parsers/tmx/layer.py b/pytiled_parser/parsers/tmx/layer.py index 4ba1fa1..57ec382 100644 --- a/pytiled_parser/parsers/tmx/layer.py +++ b/pytiled_parser/parsers/tmx/layer.py @@ -21,8 +21,17 @@ from pytiled_parser.parsers.tmx.properties import parse as parse_properties from pytiled_parser.parsers.tmx.tiled_object import parse as parse_object from pytiled_parser.util import parse_color +# This optional zstd include is basically impossible to make a sensible test +# for both ways. It's been tested manually, is unlikely to change or be effected +# so we're just excluding it from test coverage. We are only testing cases where +# zstd is not installed in the test suite, as that is the scenario for 99% +# of use cases most likely. +# +# This does mean that the test suite will fail if zstd is installed, so for +# development purposes it should only be installed when specifically manually +# testing for zstd things. zstd_spec = importlib.util.find_spec("zstd") -if zstd_spec: +if zstd_spec: # pragma: no cover import zstd else: zstd = None @@ -77,7 +86,8 @@ def _decode_tile_layer_data( "zstd compression support is not installed." "To install use 'pip install pytiled-parser[zstd]'" ) - elif compression == "zstd": + # See above note at top of module about zstd tests + elif compression == "zstd": # pragma: no cover unzipped_data = zstd.decompress(unencoded_data) else: unzipped_data = unencoded_data @@ -356,5 +366,3 @@ def parse( return _parse_image_layer(raw_layer) elif type_ == "layer": return _parse_tile_layer(raw_layer) - - raise RuntimeError(f"An invalid layer type of {type_} was supplied") diff --git a/pytiled_parser/util.py b/pytiled_parser/util.py index 0e850b9..45de44e 100644 --- a/pytiled_parser/util.py +++ b/pytiled_parser/util.py @@ -60,7 +60,7 @@ def load_object_template(file_path: Path) -> Any: tileset_path = Path(file_path.parent / tileset_element.attrib["source"]) new_tileset = load_object_tileset(tileset_path) new_tileset_path = tileset_path.parent - elif template_format == "json": + else: with open(file_path) as template_file: template = json.load(template_file) if "tileset" in template: @@ -79,7 +79,7 @@ def load_object_tileset(file_path: Path) -> Any: with open(file_path) as tileset_file: if tileset_format == "tmx": new_tileset = etree.parse(tileset_file).getroot() - elif tileset_format == "json": + else: new_tileset = json.load(tileset_file) return new_tileset diff --git a/tests/test_data/layer_tests/b64_zstd/map.json b/tests/test_data/layer_tests/b64_zstd/map.json index f8e714d..facdd25 100644 --- a/tests/test_data/layer_tests/b64_zstd/map.json +++ b/tests/test_data/layer_tests/b64_zstd/map.json @@ -63,7 +63,7 @@ "nextobjectid":3, "orientation":"orthogonal", "renderorder":"right-down", - "tiledversion":"1.6.0", + "tiledversion":"1.8.5", "tileheight":32, "tilesets":[ { @@ -72,6 +72,6 @@ }], "tilewidth":32, "type":"map", - "version":"1.6", + "version":"1.8", "width":8 } \ No newline at end of file diff --git a/tests/test_data/layer_tests/b64_zstd/map.tmx b/tests/test_data/layer_tests/b64_zstd/map.tmx new file mode 100644 index 0000000..6d53144 --- /dev/null +++ b/tests/test_data/layer_tests/b64_zstd/map.tmx @@ -0,0 +1,17 @@ + + + + + + KLUv/SDAZQIAAgwSDBCw3gwwDFcLT4p0Cv/c884531zzzDG/3PLKKZ9c8sghf9zxxhlfXPHEET/c8MIJH1zwwAH/7r079+3as2O/br069enSo0MBAA== + + + + + + + + + + + diff --git a/tests/test_data/layer_tests/b64_zstd/tileset.json b/tests/test_data/layer_tests/b64_zstd/tileset.json index 1a07451..b44dbb4 100644 --- a/tests/test_data/layer_tests/b64_zstd/tileset.json +++ b/tests/test_data/layer_tests/b64_zstd/tileset.json @@ -6,9 +6,9 @@ "name":"tile_set_image", "spacing":1, "tilecount":48, - "tiledversion":"1.6.0", + "tiledversion":"1.8.5", "tileheight":32, "tilewidth":32, "type":"tileset", - "version":"1.6" + "version":"1.8" } \ No newline at end of file diff --git a/tests/test_data/layer_tests/unknown_type/map.json b/tests/test_data/layer_tests/unknown_type/map.json new file mode 100644 index 0000000..ae74baa --- /dev/null +++ b/tests/test_data/layer_tests/unknown_type/map.json @@ -0,0 +1,77 @@ +{ "compressionlevel":-1, + "height":6, + "infinite":false, + "layers":[ + { + "compression":"", + "data":"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAA", + "encoding":"base64", + "height":6, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"faketype", + "visible":true, + "width":8, + "x":0, + "y":0 + }, + { + "id":4, + "layers":[ + { + "draworder":"topdown", + "id":2, + "name":"Object Layer 1", + "objects":[ + { + "height":52.6666666666667, + "id":1, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":69.3333333333333, + "x":46.3333333333333, + "y":39 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "name":"Group 1", + "opacity":1, + "type":"group", + "visible":true, + "x":0, + "y":0 + }, + { + "id":3, + "image":"..\/..\/images\/tile_04.png", + "name":"Image Layer 1", + "opacity":1, + "transparentcolor":"#000000", + "type":"imagelayer", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":5, + "nextobjectid":3, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.6.0", + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "source":"..\/all_layer_types\/tileset.json" + }], + "tilewidth":32, + "type":"map", + "version":"1.6", + "width":8 +} \ No newline at end of file diff --git a/tests/test_data/layer_tests/unknown_type/map.tmx b/tests/test_data/layer_tests/unknown_type/map.tmx new file mode 100644 index 0000000..060ebe1 --- /dev/null +++ b/tests/test_data/layer_tests/unknown_type/map.tmx @@ -0,0 +1,17 @@ + + + + + + AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAA + + + + + + + + + + + diff --git a/tests/test_data/tilesets/terrain/expected.py b/tests/test_data/tilesets/terrain/expected.py index 55f50e5..000901a 100644 --- a/tests/test_data/tilesets/terrain/expected.py +++ b/tests/test_data/tilesets/terrain/expected.py @@ -11,17 +11,92 @@ EXPECTED = tileset.Tileset( image_height=199, image_width=265, tile_count=48, - tiled_version="1.6.0", + tiled_version="1.8.5", tile_height=32, tile_width=32, firstgid=1, - version="1.6", + version="1.8", type="tileset", wang_sets=[ wang_set.WangSet( name="Terrains", tile=-1, wang_type="mixed", + properties={"test": "this is a test"}, + wang_colors=[ + wang_set.WangColor( + name="Sand", + probability=1, + tile=-1, + color=common_types.Color(255, 0, 0, 255), + ), + wang_set.WangColor( + name="Cobblestone", + probability=1, + tile=-1, + color=common_types.Color(0, 255, 0, 255), + ), + wang_set.WangColor( + name="Pavement", + probability=1, + tile=-1, + color=common_types.Color(0, 0, 255, 255), + ), + wang_set.WangColor( + name="Dirt", + probability=1, + tile=-1, + color=common_types.Color(255, 119, 0, 255), + properties={"test": "this is a test"}, + ), + ], + wang_tiles={ + 0: wang_set.WangTile(tile_id=0, wang_id=[1, 1, 0, 2, 0, 1, 1, 1]), + 1: wang_set.WangTile(tile_id=1, wang_id=[1, 1, 0, 2, 2, 2, 0, 1]), + 2: wang_set.WangTile(tile_id=2, wang_id=[1, 1, 1, 1, 0, 2, 0, 1]), + 3: wang_set.WangTile(tile_id=3, wang_id=[4, 4, 0, 1, 0, 4, 4, 4]), + 4: wang_set.WangTile(tile_id=4, wang_id=[4, 4, 4, 4, 0, 1, 0, 4]), + 5: wang_set.WangTile(tile_id=5, wang_id=[1, 1, 0, 4, 0, 1, 1, 1]), + 6: wang_set.WangTile(tile_id=6, wang_id=[1, 1, 0, 4, 4, 4, 0, 1]), + 7: wang_set.WangTile(tile_id=7, wang_id=[1, 1, 1, 1, 0, 4, 0, 1]), + 8: wang_set.WangTile(tile_id=8, wang_id=[0, 2, 2, 2, 0, 1, 1, 1]), + 9: wang_set.WangTile(tile_id=9, wang_id=[2, 2, 2, 2, 2, 2, 2, 2]), + 10: wang_set.WangTile(tile_id=10, wang_id=[0, 1, 1, 1, 0, 2, 2, 2]), + 11: wang_set.WangTile(tile_id=11, wang_id=[0, 1, 0, 4, 4, 4, 4, 4]), + 12: wang_set.WangTile(tile_id=12, wang_id=[0, 4, 4, 4, 4, 4, 0, 1]), + 13: wang_set.WangTile(tile_id=13, wang_id=[0, 4, 4, 4, 0, 1, 1, 1]), + 14: wang_set.WangTile(tile_id=14, wang_id=[4, 4, 4, 4, 4, 4, 4, 4]), + 15: wang_set.WangTile(tile_id=15, wang_id=[0, 1, 1, 1, 0, 4, 4, 4]), + 16: wang_set.WangTile(tile_id=16, wang_id=[0, 2, 0, 1, 1, 1, 1, 1]), + 17: wang_set.WangTile(tile_id=17, wang_id=[2, 2, 0, 1, 1, 1, 0, 2]), + 18: wang_set.WangTile(tile_id=18, wang_id=[0, 1, 1, 1, 1, 1, 0, 2]), + 19: wang_set.WangTile(tile_id=19, wang_id=[2, 2, 0, 1, 0, 2, 2, 2]), + 20: wang_set.WangTile(tile_id=20, wang_id=[2, 2, 2, 2, 0, 1, 0, 2]), + 21: wang_set.WangTile(tile_id=21, wang_id=[0, 4, 0, 1, 1, 1, 1, 1]), + 22: wang_set.WangTile(tile_id=22, wang_id=[4, 4, 0, 1, 1, 1, 0, 4]), + 23: wang_set.WangTile(tile_id=23, wang_id=[0, 1, 1, 1, 1, 1, 0, 4]), + 24: wang_set.WangTile(tile_id=24, wang_id=[1, 1, 0, 3, 0, 1, 1, 1]), + 25: wang_set.WangTile(tile_id=25, wang_id=[1, 1, 0, 3, 3, 3, 0, 1]), + 26: wang_set.WangTile(tile_id=26, wang_id=[1, 1, 1, 1, 0, 3, 0, 1]), + 27: wang_set.WangTile(tile_id=27, wang_id=[0, 1, 0, 2, 2, 2, 2, 2]), + 28: wang_set.WangTile(tile_id=28, wang_id=[0, 2, 2, 2, 2, 2, 0, 1]), + 29: wang_set.WangTile(tile_id=29, wang_id=[1, 1, 1, 1, 1, 1, 1, 1]), + 32: wang_set.WangTile(tile_id=32, wang_id=[0, 3, 3, 3, 0, 1, 1, 1]), + 33: wang_set.WangTile(tile_id=33, wang_id=[3, 3, 3, 3, 3, 3, 3, 3]), + 34: wang_set.WangTile(tile_id=34, wang_id=[0, 1, 1, 1, 0, 3, 3, 3]), + 35: wang_set.WangTile(tile_id=35, wang_id=[3, 3, 0, 1, 0, 3, 3, 3]), + 36: wang_set.WangTile(tile_id=36, wang_id=[3, 3, 3, 3, 0, 1, 0, 3]), + 40: wang_set.WangTile(tile_id=40, wang_id=[0, 3, 0, 1, 1, 1, 1, 1]), + 41: wang_set.WangTile(tile_id=41, wang_id=[3, 3, 0, 1, 1, 1, 0, 3]), + 42: wang_set.WangTile(tile_id=42, wang_id=[0, 1, 1, 1, 1, 1, 0, 3]), + 43: wang_set.WangTile(tile_id=43, wang_id=[0, 1, 0, 3, 3, 3, 3, 3]), + 44: wang_set.WangTile(tile_id=44, wang_id=[0, 3, 3, 3, 3, 3, 0, 1]), + }, + ), + wang_set.WangSet( + name="Copy of Terrains", + tile=-1, + wang_type="mixed", wang_colors=[ wang_set.WangColor( name="Sand", @@ -46,6 +121,7 @@ EXPECTED = tileset.Tileset( probability=1, tile=-1, color=common_types.Color(255, 119, 0, 255), + properties={"test": "this is a test"}, ), ], wang_tiles={ diff --git a/tests/test_data/tilesets/terrain/tileset.json b/tests/test_data/tilesets/terrain/tileset.json index e43b4fb..bcb3614 100644 --- a/tests/test_data/tilesets/terrain/tileset.json +++ b/tests/test_data/tilesets/terrain/tileset.json @@ -6,11 +6,11 @@ "name":"tileset", "spacing":1, "tilecount":48, - "tiledversion":"1.6.0", + "tiledversion":"1.8.5", "tileheight":32, "tilewidth":32, "type":"tileset", - "version":"1.6", + "version":"1.8", "wangsets":[ { "colors":[ @@ -36,9 +36,218 @@ "color":"#ff7700", "name":"Dirt", "probability":1, + "properties":[ + { + "name":"test", + "type":"string", + "value":"this is a test" + }], "tile":-1 }], "name":"Terrains", + "properties":[ + { + "name":"test", + "type":"string", + "value":"this is a test" + }], + "tile":-1, + "type":"mixed", + "wangtiles":[ + { + "tileid":0, + "wangid":[1, 1, 0, 2, 0, 1, 1, 1] + }, + { + "tileid":1, + "wangid":[1, 1, 0, 2, 2, 2, 0, 1] + }, + { + "tileid":2, + "wangid":[1, 1, 1, 1, 0, 2, 0, 1] + }, + { + "tileid":3, + "wangid":[4, 4, 0, 1, 0, 4, 4, 4] + }, + { + "tileid":4, + "wangid":[4, 4, 4, 4, 0, 1, 0, 4] + }, + { + "tileid":5, + "wangid":[1, 1, 0, 4, 0, 1, 1, 1] + }, + { + "tileid":6, + "wangid":[1, 1, 0, 4, 4, 4, 0, 1] + }, + { + "tileid":7, + "wangid":[1, 1, 1, 1, 0, 4, 0, 1] + }, + { + "tileid":8, + "wangid":[0, 2, 2, 2, 0, 1, 1, 1] + }, + { + "tileid":9, + "wangid":[2, 2, 2, 2, 2, 2, 2, 2] + }, + { + "tileid":10, + "wangid":[0, 1, 1, 1, 0, 2, 2, 2] + }, + { + "tileid":11, + "wangid":[0, 1, 0, 4, 4, 4, 4, 4] + }, + { + "tileid":12, + "wangid":[0, 4, 4, 4, 4, 4, 0, 1] + }, + { + "tileid":13, + "wangid":[0, 4, 4, 4, 0, 1, 1, 1] + }, + { + "tileid":14, + "wangid":[4, 4, 4, 4, 4, 4, 4, 4] + }, + { + "tileid":15, + "wangid":[0, 1, 1, 1, 0, 4, 4, 4] + }, + { + "tileid":16, + "wangid":[0, 2, 0, 1, 1, 1, 1, 1] + }, + { + "tileid":17, + "wangid":[2, 2, 0, 1, 1, 1, 0, 2] + }, + { + "tileid":18, + "wangid":[0, 1, 1, 1, 1, 1, 0, 2] + }, + { + "tileid":19, + "wangid":[2, 2, 0, 1, 0, 2, 2, 2] + }, + { + "tileid":20, + "wangid":[2, 2, 2, 2, 0, 1, 0, 2] + }, + { + "tileid":21, + "wangid":[0, 4, 0, 1, 1, 1, 1, 1] + }, + { + "tileid":22, + "wangid":[4, 4, 0, 1, 1, 1, 0, 4] + }, + { + "tileid":23, + "wangid":[0, 1, 1, 1, 1, 1, 0, 4] + }, + { + "tileid":24, + "wangid":[1, 1, 0, 3, 0, 1, 1, 1] + }, + { + "tileid":25, + "wangid":[1, 1, 0, 3, 3, 3, 0, 1] + }, + { + "tileid":26, + "wangid":[1, 1, 1, 1, 0, 3, 0, 1] + }, + { + "tileid":27, + "wangid":[0, 1, 0, 2, 2, 2, 2, 2] + }, + { + "tileid":28, + "wangid":[0, 2, 2, 2, 2, 2, 0, 1] + }, + { + "tileid":29, + "wangid":[1, 1, 1, 1, 1, 1, 1, 1] + }, + { + "tileid":32, + "wangid":[0, 3, 3, 3, 0, 1, 1, 1] + }, + { + "tileid":33, + "wangid":[3, 3, 3, 3, 3, 3, 3, 3] + }, + { + "tileid":34, + "wangid":[0, 1, 1, 1, 0, 3, 3, 3] + }, + { + "tileid":35, + "wangid":[3, 3, 0, 1, 0, 3, 3, 3] + }, + { + "tileid":36, + "wangid":[3, 3, 3, 3, 0, 1, 0, 3] + }, + { + "tileid":40, + "wangid":[0, 3, 0, 1, 1, 1, 1, 1] + }, + { + "tileid":41, + "wangid":[3, 3, 0, 1, 1, 1, 0, 3] + }, + { + "tileid":42, + "wangid":[0, 1, 1, 1, 1, 1, 0, 3] + }, + { + "tileid":43, + "wangid":[0, 1, 0, 3, 3, 3, 3, 3] + }, + { + "tileid":44, + "wangid":[0, 3, 3, 3, 3, 3, 0, 1] + }] + }, + { + "colors":[ + { + "color":"#ff0000", + "name":"Sand", + "probability":1, + "tile":-1 + }, + { + "color":"#00ff00", + "name":"Cobblestone", + "probability":1, + "tile":-1 + }, + { + "color":"#0000ff", + "name":"Pavement", + "probability":1, + "tile":-1 + }, + { + "color":"#ff7700", + "name":"Dirt", + "probability":1, + "properties":[ + { + "name":"test", + "type":"string", + "value":"this is a test" + }], + "tile":-1 + }], + "name":"Copy of Terrains", "tile":-1, "type":"mixed", "wangtiles":[ diff --git a/tests/test_data/tilesets/terrain/tileset.tsx b/tests/test_data/tilesets/terrain/tileset.tsx index 2a57297..a22e1c5 100644 --- a/tests/test_data/tilesets/terrain/tileset.tsx +++ b/tests/test_data/tilesets/terrain/tileset.tsx @@ -1,12 +1,69 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_layer.py b/tests/test_layer.py index bce74b3..727fca4 100644 --- a/tests/test_layer.py +++ b/tests/test_layer.py @@ -21,12 +21,14 @@ ALL_LAYER_TESTS = [ LAYER_TESTS / "b64", LAYER_TESTS / "b64_gzip", LAYER_TESTS / "b64_zlib", - # LAYER_TESTS / "b64_zstd", LAYER_TESTS / "no_layers", LAYER_TESTS / "infinite_map", LAYER_TESTS / "infinite_map_b64", ] +ZSTD_LAYER_TEST = LAYER_TESTS / "b64_zstd" +UNKNOWN_LAYER_TYPE_TEST = LAYER_TESTS / "unknown_type" + def fix_object(my_object): my_object.coordinates = OrderedPair( @@ -96,3 +98,41 @@ def test_layer_integration(parser_type, layer_test): print(layer.size) assert layers == expected.EXPECTED + +@pytest.mark.parametrize("parser_type", ["json", "tmx"]) +def test_zstd_not_installed(parser_type): + if parser_type == "json": + raw_layers_path = ZSTD_LAYER_TEST / "map.json" + with open(raw_layers_path) as raw_layers_file: + raw_layers = json.load(raw_layers_file)["layers"] + with pytest.raises(ValueError): + layers = [parse_json(raw_layer) for raw_layer in raw_layers] + elif parser_type == "tmx": + raw_layers_path = ZSTD_LAYER_TEST / "map.tmx" + with open(raw_layers_path) as raw_layers_file: + with pytest.raises(ValueError): + raw_layer = etree.parse(raw_layers_file).getroot() + layers = [] + for layer in raw_layer.findall("./layer"): + layers.append(parse_tmx(layer)) + + for layer in raw_layer.findall("./objectgroup"): + layers.append(parse_tmx(layer)) + + for layer in raw_layer.findall("./group"): + layers.append(parse_tmx(layer)) + + for layer in raw_layer.findall("./imagelayer"): + layers.append(parse_tmx(layer)) + +def test_unknown_layer_type(): + # We only test JSON here because due to the nature of the TMX format + # there does not exist a scenario where pytiled_parser can attempt to + # parse an unknown layer type. In JSON a RuntimeError error will be + # raised if an unknown type is provided. In TMX the layer will just + # be ignored. + raw_layers_path = UNKNOWN_LAYER_TYPE_TEST / "map.json" + with open(raw_layers_path) as raw_layers_file: + raw_layers = json.load(raw_layers_file)["layers"] + with pytest.raises(RuntimeError): + layers = [parse_json(raw_layer) for raw_layer in raw_layers]