Class PlayerDisconnectedReturnCoercionTest

java.lang.Object
scripting.PlayerDisconnectedReturnCoercionTest

public class PlayerDisconnectedReturnCoercionTest extends Object
回歸測試:EventInstanceManager.playerDisconnected 的「回傳值型別強制」(R14 類別)。

背景:KerningPQ/LudiPQ/ZakumPQ 的 playerDisconnected 回傳負整數(-2/-3/-4), EventInstanceManager 以此決定「隊長離線是否清場」。Nashorn 對整數型 JS number 回傳 Double,但 GraalJS 回傳 Integer/Long → 舊寫法 ((Double) ...).byteValue() 在 GraalJS 下丟 ClassCastException,被 catch 吞成 ret=0 → 隊長離線永不清場(2026-06-02 實機驗證 KerningPQ 抓到)。

修正:改用 ((Number) r).byteValue()(比照同檔 monsterValue 的多型別處理)。 本測試把「GraalJS 整數回傳須能正確還原成負值」這個不變式釘住,防止日後又退回硬轉 (Double)

GraalJsSeamTest 早已註明此 boxed-型別差異屬「已知類別 R14」、留待逐類別 differ 覆蓋 (見其 coercionAndStringTranscriptsMatchAcrossEngines 的尾註);本檔即補上 event 回傳路徑這一塊。

不需 DB / wz / 網路 / Timer。
  • Constructor Details

    • PlayerDisconnectedReturnCoercionTest

      public PlayerDisconnectedReturnCoercionTest()
  • Method Details

    • graalIntegerReturnCoercesViaNumber

      public void graalIntegerReturnCoercesViaNumber() throws Exception
      核心不變式:GraalJS 回傳的整數,經修正後的 Number.byteValue() 必須還原成原值(含 KerningPQ -2 / LudiPQ -3 / ZakumPQ -4)。
      Throws:
      Exception
    • oldDoubleCastWouldThrowOnGraal

      public void oldDoubleCastWouldThrowOnGraal() throws Exception
      根因釘樁:GraalJS 對整數回傳「非 Double」,故舊的 (Double) 硬轉必丟 ClassCastException —— 這正是隊長離線不清場的根因。 若日後 GraalJS 改回傳 Double 使本斷言失敗,請一併複查 EventInstanceManager.playerDisconnected 的還原邏輯。
      Throws:
      Exception
    • goldenNashornAlsoReturnsNonDoubleNumber

      public void goldenNashornAlsoReturnsNonDoubleNumber() throws Exception
      差異記錄(經實測修正):nashorn-core 15.7「黃金參考」對 return -2 回傳的也是 Integer(非 Double) —— 代表舊的 (Double) 硬轉在黃金參考下同樣會炸, 此 (Double) 寫法是潛伏的脆弱碼,GraalJS 只是讓它必然現形。 故 instanceof Number 修正是 engine-agnostic 的正解(兩引擎皆需且皆安全)。
      Throws:
      Exception