mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 21:40:03 +00:00
Validate integer math
This commit is contained in:
parent
f027acf575
commit
3dada0796a
@ -93,6 +93,21 @@ End)mwscript";
|
|||||||
|
|
||||||
AddTopic "OpenMW Unit Test"
|
AddTopic "OpenMW Unit Test"
|
||||||
|
|
||||||
|
End)mwscript";
|
||||||
|
|
||||||
|
const std::string sScript3 = R"mwscript(Begin math
|
||||||
|
|
||||||
|
short a
|
||||||
|
short b
|
||||||
|
short c
|
||||||
|
short d
|
||||||
|
short e
|
||||||
|
|
||||||
|
set b to ( a + 1 )
|
||||||
|
set c to ( a - 1 )
|
||||||
|
set d to ( b * c )
|
||||||
|
set e to ( d / a )
|
||||||
|
|
||||||
End)mwscript";
|
End)mwscript";
|
||||||
|
|
||||||
TEST_F(MWScriptTest, mwscript_test_invalid)
|
TEST_F(MWScriptTest, mwscript_test_invalid)
|
||||||
@ -139,4 +154,49 @@ End)mwscript";
|
|||||||
FAIL();
|
FAIL();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(MWScriptTest, mwscript_test_math)
|
||||||
|
{
|
||||||
|
if(auto script = compile(sScript3))
|
||||||
|
{
|
||||||
|
struct Algorithm
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
int d;
|
||||||
|
int e;
|
||||||
|
|
||||||
|
void run(int input)
|
||||||
|
{
|
||||||
|
a = input;
|
||||||
|
b = a + 1;
|
||||||
|
c = a - 1;
|
||||||
|
d = b * c;
|
||||||
|
e = d / a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test(const TestInterpreterContext& context) const
|
||||||
|
{
|
||||||
|
EXPECT_EQ(a, context.getLocalShort(0));
|
||||||
|
EXPECT_EQ(b, context.getLocalShort(1));
|
||||||
|
EXPECT_EQ(c, context.getLocalShort(2));
|
||||||
|
EXPECT_EQ(d, context.getLocalShort(3));
|
||||||
|
EXPECT_EQ(e, context.getLocalShort(4));
|
||||||
|
}
|
||||||
|
} algorithm;
|
||||||
|
TestInterpreterContext context;
|
||||||
|
for(int i = 1; i < 1000; ++i)
|
||||||
|
{
|
||||||
|
context.setLocalShort(0, i);
|
||||||
|
run(*script, context);
|
||||||
|
algorithm.run(i);
|
||||||
|
algorithm.test(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FAIL();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -64,7 +64,7 @@ namespace
|
|||||||
std::vector<float> mFloats;
|
std::vector<float> mFloats;
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T getLocal(int index, const std::vector<T>& vector) const
|
T getLocal(std::size_t index, const std::vector<T>& vector) const
|
||||||
{
|
{
|
||||||
if(index < vector.size())
|
if(index < vector.size())
|
||||||
return vector[index];
|
return vector[index];
|
||||||
@ -72,7 +72,7 @@ namespace
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void setLocal(T value, int index, std::vector<T>& vector)
|
void setLocal(T value, std::size_t index, std::vector<T>& vector)
|
||||||
{
|
{
|
||||||
if(index >= vector.size())
|
if(index >= vector.size())
|
||||||
vector.resize(index + 1);
|
vector.resize(index + 1);
|
||||||
@ -86,17 +86,17 @@ namespace
|
|||||||
mFloats.clear();
|
mFloats.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getShort(int index) const { return getLocal(index, mShorts); };
|
int getShort(std::size_t index) const { return getLocal(index, mShorts); };
|
||||||
|
|
||||||
int getLong(int index) const { return getLocal(index, mLongs); };
|
int getLong(std::size_t index) const { return getLocal(index, mLongs); };
|
||||||
|
|
||||||
float getFloat(int index) const { return getLocal(index, mFloats); };
|
float getFloat(std::size_t index) const { return getLocal(index, mFloats); };
|
||||||
|
|
||||||
void setShort(int index, int value) { setLocal(value, index, mShorts); };
|
void setShort(std::size_t index, int value) { setLocal(value, index, mShorts); };
|
||||||
|
|
||||||
void setLong(int index, int value) { setLocal(value, index, mLongs); };
|
void setLong(std::size_t index, int value) { setLocal(value, index, mLongs); };
|
||||||
|
|
||||||
void setFloat(int index, float value) { setLocal(value, index, mFloats); };
|
void setFloat(std::size_t index, float value) { setLocal(value, index, mFloats); };
|
||||||
};
|
};
|
||||||
|
|
||||||
class GlobalVariables
|
class GlobalVariables
|
||||||
|
Loading…
x
Reference in New Issue
Block a user