use std::collections::HashSet;
use azul_css::props::style::StyleVisibility;
#[test]
fn test_visibility_values() {
let visible = StyleVisibility::Visible;
let hidden = StyleVisibility::Hidden;
let collapse = StyleVisibility::Collapse;
assert_eq!(visible, StyleVisibility::Visible);
assert_eq!(hidden, StyleVisibility::Hidden);
assert_eq!(collapse, StyleVisibility::Collapse);
assert_ne!(visible, hidden);
assert_ne!(visible, collapse);
assert_ne!(hidden, collapse);
}
#[test]
fn test_visibility_default() {
let default = StyleVisibility::default();
assert_eq!(default, StyleVisibility::Visible);
}
#[test]
fn test_collapse_detection() {
let vis = StyleVisibility::Collapse;
assert!(matches!(vis, StyleVisibility::Collapse));
assert!(!matches!(vis, StyleVisibility::Visible));
assert!(!matches!(vis, StyleVisibility::Hidden));
}
#[test]
fn test_collapsed_rows_set_empty() {
let collapsed_rows: HashSet<usize> = HashSet::new();
assert!(collapsed_rows.is_empty());
assert_eq!(collapsed_rows.len(), 0);
}
#[test]
fn test_collapsed_rows_insert() {
let mut collapsed_rows: HashSet<usize> = HashSet::new();
collapsed_rows.insert(1);
collapsed_rows.insert(3);
assert!(collapsed_rows.contains(&1));
assert!(!collapsed_rows.contains(&2));
assert!(collapsed_rows.contains(&3));
assert_eq!(collapsed_rows.len(), 2);
}
#[test]
fn test_collapsed_columns_set_empty() {
let collapsed_columns: HashSet<usize> = HashSet::new();
assert!(collapsed_columns.is_empty());
assert_eq!(collapsed_columns.len(), 0);
}
#[test]
fn test_collapsed_columns_insert() {
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(0);
collapsed_columns.insert(2);
assert!(collapsed_columns.contains(&0));
assert!(!collapsed_columns.contains(&1));
assert!(collapsed_columns.contains(&2));
assert_eq!(collapsed_columns.len(), 2);
}
#[test]
fn test_row_height_zero_for_collapsed() {
let mut row_heights = vec![100.0, 50.0, 75.0, 60.0];
let collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
assert_eq!(row_heights[0], 100.0); assert_eq!(row_heights[1], 0.0); assert_eq!(row_heights[2], 75.0); assert_eq!(row_heights[3], 0.0); }
#[test]
fn test_total_height_with_collapsed_rows() {
let row_heights = vec![100.0, 0.0, 75.0, 0.0, 50.0];
let total_height: f32 = row_heights.iter().sum();
assert_eq!(total_height, 225.0); }
#[test]
fn test_skip_cells_in_collapsed_rows() {
let collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
assert!(!collapsed_rows.contains(&0)); assert!(collapsed_rows.contains(&1)); assert!(!collapsed_rows.contains(&2)); assert!(collapsed_rows.contains(&3)); assert!(!collapsed_rows.contains(&4)); }
#[test]
fn test_rowspan_across_collapsed_rows() {
let row_heights = vec![100.0, 0.0, 75.0, 0.0];
let collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
let visible_height: f32 = row_heights
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_rows.contains(idx))
.map(|(_, h)| h)
.sum();
assert_eq!(visible_height, 175.0); }
#[test]
fn test_count_non_collapsed_rows_in_span() {
let collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
let span_start = 0;
let span_end = 4;
let non_collapsed_count = (span_start..span_end)
.filter(|row_idx| !collapsed_rows.contains(row_idx))
.count();
assert_eq!(non_collapsed_count, 2); }
#[test]
fn test_distribute_height_across_non_collapsed() {
let mut row_heights = vec![100.0, 0.0, 100.0, 0.0];
let collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
let extra_height = 50.0;
let non_collapsed_count = 2; let per_row = extra_height / non_collapsed_count as f32;
for row_idx in 0..row_heights.len() {
if !collapsed_rows.contains(&row_idx) {
row_heights[row_idx] += per_row;
}
}
assert_eq!(row_heights[0], 125.0); assert_eq!(row_heights[1], 0.0); assert_eq!(row_heights[2], 125.0); assert_eq!(row_heights[3], 0.0); }
#[test]
fn test_collapsed_rows_affect_border_spacing() {
let v_spacing = 10.0;
let num_rows = 5;
let _collapsed_rows: HashSet<usize> = [1, 3].iter().cloned().collect();
let total_spacing = v_spacing * (num_rows + 1) as f32;
assert_eq!(total_spacing, 60.0);
assert_eq!(num_rows, 5);
}
#[test]
fn test_all_rows_collapsed() {
let row_heights = vec![0.0, 0.0, 0.0];
let total_height: f32 = row_heights.iter().sum();
assert_eq!(total_height, 0.0);
}
#[test]
fn test_no_rows_collapsed() {
let row_heights = vec![100.0, 50.0, 75.0];
let collapsed_rows: HashSet<usize> = HashSet::new();
assert!(collapsed_rows.is_empty());
let total_height: f32 = row_heights.iter().sum();
assert_eq!(total_height, 225.0);
}
#[test]
fn test_first_row_collapsed() {
let mut row_heights = vec![100.0, 50.0, 75.0];
let collapsed_rows: HashSet<usize> = [0].iter().cloned().collect();
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
assert_eq!(row_heights[0], 0.0);
assert_eq!(row_heights[1], 50.0);
assert_eq!(row_heights[2], 75.0);
}
#[test]
fn test_last_row_collapsed() {
let mut row_heights = vec![100.0, 50.0, 75.0];
let collapsed_rows: HashSet<usize> = [2].iter().cloned().collect();
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
assert_eq!(row_heights[0], 100.0);
assert_eq!(row_heights[1], 50.0);
assert_eq!(row_heights[2], 0.0);
}
#[test]
fn test_consecutive_collapsed_rows() {
let mut row_heights = vec![100.0, 50.0, 75.0, 60.0, 80.0];
let collapsed_rows: HashSet<usize> = [1, 2, 3].iter().cloned().collect();
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
assert_eq!(row_heights[0], 100.0);
assert_eq!(row_heights[1], 0.0);
assert_eq!(row_heights[2], 0.0);
assert_eq!(row_heights[3], 0.0);
assert_eq!(row_heights[4], 80.0);
let total: f32 = row_heights.iter().sum();
assert_eq!(total, 180.0); }
#[test]
fn test_collapsed_row_preservation() {
let mut row_heights = vec![100.0, 50.0, 75.0];
let collapsed_rows: HashSet<usize> = [1].iter().cloned().collect();
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
row_heights[0] += 10.0;
row_heights[2] += 10.0;
for &row_idx in &collapsed_rows {
if row_idx < row_heights.len() {
row_heights[row_idx] = 0.0;
}
}
assert_eq!(row_heights[0], 110.0);
assert_eq!(row_heights[1], 0.0); assert_eq!(row_heights[2], 85.0);
}
#[test]
fn test_visibility_collapse_vs_hidden() {
let visible = StyleVisibility::Visible;
let hidden = StyleVisibility::Hidden;
let collapse = StyleVisibility::Collapse;
assert!(matches!(collapse, StyleVisibility::Collapse));
assert!(matches!(hidden, StyleVisibility::Hidden));
assert!(matches!(visible, StyleVisibility::Visible));
}
#[test]
fn test_column_collapse_tracking() {
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
collapsed_columns.insert(3);
for col_idx in 0..5 {
let is_collapsed = collapsed_columns.contains(&col_idx);
match col_idx {
1 | 3 => assert!(is_collapsed),
_ => assert!(!is_collapsed),
}
}
}
#[test]
fn test_column_width_zero_for_collapsed() {
let mut column_widths = vec![100.0, 50.0, 75.0, 60.0];
let collapsed_columns: HashSet<usize> = [1, 3].iter().cloned().collect();
for &col_idx in &collapsed_columns {
if col_idx < column_widths.len() {
column_widths[col_idx] = 0.0;
}
}
assert_eq!(column_widths[0], 100.0); assert_eq!(column_widths[1], 0.0); assert_eq!(column_widths[2], 75.0); assert_eq!(column_widths[3], 0.0); }
#[test]
fn test_total_width_with_collapsed_columns() {
let column_widths = vec![100.0, 0.0, 75.0, 0.0, 50.0];
let total_width: f32 = column_widths.iter().sum();
assert_eq!(total_width, 225.0); }
#[test]
fn test_colspan_visible_width_calculation() {
let column_widths = vec![100.0, 0.0, 75.0, 0.0];
let collapsed_columns: HashSet<usize> = [1, 3].iter().cloned().collect();
let visible_width: f32 = column_widths
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, w)| w)
.sum();
assert_eq!(visible_width, 175.0); }
#[test]
fn test_mixed_row_column_collapse() {
let collapsed_rows: HashSet<usize> = [1].iter().cloned().collect();
let collapsed_columns: HashSet<usize> = [2].iter().cloned().collect();
let cell_row = 1;
let cell_col = 2;
let in_collapsed_row = collapsed_rows.contains(&cell_row);
let in_collapsed_col = collapsed_columns.contains(&cell_col);
assert!(in_collapsed_row);
assert!(in_collapsed_col);
}
#[test]
fn test_visibility_collapse_documentation() {
let visibility = StyleVisibility::Collapse;
assert_eq!(visibility, StyleVisibility::Collapse);
let row_height_before = 100.0;
let row_height_after = if matches!(visibility, StyleVisibility::Collapse) {
0.0
} else {
row_height_before
};
assert_eq!(row_height_after, 0.0);
}
#[test]
fn test_fixed_width_with_collapsed_columns() {
let total_columns = 4;
let available_width = 400.0;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
collapsed_columns.insert(3);
let num_visible = total_columns - collapsed_columns.len();
assert_eq!(num_visible, 2);
let expected_width_per_visible = available_width / num_visible as f32;
assert_eq!(expected_width_per_visible, 200.0);
for col_idx in 0..total_columns {
let expected_width = if collapsed_columns.contains(&col_idx) {
0.0
} else {
expected_width_per_visible
};
if col_idx == 0 {
assert_eq!(expected_width, 200.0);
} else if col_idx == 1 {
assert_eq!(expected_width, 0.0);
} else if col_idx == 2 {
assert_eq!(expected_width, 200.0);
} else if col_idx == 3 {
assert_eq!(expected_width, 0.0);
}
}
}
#[test]
fn test_auto_width_excludes_collapsed_columns() {
let columns = vec![
(50.0, 100.0), (30.0, 60.0), (40.0, 80.0), (20.0, 40.0), ];
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
collapsed_columns.insert(3);
let total_min: f32 = columns
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, (min, _))| min)
.sum();
let total_max: f32 = columns
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, (_, max))| max)
.sum();
assert_eq!(total_min, 50.0 + 40.0); assert_eq!(total_max, 100.0 + 80.0);
assert_eq!(total_min, 90.0);
assert_eq!(total_max, 180.0);
}
#[test]
fn test_all_columns_collapsed() {
let total_columns = 3;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
for i in 0..total_columns {
collapsed_columns.insert(i);
}
let num_visible = total_columns - collapsed_columns.len();
assert_eq!(num_visible, 0);
for col_idx in 0..total_columns {
assert!(collapsed_columns.contains(&col_idx));
let width = 0.0;
assert_eq!(width, 0.0);
}
}
#[test]
fn test_first_column_collapsed() {
let total_columns = 3;
let available_width = 300.0;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(0);
let num_visible = total_columns - collapsed_columns.len();
assert_eq!(num_visible, 2);
let width_per_visible = available_width / num_visible as f32;
assert_eq!(width_per_visible, 150.0);
assert_eq!(collapsed_columns.contains(&0), true);
assert_eq!(collapsed_columns.contains(&1), false);
assert_eq!(collapsed_columns.contains(&2), false);
}
#[test]
fn test_last_column_collapsed() {
let total_columns = 3;
let available_width = 300.0;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(2);
let num_visible = total_columns - collapsed_columns.len();
assert_eq!(num_visible, 2);
let width_per_visible = available_width / num_visible as f32;
assert_eq!(width_per_visible, 150.0);
assert_eq!(collapsed_columns.contains(&0), false);
assert_eq!(collapsed_columns.contains(&1), false);
assert_eq!(collapsed_columns.contains(&2), true);
}
#[test]
fn test_colspan_across_collapsed_columns() {
let colspan = 4;
let start_col = 0;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1); collapsed_columns.insert(3);
let visible_cols: Vec<usize> = (start_col..start_col + colspan)
.filter(|idx| !collapsed_columns.contains(idx))
.collect();
assert_eq!(visible_cols.len(), 2);
assert_eq!(visible_cols, vec![0, 2]);
let cell_min_width = 200.0;
let width_per_visible = cell_min_width / visible_cols.len() as f32;
assert_eq!(width_per_visible, 100.0);
}
#[test]
fn test_colspan_all_columns_collapsed() {
let colspan = 2;
let start_col = 1;
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
collapsed_columns.insert(2);
let visible_cols: Vec<usize> = (start_col..start_col + colspan)
.filter(|idx| !collapsed_columns.contains(idx))
.collect();
assert_eq!(visible_cols.len(), 0);
}
#[test]
fn test_mixed_row_and_column_collapse() {
let mut collapsed_rows: HashSet<usize> = HashSet::new();
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_rows.insert(1);
collapsed_columns.insert(2);
let cell_row = 1;
let cell_col = 2;
let in_collapsed_row = collapsed_rows.contains(&cell_row);
let in_collapsed_col = collapsed_columns.contains(&cell_col);
assert!(in_collapsed_row);
assert!(in_collapsed_col);
}
#[test]
fn test_auto_width_interpolation_with_collapsed() {
let columns = vec![
(50.0, 100.0), (30.0, 60.0), (40.0, 80.0), ];
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
let total_min: f32 = columns
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, (min, _))| min)
.sum();
let total_max: f32 = columns
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, (_, max))| max)
.sum();
assert_eq!(total_min, 90.0); assert_eq!(total_max, 180.0);
let available_width = 135.0;
assert!(available_width >= total_min);
assert!(available_width <= total_max);
let scale = (available_width - total_min) / (total_max - total_min);
assert_eq!(scale, 0.5);
let expected_widths = vec![75.0, 0.0, 60.0];
for (idx, (min, max)) in columns.iter().enumerate() {
let computed = if collapsed_columns.contains(&idx) {
0.0
} else {
min + (max - min) * scale
};
assert_eq!(computed, expected_widths[idx]);
}
}
#[test]
fn test_auto_width_scale_down_with_collapsed() {
let columns = vec![
(50.0, 100.0), (30.0, 60.0), (40.0, 80.0), ];
let mut collapsed_columns: HashSet<usize> = HashSet::new();
collapsed_columns.insert(1);
let total_min: f32 = columns
.iter()
.enumerate()
.filter(|(idx, _)| !collapsed_columns.contains(idx))
.map(|(_, (min, _))| min)
.sum();
assert_eq!(total_min, 90.0);
let available_width = 45.0;
assert!(available_width < total_min);
let scale = available_width / total_min;
assert_eq!(scale, 0.5);
let expected_widths = vec![25.0, 0.0, 20.0];
for (idx, (min, _)) in columns.iter().enumerate() {
let computed = if collapsed_columns.contains(&idx) {
0.0
} else {
min * scale
};
assert_eq!(computed, expected_widths[idx]);
}
}