Skip to content

Commit 0ab1f9d

Browse files
committed
fix: make test independent from file I/O
1 parent 0f481ed commit 0ab1f9d

File tree

1 file changed

+108
-66
lines changed

1 file changed

+108
-66
lines changed

libc/test/src/__support/str_to_float_comparison_test.cpp

Lines changed: 108 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -56,79 +56,110 @@ static inline uint64_t fastHexToU64(const char *inStr) {
5656
return result;
5757
}
5858

59-
int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
60-
int *detailedBitDiffs, int *total) {
61-
int32_t curFails = 0; // Only counts actual failures, not bitdiffs.
62-
int32_t curBitDiffs = 0; // A bitdiff is when the expected result and actual
63-
// result are off by +/- 1 bit.
64-
char line[100];
65-
char *num;
66-
67-
auto *fileHandle = LIBC_NAMESPACE::fopen(inputFileName, "r");
59+
static void parseLine(char *line, int *total, int *detailedBitDiffs,
60+
int32_t &curFails, int32_t &curBitDiffs) {
6861

69-
if (!fileHandle) {
70-
LIBC_NAMESPACE::printf("file '%s' failed to open. Exiting.\n",
71-
inputFileName);
72-
return 1;
62+
if (line[0] == '#') {
63+
return;
7364
}
65+
*total = *total + 1;
66+
uint32_t expectedFloatRaw;
67+
uint64_t expectedDoubleRaw;
7468

75-
while (LIBC_NAMESPACE::fgets(line, sizeof(line), fileHandle)) {
76-
if (line[0] == '#') {
77-
continue;
78-
}
79-
*total = *total + 1;
80-
uint32_t expectedFloatRaw;
81-
uint64_t expectedDoubleRaw;
69+
expectedFloatRaw = fastHexToU32(line + 5);
70+
expectedDoubleRaw = fastHexToU64(line + 14);
8271

83-
expectedFloatRaw = fastHexToU32(line + 5);
84-
expectedDoubleRaw = fastHexToU64(line + 14);
85-
num = line + 31;
72+
char *num = line + 31;
8673

87-
float floatResult = LIBC_NAMESPACE::strtof(num, nullptr);
74+
float floatResult = LIBC_NAMESPACE::strtof(num, nullptr);
8875

89-
double doubleResult = LIBC_NAMESPACE::strtod(num, nullptr);
76+
double doubleResult = LIBC_NAMESPACE::strtod(num, nullptr);
9077

91-
uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t>(floatResult);
78+
uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t>(floatResult);
9279

93-
uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t>(doubleResult);
80+
uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t>(doubleResult);
9481

95-
if (!(expectedFloatRaw == floatRaw)) {
96-
if (expectedFloatRaw == floatRaw + 1 ||
97-
expectedFloatRaw == floatRaw - 1) {
98-
curBitDiffs++;
99-
if (expectedFloatRaw == floatRaw + 1) {
100-
detailedBitDiffs[0] = detailedBitDiffs[0] + 1; // float low
101-
} else {
102-
detailedBitDiffs[1] = detailedBitDiffs[1] + 1; // float high
103-
}
82+
if (!(expectedFloatRaw == floatRaw)) {
83+
if (expectedFloatRaw == floatRaw + 1 || expectedFloatRaw == floatRaw - 1) {
84+
curBitDiffs++;
85+
if (expectedFloatRaw == floatRaw + 1) {
86+
detailedBitDiffs[0] = detailedBitDiffs[0] + 1; // float low
10487
} else {
105-
curFails++;
106-
}
107-
if (curFails + curBitDiffs < 10) {
108-
LIBC_NAMESPACE::printf("Float fail for '%s'. Expected %x but got %x\n",
109-
num, expectedFloatRaw, floatRaw);
88+
detailedBitDiffs[1] = detailedBitDiffs[1] + 1; // float high
11089
}
90+
} else {
91+
curFails++;
11192
}
93+
if (curFails + curBitDiffs < 10) {
94+
LIBC_NAMESPACE::printf("Float fail for '%s'. Expected %x but got %x\n",
95+
num, expectedFloatRaw, floatRaw);
96+
}
97+
}
11298

113-
if (!(expectedDoubleRaw == doubleRaw)) {
114-
if (expectedDoubleRaw == doubleRaw + 1 ||
115-
expectedDoubleRaw == doubleRaw - 1) {
116-
curBitDiffs++;
117-
if (expectedDoubleRaw == doubleRaw + 1) {
118-
detailedBitDiffs[2] = detailedBitDiffs[2] + 1; // double low
119-
} else {
120-
detailedBitDiffs[3] = detailedBitDiffs[3] + 1; // double high
121-
}
99+
if (!(expectedDoubleRaw == doubleRaw)) {
100+
if (expectedDoubleRaw == doubleRaw + 1 ||
101+
expectedDoubleRaw == doubleRaw - 1) {
102+
curBitDiffs++;
103+
if (expectedDoubleRaw == doubleRaw + 1) {
104+
detailedBitDiffs[2] = detailedBitDiffs[2] + 1; // double low
122105
} else {
123-
curFails++;
124-
}
125-
if (curFails + curBitDiffs < 10) {
126-
LIBC_NAMESPACE::printf(
127-
"Double fail for '%s'. Expected %lx but got %lx\n", num,
128-
expectedDoubleRaw, doubleRaw);
106+
detailedBitDiffs[3] = detailedBitDiffs[3] + 1; // double high
129107
}
108+
} else {
109+
curFails++;
110+
}
111+
if (curFails + curBitDiffs < 10) {
112+
LIBC_NAMESPACE::printf("Double fail for '%s'. Expected %lx but got %lx\n",
113+
num, expectedDoubleRaw, doubleRaw);
130114
}
131115
}
116+
}
117+
118+
int checkBuffer(int *totalFails, int *totalBitDiffs, int *detailedBitDiffs,
119+
int *total) {
120+
const char *lines[6] = {"3C00 3F800000 3FF0000000000000 1",
121+
"3D00 3FA00000 3FF4000000000000 1.25",
122+
"3D9A 3FB33333 3FF6666666666666 1.4",
123+
"57B7 42F6E979 405EDD2F1A9FBE77 123.456",
124+
"622A 44454000 4088A80000000000 789",
125+
"7C00 7F800000 7FF0000000000000 123.456e789"};
126+
127+
int32_t curFails = 0; // Only counts actual failures, not bitdiffs.
128+
int32_t curBitDiffs = 0; // A bitdiff is when the expected result and actual
129+
// result are off by +/- 1 bit.
130+
131+
for (uint8_t i = 0; i < 6; i++) {
132+
auto line = const_cast<char *>(lines[i]);
133+
parseLine(line, total, detailedBitDiffs, curFails, curBitDiffs);
134+
}
135+
136+
*totalBitDiffs += curBitDiffs;
137+
*totalFails += curFails;
138+
139+
if (curFails > 1 || curBitDiffs > 1) {
140+
return 2;
141+
}
142+
return 0;
143+
}
144+
145+
int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
146+
int *detailedBitDiffs, int *total) {
147+
int32_t curFails = 0; // Only counts actual failures, not bitdiffs.
148+
int32_t curBitDiffs = 0; // A bitdiff is when the expected result and actual
149+
// result are off by +/- 1 bit.
150+
char line[100];
151+
152+
auto *fileHandle = LIBC_NAMESPACE::fopen(inputFileName, "r");
153+
154+
if (!fileHandle) {
155+
LIBC_NAMESPACE::printf("file '%s' failed to open. Exiting.\n",
156+
inputFileName);
157+
return 1;
158+
}
159+
160+
while (LIBC_NAMESPACE::fgets(line, sizeof(line), fileHandle)) {
161+
parseLine(line, total, detailedBitDiffs, curFails, curBitDiffs);
162+
}
132163

133164
LIBC_NAMESPACE::fclose(fileHandle);
134165

@@ -141,7 +172,16 @@ int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
141172
return 0;
142173
}
143174

144-
TEST(LlvmLibcStrToFloatComparisonTest, CheckFile) {
175+
int updateResult(int result, int curResult) {
176+
if (curResult == 1) {
177+
result = 1;
178+
} else if (curResult == 2) {
179+
result = 2;
180+
}
181+
return result;
182+
}
183+
184+
TEST(LlvmLibcStrToFloatComparisonTest, CheckFloats) {
145185
int result = 0;
146186
int fails = 0;
147187

@@ -155,15 +195,17 @@ TEST(LlvmLibcStrToFloatComparisonTest, CheckFile) {
155195
int total = 0;
156196

157197
char *files = LIBC_NAMESPACE::getenv("FILES");
158-
files = LIBC_NAMESPACE::strdup(files);
159-
for (char *file = LIBC_NAMESPACE::strtok(files, ","); file != nullptr;
160-
file = LIBC_NAMESPACE::strtok(nullptr, ",")) {
161-
int curResult =
162-
checkFile(file, &fails, &bitdiffs, detailedBitDiffs, &total);
163-
if (curResult == 1) {
164-
result = 1;
165-
} else if (curResult == 2) {
166-
result = 2;
198+
199+
if (files == nullptr) {
200+
int curResult = checkBuffer(&fails, &bitdiffs, detailedBitDiffs, &total);
201+
result = updateResult(result, curResult);
202+
} else {
203+
files = LIBC_NAMESPACE::strdup(files);
204+
for (char *file = LIBC_NAMESPACE::strtok(files, ","); file != nullptr;
205+
file = LIBC_NAMESPACE::strtok(nullptr, ",")) {
206+
int curResult =
207+
checkFile(file, &fails, &bitdiffs, detailedBitDiffs, &total);
208+
result = updateResult(result, curResult);
167209
}
168210
}
169211

0 commit comments

Comments
 (0)