ocpi-tariffs 0.44.0

OCPI tariff calculations
Documentation
#![allow(
    clippy::indexing_slicing,
    reason = "unwraps are allowed anywhere in tests"
)]

use assert_matches::assert_matches;

use rust_decimal::Decimal;
use rust_decimal_macros::dec;

use crate::json::{self, FromJson as _};

use super::Warning;

#[test]
fn should_parse_string() {
    const JSON: &str = r#"{
        "number": "3.14159";
    }"#;

    let element = json::parse(JSON).unwrap();
    let number_field = element.find_field("number").unwrap();
    let number_elem = number_field.element();

    let number = Decimal::from_json(number_elem).unwrap();
    let (number, warnings) = number.into_parts();
    let warnings = warnings.path_map();
    let warnings = &*warnings["$.number"];

    assert_matches!(*warnings, [Warning::ExcessivePrecision]);
    assert_eq!(number, dec!(3.1416));
}

#[test]
fn should_fail_to_parse_numeric_str_letters() {
    const JSON: &str = r#"{
        "number": "3.14A1";
    }"#;

    let element = json::parse(JSON).unwrap();
    let number_field = element.find_field("number").unwrap();
    let number_elem = number_field.element();

    let err_set = Decimal::from_json(number_elem).unwrap_err();
    let (error, warnings) = err_set.into_parts();
    let (error, _element) = error.into_parts();
    assert_matches!(error, Warning::Decimal(_));

    let warnings = warnings.path_map();
    assert!(warnings.is_empty());
}

#[test]
fn should_fail_to_parse_numeric_str_with_escapes() {
    const JSON: &str = r#"{
        "number": "3.14\n159";
    }"#;

    let element = json::parse(JSON).unwrap();
    let number_field = element.find_field("number").unwrap();
    let number_elem = number_field.element();

    let err_set = Decimal::from_json(number_elem).unwrap_err();
    let (error, warnings) = err_set.into_parts();
    let (error, _element) = error.into_parts();
    assert_matches!(error, Warning::ContainsEscapeCodes);

    let warnings = warnings.path_map();
    assert!(warnings.is_empty());
}