datui-lib 0.4.1

Data Exploration in the Terminal (library)
Documentation
use crate::*;
use polars::datatypes::AnyValue;
use std::sync::mpsc;

fn app() -> (
    App,
    mpsc::Receiver<AppEvent>,
    mpsc::Sender<AppEvent>,
    tempfile::TempDir,
) {
    crate::tests::ensure_sample_data();
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("rows.csv");
    let mut body = String::from("a,b\n");
    for a in 0..30 {
        body.push_str(&format!("{a},{}\n", a * 2));
    }
    std::fs::write(&path, body).unwrap();
    let (tx, rx) = mpsc::channel();
    let mut app = App::new(tx.clone(), crate::tests::test_runtime());
    super::chart_prepare_tests::open(&mut app, &rx, &tx, path);
    (app, rx, tx, dir)
}

#[test]
fn r_reverses_in_the_background() {
    let (mut app, rx, tx, _dir) = app();
    app.event(&AppEvent::Key(KeyEvent::new(
        KeyCode::Char('r'),
        KeyModifiers::NONE,
    )));
    let state = app.data_table_state.as_ref().unwrap();
    assert!(
        !state.snapshot().has_rows(),
        "nothing was read on this thread"
    );
    assert!(app.is_busy(), "the rows are being read");

    super::chart_prepare_tests::pump(&mut app, &rx, &tx, |a| !crate::tests::work_pending(a));
    let state = app.data_table_state.as_ref().unwrap();
    let shown = state.display_df().unwrap().column("a").unwrap().get(0);
    assert_eq!(shown.unwrap(), AnyValue::Int64(29));
}

#[test]
fn a_column_order_is_read_in_the_background() {
    let (mut app, rx, tx, _dir) = app();
    app.event(&AppEvent::ColumnOrder(
        vec!["b".to_string(), "a".to_string()],
        1,
    ));
    let state = app.data_table_state.as_ref().unwrap();
    assert!(
        !state.snapshot().has_rows(),
        "nothing was read on this thread"
    );
    assert!(app.is_busy(), "the rows are being read");

    super::chart_prepare_tests::pump(&mut app, &rx, &tx, |a| !crate::tests::work_pending(a));
    let state = app.data_table_state.as_ref().unwrap();
    assert_eq!(state.get_column_order(), ["b", "a"]);
    assert_eq!(state.locked_columns_count(), 1);
    assert!(state.snapshot().has_rows());
}

/// A read still out was planned with the columns as they were. A new order does
/// not wait on it, or a column it brings back never arrives.
#[test]
fn a_column_order_does_not_wait_on_a_read_of_other_columns() {
    let (mut app, rx, tx, _dir) = app();
    app.event(&AppEvent::ColumnOrder(vec!["a".to_string()], 0));
    app.event(&AppEvent::ColumnOrder(
        vec!["b".to_string(), "a".to_string()],
        0,
    ));
    super::chart_prepare_tests::pump(&mut app, &rx, &tx, |a| !crate::tests::work_pending(a));
    let state = app.data_table_state.as_ref().unwrap();
    let shown: Vec<String> = state
        .display_df()
        .expect("the rows are read")
        .get_column_names()
        .iter()
        .map(|name| name.to_string())
        .collect();
    assert_eq!(shown, ["b", "a"]);
}