module UnifiedDiagnosticServicestest {

import from General_Types all
import from UnifiedDiagnosticServices all
import from UnifiedDiagnosticServices_Template all

//component declarations
type component MTC_CT
{ 
}
// DiagnosticSessionControlRequest

testcase tc_encdec_DiagnosticSessionControlRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage :=  t_diagnosticSessionControlRequestSID (suppresssPos, 
  {extendedDiagnosticSession := t_ExtendedDiagnosticSessionRequest}
)
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// DiagnosticSessionControlResponse
testcase tc_encdec_DiagnosticSessionControlResponse () runs on MTC_CT // using a template
{
  template TopLevelMessage_UDS_responses t_UDSResponseMessage :=  t_diagnosticSessionControlResponseSID ( 
  {extendedDiagnosticSession := t_ExtendedDiagnosticSessionResponse('1020'O, '3040'O)}
  )
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// ECUResetRequest

testcase tc_encdec_ECUResetRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage :=  
     t_ecuResetRequestTypeSID (suppresssPos, {hardReset := t_HardResetRequest})
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// ECUResetResponse

testcase tc_encdec_ECUResetResponse () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage :=  
     t_ecuResetResponseTypeSID ({enableRapidPowerShutDown := t_EnableRapidPowerShutDownResponse('01'O)})
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// SecurityAccessRequest


testcase tc_encdec_SecurityAccessRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage :=  
     t_securityAccessRequest (suppresssPos, {requestSeed1 := t_requestSeedRequest1('01234567'O)})
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// SecurityAccessResponse

testcase tc_encdec_SecurityAccessResponse () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage := 
     t_SecurityAccessResponseSID ({requestSeed0 := t_requestSeedResponse0('00'O)})
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// CommunicationControlRequest
testcase tc_encdec_CommunicationControlRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage :=  t_communicationControlRequest (t_DisableRxAndTxRequest (
   suppresssPos, t_communicationType(DisableEnableSpecificSubnetIdentifiedBySubnetNumber7, normalMessages)
   ))
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// CommunicationControlResponse

testcase tc_encdec_CommunicationControlResponse () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage := 
     t_communicationControlResponse (DisableRxAndEnableTx)
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// TesterPresentRequest
testcase tc_encdec_TesterPresentRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage :=  t_testerPresentRequest (suppresssPos)
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// ReadDataByIdentifierRequest

testcase tc_encdec_ReadDataByIdentifierRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage := 
      t_ReadDataByIdentifierRequestSID ({readDataByIdentifier1 := t_ReadDataByIdentifierRequest1})
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}

// ReadDataByIdentifierResponse

testcase tc_encdec_ReadDataByIdentifierResponse () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage := 
     t_ReadDataByIdentifierResponseSID({readDataByIdentifier1 := t_ReadDataByIdentifierResponse1('01234567'O)})
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// WriteDataByIdentifierRequest

testcase tc_encdec_WriteDataByIdentifierRequest () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_requests t_UDSRequestMessage := 
      t_WriteDataByIdentifierRequestSID ({writeDataByIdentifier1 := t_WriteDataByIdentifierRequest1('123456'O)})
  
  log(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage)))
  log(decode_TopLevelMessage_UDS_requests(encode_TopLevelMessage_UDS_requests(valueof(t_UDSRequestMessage))))
}


// WriteDataByIdentifierResponse

testcase tc_encdec_WriteDataByIdentifierResponse () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage := 
     t_WriteDataByIdentifierResponseSID({writeDataByIdentifier1 := t_WriteDataByIdentifierResponse1})
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

// NegativeResponseCode

testcase tc_encdec_NegativeResponseCode () runs on MTC_CT // using a template
{
  
  template TopLevelMessage_UDS_responses t_UDSResponseMessage := 
     t_NegativeResponseCodeSID(readDataByIdentifier, voltageTooLow)
  
  log(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage)))
  log(decode_TopLevelMessage_UDS_responses(encode_TopLevelMessage_UDS_responses(valueof(t_UDSResponseMessage))))
}

} with { encode "RAW" } 

