use nalgebra_block_triangularization::ordering::{
col_order_from_row_order, topo_sort_with_tiebreak,
};
#[test]
fn topo_empty_dag() {
let dag: Vec<Vec<usize>> = vec![];
let key: Vec<usize> = vec![];
let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order.len(), 0);
}
#[test]
fn topo_single_node() {
let dag = vec![vec![]];
let key = vec![0];
let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![0]);
}
#[test]
fn topo_two_nodes_no_edges() {
let dag = vec![vec![], vec![]];
let key = vec![1, 0]; let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![1, 0]); }
#[test]
fn topo_two_nodes_with_edge() {
let dag = vec![vec![1], vec![]];
let key = vec![0, 0]; let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![0, 1]);
}
#[test]
fn topo_linear_chain() {
let dag = vec![vec![1], vec![2], vec![3], vec![]];
let key = vec![3, 2, 1, 0]; let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![0, 1, 2, 3]);
}
#[test]
fn topo_diamond() {
let dag = vec![vec![1, 2], vec![3], vec![3], vec![]];
let key = vec![0, 2, 1, 3]; let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order[0], 0);
assert_eq!(order[3], 3);
assert_eq!(order[1], 2); assert_eq!(order[2], 1); }
#[test]
fn topo_parallel_branches() {
let dag = vec![vec![2], vec![3], vec![], vec![]];
let key = vec![1, 0, 3, 2]; let order = topo_sort_with_tiebreak(&dag, &key);
assert!(order.iter().position(|&x| x == 1) < order.iter().position(|&x| x == 0));
assert!(order.iter().position(|&x| x == 0) < order.iter().position(|&x| x == 2));
assert!(order.iter().position(|&x| x == 1) < order.iter().position(|&x| x == 3));
}
#[test]
fn topo_tiebreak_by_key() {
let dag = vec![vec![], vec![], vec![], vec![]];
let key = vec![3, 1, 2, 0];
let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![3, 1, 2, 0]);
}
#[test]
fn topo_cycle_fallback() {
let dag = vec![vec![1], vec![0]];
let key = vec![0, 1];
let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![0, 1]);
}
#[test]
fn topo_self_loop_fallback() {
let dag = vec![vec![0], vec![]];
let key = vec![0, 1];
let order = topo_sort_with_tiebreak(&dag, &key);
assert_eq!(order, vec![0, 1]);
}
#[test]
fn col_order_empty() {
let row_order: Vec<usize> = vec![];
let row_to_col: Vec<Option<usize>> = vec![];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 0);
assert_eq!(col_order.len(), 0);
}
#[test]
fn col_order_no_matching() {
let row_order = vec![0, 1, 2];
let row_to_col = vec![None, None, None];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
assert_eq!(col_order, vec![0, 1, 2]);
}
#[test]
fn col_order_perfect_matching_identity() {
let row_order = vec![0, 1, 2];
let row_to_col = vec![Some(0), Some(1), Some(2)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
assert_eq!(col_order, vec![0, 1, 2]);
}
#[test]
fn col_order_perfect_matching_permuted() {
let row_order = vec![2, 0, 1];
let row_to_col = vec![Some(0), Some(1), Some(2)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
assert_eq!(col_order, vec![2, 0, 1]);
}
#[test]
fn col_order_partial_matching() {
let row_order = vec![0, 1, 2];
let row_to_col = vec![Some(1), None, Some(2)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 4);
assert_eq!(col_order, vec![1, 2, 0, 3]);
}
#[test]
fn col_order_more_cols_than_rows() {
let row_order = vec![0, 1];
let row_to_col = vec![Some(0), Some(2)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 5);
assert_eq!(col_order, vec![0, 2, 1, 3, 4]);
}
#[test]
fn col_order_respects_row_order() {
let row_order = vec![3, 1, 0, 2];
let row_to_col = vec![Some(0), Some(1), Some(2), Some(3)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 4);
assert_eq!(col_order, vec![3, 1, 0, 2]);
}
#[test]
fn col_order_ignores_out_of_bounds() {
let row_order = vec![0, 1];
let row_to_col = vec![Some(0), Some(5)]; let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
assert_eq!(col_order, vec![0, 1, 2]);
}
#[test]
fn col_order_no_duplicates() {
let row_order = vec![0, 1, 2];
let row_to_col = vec![Some(0), Some(0), Some(1)];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
assert_eq!(col_order.iter().filter(|&&c| c == 0).count(), 1);
assert_eq!(col_order.len(), 3);
}
#[test]
fn col_order_all_columns_present() {
let row_order = vec![0, 1];
let row_to_col = vec![Some(1), None];
let col_order = col_order_from_row_order(&row_order, &row_to_col, 3);
let mut sorted = col_order.clone();
sorted.sort();
assert_eq!(sorted, vec![0, 1, 2]);
}