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:
Sam Sung
2026-09-26 01:06:28 +07:00
committed by GitHub
co-authored by Claude Opus 5.5
parent f98c1a5396
commit b50efc0a53
135 changed files with 467 additions and 464 deletions
+8 -8
View File
@@ -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;
+6 -6
View File
@@ -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
);
}
+1 -1
View File
@@ -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()
+6 -6
View File
@@ -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.
+11 -11
View File
@@ -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`.
+1 -1
View File
@@ -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())
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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 {
+7 -7
View File
@@ -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 \
+4 -1
View File
@@ -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 {
+1 -1
View File
@@ -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!(
+2 -2
View File
@@ -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.
+2 -2
View File
@@ -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!(
+1 -1
View File
@@ -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),
+25 -25
View File
@@ -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",
+1 -1
View File
@@ -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);
+13 -13
View File
@@ -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!(
+2 -2
View File
@@ -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]
+1 -1
View File
@@ -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),
+2 -2
View File
@@ -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);
}
+1 -1
View File
@@ -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),
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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!(
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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();
+1 -1
View File
@@ -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),
+4 -4
View File
@@ -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"
);
}
}
+1 -1
View File
@@ -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");
}
}
+1 -1
View File
@@ -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");
}
+1 -1
View File
@@ -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"
);
}
}
+7 -7
View File
@@ -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,
+3 -3
View File
@@ -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,
+1 -1
View File
@@ -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() {
+4 -4
View File
@@ -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"
);
}
+2 -2
View File
@@ -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"
);
}
+1 -1
View File
@@ -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"
);
}
+6 -6
View File
@@ -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 \
+1 -1
View File
@@ -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());
}
+4 -4
View File
@@ -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 "),
);
}
+2 -2
View File
@@ -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"
);
}
+1 -1
View File
@@ -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.
+4 -4
View File
@@ -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)"
);
}
+1 -1
View File
@@ -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"
);
}
+6 -6
View File
@@ -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"
);
}
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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));
+1 -1
View File
@@ -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 => {}
}
+1 -1
View File
@@ -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),
+3 -3
View File
@@ -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)")
+1 -1
View File
@@ -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}"),
}
+1 -1
View File
@@ -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"),
}
}
+1 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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"
);
+1 -1
View File
@@ -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"
);
}
+5 -5
View File
@@ -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!(
+1 -1
View File
@@ -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:#}"),
}
}
+5 -5
View File
@@ -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);
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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 \
+1 -1
View File
@@ -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