bezel-chart 0.2.25

Charts for gpui — a Vega-Lite subset over columnar data
Documentation
use chart::{Channel, Chart, Column, Data, Kind, Mark};

fn sales() -> Data {
    Data::new()
        .text("month", ["Jan", "Feb", "Jan", "Mar", "Feb"])
        .number("sales", [3.0, 5.0, 2.0, 7.0, f64::NAN])
}

#[test]
fn text_is_interned_in_first_seen_order() {
    let data = sales();
    let Some(Column::Text(month)) = data.column("month") else {
        panic!("month is text");
    };
    assert_eq!(&*month.names, ["Jan", "Feb", "Mar"]);
    assert_eq!(&*month.codes, [0, 1, 0, 2, 1]);
    assert_eq!(month.get(3), "Mar");
    assert_eq!(data.len(), 5);
}

#[test]
fn a_clone_shares_its_generation_and_a_change_takes_a_new_one() {
    let data = sales();
    assert_eq!(data.clone().generation(), data.generation());
    assert_ne!(sales().generation(), data.generation());

    let changed = data.clone().number("sales", [1.0; 5]);
    assert_ne!(changed.generation(), data.generation());
    let Some(Column::Number(sales)) = data.column("sales") else {
        panic!("sales is numeric");
    };
    assert_eq!(sales[0], 3.0, "the original is untouched");
}

#[test]
fn replacing_a_column_keeps_its_place() {
    let data = sales().text("month", ["a", "b", "c", "d", "e"]);
    let fields: Vec<_> = data.fields().map(|(name, _)| name.as_ref()).collect();
    assert_eq!(fields, ["month", "sales"]);
}

#[test]
fn the_only_column_may_be_replaced_at_another_length() {
    let data = Data::new().number("x", [1.0]).number("x", [1.0, 2.0]);
    assert_eq!(data.len(), 2);
}

#[test]
#[should_panic(expected = "not as long")]
fn a_column_of_another_length_panics() {
    let _ = sales().number("profit", [1.0]);
}

#[test]
fn builders_fill_the_encoding() {
    let chart = Chart::bar(sales())
        .x(Channel::ordinal("month"))
        .y(Channel::quantitative("sales"))
        .title("Sales");
    assert_eq!(chart.layers[0].mark, Mark::Bar);
    assert_eq!(chart.layers[0].encoding.x.clone().unwrap().field, "month");
    assert_eq!(
        chart.layers[0].encoding.y.clone().unwrap().kind,
        Kind::Quantitative
    );
    assert!(chart.layers[0].encoding.color.is_none());
}