// Testing speculation - Basic forms use super::*; #[test] fn test_maybe_do_nothing() { // Three variants in which the behaviour in which nothing is performed is // somehow not allowed. Note that we "check" by seeing if the test finishes. // Only the branches in which ports fire increment the loop index const CODE: &'static str = " primitive only_puts(out output, u32 num_loops) { u32 index = 0; while (index < num_loops) { sync { put(output, true); } index += 1; } } primitive might_put(out output, u32 num_loops) { u32 index = 0; while (index < num_loops) { sync { fork { put(output, true); index += 1; } or {} } } } primitive only_gets(in input, u32 num_loops) { u32 index = 0; while (index < num_loops) { sync { auto res = get(input); assert(res); } index += 1; } } primitive might_get(in input, u32 num_loops) { u32 index = 0; while (index < num_loops) { sync fork { auto res = get(input); assert(res); index += 1; } or {} } } "; // Construct all variants which should work and wait until the runtime exits run_test_in_runtime(CODE, |api| { // only putting -> maybe getting let channel = api.create_channel().unwrap(); api.create_connector("", "only_puts", ValueGroup::new_stack(vec![ Value::Output(PortId::new(channel.putter_id.index)), Value::UInt32(NUM_LOOPS), ])).unwrap(); api.create_connector("", "might_get", ValueGroup::new_stack(vec![ Value::Input(PortId::new(channel.getter_id.index)), Value::UInt32(NUM_LOOPS), ])).unwrap(); // maybe putting -> only getting let channel = api.create_channel().unwrap(); api.create_connector("", "might_put", ValueGroup::new_stack(vec![ Value::Output(PortId::new(channel.putter_id.index)), Value::UInt32(NUM_LOOPS), ])).unwrap(); api.create_connector("", "only_gets", ValueGroup::new_stack(vec![ Value::Input(PortId::new(channel.getter_id.index)), Value::UInt32(NUM_LOOPS), ])).unwrap(); }) }