diff --git a/src/runtime/tests.rs b/src/runtime/tests.rs index da235628d7a898fa9ccbc6beb9eff0e2523a2a8b..027bb6b2c735d55c45cf50e2e857f5203e8ae0c3 100644 --- a/src/runtime/tests.rs +++ b/src/runtime/tests.rs @@ -1311,3 +1311,63 @@ fn for_msg_byte() { } c.sync(None).unwrap(); } + +#[test] +fn eq_no_causality() { + let test_log_path = Path::new("./logs/eq_no_causality"); + let pdl = b" + composite eq(in a, in b, out c) { + channel leftfirsto -> leftfirsti; + new eqinner(a, b, c, leftfirsto, leftfirsti); + } + primitive eqinner(in a, in b, out c, out leftfirsto, in leftfirsti) { + msg ma = null; + msg mb = null; + while(true) synchronous { + if(fires(leftfirsti)) { + // left first! DO USE DUMMY + ma = get(a); + put(c, ma); + mb = get(b); + + // using dummy! + put(leftfirsto, ma); + get(leftfirsti); + } else { + // right first! DON'T USE DUMMY + mb = get(b); + put(c, mb); + ma = get(a); + } + assert(ma == mb); + } + } + "; + let pd = reowolf::ProtocolDescription::parse(pdl).unwrap(); + let mut c = file_logged_configured_connector(0, test_log_path, Arc::new(pd)); + + /* + [native]p0-->g0[eq]p1--. + g1 | + ^---------` + */ + let [p0, g0] = c.new_port_pair(); + let [p1, g1] = c.new_port_pair(); + c.add_component(b"eq", &[g0, g1, p1]).unwrap(); + + /* + V--------. + g2 | + [native]p2-->g3[eq]p3--` + */ + let [p2, g2] = c.new_port_pair(); + let [p3, g3] = c.new_port_pair(); + c.add_component(b"eq", &[g3, g2, p3]).unwrap(); + c.connect(None).unwrap(); + + for _ in 0..32 { + c.put(p0, TEST_MSG.clone()).unwrap(); + c.put(p2, TEST_MSG.clone()).unwrap(); + c.sync(SEC1).unwrap(); + } +}