diff options
Diffstat (limited to 'components/layout_2020/tests/tables.rs')
-rw-r--r-- | components/layout_2020/tests/tables.rs | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/components/layout_2020/tests/tables.rs b/components/layout_2020/tests/tables.rs new file mode 100644 index 00000000000..66976a3ef62 --- /dev/null +++ b/components/layout_2020/tests/tables.rs @@ -0,0 +1,251 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +//! Tests for proper table box tree construction. + +mod tables { + use euclid::Vector2D; + use layout_2020::table::{Table, TableBuilder, TableSlot, TableSlotCell, TableSlotOffset}; + + fn row_lengths(table: &Table) -> Vec<usize> { + table.slots.iter().map(|row| row.len()).collect() + } + + fn slot_is_cell_with_id(slot: &TableSlot, id: u8) -> bool { + match slot { + TableSlot::Cell(TableSlotCell { id: cell_id, .. }) if id == *cell_id => true, + _ => false, + } + } + + fn slot_is_empty(slot: &TableSlot) -> bool { + match slot { + TableSlot::Empty => true, + _ => false, + } + } + + fn slot_is_spanned_with_offsets(slot: &TableSlot, offsets: Vec<(usize, usize)>) -> bool { + match slot { + TableSlot::Spanned(slot_offsets) => { + let offsets: Vec<TableSlotOffset> = offsets + .iter() + .map(|offset| Vector2D::new(offset.0, offset.1)) + .collect(); + offsets == *slot_offsets + }, + _ => false, + } + } + + #[test] + fn test_empty_table() { + let table_builder = TableBuilder::default(); + let table = table_builder.finish(); + assert!(table.slots.is_empty()) + } + + #[test] + fn test_simple_table() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 1)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(4, 1, 1)); + table_builder.end_row(); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![2, 2]); + + assert!(slot_is_cell_with_id(&table.slots[0][0], 1)); + assert!(slot_is_cell_with_id(&table.slots[0][1], 2)); + assert!(slot_is_cell_with_id(&table.slots[1][0], 3)); + assert!(slot_is_cell_with_id(&table.slots[1][1], 4)); + } + + #[test] + fn test_simple_rowspan() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 1, 2)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(4, 1, 1)); + table_builder.end_row(); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![3, 3]); + + assert!(slot_is_cell_with_id(&table.slots[0][0], 1)); + assert!(slot_is_cell_with_id(&table.slots[0][1], 2)); + assert!(slot_is_cell_with_id(&table.slots[0][2], 3)); + + assert!(slot_is_cell_with_id(&table.slots[1][0], 4)); + assert!(slot_is_empty(&table.slots[1][1])); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][2], + vec![(0, 1)] + )); + } + + #[test] + fn test_simple_colspan() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 3, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 1, 1)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(4, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(5, 3, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(6, 1, 1)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(7, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(8, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(9, 3, 1)); + table_builder.end_row(); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![5, 5, 5]); + + assert!(slot_is_cell_with_id(&table.slots[0][0], 1)); + assert!(slot_is_spanned_with_offsets( + &table.slots[0][1], + vec![(1, 0)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[0][2], + vec![(2, 0)] + )); + assert!(slot_is_cell_with_id(&table.slots[0][3], 2)); + assert!(slot_is_cell_with_id(&table.slots[0][4], 3)); + + assert!(slot_is_cell_with_id(&table.slots[1][0], 4)); + assert!(slot_is_cell_with_id(&table.slots[1][1], 5)); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][2], + vec![(1, 0)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][3], + vec![(2, 0)] + )); + assert!(slot_is_cell_with_id(&table.slots[1][4], 6)); + + assert!(slot_is_cell_with_id(&table.slots[2][0], 7)); + assert!(slot_is_cell_with_id(&table.slots[2][1], 8)); + assert!(slot_is_cell_with_id(&table.slots[2][2], 9)); + assert!(slot_is_spanned_with_offsets( + &table.slots[2][3], + vec![(1, 0)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[2][4], + vec![(2, 0)] + )); + } + + #[test] + fn test_simple_table_model_error() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 1, 2)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(4, 3, 1)); + table_builder.end_row(); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![3, 3]); + + assert!(slot_is_cell_with_id(&table.slots[0][0], 1)); + assert!(slot_is_cell_with_id(&table.slots[0][1], 2)); + assert!(slot_is_cell_with_id(&table.slots[0][2], 3)); + + assert!(slot_is_cell_with_id(&table.slots[1][0], 4)); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][1], + vec![(1, 0)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][2], + vec![(2, 0), (0, 1)] + )); + } + + #[test] + fn test_simple_rowspan_0() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 1, 0)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.end_row(); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![3, 3, 3, 3]); + + assert!(slot_is_empty(&table.slots[1][0])); + assert!(slot_is_empty(&table.slots[1][1])); + assert!(slot_is_spanned_with_offsets( + &table.slots[1][2], + vec![(0, 1)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[2][2], + vec![(0, 2)] + )); + assert!(slot_is_spanned_with_offsets( + &table.slots[3][2], + vec![(0, 3)] + )); + } + + #[test] + fn test_incoming_rowspans() { + let mut table_builder = TableBuilder::default(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(1, 1, 1)); + table_builder.add_cell(TableSlotCell::mock_for_testing(2, 1, 30)); + table_builder.end_row(); + + table_builder.start_row(); + table_builder.add_cell(TableSlotCell::mock_for_testing(3, 2, 1)); + table_builder.end_row(); + + assert_eq!(table_builder.incoming_rowspans, vec![0, 28]); + + let table = table_builder.finish(); + assert_eq!(row_lengths(&table), vec![2, 2]); + } +} |