Index: tests/FontConfigParser.cpp |
diff --git a/tests/FontConfigParser.cpp b/tests/FontConfigParser.cpp |
index e58d35c625bb4bf52573c7f7c511b51f613bc250..218aa9a09ae675b4d367c2d44b5318fab0c72435 100644 |
--- a/tests/FontConfigParser.cpp |
+++ b/tests/FontConfigParser.cpp |
@@ -10,6 +10,9 @@ |
#include "SkFontConfigParser_android.h" |
#include "Test.h" |
+#include <cmath> |
+#include <cstdio> |
+ |
DECLARE_bool(verboseFontMgr); |
int CountFallbacks(SkTDArray<FontFamily*> fontFamilies) { |
@@ -91,7 +94,55 @@ void DumpLoadedFonts(SkTDArray<FontFamily*> fontFamilies, const char* label) { |
SkDebugf("\n\n"); |
} |
+template <int N, typename T> static double test_parse_fixed_r(skiatest::Reporter* reporter, |
+ double low, double high, double inc) |
+{ |
+ double SK_FixedMax_double = nextafter(1 << (sizeof(T) * CHAR_BIT - N - 1), 0.0); |
+ double SK_FixedEpsilon_double = (1.0 / (1 << N)); |
+ double maxError = 0; |
+ char buffer[64]; |
+ for (double f = low; f < high; f += inc) { |
+ SkString s; |
+ // 'sprintf' formatting as expected depends on the current locale being "C". |
+ // We currently expect tests and tools to run in the "C" locale. |
+ sprintf(buffer, "%.20f", f); |
+ T fix; |
+ bool b = parse_fixed<N>(buffer, &fix); |
+ if (b) { |
+ double f2 = fix * SK_FixedEpsilon_double; |
+ double error = fabs(f - f2); |
+ REPORTER_ASSERT(reporter, error <= SK_FixedEpsilon_double); |
+ maxError = SkTMax(maxError, error); |
+ } else { |
+ REPORTER_ASSERT(reporter, f < -SK_FixedMax_double || SK_FixedMax_double < f); |
+ } |
+ } |
+ |
+ //SkDebugf("maxError: %.20f\n", maxError); |
+ return maxError; |
+} |
+ |
+static void test_parse_fixed(skiatest::Reporter* reporter) { |
+ test_parse_fixed_r<27, int32_t>(reporter, -8.1, -7.9, 0.000001); |
+ test_parse_fixed_r<27, int32_t>(reporter, -0.1, 0.1, 0.000001); |
+ test_parse_fixed_r<27, int32_t>(reporter, 7.9, 8.1, 0.000001); |
+ test_parse_fixed_r<16, int32_t>(reporter, -0.125, 0.125, 1.0 / (1 << 19)); |
+ test_parse_fixed_r<16, int32_t>(reporter, -32768.125, -32766.875, 1.0 / (1 << 17)); |
+ test_parse_fixed_r<16, int32_t>(reporter, 32766.875, 32768.125, 1.0 / (1 << 17)); |
+ test_parse_fixed_r<16, int32_t>(reporter, -1.1, 1.1, 0.0001); |
+ |
+ SkFixed fix; |
+ REPORTER_ASSERT(reporter, !parse_fixed<27>("-17.1", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>("32768", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>("", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>(".", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>("123.", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>("a", &fix)); |
+ REPORTER_ASSERT(reporter, !parse_fixed<16>(".123a", &fix)); |
+} |
+ |
DEF_TEST(FontConfigParserAndroid, reporter) { |
+ test_parse_fixed(reporter); |
bool resourcesMissing = false; |
@@ -137,7 +188,7 @@ DEF_TEST(FontConfigParserAndroid, reporter) { |
NULL); |
if (v22FontFamilies.count() > 0) { |
- REPORTER_ASSERT(reporter, v22FontFamilies.count() == 53); |
+ REPORTER_ASSERT(reporter, v22FontFamilies.count() == 54); |
REPORTER_ASSERT(reporter, CountFallbacks(v22FontFamilies) == 42); |
DumpLoadedFonts(v22FontFamilies, "version 22"); |