src/fccfg.c | 12 +- test/Makefile.am | 1 test/run-test-conf.sh | 1 test/test-60-generic.json | 34 ++++++++ test/test-conf.c | 190 +++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 215 insertions(+), 23 deletions(-) New commits: commit 71c9c7892ab7ddf8964737e80d0465e3e96ac36b Author: Akira TAGOH <akira@xxxxxxxxx> Date: Tue Nov 27 08:50:18 2018 +0000 Add a test case for FcFontList diff --git a/test/Makefile.am b/test/Makefile.am index 14b2c13..2877a8f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -17,6 +17,7 @@ TESTDATA = \ 4x6.pcf \ 8x16.pcf \ fonts.conf.in \ + test-60-generic.json \ test-90-synthetic.json \ $(NULL) diff --git a/test/run-test-conf.sh b/test/run-test-conf.sh index 4bcc29c..80a5d6b 100644 --- a/test/run-test-conf.sh +++ b/test/run-test-conf.sh @@ -33,4 +33,5 @@ BUILDTESTDIR=${builddir-"$MyPWD"} RUNNER=../test/test-conf$EXEEXT +$RUNNER $TESTDIR/../conf.d/60-generic.conf $TESTDIR/test-60-generic.json $RUNNER $TESTDIR/../conf.d/90-synthetic.conf $TESTDIR/test-90-synthetic.json diff --git a/test/test-60-generic.json b/test/test-60-generic.json new file mode 100644 index 0000000..3c2a114 --- /dev/null +++ b/test/test-60-generic.json @@ -0,0 +1,34 @@ +{ + "fonts": [ + { + "family": "Foo", + "color": true + }, + { + "family": "Bar", + "color": false + }, + { + "family": "Baz", + "color": "DontCare" + } + ], + "tests": [ + { + "method": "list", + "query": { + "color": true + }, + "result_fs": [ + { + "family": "Foo", + "color": true + }, + { + "family": "Baz", + "color": "DontCare" + } + ] + } + ] +} diff --git a/test/test-conf.c b/test/test-conf.c index 6619ea7..c0a08de 100644 --- a/test/test-conf.c +++ b/test/test-conf.c @@ -68,8 +68,34 @@ build_pattern (json_object *obj) } else if (json_object_get_type (iter.val) == json_type_string) { - v.type = FcTypeString; - v.u.s = json_object_get_string (iter.val); + const FcConstant *c = FcNameGetConstant (json_object_get_string (iter.val)); + FcBool b; + + if (c) + { + const FcObjectType *o; + + if (strcmp (c->object, iter.key) != 0) + { + fprintf (stderr, "E: invalid object type for const\n"); + fprintf (stderr, " actual result: %s\n", iter.key); + fprintf (stderr, " expected result: %s\n", c->object); + continue; + } + o = FcNameGetObjectType (c->object); + v.type = o->type; + v.u.i = c->value; + } + else if (strcmp (json_object_get_string (iter.val), "DontCare") == 0) + { + v.type = FcTypeBool; + v.u.b = FcDontCare; + } + else + { + v.type = FcTypeString; + v.u.s = json_object_get_string (iter.val); + } } else if (json_object_get_type (iter.val) == json_type_null) { @@ -85,12 +111,32 @@ build_pattern (json_object *obj) return pat; } +static FcFontSet * +build_fs (json_object *obj) +{ + FcFontSet *fs = FcFontSetCreate (); + int i, n; + + n = json_object_array_length (obj); + for (i = 0; i < n; i++) + { + json_object *o = json_object_array_get_idx (obj, i); + FcPattern *pat; + + if (json_object_get_type (o) != json_type_object) + continue; + pat = build_pattern (o); + FcFontSetAdd (fs, pat); + } + + return fs; +} + static FcBool build_fonts (FcConfig *config, json_object *root) { json_object *fonts; FcFontSet *fs; - int i, n; if (!json_object_object_get_ex (root, "fonts", &fonts) || json_object_get_type (fonts) != json_type_array) @@ -98,18 +144,7 @@ build_fonts (FcConfig *config, json_object *root) fprintf (stderr, "W: No fonts defined\n"); return FcFalse; } - fs = FcFontSetCreate (); - n = json_object_array_length (fonts); - for (i = 0; i < n; i++) - { - json_object *obj = json_object_array_get_idx (fonts, i); - FcPattern *pat; - - if (json_object_get_type (obj) != json_type_object) - continue; - pat = build_pattern (obj); - FcFontSetAdd (fs, pat); - } + fs = build_fs (fonts); /* FcConfigSetFonts (config, fs, FcSetSystem); */ if (config->fonts[FcSetSystem]) FcFontSetDestroy (config->fonts[FcSetSystem]); @@ -138,6 +173,7 @@ run_test (FcConfig *config, json_object *root) json_object *obj = json_object_array_get_idx (tests, i); json_object_iter iter; FcPattern *query, *result; + FcFontSet *result_fs; const char *method; if (json_object_get_type (obj) != json_type_object) @@ -160,6 +196,8 @@ run_test (FcConfig *config, json_object *root) fprintf (stderr, "W: invalid type of query: (%s)\n", json_type_to_name (json_object_get_type (iter.val))); continue; } + if (query) + FcPatternDestroy (query); query = build_pattern (iter.val); } else if (strcmp (iter.key, "result") == 0) @@ -169,18 +207,43 @@ run_test (FcConfig *config, json_object *root) fprintf (stderr, "W: invalid type of result: (%s)\n", json_type_to_name (json_object_get_type (iter.val))); continue; } + if (result) + FcPatternDestroy (result); result = build_pattern (iter.val); } + else if (strcmp (iter.key, "result_fs") == 0) + { + if (json_object_get_type (iter.val) != json_type_array) + { + fprintf (stderr, "W: invalid type of result_fs: (%s)\n", json_type_to_name (json_object_get_type (iter.val))); + continue; + } + if (result_fs) + FcFontSetDestroy (result_fs); + result_fs = build_fs (iter.val); + } else { fprintf (stderr, "W: unknown object: %s\n", iter.key); } } - if (strcmp (method, "match") == 0) + if (method != NULL && strcmp (method, "match") == 0) { FcPattern *match; FcResult res; + if (!query) + { + fprintf (stderr, "E: no query defined.\n"); + fail++; + goto bail; + } + if (!result) + { + fprintf (stderr, "E: no result defined.\n"); + fail++; + goto bail; + } FcConfigSubstitute (config, query, FcMatchPattern); FcDefaultSubstitute (query); match = FcFontMatch (config, query, &res); @@ -220,7 +283,8 @@ run_test (FcConfig *config, json_object *root) } } } while (FcPatternIterNext (result, &iter)); - bail:; + bail: + FcPatternDestroy (match); } else { @@ -228,10 +292,102 @@ run_test (FcConfig *config, json_object *root) fail++; } } + else if (method != NULL && strcmp (method, "list") == 0) + { + FcFontSet *fs; + + if (!query) + { + fprintf (stderr, "E: no query defined.\n"); + fail++; + goto bail2; + } + if (!result_fs) + { + fprintf (stderr, "E: no result_fs defined.\n"); + fail++; + goto bail2; + } + fs = FcFontList (config, query, NULL); + if (!fs) + { + fprintf (stderr, "E: failed on FcFontList\n"); + fail++; + } + else + { + int i; + + if (fs->nfont != result_fs->nfont) + { + printf ("E: The number of results is different:\n"); + printf (" actual result: %d\n", fs->nfont); + printf (" expected result: %d\n", result_fs->nfont); + fail++; + goto bail2; + } + for (i = 0; i < fs->nfont; i++) + { + FcPatternIter iter; + int x, vc; + + FcPatternIterStart (result_fs->fonts[i], &iter); + do + { + vc = FcPatternIterValueCount (result_fs->fonts[i], &iter); + for (x = 0; x < vc; x++) + { + FcValue vr, vm; + + if (FcPatternIterGetValue (result_fs->fonts[i], &iter, x, &vr, NULL) != FcResultMatch) + { + fprintf (stderr, "E: unable to obtain a value from the expected result\n"); + fail++; + goto bail2; + } + if (FcPatternGet (fs->fonts[i], FcPatternIterGetObject (result_fs->fonts[i], &iter), x, &vm) != FcResultMatch) + { + vm.type = FcTypeVoid; + } + if (!FcValueEqual (vm, vr)) + { + printf ("E: failed to compare %s:\n", FcPatternIterGetObject (result_fs->fonts[i], &iter)); + printf (" actual result:"); + FcValuePrint (vm); + printf ("\n expected result:"); + FcValuePrint (vr); + printf ("\n"); + fail++; + goto bail2; + } + } + } while (FcPatternIterNext (result_fs->fonts[i], &iter)); + } + bail2: + FcFontSetDestroy (fs); + } + } else { fprintf (stderr, "W: unknown testing method: %s\n", method); } + if (method) + method = NULL; + if (result) + { + FcPatternDestroy (result); + result = NULL; + } + if (result_fs) + { + FcFontSetDestroy (result_fs); + result_fs = NULL; + } + if (query) + { + FcPatternDestroy (query); + query = NULL; + } } return fail == 0; commit 9d5149ac41e18ab67404ddba41d7ef7e71839ebc Author: Akira TAGOH <akira@xxxxxxxxx> Date: Tue Nov 27 08:50:18 2018 +0000 Fix FcFontList doesn't return a font with FC_COLOR=true "color" property has a value more than 1 because the value of FT_HAS_COLOR is directly set to it. this seems breaking the behavior of FcFontList with FC_COLOR=true because it is more than FcDontCare. So changing comparison that way. diff --git a/src/fccfg.c b/src/fccfg.c index 890991f..a87dfec 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -821,25 +821,25 @@ FcConfigCompareValue (const FcValue *left_o, break; case FcOpContains: case FcOpListing: - ret = left.u.b == right.u.b || left.u.b == FcDontCare; + ret = left.u.b == right.u.b || left.u.b >= FcDontCare; break; case FcOpNotEqual: ret = left.u.b != right.u.b; break; case FcOpNotContains: - ret = !(left.u.b == right.u.b || left.u.b == FcDontCare); + ret = !(left.u.b == right.u.b || left.u.b >= FcDontCare); break; case FcOpLess: - ret = left.u.b != right.u.b && right.u.b == FcDontCare; + ret = left.u.b != right.u.b && right.u.b >= FcDontCare; break; case FcOpLessEqual: - ret = left.u.b == right.u.b || right.u.b == FcDontCare; + ret = left.u.b == right.u.b || right.u.b >= FcDontCare; break; case FcOpMore: - ret = left.u.b != right.u.b && left.u.b == FcDontCare; + ret = left.u.b != right.u.b && left.u.b >= FcDontCare; break; case FcOpMoreEqual: - ret = left.u.b == right.u.b || left.u.b == FcDontCare; + ret = left.u.b == right.u.b || left.u.b >= FcDontCare; break; default: break; _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig