From 7fc3a5ecfd9c562ee0951c4d1d3903aff701556b Mon Sep 17 00:00:00 2001 From: sinYa Iwasaki Date: Sat, 9 Mar 2024 12:03:37 +0900 Subject: [PATCH 1/2] Test Coverage #18 --- src/block_pattern.rs | 7 +++++ src/config.rs | 11 ++++++++ src/lib.rs | 1 + src/my_app.rs | 5 ++++ src/position.rs | 59 +++++++++++++++++++++++++++++++++++++++ src/sprite.rs | 40 ++++---------------------- src/window.rs | 39 ++++++++++++++++++++++++++ tests/integration_test.rs | 1 + 8 files changed, 129 insertions(+), 34 deletions(-) create mode 100644 src/position.rs diff --git a/src/block_pattern.rs b/src/block_pattern.rs index 21ec196..6484dc5 100644 --- a/src/block_pattern.rs +++ b/src/block_pattern.rs @@ -131,4 +131,11 @@ mod tests { let block_patterns = BlockPatterns::default(); assert_eq!(block_patterns.len(), 7); } + + #[test] + fn test_random() { + let block_patterns = BlockPatterns::default(); + + assert!(block_patterns.random().is_some()); + } } diff --git a/src/config.rs b/src/config.rs index 2d8fab4..1ac93ec 100644 --- a/src/config.rs +++ b/src/config.rs @@ -114,6 +114,12 @@ mod tests { #[case::normal("Test Window", 800, 600)] #[case::min_1("T", 1, 1)] #[case::max_1000("12345678901234567890123456789012345678901234567890", 1000, 1000)] + #[should_panic] + #[case::panic_title("", 1, 1)] + #[should_panic] + #[case::panic_width("T", 0, 1)] + #[should_panic] + #[case::panic_height("T", 1, 0)] fn test_window_config_creation(#[case] title: &str, #[case] width: u32, #[case] height: u32) { let window_config = WindowConfig::new(title, width, height).unwrap(); @@ -132,4 +138,9 @@ mod tests { expected_size ); } + + #[test] + fn test_create_window_config() { + create_window_config().unwrap(); + } } diff --git a/src/lib.rs b/src/lib.rs index 08ec666..498473d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ mod config; mod constants; mod input; pub mod my_app; +mod position; mod setup; mod sprite; mod text; diff --git a/src/my_app.rs b/src/my_app.rs index f4ea46b..afc31e3 100644 --- a/src/my_app.rs +++ b/src/my_app.rs @@ -48,6 +48,11 @@ mod tests { use super::*; + #[test] + fn test_init_window_plugin() { + init_window_plugin(); + } + #[test] fn test_create_app() { let mut app = App::new(); diff --git a/src/position.rs b/src/position.rs new file mode 100644 index 0000000..6b6b003 --- /dev/null +++ b/src/position.rs @@ -0,0 +1,59 @@ +use bevy::prelude::*; + +use crate::utils; + +#[derive(Component)] +pub struct Position { + x: i32, + y: i32, +} + +impl Position { + pub fn new(x: i32, y: i32) -> Self { + Self { x, y } + } + + pub fn vec2(&self) -> Vec2 { + Vec2::new(self.x as f32, self.y as f32) + } + + pub fn translation(&self, origin: Vec2) -> Vec3 { + let position_vec2 = self.vec2(); + let translation_vec2 = position_vec2 * utils::unit_size() + origin; + + Vec3::new(translation_vec2.x, translation_vec2.y, 0.0) + } +} +#[cfg(test)] +mod tests { + use crate::utils::unit_size; + + use super::*; + + #[test] + fn test_position_new() { + let position = Position::new(10, 20); + assert_eq!(position.x, 10); + assert_eq!(position.y, 20); + } + + #[test] + fn test_position_vec2() { + let position: Position = Position::new(10, 20); + let vec2 = position.vec2(); + assert_eq!(vec2, Vec2::new(10.0, 20.0)); + } + + #[test] + fn test_position_translation() { + let position = Position::new(10, 20); + let origin = Vec2::new(-100.0, 5.0); + let translation = position.translation(origin); + + let expected_x = unit_size().x * position.x as f32 + origin.x; + let expected_y = unit_size().y * position.y as f32 + origin.y; + + let expected_translation = Vec3::new(expected_x, expected_y, 0.0); + assert_eq!(translation, expected_translation); + } +} diff --git a/src/sprite.rs b/src/sprite.rs index 7801ff0..4826e7b 100644 --- a/src/sprite.rs +++ b/src/sprite.rs @@ -1,28 +1,6 @@ use bevy::prelude::*; -use crate::{block_pattern::BlockPatterns, constants, utils, window}; - -#[derive(Component)] -pub struct Position { - x: i32, - y: i32, -} - -impl Position { - pub fn vec2(&self) -> Vec2 { - Vec2::new(self.x as f32, self.y as f32) - } -} - -fn unit_size() -> Vec2 { - utils::vec2_from_tuple(constants::UNIT_SIZE) -} - -pub fn calculate_translation(origin: Vec2, position: Vec2) -> Vec3 { - let translation_vec2 = position * utils::unit_size() + origin; - - Vec3::new(translation_vec2.x, translation_vec2.y, 0.0) -} +use crate::{block_pattern::BlockPatterns, constants, position::Position, utils, window}; // pub fn spawn_sprite_at(commands: &mut Commands, windows: Query<&Window>, position: Vec2) { // let sprite = Sprite { @@ -56,14 +34,11 @@ fn spawn_block_element(commands: &mut Commands, position: Position, color: Color pub fn spawn_block(mut commands: Commands, block_patterns: Res) { let block = block_patterns.random().unwrap(); - let initial_x = constants::UNIT_LENGTH.0 / 2; - let initial_y = constants::UNIT_LENGTH.1 - 4; + let initial_x = (constants::UNIT_LENGTH.0 / 2) as i32; + let initial_y = (constants::UNIT_LENGTH.1 - 4) as i32; block.positions.iter().for_each(|(x, y)| { - let position = Position { - x: x + initial_x as i32, - y: y + initial_y as i32, - }; + let position = Position::new(x + initial_x, y + initial_y); spawn_block_element(&mut commands, position, block.color); }); @@ -96,10 +71,7 @@ pub fn position_transform( position_query .iter_mut() .for_each(|(position, mut transform, mut sprite)| { - let position_vec2 = position.vec2(); - let translation = calculate_translation(origin, position_vec2); - - transform.translation = translation; - sprite.custom_size = Some(unit_size()); + transform.translation = position.translation(origin); + sprite.custom_size = Some(utils::unit_size()); }); } diff --git a/src/window.rs b/src/window.rs index fb949e4..96fd67b 100644 --- a/src/window.rs +++ b/src/window.rs @@ -26,3 +26,42 @@ pub fn calculate_origin(window: &Window) -> Vec2 { half_unit_size - half_window_size } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_create_window() { + let title = "Test Window"; + let width = 800; + let height = 600; + let window = create_window(title, width, height); + + assert_eq!(window.title, title); + assert_eq!(window.width(), width as f32); + assert_eq!(window.height(), height as f32); + } + + #[test] + fn test_init_window() { + let window = init_window(); + + assert!(!window.title.is_empty()); + assert!(window.width() > 0.0); + assert!(window.height() > 0.0); + } + + #[test] + fn test_calculate_origin() { + let window = Window { + title: "Test".to_string(), + resolution: (800.0, 600.0).into(), + ..default() + }; + let origin = calculate_origin(&window); + + assert_eq!(origin.x, unit_size().x / 2.0 - 400.0); + assert_eq!(origin.y, unit_size().y / 2.0 - 300.0); + } +} diff --git a/tests/integration_test.rs b/tests/integration_test.rs index c39d512..706b1e6 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -6,6 +6,7 @@ fn init_game_app() -> App { app.add_plugins(MinimalPlugins); my_app::setup(&mut app); + // app.update(); app } From 30543583604b360520a32c3b6af2242f34c22f57 Mon Sep 17 00:00:00 2001 From: sinYa Iwasaki Date: Sat, 9 Mar 2024 12:41:57 +0900 Subject: [PATCH 2/2] Test Coverage #18 --- src/input.rs | 2 ++ src/lib.rs | 3 +++ src/main.rs | 3 +++ src/my_app.rs | 1 + src/sprite.rs | 3 +++ src/text.rs | 1 + src/text_resources.rs | 4 ++++ 7 files changed, 17 insertions(+) diff --git a/src/input.rs b/src/input.rs index 8ed9f81..977fda1 100644 --- a/src/input.rs +++ b/src/input.rs @@ -1,5 +1,6 @@ use bevy::{app::AppExit, prelude::*}; +#[cfg_attr(coverage_nightly, coverage(off))] pub fn keyboard_input_system( mut text: Query<&mut Text>, keyboard_input: Res>, @@ -13,6 +14,7 @@ pub fn keyboard_input_system( } } +#[cfg_attr(coverage_nightly, coverage(off))] pub fn check_esc_to_exit( keyboard_input: Res>, mut app_exit_events: EventWriter, diff --git a/src/lib.rs b/src/lib.rs index 498473d..c665e4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![cfg_attr(coverage_nightly, feature(coverage_attribute))] + pub mod block_pattern; mod camera; mod color_resources; @@ -14,6 +16,7 @@ mod utils; mod validator; mod window; +#[cfg_attr(coverage_nightly, coverage(off))] pub fn run() { my_app::create_app().run(); } diff --git a/src/main.rs b/src/main.rs index 2f08083..1130e71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,8 @@ +#![cfg_attr(coverage_nightly, feature(coverage_attribute))] + extern crate my_bevy_game; +#[cfg_attr(coverage_nightly, coverage(off))] fn main() { my_bevy_game::run(); } diff --git a/src/my_app.rs b/src/my_app.rs index afc31e3..a656c35 100644 --- a/src/my_app.rs +++ b/src/my_app.rs @@ -32,6 +32,7 @@ pub fn setup(app: &mut App) { .add_systems(Update, sprite::spawn_block); } +#[cfg_attr(coverage_nightly, coverage(off))] pub fn create_app() -> App { let mut app = App::new(); let plugin = DefaultPlugins.set(init_window_plugin()); diff --git a/src/sprite.rs b/src/sprite.rs index 4826e7b..5966a50 100644 --- a/src/sprite.rs +++ b/src/sprite.rs @@ -22,6 +22,7 @@ use crate::{block_pattern::BlockPatterns, constants, position::Position, utils, // commands.spawn(sprite_bundle); // } +#[cfg_attr(coverage_nightly, coverage(off))] fn spawn_block_element(commands: &mut Commands, position: Position, color: Color) { commands .spawn(SpriteBundle { @@ -31,6 +32,7 @@ fn spawn_block_element(commands: &mut Commands, position: Position, color: Color .insert(position); } +#[cfg_attr(coverage_nightly, coverage(off))] pub fn spawn_block(mut commands: Commands, block_patterns: Res) { let block = block_patterns.random().unwrap(); @@ -61,6 +63,7 @@ pub fn spawn_block(mut commands: Commands, block_patterns: Res) { // }); // } +#[cfg_attr(coverage_nightly, coverage(off))] pub fn position_transform( windows: Query<&Window>, mut position_query: Query<(&Position, &mut Transform, &mut Sprite)>, diff --git a/src/text.rs b/src/text.rs index 3dc76e2..c8b1e8c 100644 --- a/src/text.rs +++ b/src/text.rs @@ -1,6 +1,7 @@ use crate::text_resources::TextResources; use bevy::prelude::*; +#[cfg_attr(coverage_nightly, coverage(off))] pub fn spawn_initial_text(mut commands: Commands, asset_server: Res) { let text_resources = TextResources::new(&asset_server); let initial_text = "テトリスみたいなものを作ってみてる\n「A」押したら文字が出る\n"; diff --git a/src/text_resources.rs b/src/text_resources.rs index c9d3efb..d9a4f19 100644 --- a/src/text_resources.rs +++ b/src/text_resources.rs @@ -5,11 +5,13 @@ pub struct TextResources { } impl TextResources { + #[cfg_attr(coverage_nightly, coverage(off))] pub fn new(asset_server: &Res) -> Self { let font = asset_server.load("fonts/NotoSerifJP-Medium.otf"); Self { font } } + #[cfg_attr(coverage_nightly, coverage(off))] pub fn create_text_style(&self) -> TextStyle { TextStyle { font: self.font.clone(), @@ -18,6 +20,7 @@ impl TextResources { } } + #[cfg_attr(coverage_nightly, coverage(off))] pub fn create_text_bundle(&self, text: &str) -> TextBundle { TextBundle::from_section(text, self.create_text_style()).with_style(Style { align_self: AlignSelf::Center, @@ -29,6 +32,7 @@ impl TextResources { }) } + #[cfg_attr(coverage_nightly, coverage(off))] pub fn spawn_text_entity(&self, commands: &mut Commands, text: &str) { let text_bundle = self.create_text_bundle(text); commands.spawn(text_bundle);