String literals and test names in benilla-app carry no record numbers (#368)
The strings pass for `benilla-app`, the last crate: string literals and test names lose the private record numbers and the workspace's words that a comment pass cannot touch. Fixes #92. Fixes #36. - **Messages.** About 230 assertion, panic, `expect` and log messages, printed tool labels, and comments inside embedded Lua fixtures drop their record numbers; the eight that named "the director" keep their fact in plain words. Stale claims in a few messages are corrected on the way (a cast-bar step, a font line, the every-shot recompute). - **Names.** Seven test and helper names that carried a record number or "director" now say what they check. `git grep` found no other use of any of them. - **Player files.** The key-bindings file's header and `config.toml`'s header each lose a record citation. Neither header is compared when the file is read back: the bindings reader skips every `#` line, and `config.toml`'s header is a TOML comment. - **Fixtures.** Test fixtures use neutral character, account and frame names. - **#36.** The quest-material test labels GameObject type 10 GOOBER (in 1.12, 3 is CHEST, 9 TEXT, 10 GOOBER); the code under test was already right, and the comments were fixed with the comment pass. - **Verification.** With comments stripped and every literal's contents masked, each file is identical to main and keeps its literals' line counts, apart from the renamed functions and one rustfmt reflow. `cargo fmt --check` is clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
committed by
GitHub
co-authored by
Claude Opus 5.5
parent
f98c1a5396
commit
b50efc0a53
@@ -99,7 +99,7 @@ fn surface_report(deep: bool, dump_path: Option<String>) {
|
||||
}
|
||||
}
|
||||
|
||||
println!("\n SURFACE DIFF — our _G vs the captured 1.12 _G (decision 1189)");
|
||||
println!("\n SURFACE DIFF — our _G vs the captured 1.12 _G");
|
||||
println!(" FrameXML digest : {}", addon_harness::framexml_digest());
|
||||
println!(" reference names : {}", reference.len());
|
||||
println!(" ours : {}", ours.len());
|
||||
@@ -131,7 +131,7 @@ fn surface_report(deep: bool, dump_path: Option<String>) {
|
||||
extra_by_kind.entry(kind).or_default().push(name);
|
||||
}
|
||||
println!(
|
||||
"\n PUBLISHED BY US, ABSENT FROM 1.12 ({}) — a superset is not free (1189):",
|
||||
"\n PUBLISHED BY US, ABSENT FROM 1.12 ({}) — a superset is not free:",
|
||||
extra.len()
|
||||
);
|
||||
for (kind, names) in &extra_by_kind {
|
||||
@@ -160,7 +160,7 @@ fn surface_report(deep: bool, dump_path: Option<String>) {
|
||||
println!(
|
||||
" ^ read these: an unprefixed verb 1.12 lacks is what `if SomeName then` finds.\n \
|
||||
Most are our own UI's helpers (KeyBindings_*, Options*), which are only\n \
|
||||
a naming question — but a POST-1.12 API name here is 1189's hazard exactly, because an\n \
|
||||
a naming question — but a POST-1.12 API name here is the hazard, because an\n \
|
||||
addon that feature-tests it takes a branch written for a client we are not."
|
||||
);
|
||||
}
|
||||
@@ -411,7 +411,7 @@ fn main() {
|
||||
let strict = reports.iter().filter(|r| r.errors.is_empty()).count();
|
||||
println!(
|
||||
" (…{} of those name a file their own package does not contain, which the reference \
|
||||
logs and carries on from; the pre-2155 column counted those as failures: {strict}/{})",
|
||||
logs and carries on from; the strict column counts those as failures: {strict}/{})",
|
||||
loaded - strict,
|
||||
reports.len()
|
||||
);
|
||||
@@ -704,11 +704,11 @@ fn main() {
|
||||
// library replicated into many addons inflates a row.
|
||||
println!("\n most-wanted missing METHODS — addons that NAME each as obj:Name(), and");
|
||||
println!(" no widget answers. NOT a blocker list and NOT a build queue:");
|
||||
println!(" · a big number is usually ONE library file replicated (1207/1210), and");
|
||||
println!(" · a big number is usually ONE library file replicated, and");
|
||||
println!(
|
||||
" · a third-party library's own method on its own object is not ours to write."
|
||||
);
|
||||
println!(" Open the call site before ranking it (decision 1240).");
|
||||
println!(" Open the call site before ranking it.");
|
||||
ranked(methods, 16);
|
||||
}
|
||||
|
||||
@@ -896,8 +896,8 @@ fn main() {
|
||||
println!("\n DIFF vs {path}: REFUSED — the baseline is at a different tree");
|
||||
println!(" baseline digest {was} this run {now}");
|
||||
println!(
|
||||
" A delta across two digests is not attributable to your change \
|
||||
(decision 1209).\n Re-take the baseline on this tree: \
|
||||
" A delta across two digests is not attributable \
|
||||
to your change.\n Re-take the baseline on this tree: \
|
||||
--status <file>, then re-run --diff."
|
||||
);
|
||||
return;
|
||||
|
||||
@@ -694,12 +694,12 @@ fn drive_ui_probe(script: &mut UiScript) -> Vec<String> {
|
||||
-- HOVER. Nothing above puts a tooltip on screen, and a whole class of addon only runs
|
||||
-- there: hooks on GameTooltip's OnShow/OnHide, the FrameXML globals an addon replaces
|
||||
-- (GameTooltip_SetDefaultAnchor), and the ones that SCRAPE the line regions
|
||||
-- (`GameTooltipTextLeft1:GetText()`). Decision 1220 fixed a raise squarely in that class
|
||||
-- and this column could not see it, which is the reason this block exists.
|
||||
-- (`GameTooltipTextLeft1:GetText()`). A raise squarely in that class is invisible to the
|
||||
-- calls above, which is the reason this block exists.
|
||||
--
|
||||
-- Each call is guarded on the global being a FUNCTION, not merely non-nil: an unguarded
|
||||
-- call to a missing FrameXML global would land in every addon's probe column as that
|
||||
-- addon's fault, which is exactly the mis-attribution 1209 was written about.
|
||||
-- addon's fault, which is exactly the mis-attribution the probe must never make.
|
||||
if GameTooltip and UIParent then
|
||||
if type(GameTooltip_SetDefaultAnchor) == "function" then
|
||||
try(function() GameTooltip_SetDefaultAnchor(GameTooltip, UIParent) end)
|
||||
@@ -3120,8 +3120,8 @@ mod dependency_tests {
|
||||
wants.absent_foreign_files,
|
||||
vec!["Interface/AddOns/NotInstalled/templates.xml".to_string()],
|
||||
"`..` is collapsed the way the client collapses it, and the RESOLVED path is what is \
|
||||
reported — the collapse is the interesting half. The path is INSTALL-relative since \
|
||||
2155, which is the space the reference's file layer is actually handed: this exact \
|
||||
reported — the collapse is the interesting half. The path is INSTALL-relative, \
|
||||
which is the space the reference's file layer is actually handed: this exact \
|
||||
shape is Auctioneer's, and its real neighbour resolves off the chain now."
|
||||
);
|
||||
assert!(
|
||||
@@ -3718,7 +3718,7 @@ mod dependency_tests {
|
||||
assert_eq!(
|
||||
called_on("ScrollingMessageFrame"),
|
||||
vec!["ScrollingMessageFrame:SetInsertMode (on MessageFrame)".to_string()],
|
||||
"the row 1228 could not print: the sibling that DOES answer it is named, because \
|
||||
"a missing verb's row names the sibling that DOES answer it, because \
|
||||
`wire the kind` and `write the verb` are different jobs"
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -141,7 +141,7 @@ fn the_render_column_can_fail() {
|
||||
/// `!OmniCC` paints through an anonymous frame parented to an existing cooldown, an overlay;
|
||||
/// Bagnon builds its own window of item-slot buttons.
|
||||
#[test]
|
||||
fn the_directors_two_verified_addons_come_out_on_opposite_sides() {
|
||||
fn omnicc_and_bagnon_come_out_on_opposite_sides() {
|
||||
benilla_formats::wow_data_or_skip!();
|
||||
// A skip the gate can refuse (`benilla_formats::install`).
|
||||
let corpus = benilla_formats::addon_corpus_or_skip!();
|
||||
@@ -162,7 +162,7 @@ fn the_directors_two_verified_addons_come_out_on_opposite_sides() {
|
||||
assert_eq!(
|
||||
row("!OmniCC").render.drew(),
|
||||
Drew::Overlay,
|
||||
"!OmniCC's countdown text is on the director's screen; it paints via an ANONYMOUS frame \
|
||||
"!OmniCC's countdown text draws in the live client; it paints via an ANONYMOUS frame \
|
||||
parented to a cooldown of ours, which is precisely what a name-based check cannot see"
|
||||
);
|
||||
|
||||
@@ -177,7 +177,7 @@ fn the_directors_two_verified_addons_come_out_on_opposite_sides() {
|
||||
.frames
|
||||
.iter()
|
||||
.any(|f| f.starts_with("BagnonItem")),
|
||||
"…and the slots are what it draws — the exact thing the director could not see: {:?}",
|
||||
"…and the slots are what it draws — the item slots a player sees: {:?}",
|
||||
row("Bagnon").render.frames
|
||||
);
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ fn the_use_column_can_fail() {
|
||||
/// so it is `untouched`. Bagnon's item slots must be reachable (`driven >= 1` on a `BagnonItem*`
|
||||
/// frame); whether they raise is not asserted here.
|
||||
#[test]
|
||||
fn the_directors_two_verified_addons_are_reachable_and_omnicc_is_not_broken() {
|
||||
fn bagnon_is_reachable_and_omnicc_is_not_broken() {
|
||||
benilla_formats::wow_data_or_skip!();
|
||||
// A skip the gate can refuse (`benilla_formats::install`).
|
||||
let corpus = benilla_formats::addon_corpus_or_skip!();
|
||||
@@ -222,7 +222,7 @@ fn the_directors_two_verified_addons_are_reachable_and_omnicc_is_not_broken() {
|
||||
assert_ne!(
|
||||
omni.used.verdict(),
|
||||
Used::Raised,
|
||||
"!OmniCC is on the director's screen and works; a column that calls it broken is broken \
|
||||
"!OmniCC draws in the live client and works; a column that calls it broken is broken \
|
||||
itself: {:?}",
|
||||
omni.used.errors
|
||||
);
|
||||
@@ -230,7 +230,7 @@ fn the_directors_two_verified_addons_are_reachable_and_omnicc_is_not_broken() {
|
||||
let bagnon = row("Bagnon");
|
||||
assert!(
|
||||
bagnon.used.driven >= 1,
|
||||
"Bagnon draws bag slots the director can put a cursor on; the probe must be able to reach \
|
||||
"Bagnon draws bag slots a player can put a cursor on; the probe must be able to reach \
|
||||
at least one (drew={:?} touchable={})",
|
||||
bagnon.render.frames,
|
||||
bagnon.used.touchable
|
||||
@@ -241,7 +241,7 @@ fn the_directors_two_verified_addons_are_reachable_and_omnicc_is_not_broken() {
|
||||
.frames
|
||||
.iter()
|
||||
.any(|f| f.starts_with("BagnonItem")),
|
||||
"…and the thing it touched must be a SLOT — the exact widget the director hovered: {:?}",
|
||||
"…and the thing it touched must be a SLOT — the exact widget a player hovers: {:?}",
|
||||
bagnon.used.frames
|
||||
);
|
||||
}
|
||||
|
||||
@@ -394,7 +394,7 @@ fn trace_edge(what: &str, entity: Entity, spell_id: u32, n: &AuraNodes) {
|
||||
benilla_assets::trace::line(
|
||||
"aur",
|
||||
&format!(
|
||||
"{what} e={entity} spell={spell_id} alpha={alphas:?}{tint}{rate} base {:.2} cur {:.2} target {:.2}",
|
||||
"{what} e={entity} spell={spell_id} alpha={alphas:?}{tint}{rate} -> base {:.2} cur {:.2} target {:.2}",
|
||||
n.base,
|
||||
n.current,
|
||||
n.target()
|
||||
|
||||
@@ -1020,7 +1020,7 @@ mod tests {
|
||||
app.update();
|
||||
assert!(
|
||||
state(&app).pressed(cmd::MOVE_FORWARD),
|
||||
"holding W and opening the chat box keeps you running (2196)"
|
||||
"holding W and opening the chat box keeps you running"
|
||||
);
|
||||
assert_eq!(
|
||||
lua_count(&app, "PROBE_UP"),
|
||||
@@ -1231,7 +1231,7 @@ mod tests {
|
||||
app.update();
|
||||
assert!(
|
||||
state(&app).pressed(cmd::MOVE_FORWARD),
|
||||
"the first repeat after re-activation re-latches (2204)"
|
||||
"the first repeat after re-activation re-latches"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1282,7 +1282,7 @@ mod tests {
|
||||
app.update();
|
||||
assert!(
|
||||
state(&app).pressed(cmd::MOVE_FORWARD),
|
||||
"SHIFT-W falls back to W — the whole point of 1142"
|
||||
"an unbound SHIFT-W falls back to W, the modifier dropped"
|
||||
);
|
||||
// It unlatches on the base key with the modifier still down (the reference replays the
|
||||
// press-time chord at key-up, `0x483bd0`; latching the resolved command is equivalent).
|
||||
@@ -1302,7 +1302,7 @@ mod tests {
|
||||
app.update();
|
||||
assert!(
|
||||
state(&app).fired(cmd::TOGGLE_UI),
|
||||
"ALT-Z is TOGGLEUI (0870)"
|
||||
"ALT-Z is TOGGLEUI: the exact chord probes first"
|
||||
);
|
||||
assert!(!state(&app).fired(cmd::TOGGLE_SHEATH));
|
||||
// CTRL-ALT-Z fires nothing: the single strip drops the leftmost modifier (`ALT-CTRL-Z`
|
||||
@@ -1454,7 +1454,7 @@ mod tests {
|
||||
app.update();
|
||||
assert!(
|
||||
state(&app).pressed(cmd::MOVE_FORWARD),
|
||||
"the frame ate the toggle key; you are still running (2196)"
|
||||
"the frame ate the toggle key; you are still running"
|
||||
);
|
||||
|
||||
// The eaten key loses its binding...
|
||||
@@ -1613,7 +1613,7 @@ mod tests {
|
||||
assert!(open(&app, 0), "B opens the backpack");
|
||||
assert!(
|
||||
!open(&app, 2),
|
||||
"B does NOT open the equipped bag — this is the bug 1494 fixes"
|
||||
"B does NOT open the equipped bag — TOGGLEBACKPACK opens the backpack alone"
|
||||
);
|
||||
|
||||
// B again: bag 0 is open, so this is the close arm.
|
||||
|
||||
@@ -1734,47 +1734,47 @@ pub(crate) static ABSENT: &[Absent] = &[
|
||||
absent!(
|
||||
"TOGGLESTATS",
|
||||
["ToggleStats"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLETRIS",
|
||||
["ToggleTris"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLEPORTALS",
|
||||
["TogglePortals"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLECOLLISION",
|
||||
["ToggleCollision"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLECOLLISIONDISPLAY",
|
||||
["ToggleCollisionDisplay"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLEPLAYERBOUNDS",
|
||||
["TogglePlayerBounds"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLEPERFORMANCEDISPLAY",
|
||||
["TogglePerformanceDisplay"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"TOGGLEPERFORMANCEVALUES",
|
||||
["TogglePerformanceValues"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
absent!(
|
||||
"RESETPERFORMANCEVALUES",
|
||||
["ResetPerformanceValues"],
|
||||
"a dev-plane instrument (1043)"
|
||||
"a dev-plane instrument on a dev chord"
|
||||
),
|
||||
// ── The mouse's own three (hidden) ──────────────────────────────────────────────────
|
||||
// The reference's mouse-look bindings (BUTTON2, BUTTON1, CTRL-BUTTON1), hidden from the
|
||||
@@ -1909,7 +1909,7 @@ mod tests {
|
||||
s.run_on_up(),
|
||||
reference_run_on_up,
|
||||
"{}: runOnUp disagrees with the install's Bindings.xml — that flag decides \
|
||||
whether a press of this command delivers a release half (1295)",
|
||||
whether a press of this command delivers a release half",
|
||||
s.name
|
||||
);
|
||||
let ours: Vec<&str> = [s.d1, s.d2].into_iter().flatten().collect();
|
||||
@@ -2045,7 +2045,7 @@ mod tests {
|
||||
for shipped in ["ToggleCharacter", "ChangeActionBarPage", "ShowUIPanel"] {
|
||||
assert!(
|
||||
defined.contains(shipped),
|
||||
"the assets/ui scan missed `{shipped}`"
|
||||
"the scan missed `{shipped}`, a host registration or a stock chain global"
|
||||
);
|
||||
}
|
||||
// Stock ContainerFrame.lua's, sourced off the chain by `benilla.toc`.
|
||||
|
||||
@@ -23,7 +23,7 @@ pub(crate) fn to_diff(snapshot: &[(String, Vec<String>)]) -> String {
|
||||
.iter()
|
||||
.map(|s| (s.name, [s.d1, s.d2].into_iter().flatten().collect()))
|
||||
.collect();
|
||||
let mut out = String::from("# benilla key bindings (decision 0997) — diff vs defaults\n");
|
||||
let mut out = String::from("# benilla key bindings — diff vs defaults\n");
|
||||
for (name, keys) in snapshot {
|
||||
let is_default = defaults
|
||||
.get(name.as_str())
|
||||
|
||||
@@ -837,7 +837,7 @@ fn drive_capture(
|
||||
{
|
||||
error!(
|
||||
"capture: settled image is EMPTY — every color channel is zero; the \
|
||||
scene rendered nothing (1373)"
|
||||
scene rendered nothing"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,8 +329,8 @@ fn binder_probe(
|
||||
error!(
|
||||
"PROBE_BINDER: FAIL (5 confirm) — no answered question within \
|
||||
{CONFIRM_TIMEOUT_SECS}s of the select: BinderState pending={:?} (wanted \
|
||||
{innkeeper:#x}), CONFIRM_BINDER fired={fired}, arg1={area:?}. Before decision \
|
||||
1331 the packet had no parse arm at all and fell through to \
|
||||
{innkeeper:#x}), CONFIRM_BINDER fired={fired}, arg1={area:?}. A packet with \
|
||||
no parse arm at all falls through to \
|
||||
ServerPacket::Other — that is what this reading looks like.",
|
||||
binder.npc()
|
||||
);
|
||||
@@ -458,8 +458,8 @@ fn assert_icon_and_select(
|
||||
if ty == ICON_TYPE_REGRESSION {
|
||||
error!(
|
||||
"PROBE_BINDER: FAIL (3 icon) — the innkeeper's row {:?} (wire icon={ICON_INNKEEPER}) \
|
||||
maps to {ICON_TYPE_REGRESSION:?}, the chat bubble. THIS IS THE B249 REGRESSION: \
|
||||
decision 1331's table must index byte 5 to {ICON_TYPE_BINDER:?}.",
|
||||
maps to {ICON_TYPE_REGRESSION:?}, the chat bubble. THIS IS THE ICON REGRESSION: \
|
||||
`ui_gossip`'s icon table must index byte 5 to {ICON_TYPE_BINDER:?}.",
|
||||
opt.message
|
||||
);
|
||||
probe.fails += 1;
|
||||
|
||||
@@ -269,7 +269,7 @@ fn book_probe(
|
||||
probe.closed.push(sample);
|
||||
if probe.closed.len() >= SAMPLE_FRAMES {
|
||||
let guid = probe.plaque.unwrap_or_default();
|
||||
info!("PROBE_BOOK: opening the reader on {guid:#x} (the right-click's own route — `ItemTextOpen::open_pages`, decision 1105)");
|
||||
info!("PROBE_BOOK: opening the reader on {guid:#x} (the right-click's own route — `ItemTextOpen::open_pages`)");
|
||||
reader.open_pages(guid);
|
||||
probe.phase = Phase::WaitReady { since: now };
|
||||
}
|
||||
|
||||
@@ -572,7 +572,7 @@ fn charter_probe(
|
||||
format!(
|
||||
"the registrar opened on {npc:#x} but GetGuildCharterCost() reads {cost}, \
|
||||
not {CHARTER_COST_COPPER} (vmangos GUILD_CHARTER_COST, \
|
||||
PetitionsHandler.cpp:39) — the showlist row's charterCost is not what \
|
||||
PetitionsHandler.cpp:38) — the showlist row's charterCost is not what \
|
||||
the getter reads, or the visible-row `&1` rule picked the wrong row"
|
||||
),
|
||||
);
|
||||
@@ -585,8 +585,8 @@ fn charter_probe(
|
||||
"no registrar window within {REGISTRAR_TIMEOUT_SECS}s of the select: \
|
||||
GuildRegistrarState npc={:?} (wanted {npc:#x}), \
|
||||
GuildRegistrarFrame:IsVisible()={visible}, GetGuildCharterCost()={cost}. \
|
||||
Before decision 1672 SMSG_PETITION_SHOWLIST had no parse arm at all and \
|
||||
fell through to ServerPacket::Other — that is what this reading looks \
|
||||
An SMSG_PETITION_SHOWLIST with no parse arm at all \
|
||||
falls through to ServerPacket::Other — that is what this reading looks \
|
||||
like. Lines seen: {:?}",
|
||||
registrar.npc(),
|
||||
probe_lines(&script)
|
||||
@@ -803,8 +803,8 @@ fn charter_probe(
|
||||
click: PetitionFrame:IsVisible()={visible}, petitionType={kind:?}, \
|
||||
isOriginator={originator}, GetNumPetitionNames()={names}. Either the \
|
||||
item-use fork never reached ItemUseRoute::ShowPetition (a charter that \
|
||||
falls through to `Nothing` sends nothing at all — the pre-1672 \
|
||||
behaviour) or the answer never became a window. Lines seen: {:?}",
|
||||
falls through to `Nothing` sends nothing at all — a silent \
|
||||
failure) or the answer never became a window. Lines seen: {:?}",
|
||||
probe_lines(&script)
|
||||
),
|
||||
);
|
||||
@@ -1086,8 +1086,8 @@ fn assert_icon_and_select(
|
||||
"icon",
|
||||
format!(
|
||||
"the charter row {:?} (wire icon={ICON_PETITION}) maps to \
|
||||
{ICON_TYPE_REGRESSION:?}, the chat bubble. That is B249's regression one row \
|
||||
over: decision 1335's table must index byte 7 to {ICON_TYPE_PETITION:?}",
|
||||
{ICON_TYPE_REGRESSION:?}, the chat bubble: the binder's icon regression \
|
||||
one row over: `ui_gossip`'s table must index byte 7 to {ICON_TYPE_PETITION:?}",
|
||||
opt.message
|
||||
),
|
||||
);
|
||||
|
||||
@@ -193,7 +193,7 @@ fn chest_probe(
|
||||
Phase::Wait => {
|
||||
let [x, y, z, map] = target();
|
||||
info!(
|
||||
"PROBE_CHEST: heading to the chest ({x} {y} {z} map {map}) — B84's object, \
|
||||
"PROBE_CHEST: heading to the chest ({x} {y} {z} map {map}) — the kneel target, \
|
||||
GameObject type {GO_TYPE_CHEST}"
|
||||
);
|
||||
let _ = net.0.send(ClientCommand::Chat {
|
||||
|
||||
@@ -95,7 +95,7 @@ pub(crate) const PROBE_VARS: &[ProbeVar] = &[
|
||||
},
|
||||
ProbeVar {
|
||||
name: "WOW_PROBE_HOVER_STEP",
|
||||
purpose: "<secs> — seconds per pointer move (default 0.25; ~0.016 sweeps at frame rate, the director's gesture)",
|
||||
purpose: "<secs> — seconds per pointer move (default 0.25; ~0.016 sweeps at frame rate, like a real hand)",
|
||||
wall_clock: false,
|
||||
},
|
||||
ProbeVar {
|
||||
@@ -239,7 +239,7 @@ pub(crate) const PROBE_VARS: &[ProbeVar] = &[
|
||||
},
|
||||
ProbeVar {
|
||||
name: "WOW_PROBE_BOOK",
|
||||
purpose: "1 — teleport to the Old Town plaque and measure what the item-text reader costs per frame, closed vs open (B240)",
|
||||
purpose: "1 — teleport to the Old Town plaque and measure what the item-text reader costs per frame, closed vs open",
|
||||
wall_clock: true,
|
||||
},
|
||||
ProbeVar {
|
||||
@@ -292,15 +292,15 @@ pub(crate) const PROBE_NAMES: &[(&str, &str)] = &[
|
||||
),
|
||||
(
|
||||
"partner",
|
||||
"the second client that says yes: auto-accept every group invite and duel challenge (0434/0637)",
|
||||
"the second client that says yes: auto-accept every group invite and duel challenge",
|
||||
),
|
||||
(
|
||||
"crossing",
|
||||
"board a cross-continent boat and report the map seam surviving (0455)",
|
||||
"board a cross-continent boat and report the map seam surviving",
|
||||
),
|
||||
(
|
||||
"taxi",
|
||||
"open the flight-master menu on the wire and ride Stormwind → Sentinel Hill to a verdict (0484)",
|
||||
"open the flight-master menu on the wire and ride Stormwind → Sentinel Hill to a verdict",
|
||||
),
|
||||
(
|
||||
"guardpoi",
|
||||
@@ -319,11 +319,11 @@ pub(crate) fn wall_clock_vars() -> impl Iterator<Item = &'static str> {
|
||||
|
||||
/// `WOW_PROBE=list`: prints the registry, one variable per line, then the named values.
|
||||
pub(crate) fn print() {
|
||||
println!("The probe fleet's environment (capture::probe_env, decision 2265 §A5).");
|
||||
println!("The probe fleet's environment (capture::probe_env).");
|
||||
println!(
|
||||
"wall-clock: the variable schedules on elapsed real time and arms the un-occludable probe"
|
||||
);
|
||||
println!("window (ProbeFocusPlugin, decision 0906) — covered, such a run drops to ~1 fps and");
|
||||
println!("window (ProbeFocusPlugin) — covered, such a run drops to ~1 fps and");
|
||||
println!("executes the wrong script.");
|
||||
println!();
|
||||
println!("{:<26} {:<10} PURPOSE", "VARIABLE", "WALL-CLOCK");
|
||||
|
||||
@@ -533,7 +533,7 @@ fn gm_ticket_probe(
|
||||
{ANSWER_TIMEOUT_SECS}s. Wanted arg2 == {want:?}; answers seen after the \
|
||||
baseline: {:?}. leading-byte-swallowed={stray} — if that is true, the server \
|
||||
read our category byte as the first character of the text, which is the \
|
||||
cmangos-classic behaviour decision 1673 records.",
|
||||
cmangos-classic behaviour.",
|
||||
&seen[baseline.min(seen.len())..]
|
||||
);
|
||||
probe.fails += 1;
|
||||
|
||||
@@ -179,7 +179,7 @@ fn guard_poi_probe(
|
||||
format!("POIIcons cell {} at its true spot", poi.icon)
|
||||
}
|
||||
true => "nothing (in range, no Flags&2)".to_string(),
|
||||
false => "the gold guide arrow on the rim, pointing at it (1519)".to_string(),
|
||||
false => "the gold guide arrow on the rim, pointing at it".to_string(),
|
||||
};
|
||||
info!(
|
||||
"PROBE guardpoi: marker \"{}\" at ({:.1}, {:.1}) icon {} flags {} — {d:.1} yd away \
|
||||
|
||||
@@ -247,7 +247,10 @@ fn mail_probe(
|
||||
&& tf.translation.distance(me) < MAILBOX_SCAN_RANGE
|
||||
});
|
||||
if let Some((guid, ..)) = mailbox {
|
||||
info!("PROBE_MAIL: mailbox {:#x} in range — clicking (local open, no packet, decision 0544/0548)", guid.0);
|
||||
info!(
|
||||
"PROBE_MAIL: mailbox {:#x} in range — clicking (local open, no packet)",
|
||||
guid.0
|
||||
);
|
||||
mail.click(guid.0);
|
||||
probe.phase = Phase::WaitList { clicked_at: now };
|
||||
} else if now - sent_at > SCAN_TIMEOUT_SECS {
|
||||
|
||||
@@ -155,7 +155,7 @@ mod tests {
|
||||
offenders.is_empty(),
|
||||
"the probe harness must schedule on the wall clock (`ProbeClock`), not the virtual \
|
||||
clock — it is clamped to max_delta (250 ms), so any hitching leg silently drifts every \
|
||||
`<secs>` knob out from under the operator (decision 0789). Offenders:\n {}",
|
||||
`<secs>` knob out from under the operator. Offenders:\n {}",
|
||||
offenders.join("\n "),
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -784,8 +784,8 @@ mod tests {
|
||||
assert!(locked.contains(&CreateAction::Gender(1)), "female");
|
||||
assert!(
|
||||
locked.contains(&CreateAction::ClassSlot(6)),
|
||||
"mage is slot 6 of [1,2,3,4,5,7,8,9,11] — and it is the mage icon the director saw \
|
||||
unmarked"
|
||||
"mage is slot 6 of [1,2,3,4,5,7,8,9,11] — the mage icon itself must carry the lock, \
|
||||
not sit unmarked"
|
||||
);
|
||||
|
||||
// Moving the selection moves the lock, never lights a second icon.
|
||||
|
||||
@@ -1600,8 +1600,8 @@ mod tests {
|
||||
p.verdict(5).token().as_deref(),
|
||||
Some("INTERFACE_VERSION"),
|
||||
"a manifest with NO `## Interface` parses as 0 and IS out of date — the record ctor \
|
||||
leaves [rec+0x1c]=0 and the gate compares it like any other value (decision 1292, \
|
||||
byte-verified; supersedes 1191 §6's silent-is-current reading)"
|
||||
leaves [rec+0x1c]=0 and the gate compares it like any other value (byte-verified: \
|
||||
a missing line is never read as current)"
|
||||
);
|
||||
|
||||
// Force-load erases the refusal (reason 7 written, then reset to 0), so a ticked box
|
||||
|
||||
@@ -351,7 +351,7 @@ fn relaxed_base_arms_roll_variations_and_the_shuffle_drives_them() {
|
||||
assert_eq!(
|
||||
gait(&app),
|
||||
Some(11),
|
||||
"the settle does not release the shuffle (1655)"
|
||||
"the settle does not release the shuffle"
|
||||
);
|
||||
|
||||
for _ in 0..6 {
|
||||
@@ -1055,7 +1055,7 @@ fn the_swim_relatch_holds_the_kick_but_a_ground_cut_freezes_it() {
|
||||
assert_eq!(
|
||||
drv(&app),
|
||||
super::super::select::Mode::Entering(super::super::select::Special::Jump),
|
||||
"the re-latch holds the kick (0517) — the swim gait waits for its end"
|
||||
"the re-latch holds the kick — the swim gait waits for its end"
|
||||
);
|
||||
let player = app.world().entity(unit).get::<AnimationPlayer>().unwrap();
|
||||
let kick = player
|
||||
@@ -1085,7 +1085,7 @@ fn the_swim_relatch_holds_the_kick_but_a_ground_cut_freezes_it() {
|
||||
assert_eq!(
|
||||
kick.speed(),
|
||||
0.0,
|
||||
"the ground cut is FROZEN mid-pose (0503)"
|
||||
"the ground cut is FROZEN mid-pose: its speed is 0"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2566,7 +2566,7 @@ fn the_mount_transition_takes_bone_0_back_from_a_full_body_one_shot() {
|
||||
assert_eq!(
|
||||
playing(&app),
|
||||
Some(MOUNT),
|
||||
"B203: the mount arm displaces the cast clip — it does not wait for it to finish"
|
||||
"the mount arm displaces the cast clip — it does not wait for it to finish"
|
||||
);
|
||||
|
||||
app.update();
|
||||
@@ -3050,12 +3050,12 @@ fn every_shot_of_a_volley_re_arms_the_fire_clip_through_the_emote_lane() {
|
||||
assert_eq!(
|
||||
mode(&app),
|
||||
FIRING,
|
||||
"…and the base never recomputed out of it"
|
||||
"…and the driver has not seen the completion yet: the base is still the swing"
|
||||
);
|
||||
assert_eq!(
|
||||
gait(&app),
|
||||
None,
|
||||
"…so the pull was not replayed between shots"
|
||||
"…so no gait is picked yet; the recompute and the re-pull come a frame later"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3945,7 +3945,7 @@ mod base_anim_lock {
|
||||
.get::<AnimDriver>()
|
||||
.unwrap()
|
||||
.started_anim,
|
||||
"the bracket walked with its play declined — nothing started, so nothing downstream may read a play out of the mode change (the flinch's eviction, 2076's trail edge)"
|
||||
"the bracket's play was declined: nothing started for the flinch or the trail to read"
|
||||
);
|
||||
advance(&mut app, 16);
|
||||
assert_eq!(
|
||||
|
||||
@@ -354,7 +354,7 @@ mod tests {
|
||||
}
|
||||
assert_eq!(
|
||||
fired_parked, 0,
|
||||
"an unflagged parked rig's event keyframes are not scanned (1482)"
|
||||
"an unflagged parked rig's event keyframes are not scanned"
|
||||
);
|
||||
assert!(fired_twin > 0, "the live twin keeps firing — the control");
|
||||
assert_eq!(
|
||||
|
||||
@@ -436,7 +436,7 @@ fn ranged_spells_merge_the_weapon_visual_into_their_empty_slots() {
|
||||
assert_eq!(
|
||||
(multi.precast, multi.cast),
|
||||
(171, 172),
|
||||
"the empty body-kit slots fill from the weapon — the missing draw/release (B153)"
|
||||
"the empty body-kit slots fill from the weapon — else the draw/release is missing"
|
||||
);
|
||||
assert_eq!(
|
||||
(multi.impact, multi.missile_model, multi.missile_attach),
|
||||
|
||||
@@ -153,7 +153,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
crate::realmlist::CVAR_REALMLIST,
|
||||
crate::realmlist::DEFAULT_REALMLIST,
|
||||
"us.logon.worldofwarcraft.com:3724",
|
||||
"1667: that host has not resolved since 2019, so shipping it makes every first launch a \
|
||||
"that host has not resolved since 2019, so shipping it makes every first launch a \
|
||||
DNS failure; benilla dials the machine it is running on",
|
||||
),
|
||||
// `autoClearAFK` (`0x5e24d4`, "1" `0x82e748`, handle `[0xc4d68c]` set at `0x5e24ef`, read at
|
||||
@@ -183,9 +183,9 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"SoundReverb",
|
||||
"0",
|
||||
"1",
|
||||
"1153: the reference's reverb is EAX-over-hardware and that hardware has not existed \
|
||||
since Vista, so \"1\" would ship audio the real client has never actually produced \
|
||||
(B236)",
|
||||
"the reference's reverb is EAX-over-hardware, and that hardware has not existed since \
|
||||
Vista, so \"1\" would ship audio the real client has never actually produced on any \
|
||||
machine a player runs today",
|
||||
),
|
||||
// FMOD 3's mix-ahead buffer in ms (`0x4571ca`, flags 2: read once at sound init); here it sizes
|
||||
// the render thread's ring ahead of the IO callback (`sound::output`). `0x457520` registers
|
||||
@@ -199,8 +199,8 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
ours(
|
||||
"SoundOutputLimiter",
|
||||
"1",
|
||||
"1551: benilla's own — the reference's FMOD 3 mix needs no such DSP; we sum into f32 \
|
||||
behind a hard clamp, and every WoW SFX is mastered to full scale",
|
||||
"benilla's own — the reference sums at full scale and clips; every WoW SFX is mastered \
|
||||
to full scale, so overlapping kits need a limiter to keep from distorting",
|
||||
),
|
||||
overridden(
|
||||
"uiScale",
|
||||
@@ -238,7 +238,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"autoSelfCast",
|
||||
"1",
|
||||
"0",
|
||||
"1745: with it off, an unbindable friendly cast falls into the reference's \
|
||||
"with it off, an unbindable friendly cast falls into the reference's \
|
||||
targeting-cursor machine, which is unmodeled — leaving no path at all. Flip when that \
|
||||
machine lands",
|
||||
),
|
||||
@@ -312,7 +312,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
ours(
|
||||
"autoLootDefault",
|
||||
"0",
|
||||
"0961: 1.12 has no auto-loot CVar at all — vanilla offers only the shift gesture, so OFF \
|
||||
"1.12 has no auto-loot CVar at all — vanilla offers only the shift gesture, so OFF \
|
||||
IS the reference's own behaviour; the spelling is era's",
|
||||
),
|
||||
// The overhead-name gates, registered at `0x6c7470` into mask `0xce8720`: `UnitNamePlayer`
|
||||
@@ -346,7 +346,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"frillDensity",
|
||||
"32",
|
||||
"16",
|
||||
"1649/1804: the reference's registered 16 is stop 0 and its post-`hwDetect` 24 is on no \
|
||||
"the reference's registered 16 is stop 0 and its post-`hwDetect` 24 is on no \
|
||||
stop at all, so every stop diverges; Medium (32) is the nearest one no sparser than a \
|
||||
fresh install, and erring sparse is the worse failure for ground cover",
|
||||
),
|
||||
@@ -504,7 +504,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"gxApi",
|
||||
"",
|
||||
"direct3d",
|
||||
"2151: descriptive, not a selector — benilla renders through wgpu, which has no D3D9 \
|
||||
"descriptive, not a selector — benilla renders through wgpu, which has no D3D9 \
|
||||
backend and no chooser; the value is the live adapter's own and is never persisted",
|
||||
)
|
||||
.latched(),
|
||||
@@ -524,7 +524,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"gxResolution",
|
||||
"1600x900",
|
||||
"640x480",
|
||||
"1627: narrowed to the WINDOWED size only — fullscreen is the monitor's own and we expose \
|
||||
"narrowed to the WINDOWED size only — fullscreen is the monitor's own and we expose \
|
||||
no mode list, and 640x480 is not a window anyone would ship a client at",
|
||||
)
|
||||
.latched(),
|
||||
@@ -533,7 +533,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
ours(
|
||||
"boothHalfRate",
|
||||
"1",
|
||||
"1444/1607: benilla's own — the reference draws its doll inside the main pass and has no \
|
||||
"benilla's own — the reference draws its doll inside the main pass and has no \
|
||||
second view to rate-limit",
|
||||
),
|
||||
// `gxMultisample` (`0x63a950`, flags 3). The reference formats its default from field 21 of the
|
||||
@@ -548,7 +548,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"gxColorBits",
|
||||
"32",
|
||||
"16",
|
||||
"1643: these describe, they do not steer — the pair is our swapchain's own, and every \
|
||||
"these describe, they do not steer — the pair is our swapchain's own, and every \
|
||||
format `MsaaFormats` publishes carries it",
|
||||
)
|
||||
.latched(),
|
||||
@@ -556,7 +556,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"gxDepthBits",
|
||||
"32",
|
||||
"16",
|
||||
"1643: as `gxColorBits` — the depth half of the same descriptive pair",
|
||||
"as `gxColorBits` — the depth half of the same descriptive pair",
|
||||
)
|
||||
.latched(),
|
||||
// `trilinear` and `anisotropic`, over `benilla_assets::TexFilterSetting` (`tex_filter.rs`
|
||||
@@ -572,7 +572,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"trilinear",
|
||||
"1",
|
||||
"0",
|
||||
"1645: `hwDetect` sets it from `VideoHardware.dbc` field 9 before the first frame, and \
|
||||
"`hwDetect` sets it from `VideoHardware.dbc` field 9 before the first frame, and \
|
||||
that field is 1 on both fallback rows an unlisted modern GPU can reach — measured on the \
|
||||
reference's own `Logs/gx.log` (`videoID: 170`)",
|
||||
),
|
||||
@@ -587,7 +587,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
"weatherDensity",
|
||||
"3",
|
||||
"2",
|
||||
"2181: every precipitation rate in `benilla-world`'s own precipitation module was \
|
||||
"every precipitation rate in `benilla-world`'s own precipitation module was \
|
||||
derived and graded against the reference install's own apitrace captures, and that \
|
||||
install runs \
|
||||
`SET weatherDensity \"3\"` (K = 1.0) — so 3 is the value a benilla-vs-reference \
|
||||
@@ -608,7 +608,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
ours(
|
||||
"renderScale",
|
||||
"1",
|
||||
"1639: benilla's own — the reference has no off-screen buffer to hang a resolution dial \
|
||||
"benilla's own — the reference has no off-screen buffer to hang a resolution dial \
|
||||
on; its nearest equivalent, `gxResolution`, drops the interface with the world",
|
||||
),
|
||||
// benilla's own: `/console fpsJournal 1` appends a per-second row of position, frame cost and
|
||||
@@ -617,7 +617,7 @@ pub(crate) const REGISTERED: &[Registered] = &[
|
||||
ours(
|
||||
"fpsJournal",
|
||||
"0",
|
||||
"2008: benilla's own — 1.12 has no player-side perf log; its nearest thing is the \
|
||||
"benilla's own — 1.12 has no player-side perf log; its nearest thing is the \
|
||||
Ctrl+R framerate label, a number with no file behind it",
|
||||
),
|
||||
// `lastCharacterIndex` (`0x402d93`, "0" `0x82e570`, category 4, handle `[0x882674]`), help
|
||||
@@ -1385,7 +1385,7 @@ pub(crate) fn fold_dying_vm_cvars(world: &mut World) {
|
||||
|
||||
/// The file's header comment.
|
||||
const HEADER: &str = "\
|
||||
# benilla local config (decision 0954) — CVar values that moved off their defaults.
|
||||
# benilla local config — CVar values that moved off their defaults.
|
||||
# Managed by the client; hand edits are read on next launch and preserved on save.
|
||||
";
|
||||
|
||||
@@ -1559,12 +1559,12 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
!sound.background_sound,
|
||||
"the reference goes quiet in the background and offers no way out (decision 1847)"
|
||||
"the reference goes quiet in the background and offers no way out"
|
||||
);
|
||||
assert_eq!(d["SoundReverb"] != 0.0, sound.reverb);
|
||||
assert_eq!(d["SoundOutputLimiter"] != 0.0, sound.limiter);
|
||||
assert!(sound.limiter, "the output limiter ships on (decision 1551)");
|
||||
assert!(!sound.reverb, "zone reverb ships off (decision 1153)");
|
||||
assert!(sound.limiter, "the output limiter ships on");
|
||||
assert!(!sound.reverb, "zone reverb ships off");
|
||||
assert_eq!(d["uiScale"], DEFAULT_UI_SCALE);
|
||||
// `ViewDistance::default()` reads `$WOW_FARCLIP`, so this is the env-less literal.
|
||||
assert_eq!(d["farclip"], 350.0);
|
||||
@@ -2610,13 +2610,13 @@ mod tests {
|
||||
const LUA_ONLY: &[(&str, &str)] = &[
|
||||
(
|
||||
"statusBarText",
|
||||
"TextStatusBar.lua reads it on CVAR_UPDATE (1140)",
|
||||
"TextStatusBar.lua reads it on each CVAR_UPDATE",
|
||||
),
|
||||
(
|
||||
"UberTooltips",
|
||||
"GameTooltip's binding-line gate, stock and pfUI (1316)",
|
||||
"GameTooltip's binding-line gate, stock and pfUI",
|
||||
),
|
||||
("gxApi", "pfUI's system tooltip names the backend (2151)"),
|
||||
("gxApi", "pfUI's system tooltip names the backend"),
|
||||
(
|
||||
"useUiScale",
|
||||
"UIOptionsFrame.lua and OptionsFrame.lua branch on it to gate the uiScale slider",
|
||||
|
||||
@@ -513,7 +513,7 @@ fn debug_panel_ui(
|
||||
egui::Slider::new(&mut sound_cfg.ambience, 0.0..=1.0)
|
||||
.text("ambience"),
|
||||
);
|
||||
ui.checkbox(&mut sound_cfg.limiter, "output limiter (1551)");
|
||||
ui.checkbox(&mut sound_cfg.limiter, "output limiter");
|
||||
ui.separator();
|
||||
ui.label("kit probe: a SoundEntries id or name");
|
||||
ui.text_edit_singleline(&mut s.kit_query);
|
||||
|
||||
@@ -673,7 +673,7 @@ pub(crate) mod schedule_tests {
|
||||
undeclared order against something it shares state with — declare the order \
|
||||
(`.after`, a set, a `chain`), or raise the ceiling here with the reason. \
|
||||
`WOW_AMBIGUITY_DUMP=1` on this test lists the pairs; a resource that commutes by \
|
||||
construction belongs in `Classes` instead (decisions 2279, 2287)."
|
||||
construction belongs in `Classes` instead."
|
||||
);
|
||||
assert!(
|
||||
n + slack >= ceiling,
|
||||
@@ -855,7 +855,7 @@ pub(crate) mod schedule_tests {
|
||||
/// An instrument, not a gate: prints `Update`'s serial depth as-is and with the VM, then
|
||||
/// the audio layer too, made `Send`-owned. Asserts nothing; run it by hand.
|
||||
#[test]
|
||||
#[ignore = "instrument: run by hand (2265 §A3's executor census) — cargo test -p benilla-app --lib concurrency_census -- --ignored --nocapture"]
|
||||
#[ignore = "instrument: run by hand (the executor census) — cargo test -p benilla-app --lib concurrency_census -- --ignored --nocapture"]
|
||||
fn concurrency_census() {
|
||||
let mut app = headless_client();
|
||||
let c = census(&mut app, Update, SyncPoints::Built);
|
||||
@@ -943,7 +943,7 @@ pub(crate) mod schedule_tests {
|
||||
let c = census(&mut app, Update, SyncPoints::Built);
|
||||
if !type_names_available(&c) {
|
||||
eprintln!(
|
||||
"skipped: this build carries no type names (bevy/debug rides with dev, 1451)"
|
||||
"skipped: this build carries no type names (bevy/debug rides with the dev feature)"
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -1042,7 +1042,7 @@ pub(crate) mod schedule_tests {
|
||||
assert!(
|
||||
offenders.is_empty(),
|
||||
"these systems hold the VM in `Update` without declaring their side of the tick \
|
||||
(decision 2304):\n {}",
|
||||
(`UiFeed` before it, or `.after(UiInput)`):\n {}",
|
||||
offenders.join("\n ")
|
||||
);
|
||||
assert!(stale.is_empty(), "stale rows:\n {}", stale.join("\n "));
|
||||
@@ -1085,7 +1085,7 @@ pub(crate) mod schedule_tests {
|
||||
("tutorial.rs", "drain_tutorials", Because::FilledByVm,
|
||||
"`sends` exist only after Lua acknowledged, cleared or reset a flag, and go to the wire"),
|
||||
("ui_action/drain.rs", "drain_go_openers", Because::FilledByVm,
|
||||
"filled only by a world right-click on a GameObject; the drain sends casts to the wire (2232's own bucket)"),
|
||||
"filled only by a world right-click on a GameObject; the drain sends casts to the wire"),
|
||||
("ui_auction/mod.rs", "drain_auction", Because::FilledByVm,
|
||||
"VM verbs; the refresh flags act only under an open window and become wire re-asks"),
|
||||
("ui_bank/mod.rs", "feed_bank", Because::PlayerRoundTrip,
|
||||
@@ -1125,7 +1125,7 @@ pub(crate) mod schedule_tests {
|
||||
("ui_loot_roll.rs", "drain_loot_rolls", Because::FilledByVm,
|
||||
"only a Need/Greed/Pass click queues a confirm or vote, held in the VM"),
|
||||
("ui_loot_roll.rs", "feed_loot_rolls", Because::PlayerRoundTrip,
|
||||
"a roll exists only after a group member loots under group loot (2232's bucket); leftovers are cleared at socket teardown (another player's act: coincidence-only residual)"),
|
||||
"a roll exists only after a group member loots under group loot; leftovers are cleared at socket teardown (another player's act: coincidence-only residual)"),
|
||||
("ui_macro/mod.rs", "load_macros", Because::MemoLatched,
|
||||
"`MacroFiles.identity` is a `VmMemo`, so a new session re-reads the files and re-fires UPDATE_MACROS; also `InWorldGated`"),
|
||||
("ui_macro/mod.rs", "save_dirty_macros", Because::FilledByVm,
|
||||
@@ -1139,13 +1139,13 @@ pub(crate) mod schedule_tests {
|
||||
("ui_quest_share.rs", "feed_quest_share", Because::PlayerRoundTrip,
|
||||
"a verdict answers our own push and a confirm follows a party member's escort accept, both held until the name resolves (the confirm is another player's act: coincidence-only residual)"),
|
||||
("ui_script/extract/mod.rs", "paint_script", Because::Deliberate,
|
||||
"per-frame paint and cost state, not a queue (2232)"),
|
||||
"per-frame paint and cost state, not a queue"),
|
||||
("ui_social/feed.rs", "feed_social", Because::MemoLatched,
|
||||
"the login-burst lists are re-announced to a new VM by `fed.seeded` (`VmMemo<FedSocial>`); the show flag is Lua's; a status line waits on the name resolve"),
|
||||
("ui_stable/mod.rs", "feed_stable", Because::PlayerRoundTrip,
|
||||
"both packets follow a stable master's gossip and a click in its window"),
|
||||
("ui_summon.rs", "feed_summon", Because::PlayerRoundTrip,
|
||||
"only another player's Ritual of Summoning latches the ask (2232's duel shape; coincidence-only residual)"),
|
||||
"only another player's Ritual of Summoning latches the ask (the duel's shape; coincidence-only residual)"),
|
||||
("ui_tabard.rs", "drain_tabard", Because::FilledByVm,
|
||||
"the intents are Lua's; the event answers a Save intent"),
|
||||
("ui_tabard.rs", "feed_tabard", Because::PlayerRoundTrip,
|
||||
@@ -1153,7 +1153,7 @@ pub(crate) mod schedule_tests {
|
||||
("ui_talent_wipe.rs", "feed_talent_wipe", Because::PlayerRoundTrip,
|
||||
"`MSG_TALENT_WIPE_CONFIRM` answers the trainer's gossip option"),
|
||||
("ui_taxi/mod.rs", "feed_taxi", Because::PlayerRoundTrip,
|
||||
"both packets follow talking to a flight master (2232's own example)"),
|
||||
"both packets follow talking to a flight master"),
|
||||
("ui_tradeskill.rs", "drain_trade_skill", Because::FilledByVm,
|
||||
"every consumed queue is Lua's; the cast-event continuation is inert until a Lua `DoTradeSkill` latched a count"),
|
||||
("ui_trainer/mod.rs", "feed_trainer", Because::PlayerRoundTrip,
|
||||
@@ -1201,7 +1201,7 @@ pub(crate) mod schedule_tests {
|
||||
let update = census(&mut app, Update, SyncPoints::Built);
|
||||
if !type_names_available(&update) {
|
||||
eprintln!(
|
||||
"skipped: this build carries no type names (bevy/debug rides with dev, 1451)"
|
||||
"skipped: this build carries no type names (bevy/debug rides with the dev feature)"
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -1286,10 +1286,10 @@ pub(crate) mod schedule_tests {
|
||||
assert!(
|
||||
offenders.is_empty(),
|
||||
"these systems hold the VM and consume a one-shot with nothing gating them on the \
|
||||
interface being up — in 2214's one-frame window they publish to a VM with no frames \
|
||||
and the edge is lost (2220, 2232). Gate them (`.run_if(ingame_ui_up)`, on the system \
|
||||
interface being up — in the one frame before it is, they publish to a VM with no \
|
||||
frames and the edge is lost. Gate them (`.run_if(ingame_ui_up)`, on the system \
|
||||
or its set), or add them to `EXEMPT` with the reason they cannot be filled before \
|
||||
the interface exists (decision 2279):\n {}",
|
||||
the interface exists:\n {}",
|
||||
offenders.join("\n ")
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -451,7 +451,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
colour(&app),
|
||||
Color::WHITE,
|
||||
"hover whitens it (the ref's HighlightFont)"
|
||||
"hover whitens it (the reference's HighlightFont)"
|
||||
);
|
||||
|
||||
app.world_mut().get_mut::<GlueDisabled>(button).unwrap().0 = true;
|
||||
@@ -461,7 +461,7 @@ mod tests {
|
||||
Color::WHITE,
|
||||
"a disabled button does not highlight"
|
||||
);
|
||||
assert_ne!(colour(&app), GOLD, "it grays (the ref's GlueFontDisable)");
|
||||
assert_ne!(colour(&app), GOLD, "it grays (the stock GlueFontDisable)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -775,7 +775,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
markup_spans("|cff0055FFDeadly Boss Mod API|r", base, true),
|
||||
vec![("Deadly Boss Mod API".to_string(), blue)],
|
||||
"B273: the tooltip's title wraps, and wrapping does not exempt it from the decode"
|
||||
"the tooltip's title wraps, and wrapping does not exempt it from the decode"
|
||||
);
|
||||
assert_eq!(
|
||||
markup_spans("A |cff00ff00B|r C", base, false),
|
||||
|
||||
@@ -193,14 +193,14 @@ mod tests {
|
||||
data[9] = 3;
|
||||
t.insert(100, 2, "Wanted Poster".into(), &data);
|
||||
t.insert(101, 9, "Book".into(), &data);
|
||||
t.insert(102, 10, "Chest".into(), &data);
|
||||
t.insert(102, 10, "Goober".into(), &data);
|
||||
t.insert(103, 15, "Boat".into(), &data);
|
||||
assert_eq!(t.templates.get(100).unwrap().quest_material, Some(2));
|
||||
assert_eq!(t.templates.get(101).unwrap().quest_material, Some(2));
|
||||
assert_eq!(
|
||||
t.templates.get(102).unwrap().quest_material,
|
||||
Some(3),
|
||||
"a chest reads data[9]"
|
||||
"a GOOBER (type 10) reads data[9]"
|
||||
);
|
||||
assert_eq!(t.templates.get(103).unwrap().quest_material, None);
|
||||
}
|
||||
|
||||
@@ -1026,7 +1026,7 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
!already_bound(&item(0x0, 99), cat),
|
||||
"an id that names no row binds nothing (the ref's `testl` after the table load)"
|
||||
"an id that names no row binds nothing (the reference's `testl` after the table load)"
|
||||
);
|
||||
assert!(
|
||||
!already_bound(&item(0x0, 11), None),
|
||||
|
||||
@@ -242,7 +242,7 @@ pub fn run(build: BuildId) -> AppExit {
|
||||
s.set_executor_kind(bevy::ecs::schedule::ExecutorKind::SingleThreaded);
|
||||
});
|
||||
println!(
|
||||
"executor: PostUpdate -> single-threaded (1437 default; WOW_MT_POSTUPDATE=1 for MT)"
|
||||
"executor: PostUpdate -> single-threaded (the default; WOW_MT_POSTUPDATE=1 for MT)"
|
||||
);
|
||||
}
|
||||
// The build banner ships in every build: which build produced a log is the first thing a report
|
||||
@@ -395,7 +395,7 @@ pub fn run(build: BuildId) -> AppExit {
|
||||
s.set_executor_kind(bevy::ecs::schedule::ExecutorKind::SingleThreaded);
|
||||
});
|
||||
println!(
|
||||
"executor: ExtractSchedule -> single-threaded (1437 default; WOW_MT_EXTRACT=1 for MT)"
|
||||
"executor: ExtractSchedule -> single-threaded (the default; WOW_MT_EXTRACT=1 for MT)"
|
||||
);
|
||||
} else {
|
||||
// A missing sub-app would silently flip nothing.
|
||||
|
||||
@@ -730,7 +730,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
screen.tip_edge,
|
||||
Some(TipEdge::Pick),
|
||||
"and the tip 2077 just picked survives it — a raise is the only thing that could \
|
||||
"and the tip just picked survives it — a raise is the only thing that could \
|
||||
have cleared it, and no raise happened"
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -1333,7 +1333,7 @@ mod tests {
|
||||
let _rig = crate::local_state::test_env::EnvGuard::unset("WOW_RIG");
|
||||
assert!(
|
||||
crate::run_mode::env_login() && !crate::run_mode::unattended(),
|
||||
"the fixture must be the env the director plays in: credentials, nobody declared away",
|
||||
"the fixture must be a player's env: credentials, nobody declared away",
|
||||
);
|
||||
assert!(
|
||||
!refusal_exits(false),
|
||||
|
||||
@@ -238,7 +238,7 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
names.generation() > before,
|
||||
"a landed record moves the counter the gated feeds watch (1439)"
|
||||
"a landed record moves the counter the gated feeds watch"
|
||||
);
|
||||
|
||||
let _ = std::fs::remove_dir_all(&tmp);
|
||||
|
||||
@@ -818,8 +818,8 @@ mod tests {
|
||||
fn invalidating_a_player_makes_the_next_resolve_ask_again() {
|
||||
let (cmds, rx) = commands();
|
||||
let mut cache = NameCache::default();
|
||||
cache.insert_player(0x11, "Sam".into(), Some((1, 2, 0)));
|
||||
assert_eq!(cache.resolve(0x11, &cmds), Some("Sam"));
|
||||
cache.insert_player(0x11, "Aldric".into(), Some((1, 2, 0)));
|
||||
assert_eq!(cache.resolve(0x11, &cmds), Some("Aldric"));
|
||||
assert!(matches!(rx.try_recv(), Err(TryRecvError::Empty)), "no ask");
|
||||
|
||||
let before = cache.generation();
|
||||
|
||||
@@ -2342,7 +2342,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
current_speed(&unfilled, f::FORWARD | f::WALK_MODE),
|
||||
0.0,
|
||||
"no fallback: `min(walk, run)` with walk 0 is 0 (decision 1759)"
|
||||
"no fallback: `min(walk, run)` with walk 0 is 0"
|
||||
);
|
||||
assert_eq!(
|
||||
current_speed(&unfilled, f::FORWARD),
|
||||
|
||||
@@ -789,7 +789,7 @@ mod under_floor {
|
||||
WIRE_Y,
|
||||
"the terrain 2.10 yd down is outside any walking frame's election reach, so there is \
|
||||
no floor of ours to find and the wire's height stands — instead of a per-frame \
|
||||
descent that nothing here would ever end (2174)"
|
||||
descent that nothing here would ever end"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -817,7 +817,7 @@ mod under_floor {
|
||||
assert!(
|
||||
z < WIRE_Y,
|
||||
"the floor is inside a moving frame's reach, so the election still settles the body \
|
||||
onto it — 2174 declines the no-FLOOR drop, never the resolve (z={z:.3})"
|
||||
onto it — only the no-FLOOR drop is declined, never the resolve (z={z:.3})"
|
||||
);
|
||||
assert!(
|
||||
z > WIRE_Y - 0.5,
|
||||
@@ -836,12 +836,12 @@ mod under_floor {
|
||||
frames(&mut app, 240);
|
||||
// `-- --nocapture` prints the depth.
|
||||
println!(
|
||||
"pre-1545 leg, 240 frames: z={:.4} (wire {WIRE_Y})",
|
||||
"idle gate off, 240 frames: z={:.4} (wire {WIRE_Y})",
|
||||
z_of(&app, e)
|
||||
);
|
||||
assert!(
|
||||
z_of(&app, e) < TERRAIN_Y + 0.1,
|
||||
"the pre-1545 leg walks a standing mover down onto the terrain under the building"
|
||||
"with the idle gate off, a standing mover sinks onto the terrain under the building"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,7 +327,7 @@ fn on_packet_dropped(In(ev): In<SessionEvent>, mut b: Bridge) {
|
||||
/// latency reading is a frame late, so it warns.
|
||||
fn on_pong(In(ev): In<SessionEvent>) {
|
||||
if let SessionEvent::Pong { sequence } = ev {
|
||||
warn!("net: pong seq={sequence} reached the drain — the read thread's RTT bypass is gone (B346)");
|
||||
warn!("net: pong seq={sequence} reached the drain — the read thread's RTT bypass is gone");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ mod tests {
|
||||
assert!(p.contains(0, 1), "the source end");
|
||||
assert!(
|
||||
p.contains(0, 5),
|
||||
"the destination end (0218: the send locks both)"
|
||||
"the destination end (the send locks both)"
|
||||
);
|
||||
assert!(!p.contains(1, 1), "a different bag's slot is untouched");
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ fn watchdog(dir: Option<std::path::PathBuf>) {
|
||||
eprintln!(
|
||||
"stall-sample: main thread stale {age} ms — NOT sampled: an audio \
|
||||
device is open, and `sample` suspending the process is itself a \
|
||||
crackle (1857). `WOW_STALL_SAMPLE=force` to sample anyway."
|
||||
crackle. `WOW_STALL_SAMPLE=force` to sample anyway."
|
||||
);
|
||||
declined = true;
|
||||
}
|
||||
|
||||
@@ -795,8 +795,8 @@ mod tests {
|
||||
assert!(
|
||||
missing.is_empty(),
|
||||
"custom pipeline lanes with no pipe_warm contributor: {missing:?} — a lane the \
|
||||
menagerie can't see compiles its pipelines live on first draw (decisions \
|
||||
0837/0938/0958)"
|
||||
menagerie can't see compiles its pipelines live on first draw, a render-thread \
|
||||
stall"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -896,7 +896,7 @@ mod tests {
|
||||
missing.is_empty(),
|
||||
"material lanes with no pipe_warm contributor: {missing:?} — every registered \
|
||||
lane's pipelines compile behind the loading cover, or its first sight is a live \
|
||||
render-thread stall (decisions 0837/0937/0938/0958)"
|
||||
render-thread stall"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -485,7 +485,7 @@ fn census_view_classes(
|
||||
warn!(
|
||||
"pipeline warm: camera {} draws through {} — a view key the menagerie never rendered \
|
||||
a rig through, so its whole model-pipeline space compiles LIVE on first sight. Give \
|
||||
it a warm arm (decisions 0958/2262/2264). Warm keys this session: {}.",
|
||||
it a warm arm. Warm keys this session: {}.",
|
||||
name.map_or("<unnamed>", Name::as_str),
|
||||
class.describe(),
|
||||
warm.warmed_views
|
||||
@@ -719,7 +719,7 @@ mod census_tests {
|
||||
|
||||
/// A warm set with no orthographic arm: the world camera's Perspective and the two
|
||||
/// `Msaa::Off` booth classes.
|
||||
fn warm_set_before_2262() -> Vec<ViewClass> {
|
||||
fn warm_set_without_an_orthographic_arm() -> Vec<ViewClass> {
|
||||
vec![
|
||||
view_class(Some(&perspective()), Some(&Msaa::Off), true),
|
||||
view_class(Some(&perspective()), Some(&Msaa::Sample4), true),
|
||||
@@ -731,12 +731,12 @@ mod census_tests {
|
||||
/// would miss it.
|
||||
#[test]
|
||||
fn the_census_fires_for_an_unwarmed_orthographic_camera() {
|
||||
let warm = warm_set_before_2262();
|
||||
let warm = warm_set_without_an_orthographic_arm();
|
||||
let tile_cam = view_class(Some(&orthographic()), Some(&Msaa::Off), true);
|
||||
assert!(
|
||||
!warm.contains(&tile_cam),
|
||||
"the ui_models tile camera's view key must read as unwarmed against a warm set that \
|
||||
has no orthographic arm — this is the report 2262 was written to produce"
|
||||
has no orthographic arm — the census must report it"
|
||||
);
|
||||
assert_eq!(
|
||||
tile_cam.samples, 1,
|
||||
@@ -746,7 +746,7 @@ mod census_tests {
|
||||
|
||||
#[test]
|
||||
fn the_census_is_silent_for_every_warmed_class() {
|
||||
let warm = warm_set_before_2262();
|
||||
let warm = warm_set_without_an_orthographic_arm();
|
||||
for class in &warm {
|
||||
assert!(warm.contains(class));
|
||||
}
|
||||
@@ -754,7 +754,7 @@ mod census_tests {
|
||||
assert!(
|
||||
warm.contains(&booth_after_first_bake),
|
||||
"a booth's runtime-installed custom projection is the NONSTANDARD class, warmed by \
|
||||
the twin booth (0958)"
|
||||
the twin booth"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -764,6 +764,6 @@ mod census_tests {
|
||||
let with = view_class(Some(&perspective()), Some(&Msaa::Off), true);
|
||||
let without = view_class(Some(&perspective()), Some(&Msaa::Off), false);
|
||||
assert_ne!(with, without);
|
||||
assert!(!warm_set_before_2262().contains(&without));
|
||||
assert!(!warm_set_without_an_orthographic_arm().contains(&without));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
over > 0.0,
|
||||
"and above it at all — this is the whole difference between 2170 and a working camera"
|
||||
"and above it at all — a pivot at or under the plane is what breaks the camera"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -744,7 +744,7 @@ mod tests {
|
||||
step_off(0.1, &mut player);
|
||||
assert!(
|
||||
rx.try_recv().is_err(),
|
||||
"the arc's first frame puts NOTHING on the wire — this packet is B79's un-seat"
|
||||
"the arc's first frame puts NOTHING on the wire — a packet here un-seats the player"
|
||||
);
|
||||
assert_eq!(
|
||||
player.move_flags,
|
||||
|
||||
@@ -1005,7 +1005,7 @@ mod tests {
|
||||
// The blocking edge is low on the bevel, inside the cone, so this rides rather than pops.
|
||||
assert!(
|
||||
frames[0].0 < 0.3,
|
||||
"a 0.91 yd gain in one frame is the teleport 1126 exists to avoid: {frames:?}"
|
||||
"a 0.91 yd gain in one frame is the teleport the ride avoids: {frames:?}"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1832,7 +1832,7 @@ mod tests {
|
||||
wire,
|
||||
(true, JUMP_SPEED),
|
||||
"`force = 0` skips that test and takes off on the land seed `0xc0fe93d8` (the launch \
|
||||
speed, not the post-gravity `vel_y` — 1740)"
|
||||
speed, not the post-gravity `vel_y`)"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2094,7 +2094,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
vel_y, PUSH.y,
|
||||
"the vertical is the server's take-off speed, not JUMP_SPEED ({JUMP_SPEED}) — read off \
|
||||
`launch_vz`, because `vel_y` has already taken this frame's gravity step (1740)"
|
||||
`launch_vz`, because `vel_y` has already taken this frame's gravity step"
|
||||
);
|
||||
assert_eq!(
|
||||
horiz,
|
||||
|
||||
@@ -486,7 +486,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
(player.vel_y, player.horiz_vel),
|
||||
(0.0, Vec3::ZERO),
|
||||
"the controller resumes from the endpoint at rest (decision 0260) — \
|
||||
"the controller resumes from the endpoint at rest — \
|
||||
stale pre-ride momentum must not leak into the resume"
|
||||
);
|
||||
match rx.try_recv() {
|
||||
|
||||
@@ -618,14 +618,14 @@ mod tests {
|
||||
}
|
||||
|
||||
// One shared height would put a gnome's rest line above her head.
|
||||
let pre_0645 = rest_cap(crate::player::DEFAULT_COLLISION_HEIGHT);
|
||||
let shared_rest = rest_cap(crate::player::DEFAULT_COLLISION_HEIGHT);
|
||||
assert!(
|
||||
pre_0645 > GNOME_FEMALE,
|
||||
"the old constant rest line ({pre_0645}) must sit above a {GNOME_FEMALE}-yd gnome — \
|
||||
shared_rest > GNOME_FEMALE,
|
||||
"the old constant rest line ({shared_rest}) must sit above a {GNOME_FEMALE}-yd gnome — \
|
||||
that was the bug, and if this ever fails the test below is no longer testing it"
|
||||
);
|
||||
assert!(
|
||||
pre_0645 - GNOME_FEMALE > 0.3,
|
||||
shared_rest - GNOME_FEMALE > 0.3,
|
||||
"…by a third of a yard of water over her head, not a rounding error"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -549,12 +549,12 @@ mod session_end_tests {
|
||||
assert!(
|
||||
p.modes == Default::default(),
|
||||
"the granted modes belonged to the mover that just ended — a root that survives \
|
||||
`/logout` is B306: the character re-enters the world and WASD is dead"
|
||||
`/logout` means the character re-enters the world and WASD is dead"
|
||||
);
|
||||
assert!(
|
||||
*p == Player::default(),
|
||||
"and nothing else survives either: the session boundary returns the resource to the \
|
||||
state `player::setup` inserts at boot (1542)"
|
||||
state `player::setup` inserts at boot"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -2457,7 +2457,7 @@ mod tests {
|
||||
let bow: Vec<&PortraitRider> = bow.iter().collect();
|
||||
assert!(
|
||||
LookKey::build(&body, &[], &[], &[]) != LookKey::build(&body, &bow, &[], &[]),
|
||||
"the pre-1616 key moved on the draw — which is the bug"
|
||||
"the mirrored-geometry key moved on the draw — which is the bug"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -143,8 +143,8 @@ fn camera_2d_msaa_agrees(
|
||||
counts` the frame it goes active. Bevy keys the Core2d DEPTH texture on the target \
|
||||
alone (core_2d::prepare_core_2d_depth_textures) but the COLOUR target on the sample \
|
||||
count too, so they share one depth attachment and cannot share a colour one. Usually \
|
||||
the cause is a camera that never named an Msaa: silence is Sample4, not off \
|
||||
(decisions 1628, 1659).",
|
||||
the cause is a camera that never named an Msaa: silence is Sample4, not off, so \
|
||||
name one on every camera.",
|
||||
other_label.as_deref().unwrap_or("an unnamed Camera2d"),
|
||||
other_samples,
|
||||
label.as_deref().unwrap_or("an unnamed Camera2d"),
|
||||
@@ -302,7 +302,7 @@ fn findings(
|
||||
ShieldReport::Disabled => out.push(
|
||||
"THE PROBE SHIELD IS OFF (WOW_GOD=off) — this character CAN die, so an unattended run \
|
||||
can leave a corpse for the next session. Deliberate for a death-arc test; unset \
|
||||
WOW_GOD for anything else (decision 0677)."
|
||||
WOW_GOD for anything else."
|
||||
.into(),
|
||||
),
|
||||
ShieldReport::Unconfirmed => out.push(
|
||||
@@ -321,17 +321,17 @@ fn findings(
|
||||
Any hostility, reaction-colour, nameplate, threat, aggro, damage or drowning reading \
|
||||
taken now is wrong. It ALSO suspends the INDOOR DISMOUNT: \
|
||||
`CheckAreaExploreAndOutdoor` drops outdoor-only auras only `if (… && \
|
||||
!IsGameMaster())`, so a GM rides into a building and stays mounted (decision 0934). {}",
|
||||
!IsGameMaster())`, so a GM rides into a building and stays mounted. {}",
|
||||
match shield {
|
||||
// The default on a probe body, so this warning shows on most runs.
|
||||
ShieldReport::Arming | ShieldReport::Armed =>
|
||||
"This is the default. Re-run with WOW_GM=off for those readings — safe, \
|
||||
because the probe shield (decision 0677) keeps the body alive without it.",
|
||||
because the probe shield keeps the body alive without it.",
|
||||
// `WOW_GM` does not reach a non-probe body, and vmangos persists GM mode in
|
||||
// `characters.extra_flags` bit 0, restored at login by `GM.LoginState = 2`.
|
||||
ShieldReport::NotOurs =>
|
||||
"WOW_GM does not reach this body — the shield only ever commands probe accounts \
|
||||
(0677) — so the way out is typing `.gm off` yourself. It persists across \
|
||||
— so the way out is typing `.gm off` yourself. It persists across \
|
||||
logins (vmangos GM.LoginState = 2), which is why it is on now.",
|
||||
_ =>
|
||||
"Re-run with WOW_GM=off for those readings. Note the probe shield is NOT up on \
|
||||
|
||||
@@ -267,7 +267,7 @@ fn drive_shield(
|
||||
"probe-shield: GM mode is off — turning it back ON, so a parked body is not \
|
||||
permanently mobbed. Readings taken now are faction-35 readings and are wrong \
|
||||
for anything about hostility, colour, threat, aggro, damage or timers \
|
||||
(0649/0657) — set WOW_GM=off for those, which is safe: the shield holds."
|
||||
— set WOW_GM=off for those, which is safe: the shield holds."
|
||||
);
|
||||
shield.steps.push(".gm on".into());
|
||||
}
|
||||
|
||||
@@ -73,8 +73,8 @@ pub(crate) fn fatal_when_driverless(why: &str) -> bool {
|
||||
if env_login() {
|
||||
warn!(
|
||||
"login: {why} — leaving the dialog up, because nothing declared this run driverless. \
|
||||
Set WOW_UNATTENDED=1 if nobody is here and it should exit non-zero instead \
|
||||
(decision 1769)."
|
||||
Set WOW_UNATTENDED=1 if nobody is here and it should exit \
|
||||
non-zero instead."
|
||||
);
|
||||
}
|
||||
false
|
||||
@@ -289,9 +289,9 @@ mod tests {
|
||||
"a dev-chord affordance outside the dev roots must go through `run_mode::dev_chord`, \
|
||||
which is `false` in a player build — the engine's `modkeys::dev_chord` is always \
|
||||
compiled, so calling it directly ships a live dev key to a player and the build gate \
|
||||
cannot see it (decision 1176). And a `#[cfg(feature = \"dev\")]` outside `run_mode`, \
|
||||
cannot see it. And a `#[cfg(feature = \"dev\")]` outside `run_mode`, \
|
||||
`dev.rs` and `lib.rs` means a gameplay module has learned the seam exists — ask \
|
||||
`run_mode::dev_affordances()` instead (decision 1179). Offenders:\n {}",
|
||||
`run_mode::dev_affordances()` instead. Offenders:\n {}",
|
||||
offenders.join("\n "),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ mod tests {
|
||||
assert!(
|
||||
app.world().resource::<Saw>().0 == 0,
|
||||
"…and the Update system did not see it. This is the bug: every file the session \
|
||||
would have written on the way out is simply never written (1528)"
|
||||
would have written on the way out is simply never written"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ mod tests {
|
||||
app.world().resource::<Saw>().0,
|
||||
1,
|
||||
"the tail runs on the edge; a second run would re-fire \
|
||||
PLAYER_LEAVING_WORLD/PLAYER_LOGOUT into every addon (1537)"
|
||||
PLAYER_LEAVING_WORLD/PLAYER_LOGOUT into every addon"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -429,7 +429,7 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
s.table.iter().all(|slot| slot.annoyed.is_none()),
|
||||
"an annoyed kit resolved — 1815's dormancy is over"
|
||||
"an annoyed kit resolved — this build's escalation is no longer silent"
|
||||
);
|
||||
|
||||
// A race change is a full rebuild: Tauren line 0, not Human's, and no Human residue.
|
||||
|
||||
@@ -760,8 +760,8 @@ mod tests {
|
||||
assert!(rx.try_recv().is_err(), "no duplicate on the wire");
|
||||
assert!(
|
||||
world.resource::<CastErrors>().0.is_empty(),
|
||||
"the same spell's re-press is the ref's SILENT bail (6e4d43), not \"Another action is \
|
||||
in progress\""
|
||||
"the same spell's re-press is the reference's SILENT bail (6e4d43), not \"Another \
|
||||
action is in progress\""
|
||||
);
|
||||
|
||||
// A different cast mid-opener is the loud refusal (6e4d97).
|
||||
@@ -1057,7 +1057,7 @@ mod tests {
|
||||
assert!(rx.try_recv().is_err(), "no duplicate on the wire");
|
||||
assert!(
|
||||
world.resource::<CastErrors>().0.is_empty(),
|
||||
"the same spell's re-press is the ref's SILENT bail (6e4d43), not a red line"
|
||||
"the same spell's re-press is the reference's SILENT bail (6e4d43), not a red line"
|
||||
);
|
||||
|
||||
send(&mut world, MOUNT, HEARTH_COMMIT);
|
||||
@@ -1250,7 +1250,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
world.resource::<CastErrors>().0,
|
||||
vec![CastFail::local(MOUNT, 0x61)],
|
||||
"mid-cast outranks the cooldown rung (the ref's IsCasting precedes the validator)"
|
||||
"mid-cast outranks the cooldown rung (the reference's IsCasting precedes the validator)"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -518,7 +518,7 @@ mod tests {
|
||||
&rel_none()
|
||||
),
|
||||
CastWireTarget::SelfImplicit,
|
||||
"word==0 commits before the arm-16 defer — the ref's order"
|
||||
"word==0 commits before the arm-16 defer — the reference's order"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -577,9 +577,9 @@ mod tests {
|
||||
(&feed[0], &feed[1]),
|
||||
(CastBarEdge::Stop, CastBarEdge::Interrupted)
|
||||
),
|
||||
"the bar edges are the ref's own two-step at RTT→0 — STOP (arms the flash \
|
||||
overlay) then the red INTERRUPTED (the echo's repaint: hold, burst, fade); \
|
||||
the keyed reap silences the real echo (0449/0454)"
|
||||
"the bar edges are the reference's own two-step at RTT→0 — STOP (arms the \
|
||||
flash overlay) then the red INTERRUPTED (the echo's repaint: hold, burst, fade); \
|
||||
the keyed reap silences the real echo"
|
||||
);
|
||||
let self_e = app.world().resource::<GuidIndex>().0[&10];
|
||||
assert!(
|
||||
@@ -742,7 +742,7 @@ mod tests {
|
||||
rx.try_recv(),
|
||||
Ok(crate::net::ClientCommand::CancelAutoRepeat)
|
||||
),
|
||||
"the auto-repeat cancel ships first — the ref's priority branch"
|
||||
"the auto-repeat cancel ships first — the reference's priority branch"
|
||||
);
|
||||
assert!(rx.try_recv().is_err(), "the cast survives the first press");
|
||||
assert!(app.world().resource::<AutoRepeatActive>().0.is_none());
|
||||
@@ -823,8 +823,8 @@ mod tests {
|
||||
app.world().resource::<CastBarFeed>().0[..],
|
||||
[CastBarEdge::Stop]
|
||||
),
|
||||
"the ref's `0x152` STOP and nothing else: no red INTERRUPTED for a spell that \
|
||||
never opened a bar"
|
||||
"the reference's `0x152` STOP and nothing else: no red INTERRUPTED for a \
|
||||
spell that never opened a bar"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -2640,7 +2640,7 @@ mod tests {
|
||||
);
|
||||
assert!(
|
||||
swings(&fire(10, SERPENT_STING, false)).is_empty(),
|
||||
"Serpent Sting carries Ex2 bit 17, not bit 20 — it starts nothing (B280 / 0994 §4)"
|
||||
"Serpent Sting carries Ex2 bit 17, not bit 20 — it starts nothing"
|
||||
);
|
||||
assert!(
|
||||
swings(&fire(10, BACKSTAB, true)).is_empty(),
|
||||
|
||||
@@ -441,7 +441,7 @@ mod tests {
|
||||
existing: 2564,
|
||||
new: 1900
|
||||
},
|
||||
"and its Yes lands on the replace question — the ref's two-popup chain"
|
||||
"and its Yes lands on the replace question — the reference's two-popup chain"
|
||||
);
|
||||
|
||||
// 3. The slot fork, the one place effects 53 and 54 differ: PERM for 53, TEMP for 54.
|
||||
|
||||
@@ -424,7 +424,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
cast_water_refusal(0, Some(aquatic)),
|
||||
Some(ERR_ONLY_UNDERWATER),
|
||||
"on land, Aquatic Form refuses — the B176 report"
|
||||
"on land, Aquatic Form refuses: it is underwater-only"
|
||||
);
|
||||
assert_eq!(
|
||||
cast_water_refusal(crate::creature_anim::move_flags::SWIMMING, Some(aquatic)),
|
||||
|
||||
@@ -95,7 +95,7 @@ fn a_landed_item_template_redisplays_the_action_slot() {
|
||||
fed_texture(&mut app).as_deref(),
|
||||
Some(MISSING_ITEM_ICON),
|
||||
"the first resolve of a cold entry IS the ask, so it can only show the reference's own \
|
||||
placeholder — and never nil, since ref FrameXML HIDES the icon on a nil texture (0666)"
|
||||
placeholder — and never nil, since ref FrameXML HIDES the icon on a nil texture"
|
||||
);
|
||||
assert!(
|
||||
rx.try_iter()
|
||||
|
||||
@@ -922,7 +922,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
denied.iter().map(|a| a.spell_id).collect::<Vec<_>>(),
|
||||
[22766],
|
||||
"a hostile creature shows its debuffs and NOT its buffs — the B216 divergence"
|
||||
"a hostile creature shows its debuffs and NOT its buffs — `UnitBuff`'s unit gate"
|
||||
);
|
||||
assert!(denied.iter().all(|a| !a.helpful));
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ impl ChannelState {
|
||||
Some(mask) => *mask |= bit,
|
||||
// No join precedes the cache loader, so this is a broken ordering.
|
||||
None if bit != 0 => warn!(
|
||||
"chat: {name:?} confirmed joined before the chat cache seated the zone mask — bit {bit:#x} dropped"
|
||||
"chat: {name:?} joined before the zone mask was seated — bit {bit:#x} dropped"
|
||||
),
|
||||
None => {}
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ pub(super) fn drain_chat_input(
|
||||
);
|
||||
lines.push(format!(
|
||||
"reaction: plate is_player {is_player} (OBJECT_FIELD_TYPE says {:?}; the two \
|
||||
must agree — the predicates read the field, 1674) · faction-group mask self {} \
|
||||
must agree — the predicates read the field) · faction-group mask self {} \
|
||||
target {} · can_cooperate {} · can_attack(player→unit) {}",
|
||||
target_store.and_then(|s| s.0.object_type()),
|
||||
mask(own_store),
|
||||
|
||||
@@ -443,7 +443,7 @@ fn an_addon_registering_our_own_chat_frame_does_not_double_print() {
|
||||
assert_eq!(
|
||||
lines_in_window(&s),
|
||||
2,
|
||||
"one more line, not two — ChatFrame1's own OnEvent does not render CHAT_MSG_*"
|
||||
"one more line, not two — registering an event again never fires it twice"
|
||||
);
|
||||
assert_eq!(s.eval::<i64>("return SpyN").unwrap(), 2);
|
||||
assert!(s.errors().is_empty(), "handler errors: {:?}", s.errors());
|
||||
@@ -934,7 +934,7 @@ fn a_leave_notice_keeps_its_number_because_the_record_dies_after_the_line() {
|
||||
assert_eq!(
|
||||
channels.names(),
|
||||
[Some("World".to_string()), None],
|
||||
"and only THEN is the record gone — as a HOLE at slot 2, not a shortened list (1286)"
|
||||
"and only THEN is the record gone — as a HOLE at slot 2, not a shortened list"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1985,7 +1985,7 @@ fn the_combat_log_window_has_the_docks_rect() {
|
||||
assert_eq!(
|
||||
s.eval::<i64>("return ChatFrame2:GetNumPoints()").unwrap(),
|
||||
3,
|
||||
"FCF_DockUpdate's three points — a 2 means the dock never seeded this window"
|
||||
"FCF_DockUpdate's three points — any other count means the dock never seeded this window"
|
||||
);
|
||||
assert_eq!(
|
||||
s.eval::<i64>("return table.getn(DOCKED_CHAT_FRAMES)")
|
||||
|
||||
@@ -349,7 +349,7 @@ pub(crate) mod net {
|
||||
}
|
||||
2 => debug!("gm ticket: a GM closed the ticket"),
|
||||
3 => {
|
||||
debug!("gm ticket: a GM survey was offered — the survey window is deferred (1673)")
|
||||
debug!("gm ticket: a GM survey was offered — the survey window is deferred")
|
||||
}
|
||||
other => debug!("gm ticket: unknown status update {other}"),
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ fn drain_gossip(
|
||||
option: opt.index,
|
||||
});
|
||||
}
|
||||
Some(_) => debug!("ui_gossip: ignoring coded option {pos} (v1 greys it)"),
|
||||
Some(_) => debug!("ui_gossip: ignoring coded option {pos} (coded options are greyed)"),
|
||||
None => debug!("ui_gossip: SelectGossipOption({pos}) out of range — ignored"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -805,7 +805,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
state(&app),
|
||||
(Some(36), true),
|
||||
"the flip records the dungeon AND our own eyes (1754's term 1)"
|
||||
"the flip records the dungeon AND our own eyes"
|
||||
);
|
||||
|
||||
// Writer 2, on a fresh state: a raid id is dropped, a party dungeon lands without the
|
||||
|
||||
@@ -143,7 +143,7 @@ mod tests {
|
||||
// Empty, which the drain's `is_empty()` skip drops as `0x4945b4`'s guard does.
|
||||
assert!(
|
||||
text.is_empty(),
|
||||
"reason 59's {key} resolved to {text:?} — B198's duplicate line is back"
|
||||
"reason 59's {key} resolved to {text:?} — the duplicate line is back"
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1742,7 +1742,7 @@ mod tests {
|
||||
s.eval::<String>("return table.concat(ORDER, ' ')").unwrap(),
|
||||
"ITEM_LOCK_CHANGED:nil,nil BAG_UPDATE:0,nil",
|
||||
"the shot signal fires — with NO arguments, as all five of the reference's fire sites \
|
||||
do (decision 2140) — and precedes BAG_UPDATE. The slot it names travels in the fact \
|
||||
do — and precedes BAG_UPDATE. The slot it names travels in the fact \
|
||||
that it fired at all, which is enough: every consumer repaints from its own `this`, \
|
||||
and Quiver's shot timer only needs to know that A shot happened"
|
||||
);
|
||||
|
||||
@@ -1626,7 +1626,7 @@ mod count_of_tests {
|
||||
assert_eq!(
|
||||
count_of(&store, &objs.get(), AMMO, InventoryScope::CARRIED),
|
||||
0,
|
||||
"benilla's pre-1158 count reached neither band — the named narrowing"
|
||||
"the carried scope reaches neither worn gear nor the keyring — the named narrowing"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -624,7 +624,7 @@ mod tests {
|
||||
#[test]
|
||||
fn line_table_covers_every_shape() {
|
||||
let other = Some("Bob");
|
||||
let me = Some("Sam");
|
||||
let me = Some("Aldric");
|
||||
// (packet, name, is_self, expected)
|
||||
let cases: &[(LootRoll, Option<&str>, bool, &str)] = &[
|
||||
// The three votes (`Group.cpp:970-990`), which have _SELF forms.
|
||||
@@ -665,7 +665,7 @@ mod tests {
|
||||
announce(1, 57, roll_vote::NEED),
|
||||
me,
|
||||
true,
|
||||
"Need Roll - 57 for {L} by Sam",
|
||||
"Need Roll - 57 for {L} by Aldric",
|
||||
),
|
||||
(
|
||||
announce(1, 57, roll_vote::GREED),
|
||||
@@ -677,7 +677,7 @@ mod tests {
|
||||
announce(1, 57, roll_vote::GREED),
|
||||
me,
|
||||
true,
|
||||
"Greed Roll - 57 for {L} by Sam",
|
||||
"Greed Roll - 57 for {L} by Aldric",
|
||||
),
|
||||
];
|
||||
for (p, name, is_self, expect) in cases {
|
||||
@@ -698,14 +698,14 @@ mod tests {
|
||||
for roll_type in [roll_vote::NEED, roll_vote::GREED] {
|
||||
let got = format_line(
|
||||
&RollLine::Announce(announce(1, 57, roll_type)),
|
||||
Some("Sam"),
|
||||
Some("Aldric"),
|
||||
true, // is_self
|
||||
LINK,
|
||||
true,
|
||||
)
|
||||
.expect("detail on emits the dice line");
|
||||
assert!(
|
||||
got.ends_with("by Sam"),
|
||||
got.ends_with("by Aldric"),
|
||||
"our own roll must name us third-person: {got}"
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -85,7 +85,7 @@ fn load_icon_catalog(
|
||||
info!("ui_macro: {} macro icons in the chooser", icons.len());
|
||||
script.set_macro_icons(icons);
|
||||
}
|
||||
Err(e) => error!("ui_macro: SpellIcon.dbc failed — the icon chooser is empty: {e:#}"),
|
||||
Err(e) => error!("ui_macro: no Interface\\Icons\\ listing — the chooser is empty: {e:#}"),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1384,7 +1384,7 @@ mod tests {
|
||||
};
|
||||
let s = member_unit_state(&m, Some(&ghost), None, &GroupState::default(), None, None);
|
||||
assert!(s.ghost);
|
||||
assert!(!s.dead, "a released ghost is not `dead` — the 0308 §1 trio");
|
||||
assert!(!s.dead, "a released ghost is not `dead` — only a ghost");
|
||||
|
||||
// The overlay ORs: a roster byte carrying the bit still wins over a record without it.
|
||||
let stale = GroupMemberEntry {
|
||||
@@ -1607,10 +1607,10 @@ mod tests {
|
||||
}
|
||||
|
||||
let mut names = NameCache::default();
|
||||
names.insert_player(0x5E1F, "Sam".into(), None);
|
||||
names.insert_player(0x5E1F, "Kel".into(), None);
|
||||
assert_eq!(
|
||||
raid_name_of(&group, me, &names, 0x5E1F).as_deref(),
|
||||
Some("Sam")
|
||||
Some("Kel")
|
||||
);
|
||||
assert_eq!(
|
||||
raid_name_of(&group, me, &names, 0xA11CE).as_deref(),
|
||||
@@ -1622,7 +1622,7 @@ mod tests {
|
||||
raid_guid_for_name(&group, me, &names, "alice"),
|
||||
Some(0xA11CE)
|
||||
);
|
||||
assert_eq!(raid_guid_for_name(&group, me, &names, "SAM"), Some(0x5E1F));
|
||||
assert_eq!(raid_guid_for_name(&group, me, &names, "KEL"), Some(0x5E1F));
|
||||
assert_eq!(raid_guid_for_name(&group, me, &names, "Nobody"), None);
|
||||
|
||||
// Outside a raid all are empty, so a raid verb in a party sends nothing.
|
||||
@@ -1636,7 +1636,7 @@ mod tests {
|
||||
let mut group = GroupState::default();
|
||||
let me = Some(0x5E1Fu64);
|
||||
let mut names = NameCache::default();
|
||||
names.insert_player(0x5E1F, "Sam".into(), None);
|
||||
names.insert_player(0x5E1F, "Kel".into(), None);
|
||||
synthetic_raid(&mut group, &mut names, me);
|
||||
assert!(group.test, "the synthetic raid arms the sandbox");
|
||||
assert_eq!(group.group_type, GROUPTYPE_RAID);
|
||||
|
||||
@@ -1465,7 +1465,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
material_events(&app),
|
||||
(0, 0),
|
||||
"no material was built or rebuilt for a colour — the count 2236 gates on"
|
||||
"no material was built or rebuilt for a colour — a colour is a tag, not a material"
|
||||
);
|
||||
assert_eq!(
|
||||
app.world().resource::<Assets<UiQuadMaterial>>().len(),
|
||||
|
||||
@@ -26,7 +26,7 @@ fn shipped_action_bar_drives_end_to_end() {
|
||||
+ super::test_ui::load_ui(&s, "Interface\\FrameXML\\BonusActionBarFrame.xml");
|
||||
assert_eq!(
|
||||
frames, 80,
|
||||
"what the three stock files declare (1938): MainMenuBar.xml's 8 — the bar, the XP StatusBar, \
|
||||
"what the three stock files declare: MainMenuBar.xml's 8 — the bar, the XP StatusBar, \
|
||||
the overlay frame, the max-level rail, the art frame, the performance bar and its button, \
|
||||
the exhaustion tick; ActionBarFrame.xml's 14 — 12 ActionButtons and the 2 page arrows; \
|
||||
BonusActionBarFrame.xml's 24 — the bonus frame with its 12 buttons and the shapeshift frame \
|
||||
@@ -304,7 +304,7 @@ fn state_feedback_drives_cooldown_checked_and_usable_through_the_xml() {
|
||||
assert_eq!(
|
||||
(c[0], c[1], c[2]),
|
||||
(0.4, 0.4, 0.4),
|
||||
"the ref's unusable grey — the icon the director sees on food in combat"
|
||||
"the ref's unusable grey — the icon a player sees on food in combat"
|
||||
);
|
||||
|
||||
assert!(s.errors().is_empty(), "script errors: {:?}", s.errors());
|
||||
@@ -907,7 +907,7 @@ fn count_fontstring_follows_is_consumable_action_not_the_bag_count() {
|
||||
assert_eq!(
|
||||
count_of(&s, 3),
|
||||
"",
|
||||
"B201: a NON-consumable ITEM (a mount) shows no stack number, whatever the count says"
|
||||
"a NON-consumable ITEM (a mount) shows no stack number, whatever the count says"
|
||||
);
|
||||
assert!(
|
||||
s.extract()
|
||||
@@ -1048,7 +1048,7 @@ fn shipped_bag_frame_drives_end_to_end() {
|
||||
Model on each of the four slots that inherit PaperDollItemSlotButtonTemplate (+4). The \
|
||||
deleted BagFrame.xml built 12: it mirrored the six buttons and their push cards but had \
|
||||
no cooldown on a bag-bar slot at all, which is the reference's own and is what the swap \
|
||||
to Interface\\FrameXML\\MainMenuBarBagButtons.xml brought with it (1751 window 3)"
|
||||
to Interface\\FrameXML\\MainMenuBarBagButtons.xml brought with it"
|
||||
);
|
||||
|
||||
// The app's feed: a backpack with Tough Jerky ×5 in slot 1.
|
||||
@@ -1523,7 +1523,7 @@ fn the_main_bar_pages_and_a_bonus_page_still_outranks_it() {
|
||||
end return true"
|
||||
)
|
||||
.unwrap(),
|
||||
"all six pages are viewable at rest — every extra bar ships off (1500)"
|
||||
"all six pages are viewable at rest — every extra bar ships off"
|
||||
);
|
||||
// The page numeral: `ActionBarUpButton` writes it at load and on `ACTIONBAR_PAGE_CHANGED`
|
||||
// (ActionBarFrame.xml:175, 180).
|
||||
@@ -1609,7 +1609,7 @@ fn the_main_bar_pages_and_a_bonus_page_still_outranks_it() {
|
||||
s.eval::<i64>("return ActionButton_GetPagedID(BonusActionButton1)")
|
||||
.unwrap(),
|
||||
25,
|
||||
"and off page 1 even the bonus button follows the page: the conjunct 1897 found missing"
|
||||
"and off page 1 even the bonus button follows the page"
|
||||
);
|
||||
s.set_bonus_bar_offset(0);
|
||||
assert_eq!(
|
||||
@@ -1701,7 +1701,7 @@ fn bonus_bar_slides_up_with_sound_and_down_without() {
|
||||
vec![(73, false)],
|
||||
"the BONUS branch of stock ActionButtonUp passes a literal 0 for onSelf (ActionButton.lua:38) \
|
||||
— in a stance, ALT-1 drives the bonus page without self-cast; the reference's own rule, \
|
||||
which 1745's expectation of (73, true) had smoothed over"
|
||||
not the (73, true) a self-cast would give"
|
||||
);
|
||||
s.run("BonusActionBarFrame:Hide() ActionButtonDown(1) ActionButtonUp(1, 1)")
|
||||
.unwrap();
|
||||
|
||||
@@ -2126,7 +2126,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
script.eval::<bool>("return IsAddOnLoaded('Base') == 1").ok(),
|
||||
Some(true),
|
||||
"a startup-loaded addon must read as loaded, or every LoadOnDemand dependent of it answers DEP_NOT_DEMAND_LOADED"
|
||||
"a startup-loaded addon reads as loaded, else a dependent answers DEP_NOT_DEMAND_LOADED"
|
||||
);
|
||||
assert_eq!(
|
||||
script.eval::<bool>("return OptsRan == nil").ok(),
|
||||
|
||||
@@ -314,7 +314,7 @@ fn bagnon_draws_a_slot_for_every_bag_slot() {
|
||||
assert_eq!(
|
||||
bagnon_slot_quads(&mut s),
|
||||
28,
|
||||
"every live slot must actually be DRAWN (16 backpack + 12 keyring) — the director saw a \
|
||||
"every live slot must actually be DRAWN (16 backpack + 12 keyring) — broken, it drew a \
|
||||
title and a gold line and nothing else, while every column of the addon survey called \
|
||||
this addon fine"
|
||||
);
|
||||
@@ -424,7 +424,7 @@ fn the_item_button_helpers_paint_a_slots_icon_and_count() {
|
||||
assert_eq!(
|
||||
&tint[..3],
|
||||
&[0.5, 0.5, 0.5],
|
||||
"a locked item greys out (ref: `elseif not r or not shaderSupported`)"
|
||||
"a locked item keeps the caller's 0.5 grey (ref: with a shader, r, g, b stay as passed)"
|
||||
);
|
||||
|
||||
// A count of 1 hides the label again (`ItemButtonTemplate.lua:12`).
|
||||
@@ -906,7 +906,7 @@ fn a_stack_count_wears_the_font_object_its_font_attr_names() {
|
||||
);
|
||||
assert_eq!(
|
||||
shadow, None,
|
||||
"and NO drop shadow: NumberFontNormal has no <Shadow> in 1.12 either (Fonts.xml:226). \
|
||||
"and NO drop shadow: NumberFontNormal has no <Shadow> in 1.12 either (Fonts.xml:150). \
|
||||
The readability is the outline; adding a shadow here would be a divergence"
|
||||
);
|
||||
}
|
||||
@@ -1308,6 +1308,6 @@ fn the_backpack_button_lit_state_with_bagnon_holding_the_bags() {
|
||||
!s.eval::<bool>("return MainMenuBarBackpackButton:GetChecked() and true or false")
|
||||
.unwrap(),
|
||||
"open by click ⇒ unlit: the stock BackpackButton_OnClick tail's native scan is the last \
|
||||
word, as on the reference (Bug 7's divergence retired with the stock bag bar, 1783)"
|
||||
word, as on the reference, since the bag bar is the stock file"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ fn bankframe_opened_shows_and_sets_the_title() {
|
||||
);
|
||||
assert!(
|
||||
!bag_open(&s, 0),
|
||||
"the reference's bank leaves your bags alone (0561 is the vendor's, not the bank's)"
|
||||
"the reference's bank leaves your bags alone (opening them is the vendor's, not the bank's)"
|
||||
);
|
||||
assert!(
|
||||
s.eval::<bool>("return GetLeftFrame() == BankFrame")
|
||||
@@ -117,7 +117,7 @@ fn bankframe_closed_queues_close_closes_open_popouts_and_plays_the_close_kit() {
|
||||
);
|
||||
assert!(
|
||||
s.take_bank_close(),
|
||||
"OnHide queued CloseBankFrame() — the client-side close intent (no wire opcode, decision 0604)"
|
||||
"OnHide queued CloseBankFrame() — the client-side close intent (no wire opcode)"
|
||||
);
|
||||
assert!(
|
||||
s.eval::<bool>("return GetLeftFrame() == nil").unwrap(),
|
||||
|
||||
@@ -76,7 +76,7 @@ fn error_message_is_the_installed_handler_and_the_host_channel_stays_sighted() {
|
||||
assert!(
|
||||
s.eval::<bool>("return geterrorhandler() == _ERRORMESSAGE")
|
||||
.unwrap(),
|
||||
"the reference's own default handler is installed (1305)"
|
||||
"the reference's own default handler is installed"
|
||||
);
|
||||
// An addon's pcall wrapper reports through `geterrorhandler()`, which pops the dialog.
|
||||
s.run(r#"geterrorhandler()("reported")"#).unwrap();
|
||||
|
||||
@@ -240,6 +240,6 @@ fn the_list_rows_carry_the_queue_status() {
|
||||
.unwrap(),
|
||||
None,
|
||||
"an un-queued row's status line is blank, and a blank FontString reads back NIL \
|
||||
(`FontString:GetText 0x79d690` substitutes — decision 2110)"
|
||||
(`FontString:GetText 0x79d690` substitutes nil)"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -89,9 +89,9 @@ fn no_shipped_file_declares_its_own_copy_of_a_managed_offset() {
|
||||
}
|
||||
assert!(
|
||||
offences.is_empty(),
|
||||
"a managed offset is owned by UIParent.xml's manage pass and may only be READ elsewhere \
|
||||
"a managed offset is owned by UIParent.lua's manage pass and may only be READ elsewhere \
|
||||
(fall back inline at the point of use — `local y = CONTAINER_OFFSET_Y or 70` — never by \
|
||||
assigning a copy, which goes stale the moment a bar is raised; decision 1499):\n{}",
|
||||
assigning a copy, which goes stale the moment a bar is raised):\n{}",
|
||||
offences.join("\n")
|
||||
);
|
||||
}
|
||||
@@ -137,7 +137,7 @@ const BOTTOM_EXEMPT: &[(&str, &str)] = &[
|
||||
"ItemRefTooltip",
|
||||
"the reference's own answer, matched exactly (ItemRef.xml l.4): frameStrata HIGH + \
|
||||
toplevel + movable at BOTTOM +80. A linked-item window lands ABOVE the HIGH bars rather \
|
||||
than clearing them (decision 1318), and the player drags it where they want",
|
||||
than clearing them, and the player drags it where they want",
|
||||
),
|
||||
(
|
||||
"ChatFrame3",
|
||||
@@ -153,8 +153,8 @@ const BOTTOM_EXEMPT: &[(&str, &str)] = &[
|
||||
"the world map's full-screen cover (WorldMapFrame.xml) — TOPLEFT+BOTTOMRIGHT is how it \
|
||||
fills the screen, not a seat in the contested band, and clearance is the opposite of \
|
||||
what it wants: a blackout lifted over the action bars would leave a strip of world \
|
||||
showing under the map. It joins this population at all only because decision 1757 took \
|
||||
its parent=UIParent away, which is what lets it survive the UIParent:Hide() that \
|
||||
showing under the map. It joins this population at all only because it has no \
|
||||
parent=UIParent, which is what lets it survive the UIParent:Hide() that \
|
||||
showing the map performs",
|
||||
),
|
||||
];
|
||||
@@ -194,8 +194,8 @@ fn every_bottom_anchored_top_level_frame_is_accounted_for() {
|
||||
unaccounted.is_empty(),
|
||||
"these top-level frames anchor to the screen's bottom edge but nothing decides their \
|
||||
clearance over the action bars. Give each one a row in \
|
||||
UIPARENT_MANAGED_FRAME_POSITIONS (the stock UIParent.lua's table, since 1988), or add \
|
||||
it to BOTTOM_EXEMPT here with the reason it needs no row (decision 1499):\n{}",
|
||||
UIPARENT_MANAGED_FRAME_POSITIONS (the stock UIParent.lua's table), or add \
|
||||
it to BOTTOM_EXEMPT here with the reason it needs no row:\n{}",
|
||||
unaccounted.join("\n")
|
||||
);
|
||||
}
|
||||
@@ -328,7 +328,7 @@ fn no_bottom_band_frame_overlaps_a_raised_bar() {
|
||||
!overlaps(bar_rect, v),
|
||||
"with {raised:?} raised, {victim} {v:?} overlaps {bar} {bar_rect:?} — \
|
||||
something in the bottom band is not clearing the bars. Its seat must come \
|
||||
from UIParent_ManageFramePositions, read fresh (decision 1499)."
|
||||
from UIParent_ManageFramePositions, read fresh."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -784,7 +784,7 @@ fn tab_round_trip_with_a_selected_skill_by_point() {
|
||||
click(&mut s, character_tab);
|
||||
assert!(
|
||||
shown(&mut s, "PaperDollFrame"),
|
||||
"the Character tab switches back (the 2026-07-17 report)"
|
||||
"the Character tab switches back"
|
||||
);
|
||||
assert!(!shown(&mut s, "SkillFrame"), "Skills page yields");
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ fn the_background_row_opens_the_picker_and_its_opacity_slider_drives_the_window(
|
||||
assert!(
|
||||
s.eval::<bool>("return OpacitySliderFrame:IsVisible()")
|
||||
.unwrap(),
|
||||
"and the picker wears its opacity slider — B246's 'background slider'"
|
||||
"and the picker wears its opacity slider — the chat window's 'background slider'"
|
||||
);
|
||||
assert_eq!(
|
||||
s.eval::<f64>("return OpacitySliderFrame:GetValue()")
|
||||
|
||||
@@ -1144,7 +1144,7 @@ fn a_quick_exit_and_reentry_keeps_the_plates_hover_fade() {
|
||||
assert!(
|
||||
bare.eval::<bool>("return ChatFrame1Tab:IsVisible() and ChatFrame1.oldAlpha == nil and ChatFrame1.hover == 1")
|
||||
.unwrap(),
|
||||
"the trapped state the director described: tab up, oldAlpha nil, hover stuck"
|
||||
"the trapped state: tab up, oldAlpha nil, hover stuck"
|
||||
);
|
||||
|
||||
// The shipped interface, with the guard the manifest load installs.
|
||||
|
||||
@@ -392,8 +392,8 @@ fn a_dropdown_row_with_has_color_swatch_opens_the_picker_and_cancel_restores() {
|
||||
-- The anchor needs a POSITION. `ToggleDropDownMenu` anchors the list to this frame and then
|
||||
-- guards on `listFrame:GetCenter()`, hiding the list again and returning when it is nil
|
||||
-- (ref UIDropDownMenu.lua:624-631) — so an unplaced dropdown opens no menu in the real
|
||||
-- client either. Our deleted transcription carried no such guard and showed it regardless,
|
||||
-- which is the only reason this fixture ever worked unanchored.
|
||||
-- client either. The guard is why this fixture places the dropdown: unanchored, the stock
|
||||
-- file hides the list again at once and the test would see no menu at all.
|
||||
dd:SetPoint("CENTER", 0, 0)
|
||||
UIDropDownMenu_Initialize(dd, function()
|
||||
local info = {}
|
||||
|
||||
@@ -145,7 +145,7 @@ fn combat_text_crit_pops_and_parks() {
|
||||
let h = extracted_text_height(&mut s, "-64").expect("crit still drawn");
|
||||
assert!(
|
||||
h > 30.0 && h <= 60.0,
|
||||
"crit pop animates the height UNCAPPED past 32 (decision 0582), got {h}"
|
||||
"crit pop animates the height UNCAPPED past 32, got {h}"
|
||||
);
|
||||
assert!(s.errors().is_empty(), "script errors: {:?}", s.errors());
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ fn xp_loss_cancel_then_reconfirm_reshows_with_the_alert_dress() {
|
||||
s.fire_event("CONFIRM_XP_LOSS", vec![]);
|
||||
assert!(
|
||||
s.eval::<bool>("return StaticPopup1:IsVisible()").unwrap(),
|
||||
"a fresh confirm re-shows after a Cancel (B80's deadlock)"
|
||||
"a fresh confirm re-shows after a Cancel (no deadlock)"
|
||||
);
|
||||
s.run("StaticPopup_Hide(\"XP_LOSS\")").unwrap();
|
||||
s.run(concat!(
|
||||
|
||||
@@ -178,7 +178,7 @@ fn delete_item_confirm_no_clears_without_destroying() {
|
||||
s.tick(0.01); // ITEM_LOCK_CHANGED fires from the pending queue at the next tick
|
||||
assert!(
|
||||
s.eval::<i64>("return repaints").unwrap() >= 1,
|
||||
"the clear's ITEM_LOCK_CHANGED repaints the bag (the stuck-darkened slot, 0218)"
|
||||
"the clear's ITEM_LOCK_CHANGED repaints the bag (no stuck-darkened slot)"
|
||||
);
|
||||
assert!(
|
||||
!s.eval::<bool>("local _, _, locked = GetContainerItemInfo(0, 1) return locked")
|
||||
@@ -187,7 +187,7 @@ fn delete_item_confirm_no_clears_without_destroying() {
|
||||
);
|
||||
assert!(
|
||||
!desaturated(&mut s, &slot1),
|
||||
"…and the repaint un-darkened it — the 0218 stuck-dark slot"
|
||||
"…and the repaint un-darkened it — no stuck-dark slot"
|
||||
);
|
||||
assert!(s.errors().is_empty(), "script errors: {:?}", s.errors());
|
||||
}
|
||||
|
||||
@@ -355,7 +355,7 @@ fn escape_ladder_cast_then_windows_then_target_one_eater_per_press() {
|
||||
);
|
||||
assert!(
|
||||
!s.take_target_clear(),
|
||||
"the same press must NOT also drop the target (the raw-key double-fire 0449 retires)"
|
||||
"the same press must NOT also drop the target (no raw-key double-fire)"
|
||||
);
|
||||
|
||||
// Press 2, the cast over: `CloseAllWindows` eats it.
|
||||
|
||||
@@ -1673,7 +1673,7 @@ mod clip_plumb_tests {
|
||||
frame:SetScrollChild(child)
|
||||
local marker = child:CreateTexture(nil, "ARTWORK")
|
||||
marker:SetTexture(1, 0, 0) -- pathless colored quad: no BLP asset needed
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor (1310)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor
|
||||
"#,
|
||||
)
|
||||
.unwrap();
|
||||
@@ -1759,7 +1759,7 @@ mod clip_plumb_tests {
|
||||
plain:SetWidth(50); plain:SetHeight(50)
|
||||
local m = plain:CreateTexture(nil, "ARTWORK")
|
||||
m:SetTexture(0, 1, 0)
|
||||
m:SetAllPoints() -- templateless Lua region: no implicit anchor (1310)
|
||||
m:SetAllPoints() -- templateless Lua region: no implicit anchor
|
||||
"#,
|
||||
)
|
||||
.unwrap();
|
||||
@@ -1948,7 +1948,7 @@ mod extract_gate_tests {
|
||||
plain:SetWidth(50); plain:SetHeight(50)
|
||||
marker = plain:CreateTexture(nil, "ARTWORK")
|
||||
marker:SetTexture(1, 0, 0)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor (1310)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor
|
||||
"#,
|
||||
)
|
||||
}
|
||||
@@ -2157,7 +2157,7 @@ mod extract_gate_tests {
|
||||
plain:SetWidth(50); plain:SetHeight(50)
|
||||
marker = plain:CreateTexture(nil, "ARTWORK")
|
||||
marker:SetTexture(0, 0, 1)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor (1310)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor
|
||||
"#,
|
||||
);
|
||||
reference.update();
|
||||
@@ -2216,7 +2216,7 @@ mod extract_gate_tests {
|
||||
plain:SetWidth(50); plain:SetHeight(50)
|
||||
marker = plain:CreateTexture(nil, "ARTWORK")
|
||||
marker:SetTexture(0, 1, 0)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor (1310)
|
||||
marker:SetAllPoints() -- templateless Lua region: no implicit anchor
|
||||
"#,
|
||||
);
|
||||
reference.update();
|
||||
|
||||
@@ -59,7 +59,7 @@ pub(crate) fn trace(feed: &'static str, inputs: &[(&str, bool)]) {
|
||||
pub(crate) fn audit_push(gate_closed: bool, feed: &str, what: &str) {
|
||||
assert!(
|
||||
!gate_closed,
|
||||
"feed gate audit (1439): {feed} pushed {what} on a CLOSED gate — \
|
||||
"feed gate audit: {feed} pushed {what} on a CLOSED gate — \
|
||||
an input is missing from its gate"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -398,7 +398,7 @@ fn nothing_repaints_a_frame_that_opened_before_its_snapshot() {
|
||||
s.eval::<Option<String>>("return GroupLootFrame1Name:GetText()")
|
||||
.unwrap(),
|
||||
None,
|
||||
"nothing to paint yet — this is the state B371 reported"
|
||||
"nothing to paint yet — this is the reported state"
|
||||
);
|
||||
|
||||
s.set_loot_rolls(rolls());
|
||||
|
||||
@@ -64,7 +64,7 @@ fn the_self_menu_row_gates_on_the_binding_and_confirms_before_sending() {
|
||||
s.run(
|
||||
r#"
|
||||
-- The stock raid pane concatenates this into each of its eight group headers inside
|
||||
-- their own OnLoad, so it has to exist before the addon loads (1874).
|
||||
-- their own OnLoad, so it has to exist before the addon loads.
|
||||
GROUP = "Group"
|
||||
RESET_INSTANCES = "Reset all instances"
|
||||
CONFIRM_RESET_INSTANCES = "Do you really want to reset all of your instances?"
|
||||
|
||||
@@ -421,7 +421,7 @@ fn the_action_bar_abbreviation_is_the_refs_own_getbindingtext() {
|
||||
s.eval::<String>(r#"return GetBindingText("SHIFT-2", "KEY_", 1)"#)
|
||||
.unwrap(),
|
||||
"s-2",
|
||||
"the director's SHIF… truncation reads s-2 now"
|
||||
"SHIFT-2 reads s-2, not a SHIF… truncation"
|
||||
);
|
||||
assert_eq!(
|
||||
s.eval::<String>(r#"return GetBindingText("ALT-Z", "KEY_", 1)"#)
|
||||
@@ -649,7 +649,7 @@ fn the_pet_lane_is_registered_under_the_action_bar_header() {
|
||||
s.eval::<Option<u32>>(r#"return SetBinding("MOUSEWHEELUP", "BONUSACTIONBUTTON1")"#)
|
||||
.unwrap(),
|
||||
Some(1),
|
||||
"a press+release command takes the wheel — the refusal was ours, B265"
|
||||
"a press+release command takes the wheel — the reference does not refuse it"
|
||||
);
|
||||
|
||||
// Search matches display names (the era's `AddSearchTags`), so the query is the row's label.
|
||||
|
||||
@@ -91,7 +91,7 @@ fn shipped_loot_frame_drives_end_to_end() {
|
||||
assert_eq!(
|
||||
load_xml(&s, "Interface\\FrameXML\\LootFrame.xml"),
|
||||
34,
|
||||
"the STOCK file's own shape (1751): the window, its portrait overlay and Next/Prev art, \
|
||||
"the STOCK file's own shape: the window, its portrait overlay and Next/Prev art, \
|
||||
four LootButton rows each carrying ItemButtonTemplate's sub-frames, the two pagers, the \
|
||||
close button, and GroupLootDropDown with the dropdown template's own children. Our \
|
||||
transcription materialized 10 — a count is a fingerprint of a file, not a property of a \
|
||||
|
||||
@@ -290,7 +290,7 @@ mod tests {
|
||||
for name in super::super::content::shipped_files() {
|
||||
assert!(
|
||||
!reference_ui::is_chain_entry(name),
|
||||
"assets/ui is flat by construction, but ships {name} — a manifest entry with a separator is read as a file to source off the player's install"
|
||||
"assets/ui is flat, but ships {name}: a separator makes it a file off the install"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ fn shipped_multibars_drive_end_to_end() {
|
||||
let frames = super::test_ui::load_ui(&s, "Interface\\FrameXML\\MultiActionBars.xml");
|
||||
assert_eq!(
|
||||
frames, 100,
|
||||
"what stock MultiActionBars.xml declares (1938): the four bar frames and their 48 buttons, \
|
||||
"what stock MultiActionBars.xml declares: the four bar frames and their 48 buttons, \
|
||||
each with a $parentCooldown — the same 100 ours built for the same seats"
|
||||
);
|
||||
|
||||
@@ -1611,7 +1611,7 @@ fn a_forms_state_change_leaves_the_shelf_down_over_the_raised_bar() {
|
||||
for region in shelf {
|
||||
assert!(
|
||||
!shown(&s, region),
|
||||
"{region}: the director's plate — the shelf re-shown over the raised bar"
|
||||
"{region}: the shelf re-shown over the raised bar"
|
||||
);
|
||||
}
|
||||
assert_eq!(ring(&s), 50.0);
|
||||
|
||||
@@ -2159,7 +2159,7 @@ fn a_hovered_row_raises_its_1_12_description_on_the_era_seat() {
|
||||
assert_eq!(
|
||||
s.eval::<i64>("return GameTooltip:NumLines()").unwrap(),
|
||||
1,
|
||||
"the description ALONE — the era's white name line is cut (1054)"
|
||||
"the description ALONE — the era's white name line is cut"
|
||||
);
|
||||
// The era seat, `DefaultTooltipMixin`'s `ANCHOR_RIGHT` at x -10: BOTTOMLEFT on the label
|
||||
// region's TOPRIGHT, 10 back.
|
||||
@@ -2589,7 +2589,7 @@ fn defaults_resets_the_combat_page_to_the_shipped_assignments() {
|
||||
assert_eq!(
|
||||
s.eval::<String>("return SHOW_COMBAT_TEXT").unwrap(),
|
||||
"0",
|
||||
"the master walks back too — the reference's own value since 1804"
|
||||
"the master walks back too — the reference's own value"
|
||||
);
|
||||
assert_eq!(
|
||||
s.eval::<String>("return COMBAT_TEXT_SHOW_AURAS").unwrap(),
|
||||
@@ -3280,7 +3280,7 @@ fn the_defaults_button_is_armed_by_rows_not_by_a_category() {
|
||||
.unwrap();
|
||||
assert!(
|
||||
has_rows || key == "Keybindings",
|
||||
"{key} opens onto nothing — every category leads somewhere since 1139"
|
||||
"{key} opens onto nothing — every category leads somewhere"
|
||||
);
|
||||
s.run(&format!("BenillaOptionsFrameCategoryListRow{key}:Click()"))
|
||||
.unwrap();
|
||||
|
||||
@@ -45,7 +45,7 @@ fn shipped_gossip_frame_drives_end_to_end() {
|
||||
assert_eq!(
|
||||
load_xml(&s, "Interface\\FrameXML\\GossipFrame.xml"),
|
||||
43,
|
||||
"the stock file's own shape (1751) — ours materialized 41"
|
||||
"the stock file's own shape — ours materialized 41"
|
||||
);
|
||||
|
||||
s.resolve();
|
||||
@@ -961,7 +961,7 @@ fn an_addons_own_frame_registered_in_uipanelwindows_takes_the_left_slot() {
|
||||
/// The registry rows as `UIParent.lua:14-50` writes them. An unregistered frame opens with a bare
|
||||
/// `Show` and takes no slot (`:658-661`), so a missing row lets the next panel seat over it.
|
||||
#[test]
|
||||
fn the_1507_registry_rows_match_the_reference_bytes() {
|
||||
fn the_panel_registry_rows_match_the_reference_bytes() {
|
||||
let _data = benilla_formats::wow_data_or_skip!();
|
||||
let s = UiScript::new().unwrap();
|
||||
load_xml(&s, r"Interface\FrameXML\MoneyFrame.lua");
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user