Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions tests/integration/src/rust_masm_tests/constructors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
use miden_core::{Felt, StarkField};
use miden_debug::ToMidenRepr;
use midenc_frontend_wasm::WasmTranslationConfig;

use crate::{CompilerTest, testing::eval_package};

#[test]
fn test_felt_construction_edge_cases() {
// Return `0` zero as sentinel value for failure of constructing the Felt.
// This avoids having to deal with panics.
let main_fn = r#"(x: u64) -> Felt {
Felt::new(x).unwrap_or(Felt::new(0u64).unwrap())
}
"#;
let config = WasmTranslationConfig::default();
let mut test = CompilerTest::rust_fn_body_with_stdlib_sys(
"felt_constructor_edge_case",
main_fn,
config,
None,
);
let package = test.compile_package();

// (input, expected_out) with `expected_out = None` if Felt construction is expected to fail.
let cases: Vec<(u64, Option<u64>)> = Vec::from([
(1, Some(1)),
(Felt::MODULUS - 1, Some(Felt::MODULUS - 1)),
// failure as these values do not fit into Felt
(Felt::MODULUS, None),
(Felt::MODULUS + 1, None),
(u64::MAX, None),
]);

for (input, expected_out) in cases {
let mut args = Vec::<midenc_hir::Felt>::default();
input.push_to_operand_stack(&mut args);
eval_package::<Felt, _, _>(&package, [], &args, &test.session, |trace| {
let expected_out = match expected_out {
Some(out) => {
assert!(
out != 0,
"don't explicitly expect 0, it is the sentinel value for error"
);
out
}
None => 0,
};

let res: Felt = trace.parse_result().unwrap();
println!("input: {input}");
assert_eq!(res.as_int(), expected_out);
Ok(())
})
.unwrap();
}
}
1 change: 1 addition & 0 deletions tests/integration/src/rust_masm_tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use crate::testing::eval_package;

mod abi_transform;
mod apps;
mod constructors;
mod debug_source_locations;
mod examples;
mod instructions;
Expand Down