///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_TPE_Test_Testcases
// 
//  Purpose:
//    This module contains the testcases of the EPTF TimeProfileEditor test enviroment.
// 
//  Module depends on:
//   <EPTF_CLL_TimeProfileEditor_Definitions> 
//   <EPTF_TPE_Test_Definitions> 
//   <EPTF_TPE_Test_Functions> 
//   <EPTF_CLL_Base_Functions> 
// 
//  Current Owner:
//    Janos Zoltan Svaner (ejnosvn)
// 
//  Last Review Date:
//    2007-xx-xx
//
//  Detailed Comments:
//    -
//
///////////////////////////////////////////////////////////////
module EPTF_TPE_Test_Testcases {

import from EPTF_CLL_TimeProfileEditor_Definitions all;
import from EPTF_TPE_Test_Definitions all;
import from EPTF_TPE_Test_Functions all;
import from EPTF_CLL_Base_Functions all;

testcase EPTF_TPE_Test_behaviour() runs on MAIN_CT { 
  f_EPTF_TPE_behaviour();
  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_add_time_sequence
// 
// Purpose:
//   to test adding new time sequence method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the add time sequence XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages contains the new time sequence related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_add_time_sequence() runs on MTC {
  f_EPTF_Base_init_CT("MTC");
  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_add_time_sequence), refers(f_GUISIM_send_add_time_sequence)) );

  t.start(5.0);
  t.timeout;

  setverdict(pass);
}


///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_change_time_sequence_properties_tree
// 
// Purpose:
//   to test adding new time sequence properties row method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the add time sequence properties row XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages contains the new time sequence properties related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_change_time_sequence_properties_tree() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_change_time_sequence_properties_tree), refers(f_GUISIM_send_change_time_sequence_properties_tree)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_addTimeSequenceRow
// 
// Purpose:
//   to test adding new time sequence properties row method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the add time sequence properties row XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages contains the new time sequence properties related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_addTimeSequenceRow() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_addTimeSequenceRow), refers(f_GUISIM_send_addTimeSequenceRow)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_removeSequenceRow
// 
// Purpose:
//   to test removing time sequence properties row method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the remove time sequence properties row XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages not contains the removed time sequence properties related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_removeSequenceRow() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_removeTimeSequenceRow), refers(f_GUISIM_send_removeTimeSequenceRow)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_removeSequence
// 
// Purpose:
//   to test removing time sequence method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the remove time sequence XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages not contains the removed time sequence related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_removeSequence() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_removeTimeSequence), refers(f_GUISIM_send_removeTimeSequence)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}


///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_addTimeProfile
// 
// Purpose:
//   to test adding new time profile method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the add new time profile XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages contains the new time profile related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_addTimeProfile() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_addTimeProfile), refers(f_GUISIM_send_addTimeProfile)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_addNewProfileRow
// 
// Purpose:
//   to test adding new time sequence row to a time profile method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the add new time sequence row XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages contains the new time sequence row related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_addNewProfileRow() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_addnewProfileRow), refers(f_GUISIM_send_addnewProfileRow)) );
  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_removeTimeProfileRow
// 
// Purpose:
//   to test removing time sequence row from a time profile method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the remove time sequence row XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages not contain the deleted time sequence row related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_removeTimeProfileRow() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_removeTimeProfileRow), refers(f_GUISIM_send_removeTimeProfileRow)) );

  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

///////////////////////////////////////////////////////////
// Testcase: tc_EPTF_TPE_Test_removeTimeProfile
// 
// Purpose:
//   to test removing a time profile method in GUI
// 
// Requirement:
//   -
//
// Action:
//   - create and start the server and client behaves as a TPE GUI
//   - client sends the remove time profile XTDP message to the server
//   - server sends the related XTDP messages to the client
//   - client checks the incomming answer messages
// Expected Result:
//   the incomming messages not contain the removed time profile related parameters
///////////////////////////////////////////////////////////
testcase tc_EPTF_TPE_Test_removeTimeProfile() runs on MTC {

  var MAIN_CT vc_server := MAIN_CT.create("TPE_Server");
  var EPTF_DummyGui_CT vc_client := EPTF_DummyGui_CT.create("TPE_Client");
  timer t;

  vc_server.start(f_EPTF_TPE_behaviour());
  t.start(1.0);
  t.timeout;
  vc_client.start(f_GUISIM_Test_DummyGuiBehavior("CompPlayingGUIClient", refers(f_GUISIM_receive_removeTimeProfile), refers(f_GUISIM_send_removeTimeProfile)) );

  t.start(5.0);
  t.timeout;

  setverdict(pass);
}

control {
  execute(tc_EPTF_TPE_Test_add_time_sequence());
  execute(tc_EPTF_TPE_Test_change_time_sequence_properties_tree());
  execute(tc_EPTF_TPE_Test_addTimeSequenceRow());
  execute(tc_EPTF_TPE_Test_removeSequenceRow());
  execute(tc_EPTF_TPE_Test_removeSequence());
  execute(tc_EPTF_TPE_Test_addTimeProfile());
  execute(tc_EPTF_TPE_Test_addNewProfileRow());
  execute(tc_EPTF_TPE_Test_removeTimeProfileRow());
  execute(tc_EPTF_TPE_Test_removeTimeProfile());
}
}
