{ "pass": 66, "fail": 0, "runtime": "luau-web 1.4.0 (Luau compiled to WASM)", "tests": [ { "name": "core: Signal: Connect/Fire passes all arguments", "ok": true }, { "name": "core: Signal: Once fires a single time", "ok": true }, { "name": "core: Signal: Disconnect during Fire does not skip other handlers", "ok": true }, { "name": "core: Signal: Wait yields until Fire and returns its values", "ok": true }, { "name": "core: Signal: an erroring handler does not stop the others", "ok": true }, { "name": "core: Signal: DisconnectAll", "ok": true }, { "name": "core: Cleanup: cleans functions, connections, instances and tables in reverse order", "ok": true }, { "name": "core: Cleanup: cancels a waiting thread", "ok": true }, { "name": "core: Cleanup: AttachTo cleans when the instance is destroyed", "ok": true }, { "name": "core: Format.abbreviate: suffixes and no false round-up", "ok": true }, { "name": "core: Format.commas", "ok": true }, { "name": "core: Format.clock and duration", "ok": true }, { "name": "core: Format.ordinal and percent", "ok": true }, { "name": "example: Example server: join, click, codes, daily, purchase, rebirth, leave, rejoin", "ok": true }, { "name": "savedata: SaveData: new player gets a copy of the template", "ok": true }, { "name": "savedata: SaveData: data survives leave and rejoin", "ok": true }, { "name": "savedata: SaveData: session lock blocks a second server until the first releases", "ok": true }, { "name": "savedata: SaveData: a stale lock from a crashed server is taken over", "ok": true }, { "name": "savedata: SaveData: a server that lost its lock stops writing (no item duplication)", "ok": true }, { "name": "savedata: SaveData: retries through DataStore outages", "ok": true }, { "name": "savedata: SaveData: template reconcile adds new keys to old saves", "ok": true }, { "name": "savedata: SaveData: migrations run in order once", "ok": true }, { "name": "savedata: SaveData: autosave writes on the interval", "ok": true }, { "name": "savedata: SaveData: shutdown releases every profile", "ok": true }, { "name": "savedata: SaveData: player who leaves mid-load does not keep the lock", "ok": true }, { "name": "savedata: SaveData: Erase and Peek", "ok": true }, { "name": "savedata: SaveData: saves are DataStore-safe (JSON round trip)", "ok": true }, { "name": "savedata: Receipts: grants once and saves before acknowledging", "ok": true }, { "name": "savedata: Receipts: player not in this server -> NotProcessedYet", "ok": true }, { "name": "savedata: Receipts: failed save -> NotProcessedYet, retry grants nothing extra", "ok": true }, { "name": "savedata: Receipts: grant that errors does not consume the purchase", "ok": true }, { "name": "savedata: Receipts: keeps only the last 100 purchase ids", "ok": true }, { "name": "systems: Codes: case/space-insensitive, once per player", "ok": true }, { "name": "systems: Codes: unknown, expired, level-gated and over-long codes", "ok": true }, { "name": "systems: Codes: brute-force throttle (5 tries / 30 s)", "ok": true }, { "name": "systems: Codes: a failing reward is not marked used", "ok": true }, { "name": "systems: DailyRewards: streak grows day by day and cycles", "ok": true }, { "name": "systems: DailyRewards: missing a day resets the streak, grace keeps it", "ok": true }, { "name": "systems: DailyRewards: reset hour", "ok": true }, { "name": "systems: PlaytimeRewards: gifts unlock on server time only", "ok": true }, { "name": "systems: PlaytimeRewards: persist mode carries progress through a rejoin the same day", "ok": true }, { "name": "systems: Leaderboard: global top list, throttled submits, names", "ok": true }, { "name": "systems: Leaderboard: log encoding keeps huge values sortable", "ok": true }, { "name": "systems: Leaderboard: leaderstats folder mirrors profile data", "ok": true }, { "name": "systems: LootTable: odds add up and match the weights", "ok": true }, { "name": "systems: LootTable: 100,000 seeded rolls land within 1% of the odds", "ok": true }, { "name": "systems: LootTable: luck boosts rare entries and Odds shows it", "ok": true }, { "name": "systems: LootTable: pity guarantees the rarity after N misses", "ok": true }, { "name": "systems: Inventory: stacks, capacity and leftovers", "ok": true }, { "name": "systems: Inventory: remove is all-or-nothing and unequips at zero", "ok": true }, { "name": "systems: Inventory: saved shape survives a DataStore round trip", "ok": true }, { "name": "systems: Inventory: Changed fires with the new count", "ok": true }, { "name": "systems: Currency: multipliers, spend and cap", "ok": true }, { "name": "systems: Currency: rebirth cost grows, resets wallet and boosts earnings", "ok": true }, { "name": "systems: Currency: Changed signal reports delta", "ok": true }, { "name": "tools: RemoteGuard: numbers reject NaN, inf and out-of-range", "ok": true }, { "name": "tools: RemoteGuard: strings, enums, optional and booleans", "ok": true }, { "name": "tools: RemoteGuard: arrays and shapes", "ok": true }, { "name": "tools: RemoteGuard: token bucket rate limit per player", "ok": true }, { "name": "tools: Cooldown: per player and action", "ok": true }, { "name": "tools: Cooldown: export / import for long cooldowns", "ok": true }, { "name": "tools: StateMachine: enter/exit order, allowed transitions, timers", "ok": true }, { "name": "tools: StateMachine: a pending timer is cancelled by a manual change", "ok": true }, { "name": "tools: Spring: critically damped settles without overshoot", "ok": true }, { "name": "tools: Spring: underdamped overshoots, then settles; frame-rate independent", "ok": true }, { "name": "tools: Spring: overdamped is stable with huge steps", "ok": true } ] }