/* * test_budget.c — 宿主校验 meow_font_config_multifont 的「打包面内存预算」: * slot0=common(≈4.2MiB)+ 给 CJK 类别装 gbk(≈16.6MiB)→ 合计 > MEOW_MULTIFONT_MEM_BUDGET * → gbk 应被拒绝(distinct=1,truncated=1),防止大字库 + 多字体双驻留 OOM。 * 用法:gcc -I. test_budget.c meow_font.c -lz -o test_budget * ./test_budget */ #include "meow_font.h" #include #include static int g_fail = 0; #define CHECK(cond, msg) do { \ if (!(cond)) { g_fail++; fprintf(stderr, "FAIL: %s\n", msg); } \ else printf("ok : %s\n", msg); \ } while (0) int main(int argc, char **argv) { if (argc < 5) { fprintf(stderr, "usage: %s \n", argv[0]); return 2; } int r = meow_font_load(argv[1], argv[2]); /* slot0 = common */ CHECK(r == 0, "load slot0 common"); meow_font_class_cfg cfg[MEOW_FCLS_COUNT]; memset(cfg, 0, sizeof cfg); cfg[MEOW_FCLS_CJK].png = argv[3]; /* CJK 类别 → gbk 大字库 */ cfg[MEOW_FCLS_CJK].idx = argv[4]; int distinct = 0, truncated = 0; r = meow_font_config_multifont(1, argv[1], argv[2], cfg, &distinct, &truncated); CHECK(r == 0, "config_multifont ok"); printf(" distinct=%d truncated=%d\n", distinct, truncated); /* slot0 common 4.2MiB + gbk 16.6MiB = 20.8MiB > 16MiB 预算 → gbk 被拒 → distinct 仅全局 */ CHECK(distinct == 1, "distinct==1 (gbk rejected by MEM_BUDGET)"); CHECK(truncated == 1, "truncated==1 (budget exceeded -> class fell back to global)"); /* gbk 槽应未驻留:distinct==1(仅全局 common)即证明 gbk 未被 commit; * 注意 common 4k 亦含「中」,故不能以 has_glyph(中)==0 断言——改以「common 仍在」佐证。 */ CHECK(meow_font_has_glyph('A') == 1, "has_glyph(A)==1 (common still there)"); meow_font_unload(); printf("\nRESULT: %s\n", g_fail ? "FAIL" : "PASS"); return g_fail ? 1 : 0; }