diff --git a/tests/shell/test-boot-screen.sh b/tests/shell/test-boot-screen.sh new file mode 100755 index 0000000..87036cf --- /dev/null +++ b/tests/shell/test-boot-screen.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +# The boot screen is two frames stitched to look like one, and every way it +# comes apart is silent - the page still loads, the match still starts, and +# what a player sees is only wrong if you happen to be looking: +# +# - the string drifts. It lives twice, in index.html for the frame we serve +# and in msg.json for the frame the client builds. Nothing links them. +# - the key is misspelled. The client merges msg.json over its built-in table +# per key, so a typo is not an error, it is upstream's default coming back. +# - lang.js moves. It has to run before the loader stub reads the language; +# after it, the file is fetched for whatever locale the browser asked for +# and the string only reaches English browsers. +# - a file 404s. The insignia is a background-image and the faces are +# @font-face - a missing one is a blank box and a fallback face, not a log +# line. +# +# None of this is reachable without a browser, so what is checked here is that +# the pieces exist, agree with each other, and are wired in the right order. +set -uo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +WEB="$ROOT/suramadu/web" +HTML="$WEB/index.html" +MSG="$WEB/javascript/nls/en/msg.json" + +pass=0; fail=0 +check() { if "${@:2}"; then echo "ok $1"; pass=$((pass+1)); else echo "FAIL $1"; fail=$((fail+1)); fi; } + +for f in "$HTML" "$MSG" "$WEB/lang.js" "$WEB/fonts.css" "$WEB/theme.css" "$WEB/insignia.svg"; do + [ -s "$f" ] || { echo "FAIL ${f#"$ROOT"/} is missing or empty"; exit 1; } +done + +# --- the string exists once per frame, and they agree ------------------------ + +check "msg.json parses" python3 -c "import json,sys; json.load(open(sys.argv[1]))" "$MSG" + +# The key upstream looks up. Spelled any other way this file is inert. +check "msg.json carries dialog.startingDialog" python3 - "$MSG" <<'PY' +import json, sys +msg = json.load(open(sys.argv[1], encoding="utf-8")) +sys.exit(0 if isinstance(msg.get("dialog.startingDialog"), str) and + msg["dialog.startingDialog"].strip() else 1) +PY + +check "the two frames say the same thing" python3 - "$MSG" "$HTML" <<'PY' +import json, re, sys + +msg = json.load(open(sys.argv[1], encoding="utf-8"))["dialog.startingDialog"] +html = open(sys.argv[2], encoding="utf-8").read() + +m = re.search(r'

([^<]*)

', html) +if m is None: + print("index.html has no

to compare against") + sys.exit(1) +if m.group(1).strip() != msg.strip(): + print("index.html: %r" % m.group(1).strip()) + print("msg.json : %r" % msg.strip()) + print("The first frame and the second would say different things.") + sys.exit(1) +PY + +# The client asks for javascript/nls//msg.json with the tag lang.js pins, +# so the directory name and that string are one fact stored in two places. +check "lang.js pins the tag the shipped directory is named for" bash -c ' + tag=$(grep -o "setItem(\"webswingLang\", \"[a-zA-Z-]*\")" "$1/lang.js" | + sed -E "s/.*\"webswingLang\", \"([a-zA-Z-]*)\".*/\1/") + [ -n "$tag" ] && [ -f "$1/javascript/nls/$tag/msg.json" ]' _ "$WEB" + +# --- wiring ------------------------------------------------------------------ + +check "lang.js runs before the loader stub" bash -c ' + l=$(grep -n "\"lang.js\"" "$1" | cut -d: -f1) + s=$(grep -n "webswing-loader-stub.js" "$1" | cut -d: -f1) + [ -n "$l" ] && [ -n "$s" ] && [ "$l" -lt "$s" ]' _ "$HTML" + +check "fonts.css is linked, and before theme.css asks for the family" bash -c ' + f=$(grep -n "\"fonts.css\"" "$1" | cut -d: -f1) + t=$(grep -n "\"theme.css\"" "$1" | cut -d: -f1) + [ -n "$f" ] && [ -n "$t" ] && [ "$f" -lt "$t" ]' _ "$HTML" + +# --- every asset referenced is an asset we ship ------------------------------ + +check "the faces fonts.css declares are all here" bash -c ' + status=0 + while IFS= read -r ref; do + [ -f "$1/$ref" ] || { echo "fonts.css wants $ref, which is not in web/"; status=1; } + done < <(grep -o "url(\"[^\"]*\")" "$1/fonts.css" | sed -E "s/url\(\"(.*)\"\)/\1/") + exit $status' _ "$WEB" + +check "the insignia theme.css draws is here" bash -c ' + status=0 + while IFS= read -r ref; do + [ -f "$1/$ref" ] || { echo "theme.css wants $ref, which is not in web/"; status=1; } + done < <(grep -o "url(\"[^\"]*\")" "$1/theme.css" | sed -E "s/url\(\"(.*)\"\)/\1/") + exit $status' _ "$WEB" + +check "insignia.svg is an SVG" grep -q "/dev/null 2>&1 && [ -s "$1/fonts/OFL-Chakra-Petch.txt" ]' _ "$WEB" + +echo +echo "$pass passed, $fail failed" +[ "$fail" -eq 0 ]