← 都来码 / Dolaima← 例程索引c/test/ui_lang.c原文

c/test/ui_lang.c · 2432 字节 · 下载原文

/* ui_lang.c —— `ui_lang()` 的判据。
 * ui_lang.c — criterion for `ui_lang()`.
 *
 * ## 判据
 * ## Criteria
 *
 * 1. `ui_lang(zh, en)` 选出来的那个,必须与 `ui_scr_get_language()` 说的语言**一致**;
 * 2. **形参顺序**是「中文在前、英文在后」—— 反了的话英文手机上会蹦中文(而中文手机上一切正常,
 *    所以只在一半设备上出问题,最容易漏)。
 *
 * 第 2 条用一个**不含语义**的取值(`"AAA"` / `"BBB"`)单独问一遍:这样"顺序反了"与
 * "语言取错了"能分开报,而不会互相掩盖。
 *
 * ⚠ 这是**纯 C 判据**:`ui_lang` 的参数与返回值都是 `const char*`,非 C 语言的字符串语义
 * 各不相同(本仓 E191 记过 Python 前端的字符串坑),那几门要各验各的。
 *
 * 跑法(桌面,秒级):
 *     dotnet scripts/vmlcli/bin/Release/net10.0/vmlcli.dll third_party/vml/Examples/c/test/ui_lang.c
 */

#include <vml_ui.h>
#include <string.h>   /* strcmp —— ⚠ 比**内容**,不能比指针:两个内容相同的字面量地址不同 */

int fails = 0;

int main(void) {
    int lang;
    const char* got;
    const char* want;

    lang = ui_scr_get_language();
    printf("host lang = %d (0 = zh, 1 = en)\n", lang);

    /* ① 选出来的必须与宿主语言一致(这里拿"真文案"问)——
     * ⚠ 第一版写的是 `got == want`(比指针),于是**内容对、地址不同**,两条判据全假红
     *   (打印出来的明明是"选中 中文,应为 中文")。比字符串一律走 `strcmp`。 */
    got = ui_lang("中文", "English");
    want = (lang == 0) ? "中文" : "English";
    if (strcmp(got, want) == 0) {
        printf("OK   选中 %s\n", got);
    } else {
        printf("FAIL 选中 %s,应为 %s\n", got, want);
        fails = fails + 1;
    }

    /* ② 形参顺序:用不含语义的取值单独问一遍(与①分开报,别互相掩盖) */
    got = ui_lang("AAA", "BBB");
    want = (lang == 0) ? "AAA" : "BBB";
    if (strcmp(got, want) == 0) {
        printf("OK   顺序对(zh 在前、en 在后)\n");
    } else {
        printf("FAIL 顺序反了:拿到 %s,应为 %s\n", got, want);
        fails = fails + 1;
    }

    printf("UI_LANG %s (fails=%d)\n", fails == 0 ? "PASS" : "FAIL", fails);
    return fails;
}