serde_arrow 0.14.0

Convert sequences of Rust objects to Arrow arrays and back again
Documentation
use marrow::datatypes::DataType;
use serde::Serialize;

use crate::internal::{schema::TracingOptions, utils::Item};

use super::utils::{new_field, Test};

#[test]
fn str() {
    let field = new_field("item", DataType::LargeUtf8, false);
    type Ty = String;
    let values = [
        Item(String::from("a")),
        Item(String::from("b")),
        Item(String::from("c")),
        Item(String::from("d")),
    ];

    Test::new()
        .with_schema(vec![field])
        .trace_schema_from_samples(&values, TracingOptions::default())
        .trace_schema_from_type::<Item<Ty>>(TracingOptions::default())
        .serialize(&values)
        .deserialize(&values);
}

#[test]
fn str_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    type Ty = String;
    let values = [
        Item(String::from("a")),
        Item(String::from("b")),
        Item(String::from("c")),
        Item(String::from("d")),
    ];

    Test::new()
        .with_schema(vec![field])
        .trace_schema_from_samples(
            &values,
            TracingOptions::default().strings_as_large_utf8(false),
        )
        .trace_schema_from_type::<Item<Ty>>(TracingOptions::default().strings_as_large_utf8(false))
        .serialize(&values)
        .deserialize(&values);
}

#[test]
fn nullable_str() {
    let field = new_field("item", DataType::LargeUtf8, true);
    type Ty = Option<String>;
    let values = [
        Item(Some(String::from("a"))),
        Item(None),
        Item(None),
        Item(Some(String::from("d"))),
    ];

    Test::new()
        .with_schema(vec![field])
        .trace_schema_from_samples(&values, TracingOptions::default())
        .trace_schema_from_type::<Item<Ty>>(TracingOptions::default())
        .serialize(&values)
        .deserialize(&values);
}

#[test]
fn str_u32() {
    let field = new_field("item", DataType::Utf8, false);
    let values = [
        Item(String::from("a")),
        Item(String::from("b")),
        Item(String::from("c")),
        Item(String::from("d")),
    ];

    Test::new()
        .with_schema(vec![field])
        .serialize(&values)
        .deserialize(&values);
}

#[test]
fn nullable_str_u32() {
    let field = new_field("item", DataType::Utf8, true);
    let values = [
        Item(Some(String::from("a"))),
        Item(None),
        Item(None),
        Item(Some(String::from("d"))),
    ];

    Test::new()
        .with_schema(vec![field])
        .serialize(&values)
        .deserialize(&values);
}

#[test]
fn borrowed_str() {
    let field = new_field("item", DataType::LargeUtf8, false);

    type Ty<'a> = &'a str;

    let values = [Item("a"), Item("b"), Item("c"), Item("d")];

    Test::new()
        .with_schema(vec![field])
        .trace_schema_from_samples(&values, TracingOptions::default())
        .trace_schema_from_type::<Item<Ty>>(TracingOptions::default())
        .serialize(&values)
        .deserialize_borrowed(&values);
}

#[test]
fn nullabe_borrowed_str() {
    let field = new_field("item", DataType::LargeUtf8, true);

    type Ty<'a> = Option<&'a str>;

    let values = [Item(Some("a")), Item(None), Item(None), Item(Some("d"))];

    Test::new()
        .with_schema(vec![field])
        .trace_schema_from_samples(&values, TracingOptions::default())
        .trace_schema_from_type::<Item<Ty>>(TracingOptions::default())
        .serialize(&values)
        .deserialize_borrowed(&values);
}

#[test]
fn borrowed_str_u32() {
    let field = new_field("item", DataType::Utf8, false);

    let values = [Item("a"), Item("b"), Item("c"), Item("d")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&values)
        .deserialize_borrowed(&values);
}

#[test]
fn nullabe_borrowed_str_u32() {
    let field = new_field("item", DataType::Utf8, true);

    let values = [Item(Some("a")), Item(None), Item(None), Item(Some("d"))];

    Test::new()
        .with_schema(vec![field])
        .serialize(&values)
        .deserialize_borrowed(&values);
}

#[test]
fn i8_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(-1i8), Item(0), Item(1), Item(10)];
    let output = [Item("-1"), Item("0"), Item("1"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn i16_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(-1i16), Item(0), Item(1), Item(10)];
    let output = [Item("-1"), Item("0"), Item("1"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}
#[test]
fn i32_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(-1i32), Item(0), Item(1), Item(10)];
    let output = [Item("-1"), Item("0"), Item("1"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn i64_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(-1i64), Item(0), Item(1), Item(10)];
    let output = [Item("-1"), Item("0"), Item("1"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn u8_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(0u8), Item(1), Item(2), Item(10)];
    let output = [Item("0"), Item("1"), Item("2"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn u16_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(0u16), Item(1), Item(2), Item(10)];
    let output = [Item("0"), Item("1"), Item("2"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn u32_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(0u32), Item(1), Item(2), Item(10)];
    let output = [Item("0"), Item("1"), Item("2"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn u64_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(0u64), Item(1), Item(2), Item(10)];
    let output = [Item("0"), Item("1"), Item("2"), Item("10")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn f32_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(1.0f32), Item(0.5), Item(-0.5), Item(10.5)];
    let output = [Item("1"), Item("0.5"), Item("-0.5"), Item("10.5")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn f64_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(1.0f64), Item(0.5), Item(-0.5), Item(10.5)];
    let output = [Item("1"), Item("0.5"), Item("-0.5"), Item("10.5")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn bool_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item(true), Item(false)];
    let output = [Item("true"), Item("false")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn char_to_utf8() {
    let field = new_field("item", DataType::Utf8, false);
    let input = [Item('a'), Item('b'), Item('c')];
    let output = [Item("a"), Item("b"), Item("c")];

    Test::new()
        .with_schema(vec![field])
        .serialize(&input)
        .deserialize_borrowed(&output);
}

#[test]
fn unit_variants() {
    let field = new_field("item", DataType::Utf8, false);

    #[derive(Serialize)]
    enum E {
        A,
        B,
        C,
    }

    Test::new()
        .with_schema(vec![field])
        .serialize(&[Item(E::A), Item(E::B), Item(E::C)]);
}