/****************************************************************************** * Copyright (c) 2000-2014 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ module Tsenderos { import from Datatypes all; type port PT_DefOpt message { inout Deff; inout Opt } type component CT_test { port PT_DefOpt port_do; } function send_d_recv_o( in Deff d, in template Opt t) runs on CT_test { map(self:port_do, system:port_do); port_do.send(d); timer patience := 3.0; patience.start; alt { [] port_do.receive(t) { setverdict(pass); } [] port_do.receive { setverdict(fail); } [] patience.timeout { setverdict(inconc); } } unmap(self:port_do, system:port_do); } function send_o_recv_d( in Opt o, in template Deff t) runs on CT_test { map(self:port_do, system:port_do); port_do.send(o); timer patience := 3.0; patience.start; alt { [] port_do.receive(t) { setverdict(pass); } [] port_do.receive { setverdict(fail); } [] patience.timeout { setverdict(inconc); } } unmap(self:port_do, system:port_do); } testcase tc_def_send() runs on CT_test system CT_test { // Send a concrete value instead of the default send_d_recv_o( {1,2,3}, {1,2,3} ); } testcase tc_def_send_def() runs on CT_test system CT_test { // Send the default send_d_recv_o( {1,13,3}, {1,13,3} ); } testcase tc_def_send_not() runs on CT_test system CT_test { send_d_recv_o( {1,omit,3}, {1,omit,3} ); // requires -d //send_d_recv_o( {1,13,3}, {1,omit,3} ); } testcase tc_opt_send() runs on CT_test system CT_test { // send a concrete value send_o_recv_d( {1,2,3}, {1,2,3} ); } testcase tc_opt_send_def() runs on CT_test system CT_test { // send the default send_o_recv_d( {1,13,3}, {1,13,3} ); } testcase tc_opt_send_not() runs on CT_test system CT_test { // do not send the optional value send_o_recv_d( {1,omit,3}, {1,omit,3} ); } testcase tc1() runs on CT_test system CT_test { map(self:port_do, system:port_do); var Deff d123 := {1,2,3}, d1_3 := {1,13,3}; var Opt o123 := {1,2,3}, o1_3 := {1,-,3}; port_do.send(d123); port_do.send(d1_3); port_do.send(o123); port_do.send(o1_3); setverdict(pass); unmap(self:port_do, system:port_do); } type component IOTestComponent {} /*--- IMPLICIT OMIT --------------------------------------------------*/ type record IO_rectype1 { integer a, boolean b optional } type record IO_rectype2 { IO_rectype1 m } const IO_rectype1 constrec := { a := 3 } with {optional "implicit omit"}; template IO_rectype1 t1 := { a := ?, b := omit }; template IO_rectype1 omit1 := { a := ? } with {optional "implicit omit"}; template IO_rectype2 t2 := { m := { a := ?, b := omit } }; template IO_rectype2 omit2 := { m := { a := ? } } with {optional "implicit omit"}; template IO_rectype2 t3 := { m := omit1 }; template IO_rectype2 omit3 := { m := omit1 } with {optional "implicit omit"}; testcase implicit_omit() runs on IOTestComponent { var IO_rectype1 rec1 := { a := 3, b := omit }; var IO_rectype2 rec2 := { m := { a := 3, b := omit } }; if (match(rec1, omit1)) {setverdict(pass);} else {setverdict(fail);} if (match(rec1, t1)) {setverdict(pass);} else {setverdict(fail);} if (match(rec2, omit2)) {setverdict(pass);} else {setverdict(fail);} if (match(rec2, t2)) {setverdict(pass);} else {setverdict(fail);} if (match(rec2, omit3)) {setverdict(pass);} else {setverdict(fail);} if (match(rec2, t3)) {setverdict(pass);} else {setverdict(fail);} if (match(rec1, constrec)) {setverdict(pass);} else {setverdict(fail);} } with {optional "implicit omit"}; control { //execute( tc1() ); execute( tc_def_send() ); execute( tc_def_send_def() ); execute( tc_def_send_not() ); execute( tc_opt_send() ); execute( tc_opt_send_def() ); execute( tc_opt_send_not() ); execute (implicit_omit()); } }