fatui 0.1.0

a silly little framework for terminal user interfaces
Documentation
use crate::{grid::Grid, pos::Size};

use super::StyledChar;

macro_rules! test_resize_4x4 {
	($($name:ident: ($x:literal, $y:literal) => [$([$($ch:literal),*]),* $(,)?]),* $(,)?) => { $(
		#[test]
		fn $name() {
			const VALS: &str = "1234abcd!@#$ABCD";
			let mut start = Grid::<StyledChar>::new(Size::rnew(4, 4));
			assert_eq!(start.all_cells().len(), 16, "initial size is scuffed");
			for (cell, val) in start.all_cells().iter_mut().zip(VALS.chars()) {
				cell.char = val;
			}
			start.resize(Size::rnew($x, $y));
			let mut rows = start.rows();
			let mut i = 0;
			$({
				println!("row = {i}");
				let row = rows.next().expect("row doesn't exist");
				let chars = row.iter().map(|sc| sc.char).collect::<Vec<_>>();
				assert_eq!(&chars, &[$($ch),*], "row is wrong");
				#[allow(unused_assignments)]
				{
					i += 1;
				}
			})*
			assert!(rows.next().is_none(), "expected fewer rows");
		}
	)* }
}

test_resize_4x4! {
	no_change: (4, 4) => [
		['1', '2', '3', '4'],
		['a', 'b', 'c', 'd'],
		['!', '@', '#', '$'],
		['A', 'B', 'C', 'D'],
	],
	lose_1_col: (3, 4) => [
		['1', '2', '3'],
		['a', 'b', 'c'],
		['!', '@', '#'],
		['A', 'B', 'C'],
	],
	gain_1_col: (5, 4) => [
		['1', '2', '3', '4', ' '],
		['a', 'b', 'c', 'd', ' '],
		['!', '@', '#', '$', ' '],
		['A', 'B', 'C', 'D', ' '],
	],
	lose_1_row: (4, 3) => [
		['1', '2', '3', '4'],
		['a', 'b', 'c', 'd'],
		['!', '@', '#', '$'],
	],
	gain_1_row: (4, 5) => [
		['1', '2', '3', '4'],
		['a', 'b', 'c', 'd'],
		['!', '@', '#', '$'],
		['A', 'B', 'C', 'D'],
		[' ', ' ', ' ', ' '],
	],
	lose_2_col: (2, 4) => [
		['1', '2'],
		['a', 'b'],
		['!', '@'],
		['A', 'B'],
	],
	gain_2_col: (6, 4) => [
		['1', '2', '3', '4', ' ', ' '],
		['a', 'b', 'c', 'd', ' ', ' '],
		['!', '@', '#', '$', ' ', ' '],
		['A', 'B', 'C', 'D', ' ', ' '],
	],
	lose_2_row: (4, 2) => [
		['1', '2', '3', '4'],
		['a', 'b', 'c', 'd'],
	],
	gain_2_row: (4, 6) => [
		['1', '2', '3', '4'],
		['a', 'b', 'c', 'd'],
		['!', '@', '#', '$'],
		['A', 'B', 'C', 'D'],
		[' ', ' ', ' ', ' '],
		[' ', ' ', ' ', ' '],
	],
	gain_row_lose_col: (3, 5) => [
		['1', '2', '3'],
		['a', 'b', 'c'],
		['!', '@', '#'],
		['A', 'B', 'C'],
		[' ', ' ', ' '],
	],
	lose_row_gain_col: (5, 3) => [
		['1', '2', '3', '4', ' '],
		['a', 'b', 'c', 'd', ' '],
		['!', '@', '#', '$', ' '],
	],
	gain_row_gain_col: (5, 5) => [
		['1', '2', '3', '4', ' '],
		['a', 'b', 'c', 'd', ' '],
		['!', '@', '#', '$', ' '],
		['A', 'B', 'C', 'D', ' '],
		[' ', ' ', ' ', ' ', ' '],
	],
	lose_row_lose_col: (3, 3) => [
		['1', '2', '3'],
		['a', 'b', 'c'],
		['!', '@', '#'],
	],
}