blob: 0776170d58127fa7fcc27e0a9b91691d0b9aa265 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use crate::{Generate, generate_vec, make_rng};
use {fidl_next_test_benchmark as ftb_next, fidl_test_benchmark as ftb};
impl_generate! {
for ftb::GameType, ftb_next::GameType => rng {
match rng.random_range(0..4) {
0 => Self::Survival,
1 => Self::Creative,
2 => Self::Adventure,
3 => Self::Spectator,
_ => unreachable!(),
}
}
}
const ITEM_IDS: [&str; 8] =
["dirt", "stone", "pickaxe", "sand", "gravel", "shovel", "chestplate", "steak"];
impl_generate! {
for ftb::Item, ftb_next::Item => rng {
Self {
count: rng.random(),
slot: rng.random(),
id: ITEM_IDS[rng.random_range(0..ITEM_IDS.len())].to_string(),
}
}
}
impl_generate! {
for ftb::Abilities, ftb_next::Abilities => rng {
Self {
walk_speed: rng.random(),
fly_speed: rng.random(),
may_fly: rng.random_bool(0.5),
flying: rng.random_bool(0.5),
invulnerable: rng.random_bool(0.5),
may_build: rng.random_bool(0.5),
instabuild: rng.random_bool(0.5),
}
}
}
impl_generate! {
for ftb::Vector3d, ftb_next::Vector3d => rng {
Self { x: rng.random(), y: rng.random(), z: rng.random() }
}
}
impl_generate! {
for ftb::Vector2, ftb_next::Vector2 => rng {
Self { x: rng.random(), y: rng.random() }
}
}
const ENTITY_IDS: [&str; 8] =
["cow", "sheep", "zombie", "skeleton", "spider", "creeper", "parrot", "bee"];
const CUSTOM_NAMES: [&str; 8] =
["rainbow", "princess", "steve", "johnny", "missy", "coward", "fairy", "howard"];
impl_generate! {
for ftb::Entity, ftb_next::Entity => rng {
Self {
id: ENTITY_IDS[rng.random_range(0..ENTITY_IDS.len())].to_string(),
pos: Generate::generate(rng),
motion: Generate::generate(rng),
rotation: Generate::generate(rng),
fall_distance: rng.random(),
fire: rng.random(),
air: rng.random(),
on_ground: rng.random_bool(0.5),
no_gravity: rng.random_bool(0.5),
invulnerable: rng.random_bool(0.5),
portal_cooldown: rng.random(),
uuid: Generate::generate(rng),
custom_name: rng.random_bool(0.5).then(|| CUSTOM_NAMES[rng.random_range(0..CUSTOM_NAMES.len())].to_string()),
custom_name_visible: rng.random_bool(0.5),
silent: rng.random_bool(0.5),
glowing: rng.random_bool(0.5),
}
}
}
const RECIPES: [&str; 8] =
["pickaxe", "torch", "bow", "crafting table", "furnace", "shears", "arrow", "tnt"];
const MAX_RECIPES: usize = 30;
const MAX_DISPLAYED_RECIPES: usize = 10;
impl_generate! {
for ftb::RecipeBook, ftb_next::RecipeBook => rng {
let mut recipes = Vec::new();
for _ in 0..rng.random_range(0..MAX_RECIPES) {
recipes.push(RECIPES[rng.random_range(0..RECIPES.len())].to_string());
}
let mut to_be_displayed = Vec::new();
for _ in 0..rng.random_range(0..MAX_DISPLAYED_RECIPES) {
to_be_displayed.push(RECIPES[rng.random_range(0..RECIPES.len())].to_string());
}
Self {
recipes,
to_be_displayed,
is_filtering_craftable: rng.random_bool(0.5),
is_gui_open: rng.random_bool(0.5),
is_furnace_filtering_craftable: rng.random_bool(0.5),
is_furnace_gui_open: rng.random_bool(0.5),
is_blasting_furnace_filtering_craftable: rng.random_bool(0.5),
is_blasting_furnace_gui_open: rng.random_bool(0.5),
is_smoker_filtering_craftable: rng.random_bool(0.5),
is_smoker_gui_open: rng.random_bool(0.5),
}
}
}
impl_generate! {
for ftb::UuidAndEntity, ftb_next::UuidAndEntity => rng {
Self {
uuid: Generate::generate(rng),
entity: Generate::generate(rng),
}
}
}
const DIMENSIONS: [&str; 3] = ["overworld", "nether", "end"];
const MAX_ITEMS: usize = 40;
const MAX_ENDER_ITEMS: usize = 27;
impl_generate! {
for ftb::Player, ftb_next::Player => rng {
let inventory_items = rng.random_range(0..MAX_ITEMS);
let ender_items = rng.random_range(0..MAX_ENDER_ITEMS);
Self {
game_type: Generate::generate(rng),
previous_game_type: Generate::generate(rng),
score: rng.random(),
dimension: DIMENSIONS[rng.random_range(0..DIMENSIONS.len())].to_string(),
selected_item_slot: rng.random(),
selected_item: Generate::generate(rng),
spawn_dimension: rng.random_bool(0.5).then(|| DIMENSIONS[rng.random_range(0..DIMENSIONS.len())].to_string()),
spawn_x: rng.random(),
spawn_y: rng.random(),
spawn_z: rng.random(),
spawn_forced: Generate::generate(rng),
sleep_timer: rng.random(),
food_exhaustion_level: rng.random(),
food_saturation_level: rng.random(),
food_tick_timer: rng.random(),
xp_level: rng.random(),
xp_p: rng.random(),
xp_total: rng.random(),
xp_seed: rng.random(),
inventory: generate_vec(rng, inventory_items),
ender_items: generate_vec(rng, ender_items),
abilities: Generate::generate(rng),
entered_nether_position: Generate::generate(rng),
root_vehicle: Generate::generate(rng),
shoulder_entity_left: Generate::generate(rng),
shoulder_entity_right: Generate::generate(rng),
seen_credits: rng.random_bool(0.5),
recipe_book: Generate::generate(rng),
}
}
}
pub fn generate_input_rust(input_size: usize) -> ftb::Players {
let mut rng = make_rng();
ftb::Players { players: generate_vec(&mut rng, input_size) }
}
pub fn generate_input_rust_next(input_size: usize) -> ftb_next::Players {
let mut rng = make_rng();
ftb_next::Players { players: generate_vec(&mut rng, input_size) }
}