namespace Cthangover.Mods.Rpg.Tests { using System.Collections.Generic; using Cthangover.Core.Mods.Testing; /// /// Map layers are hand-edited text: parsing must be forgiving and give a /// grid of exactly the declared size, and writing must read back the same. /// public class RpgMapGridTests { [ModTest("grid/parse_reads_rows_and_collision")] static void ParseReadsRowsAndCollision(ModTestContext ctx) { var map = new RpgMap { Width = 3, Height = 2, Layers = new RpgMapLayers { Back = new List { "0 1 2", "3 . 5" }, Main = new List { ". 8" }, Front = new List(), }, Collision = new List { "#o.", ".x" }, }; var grid = RpgMapGrid.Parse(map); ModAssert.Equal(1, grid.GetTile(RpgLayer.Back, 1, 0), "back (1,0)"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Back, 1, 1), "a dot is empty"); ModAssert.Equal(8, grid.GetTile(RpgLayer.Main, 1, 0), "main (1,0)"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Main, 2, 1), "a missing row is empty"); ModAssert.Equal("#", grid.GetCollision(0, 0).ToString(), "block code"); ModAssert.Equal("o", grid.GetCollision(1, 0).ToString(), "open code"); ModAssert.Equal(".", grid.GetCollision(1, 1).ToString(), "an unknown code is auto"); ModAssert.Equal("#", grid.GetCollision(5, 5).ToString(), "outside the map is blocked"); } [ModTest("grid/parse_is_forgiving")] static void ParseIsForgiving(ModTestContext ctx) { var map = new RpgMap { Width = 2, Height = 1, Layers = new RpgMapLayers { Back = new List { "7 abc 9 9" } }, }; var grid = RpgMapGrid.Parse(map); ModAssert.Equal(2, grid.Width, "width stays declared"); ModAssert.Equal(7, grid.GetTile(RpgLayer.Back, 0, 0), "first cell"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Back, 1, 0), "an unreadable token is empty"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Back, 2, 0), "extra cells are cut off"); } [ModTest("grid/write_reads_back")] static void WriteReadsBack(ModTestContext ctx) { var grid = new RpgMapGrid(3, 2); grid.SetTile(RpgLayer.Back, 0, 0, 12); grid.SetTile(RpgLayer.Main, 2, 1, 3); grid.SetTile(RpgLayer.Front, 1, 0, 0); grid.SetCollision(1, 1, RpgCollision.Block); var map = new RpgMap(); grid.WriteTo(map); var back = RpgMapGrid.Parse(map); ModAssert.Equal(3, map.Width, "width written"); ModAssert.Equal(2, map.Height, "height written"); ModAssert.Equal("12 . .", map.Layers.Back[0], "indices are aligned to one width"); ModAssert.Equal(12, back.GetTile(RpgLayer.Back, 0, 0), "back"); ModAssert.Equal(3, back.GetTile(RpgLayer.Main, 2, 1), "main"); ModAssert.Equal(0, back.GetTile(RpgLayer.Front, 1, 0), "front tile 0 is not empty"); ModAssert.Equal("#", back.GetCollision(1, 1).ToString(), "collision"); } [ModTest("grid/all_auto_collision_writes_no_rows")] static void AllAutoCollisionWritesNoRows(ModTestContext ctx) { var map = new RpgMap(); new RpgMapGrid(4, 4).WriteTo(map); ModAssert.Equal(0, map.Collision.Count, "no collision rows"); ModAssert.Equal(4, map.Layers.Main.Count, "layer rows are always written"); } [ModTest("grid/resize_keeps_top_left")] static void ResizeKeepsTopLeft(ModTestContext ctx) { var grid = new RpgMapGrid(2, 2); grid.SetTile(RpgLayer.Back, 1, 1, 5); grid.SetCollision(0, 1, RpgCollision.Open); grid.Resize(4, 1); ModAssert.Equal(4, grid.Width, "new width"); ModAssert.Equal(1, grid.Height, "new height"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Back, 1, 1), "a cut row is gone"); ModAssert.Equal(-1, grid.GetTile(RpgLayer.Back, 3, 0), "new cells are empty"); grid.Resize(2, 2); ModAssert.Equal(".", grid.GetCollision(0, 1).ToString(), "a row cut once does not come back"); } [ModTest("grid/clone_is_independent")] static void CloneIsIndependent(ModTestContext ctx) { var grid = new RpgMapGrid(2, 2); grid.SetTile(RpgLayer.Main, 0, 0, 4); var copy = grid.Clone(); copy.SetTile(RpgLayer.Main, 0, 0, 9); copy.SetCollision(1, 1, RpgCollision.Block); ModAssert.Equal(4, grid.GetTile(RpgLayer.Main, 0, 0), "original tile"); ModAssert.Equal(".", grid.GetCollision(1, 1).ToString(), "original collision"); } } }