diff --git a/test_conformance/printf/test_printf.h b/test_conformance/printf/test_printf.h index 993a612635..519b9dd9b3 100644 --- a/test_conformance/printf/test_printf.h +++ b/test_conformance/printf/test_printf.h @@ -70,14 +70,15 @@ struct printDataGenParameters { std::vector genericFormats; const char* dataRepresentation; - const char* vectorFormatFlag; - const char* vectorFormatSpecifier; - const char* dataType; - const char* vectorSize; - const char* addrSpaceArgumentTypeQualifier; - const char* addrSpaceVariableTypeQualifier; - const char* addrSpaceParameter; - const char* addrSpacePAdd; + const char* vectorFormatFlag = nullptr; + const char* vectorFormatSpecifier = nullptr; + const char* dataType = nullptr; + const char* vectorSize = nullptr; + const char* addrSpaceArgumentTypeQualifier = nullptr; + const char* addrSpaceVariableTypeQualifier = nullptr; + const char* addrSpaceParameter = nullptr; + const char* addrSpacePAdd = nullptr; + bool allowFallbackTest = false; }; // Reference results - filled out at run-time @@ -111,6 +112,9 @@ struct testCase char*, const size_t); //function pointer for generating reference results Type dataType; //the data type that will be printed during reference result generation (used for setting rounding mode) + bool (*fallbackTestFN)(const char*, + const char*) = + nullptr; // function pointer to perform fallback test if required }; extern const char* strType[]; diff --git a/test_conformance/printf/util_printf.cpp b/test_conformance/printf/util_printf.cpp index 83a21fbb8f..6ea42c3900 100644 --- a/test_conformance/printf/util_printf.cpp +++ b/test_conformance/printf/util_printf.cpp @@ -26,8 +26,11 @@ static void intRefBuilder(printDataGenParameters&, char*, const size_t); static void halfRefBuilder(printDataGenParameters&, char* rResult, const size_t); static void floatRefBuilder(printDataGenParameters&, char* rResult, const size_t); +static bool floatRefTest(const char* refResult, const char* analysisBuffer); static void doubleRefBuilder(printDataGenParameters&, char* rResult, const size_t); +static bool doubleRefTest(const char* refResult, const char* analysisBuffer); + static void octalRefBuilder(printDataGenParameters&, char*, const size_t); static void unsignedRefBuilder(printDataGenParameters&, char*, const size_t); static void hexRefBuilder(printDataGenParameters&, char*, const size_t); @@ -468,12 +471,12 @@ std::vector printFloatGenParameters = { // Double argument representing floating-point,in [-]xh.hhhhpAd style - { { "%.6a" }, "0.1f" }, + { { "%.6a" }, "0.5f", 0, 0, 0, 0, 0, 0, 0, 0, true }, //(Minimum)Ten-wide,Double argument representing floating-point,in // xh.hhhhpAd style,default(right)-justified - { { "%10.2a" }, "9990.235f" }, + { { "%10.2a" }, "1.5f", 0, 0, 0, 0, 0, 0, 0, 0, true }, //(Minimum)Ten-wide,two positions after the decimal,with // a blank space inserted before the value, default(right)-justified @@ -502,8 +505,9 @@ testCase testCaseFloat = { floatRefBuilder, - kfloat + kfloat, + floatRefTest }; //============================================== @@ -673,12 +677,12 @@ std::vector printDoubleGenParameters = { // Double argument representing floating-point,in [-]xh.hhhhpAd style - { { "%.6a" }, "0.1" }, + { { "%.6a" }, "0.5", 0, 0, 0, 0, 0, 0, 0, 0, true }, //(Minimum)Ten-wide,Double argument representing floating-point,in // xh.hhhhpAd style,default(right)-justified - { { "%10.2a" }, "9990.235" }, + { { "%10.2a" }, "1.5", 0, 0, 0, 0, 0, 0, 0, 0, true }, }; //--------------------------------------------------------- @@ -697,8 +701,9 @@ testCase testCaseDouble = { doubleRefBuilder, - kdouble + kdouble, + doubleRefTest }; //============================================== @@ -1752,7 +1757,15 @@ size_t verifyOutputBuffer(char *analysisBuffer,testCase* pTestCase,size_t testId return !std::regex_match(analysisBuffer, nanRegex); } - return strcmp(analysisBuffer, pTestCase->_correctBuffer[testId].c_str()); + size_t ret = + strcmp(analysisBuffer, pTestCase->_correctBuffer[testId].c_str()); + + if (ret != 0 && pTestCase->_genParameters[testId].allowFallbackTest + && pTestCase->fallbackTestFN) + if (pTestCase->fallbackTestFN( + analysisBuffer, pTestCase->_correctBuffer[testId].c_str())) + return 0; + return ret; } static void intRefBuilder(printDataGenParameters& params, char* refResult, const size_t refSize) @@ -1776,6 +1789,13 @@ static void floatRefBuilder(printDataGenParameters& params, char* refResult, con strtof(params.dataRepresentation, NULL)); } +static bool floatRefTest(const char* refResult, const char* analysisBuffer) +{ + float test = strtof(analysisBuffer, NULL); + float expected = strtof(refResult, NULL); + return test == expected; +} + static void doubleRefBuilder(printDataGenParameters& params, char* refResult, const size_t refSize) { @@ -1783,6 +1803,13 @@ static void doubleRefBuilder(printDataGenParameters& params, char* refResult, strtod(params.dataRepresentation, NULL)); } +static bool doubleRefTest(const char* refResult, const char* analysisBuffer) +{ + double test = strtod(analysisBuffer, NULL); + double expected = strtod(refResult, NULL); + return test == expected; +} + static void octalRefBuilder(printDataGenParameters& params, char* refResult, const size_t refSize) { const unsigned long int data = strtoul(params.dataRepresentation, NULL, 10);