xref: /haiku/src/tests/kits/support/bstring/StringAppendTest.cpp (revision fbc30e914542cb3a452b01a0714b4e2dff2561a7)
1 #include "StringAppendTest.h"
2 #include "cppunit/TestCaller.h"
3 #include <String.h>
4 
5 
StringAppendTest(std::string name)6 StringAppendTest::StringAppendTest(std::string name)
7 		: BTestCase(name)
8 {
9 }
10 
11 
~StringAppendTest()12 StringAppendTest::~StringAppendTest()
13 {
14 }
15 
16 
17 void
PerformTest(void)18 StringAppendTest::PerformTest(void)
19 {
20 	BString *str1, *str2;
21 
22 	// +=(BString&)
23 	NextSubTest();
24 	str1 = new BString("BASE");
25 	str2 = new BString("APPENDED");
26 	*str1 += *str2;
27 	CPPUNIT_ASSERT(strcmp(str1->String(), "BASEAPPENDED") == 0);
28 	delete str1;
29 	delete str2;
30 
31 	// +=(const char *)
32 	NextSubTest();
33 	str1 = new BString("Base");
34 	*str1 += "APPENDED";
35 	CPPUNIT_ASSERT(strcmp(str1->String(), "BaseAPPENDED") == 0);
36 	delete str1;
37 
38 	NextSubTest();
39 	str1 = new BString;
40 	*str1 += "APPENDEDTONOTHING";
41 	CPPUNIT_ASSERT(strcmp(str1->String(), "APPENDEDTONOTHING") == 0);
42 	delete str1;
43 
44 	// char pointer is NULL
45 	NextSubTest();
46 	char *tmp = NULL;
47 	str1 = new BString("Base");
48 	*str1 += tmp;
49 	CPPUNIT_ASSERT(strcmp(str1->String(), "Base") == 0);
50 	delete str1;
51 
52 	// +=(char)
53 	NextSubTest();
54 	str1 = new BString("Base");
55 	*str1 += 'C';
56 	CPPUNIT_ASSERT(strcmp(str1->String(), "BaseC") == 0);
57 	delete str1;
58 
59 	// Append(BString&)
60 	NextSubTest();
61 	str1 = new BString("BASE");
62 	str2 = new BString("APPENDED");
63 	str1->Append(*str2);
64 	CPPUNIT_ASSERT(strcmp(str1->String(), "BASEAPPENDED") == 0);
65 	delete str1;
66 	delete str2;
67 
68 	// Append(const char*)
69 	NextSubTest();
70 	str1 = new BString("Base");
71 	str1->Append("APPENDED");
72 	CPPUNIT_ASSERT(strcmp(str1->String(), "BaseAPPENDED") == 0);
73 	delete str1;
74 
75 	NextSubTest();
76 	str1 = new BString;
77 	str1->Append("APPENDEDTONOTHING");
78 	CPPUNIT_ASSERT(strcmp(str1->String(), "APPENDEDTONOTHING") == 0);
79 	delete str1;
80 
81 	// char ptr is NULL
82 	NextSubTest();
83 	str1 = new BString("Base");
84 	str1->Append(tmp);
85 	CPPUNIT_ASSERT(strcmp(str1->String(), "Base") == 0);
86 	delete str1;
87 
88 	// Append(BString&, int32)
89 	NextSubTest();
90 	str1 = new BString("BASE");
91 	str2 = new BString("APPENDED");
92 	str1->Append(*str2, 2);
93 	CPPUNIT_ASSERT(strcmp(str1->String(), "BASEAP") == 0);
94 	delete str1;
95 	delete str2;
96 
97 	// Append(const char*, int32)
98 	NextSubTest();
99 	str1 = new BString("Base");
100 	str1->Append("APPENDED", 40);
101 	CPPUNIT_ASSERT(strcmp(str1->String(), "BaseAPPENDED") == 0);
102 	CPPUNIT_ASSERT(str1->Length() == (int32)strlen("BaseAPPENDED"));
103 	delete str1;
104 
105 	// char ptr is NULL
106 	NextSubTest();
107 	str1 = new BString("BLABLA");
108 	str1->Append(tmp, 2);
109 	CPPUNIT_ASSERT(strcmp(str1->String(), "BLABLA") == 0);
110 	delete str1;
111 
112 	// Append(char, int32)
113 	NextSubTest();
114 	str1 = new BString("Base");
115 	str1->Append('C', 5);
116 	CPPUNIT_ASSERT(strcmp(str1->String(), "BaseCCCCC") == 0);
117 	delete str1;
118 
119 	// TODO: The following test cases only work with hoard2, which will not
120 	// allow allocations via malloc() larger than the largest size-class
121 	// (see threadHeap::malloc(size_t). Other malloc implementations like
122 	// rpmalloc will allow arbitrarily large allocations via create_area().
123 	//
124 	// This test should be made more robust by breaking the dependency on
125 	// the allocator to simulate failures in another way. This may require
126 	// a tricky build configuration to avoid breaking the ABI of BString.
127 #ifndef TEST_R5
128 	const int32 OUT_OF_MEM_VAL = 2 * 1000 * 1000 * 1000;
129 	// Append(char, int32) with excessive length:
130 	NextSubTest();
131 	str1 = new BString("Base");
132 	str1->Append('C', OUT_OF_MEM_VAL);
133 	CPPUNIT_ASSERT(strcmp(str1->String(), "Base") == 0);
134 	delete str1;
135 #endif
136 
137 #ifndef TEST_R5
138 	// Append(char*, int32) with excessive length:
139 	NextSubTest();
140 	str1 = new BString("Base");
141 	str1->Append("some more text", OUT_OF_MEM_VAL);
142 	CPPUNIT_ASSERT(strcmp(str1->String(), "Basesome more text") == 0);
143 	delete str1;
144 #endif
145 }
146 
147 
suite(void)148 CppUnit::Test *StringAppendTest::suite(void)
149 {
150 	typedef CppUnit::TestCaller<StringAppendTest>
151 		StringAppendTestCaller;
152 
153 	return(new StringAppendTestCaller("BString::Append Test",
154 		&StringAppendTest::PerformTest));
155 }
156