///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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: LoggingUI_test
// 
//  Purpose:
//    Test module for LoggingUI feature testing.
// 
///////////////////////////////////////////////////////////

module LoggingUI_test
{

//=========================================================================
// Import Part
//=========================================================================

// if you use EPTF_Generic_Logger_CT you have to import these
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;

import from EPTF_CLL_LoggingUI_Definitions all;
import from EPTF_CLL_LoggingUI_Functions all;
import from EPTF_CLL_LoggingUIClient_Functions all;

import from EPTF_CLL_UIHandlerClient_Definitions all;
import from EPTF_CLL_UIHandlerClient_Functions all;
import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_UIHandler_WidgetFunctions all;
import from EPTF_CLL_UIHandler_MsgDefinitions all;
import from EPTF_CLL_UIHandler_XULFunctions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Base_Definitions all;
import from EPTF_CLL_HashMapStr2Int_Functions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;

//=========================================================================
//Component Types
//=========================================================================

type component SYSTEM_CT{
//  port XTDPasp_PT EPTF_guiPortIf;
}

type component Server_CT extends EPTF_UIHandler_CT, EPTF_LoggingUI_CT{
}

type component MAIN_CT extends EPTF_Base_CT {
}

//=========================================================================
//Templates
//=========================================================================

// template ASP_XTDP tr_LoggingUI_ASP_XTDP_exitTTCNButtonPressed :=
// {
//   client_id := ?,
//   data := {
//     noNamespaceSchemaLocation := *,
//     xtdp_Message := {
//       xtdp_Requests := {
//         { requestId := ?,
//           widget := { widgetId := "EPTF_exit_ttcn_button", widgetType := ? },
//           action_Field := xtdp_put,
//           argument := ?,
//           argumentList := *,
//           timeout_Field := * 
//         }
//       }
//     }
//   }
// }

//=========================================================================
//Functions
//=========================================================================

function f_EPTF_LoggingUITest_createHBox(in charstring pl_myWidgetID, out Widgets pl_xul)
{
  pl_xul := {
    hbox := {
	customclass   := omit,
	disabled      := omit,
	disabledongui := omit,
	fixedposition := omit,
	flex          := omit,
	id            := pl_myWidgetID,
	orientation   := vertical,
	scrollable    := omit,
	embeddedwidgets := {embeddedwidget_list := {}}
    }
  }
}

function f_EPTF_LoggingUITest_createMainWidgets(in charstring pl_myWidgetID, out Widgets pl_xul)
{
  pl_xul :={
   hbox   := {
    customclass   := omit,
    disabled      := omit,
    disabledongui := omit,
    fixedposition := omit,
    flex          := omit,
    id            := pl_myWidgetID,
    orientation   := horizontal,
    scrollable    := omit,
    embeddedwidgets := { embeddedwidget_list := {
      {
        hbox := {
	  customclass   := omit,
	  disabled      := omit,
	  disabledongui := omit,
	  fixedposition := omit,
	  flex          := omit,
	  id            := "EPTF_Main_hbox_labels",
	  orientation   := vertical,
	  scrollable    := omit,
	  embeddedwidgets := {embeddedwidget_list := {
            {
              label_ := {
	        customclass    := omit,
	        disabled       := omit,
	        disabledongui  := omit,
	        flex           := omit,
	        id             := "status",
	        style          := omit,
	        tooltiptext    := omit,
	        value_         := "This text will be replaced runtime.",
	        externaldata    := omit
             }
            }
          }}
        }
      },
      {
        hbox := {
	  customclass   := omit,
	  disabled      := omit,
	  disabledongui := omit,
	  fixedposition := omit,
	  flex          := omit,
	  id            := "EPTF_Main_hbox_buttons",
	  orientation   := horizontal,
	  scrollable    := omit,
	  embeddedwidgets := {embeddedwidget_list := {
            {
              spacer    :=  {
                flex := 1.0,
                id   := "spacer"
              }
            },
            {
              button    := {
	        checked        := omit,
	        customclass    := omit,
	        disabled       := false,
	        disabledongui  := omit,
	        flex           := omit,
	        id             := "EPTF_exit_ttcn_button",
	        imageid        := omit,
	        label_         := "Exit TTCN",
	        tooltiptext    := omit,
	        type_          := omit,
	        externaldata   := omit
              }
            }
          }}
        }
      }
    }}
  }
  }
}

function f_EPTF_LoggingUITest_createTabBox(in charstring pl_myWidgetID, out Widgets pl_xul)
{
  pl_xul :={
    tabpage := {
      customclass     := omit,
      disabledongui   := omit,
      id              := pl_myWidgetID,
      label_          := pl_myWidgetID,
      maxheight       := omit,
      orientation     := omit,
      tooltiptext     := omit,
      embeddedwidgets := {embeddedwidget_list := {}}
    }
  }
}


function f_EPTF_LoggingUIClient1_Behaviour(
  in charstring pl_selfName, 
  in EPTF_LoggingUI_CT pl_loggingUI_main,
  in EPTF_UIHandler_CT pl_subscriber) runs on EPTF_LoggingUIClient_CT{

  f_EPTF_LoggingUIClient_init_CT(pl_selfName, pl_loggingUI_main, pl_subscriber);
  f_EPTF_Logging_debug(true,"----- LoggingUIClient START -------");

  var integer v_logMaskIdx;
  v_logMaskIdx := f_EPTF_Logging_registerComponentMasks("EPTF_SomeClient", {"Error", "Warning", "Debug"});

  f_EPTF_Logging_log(true,v_logMaskIdx,{2},"----- ComponentMask registered -------");

  timer t_waitProv1 := 3.0;

  t_waitProv1.start;
  alt {
    [] t_waitProv1.timeout{

        f_EPTF_Logging_error(true,"--EPTF_Logging Mask:0 (Error)--");
        f_EPTF_Logging_warning(true,"--EPTF_Logging Mask:1 (Warning)--");
        f_EPTF_Logging_debug(true,"--EPTF_Logging Mask:2 (Debug)--");
        f_EPTF_Logging_debugM(true,"--EPTF_Logging Mask:3 (DebugM)--");
        f_EPTF_Logging_debugV(true,"--EPTF_Logging Mask:4 (DebugV)--");
        f_EPTF_Logging_log(true,v_logMaskIdx,{0},"--EPTF_SomeClient Mask:0 (Error)--");
        f_EPTF_Logging_log(true,v_logMaskIdx,{1},"--EPTF_SomeClient Mask:1 (Warning)--");
        f_EPTF_Logging_log(true,v_logMaskIdx,{2},"--EPTF_SomeClient Mask:2 (Debug)--");       

        t_waitProv1.start;repeat;
    }
  };
  
  f_EPTF_Logging_debug(true,"----- LoggingUIClient shutdown -------");
  f_EPTF_Base_cleanup_CT(); 
}

function f_EPTF_LoggingUIClient2_Behaviour(
  in charstring pl_selfName, 
  in EPTF_LoggingUI_CT pl_loggingUI_main,
  in EPTF_UIHandler_CT pl_subscriber) runs on EPTF_LoggingUIClient_CT{

  f_EPTF_LoggingUIClient_init_CT(pl_selfName, pl_loggingUI_main, pl_subscriber);
  f_EPTF_Logging_debug(true,"----- LoggingUIClient START -------");

  var integer v_logMaskIdx;
  v_logMaskIdx := f_EPTF_Logging_registerComponentMasks("EPTF_SomeClient2", {"Error", "Debug"});
  f_EPTF_Logging_log(true,v_logMaskIdx,{1},"----- ComponentMask registered -------");


  timer t_waitProv1 := 3.0;

  t_waitProv1.start;
  alt {
    [] t_waitProv1.timeout{

        f_EPTF_Logging_error(true,"--EPTF_Logging Mask:0 (Error)--");
        f_EPTF_Logging_warning(true,"--EPTF_Logging Mask:1 (Warning)--");
        f_EPTF_Logging_debug(true,"--EPTF_Logging Mask:2 (Debug)--");
        f_EPTF_Logging_debugM(true,"--EPTF_Logging Mask:3 (DebugM)--");
        f_EPTF_Logging_debugV(true,"--EPTF_Logging Mask:4 (DebugV)--");
        f_EPTF_Logging_log(true,v_logMaskIdx,{0},"--EPTF_SomeClient2 Mask:0 (Error)--");
        f_EPTF_Logging_log(true,v_logMaskIdx,{1},"--EPTF_SomeClient2 Mask:1 (Debug)--");       

        t_waitProv1.start;repeat;
    }
  };

  /*  timer t_waitProv1 := 3.0;
  t_waitProv1.start;
  alt {
    [] t_waitProv1.timeout{
        if(v_EPTF_Logging_ComponentMask_List[0].componentLocalMask[0])
        {
          //disabling mask 0.0 element (error,eptf core)
          f_EPTF_Logging_disableLocalMask(0,0);
          f_EPTF_LoggingUI_disableAllGlobal();
        }
        else 
        {
          //enabling mask 0.0 element (error,eptf core)
          f_EPTF_Logging_enableLocalMask(0,0);
          f_EPTF_LoggingUI_enableAllGlobal();
        }       

        t_waitProv1.start;repeat;
    }
  };*/

  f_EPTF_Logging_debug(true,"----- LoggingUIClient shutdown -------");
  f_EPTF_Base_cleanup_CT(); 
}

function f_EPTF_LoggingUIClient3_Behaviour(
  in charstring pl_selfName, 
  in EPTF_LoggingUI_CT pl_loggingUI_main,
  in EPTF_UIHandler_CT pl_subscriber) runs on EPTF_LoggingUIClient_CT{

  f_EPTF_LoggingUIClient_init_CT(pl_selfName, pl_loggingUI_main, pl_subscriber);
  f_EPTF_Logging_debug(true,"----- LoggingUIClient START -------");

  var integer v_logMaskIdx;
  //TODO the following code has error in it, the same componentmask is to be registered, but with different classes.
  //TODO The src code does not give error on it, TR HQ62119 has been written on it. 
  v_logMaskIdx := f_EPTF_Logging_registerComponentMasks("EPTF_SomeClient", {"Error", "Warning", "Debug"});
  f_EPTF_Logging_log(true,v_logMaskIdx,{1},"----- ComponentMask registered -------");

  timer t_waitProv1 := 3.0;
  t_waitProv1.start;
  alt {
    [] t_waitProv1.timeout{
        //testing global chekbox
        if(v_EPTF_Logging_allComponentGlobalEnable)
        {
          f_EPTF_LoggingUI_disableAllGlobal();
        }
        else 
        {
          f_EPTF_LoggingUI_enableAllGlobal();
        }       
        for (var integer j:=0; j<2; j:=j+1) {
          //testing component type global chekboxes
          if(v_EPTF_Logging_ComponentMask_List[j].componentGlobalEnable)
          {
            f_EPTF_LoggingUI_disableGlobal(j);
          }
          else 
          {
            f_EPTF_LoggingUI_enableGlobal(j);
          } 
          //testing component type mask chekboxes
          for (var integer k:=0; k<sizeof(v_EPTF_Logging_ComponentMask_List[j].componentGlobalMask); k:=k+1) {
            if(v_EPTF_Logging_ComponentMask_List[j].componentGlobalMask[k])
            {
              f_EPTF_LoggingUI_disableGlobalMask(j,k);
            }
            else 
            {
              f_EPTF_LoggingUI_enableGlobalMask(j,k);
            }
          }
        }

        //testing local chekbox
        if(v_EPTF_Logging_allComponentLocalEnable)
        {
          f_EPTF_Logging_disableAllLocal();
        }
        else 
        {
          f_EPTF_Logging_enableAllLocal();
        }       
        for (var integer j:=0; j<2; j:=j+1) {
          //testing component type Local chekboxes
          if(v_EPTF_Logging_ComponentMask_List[j].componentLocalEnable)
          {
            f_EPTF_Logging_disableLocal(j);
          }
          else 
          {
            f_EPTF_Logging_enableLocal(j);
          } 
          //testing component type mask chekboxes
          for (var integer k:=0; k<sizeof(v_EPTF_Logging_ComponentMask_List[j].componentLocalMask); k:=k+1) {
            if(v_EPTF_Logging_ComponentMask_List[j].componentLocalMask[k])
            {
              f_EPTF_Logging_disableLocalMask(j,k);
            }
            else 
            {
              f_EPTF_Logging_enableLocalMask(j,k);
            }
          }
        }

        //testing my chekboxes
        //testing component type global chekboxes
        if(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentGlobalEnable)
        {
          f_EPTF_LoggingUI_disableGlobal(v_logMaskIdx);
        }
        else 
        {
          f_EPTF_LoggingUI_enableGlobal(v_logMaskIdx);
        } 
        //testing component type mask chekboxes
        for (var integer k:=0; k<sizeof(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentGlobalMask); k:=k+1) {
          if(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentGlobalMask[k])
          {
            f_EPTF_LoggingUI_disableGlobalMask(v_logMaskIdx,k);
          }
          else 
          {
            f_EPTF_LoggingUI_enableGlobalMask(v_logMaskIdx,k);
          }
        }
        //testing component type Local chekboxes
        if(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentLocalEnable)
        {
          f_EPTF_Logging_disableLocal(v_logMaskIdx);
        }
        else 
        {
          f_EPTF_Logging_enableLocal(v_logMaskIdx);
        } 
        //testing component type mask chekboxes
        for (var integer k:=0; k<sizeof(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentLocalMask); k:=k+1) {
          if(v_EPTF_Logging_ComponentMask_List[v_logMaskIdx].componentLocalMask[k])
          {
            f_EPTF_Logging_disableLocalMask(v_logMaskIdx,k);
          }
          else 
          {
            f_EPTF_Logging_enableLocalMask(v_logMaskIdx,k);
          }
        }
        t_waitProv1.start;repeat;
    }
  };

  f_EPTF_Logging_debug(true,"----- LoggingUIClient shutdown -------");
  f_EPTF_Base_cleanup_CT(); 
}

// redefines the eventClasses differently than it was in f_EPTF_LoggingUIClient1_Behaviour. This should result in an error message in the LoggingUI component.
function f_EPTF_LoggingUIClient4_Behaviour(
  in charstring pl_selfName, 
  in EPTF_LoggingUI_CT pl_loggingUI_main,
  in EPTF_UIHandler_CT pl_subscriber) runs on EPTF_LoggingUIClient_CT{

  f_EPTF_LoggingUIClient_init_CT(pl_selfName, pl_loggingUI_main, pl_subscriber);
  f_EPTF_Logging_debug(true,"----- LoggingUIClient START -------");

  var integer v_logMaskIdx;
  //TODO the following code has error in it, the same componentmask is to be registered, but with different classes.
  //TODO The src code does not give error on it, TR HQ62119 has been written on it. 
  v_logMaskIdx := f_EPTF_Logging_registerComponentMasks("EPTF_SomeClient", {"Error", "Debug" /*, "Debug2", "Debug3", "Debug4"*/});
  f_EPTF_Logging_log(true,v_logMaskIdx,{1},"----- ComponentMask registered -------");

  f_EPTF_Base_wait4Shutdown();
}

function f_EPTF_LoggingUI_Behaviour(
  in charstring pl_selfName, 
  in EPTF_UIHandler_CT pl_subscriber,
  in charstring pl_tabboxName) runs on EPTF_LoggingUI_CT{

  log("----- LoggingUI START -------"); 
  f_EPTF_LoggingUI_init_CT(pl_selfName, pl_subscriber,pl_tabboxName)
  
  timer t_waitProv := 2.0;

  t_waitProv.start;
  alt {
    [] t_waitProv.timeout{
      t_waitProv.start;repeat;
    }
  }
  f_EPTF_Base_cleanup_CT();
  log("----- LoggingUI shutdown -------");  
}

function f_EPTF_UIHandler_Behaviour(charstring pl_selfName) runs on EPTF_UIHandler_CT{
  log("----- Subscriber START -------");
  f_EPTF_UIHandler_init_CT(pl_selfName);
  f_EPTF_UIHandler_clearGUI();

  f_EPTF_UIHandler_addWindow();

  //Creates Layout:
  var boolean isExists;
  var Widgets vl_xul;
  f_EPTF_LoggingUITest_createHBox("EPTF_Main_hbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);

  f_EPTF_LoggingUITest_createMainWidgets("EPTF_Main_widgets",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_hbox",isExists);

  f_EPTF_LoggingUITest_createTabBox("EPTF_Main_tabbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);  

/*  alt {
    [] EPTF_guiPortIf.receive(tr_LoggingUI_ASP_XTDP_exitTTCNButtonPressed){
      log("----- Exit button had been pressed ----");
    };
  };*/
  f_EPTF_UIHandler_exitButtonPressed(60.0);
  f_EPTF_Base_stopRemote(mtc);
  log("----- Subscriber shutdown -------");
}

function f_Server_behaviour(charstring pl_selfName, 
  in EPTF_UIHandler_CT pl_subscriber,
  in charstring pl_tabboxName) runs on Server_CT {
  log("----- Subscriber START -------");
  f_EPTF_UIHandler_init_CT(pl_selfName);
  f_EPTF_UIHandler_clearGUI();

  f_EPTF_UIHandler_addWindow();

  //Creates Layout:
  var boolean isExists;
  var Widgets vl_xul;
  f_EPTF_LoggingUITest_createHBox("EPTF_Main_hbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);

  f_EPTF_LoggingUITest_createMainWidgets("EPTF_Main_widgets",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_hbox",isExists);

  f_EPTF_LoggingUITest_createTabBox("EPTF_Main_tabbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);  

  log("----- LoggingUI START -------"); 
  f_EPTF_LoggingUI_init_CT(pl_selfName, pl_subscriber,pl_tabboxName)


/*  alt {
    [] as_EPTF_UIHandler_exitButtonPressed();
  };*/
  f_EPTF_UIHandler_exitButtonPressed(60.0);
  f_EPTF_Base_stopRemote(mtc);
  log("----- Server shutdown -------");  
  f_EPTF_Base_cleanup_CT();
}

function f_Server_behaviour_NEG(charstring pl_selfName, 
  in EPTF_UIHandler_CT pl_subscriber,
  in charstring pl_tabboxName) runs on Server_CT {
  log("----- Subscriber START -------");
  f_EPTF_UIHandler_init_CT(pl_selfName);
  f_EPTF_UIHandler_clearGUI();

  f_EPTF_UIHandler_addWindow();
  
  f_EPTF_Base_setExpectedErrorMsg("*Inconsistent eventClassNames found. Event classes for this component type were already defined. Event class names are redefined on component* with compType: EPTF_SomeClient, selection: 1, eventClassNames:*")

  //Creates Layout:
  var boolean isExists;
  var Widgets vl_xul;
  f_EPTF_LoggingUITest_createHBox("EPTF_Main_hbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);

  f_EPTF_LoggingUITest_createMainWidgets("EPTF_Main_widgets",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_hbox",isExists);

  f_EPTF_LoggingUITest_createTabBox("EPTF_Main_tabbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);  

  log("----- LoggingUI START -------"); 
  f_EPTF_LoggingUI_init_CT(pl_selfName, pl_subscriber,pl_tabboxName)


/*  alt {
    [] as_EPTF_UIHandler_exitButtonPressed();
  };*/
  f_EPTF_UIHandler_exitButtonPressed(60.0);
  f_EPTF_Base_stopRemote(mtc);
  log("----- Server shutdown -------");  
  f_EPTF_Base_cleanup_CT();
}

//=========================================================================
// Testcases
//=========================================================================

testcase tc_LoggingUI_logTest() runs on MAIN_CT system SYSTEM_CT{

  f_EPTF_Base_init_CT("MainCT");
  //Handler (subscriber)
//  var EPTF_UIHandler_CT ct_subscriber := EPTF_UIHandler_CT.create;
  var Server_CT ct_subscriber := Server_CT.create;

  //Starting UIHandler
  ct_subscriber.start(f_Server_behaviour("Main", ct_subscriber,"EPTF_Main_tabbox"));
  var EPTF_LoggingUI_CT ct_loggingUI_handler  := ct_subscriber;

  // to prevent deadlock in LoggingUIServer:
  timer t_wait := 1.0;
  t_wait.start; t_wait.timeout;
  
  //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client1 := EPTF_LoggingUIClient_CT.create;
  ct_client1.start(f_EPTF_LoggingUIClient1_Behaviour("Client1",ct_loggingUI_handler, ct_subscriber));

 //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client2 := EPTF_LoggingUIClient_CT.create;
  ct_client2.start(f_EPTF_LoggingUIClient2_Behaviour("Client2",ct_loggingUI_handler, ct_subscriber)); 

 //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client3 := EPTF_LoggingUIClient_CT.create;
  ct_client3.start(f_EPTF_LoggingUIClient3_Behaviour("Client3",ct_loggingUI_handler, ct_subscriber)); 

  timer T_main := 55.0;
  T_main.start;
  alt {
    [] ct_subscriber.done {}
    [] T_main.timeout{
      f_EPTF_Base_stopAll(pass);
    }
  }
  f_EPTF_Base_cleanup_CT();
}

testcase tc_LoggingUI_eventClassRedefinitionTest_NEG() runs on MAIN_CT system SYSTEM_CT{

  f_EPTF_Base_init_CT("MainCT");
  //Handler (subscriber)
//  var EPTF_UIHandler_CT ct_subscriber := EPTF_UIHandler_CT.create;
  var Server_CT ct_subscriber := Server_CT.create;

  //Starting UIHandler
  ct_subscriber.start(f_Server_behaviour_NEG("Main", ct_subscriber,"EPTF_Main_tabbox"));
  var EPTF_LoggingUI_CT ct_loggingUI_handler  := ct_subscriber;

  // to prevent deadlock in LoggingUIServer:
  timer t_wait := 1.0;
  t_wait.start; t_wait.timeout;
  
  //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client1 := EPTF_LoggingUIClient_CT.create;
  ct_client1.start(f_EPTF_LoggingUIClient1_Behaviour("Client1",ct_loggingUI_handler, ct_subscriber));

 //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client2 := EPTF_LoggingUIClient_CT.create;
  ct_client2.start(f_EPTF_LoggingUIClient2_Behaviour("Client2",ct_loggingUI_handler, ct_subscriber)); 

 //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client3 := EPTF_LoggingUIClient_CT.create;
  ct_client3.start(f_EPTF_LoggingUIClient3_Behaviour("Client3",ct_loggingUI_handler, ct_subscriber)); 

 //LoggingUI Client with incorrect event classes
  var EPTF_LoggingUIClient_CT ct_client4 := EPTF_LoggingUIClient_CT.create;
  ct_client4.start(f_EPTF_LoggingUIClient4_Behaviour("Client4",ct_loggingUI_handler, ct_subscriber)); 

  timer T_main := 55.0;
  T_main.start;
  alt {
    [] ct_subscriber.done {}
    [] T_main.timeout{
      f_EPTF_Base_stopAll(pass);
    }
  }
  f_EPTF_Base_cleanup_CT();
}

testcase tc_LoggingUI_functionTest() runs on MAIN_CT system SYSTEM_CT{

  f_EPTF_Base_init_CT("MainCT");
  //Handler (subscriber)
  //var EPTF_UIHandler_CT ct_subscriber := EPTF_UIHandler_CT.create;
  var Server_CT ct_subscriber := Server_CT.create;

  //Starting UIHandler
  ct_subscriber.start(f_Server_behaviour("Main", ct_subscriber,"EPTF_Main_tabbox"));
  var EPTF_LoggingUI_CT ct_loggingUI_handler  := ct_subscriber;

  // to prevent deadlock in LoggingUIServer:
  timer t_wait := 0.5;
  t_wait.start; t_wait.timeout;
  
  //LoggingUI Client with HandlerClient & Starting Client
  var EPTF_LoggingUIClient_CT ct_client := EPTF_LoggingUIClient_CT.create;
  ct_client.start(f_EPTF_LoggingUIClient3_Behaviour("Client1",ct_loggingUI_handler, ct_subscriber));

  timer T_main := 55.0;
  T_main.start;
  alt {
    [] ct_subscriber.done {}
    [] T_main.timeout{
      f_EPTF_Base_stopAll(pass);
    }
  }
  f_EPTF_Base_cleanup_CT();
}


testcase tc_LoggingUI_clientNumber(in integer pl_clients) runs on MAIN_CT system SYSTEM_CT{

  f_EPTF_Base_init_CT("MainCT");
  //Handler (subscriber)
//  var EPTF_UIHandler_CT ct_subscriber := EPTF_UIHandler_CT.create;
  var Server_CT ct_subscriber := Server_CT.create;

  //Starting UIHandler
  ct_subscriber.start(f_Server_behaviour("Main", ct_subscriber,"EPTF_Main_tabbox"));
  var EPTF_LoggingUI_CT ct_loggingUI_handler  := ct_subscriber;


  // to prevent deadlock in LoggingUIServer:
  timer t_wait := 0.5;
  t_wait.start; t_wait.timeout;
  
  //LoggingUI Client with HandlerClient & Starting Client
  for (var integer i:=0; i<pl_clients; i:=i+1) {
    var EPTF_LoggingUIClient_CT ct_client := EPTF_LoggingUIClient_CT.create;
    ct_client.start(f_EPTF_LoggingUIClient1_Behaviour("Client"&int2str(i),ct_loggingUI_handler, ct_subscriber)); 
  }  

  timer T_main := 55.0;
  T_main.start;
  alt {
    [] ct_subscriber.done {}
    [] T_main.timeout{
      f_EPTF_Base_stopAll(pass);
    }
  }
  f_EPTF_Base_cleanup_CT();
}

testcase tc_LoggingUI_cleanUp_CT() runs on Server_CT
{
  f_EPTF_UIHandler_init_CT("Main");
  f_EPTF_UIHandler_clearGUI();
  f_EPTF_UIHandler_addWindow();

  //Creates Layout:
  log("----- Layout creation -------");
  var boolean isExists;
  var Widgets vl_xul;
  f_EPTF_LoggingUITest_createHBox("EPTF_Main_hbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);
  f_EPTF_LoggingUITest_createMainWidgets("EPTF_Main_widgets",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_hbox",isExists);
  f_EPTF_LoggingUITest_createTabBox("EPTF_Main_tabbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);  

  log("----- LoggingUI START -------"); 
  f_EPTF_LoggingUI_init_CT("Main", self ,"EPTF_Main_tabbox")
  f_EPTF_UIHandler_exitButtonPressed(3.0);
  log("----- CleanUp -------");
  f_EPTF_Base_cleanup_CT();

  log("----- Check hashmap -------");
  var integer vl_id := 0;
  if (f_EPTF_str2int_HashMap_GetID(c_EPTF_LoggingUI_typesLookupTable_HashName, vl_id) == false) {
    setverdict(pass);
  } else {
    log(%definitionId,": error: c_EPTF_LoggingUI_typesLookupTable Hashmap was not cleaned up, id: ", vl_id);
    setverdict(fail);
  }

  log("----- Layout creation again -------");
  f_EPTF_UIHandler_init_CT("Main");
  f_EPTF_UIHandler_clearGUI();
  f_EPTF_UIHandler_addWindow();
  f_EPTF_LoggingUITest_createHBox("EPTF_Main_hbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);
  f_EPTF_LoggingUITest_createMainWidgets("EPTF_Main_widgets",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_hbox",isExists);
  f_EPTF_LoggingUITest_createTabBox("EPTF_Main_tabbox",vl_xul);
  f_EPTF_UIHandler_XSD_addElementToGui(vl_xul, "EPTF_Main_Window",isExists);  

  log("----- LoggingUI START again-------");
  f_EPTF_LoggingUI_init_CT("Main", self, "EPTF_Main_tabbox")
  log("----- CleanUp again-------");
  f_EPTF_Base_cleanup_CT();  

}

//=========================================================================
// Control
//=========================================================================

control
{
  execute(tc_LoggingUI_logTest());
  execute(tc_LoggingUI_eventClassRedefinitionTest_NEG())
  execute(tc_LoggingUI_functionTest());
  execute(tc_LoggingUI_clientNumber(10));
  execute(tc_LoggingUI_clientNumber(100));
  execute(tc_LoggingUI_cleanUp_CT());
}

}  // end of module
