///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_GUIViewer_Test_Testcases
// 
//  Purpose:
//    This module contains functions to GUIViewer feature.
// 
//  Module Parameters:
//    -
// 
//  Module depends on:
//    <EPTF_CLL_GUIViewer_Function> 
//    <EPTF_CLL_UIHandler_WidgetFunctions>
//    <EPTF_CLL_Base_Functions>
// 
//  Current Owner:
//    EMIHMIK
// 
//  Last Review Date:
//    2012-xx-xx
//
//  Detailed Comments:
//    -
//
///////////////////////////////////////////////////////////////
module EPTF_GUIViewer_Test_Testcases {

import from EPTF_CLL_GUIViewer_Functions all;
import from EPTF_CLL_UIHandler_WidgetFunctions all;
import from EPTF_CLL_Base_Functions all;
import from ttcn_ericsson_se_protocolModules_xtdp_xtdl all;

testcase tc_EPTF_GUIViewer_Test() runs on EPTF_GUIViewer_CT {
  f_EPTF_GUIViewer_behaviour("GUIViewer");
  var charstring vl_layout := f_EPTF_UIHandler_snapshot();
  
  var template Widgets vl_xul := { 
    window := {
      about := "",
      height := 300.0,
      help := "",
      id := "Window",
      orientation := vertical, 
      title := "window",
      width := 800.0,
      image_list := {},
      embeddedwidgets := {
        {
          { hbox := {
            customclass := omit,
            disabled := omit,
            disabledongui := *,
            fixedposition := omit,
            flex := 1.000000,
            id := "UIHandler_widgetId_0",
            orientation := horizontal,
            scrollable := omit,
            embeddedwidgets := {
              embeddedwidget_list := {
            { tabpages := {
                customclass := omit,
                disabled := *, 
                disabledongui := *,
                flex := 1.000000, 
                id := "EPTF_ExecCtrl.Statistics.tabbox", 
                layout := lISTCARD,
                tabpagegroups := { 
                  tabpagegroup_list := {
                    {
                      tabpage := {
                        omit, omit, "EPTF_ExecCtrl.Statistics.EG.a.tab", "a", omit, vertical, omit, {
                          {
                            {
                              textbox := {
                                customclass := omit,
                                disabled := *,
                                disabledongui := *,
                                flex := *,
                                focusafterchange := *,
                                id := "EPTF_ExecCtrl.Statistics.EG.a.eCount",
                                multiline := *,
                                readonly := true,
                                rows := omit,
                                tooltiptext := omit,
                                value_ := ?,
                                widgetType := omit,
                                wrap := omit,
                                externaldata := *
                              }
                            } 
                          }
                        }
                      }
                    },
                    {
                      tabpage := {
                        omit, omit, "EPTF_ExecCtrl.Statistics.EG.b.tab", "b", omit, vertical, omit,{
                          {
                            {
                              textbox := {
                                customclass := omit,
                                disabled := *,
                                disabledongui := *,
                                flex := *,
                                focusafterchange := *,
                                id := "EPTF_ExecCtrl.Statistics.EG.b.eCount",
                                multiline := *,
                                readonly := true,
                                rows := omit,
                                tooltiptext := omit,
                                value_ := ?,
                                widgetType := omit,
                                wrap := omit,
                                externaldata := *
                              }
                            } 
                          }
                        }
                      }
                    },
                    {
                      tabpage := {
                        omit, omit, "EPTF_ExecCtrl.Statistics.EG.c.tab", "c", omit, vertical, omit, {
                          {
                            {
                              textbox := {
                                customclass := omit,
                                disabled := *,
                                disabledongui := *,
                                flex := *,
                                focusafterchange := *,
                                id := "EPTF_ExecCtrl.Statistics.EG.c.eCount",
                                multiline := *,
                                readonly := true,
                                rows := omit,
                                tooltiptext := omit,
                                value_ := ?,
                                widgetType := omit,
                                wrap := omit,
                                externaldata := *
                              }
                            } 
                          }
                        }
                      }
                    },
                    
                    {
                      tabpage := {
                        omit, omit, "EPTF_ExecCtrl.Statistics.EG.d.tab", "d", omit, vertical, omit, {
                          {
                            { 
                              textbox := {
                                customclass := omit,
                                disabled := *,
                                disabledongui := *,
                                flex := *,
                                focusafterchange := *,
                                id := "EPTF_ExecCtrl.Statistics.EG.d.eCount",
                                multiline := *,
                                readonly := true,
                                rows := omit,
                                tooltiptext := omit,
                                value_ := ?,
                                widgetType := omit,
                                wrap := omit,
                                externaldata := *
                              }
                            }
                          }
                        }
                      }
                    }
                    
                  }
                } 
              }//tabpages
            }
              }
            }
          }//hbox
          }
          }
      }
    }
  };//xul
  
  
  if(not match(f_EPTF_UIHandler_XSD_decodeXUL(vl_layout), vl_xul)){
    setverdict(fail, match(f_EPTF_UIHandler_XSD_decodeXUL(vl_layout), vl_xul));
  }else {
    setverdict(pass);
  } 
  f_EPTF_Base_cleanup_CT();
}

//=========================================================================
// Control
//=========================================================================
control {
  execute(tc_EPTF_GUIViewer_Test());
}

} //module EPTF_CLL_GUIViewer_Functions


