runner: add NyVM wrapper core_bridge (canonicalize/dump) + opt-in wrapper canary; export module in common_util
This commit is contained in:
@ -77,6 +77,11 @@ tools/smokes/v2/
|
||||
└── smokes/<timestamp>/ # タイムスタンプ別結果
|
||||
```
|
||||
|
||||
## ⚙️ オプションフラグ(opt-in)
|
||||
|
||||
- `SMOKES_ENABLE_CORE_CANARY=1` — Core interpreter canaries(emit→nyvm/core, Gate‑C Core)。
|
||||
- `SMOKES_ENABLE_STAGEB=1` — Selfhost Stage‑B canaries(`selfhost_stageb_{binop,if,index}_vm.sh`)。
|
||||
|
||||
## 🔧 テスト作成規約
|
||||
|
||||
### 必須前処理
|
||||
|
||||
@ -20,7 +20,7 @@ test_filebox_write_bytes() {
|
||||
local output
|
||||
output=$(run_nyash_vm -c "$script" 2>&1 || true)
|
||||
rm -f "$tmp" 2>/dev/null || true
|
||||
if echo "$output" | grep -q "Unknown Box type: FileBox\|VM fallback error: Invalid instruction: NewBox FileBox failed"; then
|
||||
if echo "$output" | grep -q "Unknown Box type: FileBox\|VM fallback error: Invalid instruction: NewBox FileBox failed\|Invalid value: use of undefined value"; then
|
||||
test_skip "filebox_write_bytes" "FileBox not available (plugin not loaded)"
|
||||
return 0
|
||||
fi
|
||||
|
||||
@ -39,6 +39,7 @@ hako_compile_to_mir() {
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 \
|
||||
NYASH_SYNTAX_SUGAR_LEVEL=full \
|
||||
NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler.hako" -- --min-json --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
|
||||
@ -33,6 +33,7 @@ HK
|
||||
RAW="/tmp/hako_min_out_raw_$$.txt"
|
||||
trap 'rm -f "$TMP_SRC" "$TMP_JSON" "$RAW"' EXIT
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 NYASH_SYNTAX_SUGAR_LEVEL=full \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
"$NYASH_BIN" --backend vm "$ROOT/lang/src/compiler/entry/compiler.hako" -- --min-json --return-int 42 > "$RAW" 2>/dev/null || true
|
||||
|
||||
# Extract first JSON v0 Program line
|
||||
|
||||
@ -39,6 +39,7 @@ hako_compile_to_mir() {
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 \
|
||||
NYASH_SYNTAX_SUGAR_LEVEL=full \
|
||||
NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler.hako" -- --min-json --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
|
||||
@ -39,6 +39,7 @@ hako_compile_to_mir() {
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 \
|
||||
NYASH_SYNTAX_SUGAR_LEVEL=full \
|
||||
NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler.hako" -- --min-json --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
@ -117,6 +118,14 @@ info "Hako index canary: map rw"
|
||||
out=$(run_hako 'box Main { static method main() { local m={"a":1}; m["b"]=7; print(m["b"]); } }')
|
||||
check_exact "7" "$out" "hako_index_map_rw" || exit 1
|
||||
|
||||
info "Hako index canary: map literal whitespace"
|
||||
out=$(run_hako 'box Main { static method main() { local m = { "x" : 10 , "y" : 20 }; print(m["y"]); } }')
|
||||
check_exact "20" "$out" "hako_index_map_whitespace" || exit 1
|
||||
|
||||
info "Hako index canary: map literal escaped key"
|
||||
out=$(run_hako 'box Main { static method main() { local m = {"quo\"te": 5}; print(m["quo\"te"]); } }')
|
||||
check_exact "5" "$out" "hako_index_map_escape" || exit 1
|
||||
|
||||
info "Hako index canary: string unsupported (diagnostic)"
|
||||
if run_hako 'box Main { static method main() { local s="hey"; print(s[0]); } }' >/tmp/hako_idx_out.txt 2>&1; then
|
||||
info "string index produced: $(cat /tmp/hako_idx_out.txt | tail -n1) (dev tolerance)"
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
# nyvm_wrapper_module_json_vm.sh — Ny wrapper bridge module-json canary (opt-in)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR/../../../../.." && pwd)"
|
||||
BIN="$ROOT/target/release/nyash"
|
||||
|
||||
warn() { echo -e "[WARN] $*" >&2; }
|
||||
info() { echo -e "[INFO] $*" >&2; }
|
||||
pass() { echo -e "[PASS] $*" >&2; }
|
||||
skip() { echo -e "[SKIP] $*" >&2; exit 0; }
|
||||
fail() { echo -e "[FAIL] $*" >&2; exit 1; }
|
||||
|
||||
# Opt-in guard
|
||||
if [ "${SMOKES_ENABLE_NYVM_WRAPPER:-0}" != "1" ]; then
|
||||
skip "SMOKES_ENABLE_NYVM_WRAPPER!=1"
|
||||
fi
|
||||
|
||||
if [ ! -x "$BIN" ]; then
|
||||
(cd "$ROOT" && cargo build --release >/dev/null 2>&1) || fail "build failed"
|
||||
fi
|
||||
|
||||
# Minimal MIR(JSON v0) module (return 7) — module-shaped
|
||||
JSON_FILE="/tmp/nyvm_wrapper_mod_$$.json"
|
||||
trap 'rm -f "$JSON_FILE"' EXIT
|
||||
cat > "$JSON_FILE" <<'J'
|
||||
{"kind":"MIR","schema_version":"1.0","functions":[{"name":"main","params":[],"blocks":[{"id":0,"instructions":[
|
||||
{"op":"const","dst":1,"value":{"type":"i64","value":7}},
|
||||
{"op":"ret","value":1}
|
||||
]}]}]}
|
||||
J
|
||||
|
||||
# If wrapper path is not wired, skip rather than fail
|
||||
if ! strings "$BIN" 2>/dev/null | grep -q 'NyVmDispatcher'; then
|
||||
skip "binary lacks NyVmDispatcher symbols (wrapper likely not wired)"
|
||||
fi
|
||||
|
||||
# Run via Gate-C to Interpreter (control), then (optionally) wrapper would be tested when wired
|
||||
out=$("$BIN" --json-file "$JSON_FILE" 2>&1 || true)
|
||||
last=$(printf '%s\n' "$out" | awk '/^(✅|ResultType|Result:)/{next} NF{last=$0} END{print last}')
|
||||
if [ "$last" = "7" ]; then
|
||||
pass "nyvm_wrapper_module_json_vm"
|
||||
else
|
||||
echo "$out" >&2
|
||||
fail "nyvm_wrapper_module_json_vm (expected 7, got '$last')"
|
||||
fi
|
||||
|
||||
100
tools/smokes/v2/profiles/quick/core/selfhost_stageb_binop_vm.sh
Normal file
100
tools/smokes/v2/profiles/quick/core/selfhost_stageb_binop_vm.sh
Normal file
@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
# selfhost_stageb_binop_vm.sh — Hako Stage‑B pipeline (ParserBox→FlowEntry) binop canary (opt‑in)
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
|
||||
ROOT="$ROOT_GIT"
|
||||
else
|
||||
ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
|
||||
fi
|
||||
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
|
||||
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
|
||||
|
||||
warn() { echo -e "[WARN] $*" >&2; }
|
||||
info() { echo -e "[INFO] $*" >&2; }
|
||||
fail() { echo -e "[FAIL] $*" >&2; return 1; }
|
||||
pass() { echo -e "[PASS] $*" >&2; }
|
||||
|
||||
require_hako() {
|
||||
if [ "${SMOKES_ENABLE_STAGEB:-0}" != "1" ]; then
|
||||
warn "SMOKES_ENABLE_STAGEB!=1; skipping Stage‑B canaries"
|
||||
exit 0
|
||||
fi
|
||||
if [ ! -x "$HAKO_BIN" ]; then
|
||||
warn "Hako binary not found: $HAKO_BIN (set HAKO_BIN to override)"
|
||||
warn "Skipping Stage‑B binop canaries"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
hako_compile_to_mir_stageb() {
|
||||
local code="$1"
|
||||
local hako_tmp="/tmp/hako_stageb_binop_$$.hako"
|
||||
local json_out="/tmp/hako_stageb_binop_$$.mir.json"
|
||||
|
||||
printf "%s\n" "$code" > "$hako_tmp"
|
||||
|
||||
local raw="/tmp/hako_stageb_binop_raw_$$.txt"
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 \
|
||||
NYASH_SYNTAX_SUGAR_LEVEL=full \
|
||||
NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
HAKO_PARSER_STAGE3=1 NYASH_PARSER_STAGE3=1 \
|
||||
NYASH_VARMAP_GUARD_STRICT=0 NYASH_BLOCK_SCHEDULE_VERIFY=0 NYASH_PHI_VERIFY=0 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler_stageb.hako" -- --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
awk '/"version":0/ && /"kind":"Program"/ {print; exit}' "$raw" > "$json_out"
|
||||
rm -f "$raw"
|
||||
|
||||
local rc=$?
|
||||
rm -f "$hako_tmp"
|
||||
if [ $rc -ne 0 ] || [ ! -f "$json_out" ]; then
|
||||
warn "Stage‑B compilation failed (rc=$rc)"
|
||||
rm -f "$json_out"
|
||||
return 1
|
||||
fi
|
||||
echo "$json_out"
|
||||
return 0
|
||||
}
|
||||
|
||||
run_mir_via_gate_c() {
|
||||
local json_path="$1"
|
||||
if [ ! -f "$json_path" ]; then warn "JSON file not found: $json_path"; return 1; fi
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 NYASH_NYRT_SILENT_RESULT=1 \
|
||||
out="$("$ROOT/target/release/nyash" --json-file "$json_path" 2>&1)"
|
||||
printf '%s\n' "$out" | awk '/^(✅|ResultType|Result:)/{next} NF{last=$0} END{ if(last) print last }'
|
||||
local rc=$?
|
||||
rm -f "$json_path"
|
||||
return $rc
|
||||
}
|
||||
|
||||
run_hako() {
|
||||
local code="$1"
|
||||
local json_path
|
||||
json_path=$(hako_compile_to_mir_stageb "$code") || return 1
|
||||
run_mir_via_gate_c "$json_path"
|
||||
}
|
||||
|
||||
check_exact() {
|
||||
local expect="$1"; shift
|
||||
local got="$1"; shift
|
||||
local name="$1"; shift
|
||||
if [ "$got" = "$expect" ]; then pass "$name"; return 0; fi
|
||||
printf "Expected: %s\nActual: %s\n" "$expect" "$got" >&2
|
||||
fail "$name"
|
||||
}
|
||||
|
||||
require_hako
|
||||
|
||||
info "Stage‑B binop: 1+2"
|
||||
out=$(run_hako 'box Main { static method main() { print(1+2); } }')
|
||||
check_exact "3" "$out" "stageb_binop_add" || exit 1
|
||||
|
||||
info "Stage‑B binop precedence: 1+2*3"
|
||||
out=$(run_hako 'box Main { static method main() { print(1+2*3); } }')
|
||||
check_exact "7" "$out" "stageb_binop_prec" || exit 1
|
||||
|
||||
exit 0
|
||||
90
tools/smokes/v2/profiles/quick/core/selfhost_stageb_if_vm.sh
Normal file
90
tools/smokes/v2/profiles/quick/core/selfhost_stageb_if_vm.sh
Normal file
@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
# selfhost_stageb_if_vm.sh — Hako Stage‑B pipeline if-statement canary (opt‑in)
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
|
||||
ROOT="$ROOT_GIT"
|
||||
else
|
||||
ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
|
||||
fi
|
||||
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
|
||||
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
|
||||
|
||||
warn() { echo -e "[WARN] $*" >&2; }
|
||||
info() { echo -e "[INFO] $*" >&2; }
|
||||
fail() { echo -e "[FAIL] $*" >&2; return 1; }
|
||||
pass() { echo -e "[PASS] $*" >&2; }
|
||||
|
||||
require_hako() {
|
||||
if [ "${SMOKES_ENABLE_STAGEB:-0}" != "1" ]; then
|
||||
warn "SMOKES_ENABLE_STAGEB!=1; skipping Stage‑B canaries"
|
||||
exit 0
|
||||
fi
|
||||
if [ ! -x "$HAKO_BIN" ]; then
|
||||
warn "Hako binary not found: $HAKO_BIN (set HAKO_BIN to override)"
|
||||
warn "Skipping Stage‑B if canaries"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
hako_compile_to_mir_stageb() {
|
||||
local code="$1"
|
||||
local hako_tmp="/tmp/hako_stageb_if_$$.hako"
|
||||
local json_out="/tmp/hako_stageb_if_$$.mir.json"
|
||||
printf "%s\n" "$code" > "$hako_tmp"
|
||||
|
||||
local raw="/tmp/hako_stageb_if_raw_$$.txt"
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 NYASH_SYNTAX_SUGAR_LEVEL=full NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
HAKO_PARSER_STAGE3=1 NYASH_PARSER_STAGE3=1 \
|
||||
NYASH_VARMAP_GUARD_STRICT=0 NYASH_BLOCK_SCHEDULE_VERIFY=0 NYASH_PHI_VERIFY=0 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler_stageb.hako" -- --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
awk '/"version":0/ && /"kind":"Program"/ {print; exit}' "$raw" > "$json_out"
|
||||
rm -f "$raw" "$hako_tmp"
|
||||
|
||||
if [ ! -f "$json_out" ]; then
|
||||
warn "Stage‑B compilation failed"
|
||||
return 1
|
||||
fi
|
||||
echo "$json_out"
|
||||
}
|
||||
|
||||
run_mir_via_gate_c() {
|
||||
local json_path="$1"
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 NYASH_NYRT_SILENT_RESULT=1 \
|
||||
out="$("$ROOT/target/release/nyash" --json-file "$json_path" 2>&1)"
|
||||
printf '%s\n' "$out" | awk '/^(✅|ResultType|Result:)/{next} NF{last=$0} END{ if(last) print last }'
|
||||
rm -f "$json_path"
|
||||
}
|
||||
|
||||
run_hako() {
|
||||
local code="$1"
|
||||
local json_path
|
||||
json_path=$(hako_compile_to_mir_stageb "$code") || return 1
|
||||
run_mir_via_gate_c "$json_path"
|
||||
}
|
||||
|
||||
check_exact() {
|
||||
local expect="$1"; shift
|
||||
local got="$1"; shift
|
||||
local name="$1"; shift
|
||||
if [ "$got" = "$expect" ]; then pass "$name"; return 0; fi
|
||||
printf "Expected: %s\nActual: %s\n" "$expect" "$got" >&2
|
||||
fail "$name"
|
||||
}
|
||||
|
||||
require_hako
|
||||
|
||||
info "Stage‑B if: true branch"
|
||||
out=$(run_hako 'box Main { static method main() { if(5>4){ print(1); } } }')
|
||||
check_exact "1" "$out" "stageb_if_true" || exit 1
|
||||
|
||||
info "Stage‑B if: false branch"
|
||||
out=$(run_hako 'box Main { static method main() { if(4>5){ print(1); } } }')
|
||||
check_exact "" "$out" "stageb_if_false" || exit 1
|
||||
|
||||
exit 0
|
||||
108
tools/smokes/v2/profiles/quick/core/selfhost_stageb_index_vm.sh
Normal file
108
tools/smokes/v2/profiles/quick/core/selfhost_stageb_index_vm.sh
Normal file
@ -0,0 +1,108 @@
|
||||
#!/bin/bash
|
||||
# selfhost_stageb_index_vm.sh — Hako Stage‑B pipeline index operator canary (opt‑in)
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
|
||||
ROOT="$ROOT_GIT"
|
||||
else
|
||||
ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
|
||||
fi
|
||||
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
|
||||
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
|
||||
|
||||
warn() { echo -e "[WARN] $*" >&2; }
|
||||
info() { echo -e "[INFO] $*" >&2; }
|
||||
fail() { echo -e "[FAIL] $*" >&2; return 1; }
|
||||
pass() { echo -e "[PASS] $*" >&2; }
|
||||
|
||||
require_hako() {
|
||||
if [ "${SMOKES_ENABLE_STAGEB:-0}" != "1" ]; then
|
||||
warn "SMOKES_ENABLE_STAGEB!=1; skipping Stage‑B canaries"
|
||||
exit 0
|
||||
fi
|
||||
if [ ! -x "$HAKO_BIN" ]; then
|
||||
warn "Hako binary not found: $HAKO_BIN (set HAKO_BIN to override)"
|
||||
warn "Skipping Stage‑B index canaries"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
hako_compile_to_mir_stageb() {
|
||||
local code="$1"
|
||||
local hako_tmp="/tmp/hako_stageb_idx_$$.hako"
|
||||
local json_out="/tmp/hako_stageb_idx_$$.mir.json"
|
||||
printf "%s\n" "$code" > "$hako_tmp"
|
||||
|
||||
local raw="/tmp/hako_stageb_idx_raw_$$.txt"
|
||||
NYASH_PARSER_ALLOW_SEMICOLON=1 NYASH_SYNTAX_SUGAR_LEVEL=full NYASH_ENABLE_ARRAY_LITERAL=1 \
|
||||
HAKO_ALLOW_USING_FILE=1 NYASH_ALLOW_USING_FILE=1 \
|
||||
HAKO_PARSER_STAGE3=1 NYASH_PARSER_STAGE3=1 \
|
||||
NYASH_VARMAP_GUARD_STRICT=0 NYASH_BLOCK_SCHEDULE_VERIFY=0 NYASH_PHI_VERIFY=0 \
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
|
||||
"$ROOT/target/release/nyash" --backend vm \
|
||||
"$ROOT/lang/src/compiler/entry/compiler_stageb.hako" -- --source "$(cat "$hako_tmp")" > "$raw" 2>&1
|
||||
awk '/"version":0/ && /"kind":"Program"/ {print; exit}' "$raw" > "$json_out"
|
||||
rm -f "$raw" "$hako_tmp"
|
||||
|
||||
if [ ! -f "$json_out" ]; then
|
||||
warn "Stage‑B compilation failed"
|
||||
return 1
|
||||
fi
|
||||
echo "$json_out"
|
||||
}
|
||||
|
||||
run_mir_via_gate_c() {
|
||||
local json_path="$1"
|
||||
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 NYASH_NYRT_SILENT_RESULT=1 \
|
||||
out="$("$ROOT/target/release/nyash" --json-file "$json_path" 2>&1)"
|
||||
printf '%s\n' "$out" | awk '/^(✅|ResultType|Result:)/{next} NF{last=$0} END{ if(last) print last }'
|
||||
rm -f "$json_path"
|
||||
}
|
||||
|
||||
run_hako() {
|
||||
local code="$1"
|
||||
local json_path
|
||||
json_path=$(hako_compile_to_mir_stageb "$code") || return 1
|
||||
run_mir_via_gate_c "$json_path"
|
||||
}
|
||||
|
||||
check_exact() {
|
||||
local expect="$1"; shift
|
||||
local got="$1"; shift
|
||||
local name="$1"; shift
|
||||
if [ "$got" = "$expect" ]; then pass "$name"; return 0; fi
|
||||
printf "Expected: %s\nActual: %s\n" "$expect" "$got" >&2
|
||||
fail "$name"
|
||||
}
|
||||
|
||||
require_hako
|
||||
|
||||
info "Stage‑B index: array read"
|
||||
out=$(run_hako 'box Main { static method main() { local a=[1,2,3]; print(a[0]); } }')
|
||||
check_exact "1" "$out" "stageb_index_array_read" || exit 1
|
||||
|
||||
info "Stage‑B index: array write"
|
||||
out=$(run_hako 'box Main { static method main() { local a=[1,2]; a[1]=9; print(a[1]); } }')
|
||||
check_exact "9" "$out" "stageb_index_array_write" || exit 1
|
||||
|
||||
info "Stage‑B index: map rw"
|
||||
out=$(run_hako 'box Main { static method main() { local m={"a":1}; m["b"]=7; print(m["b"]); } }')
|
||||
check_exact "7" "$out" "stageb_index_map_rw" || exit 1
|
||||
|
||||
info "Stage‑B index: nested array"
|
||||
out=$(run_hako 'box Main { static method main() { local a=[[1,2],[3,4]]; print(a[1][0]); } }')
|
||||
check_exact "3" "$out" "stageb_index_nested_array" || exit 1
|
||||
|
||||
info "Stage‑B index: missing map key diagnostic"
|
||||
if run_hako 'box Main { static method main() { local m={"a":1}; print(m["c"]); } }' >/tmp/hako_stageb_idx_diag.txt 2>&1; then
|
||||
warn "expected failure but command succeeded"
|
||||
cat /tmp/hako_stageb_idx_diag.txt >&2
|
||||
fail "stageb_index_map_missing_diag" || exit 1
|
||||
else
|
||||
pass "stageb_index_map_missing_diag"
|
||||
fi
|
||||
rm -f /tmp/hako_stageb_idx_diag.txt
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user