The open source repository for the action RPG game in development by Sig Productions titled 'Adventures in Lestoria'!
https://forums.lestoria.net
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
10 KiB
178 lines
10 KiB
#pragma region License
|
|
/*
|
|
License (OLC-3)
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
|
|
|
|
Redistribution and use in source and binary forms, with or without modification,
|
|
are permitted provided that the following conditions are met:
|
|
|
|
1. Redistributions or derivations of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions or derivative works in binary form must reproduce the above
|
|
copyright notice. This list of conditions and the following disclaimer must be
|
|
reproduced in the documentation and/or other materials provided with the distribution.
|
|
|
|
3. Neither the name of the copyright holder nor the names of its contributors may
|
|
be used to endorse or promote products derived from this software without specific
|
|
prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
SUCH DAMAGE.
|
|
|
|
Portions of this software are copyright © 2024 The FreeType
|
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
|
All rights reserved.
|
|
*/
|
|
#pragma endregion
|
|
|
|
#include "CppUnitTest.h"
|
|
#include "AdventuresInLestoria.h"
|
|
#include "Tutorial.h"
|
|
#include <random>
|
|
#include <format>
|
|
#include "ItemDrop.h"
|
|
#include "DamageNumber.h"
|
|
#include <ranges>
|
|
|
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
|
|
INCLUDE_GFX
|
|
INCLUDE_ITEM_DATA
|
|
INCLUDE_DAMAGENUMBER_LIST
|
|
INCLUDE_INITIALIZEGAMECONFIGURATIONS
|
|
|
|
extern std::mt19937 rng;
|
|
|
|
namespace EngineTests
|
|
{
|
|
TEST_CLASS(EngineTest)
|
|
{
|
|
public:
|
|
std::unique_ptr<AiL>testGame;
|
|
InputGroup testKeyboardInput;
|
|
Player*player;
|
|
HWButton*testKey;
|
|
TEST_METHOD_INITIALIZE(PlayerInitialize){
|
|
InitializeGameConfigurations();
|
|
rng=std::mt19937{57189U};//Establish a fixed random seed on setup so the exact same results are generated every test run.
|
|
testGame.reset(new AiL(true));
|
|
ItemAttribute::Initialize();
|
|
ItemInfo::InitializeItems();
|
|
testGame->InitializeGraphics();
|
|
testGame->InitializeClasses();
|
|
sig::Animation::InitializeAnimations();
|
|
testGame->InitializeDefaultKeybinds();
|
|
testGame->InitializePlayer();
|
|
sig::Animation::SetupPlayerAnimations();
|
|
Menu::InitializeMenus();
|
|
Tutorial::Initialize();
|
|
Stats::InitializeDamageReductionTable();
|
|
|
|
GameState::Initialize();
|
|
GameState::STATE=GameState::states.at(States::State::GAME_RUN);
|
|
|
|
#pragma region Setup a fake test map and test monster
|
|
game->MAP_DATA["CAMPAIGN_1_1"];
|
|
ItemDrop::ClearDrops();
|
|
MonsterData testMonsterData{"TestName","Test Monster",1000,10,5,{MonsterDropData{"Health Potion",100.f,1,1}},200.f};
|
|
MONSTER_DATA["TestName"]=testMonsterData;
|
|
#pragma endregion
|
|
testGame->ResetLevelStates();
|
|
|
|
player=testGame->GetPlayer();
|
|
//Setup key "0" as a test input
|
|
testKeyboardInput.AddKeybind(Input{InputType::KEY,0});
|
|
testKey=testGame->GetKeyboardState(0);
|
|
testGame->olc_UpdateKeyFocus(true); //Force the game to be "focused" for tests. Required if we want keyboard inputs to work.
|
|
Menu::themes.SetInitialized();
|
|
GFX.SetInitialized();
|
|
|
|
DAMAGENUMBER_LIST.clear();
|
|
}
|
|
TEST_METHOD_CLEANUP(CleanupTests){
|
|
testGame->EndGame();
|
|
testGame->OnUserUpdate(0.f);
|
|
testGame.reset();
|
|
}
|
|
TEST_METHOD(StripColorTest){
|
|
std::string noColCode{"Hello World!"};
|
|
Assert::AreEqual("Hello World!"s,testGame->stripCol(noColCode),L"Function should not strip out any text when there's no color codes.");
|
|
std::string leadingColCode{"#FFFFFFHello World!"};
|
|
Assert::AreEqual("Hello World!"s,testGame->stripCol(leadingColCode),L"Function should strip out all color codes.");
|
|
std::string extraColCodes{"#FFFFFFHello #00FF00World!"};
|
|
Assert::AreEqual("Hello World!"s,testGame->stripCol(extraColCodes),L"Function should strip out all color codes.");
|
|
std::u32string u32noColCode{noColCode.begin(),noColCode.end()};
|
|
std::u32string u32noColCodeResult{testGame->stripCol(u32noColCode)};
|
|
Assert::AreEqual("Hello World!"s,std::string{u32noColCodeResult.begin(),u32noColCodeResult.end()},L"Function should not strip out any text when there's no color codes.");
|
|
std::u32string u32leadingColCode{noColCode.begin(),noColCode.end()};
|
|
std::u32string u32leadingColCodeResult{testGame->stripCol(u32leadingColCode)};
|
|
Assert::AreEqual("Hello World!"s,std::string{u32leadingColCodeResult.begin(),u32leadingColCodeResult.end()},L"Function should strip out all color codes.");
|
|
std::u32string u32extraColCodes{extraColCodes.begin(),extraColCodes.end()};
|
|
std::u32string u32extraColCodesResult{testGame->stripCol(u32extraColCodes)};
|
|
Assert::AreEqual("Hello World!"s,std::string{u32extraColCodesResult.begin(),u32extraColCodesResult.end()},L"Function should strip out all color codes.");
|
|
}
|
|
TEST_METHOD(StripLeadingColorTest){
|
|
std::string noColCode{"Hello World!"};
|
|
Assert::AreEqual("Hello World!"s,testGame->stripLeadingCol(noColCode),L"Function should not strip out any text when there's no color codes.");
|
|
std::string leadingColCode{"#FFFFFFHello World!"};
|
|
Assert::AreEqual("Hello World!"s,testGame->stripLeadingCol(leadingColCode),L"Function should strip out color code at beginning of text.");
|
|
std::string extraColCodes{"#FFFFFFHello #00FF00World!"};
|
|
Assert::AreEqual("Hello #00FF00World!"s,testGame->stripLeadingCol(extraColCodes),L"Function should only strip out color code at beginning of text.");
|
|
std::u32string u32noColCode{noColCode.begin(),noColCode.end()};
|
|
std::u32string u32noColCodeResult{testGame->stripLeadingCol(u32noColCode)};
|
|
Assert::AreEqual("Hello World!"s,std::string{u32noColCodeResult.begin(),u32noColCodeResult.end()},L"Function should not strip out any text when there's no color codes.");
|
|
std::u32string u32leadingColCode{noColCode.begin(),noColCode.end()};
|
|
std::u32string u32leadingColCodeResult{testGame->stripLeadingCol(u32leadingColCode)};
|
|
Assert::AreEqual("Hello World!"s,std::string{u32leadingColCodeResult.begin(),u32leadingColCodeResult.end()},L"Function should strip out color code at beginning of text.");
|
|
std::u32string u32extraColCodes{extraColCodes.begin(),extraColCodes.end()};
|
|
std::u32string u32extraColCodesResult{testGame->stripLeadingCol(u32extraColCodes)};
|
|
Assert::AreEqual("Hello #00FF00World!"s,std::string{u32extraColCodesResult.begin(),u32extraColCodesResult.end()},L"Function should only strip out color code at beginning of text.");
|
|
}
|
|
TEST_METHOD(GetFinalRenderColorTest){
|
|
Assert::AreEqual(WHITE.n,testGame->GetFinalRenderColor(WHITE,"Hello World!").n,L"Should use source color as there's no HTML color code.");
|
|
Assert::AreEqual(BLUE.n,testGame->GetFinalRenderColor(WHITE,"#0000FFHello World!").n,L"Should use color in string since it has a leading HTML color code.");
|
|
Assert::AreEqual(BLUE.n,testGame->GetFinalRenderColor(WHITE,"#0000FFHello #00FF00World!").n,L"Should use color in string since it has a leading HTML color code.");
|
|
Assert::AreEqual(WHITE.n,testGame->GetFinalRenderColor(WHITE,"Hello #00FF00World!").n,L"Should use source color since there's no leading HTML color code.");
|
|
std::string testStr{"Hello World!"};
|
|
std::u32string u32testStr{testStr.begin(),testStr.end()};
|
|
Assert::AreEqual(WHITE.n,testGame->GetFinalRenderColor(WHITE,testStr).n,L"Should use source color as there's no HTML color code.");
|
|
std::string colorCodeStr{"#0000FFHello World!"};
|
|
std::u32string u32colorCodeStr{colorCodeStr.begin(),colorCodeStr.end()};
|
|
Assert::AreEqual(BLUE.n,testGame->GetFinalRenderColor(WHITE,colorCodeStr).n,L"Should use color in string since it has a leading HTML color code.");
|
|
std::string extraColorCodeStr{"#0000FFHello #00FF00World!"};
|
|
std::u32string u32extraColorCodeStr{extraColorCodeStr.begin(),extraColorCodeStr.end()};
|
|
Assert::AreEqual(BLUE.n,testGame->GetFinalRenderColor(WHITE,extraColorCodeStr).n,L"Should use color in string since it has a leading HTML color code.");
|
|
std::string middleColorCodeStr{"Hello #00FF00World!"};
|
|
std::u32string u32middleColorCodeStr{middleColorCodeStr.begin(),middleColorCodeStr.end()};
|
|
Assert::AreEqual(WHITE.n,testGame->GetFinalRenderColor(WHITE,middleColorCodeStr).n,L"Should use source color since there's no leading HTML color code.");
|
|
}
|
|
TEST_METHOD(UtilMapRangeTest){
|
|
Assert::AreEqual(0.f,util::map_range<float>(0.f,0,100,0,100),L"0 in input range 0-100 output range 0-100 maps to 0");
|
|
Assert::AreEqual(100.f,util::map_range<float>(100.f,0,100,0,100),L"100 in input range 0-100 output range 0-100 maps to 100");
|
|
Assert::AreEqual(50.f,util::map_range<float>(50.f,0,100,0,100),L"50 in input range 0-100 output range 0-100 maps to 100");
|
|
|
|
Assert::AreEqual(0.f,util::map_range<float>(0.f,0,50,0,100),L"0 in input range 0-50 output range 0-100 maps to 0");
|
|
Assert::AreEqual(200.f,util::map_range<float>(100.f,0,50,0,100),L"100 in input range 0-50 output range 0-100 maps to 200");
|
|
Assert::AreEqual(100.f,util::map_range<float>(50.f,0,50,0,100),L"50 in input range 0-50 output range 0-100 maps to 100");
|
|
|
|
Assert::AreEqual(100.f,util::map_range<float>(0.f,0,100,100,200),L"0 in input range 0-100 output range 100-200 maps to 100");
|
|
Assert::AreEqual(200.f,util::map_range<float>(100.f,0,100,100,200),L"100 in input range 0-100 output range 100-200 maps to 200");
|
|
Assert::AreEqual(150.f,util::map_range<float>(50.f,0,100,100,200),L"50 in input range 0-100 output range 100-200 maps to 150");
|
|
|
|
Assert::AreEqual(0.f,util::map_range<float>(0.f,50,100,100,200),L"0 in input range 50-100 output range 100-200 maps to 0");
|
|
Assert::AreEqual(200.f,util::map_range<float>(100.f,50,100,100,200),L"100 in input range 50-100 output range 100-200 maps to 200");
|
|
Assert::AreEqual(100.f,util::map_range<float>(50.f,50,100,100,200),L"50 in input range 50-100 output range 100-200 maps to 100");
|
|
}
|
|
};
|
|
} |