mirror of
https://github.com/glest/glest-source.git
synced 2025-02-24 11:42:31 +01:00
- added missing unti testfile
This commit is contained in:
parent
2b59eda69b
commit
4310ebc6d4
284
source/tests/shared_lib/streflop/streflop_test.cpp
Normal file
284
source/tests/shared_lib/streflop/streflop_test.cpp
Normal file
@ -0,0 +1,284 @@
|
||||
// ==============================================================
|
||||
// This file is part of MegaGlest Unit Tests (www.megaglest.org)
|
||||
//
|
||||
// Copyright (C) 2013 Mark Vejvoda
|
||||
//
|
||||
// You can redistribute this code and/or modify it under
|
||||
// the terms of the GNU General Public License as published
|
||||
// by the Free Software Foundation; either version 2 of the
|
||||
// License, or (at your option) any later version
|
||||
// ==============================================================
|
||||
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
#include "vec.h"
|
||||
#include "skill_type.h"
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <io.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
using namespace Shared::Util;
|
||||
using namespace Shared::Graphics;
|
||||
using namespace Glest::Game;
|
||||
//
|
||||
// Tests for streflop floating point consistency
|
||||
//
|
||||
const int64 PROGRESS_SPEED_MULTIPLIER = 100000;
|
||||
const float standardAirHeight = 5.0f;
|
||||
|
||||
class StreflopTest : public CppUnit::TestFixture {
|
||||
// Register the suite of tests for this fixture
|
||||
CPPUNIT_TEST_SUITE( StreflopTest );
|
||||
|
||||
CPPUNIT_TEST( test_warmup_cases );
|
||||
CPPUNIT_TEST( test_known_out_of_synch_cases );
|
||||
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
// End of Fixture registration
|
||||
|
||||
private:
|
||||
|
||||
float cellHeight;
|
||||
Field currField;
|
||||
float tileSetAirHeight;
|
||||
int cellLandUnitHeight;
|
||||
int cellObjectHeight;
|
||||
SkillClass currSkill;
|
||||
int curUnitTypeSize;
|
||||
int64 progress;
|
||||
Vec2i lastPos;
|
||||
Vec2i pos;
|
||||
|
||||
public:
|
||||
|
||||
void test_warmup_cases() {
|
||||
|
||||
cellHeight = 1.1;
|
||||
currField = fLand;
|
||||
tileSetAirHeight = standardAirHeight;
|
||||
cellLandUnitHeight = 1;
|
||||
cellObjectHeight = 0;
|
||||
currSkill = scMove;
|
||||
curUnitTypeSize = 1;
|
||||
progress = 10;
|
||||
lastPos = Vec2i(1,1);
|
||||
pos = Vec2i(1,2);
|
||||
|
||||
int unitTypeHeight = 1;
|
||||
Vec3f result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 0;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.1] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 2;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [2.1] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fAir;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [6.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fAir;
|
||||
currSkill = scAttack;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [6.6] z [2]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scAttack;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [2]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scAttack;
|
||||
cellLandUnitHeight = -1;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [2]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fAir;
|
||||
currSkill = scAttack;
|
||||
cellLandUnitHeight = -1;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [6.6] z [2]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scMove;
|
||||
cellLandUnitHeight = 2;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fAir;
|
||||
currSkill = scMove;
|
||||
cellLandUnitHeight = 2;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [6.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scMove;
|
||||
cellLandUnitHeight = -1;
|
||||
cellObjectHeight = 0;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scMove;
|
||||
cellLandUnitHeight = -1;
|
||||
cellObjectHeight = 1;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fAir;
|
||||
currSkill = scMove;
|
||||
cellLandUnitHeight = -1;
|
||||
cellObjectHeight = 1;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [6.6] z [1.0001]"), result.getString() );
|
||||
|
||||
unitTypeHeight = 1;
|
||||
currField = fLand;
|
||||
currSkill = scMove;
|
||||
progress = 1324312;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [1] y [1.6] z [14.2431]"), result.getString() );
|
||||
|
||||
cellHeight = 2.870369;
|
||||
currField = fLand;
|
||||
tileSetAirHeight = standardAirHeight;
|
||||
cellLandUnitHeight = 0;
|
||||
cellObjectHeight = 0;
|
||||
currSkill = scAttack;
|
||||
curUnitTypeSize = 1;
|
||||
progress = 21250;
|
||||
lastPos = Vec2i(96,34);
|
||||
pos = Vec2i(95,35);
|
||||
|
||||
unitTypeHeight = 3;
|
||||
result = getCurrVector(unitTypeHeight);
|
||||
CPPUNIT_ASSERT_EQUAL( string("x [95] y [4.37037] z [35]"), result.getString() );
|
||||
|
||||
}
|
||||
|
||||
void test_known_out_of_synch_cases() {
|
||||
|
||||
// cellHeight = 2.870369;
|
||||
// currField = fLand;
|
||||
// tileSetAirHeight = standardAirHeight;
|
||||
// cellLandUnitHeight = 0;
|
||||
// cellObjectHeight = 0;
|
||||
// currSkill = scAttack;
|
||||
// curUnitTypeSize = 1;
|
||||
// progress = 21250;
|
||||
// lastPos = Vec2i(96,34);
|
||||
// pos = Vec2i(95,35);
|
||||
//
|
||||
// int unitTypeHeight = 3;
|
||||
// Vec3f result = getCurrVector(unitTypeHeight);
|
||||
// CPPUNIT_ASSERT_EQUAL( string("x [95] y [4.37037] z [35]"), result.getString() );
|
||||
|
||||
}
|
||||
|
||||
// =========================== Helper Methods =================================
|
||||
|
||||
float computeHeight(const Vec2i &pos) const {
|
||||
|
||||
float height = cellHeight;
|
||||
|
||||
if(currField == fAir) {
|
||||
float airHeight = tileSetAirHeight;
|
||||
airHeight = truncateDecimal<float>(airHeight,6);
|
||||
|
||||
height += airHeight;
|
||||
height = truncateDecimal<float>(height,6);
|
||||
|
||||
if(cellLandUnitHeight >= 0 && cellLandUnitHeight > airHeight) {
|
||||
height += (std::min((float)cellLandUnitHeight,standardAirHeight * 3) - airHeight);
|
||||
height = truncateDecimal<float>(height,6);
|
||||
}
|
||||
else {
|
||||
if(cellObjectHeight >= 0) {
|
||||
if(cellObjectHeight > airHeight) {
|
||||
height += (std::min((float)cellObjectHeight,standardAirHeight * 3) - airHeight);
|
||||
height = truncateDecimal<float>(height,6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return height;
|
||||
}
|
||||
|
||||
float getProgressAsFloat() const {
|
||||
float result = (static_cast<float>(progress) / static_cast<float>(PROGRESS_SPEED_MULTIPLIER));
|
||||
result = truncateDecimal<float>(result,6);
|
||||
return result;
|
||||
}
|
||||
|
||||
Vec3f getVectorFlat(const Vec2i &lastPosValue, const Vec2i &curPosValue) const {
|
||||
Vec3f v;
|
||||
|
||||
float y1= computeHeight(lastPosValue);
|
||||
float y2= computeHeight(curPosValue);
|
||||
|
||||
if(currSkill == scMove) {
|
||||
float progressAsFloat = getProgressAsFloat();
|
||||
|
||||
v.x = lastPosValue.x + progressAsFloat * (curPosValue.x - lastPosValue.x);
|
||||
v.z = lastPosValue.y + progressAsFloat * (curPosValue.y - lastPosValue.y);
|
||||
v.y = y1 + progressAsFloat * (y2-y1);
|
||||
|
||||
v.x = truncateDecimal<float>(v.x,6);
|
||||
v.y = truncateDecimal<float>(v.y,6);
|
||||
v.z = truncateDecimal<float>(v.z,6);
|
||||
}
|
||||
else {
|
||||
v.x = static_cast<float>(curPosValue.x);
|
||||
v.z = static_cast<float>(curPosValue.y);
|
||||
v.y = y2;
|
||||
|
||||
v.x = truncateDecimal<float>(v.x,6);
|
||||
v.y = truncateDecimal<float>(v.y,6);
|
||||
v.z = truncateDecimal<float>(v.z,6);
|
||||
}
|
||||
v.x += curUnitTypeSize / 2.f - 0.5f;
|
||||
v.z += curUnitTypeSize / 2.f - 0.5f;
|
||||
|
||||
v.x = truncateDecimal<float>(v.x,6);
|
||||
v.z = truncateDecimal<float>(v.z,6);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
Vec3f getCurrVectorFlat() const {
|
||||
return getVectorFlat(lastPos, pos);
|
||||
}
|
||||
|
||||
Vec3f getCurrVector(int unitTypeHeight) const {
|
||||
Vec3f result = getCurrVectorFlat() + Vec3f(0.f, unitTypeHeight / 2.f, 0.f);
|
||||
result.x = truncateDecimal<float>(result.x,6);
|
||||
result.y = truncateDecimal<float>(result.y,6);
|
||||
result.z = truncateDecimal<float>(result.z,6);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// Test Suite Registrations
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( StreflopTest );
|
||||
//
|
Loading…
x
Reference in New Issue
Block a user