use polars::prelude::*;
use taxa_core::{infer_dataset, FrameSource};
fn frame() -> FrameSource {
let df = df![
"owner" => ["microsoft", "microsoft", "google", "facebook"],
"repo" => ["vscode", "terminal", "tensorflow", "react"],
"language" => ["TypeScript", "C++", "C++", "JavaScript"],
"dt" => Series::new("dt".into(), [20454i32, 20454, 20454, 20454]).cast(&DataType::Date).unwrap(),
"stars" => [163000i64, 95000, 186000, 228000],
"forks" => [28800i64, 8300, 74300, 46600],
]
.unwrap();
FrameSource::new(df)
}
#[test]
fn infers_shapes() {
let ds = infer_dataset(&frame(), Some("repos"), "repo").unwrap();
let main = ds.frame("main").expect("single frame `main`");
assert_eq!(main.id_column, "repo");
assert_eq!(main.timestamp.as_deref(), Some("dt"));
assert!(ds.resolved_views().unwrap().contains_key("series"));
let mids: std::collections::HashSet<&str> =
main.metrics.iter().map(|m| m.id.as_str()).collect();
assert!(mids.contains("count") && mids.contains("stars") && mids.contains("forks"));
let metric = |id: &str| main.metrics.iter().find(|m| m.id == id).unwrap();
assert_eq!(metric("stars").agg, "sum");
assert_eq!(metric("count").agg, "count");
let hier = ds.axis("hierarchy").unwrap();
assert_eq!(hier.levels.last().unwrap(), "repo");
let fids: std::collections::HashSet<&str> = ds.filters.iter().map(|f| f.id.as_str()).collect();
assert!(fids.contains("owner") && fids.contains("language"));
assert!(
ds.default_size_by.as_deref() == Some("stars")
|| ds.default_size_by.as_deref() == Some("forks")
);
}