blob: 7109203c42c0a5ce62250cdfd50805ca0c5fb7f5 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
use anyhow::Result;
use opentitanlib::test_utils::status::Status;
use opentitanlib::with_unknown;
use std::io::{Read, Write};
use std::process::{Command, Stdio};
mod example {
// Bring in the auto-generated sources.
include!(env!("example"));
}
with_unknown! {
enum FuzzyBool: u32 {
False = 0,
True = 100,
}
}
fn roundtrip(name: &str, data: &str) -> Result<String> {
let mut command = Command::new(&std::env::var("ROUNDTRIP_CLIENT")?);
command.args([name]);
let mut child = command
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::inherit())
.spawn()?;
let mut stdin = child.stdin.take().unwrap();
eprintln!("sent: {}", data);
stdin.write_all(data.as_bytes())?;
stdin.write_all(b"\n")?;
let mut s = String::new();
let mut stdout = child.stdout.take().unwrap();
stdout.read_to_string(&mut s)?;
eprintln!("recv: {}", s);
Ok(s)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_foo() -> Result<()> {
let before = example::Foo {
foo: 5,
bar: 10,
message: "Hello".into(),
};
let after = roundtrip("foo", &serde_json::to_string_pretty(&before)?)?;
let after = serde_json::from_str::<example::Foo>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_rect() -> Result<()> {
let before = example::Rect {
top_left: example::Coord { x: 10, y: 20 },
bottom_right: example::Coord { x: 30, y: 40 },
};
let after = roundtrip("rect", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Rect>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_matrix() -> Result<()> {
let before = example::Matrix {
k: [
[0, 1, 2, 3, 4].into(),
[100, 200, 300, 400, 500].into(),
[-1, -2, -3, -4, -5].into(),
]
.into(),
};
let after = roundtrip("matrix", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Matrix>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_direction() -> Result<()> {
let before = example::Direction::North;
let after = roundtrip("direction", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Direction>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_direction_intvalue() -> Result<()> {
let before = example::Direction::IntValue(45);
let after = roundtrip("direction", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Direction>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_fuzzy_true() -> Result<()> {
let before = FuzzyBool::True;
let after = roundtrip("fuzzy_bool", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<FuzzyBool>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_fuzzy_false() -> Result<()> {
let before = FuzzyBool::False;
let after = roundtrip("fuzzy_bool", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<FuzzyBool>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_fuzzy_maybe() -> Result<()> {
let before = FuzzyBool(49);
let after = roundtrip("fuzzy_bool", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<FuzzyBool>(&after)?;
assert_eq!(before, after);
Ok(())
}
#[test]
fn test_misc() -> Result<()> {
let before = example::Misc {
value: true,
status: Status::InvalidArgument("FOO".into(), 5),
};
let after = roundtrip("misc", &serde_json::to_string(&before)?)?;
let after = serde_json::from_str::<example::Misc>(&after)?;
assert_eq!(before, after);
Ok(())
}
}