use super::super::grid::{Grid, GridItem};
use super::super::grid::TrackSize;
use super::super::grid::GridPlacement;
use crate::widget::Text;
#[test]
fn test_calculate_tracks_empty() {
let grid = Grid::new();
let tracks = grid.test_calculate_tracks(100, &[], TrackSize::Fr(1.0), 0);
assert!(tracks.is_empty());
}
#[test]
fn test_calculate_tracks_all_fixed() {
let grid = Grid::new();
let tracks = &[
TrackSize::Fixed(10),
TrackSize::Fixed(20),
TrackSize::Fixed(30),
];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![10, 20, 30]);
}
#[test]
fn test_calculate_tracks_all_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::Fr(1.0), TrackSize::Fr(2.0), TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![25, 50, 25]);
}
#[test]
fn test_calculate_tracks_mixed_fixed_and_fr() {
let grid = Grid::new();
let tracks = &[
TrackSize::Fixed(20),
TrackSize::Fr(1.0),
TrackSize::Fixed(30),
];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result[0], 20);
assert_eq!(result[1], 50);
assert_eq!(result[2], 30);
}
#[test]
fn test_calculate_tracks_with_gap() {
let grid = Grid::new();
let tracks = &[TrackSize::Fr(1.0), TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 10);
assert_eq!(result, vec![45, 45]);
}
#[test]
fn test_calculate_tracks_percent() {
let grid = Grid::new();
let tracks = &[TrackSize::Percent(50.0), TrackSize::Percent(50.0)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![50, 50]);
}
#[test]
fn test_calculate_tracks_auto_as_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::Auto, TrackSize::Auto];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![50, 50]);
}
#[test]
fn test_calculate_tracks_min_content_as_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::MinContent, TrackSize::MinContent];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![50, 50]);
}
#[test]
fn test_calculate_tracks_max_content_as_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::MaxContent, TrackSize::MaxContent];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![50, 50]);
}
#[test]
fn test_calculate_tracks_insufficient_space() {
let grid = Grid::new();
let tracks = &[TrackSize::Fixed(80), TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![80, 20]);
}
#[test]
fn test_calculate_tracks_zero_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::Fixed(10), TrackSize::Fixed(20)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![10, 20]);
}
#[test]
fn test_calculate_tracks_overflow_protection() {
let grid = Grid::new();
let tracks = &[TrackSize::Fixed(150), TrackSize::Fixed(150)];
let result = grid.test_calculate_tracks(100, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result[0], 150);
assert_eq!(result[1], 150);
}
#[test]
fn test_track_positions_empty() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[], 0);
assert_eq!(positions, vec![0]);
}
#[test]
fn test_track_positions_single_track() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[100], 0);
assert_eq!(positions, vec![0, 100]);
}
#[test]
fn test_track_positions_multiple_tracks_no_gap() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[10, 20, 30], 0);
assert_eq!(positions, vec![0, 10, 30, 60]);
}
#[test]
fn test_track_positions_with_gap() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[10, 20, 30], 5);
assert_eq!(positions, vec![0, 15, 40, 70]);
}
#[test]
fn test_track_positions_cumulative() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[15, 25, 35], 2);
assert_eq!(positions, vec![0, 17, 44, 79]);
}
#[test]
fn test_track_positions_zero_size_tracks() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[0, 0, 0], 1);
assert_eq!(positions, vec![0, 1, 2, 2]);
}
#[test]
fn test_track_positions_large_gap() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[10, 10], 50);
assert_eq!(positions, vec![0, 60, 70]);
}
#[test]
fn test_auto_place_items_empty() {
let grid = Grid::new();
let placements = grid.test_auto_place_items(3, 3);
assert!(placements.is_empty());
}
#[test]
fn test_auto_place_items_single_item_auto() {
let grid = Grid::new().child(Text::new("A"));
let placements = grid.test_auto_place_items(2, 2);
assert_eq!(placements.len(), 1);
assert_eq!(placements[0].0, 0); assert_eq!(placements[0].1.col_start, 1); assert_eq!(placements[0].1.col_end, 2);
assert_eq!(placements[0].1.row_start, 1);
assert_eq!(placements[0].1.row_end, 2);
}
#[test]
fn test_auto_place_items_explicit_placement() {
let grid = Grid::new().item(GridItem::new(Text::new("A")).at(2, 3));
let placements = grid.test_auto_place_items(5, 5);
assert_eq!(placements.len(), 1);
assert_eq!(placements[0].1.col_start, 2);
assert_eq!(placements[0].1.col_end, 3);
assert_eq!(placements[0].1.row_start, 3);
assert_eq!(placements[0].1.row_end, 4);
}
#[test]
fn test_auto_place_items_row_flow() {
let grid = Grid::new()
.auto_flow_row()
.child(Text::new("A"))
.child(Text::new("B"))
.child(Text::new("C"));
let placements = grid.test_auto_place_items(2, 2);
assert_eq!(placements.len(), 3);
assert_eq!(placements[0].1.col_start, 1);
assert_eq!(placements[0].1.row_start, 1);
assert_eq!(placements[1].1.col_start, 2);
assert_eq!(placements[1].1.row_start, 1);
assert_eq!(placements[2].1.col_start, 1);
assert_eq!(placements[2].1.row_start, 2);
}
#[test]
fn test_auto_place_items_col_flow() {
let grid = Grid::new()
.auto_flow_col()
.child(Text::new("A"))
.child(Text::new("B"))
.child(Text::new("C"));
let placements = grid.test_auto_place_items(2, 2);
assert_eq!(placements.len(), 3);
assert_eq!(placements[0].1.col_start, 1);
assert_eq!(placements[0].1.row_start, 1);
assert_eq!(placements[1].1.col_start, 1);
assert_eq!(placements[1].1.row_start, 2);
assert_eq!(placements[2].1.col_start, 2);
assert_eq!(placements[2].1.row_start, 1);
}
#[test]
fn test_auto_place_items_with_span() {
let grid = Grid::new()
.item(GridItem::new(Text::new("A")).col_span(2))
.child(Text::new("B"));
let placements = grid.test_auto_place_items(3, 2);
assert_eq!(placements.len(), 2);
}
#[test]
fn test_auto_place_items_bounds_protection() {
let mut grid = Grid::new();
for _ in 0..5 {
grid.items.push(GridItem::new(Text::new("Test")));
}
let placements = grid.test_auto_place_items(1000, 1000);
assert!(!placements.is_empty());
}
#[test]
fn test_auto_place_items_explicit_out_of_bounds() {
let grid = Grid::new().item(GridItem::new(Text::new("A")).at(1001, 1));
let placements = grid.test_auto_place_items(10, 10);
assert_eq!(placements.len(), 0);
}
#[test]
fn test_auto_place_items_many_items() {
let mut grid = Grid::new().auto_flow_row();
for i in 0..10 {
grid.items
.push(GridItem::new(Text::new(format!("Item{}", i))));
}
let placements = grid.test_auto_place_items(3, 5);
assert_eq!(placements.len(), 10);
}
#[test]
fn test_auto_place_items_with_column_span() {
let grid = Grid::new()
.item(GridItem::new(Text::new("A")).at(1, 1).col_span(2))
.child(Text::new("B"));
let placements = grid.test_auto_place_items(3, 2);
assert_eq!(placements.len(), 2);
assert_eq!(placements[0].1.col_start, 1);
assert_eq!(placements[0].1.col_end, 3);
}
#[test]
fn test_auto_place_items_with_row_span() {
let grid = Grid::new()
.item(GridItem::new(Text::new("A")).at(1, 1).row_span(2))
.child(Text::new("B"));
let placements = grid.test_auto_place_items(2, 3);
assert_eq!(placements.len(), 2);
assert_eq!(placements[0].1.row_start, 1);
assert_eq!(placements[0].1.row_end, 3);
}
#[test]
fn test_calculate_tracks_zero_available() {
let grid = Grid::new();
let tracks = &[TrackSize::Fr(1.0), TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(0, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![0, 0]);
}
#[test]
fn test_track_positions_empty_sizes() {
let grid = Grid::new();
let positions = grid.test_track_positions(&[], 5);
assert_eq!(positions, vec![0]);
}
#[test]
fn test_auto_place_items_zero_dimensions() {
let grid = Grid::new().child(Text::new("Test"));
let placements = grid.test_auto_place_items(0, 0);
assert!(!placements.is_empty());
}
#[test]
fn test_calculate_tracks_single_fr() {
let grid = Grid::new();
let tracks = &[TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(50, tracks, TrackSize::Fr(1.0), 0);
assert_eq!(result, vec![50]);
}
#[test]
fn test_calculate_tracks_gap_exceeds_available() {
let grid = Grid::new();
let tracks = &[TrackSize::Fr(1.0), TrackSize::Fr(1.0)];
let result = grid.test_calculate_tracks(5, tracks, TrackSize::Fr(1.0), 10);
assert_eq!(result[0], 0);
assert_eq!(result[1], 0);
}