mirror of
https://github.com/horizon-rust/horizon.git
synced 2026-11-07 11:06:11 -10:00
Merge pull request #10170 from TheMrZZ/fix/furnace-loaded-cooking-total
🤖 Agent: a loaded furnace keeps its saved cooking total until the item finishes, and a hopper or dropper filling the empty input slot restarts the cooking as setItem does (kacpherek's point); furnace_loaded_total and furnace_output_components pass.
This commit is contained in:
5 files changed
+512
-3
No files matched your search
@@ -78,9 +78,6 @@ impl FurnaceCooking for Furnace {
|
||||
if lit || has_fuel && has_ingredient {
|
||||
if let Some(ingredient) = self.items[0].clone() {
|
||||
if let Some(recipe) = recipes.cook(self.kind.recipe_type(), &ingredient) {
|
||||
if self.cooking_timer == 0 {
|
||||
self.cooking_total = total_time(recipe.time, self.speed);
|
||||
}
|
||||
let max = items.get(&recipe.result.item).map_or(64, |i| i.max_stack);
|
||||
let can_burn = match &self.items[2] {
|
||||
None => true,
|
||||
@@ -250,6 +247,69 @@ mod tests {
|
||||
(items, recipes, providers)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn loaded_totals_survive_until_actual_completion() {
|
||||
let (items, recipes, providers) = data("loaded-total");
|
||||
assert_eq!(
|
||||
recipes
|
||||
.cook(
|
||||
FurnaceKind::Furnace.recipe_type(),
|
||||
&ItemStack::new("test:ore", 3)
|
||||
)
|
||||
.unwrap()
|
||||
.time,
|
||||
200
|
||||
);
|
||||
// Fresh Java's five-case Game fixture independently admits the loaded
|
||||
// zero (including a missing saved field), five and normal totals.
|
||||
for (total, timer, completion) in [(0, 0, 1), (5, 0, 5), (200, 0, 200), (5, 1, 4)] {
|
||||
let mut f = Furnace {
|
||||
kind: FurnaceKind::Furnace,
|
||||
items: [Some(ItemStack::new("test:ore", 3)), None, None],
|
||||
lit_remaining: 20,
|
||||
lit_total: 20,
|
||||
cooking_timer: timer,
|
||||
cooking_total: total,
|
||||
speed: 1.0,
|
||||
recipes_used: HashMap::new(),
|
||||
};
|
||||
for elapsed in 1..=6 {
|
||||
let mut drops = Vec::new();
|
||||
assert!(!f.idle());
|
||||
assert_eq!(f.tick(&recipes, &items, &providers, &mut drops), None);
|
||||
assert!(drops.is_empty());
|
||||
assert_eq!((f.lit_remaining, f.lit_total), (20 - elapsed, 20));
|
||||
assert!(f.items[1].is_none());
|
||||
let complete = elapsed >= completion;
|
||||
assert_eq!(
|
||||
f.items[0].as_ref().unwrap().count,
|
||||
if complete { 2 } else { 3 },
|
||||
"loaded {total}/{timer}, tick {elapsed}"
|
||||
);
|
||||
assert_eq!(
|
||||
f.items[2].as_ref().map(|s| (&*s.item, s.count)),
|
||||
if complete {
|
||||
Some(("test:ingot", 1))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
);
|
||||
assert_eq!(f.cooking_total, if complete { 200 } else { total });
|
||||
assert_eq!(
|
||||
f.cooking_timer,
|
||||
if complete {
|
||||
elapsed - completion
|
||||
} else {
|
||||
timer + elapsed
|
||||
}
|
||||
);
|
||||
}
|
||||
// A changed input still goes through setItem's independent reset.
|
||||
f.set_input(&recipes, Some(ItemStack::new("test:ingot", 1)));
|
||||
assert_eq!((f.cooking_timer, f.cooking_total), (0, 200));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cooking_requires_output_components_and_capacity() {
|
||||
let (items, recipes, providers) = data("output-components");
|
||||
|
||||
@@ -646,6 +646,7 @@ impl Game<'_> {
|
||||
let was_empty = c.is_empty(view);
|
||||
let max = c.max_stack(&stack);
|
||||
let mut success = false;
|
||||
let mut filled_empty = false;
|
||||
let Some(target) = self.slot_mut_at(view, slot) else {
|
||||
return (Some(stack), false);
|
||||
};
|
||||
@@ -663,6 +664,7 @@ impl Game<'_> {
|
||||
});
|
||||
stack.count = 0;
|
||||
success = true;
|
||||
filled_empty = true;
|
||||
}
|
||||
Some(current)
|
||||
// HopperBlockEntity.canMergeItems
|
||||
@@ -676,6 +678,17 @@ impl Game<'_> {
|
||||
}
|
||||
Some(_) => {}
|
||||
}
|
||||
// tryMoveInItem's setItem on an empty slot: AbstractFurnaceBlockEntity.setItem restarts
|
||||
// the cooking for a new input (a merge only grows the stack, and keeps it).
|
||||
let recipes = world_recipes!(self);
|
||||
if filled_empty
|
||||
&& let Some((pos, 0)) = view.locate(slot)
|
||||
&& let Some(BlockEntity::Furnace(furnace)) = self.world.block_entities.get_mut(&pos)
|
||||
{
|
||||
use horizon_client::furnace::FurnaceCooking;
|
||||
let input = furnace.items[0].take();
|
||||
furnace.set_input(recipes, input);
|
||||
}
|
||||
if success && was_empty && view.kind == Kind::Hopper {
|
||||
let dest = view.parts[0].0;
|
||||
let from_ticked = from_hopper.and_then(|p| self.hoppers.get(&p).map(|h| h.ticked));
|
||||
|
||||
@@ -0,0 +1,263 @@
|
||||
# Loaded furnace cooking totals
|
||||
|
||||
`AbstractFurnaceBlockEntity.loadAdditional` loads a missing total as zero.
|
||||
`serverTick` increments the loaded spent value, compares it with the stored total,
|
||||
and only after completion replaces the total with the recipe duration. Changing
|
||||
an input separately updates its duration through `setItem`. H119 repairs only
|
||||
the unconditional early reset in `FurnaceCooking::tick`.
|
||||
|
||||
The actorless real Game/Java fixture loads five lit furnaces with remaining/total
|
||||
burn20, raw_iron3 and no fuel. Cases are missing/zero/five/200 total at spent0,
|
||||
and five at spent1. It observes cumulative0/1/4/5/6 actual ticks. Every observation
|
||||
has positive loaded, floor, furnace id/coordinates and lit-state guards, complete
|
||||
slot values, spent/total, remaining/total burn and exact relative clock deltas.
|
||||
|
||||
Fresh pinned Java26.3 admits first completion at1 for missing/zero, at5 for
|
||||
five/spent0, and at4 for five/spent1. The 200 control does not complete. Input and
|
||||
output counts and the post-completion200 duration are checked independently.
|
||||
|
||||
## Predeclared comparison
|
||||
|
||||
Runtime source is `ff4b4b17bd02bc7a5e7994bbf630c662805172e8`.
|
||||
The canonical342 script SHA-256 is
|
||||
`7a6fa274b80333ff2050d702ef7e7b2f95c4ca4598aa8afa270db9a59b46653e`;
|
||||
fresh Java reference is
|
||||
`83da0fd40a30d970d8e0522672691baa4238503f94a0bc3738ba0670af74dc56`.
|
||||
The untouched actual Game matches **300/342**:42 state observations fail across
|
||||
missing16/zero16/five10. Both controls pass. The native capture independently
|
||||
regenerates and requires byte-identical Java reference bytes.
|
||||
|
||||
The original full373 remains executable and unchanged, script SHA-256
|
||||
`34e0946661c581b208f231f95024fd3f5314fa5e65ae4bc09c7879c3b169986a`.
|
||||
Its frozen fresh Java reference is
|
||||
`8fd31c23900a40c08655034050c27f629eee1ef1a16020ccd17b894c7012374a`.
|
||||
Its untouched result is **300/373**, a mixed diagnostic rather than73 H119 defects.
|
||||
|
||||
Exactly31 labels are outside canonical342: the25
|
||||
`{missing,zero,five,normal,started}-{0,1,4,5,6}-full-tag` labels and the six
|
||||
`clock-start` / `{0,1,4,5,6}-clock-raw` labels. All commands still execute and their
|
||||
actual traces remain raw. Full373 compares their complete records separately.
|
||||
The25 whole-tag presentations have the existing H191 insertion-order seam;
|
||||
12 also contain H119 state differences, whose fields remain strictly covered by
|
||||
retained scalar/slot reads. The six absolute startup-clock values differ across
|
||||
engines; all actual relative deltas remain strict. No full373, whole-tag or raw
|
||||
absolute-clock equality claim is made. No formatter or clock repair is included.
|
||||
|
||||
The initial369-record draft omitted the required frozen-world step command and
|
||||
used the wrong tick-count property. Its full script/reference/raw output is
|
||||
retained as a rejected clock admission, not furnace failure evidence.
|
||||
|
||||
## Run
|
||||
|
||||
With prepared26.3 resources, use separate output folders for every capture:
|
||||
|
||||
```sh
|
||||
python3 tools/test_furnace_loaded_total_parity.py --reference-only --work-dir .local/h119/java
|
||||
python3 tools/test_furnace_loaded_total_parity.py --binary /absolute/path/to/game \
|
||||
--work-dir .local/h119/native --reference .local/h119/java/vanilla.jsonl
|
||||
```
|
||||
|
||||
For the complete original diagnostic add `--full-diagnostic`. Its `--reference`
|
||||
can name the frozen full373 reference; new Java admission output is retained
|
||||
separately, including its exact absolute clocks. The wrapper compares complete
|
||||
raw JSON records without the shared runner's presentation masks or tolerances.
|
||||
Reports include every expected/actual difference and both reference hashes.
|
||||
|
||||
## Fixed state and supplementary bookkeeping
|
||||
|
||||
The unchanged342 script/reference pair passes **342/342** with the three-line
|
||||
repair. The identical resource-free real `FurnaceCooking::tick` regression fails
|
||||
old at zero/tick1 (input3 instead of2) and passes fixed. All six furnace helper
|
||||
tests pass, including idle and fuel remainder controls. Changed-input duration
|
||||
and successful-completion duration updates remain intact.
|
||||
|
||||
`RecipesUsed` is checked by a separate predeclared25-record program, not a
|
||||
changed342 denominator. Labels are
|
||||
`{missing,zero,five,normal,started}-{0,1,4,5,6}-recipes-used`, script SHA-256
|
||||
`f34bf350f1880f24145601106c42a36b9b89a2578b399e09647751a839617b23`,
|
||||
fresh Java reference SHA-256
|
||||
`c0a58afa324cae82a67fd419c64de70f817c6d288e77d8d875339e3822567eb5`.
|
||||
All original setup/clock commands still execute, with complete actual traces.
|
||||
Fresh Java validates their admissions plus exact maps: empty is success/result0;
|
||||
completed is `{"minecraft:iron_ingot_from_smelting_raw_iron": 1}` with Int count
|
||||
and success/result1. The first callback hypothesis (empty-map result1) is retained
|
||||
as a rejected admission; the executed25 script itself was unchanged by correcting
|
||||
that expectation before qualified pairs.
|
||||
|
||||
Use `--recipes-used-only` for this independent program, with the same reference
|
||||
workflow above. The wrapper validates actual setup/identity/load/burn/relative
|
||||
clock admissions and both passing controls from complete ordered trace records.
|
||||
There is no XP payout or recipe bookkeeping policy repair.
|
||||
|
||||
The separately declared bookkeeping pair matches **15/25 → 25/25**, with
|
||||
byte-identical fresh Java reference bytes. These are independent342 and25 gates;
|
||||
there is no combined raw-equality claim. Full373 is **300/373 → 342/373**. Its
|
||||
remaining31 records are exactly the25 H191 whole-tag presentations and six raw
|
||||
absolute clock observations; no373-green claim is made.
|
||||
|
||||
## Full diagnostic residuals
|
||||
|
||||
The tables quote exact resolved message text and callbacks for every complete
|
||||
record difference. Complete styled-span records remain in each executable
|
||||
fixture's `strict-report.json`; canonical342 and supplementary25 compare those
|
||||
complete records strictly. No diagnostic text is normalized by the comparator.
|
||||
|
||||
### Untouched full373: 300/373
|
||||
|
||||
| Label | Expected | Actual | Classification |
|
||||
| --- | --- | --- | --- |
|
||||
| `clock-start` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `0-clock-raw` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-0-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `zero-0-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `five-0-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `normal-0-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `started-0-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `1-clock-raw` | `{"messages":["The game time is 302 tick(s)"],"results":[[true,302]]}` | `{"messages":["The game time is 1 tick(s)"],"results":[[true,1]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-1-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `missing-1-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `missing-1-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["2, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `missing-1-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `missing-1-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-1-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `zero-1-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `zero-1-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["4, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `zero-1-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-1-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-1-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `five-1-cooking_total_time` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["6, 100, 2 has the following block data: 200"],"results":[[true,200]]}` | H119 completion state |
|
||||
| `normal-1-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `started-1-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `4-clock-raw` | `{"messages":["The game time is 305 tick(s)"],"results":[[true,305]]}` | `{"messages":["The game time is 4 tick(s)"],"results":[[true,4]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-4-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `missing-4-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `missing-4-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 3"],"results":[[true,3]]}` | `{"messages":["2, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | H119 completion state |
|
||||
| `missing-4-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `missing-4-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-4-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `zero-4-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `zero-4-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 3"],"results":[[true,3]]}` | `{"messages":["4, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | H119 completion state |
|
||||
| `zero-4-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-4-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-4-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `five-4-cooking_total_time` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["6, 100, 2 has the following block data: 200"],"results":[[true,200]]}` | H119 completion state |
|
||||
| `normal-4-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `started-4-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `5-clock-raw` | `{"messages":["The game time is 306 tick(s)"],"results":[[true,306]]}` | `{"messages":["The game time is 5 tick(s)"],"results":[[true,5]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-5-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `missing-5-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `missing-5-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | `{"messages":["2, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
|
||||
| `missing-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `missing-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-5-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `zero-5-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `zero-5-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | `{"messages":["4, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
|
||||
| `zero-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-5-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `five-5-all-slots` | `{"messages":["6, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["6, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `five-5-cooking_time_spent` | `{"messages":["6, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
|
||||
| `five-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `normal-5-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `started-5-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `6-clock-raw` | `{"messages":["The game time is 307 tick(s)"],"results":[[true,307]]}` | `{"messages":["The game time is 6 tick(s)"],"results":[[true,6]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-6-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `missing-6-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `missing-6-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["2, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
|
||||
| `missing-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `missing-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-6-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `zero-6-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `zero-6-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["4, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
|
||||
| `zero-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `zero-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-6-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
|
||||
| `five-6-all-slots` | `{"messages":["6, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["6, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
|
||||
| `five-6-cooking_time_spent` | `{"messages":["6, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
|
||||
| `five-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `five-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
|
||||
| `normal-6-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
| `started-6-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
|
||||
|
||||
|
||||
### Fixed full373: 342/373
|
||||
|
||||
| Label | Expected | Actual | Classification |
|
||||
| --- | --- | --- | --- |
|
||||
| `clock-start` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `0-clock-raw` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-0-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `zero-0-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `five-0-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `normal-0-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `started-0-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `1-clock-raw` | `{"messages":["The game time is 302 tick(s)"],"results":[[true,302]]}` | `{"messages":["The game time is 1 tick(s)"],"results":[[true,1]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-1-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `zero-1-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `five-1-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `normal-1-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `started-1-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `4-clock-raw` | `{"messages":["The game time is 305 tick(s)"],"results":[[true,305]]}` | `{"messages":["The game time is 4 tick(s)"],"results":[[true,4]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-4-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `zero-4-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `five-4-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `normal-4-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `started-4-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `5-clock-raw` | `{"messages":["The game time is 306 tick(s)"],"results":[[true,306]]}` | `{"messages":["The game time is 5 tick(s)"],"results":[[true,5]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-5-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `zero-5-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `five-5-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `normal-5-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `started-5-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `6-clock-raw` | `{"messages":["The game time is 307 tick(s)"],"results":[[true,307]]}` | `{"messages":["The game time is 6 tick(s)"],"results":[[true,6]]}` | Unequal raw startup clocks; elapsed clocks pass |
|
||||
| `missing-6-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `zero-6-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `five-6-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `normal-6-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
| `started-6-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
|
||||
|
||||
### Untouched supplementary25: 15/25
|
||||
|
||||
| Label | Expected | Actual | Classification |
|
||||
| --- | --- | --- | --- |
|
||||
| `missing-1-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `zero-1-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `missing-4-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `zero-4-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `missing-5-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `zero-5-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `five-5-recipes-used` | `{"messages":["6, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `missing-6-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `zero-6-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
| `five-6-recipes-used` | `{"messages":["6, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
|
||||
|
||||
## Actual absolute clock observations
|
||||
|
||||
The frozen full373 expected reference starts at301. Every contemporaneous fresh
|
||||
Java and native value remains unmodified in the raw records/traces; the observed
|
||||
starts/ends below are engine-specific, not equalized or subtracted in those
|
||||
records. The retained canonical score operations separately prove elapsed0/1/4/5/6.
|
||||
|
||||
| Capture | Fresh Java start/end | Native start/end |
|
||||
| --- | --- | --- |
|
||||
| `java-canonical342` | 305/311 | not run |
|
||||
| `old-canonical342` | 317/323 | 0/6 |
|
||||
| `fixed-canonical342` | 301/307 | 0/6 |
|
||||
| `java-used25-v2` | 317/323 | not run |
|
||||
| `old-used25` | 317/323 | 0/6 |
|
||||
| `fixed-used25` | 317/323 | 0/6 |
|
||||
| `old-full373` | 305/311 | 0/6 |
|
||||
| `fixed-full373` | 317/323 | 0/6 |
|
||||
|
||||
## Local readiness
|
||||
|
||||
All six furnace helper tests pass. Full readiness passes formatting, workspace/
|
||||
headless Clippy, doc tests and public-tree checks:1,877 Rust tests pass; the sole
|
||||
`entities::drop_motion_tests::drops_match_vanillas_motion_bit_for_bit` failure is
|
||||
identically reproduced by the archived untouched binary (one-bit Z difference
|
||||
at37.5/-21.25). Python686 has four unchanged packaging failures/one skip: the ARM
|
||||
mock-release installer and Bash3.2 optional-archive masks0/1/2. No related code is
|
||||
changed. Final evidence-only additions receive repeated whitespace/public checks.
|
||||
Main was actually pulled through`f2f95dad8`; scoped furnace/tick/codec files remain
|
||||
unchanged. Runtime claims remain qualified to the paired`ff4b4b17b` base.
|
||||
@@ -0,0 +1,102 @@
|
||||
"""Five loaded furnace totals, observed at cumulative 0/1/4/5/6 real ticks."""
|
||||
CASES = [('missing', None, 0), ('zero', 0, 0), ('five', 5, 0),
|
||||
('normal', 200, 0), ('started', 5, 1)]
|
||||
|
||||
|
||||
def loaded_totals():
|
||||
ops = []
|
||||
def cmd(text, label, result=None):
|
||||
row = {'op': 'cmd', 'cmd': text, 'label': label}
|
||||
if result is not None:
|
||||
row['expect_result'] = result
|
||||
ops.append(row)
|
||||
cmd('/tick freeze', 'freeze')
|
||||
for rule, value in [('spawn_mobs', 'false'), ('advance_time', 'false'), ('random_tick_speed', '0')]:
|
||||
cmd(f'/gamerule {rule} {value}', 'rule-'+rule)
|
||||
cmd('/forceload add 0 0', 'force', 1)
|
||||
ops.append({'op': 'settle', 'required_chunks': [[0, 0]]})
|
||||
cmd('/fill 0 99 0 15 99 15 stone', 'floor', 256)
|
||||
cmd('/fill 0 100 0 15 105 15 air', 'air')
|
||||
cmd('/scoreboard objectives add h119 dummy', 'objective')
|
||||
cmd('/execute store result score start h119 run time query gametime', 'clock-start')
|
||||
for i, (name, total, spent) in enumerate(CASES):
|
||||
x = 2 + i * 2
|
||||
for y, block in [(99, 'stone'), (100, 'air'), (101, 'air')]:
|
||||
cmd(f'/execute if block {x} {y} 2 {block}', name+f'-setup-{y}', 1)
|
||||
extra = '' if total is None else f',cooking_total_time:{total}'
|
||||
tag = ('{lit_time_remaining:20,lit_total_time:20,'
|
||||
f'cooking_time_spent:{spent}{extra},'
|
||||
'Items:[{Slot:0b,id:"minecraft:raw_iron",count:3}]}')
|
||||
cmd(f'/setblock {x} 100 2 minecraft:furnace[lit=true]{tag}', name+'-load', 1)
|
||||
previous = 0
|
||||
for elapsed in [0, 1, 4, 5, 6]:
|
||||
if elapsed:
|
||||
cmd(f'/tick step {elapsed-previous}', f'{elapsed}-step', 1)
|
||||
ops.append({'op': 'tick', 'n': elapsed-previous})
|
||||
previous = elapsed
|
||||
cmd('/execute store result score now h119 run time query gametime', f'{elapsed}-clock-raw')
|
||||
cmd('/scoreboard players operation now h119 -= start h119', f'{elapsed}-clock-delta-op', elapsed)
|
||||
cmd('/scoreboard players get now h119', f'{elapsed}-clock-delta', elapsed)
|
||||
for i, (name, supplied, initial) in enumerate(CASES):
|
||||
x = 2 + i * 2
|
||||
at = f'{x} 100 2'
|
||||
key = f'{name}-{elapsed}'
|
||||
# These are hypotheses admitted independently by fresh Java before
|
||||
# either native capture; they are never used to update a furnace.
|
||||
first = 1 if supplied in (None, 0) else supplied-initial
|
||||
completed = elapsed >= first
|
||||
spent = elapsed-first if completed else elapsed+initial
|
||||
total = 200 if completed else (supplied or 0)
|
||||
cmd(f'/execute if loaded {at}', key+'-loaded', 1)
|
||||
cmd(f'/execute if block {x} 99 2 stone', key+'-floor', 1)
|
||||
cmd(f'/execute if block {at} minecraft:furnace[lit=true]', key+'-lit', 1)
|
||||
cmd(f'/execute if data block {at} {{id:"minecraft:furnace",x:{x},y:100,z:2}}', key+'-identity', 1)
|
||||
cmd(f'/data get block {at}', key+'-full-tag')
|
||||
cmd(f'/data get block {at} Items', key+'-all-slots')
|
||||
for field, expected in [('cooking_time_spent', spent), ('cooking_total_time', total),
|
||||
('lit_time_remaining', 20-elapsed), ('lit_total_time', 20)]:
|
||||
cmd(f'/data get block {at} {field}', key+'-'+field, expected)
|
||||
cmd(f'/execute if data block {at} {{Items:[{{Slot:0b,id:"minecraft:raw_iron",count:{2 if completed else 3}}}]}}', key+'-input', 1)
|
||||
cmd(f'/execute unless data block {at} Items[{{Slot:1b}}]', key+'-no-fuel', 1)
|
||||
if completed:
|
||||
cmd(f'/execute if data block {at} {{Items:[{{Slot:2b,id:"minecraft:iron_ingot",count:1}}]}}', key+'-output', 1)
|
||||
else:
|
||||
cmd(f'/execute unless data block {at} Items[{{Slot:2b}}]', key+'-no-output', 1)
|
||||
return ops
|
||||
|
||||
# Authorized before canonical paired captures. Full373 remains unchanged.
|
||||
DIAGNOSTIC_LABELS = frozenset(
|
||||
[f'{name}-{tick}-full-tag' for name, _, _ in CASES for tick in [0, 1, 4, 5, 6]]
|
||||
+ ['clock-start'] + [f'{tick}-clock-raw' for tick in [0, 1, 4, 5, 6]])
|
||||
|
||||
|
||||
def selected_totals(full=False):
|
||||
ops = loaded_totals()
|
||||
if not full:
|
||||
for op in ops:
|
||||
if op.get('label') in DIAGNOSTIC_LABELS:
|
||||
# Commands still execute, with actual trace bodies retained.
|
||||
# Full diagnostic compares their complete records separately.
|
||||
op.update(record=False, trace=True)
|
||||
return ops
|
||||
|
||||
|
||||
def recipes_used_totals():
|
||||
"""Separate25 reads; all original actions/guards still run and are traced."""
|
||||
out = []
|
||||
for op in loaded_totals():
|
||||
if op['op'] == 'cmd':
|
||||
op.update(record=False, trace=True)
|
||||
out.append(op)
|
||||
label = op.get('label', '')
|
||||
if label.endswith('-all-slots'):
|
||||
name, elapsed, *_ = label.split('-')
|
||||
elapsed = int(elapsed)
|
||||
i, (_, total, spent) = next((i, c) for i, c in enumerate(CASES) if c[0]==name)
|
||||
first = 1 if total in (None, 0) else total-spent
|
||||
value = '{"minecraft:iron_ingot_from_smelting_raw_iron": 1}' if elapsed >= first else '{}'
|
||||
x = 2+i*2
|
||||
out.append({'op': 'cmd', 'cmd': f'/data get block {x} 100 2 RecipesUsed',
|
||||
'label': f'{name}-{elapsed}-recipes-used', 'trace': True,
|
||||
'expect_result': int(elapsed >= first), 'expected_text': f'{x}, 100, 2 has the following block data: {value}'})
|
||||
return out
|
||||
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Real Game/Java loaded-furnace ticks; compare every complete raw record."""
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import test_command_exec_parity as driver
|
||||
from furnace_loaded_total_corpus import selected_totals, recipes_used_totals
|
||||
|
||||
def used_admissions(build, ops, native=False):
|
||||
side = 'rust' if native else 'java'
|
||||
rows = [json.loads(line.split('command trace: ', 1)[1])
|
||||
for line in (build/(side+'.log')).read_text().splitlines() if 'command trace: ' in line]
|
||||
commands = [op for op in ops if op['op']=='cmd']
|
||||
assert len(rows)==len(commands), ('complete actual trace', side, len(rows), len(commands))
|
||||
(build/(side+'-trace.json')).write_text(json.dumps(rows, indent=2)+'\n')
|
||||
for op, row in zip(commands, rows):
|
||||
assert row['cmd']==op['cmd'], ('trace command identity', op, row)
|
||||
parts = op['label'].split('-')
|
||||
subject = parts[0] in {'missing','zero','five','normal','started'}
|
||||
common = any(op['label'].endswith('-'+field) for field in
|
||||
['loaded','floor','lit','identity','no-fuel','lit_time_remaining','lit_total_time'])
|
||||
admit = not native or not subject or parts[0] in {'normal','started'} or parts[1] in {'0','setup','load'} or common
|
||||
if admit and 'expect_result' in op:
|
||||
assert row['results']==[[True, op['expect_result']]], (side, 'actual guard', op, row)
|
||||
if not native and 'expected_text' in op:
|
||||
assert [''.join(span[0] for span in message) for message in row['messages']]==[op['expected_text']], ('typed RecipesUsed', op, row)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
used = '--recipes-used-only' in sys.argv
|
||||
if used: sys.argv.remove('--recipes-used-only')
|
||||
full = '--full-diagnostic' in sys.argv
|
||||
assert not (used and full), 'choose one diagnostic program'
|
||||
if full: sys.argv.remove('--full-diagnostic')
|
||||
reference = None
|
||||
if '--reference' in sys.argv:
|
||||
at = sys.argv.index('--reference')
|
||||
reference = Path(sys.argv[at+1]).resolve()
|
||||
del sys.argv[at:at+2]
|
||||
if '--work-dir' not in sys.argv:
|
||||
sys.argv += ['--work-dir', str(driver.lab.LOCAL/'furnace-loaded-total-parity')]
|
||||
build = Path(sys.argv[sys.argv.index('--work-dir')+1]).resolve()
|
||||
ops = recipes_used_totals() if used else selected_totals(full)
|
||||
driver.corpus_module.groups = lambda: [('loaded furnace cooking totals', ops)]
|
||||
# The shared runner retains its own report; this wrapper always additionally
|
||||
# compares untouched complete JSON records, without its presentation masks.
|
||||
sys.argv.append('--allow-gaps')
|
||||
driver.main()
|
||||
if used: used_admissions(build, ops)
|
||||
if '--reference-only' not in sys.argv:
|
||||
source = reference or build/'vanilla.jsonl'
|
||||
if reference and not full:
|
||||
assert source.read_bytes() == (build/'vanilla.jsonl').read_bytes(), 'fresh Java canonical reference bytes changed'
|
||||
java = [json.loads(s) for s in source.read_text().splitlines()]
|
||||
native = [json.loads(s) for s in (build/'rust.jsonl').read_text().splitlines()]
|
||||
if used: used_admissions(build, ops, native=True)
|
||||
recorded = [op for op in ops if op['op']=='cmd' and op.get('record', True)]
|
||||
assert len(java)==len(native)==len(recorded), 'complete record count'
|
||||
differences = [{'label': op['label'], 'expected': a, 'actual': b}
|
||||
for op, a, b in zip(recorded, java, native) if a != b]
|
||||
report = {'records': len(java), 'passed': len(java)-len(differences),
|
||||
'comparison': 'all declared complete raw JSON records; no masks/tolerances',
|
||||
'reference_sha256': hashlib.sha256(source.read_bytes()).hexdigest(),
|
||||
'fresh_java_sha256': hashlib.sha256((build/'vanilla.jsonl').read_bytes()).hexdigest(),
|
||||
'full_diagnostic': full,
|
||||
'differences': differences}
|
||||
(build/'strict-report.json').write_text(json.dumps(report, indent=2)+'\n')
|
||||
print(f'Strict raw records: {report["passed"]}/{report["records"]}')
|
||||
if differences:
|
||||
raise SystemExit(1)
|
||||
Reference in new issue
Block a user