Lesson 17.4: Automated test for saved game reader

The last thing we’ll do with the new saved game logic is create an automated test that ensures we don’t break that function when we make more changes.

I’ll also talk about opening up this project to more contributors.

 

 

 

Lesson Steps

Step 1: Copy saved game to \TestEngine\TestFiles\SavedGames\Game_0_1_000.soscsrpg.

Add the new \TestFiles\SavedGames directory to the TestEngine project. Copy the Game_0_1_000.soscsrpg file from this page (or get it from GitHub). Set its “Copy to Output Directory” to “Copy Always”.

 

Game_0_1_000.soscsrpg

{
  "Version": "0.1.000",
  "CurrentPlayer": {
    "CharacterClass": "Fighter",
    "ExperiencePoints": 20,
    "Quests": [
      {
        "PlayerQuest": {
          "ID": 1
        },
        "IsCompleted": false
      }
    ],
    "Recipes": [
      {
        "ID": 1
      }
    ],
    "Name": "Scott",
    "Dexterity": 18,
    "CurrentHitPoints": 8,
    "MaximumHitPoints": 10,
    "Gold": 1000000,
    "Level": 1,
    "Inventory": {
      "Items": [
        {
          "ItemTypeID": 1001
        },
        {
          "ItemTypeID": 2001
        },
        {
          "ItemTypeID": 3001
        },
        {
          "ItemTypeID": 3002
        },
        {
          "ItemTypeID": 3003
        }
      ]
    },
    "CurrentWeapon": null,
    "CurrentConsumable": null
  },
  "CurrentLocation": {
    "XCoordinate": 0,
    "YCoordinate": 1
  }
}

 

Step 2: Create new \TestEngine\Services\TestSaveGameService.cs unit test class

Add the “using” directives for Engine.Services and Engine.ViewModels and create a test function for version 0.1.000.

On line 14, we read the saved game from our test file and store it to a local GameSession object.

Then, we have assertions from line 19 through 48 to check that all the values were correctly loaded.

 

TestSaveGameService.cs

using System.Linq;
using Engine.Services;
using Engine.ViewModels;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestEngine.Services
{
    [TestClass]
    public class TestSaveGameService
    {
        [TestMethod]
        public void Test_Restore_0_1_000()
        {
            GameSession gameSession = 
                SaveGameService
                    .LoadLastSaveOrCreateNew(@".\TestFiles\SavedGames\Game_0_1_000.soscsrpg");

            // Game session data
            Assert.AreEqual("0.1.000", gameSession.Version);
            Assert.AreEqual(0, gameSession.CurrentLocation.XCoordinate);
            Assert.AreEqual(1, gameSession.CurrentLocation.YCoordinate);

            // Player data
            Assert.AreEqual("Fighter", gameSession.CurrentPlayer.CharacterClass);
            Assert.AreEqual("Scott", gameSession.CurrentPlayer.Name);
            Assert.AreEqual(18, gameSession.CurrentPlayer.Dexterity);
            Assert.AreEqual(8, gameSession.CurrentPlayer.CurrentHitPoints);
            Assert.AreEqual(10, gameSession.CurrentPlayer.MaximumHitPoints);
            Assert.AreEqual(20, gameSession.CurrentPlayer.ExperiencePoints);
            Assert.AreEqual(1, gameSession.CurrentPlayer.Level);
            Assert.AreEqual(1000000, gameSession.CurrentPlayer.Gold);

            // Player quest data
            Assert.AreEqual(1, gameSession.CurrentPlayer.Quests.Count);
            Assert.AreEqual(1, gameSession.CurrentPlayer.Quests[0].PlayerQuest.ID);
            Assert.IsFalse(gameSession.CurrentPlayer.Quests[0].IsCompleted);

            // Player recipe data
            Assert.AreEqual(1, gameSession.CurrentPlayer.Recipes.Count);
            Assert.AreEqual(1, gameSession.CurrentPlayer.Recipes[0].ID);

            // Player inventory data
            Assert.AreEqual(5, gameSession.CurrentPlayer.Inventory.Items.Count);
            Assert.AreEqual(1, gameSession.CurrentPlayer.Inventory.Items.Count(i => i.ItemTypeID.Equals(1001)));
            Assert.AreEqual(1, gameSession.CurrentPlayer.Inventory.Items.Count(i => i.ItemTypeID.Equals(2001)));
            Assert.AreEqual(1, gameSession.CurrentPlayer.Inventory.Items.Count(i => i.ItemTypeID.Equals(3001)));
            Assert.AreEqual(1, gameSession.CurrentPlayer.Inventory.Items.Count(i => i.ItemTypeID.Equals(3002)));
            Assert.AreEqual(1, gameSession.CurrentPlayer.Inventory.Items.Count(i => i.ItemTypeID.Equals(3003)));
        }
    }
}

 

Step 3: Run the tests

Since we added a new unit test, run all the unit tests and make sure they all pass.

 

Opening up the project to more contributors

Several people have built their own version of this game, with new features, and asked if they could contribute to the main project.

I haven’t run an open source project with other contributors, but I think it’s a great idea to get more people involved. Personally, I need to spend time on my consulting business, and this should let us get faster improvements to the project.

To help coordinate work, I added a wiki page for the project and am now adding bugs and feature requests through the issues page.

If you want to contribute changes and bug fixes, and you have a GitHub account, please leave a message below.

For now, I’ll be the only approver for pull requests, but we’ll adapt as we go along.

Please let me know if you have any suggestions or questions.

 

 

Additional links for this project

Source code: https://github.com/ScottLilly/SOSCSRPG

Project plan: https://github.com/ScottLilly/SOSCSRPG/projects/1

Project wiki: https://github.com/ScottLilly/SOSCSRPG/wiki

Discord: https://discord.gg/AUYXYtH

Return to main page

Leave a Reply

Your email address will not be published. Required fields are marked *