71 lines
3.0 KiB
Bash
71 lines
3.0 KiB
Bash
#!/usr/bin/env bash
|
|
set -eo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib"
|
|
TG="$TACHYON_LIB/service/telegram.uc"
|
|
I18N="$TACHYON_LIB/service/i18n.uc"
|
|
|
|
fail() {
|
|
printf 'FAIL: %s\n' "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
[ -f "$TG" ] || fail "telegram.uc not found"
|
|
[ -f "$I18N" ] || fail "i18n.uc not found"
|
|
|
|
# 1. Available languages: Russian must be unconditionally available (not gated by current==ru)
|
|
grep -Fq '{ code: "ru", label: "Русский", available: true }' "$I18N" ||
|
|
fail "i18n.uc must make Russian unconditionally available"
|
|
|
|
# 2. telegram.uc must not have the broken substr(cmd, 11) for lang_set that chopped 'ru' to 'u'
|
|
if grep -E 'lang.*substr\(cmd, 11\)' "$TG"; then
|
|
fail "telegram.uc must NOT use substr(cmd, 11) for language commands"
|
|
fi
|
|
|
|
# 3. /lang_set matching must capture the full language code
|
|
grep -Fq 'lang_match = match(cmd, /^\/(lang_set|lang|language)' "$TG" ||
|
|
fail "telegram.uc must robustly match /lang_set and /lang commands with arguments"
|
|
|
|
# 4. handle_lang_set must rebind t immediately
|
|
grep -Fq 't = i18n.bind(lang);' "$TG" ||
|
|
fail "handle_lang_set must rebind translation function 't' immediately"
|
|
|
|
# 5. handle_lang_set must update Telegram bot commands menu
|
|
grep -Fq 'register_bot_commands(token);' "$TG" ||
|
|
fail "handle_lang_set must call register_bot_commands to update bot menu"
|
|
|
|
# 6. /guest and /guest_toggle routes must be defined in telegram.uc
|
|
grep -Fq 'function view_guest_mode(token, chat_id, msg_id)' "$TG" ||
|
|
fail "telegram.uc must define view_guest_mode"
|
|
grep -Fq 'function handle_guest_toggle(token, chat_id, msg_id)' "$TG" ||
|
|
fail "telegram.uc must define handle_guest_toggle"
|
|
grep -Fq 'if (cmd == "/guest")' "$TG" ||
|
|
fail "dispatch_command must route /guest"
|
|
grep -Fq 'if (cmd == "/guest_toggle")' "$TG" ||
|
|
fail "dispatch_command must route /guest_toggle"
|
|
|
|
# 7. Run ucode evaluation test of i18n language resolution, sprintf args, and regex
|
|
ucode -e '
|
|
let i18n = loadfile("'"$I18N"'")();
|
|
if (i18n.resolve_lang("ru") != "ru") exit(1);
|
|
if (i18n.resolve_lang("en") != "en") exit(2);
|
|
if (i18n.resolve_lang("invalid") != "en") exit(3);
|
|
let t_ru = i18n.bind("ru");
|
|
if (t_ru("lang_saved") != "Язык сохранён!") exit(4);
|
|
if (t_ru("cmd_guest") != "Гостевой режим") exit(5);
|
|
if (t_ru("lang_current", "Русский") != "Текущий язык: Русский") exit(6);
|
|
let t_en = i18n.bind("en");
|
|
if (t_en("lang_saved") != "Language saved!") exit(7);
|
|
if (t_en("cmd_guest") != "Guest mode") exit(8);
|
|
if (t_en("lang_current", "English") != "Current language: English") exit(9);
|
|
let langs = i18n.available_languages("en");
|
|
if (length(langs) != 2 || !langs[0].available || !langs[1].available) exit(10);
|
|
let m1 = match("/lang_set ru", /^\/(lang_set|lang|language)[ \t]+([a-zA-Z0-9_-]+)/);
|
|
if (!m1 || m1[2] != "ru") exit(11);
|
|
let m2 = match("/lang en", /^\/(lang_set|lang|language)[ \t]+([a-zA-Z0-9_-]+)/);
|
|
if (!m2 || m2[2] != "en") exit(12);
|
|
' || fail "ucode i18n evaluation failed"
|
|
|
|
printf 'telegram language and guest route checks passed\n'
|