summaryrefslogtreecommitdiff
path: root/src/unittest/test_utilities.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/unittest/test_utilities.cpp')
-rw-r--r--src/unittest/test_utilities.cpp295
1 files changed, 295 insertions, 0 deletions
diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp
new file mode 100644
index 000000000..df90d37bd
--- /dev/null
+++ b/src/unittest/test_utilities.cpp
@@ -0,0 +1,295 @@
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include "util/numeric.h"
+#include "util/string.h"
+
+class TestUtilities : public TestBase {
+public:
+ TestUtilities() { TestManager::registerTestModule(this); }
+ const char *getName() { return "TestUtilities"; }
+
+ void runTests(IGameDef *gamedef);
+
+ void testAngleWrapAround();
+ void testLowercase();
+ void testTrim();
+ void testIsYes();
+ void testRemoveStringEnd();
+ void testUrlEncode();
+ void testUrlDecode();
+ void testPadString();
+ void testStartsWith();
+ void testStrEqual();
+ void testStringTrim();
+ void testStrToIntConversion();
+ void testStringReplace();
+ void testStringAllowed();
+ void testUTF8();
+ void testWrapRows();
+ void testIsNumber();
+ void testIsPowerOfTwo();
+ void testMyround();
+};
+
+static TestUtilities g_test_instance;
+
+void TestUtilities::runTests(IGameDef *gamedef)
+{
+ TEST(testAngleWrapAround);
+ TEST(testLowercase);
+ TEST(testTrim);
+ TEST(testIsYes);
+ TEST(testRemoveStringEnd);
+ TEST(testUrlEncode);
+ TEST(testUrlDecode);
+ TEST(testPadString);
+ TEST(testStartsWith);
+ TEST(testStrEqual);
+ TEST(testStringTrim);
+ TEST(testStrToIntConversion);
+ TEST(testStringReplace);
+ TEST(testStringAllowed);
+ TEST(testUTF8);
+ TEST(testWrapRows);
+ TEST(testIsNumber);
+ TEST(testIsPowerOfTwo);
+ TEST(testMyround);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+inline float ref_WrapDegrees180(float f)
+{
+ // This is a slower alternative to the wrapDegrees_180() function;
+ // used as a reference for testing
+ float value = fmodf(f + 180, 360);
+ if (value < 0)
+ value += 360;
+ return value - 180;
+}
+
+
+inline float ref_WrapDegrees_0_360(float f)
+{
+ // This is a slower alternative to the wrapDegrees_0_360() function;
+ // used as a reference for testing
+ float value = fmodf(f, 360);
+ if (value < 0)
+ value += 360;
+ return value < 0 ? value + 360 : value;
+}
+
+
+void TestUtilities::testAngleWrapAround()
+{
+ UASSERT(fabs(modulo360f(100.0) - 100.0) < 0.001);
+ UASSERT(fabs(modulo360f(720.5) - 0.5) < 0.001);
+ UASSERT(fabs(modulo360f(-0.5) - (-0.5)) < 0.001);
+ UASSERT(fabs(modulo360f(-365.5) - (-5.5)) < 0.001);
+
+ for (float f = -720; f <= -360; f += 0.25) {
+ UASSERT(fabs(modulo360f(f) - modulo360f(f + 360)) < 0.001);
+ }
+
+ for (float f = -1440; f <= 1440; f += 0.25) {
+ UASSERT(fabs(modulo360f(f) - fmodf(f, 360)) < 0.001);
+ UASSERT(fabs(wrapDegrees_180(f) - ref_WrapDegrees180(f)) < 0.001);
+ UASSERT(fabs(wrapDegrees_0_360(f) - ref_WrapDegrees_0_360(f)) < 0.001);
+ UASSERT(wrapDegrees_0_360(fabs(wrapDegrees_180(f) - wrapDegrees_0_360(f))) < 0.001);
+ }
+}
+
+
+void TestUtilities::testLowercase()
+{
+ UASSERT(lowercase("Foo bAR") == "foo bar");
+}
+
+
+void TestUtilities::testTrim()
+{
+ UASSERT(trim("") == "");
+ UASSERT(trim("dirt_with_grass") == "dirt_with_grass");
+ UASSERT(trim("\n \t\r Foo bAR \r\n\t\t ") == "Foo bAR");
+ UASSERT(trim("\n \t\r \r\n\t\t ") == "");
+}
+
+
+void TestUtilities::testIsYes()
+{
+ UASSERT(is_yes("YeS") == true);
+ UASSERT(is_yes("") == false);
+ UASSERT(is_yes("FAlse") == false);
+ UASSERT(is_yes("-1") == true);
+ UASSERT(is_yes("0") == false);
+ UASSERT(is_yes("1") == true);
+ UASSERT(is_yes("2") == true);
+}
+
+
+void TestUtilities::testRemoveStringEnd()
+{
+ const char *ends[] = {"abc", "c", "bc", "", NULL};
+ UASSERT(removeStringEnd("abc", ends) == "");
+ UASSERT(removeStringEnd("bc", ends) == "b");
+ UASSERT(removeStringEnd("12c", ends) == "12");
+ UASSERT(removeStringEnd("foo", ends) == "");
+}
+
+
+void TestUtilities::testUrlEncode()
+{
+ UASSERT(urlencode("\"Aardvarks lurk, OK?\"")
+ == "%22Aardvarks%20lurk%2C%20OK%3F%22");
+}
+
+
+void TestUtilities::testUrlDecode()
+{
+ UASSERT(urldecode("%22Aardvarks%20lurk%2C%20OK%3F%22")
+ == "\"Aardvarks lurk, OK?\"");
+}
+
+
+void TestUtilities::testPadString()
+{
+ UASSERT(padStringRight("hello", 8) == "hello ");
+}
+
+void TestUtilities::testStartsWith()
+{
+ UASSERT(str_starts_with(std::string(), std::string()) == true);
+ UASSERT(str_starts_with(std::string("the sharp pickaxe"),
+ std::string()) == true);
+ UASSERT(str_starts_with(std::string("the sharp pickaxe"),
+ std::string("the")) == true);
+ UASSERT(str_starts_with(std::string("the sharp pickaxe"),
+ std::string("The")) == false);
+ UASSERT(str_starts_with(std::string("the sharp pickaxe"),
+ std::string("The"), true) == true);
+ UASSERT(str_starts_with(std::string("T"), std::string("The")) == false);
+}
+
+void TestUtilities::testStrEqual()
+{
+ UASSERT(str_equal(narrow_to_wide("abc"), narrow_to_wide("abc")));
+ UASSERT(str_equal(narrow_to_wide("ABC"), narrow_to_wide("abc"), true));
+}
+
+
+void TestUtilities::testStringTrim()
+{
+ UASSERT(trim(" a") == "a");
+ UASSERT(trim(" a ") == "a");
+ UASSERT(trim("a ") == "a");
+ UASSERT(trim("") == "");
+}
+
+
+void TestUtilities::testStrToIntConversion()
+{
+ UASSERT(mystoi("123", 0, 1000) == 123);
+ UASSERT(mystoi("123", 0, 10) == 10);
+}
+
+
+void TestUtilities::testStringReplace()
+{
+ std::string test_str;
+ test_str = "Hello there";
+ str_replace(test_str, "there", "world");
+ UASSERT(test_str == "Hello world");
+ test_str = "ThisAisAaAtest";
+ str_replace(test_str, 'A', ' ');
+ UASSERT(test_str == "This is a test");
+}
+
+
+void TestUtilities::testStringAllowed()
+{
+ UASSERT(string_allowed("hello", "abcdefghijklmno") == true);
+ UASSERT(string_allowed("123", "abcdefghijklmno") == false);
+ UASSERT(string_allowed_blacklist("hello", "123") == true);
+ UASSERT(string_allowed_blacklist("hello123", "123") == false);
+}
+
+void TestUtilities::testUTF8()
+{
+ UASSERT(wide_to_utf8(utf8_to_wide("")) == "");
+ UASSERT(wide_to_utf8(utf8_to_wide("the shovel dug a crumbly node!"))
+ == "the shovel dug a crumbly node!");
+}
+
+void TestUtilities::testWrapRows()
+{
+ UASSERT(wrap_rows("12345678",4) == "1234\n5678");
+ // test that wrap_rows doesn't wrap inside multibyte sequences
+ {
+ const unsigned char s[] = {
+ 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x72, 0x61, 0x70, 0x74, 0x6f,
+ 0x72, 0x2f, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0x2f,
+ 0x6d, 0x69, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x62, 0x69,
+ 0x6e, 0x2f, 0x2e, 0x2e, 0};
+ std::string str((char *)s);
+ UASSERT(utf8_to_wide(wrap_rows(str, 20)) != L"<invalid UTF-8 string>");
+ };
+ {
+ const unsigned char s[] = {
+ 0x74, 0x65, 0x73, 0x74, 0x20, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x81,
+ 0xd1, 0x82, 0x20, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82,
+ 0x20, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0};
+ std::string str((char *)s);
+ UASSERT(utf8_to_wide(wrap_rows(str, 8)) != L"<invalid UTF-8 string>");
+ }
+}
+
+
+void TestUtilities::testIsNumber()
+{
+ UASSERT(is_number("123") == true);
+ UASSERT(is_number("") == false);
+ UASSERT(is_number("123a") == false);
+}
+
+
+void TestUtilities::testIsPowerOfTwo()
+{
+ UASSERT(is_power_of_two(0) == false);
+ UASSERT(is_power_of_two(1) == true);
+ UASSERT(is_power_of_two(2) == true);
+ UASSERT(is_power_of_two(3) == false);
+ for (int exponent = 2; exponent <= 31; ++exponent) {
+ UASSERT(is_power_of_two((1 << exponent) - 1) == false);
+ UASSERT(is_power_of_two((1 << exponent)) == true);
+ UASSERT(is_power_of_two((1 << exponent) + 1) == false);
+ }
+ UASSERT(is_power_of_two((u32)-1) == false);
+}
+
+void TestUtilities::testMyround()
+{
+ UASSERT(myround(4.6f) == 5);
+ UASSERT(myround(1.2f) == 1);
+ UASSERT(myround(-3.1f) == -3);
+ UASSERT(myround(-6.5f) == -7);
+}
+