ion-binary-rs 0.8.13

Pure Rust parser, encoder and hasher for Amazon's Ion binary format.
Documentation
use std::convert::TryInto;

use chrono::DateTime;
use serde_json::Value;

use crate::{IonParserError, IonValue};

#[test]
fn serde_from_ion_symbol() {
    let bad_value = IonValue::Symbol("any".to_string());
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_datetime() {
    let bad_value =
        IonValue::DateTime(DateTime::parse_from_rfc3339("1997-12-11T16:39:27-00:00").unwrap());
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_annotation() {
    let bad_value = IonValue::Annotation(vec!["one".to_string()], Box::new(IonValue::Bool(true)));
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_blob() {
    let bad_value = IonValue::Blob(vec![2]);
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_clob() {
    let bad_value = IonValue::Clob(vec![3]);
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_sexpr() {
    let bad_value = IonValue::SExpr(vec![IonValue::Bool(true)]);
    let result: Result<Value, IonParserError> = bad_value.clone().try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::TypeNotSupported(bad_value));
}

#[test]
fn serde_from_ion_nan() {
    let bad_value = IonValue::Float(f64::NAN);
    let result: Result<Value, IonParserError> = bad_value.try_into();
    let error = result.unwrap_err();
    match error {
        IonParserError::DecimalNotANumericValue(x) => {
            assert!(x.is_nan());
        }
        _ => panic!("Wrong error type"),
    }
}

#[test]
fn serde_from_ion_infinity() {
    let infinity = f64::INFINITY;
    let bad_value = IonValue::Float(infinity);
    let result: Result<Value, IonParserError> = bad_value.try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::DecimalNotANumericValue(infinity));
}

#[test]
fn serde_from_ion_neg_infinity() {
    let neg_infinity = f64::NEG_INFINITY;
    let bad_value = IonValue::Float(neg_infinity);
    let result: Result<Value, IonParserError> = bad_value.try_into();
    let error = result.unwrap_err();

    assert_eq!(error, IonParserError::DecimalNotANumericValue(neg_infinity));
}