itf 0.4.0

Library for consuming Apalache ITF traces
Documentation
use dashu_int::IBig;

use serde::Deserialize;
use serde_json::json;

use itf::de::As;

#[derive(Debug, PartialEq, Eq, Deserialize)]
#[serde(tag = "tag", content = "value")]
enum IntOption {
    Some(IBig),
    None,
}

#[derive(Debug, PartialEq, Eq, Deserialize)]
pub struct State {
    value: IntOption,
}

#[test]
fn parse_trace() {
    let trace =
        itf::trace_from_str::<State>(include_str!("./fixtures/SumTypes0.itf.json")).unwrap();

    assert_eq!(trace.states[0].value.value, IntOption::None);
    assert_eq!(trace.states[1].value.value, IntOption::Some(40.into()));
    assert_eq!(trace.states[2].value.value, IntOption::Some(41.into()));
}

#[test]
fn test_deserialize_adhoc_some() {
    let some_itf = json!({
        "tag": "Some",
        "value": {"#bigint": "1"},
    });

    let some = itf::from_value::<IntOption>(some_itf).unwrap();
    assert_eq!(some, IntOption::Some(1.into()));
}

#[test]
fn test_deserialize_adhoc_none() {
    let none_itf = json!({
        "tag": "None",
        "value": {},
    });

    let none = itf::from_value::<IntOption>(none_itf).unwrap();
    assert_eq!(none, IntOption::None);
}

#[derive(Debug, PartialEq, Eq, Deserialize)]
#[serde(tag = "tag", content = "value")]
enum Enum {
    Foo,
    Bar(String),
    Baz((String, bool)),
    FooBar(String, IBig, bool),
}

#[test]
#[allow(clippy::disallowed_names)]
fn test_deserialize_enum() {
    let foo_itf = json!({
        "tag": "Foo",
        "value": {},
    });

    let foo = itf::from_value::<Enum>(foo_itf).unwrap();
    assert_eq!(foo, Enum::Foo);

    let bar_itf = json!({
        "tag": "Bar",
        "value": "hello",
    });

    let bar = itf::from_value::<Enum>(bar_itf).unwrap();
    assert_eq!(bar, Enum::Bar("hello".to_string()));

    let baz_itf = json!({
        "tag": "Baz",
        "value": { "#tup": ["hello", true] },
    });

    let baz = itf::from_value::<Enum>(baz_itf).unwrap();
    assert_eq!(baz, Enum::Baz(("hello".to_string(), true)));

    let foobar_itf = json!({
        "tag": "FooBar",
        "value": { "#tup": ["hello", { "#bigint": "42" }, true] },
    });
    let foobar = itf::from_value::<Enum>(foobar_itf).unwrap();
    assert_eq!(foobar, Enum::FooBar("hello".to_string(), 42.into(), true));
}

#[derive(Debug, PartialEq, Deserialize)]
struct FooOption {
    #[serde(with = "As::<itf::de::Option::<_>>")]
    foo: Option<u64>,
}

#[test]
#[allow(clippy::disallowed_names)]
fn test_deserialize_option_some() {
    let some_itf = json!({
        "foo": {
            "tag": "Some",
            "value": 42,
        }
    });

    let some_foo = itf::from_value::<FooOption>(some_itf).unwrap();
    assert_eq!(some_foo, FooOption { foo: Some(42) });
}

#[test]
#[allow(clippy::disallowed_names)]
fn test_deserialize_option_none() {
    let none_itf = json!({
        "foo": {
            "tag": "None",
            "value": {},
        }
    });

    let none_foo = itf::from_value::<FooOption>(none_itf).unwrap();
    assert_eq!(none_foo, FooOption { foo: None });
}

#[derive(Debug, PartialEq, Deserialize)]
struct FooResult {
    #[serde(with = "As::<itf::de::Result::<_, _>>")]
    foo: Result<u64, u64>,
}

#[test]
#[allow(clippy::disallowed_names)]
fn test_deserialize_result_ok() {
    let ok_itf = json!({
        "foo": {
            "tag": "Ok",
            "value": 42,
        }
    });

    let ok = itf::from_value::<FooResult>(ok_itf).unwrap();
    assert_eq!(ok.foo, Ok(42));
}

#[test]
#[allow(clippy::disallowed_names)]
fn test_deserialize_result_err() {
    let err_itf = json!({
        "foo": {
            "tag": "Err",
            "value": 42,
        }
    });

    let err = itf::from_value::<FooResult>(err_itf).unwrap();
    assert_eq!(err.foo, Err(42));
}