use super::*; #[test] fn test_unconnected_component_error() { compile_and_create_component(" primitive interact_with_noone() { u8[] array = { 5 }; auto value = array[1]; }", "interact_with_noone", no_args()); } #[test] fn test_connected_uncommunicating_component_error() { compile_and_create_component(" primitive crashing_and_burning(out unused) { u8[] array = { 1337 }; auto value = array[1337]; } primitive sitting_idly_waiting(in never_providing) { sync auto a = get(never_providing); } composite constructor() { // Test one way // channel a -> b; // new sitting_idly_waiting(b); // new crashing_and_burning(a); // And the other way around channel c -> d; new crashing_and_burning(c); new sitting_idly_waiting(d); }", "constructor", no_args()) } #[test] fn test_connected_communicating_component_error() { compile_and_create_component(" primitive send_and_fail(out tx) { u8[] array = {}; sync { put(tx, 0); array[0] = 5; } } primitive receive_once(in rx) { sync auto a = get(rx); } composite constructor() { channel a -> b; new send_and_fail(a); new receive_once(b); channel c -> d; new receive_once(d); new send_and_fail(c); } ", "constructor", no_args()) } #[test] fn test_failing_after_successful_sync() { compile_and_create_component(" primitive put_and_fail(out tx) { sync put(tx, 1); u8 a = {}[0]; } primitive get_and_fail(in rx) { sync auto a = get(rx); u8 a = {}[0]; } primitive put_and_exit(out tx) { sync put(tx, 2); } primitive get_and_exit(in rx) { sync auto a = get(rx); } composite constructor() { { channel a -> b; new put_and_fail(a); new get_and_exit(b); } { channel a -> b; new get_and_exit(b); new put_and_fail(a); } { channel a -> b; new put_and_exit(a); new get_and_fail(b); } { channel a -> b; new get_and_fail(b); new put_and_exit(a); } } ", "constructor", no_args()); }