use super::*;
use crate::tile::{TileFormat, TileSet};
use dotzuki_engine::render::Rgba;
use dotzuki_engine::render_config::RenderConfig;
#[test]
fn constants_are_consistent() {
let config = RenderConfig::new(160, 144);
assert_eq!(config.screen_width, 160);
assert_eq!(config.screen_height, 144);
assert_eq!(config.screen_width / 8, 20); assert_eq!(config.screen_height / 8, 18); assert_eq!(BYTES_PER_PIXEL, 4);
assert_eq!(
config.screen_width as usize * config.screen_height as usize * BYTES_PER_PIXEL,
92160
);
}
#[test]
fn tileset_from_2bpp_has_gb_format() {
let data = [0u8; 16];
let ts = TileSet::from_2bpp(&data);
assert_eq!(ts.tile_format(), TileFormat::Gb2bpp);
assert_eq!(ts.len(), 1);
}
#[test]
fn tileset_blank_has_gb_format() {
let ts = TileSet::blank(4);
assert_eq!(ts.tile_format(), TileFormat::Gb2bpp);
assert_eq!(ts.len(), 4);
}
#[test]
fn tileset_from_1bpp_has_gb_format() {
let data = [0u8; 8];
let ts = TileSet::from_1bpp(&data);
assert_eq!(ts.tile_format(), TileFormat::Gb2bpp);
assert_eq!(ts.len(), 1);
}
#[test]
fn from_4bpp_decodes_single_tile() {
let mut data = [0u8; 32];
for row in 0..8 {
data[row * 2] = 0xFF; data[row * 2 + 1] = 0x00; }
for row in 0..8 {
data[16 + row * 2] = 0xFF;
data[16 + row * 2 + 1] = 0x00;
}
let ts = TileSet::from_4bpp(&data);
assert_eq!(ts.tile_format(), TileFormat::Gba4bpp);
assert_eq!(ts.len(), 1);
let tile = ts.get(0);
for row in 0..8 {
for col in 0..8 {
assert_eq!(tile.pixels[row][col], 5,
"pixel ({},{}) should be 5", row, col);
}
}
}
#[test]
fn from_4bpp_decodes_multiple_tiles() {
let data = [0u8; 64]; let ts = TileSet::from_4bpp(&data);
assert_eq!(ts.len(), 2);
assert_eq!(ts.tile_format(), TileFormat::Gba4bpp);
}
#[test]
fn from_4bpp_zero_data_is_all_color_0() {
let data = [0u8; 32];
let ts = TileSet::from_4bpp(&data);
let tile = ts.get(0);
for row in 0..8 {
for col in 0..8 {
assert_eq!(tile.pixels[row][col], 0);
}
}
}
#[test]
fn from_rgba_creates_fullcolor_tileset() {
let rgba_pixels: Vec<Rgba> = (0..64).map(|i| {
Rgba::new(i as u8, 0, 0, 255)
}).collect();
let ts = TileSet::from_rgba(&rgba_pixels, 1);
assert_eq!(ts.tile_format(), TileFormat::FullColor);
assert_eq!(ts.len(), 1);
let rgba_tile = ts.get_rgba(0).expect("should have rgba tile");
assert_eq!(rgba_tile.pixels[0][0], Rgba::new(0, 0, 0, 255));
assert_eq!(rgba_tile.pixels[0][63 & 7], Rgba::new((63 & 7) as u8, 0, 0, 255));
}
#[test]
fn from_rgba_multiple_tiles() {
let rgba_pixels: Vec<Rgba> = (0..128).map(|i| {
Rgba::new((i % 256) as u8, 100, 200, 255)
}).collect();
let ts = TileSet::from_rgba(&rgba_pixels, 2);
assert_eq!(ts.tile_format(), TileFormat::FullColor);
assert_eq!(ts.len(), 2);
let t0 = ts.get_rgba(0).unwrap();
assert_eq!(t0.pixels[0][0], Rgba::new(0, 100, 200, 255));
let t1 = ts.get_rgba(1).unwrap();
assert_eq!(t1.pixels[0][0], Rgba::new(64, 100, 200, 255));
}
#[test]
fn get_rgba_returns_none_for_non_fullcolor() {
let ts = TileSet::blank(4);
assert!(ts.get_rgba(0).is_none());
}
#[test]
fn get_rgba_returns_none_for_out_of_bounds() {
let rgba_pixels = [Rgba::TRANSPARENT; 64];
let ts = TileSet::from_rgba(&rgba_pixels, 1);
assert!(ts.get_rgba(0).is_some());
assert!(ts.get_rgba(1).is_none());
}
#[test]
fn from_4bpp_max_color_is_15() {
let mut data = [0u8; 32];
for row in 0..8 {
data[row * 2] = 0xFF;
data[row * 2 + 1] = 0xFF;
data[16 + row * 2] = 0xFF;
data[16 + row * 2 + 1] = 0xFF;
}
let ts = TileSet::from_4bpp(&data);
let tile = ts.get(0);
for row in 0..8 {
for col in 0..8 {
assert_eq!(tile.pixels[row][col], 15);
}
}
}