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());
}
#[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"]);
}