UBool DataDrivenNumberFormatTestSuite::breaksC() { return (NFTT_GET_FIELD(fTuple, breaks, "").toUpper().indexOf(0x43) != -1); }
void DataDrivenNumberFormatTestSuite::run(const char *fileName, UBool runAllTests) { fFileLineNumber = 0; fFormatTestNumber = 0; UErrorCode status = U_ZERO_ERROR; for (int32_t i = 0; i < UPRV_LENGTHOF(fPreviousFormatters); ++i) { delete fPreviousFormatters[i]; fPreviousFormatters[i] = newFormatter(status); } if (!assertSuccess("Can't create previous formatters", status)) { return; } CharString path(getSourceTestData(status), status); path.appendPathPart(fileName, status); const char *codePage = "UTF-8"; LocalUCHARBUFPointer f(ucbuf_open(path.data(), &codePage, TRUE, FALSE, &status)); if (!assertSuccess("Can't open data file", status)) { return; } UnicodeString columnValues[kNumberFormatTestTupleFieldCount]; ENumberFormatTestTupleField columnTypes[kNumberFormatTestTupleFieldCount]; int32_t columnCount; int32_t state = 0; while(U_SUCCESS(status)) { // Read a new line if necessary. if(fFileLine.isEmpty()) { if(!readLine(f.getAlias(), status)) { break; } if (fFileLine.isEmpty() && state == 2) { state = 0; } continue; } if (fFileLine.startsWith("//")) { fFileLine.remove(); continue; } // Initial setup of test. if (state == 0) { if (fFileLine.startsWith(UNICODE_STRING("test ", 5))) { fFileTestName = fFileLine; fTuple.clear(); } else if(fFileLine.startsWith(UNICODE_STRING("set ", 4))) { setTupleField(status); } else if(fFileLine.startsWith(UNICODE_STRING("begin", 5))) { state = 1; } else { showError("Unrecognized verb."); return; } // column specification } else if (state == 1) { columnCount = splitBy(columnValues, UPRV_LENGTHOF(columnValues), 0x9); for (int32_t i = 0; i < columnCount; ++i) { columnTypes[i] = NumberFormatTestTuple::getFieldByName( columnValues[i]); if (columnTypes[i] == kNumberFormatTestTupleFieldCount) { showError("Unrecognized field name."); return; } } state = 2; // run the tests } else { int32_t columnsInThisRow = splitBy(columnValues, columnCount, 0x9); for (int32_t i = 0; i < columnsInThisRow; ++i) { fTuple.setField( columnTypes[i], columnValues[i].unescape(), status); } for (int32_t i = columnsInThisRow; i < columnCount; ++i) { fTuple.clearField(columnTypes[i], status); } if (U_FAILURE(status)) { showError("Invalid column values"); return; } if (runAllTests || !breaksC()) { UnicodeString errorMessage; UBool shouldFail = (NFTT_GET_FIELD(fTuple, output, "") == "fail") ? !breaksC() : breaksC(); UBool actualSuccess = isPass(fTuple, errorMessage, status); if (shouldFail && actualSuccess) { showFailure("Expected failure, but passed: " + errorMessage); break; } else if (!shouldFail && !actualSuccess) { showFailure(errorMessage); break; } status = U_ZERO_ERROR; } } fFileLine.remove(); } }