1c1dac77fSApple OSS Distributions /*
2c1dac77fSApple OSS Distributions * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3c1dac77fSApple OSS Distributions *
4e13b1fa5SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5c1dac77fSApple OSS Distributions *
6e13b1fa5SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7e13b1fa5SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8e13b1fa5SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9e13b1fa5SApple OSS Distributions * compliance with the License. The rights granted to you under the License
10e13b1fa5SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11e13b1fa5SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12e13b1fa5SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13e13b1fa5SApple OSS Distributions * terms of an Apple operating system software license agreement.
14c1dac77fSApple OSS Distributions *
15e13b1fa5SApple OSS Distributions * Please obtain a copy of the License at
16e13b1fa5SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17e13b1fa5SApple OSS Distributions *
18e13b1fa5SApple OSS Distributions * The Original Code and all software distributed under the License are
19e13b1fa5SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20c1dac77fSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21c1dac77fSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22e13b1fa5SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23e13b1fa5SApple OSS Distributions * Please see the License for the specific language governing rights and
24e13b1fa5SApple OSS Distributions * limitations under the License.
25c1dac77fSApple OSS Distributions *
26e13b1fa5SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27c1dac77fSApple OSS Distributions */
28c1dac77fSApple OSS Distributions #if DEBUG
29c1dac77fSApple OSS Distributions #include "Tests.h"
30c1dac77fSApple OSS Distributions
31c1dac77fSApple OSS Distributions #include <libkern/c++/OSData.h>
32c1dac77fSApple OSS Distributions #include <libkern/c++/OSString.h>
33c1dac77fSApple OSS Distributions #include <libkern/c++/OSSymbol.h>
34c1dac77fSApple OSS Distributions
35c1dac77fSApple OSS Distributions static const char testC00[] = "The quick brown fox jumps over the lazy dog. ";
36c1dac77fSApple OSS Distributions static const char testC01[] = "The quick brown fox ";
37c1dac77fSApple OSS Distributions static const char testC02[] = "jumps over the ";
38c1dac77fSApple OSS Distributions static const char testC03[] = "lazy dog. \n";
39c1dac77fSApple OSS Distributions static const char testC04[] = "The ";
40c1dac77fSApple OSS Distributions static const char testC05[] = "quick ";
41c1dac77fSApple OSS Distributions static const char testC06[] = "brown ";
42c1dac77fSApple OSS Distributions static const char testC07[] = "fox ";
43c1dac77fSApple OSS Distributions static const char testC08[] = "jumps ";
44c1dac77fSApple OSS Distributions static const char testC09[] = "over ";
45c1dac77fSApple OSS Distributions static const char testC10[] = "the ";
46c1dac77fSApple OSS Distributions static const char testC11[] = "lazy ";
47c1dac77fSApple OSS Distributions static const char testC12[] = "dog. \n";
48c1dac77fSApple OSS Distributions static const char testC13[] = "Now is the time for all good "
49c1dac77fSApple OSS Distributions "men to come to the aid of the party \n";
50c1dac77fSApple OSS Distributions static const char testC14[] = "Now is the time for ";
51c1dac77fSApple OSS Distributions static const char testC15[] = "all good men to come ";
52c1dac77fSApple OSS Distributions static const char testC16[] = "to the aid of the party \n";
53c1dac77fSApple OSS Distributions static const char testC17[] = "Now ";
54c1dac77fSApple OSS Distributions static const char testC18[] = "is ";
55c1dac77fSApple OSS Distributions static const char testC19[] = "the ";
56c1dac77fSApple OSS Distributions static const char testC20[] = "time ";
57c1dac77fSApple OSS Distributions static const char testC21[] = "for ";
58c1dac77fSApple OSS Distributions static const char testC22[] = "all ";
59c1dac77fSApple OSS Distributions static const char testC23[] = "good ";
60c1dac77fSApple OSS Distributions static const char testC24[] = "men ";
61c1dac77fSApple OSS Distributions static const char testC25[] = "to ";
62c1dac77fSApple OSS Distributions static const char testC26[] = "come ";
63c1dac77fSApple OSS Distributions static const char testC27[] = "to ";
64c1dac77fSApple OSS Distributions static const char testC28[] = "the ";
65c1dac77fSApple OSS Distributions static const char testC29[] = "aid ";
66c1dac77fSApple OSS Distributions static const char testC30[] = "of ";
67c1dac77fSApple OSS Distributions static const char testC31[] = "the ";
68c1dac77fSApple OSS Distributions static const char testC32[] = "party. \n";
69c1dac77fSApple OSS Distributions static const char testC33[] = "Frank Burns eats worms. \n";
70c1dac77fSApple OSS Distributions static const char testC34[] = "Frank Burns ";
71c1dac77fSApple OSS Distributions static const char testC35[] = "eats worms. \n";
72c1dac77fSApple OSS Distributions static const char testC36[] = "Frank ";
73c1dac77fSApple OSS Distributions static const char testC37[] = "Burns ";
74c1dac77fSApple OSS Distributions static const char testC38[] = "eats ";
75c1dac77fSApple OSS Distributions static const char testC39[] = "worms. \n";
76c1dac77fSApple OSS Distributions static const char testC40[] = "Tired eyes? Stiff neck? Tight shoulders? "
77c1dac77fSApple OSS Distributions "Aching back? The right moves can help "
78c1dac77fSApple OSS Distributions "prevent these kinds of problem. ";
79c1dac77fSApple OSS Distributions static const char testC41[] = "Tired eyes? Stiff neck? ";
80c1dac77fSApple OSS Distributions static const char testC42[] = "Tight shoulders? Aching back? ";
81c1dac77fSApple OSS Distributions static const char testC43[] = "The right moves can help prevent ";
82c1dac77fSApple OSS Distributions static const char testC44[] = "these kinds of problem. ";
83c1dac77fSApple OSS Distributions static const char testC45[] = "Tired ";
84c1dac77fSApple OSS Distributions static const char testC46[] = "eyes? ";
85c1dac77fSApple OSS Distributions static const char testC47[] = "Stiff ";
86c1dac77fSApple OSS Distributions static const char testC48[] = "neck? ";
87c1dac77fSApple OSS Distributions static const char testC49[] = "Tight ";
88c1dac77fSApple OSS Distributions static const char testC50[] = "shoulders? ";
89c1dac77fSApple OSS Distributions static const char testC51[] = "Aching ";
90c1dac77fSApple OSS Distributions static const char testC52[] = "back? ";
91c1dac77fSApple OSS Distributions static const char testC53[] = "The ";
92c1dac77fSApple OSS Distributions static const char testC54[] = "right ";
93c1dac77fSApple OSS Distributions static const char testC55[] = "moves ";
94c1dac77fSApple OSS Distributions static const char testC56[] = "can ";
95c1dac77fSApple OSS Distributions static const char testC57[] = "help ";
96c1dac77fSApple OSS Distributions static const char testC58[] = "prevent ";
97c1dac77fSApple OSS Distributions static const char testC59[] = "these ";
98c1dac77fSApple OSS Distributions static const char testC60[] = "kinds ";
99c1dac77fSApple OSS Distributions static const char testC61[] = "of ";
100c1dac77fSApple OSS Distributions static const char testC62[] = "problem. ";
101c1dac77fSApple OSS Distributions
102c1dac77fSApple OSS Distributions const char *strCache[] = {
103c1dac77fSApple OSS Distributions testC00, testC01, testC02, testC03, testC04, testC05, testC06, testC07,
104c1dac77fSApple OSS Distributions testC08, testC09, testC10, testC11, testC12, testC13, testC14, testC15,
105c1dac77fSApple OSS Distributions testC16, testC17, testC18, testC19, testC20, testC21, testC22, testC23,
106c1dac77fSApple OSS Distributions testC24, testC25, testC26, testC27, testC28, testC29, testC30, testC31,
107c1dac77fSApple OSS Distributions testC32, testC33, testC34, testC35, testC36, testC37, testC38, testC39,
108c1dac77fSApple OSS Distributions testC40, testC41, testC42, testC43, testC44, testC45, testC46, testC47,
109c1dac77fSApple OSS Distributions testC48, testC49, testC50, testC51, testC52, testC53, testC54, testC55,
110c1dac77fSApple OSS Distributions testC56, testC57, testC58, testC59, testC60, testC61, testC62,
111c1dac77fSApple OSS Distributions };
112c1dac77fSApple OSS Distributions const int numStrCache = ((int) (sizeof(strCache) / sizeof(strCache[0])));
113c1dac77fSApple OSS Distributions
114*a5e72196SApple OSS Distributions void
testData()115*a5e72196SApple OSS Distributions testData()
116c1dac77fSApple OSS Distributions {
117c1dac77fSApple OSS Distributions #define DATA_SIZE_1 256
118c1dac77fSApple OSS Distributions #define DATA_SIZE_2 512
119c1dac77fSApple OSS Distributions #define DATA_SIZE_3 1024
120c1dac77fSApple OSS Distributions #define DATA_SIZE_4 8192
121c1dac77fSApple OSS Distributions
122c1dac77fSApple OSS Distributions OSData *test1, *test2, *test3;
123c1dac77fSApple OSS Distributions void *spaceCheck;
124c1dac77fSApple OSS Distributions unsigned int len;
125c1dac77fSApple OSS Distributions unsigned int i;
126c1dac77fSApple OSS Distributions bool res = true;
127c1dac77fSApple OSS Distributions unsigned short testData[DATA_SIZE_4 / sizeof(short)], *cp;
128c1dac77fSApple OSS Distributions
129c1dac77fSApple OSS Distributions // very first test initialises the OSMetaClass cache.
130c1dac77fSApple OSS Distributions test1 = OSData::withCapacity(DATA_SIZE_1);
131c1dac77fSApple OSS Distributions TEST_ASSERT('d', "0a", test1);
132*a5e72196SApple OSS Distributions if (test1) {
133c1dac77fSApple OSS Distributions test1->release();
134*a5e72196SApple OSS Distributions }
135c1dac77fSApple OSS Distributions
136*a5e72196SApple OSS Distributions for (i = 0; i < sizeof(testData) / sizeof(short); i++) {
137c1dac77fSApple OSS Distributions testData[i] = (unsigned short) i;
138*a5e72196SApple OSS Distributions }
139c1dac77fSApple OSS Distributions
140c1dac77fSApple OSS Distributions // Check empty data allocation
141c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
142c1dac77fSApple OSS Distributions test1 = OSData::withCapacity(DATA_SIZE_1);
143c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1a", test1);
144c1dac77fSApple OSS Distributions if (test1) {
145c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1b", !test1->getLength());
146c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1c", test1->getCapacity() == DATA_SIZE_1);
147c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1d", !test1->getBytesNoCopy());
148c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1e", !test1->getBytesNoCopy(10, DATA_SIZE_1 - 10));
149c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1f", test1->appendBytes(spaceCheck, 0));
150c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1g", !test1->getLength());
151c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1h", test1->getCapacity() == DATA_SIZE_1);
152c1dac77fSApple OSS Distributions TEST_ASSERT('d', "1i", !test1->getBytesNoCopy());
153c1dac77fSApple OSS Distributions test1->release();
154c1dac77fSApple OSS Distributions }
155c1dac77fSApple OSS Distributions res = res && checkSpace("(d)1", spaceCheck, 0);
156c1dac77fSApple OSS Distributions
157c1dac77fSApple OSS Distributions // Check appending to empty data allocation
158c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
159c1dac77fSApple OSS Distributions test1 = OSData::withCapacity(DATA_SIZE_1);
160c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2a", test1);
161c1dac77fSApple OSS Distributions if (test1) {
162c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2b", !test1->getLength());
163c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2c", !test1->getBytesNoCopy());
164c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2d", test1->appendBytes(testData, DATA_SIZE_1));
165c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2e", test1->getLength() == DATA_SIZE_1);
166c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2f", test1->getBytesNoCopy());
167c1dac77fSApple OSS Distributions cp = (unsigned short *) test1->getBytesNoCopy();
168c1dac77fSApple OSS Distributions for (i = 0; cp && i < (DATA_SIZE_1 / sizeof(short)); i++) {
169c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2g", *cp++ == testData[i]);
170*a5e72196SApple OSS Distributions if (*cp != testData[i]) {
171c1dac77fSApple OSS Distributions break;
172c1dac77fSApple OSS Distributions }
173*a5e72196SApple OSS Distributions }
174c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2h", test1->getBytesNoCopy(10, DATA_SIZE_1 - 10));
175c1dac77fSApple OSS Distributions cp = (unsigned short *) test1->getBytesNoCopy(10, DATA_SIZE_1 - 10);
176c1dac77fSApple OSS Distributions for (i = 5; cp && i < (DATA_SIZE_1 / sizeof(short)) - 5; i++) {
177c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2i", *cp++ == testData[i]);
178*a5e72196SApple OSS Distributions if (*cp != testData[i]) {
179c1dac77fSApple OSS Distributions break;
180c1dac77fSApple OSS Distributions }
181*a5e72196SApple OSS Distributions }
182c1dac77fSApple OSS Distributions TEST_ASSERT('d', "2j", test1->isEqualTo(testData, DATA_SIZE_1));
183c1dac77fSApple OSS Distributions test1->release();
184c1dac77fSApple OSS Distributions }
185c1dac77fSApple OSS Distributions res = res && checkSpace("(d)2", spaceCheck, 0);
186c1dac77fSApple OSS Distributions
187c1dac77fSApple OSS Distributions // Check data allocation from some constant data
188c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
189c1dac77fSApple OSS Distributions test1 = OSData::withBytes(testData, sizeof(testData));
190c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3a", test1);
191c1dac77fSApple OSS Distributions if (test1) {
192c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3b", test1->getLength() == sizeof(testData));
193c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3c", test1->getCapacity() == sizeof(testData));
194c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3d", test1->getBytesNoCopy());
195c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3e", test1->getBytesNoCopy(10, sizeof(testData) - 10));
196c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3f", test1->appendBytes(spaceCheck, 0));
197c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3g", test1->getLength() == sizeof(testData));
198c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3h", test1->getCapacity() == sizeof(testData));
199c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3i", test1->getBytesNoCopy());
200c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3j", test1->getBytesNoCopy(10, sizeof(testData) - 10));
201c1dac77fSApple OSS Distributions TEST_ASSERT('d', "3k", !test1->appendBytes(testData, 10));
202c1dac77fSApple OSS Distributions test1->release();
203c1dac77fSApple OSS Distributions }
204c1dac77fSApple OSS Distributions res = res && checkSpace("(d)3", spaceCheck, 0);
205c1dac77fSApple OSS Distributions
206c1dac77fSApple OSS Distributions // Check and continious addition of more data
207c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
208c1dac77fSApple OSS Distributions test1 = OSData::withCapacity(DATA_SIZE_4);
209c1dac77fSApple OSS Distributions test2 = OSData::withBytesNoCopy(testData, DATA_SIZE_3);
210c1dac77fSApple OSS Distributions len = DATA_SIZE_3;
211c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4a", (test1 && test2));
212c1dac77fSApple OSS Distributions if (test1 && test2) {
213c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4b", !test1->getLength());
214*a5e72196SApple OSS Distributions for (i = 0; i < DATA_SIZE_4; i += DATA_SIZE_3) {
215c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4c", test1->appendBytes(test2));
216*a5e72196SApple OSS Distributions }
217c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4d", !test1->appendBytes(test2));
218c1dac77fSApple OSS Distributions for (i = 0; i < DATA_SIZE_4; i += DATA_SIZE_3) {
219c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4e", test2->isEqualTo(
220c1dac77fSApple OSS Distributions test1->getBytesNoCopy(i, DATA_SIZE_3),
221c1dac77fSApple OSS Distributions DATA_SIZE_3));
222c1dac77fSApple OSS Distributions
223c1dac77fSApple OSS Distributions test3 = OSData::withData(test1, i, DATA_SIZE_3);
224c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4f", test3);
225c1dac77fSApple OSS Distributions if (test3) {
226c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4g", test2->isEqualTo(test3));
227c1dac77fSApple OSS Distributions test3->release();
228c1dac77fSApple OSS Distributions }
229c1dac77fSApple OSS Distributions
230c1dac77fSApple OSS Distributions test3 = OSData::withData(test1, i, len);
231c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4i", test3);
232c1dac77fSApple OSS Distributions if (test3) {
233c1dac77fSApple OSS Distributions TEST_ASSERT('d', "4j", test2->isEqualTo(test3));
234c1dac77fSApple OSS Distributions test3->release();
235c1dac77fSApple OSS Distributions }
236c1dac77fSApple OSS Distributions }
237c1dac77fSApple OSS Distributions test1->release();
238c1dac77fSApple OSS Distributions test2->release();
239c1dac77fSApple OSS Distributions }
240c1dac77fSApple OSS Distributions res = res && checkSpace("(d)3", spaceCheck, 0);
241c1dac77fSApple OSS Distributions
242*a5e72196SApple OSS Distributions if (res) {
243c1dac77fSApple OSS Distributions verPrintf(("testData: All OSData Tests passed\n"));
244*a5e72196SApple OSS Distributions } else {
245c1dac77fSApple OSS Distributions logPrintf(("testData: Some OSData Tests failed\n"));
246*a5e72196SApple OSS Distributions }
247c1dac77fSApple OSS Distributions #undef DATA_SIZE_4
248c1dac77fSApple OSS Distributions #undef DATA_SIZE_3
249c1dac77fSApple OSS Distributions #undef DATA_SIZE_2
250c1dac77fSApple OSS Distributions #undef DATA_SIZE_1
251c1dac77fSApple OSS Distributions }
252c1dac77fSApple OSS Distributions
253*a5e72196SApple OSS Distributions void
testString()254*a5e72196SApple OSS Distributions testString()
255c1dac77fSApple OSS Distributions {
256c1dac77fSApple OSS Distributions OSString *test1, *test2;
257c1dac77fSApple OSS Distributions void *spaceCheck;
258c1dac77fSApple OSS Distributions int i;
259c1dac77fSApple OSS Distributions char c;
260c1dac77fSApple OSS Distributions bool res = true;
261c1dac77fSApple OSS Distributions
262c1dac77fSApple OSS Distributions // very first test initialises the OSMetaClass cache.
263c1dac77fSApple OSS Distributions test1 = OSString::withCStringNoCopy(testC00);
264c1dac77fSApple OSS Distributions TEST_ASSERT('s', "0a", test1);
265*a5e72196SApple OSS Distributions if (test1) {
266c1dac77fSApple OSS Distributions test1->release();
267*a5e72196SApple OSS Distributions }
268c1dac77fSApple OSS Distributions
269c1dac77fSApple OSS Distributions // Check c string allocation
270c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
271c1dac77fSApple OSS Distributions test1 = OSString::withCString(testC00);
272c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1a", test1);
273c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1b", testC00 != test1->getCStringNoCopy());
274c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1c", strcmp(testC00, test1->getCStringNoCopy()) == 0);
275c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1d", strlen(testC00) == test1->getLength());
276c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1e", test1->isEqualTo(testC00));
277c1dac77fSApple OSS Distributions TEST_ASSERT('s', "1f", !test1->isEqualTo(testC01));
278*a5e72196SApple OSS Distributions if (test1) {
279*a5e72196SApple OSS Distributions test1->release();
280*a5e72196SApple OSS Distributions }
281c1dac77fSApple OSS Distributions res = res && checkSpace("(s)1", spaceCheck, 0);
282c1dac77fSApple OSS Distributions
283c1dac77fSApple OSS Distributions // Check c string no allocation
284c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
285c1dac77fSApple OSS Distributions test1 = OSString::withCStringNoCopy(testC00);
286c1dac77fSApple OSS Distributions TEST_ASSERT('s', "2a", test1);
287c1dac77fSApple OSS Distributions TEST_ASSERT('s', "2b", testC00 == test1->getCStringNoCopy());
288*a5e72196SApple OSS Distributions if (test1) {
289*a5e72196SApple OSS Distributions test1->release();
290*a5e72196SApple OSS Distributions }
291c1dac77fSApple OSS Distributions res = res && checkSpace("(s)2", spaceCheck, 0);
292c1dac77fSApple OSS Distributions
293c1dac77fSApple OSS Distributions // Check string from other string generation
294c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
295c1dac77fSApple OSS Distributions test1 = OSString::withCStringNoCopy(testC00);
296c1dac77fSApple OSS Distributions TEST_ASSERT('s', "3a", test1);
297c1dac77fSApple OSS Distributions test2 = OSString::withString(test1);
298c1dac77fSApple OSS Distributions TEST_ASSERT('s', "3b", test2);
299c1dac77fSApple OSS Distributions TEST_ASSERT('s', "3c", test1 != test2);
300c1dac77fSApple OSS Distributions TEST_ASSERT('s', "3d", test1->isEqualTo(test2));
301*a5e72196SApple OSS Distributions if (test1) {
302*a5e72196SApple OSS Distributions test1->release();
303*a5e72196SApple OSS Distributions }
304*a5e72196SApple OSS Distributions if (test2) {
305*a5e72196SApple OSS Distributions test2->release();
306*a5e72196SApple OSS Distributions }
307c1dac77fSApple OSS Distributions res = res && checkSpace("(s)3", spaceCheck, 0);
308c1dac77fSApple OSS Distributions
309c1dac77fSApple OSS Distributions // Check string comparison functionality no copy
310c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
311c1dac77fSApple OSS Distributions test1 = OSString::withCStringNoCopy(testC00);
312c1dac77fSApple OSS Distributions test2 = OSString::withCStringNoCopy(testC01);
313c1dac77fSApple OSS Distributions TEST_ASSERT('s', "4a", test1 && test2);
314c1dac77fSApple OSS Distributions TEST_ASSERT('s', "4b", !test1->isEqualTo(test2));
315c1dac77fSApple OSS Distributions TEST_ASSERT('s', "4c", !test1->isEqualTo(testC01));
316c1dac77fSApple OSS Distributions TEST_ASSERT('s', "4d", test1->isEqualTo(testC00));
317*a5e72196SApple OSS Distributions if (test1) {
318*a5e72196SApple OSS Distributions test1->release();
319*a5e72196SApple OSS Distributions }
320*a5e72196SApple OSS Distributions if (test2) {
321*a5e72196SApple OSS Distributions test2->release();
322*a5e72196SApple OSS Distributions }
323c1dac77fSApple OSS Distributions res = res && checkSpace("(s)4", spaceCheck, 0);
324c1dac77fSApple OSS Distributions
325c1dac77fSApple OSS Distributions // Check string comparison functionality with copy
326c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
327c1dac77fSApple OSS Distributions test1 = OSString::withCString(testC00);
328c1dac77fSApple OSS Distributions test2 = OSString::withCString(testC01);
329c1dac77fSApple OSS Distributions TEST_ASSERT('s', "5a", test1 && test2);
330c1dac77fSApple OSS Distributions TEST_ASSERT('s', "5b", !test1->isEqualTo(test2));
331c1dac77fSApple OSS Distributions TEST_ASSERT('s', "5c", !test1->isEqualTo(testC01));
332c1dac77fSApple OSS Distributions TEST_ASSERT('s', "5d", test1->isEqualTo(testC00));
333*a5e72196SApple OSS Distributions if (test1) {
334*a5e72196SApple OSS Distributions test1->release();
335*a5e72196SApple OSS Distributions }
336*a5e72196SApple OSS Distributions if (test2) {
337*a5e72196SApple OSS Distributions test2->release();
338*a5e72196SApple OSS Distributions }
339c1dac77fSApple OSS Distributions res = res && checkSpace("(s)5", spaceCheck, 0);
340c1dac77fSApple OSS Distributions
341c1dac77fSApple OSS Distributions // Check string inplace modifications
342c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
343c1dac77fSApple OSS Distributions test1 = OSString::withCString(testC00);
344c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6a", test1);
345*a5e72196SApple OSS Distributions for (i = 0; (c = test1->getChar(i)); i++) {
346c1dac77fSApple OSS Distributions if (c != testC00[i]) {
347c1dac77fSApple OSS Distributions verPrintf(("testString(s) test 6b failed\n")); res = false;
348c1dac77fSApple OSS Distributions break;
349c1dac77fSApple OSS Distributions }
350*a5e72196SApple OSS Distributions }
351c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6c", !c);
352c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6d", test1->setChar(' ', 0));
353c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6e", !test1->isEqualTo(testC00));
354c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6f", test1->setChar('T', 0));
355c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6g", !test1->setChar(' ', sizeof(testC00)));
356c1dac77fSApple OSS Distributions TEST_ASSERT('s', "6h", test1->isEqualTo(testC00));
357*a5e72196SApple OSS Distributions if (test1) {
358*a5e72196SApple OSS Distributions test1->release();
359*a5e72196SApple OSS Distributions }
360c1dac77fSApple OSS Distributions res = res && checkSpace("(s)6", spaceCheck, 0);
361c1dac77fSApple OSS Distributions
362c1dac77fSApple OSS Distributions // Check const string fail inplace modifications
363c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
364c1dac77fSApple OSS Distributions test1 = OSString::withCStringNoCopy(testC00);
365c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7a", test1);
366*a5e72196SApple OSS Distributions for (i = 0; (c = test1->getChar(i)); i++) {
367c1dac77fSApple OSS Distributions if (c != testC00[i]) {
368c1dac77fSApple OSS Distributions verPrintf(("testString(s) test 7b failed\n")); res = false;
369c1dac77fSApple OSS Distributions break;
370c1dac77fSApple OSS Distributions }
371*a5e72196SApple OSS Distributions }
372c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7c", !c);
373c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7d", !test1->setChar(' ', 0));
374c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7e", test1->isEqualTo(testC00));
375c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7f", !test1->setChar(' ', sizeof(testC00)));
376c1dac77fSApple OSS Distributions TEST_ASSERT('s', "7g", test1->isEqualTo(testC00));
377*a5e72196SApple OSS Distributions if (test1) {
378*a5e72196SApple OSS Distributions test1->release();
379*a5e72196SApple OSS Distributions }
380c1dac77fSApple OSS Distributions res = res && checkSpace("(s)7", spaceCheck, 0);
381c1dac77fSApple OSS Distributions
382*a5e72196SApple OSS Distributions if (res) {
383c1dac77fSApple OSS Distributions verPrintf(("testString: All OSString Tests passed\n"));
384*a5e72196SApple OSS Distributions } else {
385c1dac77fSApple OSS Distributions logPrintf(("testString: Some OSString Tests failed\n"));
386c1dac77fSApple OSS Distributions }
387*a5e72196SApple OSS Distributions }
388c1dac77fSApple OSS Distributions
389*a5e72196SApple OSS Distributions void
testSymbol()390*a5e72196SApple OSS Distributions testSymbol()
391c1dac77fSApple OSS Distributions {
392c1dac77fSApple OSS Distributions bool res = true;
393c1dac77fSApple OSS Distributions int i, j;
394c1dac77fSApple OSS Distributions int countDups;
395c1dac77fSApple OSS Distributions const OSSymbol *cache[numStrCache];
396c1dac77fSApple OSS Distributions void *spaceCheck;
397c1dac77fSApple OSS Distributions
398c1dac77fSApple OSS Distributions // very first test initialises the OSMetaClass cache.
399c1dac77fSApple OSS Distributions cache[0] = IOSymbol::withCStringNoCopy(testC00);
400c1dac77fSApple OSS Distributions TEST_ASSERT('u', "0a", cache[0]);
401*a5e72196SApple OSS Distributions if (cache[0]) {
402c1dac77fSApple OSS Distributions cache[0]->release();
403*a5e72196SApple OSS Distributions }
404c1dac77fSApple OSS Distributions
405c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
406c1dac77fSApple OSS Distributions
407c1dac77fSApple OSS Distributions // Setup the symbol cache, make sure it grows the symbol unique'ing
408c1dac77fSApple OSS Distributions // hash table. Also determine that the symbol is created ok and that
409c1dac77fSApple OSS Distributions // it is indeed equal to the creating cString by strcmp.
410c1dac77fSApple OSS Distributions for (i = 0; i < numStrCache; i++) {
411c1dac77fSApple OSS Distributions cache[i] = OSSymbol::withCStringNoCopy(strCache[i]);
412c1dac77fSApple OSS Distributions if (!cache[i]) {
413c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 1a%d failed\n", i)); res = false;
414*a5e72196SApple OSS Distributions } else if (!cache[i]->isEqualTo(strCache[i])) {
415c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 1b%d failed\n", i)); res = false;
416c1dac77fSApple OSS Distributions }
417c1dac77fSApple OSS Distributions }
418c1dac77fSApple OSS Distributions
419c1dac77fSApple OSS Distributions // The strCache does have some duplicates in it, mostly 'the'. Make
420c1dac77fSApple OSS Distributions // sure that we wind them and that different cache entries really are
421c1dac77fSApple OSS Distributions // different by strcmp. Fundamental to OSSymbol semantics.
422c1dac77fSApple OSS Distributions countDups = 0;
423*a5e72196SApple OSS Distributions for (i = 0; i < numStrCache; i++) {
424c1dac77fSApple OSS Distributions for (j = i + 1; j < numStrCache; j++) {
425c1dac77fSApple OSS Distributions if (cache[i] != cache[j] && cache[i]->isEqualTo(cache[j])) {
426c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 2a%d,%d failed\n", i, j));
427c1dac77fSApple OSS Distributions res = false;
428*a5e72196SApple OSS Distributions } else if (cache[i] == cache[j]) {
429c1dac77fSApple OSS Distributions if (cache[i]->getRetainCount() == 1) {
430c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 2b%d,%d failed\n", i, j));
431c1dac77fSApple OSS Distributions res = false;
432c1dac77fSApple OSS Distributions }
433c1dac77fSApple OSS Distributions countDups++;
434c1dac77fSApple OSS Distributions }
435c1dac77fSApple OSS Distributions }
436*a5e72196SApple OSS Distributions }
437c1dac77fSApple OSS Distributions TEST_ASSERT('u', "2c", countDups);
438c1dac77fSApple OSS Distributions
439c1dac77fSApple OSS Distributions // Clear out the cache and check that the unique'ing hashtable has grown
440c1dac77fSApple OSS Distributions for (i = 0; i < numStrCache; i++) {
441c1dac77fSApple OSS Distributions if (cache[i]) {
442c1dac77fSApple OSS Distributions cache[i]->release();
443c1dac77fSApple OSS Distributions cache[i] = 0;
444c1dac77fSApple OSS Distributions }
445c1dac77fSApple OSS Distributions }
446c1dac77fSApple OSS Distributions // As of 1998-11-17 the hash growth is 364.
447c1dac77fSApple OSS Distributions res = res && checkSpace("(u)3", spaceCheck, 972);
448c1dac77fSApple OSS Distributions logSpace();
449c1dac77fSApple OSS Distributions
450c1dac77fSApple OSS Distributions // Check for leaks by repeating the cacheing and freeing
451c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
452*a5e72196SApple OSS Distributions for (i = 0; i < numStrCache; i++) {
453c1dac77fSApple OSS Distributions cache[i] = OSSymbol::withCString(strCache[i]);
454*a5e72196SApple OSS Distributions }
455c1dac77fSApple OSS Distributions for (i = 0; i < numStrCache; i++) {
456c1dac77fSApple OSS Distributions if (cache[i]) {
457c1dac77fSApple OSS Distributions cache[i]->release();
458c1dac77fSApple OSS Distributions cache[i] = 0;
459c1dac77fSApple OSS Distributions }
460c1dac77fSApple OSS Distributions }
461c1dac77fSApple OSS Distributions res = res && checkSpace("(u)4", spaceCheck, 0);
462c1dac77fSApple OSS Distributions
463c1dac77fSApple OSS Distributions // Check that the OSString based symbol constructors work
464c1dac77fSApple OSS Distributions // and that they don't leak, and finally double check that while
465c1dac77fSApple OSS Distributions // the cache is active the symbol semantics still work.
466c1dac77fSApple OSS Distributions spaceCheck = checkPointSpace();
467c1dac77fSApple OSS Distributions for (i = 0; i < numStrCache; i++) {
468c1dac77fSApple OSS Distributions OSString *tmpStr;
469c1dac77fSApple OSS Distributions
470c1dac77fSApple OSS Distributions tmpStr = (i & 1)
471c1dac77fSApple OSS Distributions ? OSString::withCString(strCache[i])
472c1dac77fSApple OSS Distributions : OSString::withCStringNoCopy(strCache[i]);
473c1dac77fSApple OSS Distributions if (tmpStr) {
474c1dac77fSApple OSS Distributions cache[i] = OSSymbol::withString(tmpStr);
475c1dac77fSApple OSS Distributions if (!cache[i]) {
476c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 5a%d failed\n", i));
477c1dac77fSApple OSS Distributions res = false;
478c1dac77fSApple OSS Distributions }
479c1dac77fSApple OSS Distributions tmpStr->release();
480c1dac77fSApple OSS Distributions }
481c1dac77fSApple OSS Distributions }
482c1dac77fSApple OSS Distributions
483c1dac77fSApple OSS Distributions for (i = 0; i < numStrCache; i++) {
484c1dac77fSApple OSS Distributions if (cache[i]) {
485c1dac77fSApple OSS Distributions const OSSymbol *tmpSymb;
486c1dac77fSApple OSS Distributions
487c1dac77fSApple OSS Distributions tmpSymb = OSSymbol::withCStringNoCopy(strCache[i]);
488c1dac77fSApple OSS Distributions if (cache[i] != tmpSymb) {
489c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 5b%d failed\n", i));
490c1dac77fSApple OSS Distributions res = false;
491c1dac77fSApple OSS Distributions }
492c1dac77fSApple OSS Distributions tmpSymb->release();
493c1dac77fSApple OSS Distributions cache[i]->release();
494c1dac77fSApple OSS Distributions cache[i] = 0;
495*a5e72196SApple OSS Distributions } else {
496c1dac77fSApple OSS Distributions verPrintf(("testSymbol(u) test 5c%d failed\n", i));
497c1dac77fSApple OSS Distributions res = false;
498c1dac77fSApple OSS Distributions }
499c1dac77fSApple OSS Distributions }
500c1dac77fSApple OSS Distributions res = res && checkSpace("(u)5", spaceCheck, 0);
501c1dac77fSApple OSS Distributions
502*a5e72196SApple OSS Distributions if (res) {
503c1dac77fSApple OSS Distributions verPrintf(("testSymbol: All OSSymbol Tests passed\n"));
504*a5e72196SApple OSS Distributions } else {
505c1dac77fSApple OSS Distributions logPrintf(("testSymbol: Some OSSymbol Tests failed\n"));
506c1dac77fSApple OSS Distributions }
507*a5e72196SApple OSS Distributions }
508c1dac77fSApple OSS Distributions
509c1dac77fSApple OSS Distributions #endif /* DEBUG */
510