blob: 78231d890ad4a81329848b47c1483cedb5006268 [file] [log] [blame]
Frank Tang3e05d9d2021-11-08 14:04:04 -08001/***********************************************************************
2 * © 2016 and later: Unicode, Inc. and others.
3 * License & terms of use: http://www.unicode.org/copyright.html
4 ***********************************************************************
5 ***********************************************************************
6 * COPYRIGHT:
7 * Copyright (C) 2002-2016 IBM, Inc. All Rights Reserved.
8 *
9 ***********************************************************************/
10/*****************************************************************************
11* File charperf.cpp
12*
13* Modification History:
14* Name Description
15* Syn Wee Quek First Version
16******************************************************************************
17*/
18
19/**
20 * This program tests character properties performance.
21 * APIs tested:
22 * ICU4C
23 * Windows
24 */
25
26#include "charperf.h"
27#include "cmemory.h"
28#include "uoptions.h"
29
30UOption options[] = {
31 UOPTION_DEF("min", 'n', UOPT_REQUIRES_ARG),
32 UOPTION_DEF("min", 'x', UOPT_REQUIRES_ARG),
33};
34int MIN_OPTION_ = 0;
35int MAX_OPTION_ = 1;
36
37int main(int argc, const char *argv[])
38{
39 UErrorCode status = U_ZERO_ERROR;
40 CharPerformanceTest test(argc, argv, status);
41 if (U_FAILURE(status)){
42 return status;
43 }
Frank Tang1f164ee2022-11-08 12:31:27 -080044 if (test.run() == false){
Frank Tang3e05d9d2021-11-08 14:04:04 -080045 fprintf(stderr, "FAILED: Tests could not be run please check the "
46 "arguments.\n");
47 return -1;
48 }
49 return 0;
50}
51
52CharPerformanceTest::CharPerformanceTest(int32_t argc, const char *argv[],
53 UErrorCode &status)
54 : UPerfTest(argc, argv, status)
55{
56 if (status== U_ILLEGAL_ARGUMENT_ERROR){
57 fprintf(stderr,gUsageString, "charperf");
58 return;
59 }
60 if (U_FAILURE(status)){
61 fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n",
62 u_errorName(status));
63 return;
64 }
65
66 if (_remainingArgc < 0) {
67 // that means there are some -names not matched in the super class
68 // first tag is always skipped in u_parseArgs
69 int size = - _remainingArgc;
70 argv += argc - size;
71 argc = size;
72 _remainingArgc = u_parseArgs(argc, (char**)argv,
73 UPRV_LENGTHOF(options), options);
74 }
75 MIN_ = 0;
76 if (sizeof(wchar_t) > 2) {
77 // for stdlibs like glibc that supports 32 bits wchar
78 // we test for the whole unicode character set by default
79 MAX_ = 0x10ffff;
80 }
81 else {
82 MAX_ = 0xffff;
83 }
Frank Tang3e05d9d2021-11-08 14:04:04 -080084 if (options[MIN_OPTION_].doesOccur) {
85 MIN_ = atoi(options[MIN_OPTION_].value);
86 }
87 if (options[MAX_OPTION_].doesOccur) {
88 MAX_ = atoi(options[MAX_OPTION_].value);
89 }
90}
91
92CharPerformanceTest::~CharPerformanceTest()
93{
94}
95
96UPerfFunction* CharPerformanceTest::runIndexedTest(int32_t index, UBool exec,
97 const char *&name,
98 char* par)
99{
100 switch (index) {
101 TESTCASE(0, TestIsAlpha);
102 TESTCASE(1, TestIsUpper);
103 TESTCASE(2, TestIsLower);
104 TESTCASE(3, TestIsDigit);
105 TESTCASE(4, TestIsSpace);
106 TESTCASE(5, TestIsAlphaNumeric);
107 TESTCASE(6, TestIsPrint);
108 TESTCASE(7, TestIsControl);
109 TESTCASE(8, TestToLower);
110 TESTCASE(9, TestToUpper);
111 TESTCASE(10, TestIsWhiteSpace);
112 TESTCASE(11, TestStdLibIsAlpha);
113 TESTCASE(12, TestStdLibIsUpper);
114 TESTCASE(13, TestStdLibIsLower);
115 TESTCASE(14, TestStdLibIsDigit);
116 TESTCASE(15, TestStdLibIsSpace);
117 TESTCASE(16, TestStdLibIsAlphaNumeric);
118 TESTCASE(17, TestStdLibIsPrint);
119 TESTCASE(18, TestStdLibIsControl);
120 TESTCASE(19, TestStdLibToLower);
121 TESTCASE(20, TestStdLibToUpper);
122 TESTCASE(21, TestStdLibIsWhiteSpace);
123 default:
124 name = "";
125 return NULL;
126 }
127 return NULL;
128}
129
130UPerfFunction* CharPerformanceTest::TestIsAlpha()
131{
132 return new CharPerfFunction(isAlpha, MIN_, MAX_);
133}
134
135UPerfFunction* CharPerformanceTest::TestIsUpper()
136{
137 return new CharPerfFunction(isUpper, MIN_, MAX_);
138}
139
140UPerfFunction* CharPerformanceTest::TestIsLower()
141{
142 return new CharPerfFunction(isLower, MIN_, MAX_);
143}
144
145UPerfFunction* CharPerformanceTest::TestIsDigit()
146{
147 return new CharPerfFunction(isDigit, MIN_, MAX_);
148}
149
150UPerfFunction* CharPerformanceTest::TestIsSpace()
151{
152 return new CharPerfFunction(isSpace, MIN_, MAX_);
153}
154
155UPerfFunction* CharPerformanceTest::TestIsAlphaNumeric()
156{
157 return new CharPerfFunction(isAlphaNumeric, MIN_, MAX_);
158}
159
160/**
161* This test may be different since c lib has a type PUNCT and it is printable.
162* iswgraph is not used for testing since it is a subset of iswprint with the
163* exception of returning true for white spaces. no match found in icu4c.
164*/
165UPerfFunction* CharPerformanceTest::TestIsPrint()
166{
167 return new CharPerfFunction(isPrint, MIN_, MAX_);
168}
169
170UPerfFunction* CharPerformanceTest::TestIsControl()
171{
172 return new CharPerfFunction(isControl, MIN_, MAX_);
173}
174
175UPerfFunction* CharPerformanceTest::TestToLower()
176{
177 return new CharPerfFunction(toLower, MIN_, MAX_);
178}
179
180UPerfFunction* CharPerformanceTest::TestToUpper()
181{
182 return new CharPerfFunction(toUpper, MIN_, MAX_);
183}
184
185UPerfFunction* CharPerformanceTest::TestIsWhiteSpace()
186{
187 return new CharPerfFunction(isWhiteSpace, MIN_, MAX_);
188}
189
190UPerfFunction* CharPerformanceTest::TestStdLibIsAlpha()
191{
192 return new StdLibCharPerfFunction(StdLibIsAlpha, (wchar_t)MIN_,
193 (wchar_t)MAX_);
194}
195
196UPerfFunction* CharPerformanceTest::TestStdLibIsUpper()
197{
198 return new StdLibCharPerfFunction(StdLibIsUpper, (wchar_t)MIN_,
199 (wchar_t)MAX_);
200}
201
202UPerfFunction* CharPerformanceTest::TestStdLibIsLower()
203{
204 return new StdLibCharPerfFunction(StdLibIsLower, (wchar_t)MIN_,
205 (wchar_t)MAX_);
206}
207
208UPerfFunction* CharPerformanceTest::TestStdLibIsDigit()
209{
210 return new StdLibCharPerfFunction(StdLibIsDigit, (wchar_t)MIN_,
211 (wchar_t)MAX_);
212}
213
214UPerfFunction* CharPerformanceTest::TestStdLibIsSpace()
215{
216 return new StdLibCharPerfFunction(StdLibIsSpace, (wchar_t)MIN_,
217 (wchar_t)MAX_);
218}
219
220UPerfFunction* CharPerformanceTest::TestStdLibIsAlphaNumeric()
221{
222 return new StdLibCharPerfFunction(StdLibIsAlphaNumeric, (wchar_t)MIN_,
223 (wchar_t)MAX_);
224}
225
226/**
227* This test may be different since c lib has a type PUNCT and it is printable.
228* iswgraph is not used for testing since it is a subset of iswprint with the
229* exception of returning true for white spaces. no match found in icu4c.
230*/
231UPerfFunction* CharPerformanceTest::TestStdLibIsPrint()
232{
233 return new StdLibCharPerfFunction(StdLibIsPrint, (wchar_t)MIN_,
234 (wchar_t)MAX_);
235}
236
237UPerfFunction* CharPerformanceTest::TestStdLibIsControl()
238{
239 return new StdLibCharPerfFunction(StdLibIsControl, (wchar_t)MIN_,
240 (wchar_t)MAX_);
241}
242
243UPerfFunction* CharPerformanceTest::TestStdLibToLower()
244{
245 return new StdLibCharPerfFunction(StdLibToLower, (wchar_t)MIN_,
246 (wchar_t)MAX_);
247}
248
249UPerfFunction* CharPerformanceTest::TestStdLibToUpper()
250{
251 return new StdLibCharPerfFunction(StdLibToUpper, (wchar_t)MIN_,
252 (wchar_t)MAX_);
253}
254
255UPerfFunction* CharPerformanceTest::TestStdLibIsWhiteSpace()
256{
257 return new StdLibCharPerfFunction(StdLibIsWhiteSpace, (wchar_t)MIN_,
258 (wchar_t)MAX_);
259}