refcountedstring/test.cpp

203 lines
4.4 KiB
C++
Raw Normal View History

2016-10-23 01:46:48 +00:00
#include <iostream>
#include <sstream>
#include <type_traits>
#include <stdexcept>
#include <tuple>
2016-10-23 01:46:48 +00:00
#include "String.h"
#include <gtest/gtest.h>
TEST(StringTest, defaultConstructible)
{
EXPECT_TRUE(std::is_default_constructible<String>::value);
2016-10-23 01:46:48 +00:00
}
TEST(StringTest, constcharConstructible)
{
// is_constructible with multiple template params cannot be passed to macro,
// TODO: should open an issue at GTest's GitHub
auto value = std::is_constructible<String, const char*>::value;
EXPECT_TRUE(value);
2016-10-23 01:46:48 +00:00
}
TEST(StringTest, copyConstructible)
{
EXPECT_TRUE(std::is_copy_constructible<String>::value);
2016-10-23 01:46:48 +00:00
}
TEST(StringTest, copyAssignable)
{
EXPECT_TRUE(std::is_copy_assignable<String>::value);
2016-10-23 01:46:48 +00:00
}
TEST(StringTest, moveConstructible)
{
EXPECT_TRUE(std::is_move_constructible<String>::value);
2016-10-23 01:46:48 +00:00
}
TEST(StringTest, moveAssignable)
{
EXPECT_TRUE(std::is_move_assignable<String>::value);
}
TEST(StringTest, cStrMethodWorks)
{
String str("sajtos cica");
EXPECT_STREQ("sajtos cica", str.c_str());
}
TEST(StringTest, uninitializedStringcStrThrows)
{
String str;
EXPECT_THROW(str.c_str(), std::runtime_error);
2016-10-23 01:46:48 +00:00
}
using str3 = std::tuple<const char*, const char*, const char*>;
class addStringTest : public ::testing::TestWithParam<str3>
{};
TEST_P(addStringTest, addable)
2016-10-23 01:46:48 +00:00
{
String str1(std::get<0>(GetParam()));
String str2(std::get<1>(GetParam()));
2016-10-23 01:46:48 +00:00
EXPECT_STREQ(std::get<2>(GetParam()), (str1+str2).c_str());
2016-10-23 01:46:48 +00:00
}
TEST_P(addStringTest, plusEqualsable)
2016-10-23 01:46:48 +00:00
{
String str1(std::get<0>(GetParam()));
String str2(std::get<1>(GetParam()));
2016-10-23 01:46:48 +00:00
str1 += str2;
EXPECT_STREQ(std::get<2>(GetParam()), str1.c_str());
2016-10-23 01:46:48 +00:00
}
static const std::vector<str3> testvalues1 =
{
std::make_tuple("cica", "sajt", "cicasajt"),
std::make_tuple("sajtos", " cica", "sajtos cica"),
std::make_tuple("szeretem", " a sajtot", "szeretem a sajtot"),
std::make_tuple("meg ", "a cicákat", "meg a cicákat"),
std::make_tuple("ennyi már ", "elég lesz", "ennyi már elég lesz")
};
INSTANTIATE_TEST_CASE_P(testGroup1, addStringTest, ::testing::ValuesIn(testvalues1));
using strcharstr = std::tuple<const char*, char, const char*>;
class addCharStringTest : public ::testing::TestWithParam<strcharstr>
{};
TEST_P(addCharStringTest, addCharable)
2016-10-23 01:46:48 +00:00
{
String str(std::get<0>(GetParam()));
2016-10-23 01:46:48 +00:00
EXPECT_STREQ(std::get<2>(GetParam()), (str+std::get<1>(GetParam())).c_str());
2016-10-23 01:46:48 +00:00
}
TEST_P(addCharStringTest, plusEqualsCharable)
2016-10-23 01:46:48 +00:00
{
String str(std::get<0>(GetParam()));
str+=std::get<1>(GetParam());
2016-10-23 01:46:48 +00:00
EXPECT_STREQ(std::get<2>(GetParam()), str.c_str());
2016-10-23 01:46:48 +00:00
}
static const std::vector<strcharstr> testvalues2 =
{
std::make_tuple("cicá", 'k', "cicák"),
std::make_tuple("sajto", 'k', "sajtok"),
std::make_tuple("C++1", '1', "C++11"),
std::make_tuple("", 'r', "sör"),
std::make_tuple("te", 'j', "tej")
};
INSTANTIATE_TEST_CASE_P(testGroup1, addCharStringTest, ::testing::ValuesIn(testvalues2));
TEST(StringTest, comparable)
{
String str1("cica");
String str2("cica");
EXPECT_EQ(str1, str2);
}
TEST(StringTest, uninitializedStringCompareThrows)
{
String str1;
String str2;
EXPECT_THROW(str1 == str2, std::runtime_error);
}
2016-10-23 01:46:48 +00:00
TEST(StringTest, indexOperatorWorks)
{
String str("cica");
char i = 'i';
EXPECT_EQ(i, str[1]);
}
TEST(StringTest, indexoperatorBoundCheckWorks)
{
String str("sajt");
EXPECT_THROW(str[4], std::out_of_range);
}
TEST(StringTest, uninitializedStringIndexingThrows)
{
String str;
EXPECT_THROW(str[0], std::runtime_error);
}
TEST(StringTest, copyOnWriteWorks)
{
String str1("cica");
String str2 = str1;
str2[0] = ' ';
EXPECT_STRNE(str1.c_str(), str2.c_str());
}
2016-10-23 01:46:48 +00:00
TEST(StringTest, resourceSharingWorks)
{
String str1("sajt");
String str2 = String("sajt");
EXPECT_EQ(str1.c_str(), str2.c_str());
}
struct StreamStringTest : public ::testing::Test
{
std::stringstream _stream;
};
TEST_F(StreamStringTest, ostreamOperatorWorks)
{
String str("cica");
_stream << str;
EXPECT_STREQ("cica", _stream.str().c_str());
}
TEST_F(StreamStringTest, istreamOperatorWorks)
{
String str;
_stream << "sajt";
_stream >> str;
EXPECT_STREQ("sajt", str.c_str());
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}