fn round_trip_scalar_values()

in datafusion/proto/src/logical_plan/mod.rs [1950:2132]


    fn round_trip_scalar_values() {
        let should_pass: Vec<ScalarValue> = vec![
            ScalarValue::Boolean(None),
            ScalarValue::Float32(None),
            ScalarValue::Float64(None),
            ScalarValue::Int8(None),
            ScalarValue::Int16(None),
            ScalarValue::Int32(None),
            ScalarValue::Int64(None),
            ScalarValue::UInt8(None),
            ScalarValue::UInt16(None),
            ScalarValue::UInt32(None),
            ScalarValue::UInt64(None),
            ScalarValue::Utf8(None),
            ScalarValue::LargeUtf8(None),
            ScalarValue::new_list(None, DataType::Boolean),
            ScalarValue::Date32(None),
            ScalarValue::Boolean(Some(true)),
            ScalarValue::Boolean(Some(false)),
            ScalarValue::Float32(Some(1.0)),
            ScalarValue::Float32(Some(f32::MAX)),
            ScalarValue::Float32(Some(f32::MIN)),
            ScalarValue::Float32(Some(-2000.0)),
            ScalarValue::Float64(Some(1.0)),
            ScalarValue::Float64(Some(f64::MAX)),
            ScalarValue::Float64(Some(f64::MIN)),
            ScalarValue::Float64(Some(-2000.0)),
            ScalarValue::Int8(Some(i8::MIN)),
            ScalarValue::Int8(Some(i8::MAX)),
            ScalarValue::Int8(Some(0)),
            ScalarValue::Int8(Some(-15)),
            ScalarValue::Int16(Some(i16::MIN)),
            ScalarValue::Int16(Some(i16::MAX)),
            ScalarValue::Int16(Some(0)),
            ScalarValue::Int16(Some(-15)),
            ScalarValue::Int32(Some(i32::MIN)),
            ScalarValue::Int32(Some(i32::MAX)),
            ScalarValue::Int32(Some(0)),
            ScalarValue::Int32(Some(-15)),
            ScalarValue::Int64(Some(i64::MIN)),
            ScalarValue::Int64(Some(i64::MAX)),
            ScalarValue::Int64(Some(0)),
            ScalarValue::Int64(Some(-15)),
            ScalarValue::UInt8(Some(u8::MAX)),
            ScalarValue::UInt8(Some(0)),
            ScalarValue::UInt16(Some(u16::MAX)),
            ScalarValue::UInt16(Some(0)),
            ScalarValue::UInt32(Some(u32::MAX)),
            ScalarValue::UInt32(Some(0)),
            ScalarValue::UInt64(Some(u64::MAX)),
            ScalarValue::UInt64(Some(0)),
            ScalarValue::Utf8(Some(String::from("Test string   "))),
            ScalarValue::LargeUtf8(Some(String::from("Test Large utf8"))),
            ScalarValue::Date32(Some(0)),
            ScalarValue::Date32(Some(i32::MAX)),
            ScalarValue::Date32(None),
            ScalarValue::Date64(Some(0)),
            ScalarValue::Date64(Some(i64::MAX)),
            ScalarValue::Date64(None),
            ScalarValue::Time32Second(Some(0)),
            ScalarValue::Time32Second(Some(i32::MAX)),
            ScalarValue::Time32Second(None),
            ScalarValue::Time32Millisecond(Some(0)),
            ScalarValue::Time32Millisecond(Some(i32::MAX)),
            ScalarValue::Time32Millisecond(None),
            ScalarValue::Time64Microsecond(Some(0)),
            ScalarValue::Time64Microsecond(Some(i64::MAX)),
            ScalarValue::Time64Microsecond(None),
            ScalarValue::Time64Nanosecond(Some(0)),
            ScalarValue::Time64Nanosecond(Some(i64::MAX)),
            ScalarValue::Time64Nanosecond(None),
            ScalarValue::TimestampNanosecond(Some(0), None),
            ScalarValue::TimestampNanosecond(Some(i64::MAX), None),
            ScalarValue::TimestampNanosecond(Some(0), Some("UTC".into())),
            ScalarValue::TimestampNanosecond(None, None),
            ScalarValue::TimestampMicrosecond(Some(0), None),
            ScalarValue::TimestampMicrosecond(Some(i64::MAX), None),
            ScalarValue::TimestampMicrosecond(Some(0), Some("UTC".into())),
            ScalarValue::TimestampMicrosecond(None, None),
            ScalarValue::TimestampMillisecond(Some(0), None),
            ScalarValue::TimestampMillisecond(Some(i64::MAX), None),
            ScalarValue::TimestampMillisecond(Some(0), Some("UTC".into())),
            ScalarValue::TimestampMillisecond(None, None),
            ScalarValue::TimestampSecond(Some(0), None),
            ScalarValue::TimestampSecond(Some(i64::MAX), None),
            ScalarValue::TimestampSecond(Some(0), Some("UTC".into())),
            ScalarValue::TimestampSecond(None, None),
            ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(0, 0))),
            ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(1, 2))),
            ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(
                i32::MAX,
                i32::MAX,
            ))),
            ScalarValue::IntervalDayTime(None),
            ScalarValue::IntervalMonthDayNano(Some(
                IntervalMonthDayNanoType::make_value(0, 0, 0),
            )),
            ScalarValue::IntervalMonthDayNano(Some(
                IntervalMonthDayNanoType::make_value(1, 2, 3),
            )),
            ScalarValue::IntervalMonthDayNano(Some(
                IntervalMonthDayNanoType::make_value(i32::MAX, i32::MAX, i64::MAX),
            )),
            ScalarValue::IntervalMonthDayNano(None),
            ScalarValue::new_list(
                Some(vec![
                    ScalarValue::Float32(Some(-213.1)),
                    ScalarValue::Float32(None),
                    ScalarValue::Float32(Some(5.5)),
                    ScalarValue::Float32(Some(2.0)),
                    ScalarValue::Float32(Some(1.0)),
                ]),
                DataType::Float32,
            ),
            ScalarValue::new_list(
                Some(vec![
                    ScalarValue::new_list(None, DataType::Float32),
                    ScalarValue::new_list(
                        Some(vec![
                            ScalarValue::Float32(Some(-213.1)),
                            ScalarValue::Float32(None),
                            ScalarValue::Float32(Some(5.5)),
                            ScalarValue::Float32(Some(2.0)),
                            ScalarValue::Float32(Some(1.0)),
                        ]),
                        DataType::Float32,
                    ),
                ]),
                DataType::List(new_arc_field("item", DataType::Float32, true)),
            ),
            ScalarValue::Dictionary(
                Box::new(DataType::Int32),
                Box::new(ScalarValue::Utf8(Some("foo".into()))),
            ),
            ScalarValue::Dictionary(
                Box::new(DataType::Int32),
                Box::new(ScalarValue::Utf8(None)),
            ),
            ScalarValue::Binary(Some(b"bar".to_vec())),
            ScalarValue::Binary(None),
            ScalarValue::LargeBinary(Some(b"bar".to_vec())),
            ScalarValue::LargeBinary(None),
            ScalarValue::Struct(
                Some(vec![
                    ScalarValue::Int32(Some(23)),
                    ScalarValue::Boolean(Some(false)),
                ]),
                Fields::from(vec![
                    Field::new("a", DataType::Int32, true),
                    Field::new("b", DataType::Boolean, false),
                ]),
            ),
            ScalarValue::Struct(
                None,
                Fields::from(vec![
                    Field::new("a", DataType::Int32, true),
                    Field::new("a", DataType::Boolean, false),
                ]),
            ),
            ScalarValue::FixedSizeBinary(
                b"bar".to_vec().len() as i32,
                Some(b"bar".to_vec()),
            ),
            ScalarValue::FixedSizeBinary(0, None),
            ScalarValue::FixedSizeBinary(5, None),
        ];

        for test_case in should_pass.into_iter() {
            let proto: super::protobuf::ScalarValue = (&test_case)
                .try_into()
                .expect("failed conversion to protobuf");

            let roundtrip: ScalarValue = (&proto)
                .try_into()
                .expect("failed conversion from protobuf");

            assert_eq!(
                test_case, roundtrip,
                "ScalarValue was not the same after round trip!\n\n\
                        Input: {test_case:?}\n\nRoundtrip: {roundtrip:?}"
            );
        }
    }