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;
}