/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*----------------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*----------------------------------------------------------------------------*/
#include "ProToolkit.h"
#include "ProMenu.h"
#include "ProUtil.h"
/*----------------------------------------------------------------------------*\
Pro/DEVELOP includes
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
C System includes
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
Application includes
\*----------------------------------------------------------------------------*/
#include <TestError.h>
#include <TestMenu.h>
#include <UtilMessage.h>
#include <PTApplsUnicodeUtils.h>
/*----------------------------------------------------------------------------*\
Application macros
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
Application data types
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
Application global/external data
\*----------------------------------------------------------------------------*/
static int menuTestMode = TRUE;
static wchar_t **strings;
static wchar_t **help;
/*============================================================================*\
Function : ProTestMenus
Purpose : Create a menu to test Menu functions
\*============================================================================*/
int ProTestMenus(void *a, int b)
{
int menu_id;
ProError status;
int result;
int action;
int i;
char tmp_str[80];
ProBoolean value;
FILE *fp = NULL;
int ProTestMenuGenaction(FILE*, void*, void*, void*, void*, int*);
if((fp = PTApplsUnicodeFopen ("test_menus.txt", "a")) == NULL)
return -1;
ProUtilMsgPrint("gen", "TEST %0s", "ProTestMenus: enter");
/*----------------------------------------------------------------------------*\
Test initialization
\*----------------------------------------------------------------------------*/
strings = (wchar_t**)calloc(PRO_TEST_NUM_STRINGS+1, sizeof(wchar_t *));
help = (wchar_t**)calloc(PRO_TEST_NUM_STRINGS+1, sizeof(wchar_t *));
for( i = 0; i < PRO_TEST_NUM_STRINGS; i++ )
{
strings[i] = (wchar_t*)calloc(80, sizeof(wchar_t));
help[i] = (wchar_t*)calloc(80, sizeof(wchar_t));
ProTKSprintf(tmp_str, "Button%d", i);
ProStringToWstring(strings[i], tmp_str);
ProTKSprintf(tmp_str, "Select Button%d", i);
ProStringToWstring(help[i], tmp_str);
}
strings[i] = (wchar_t*)calloc(80, sizeof(wchar_t));
help[i] = (wchar_t*)calloc(80, sizeof(wchar_t));
/*----------------------------------------------------------------------------*\
Setup the main menu for testing
\*----------------------------------------------------------------------------*/
status = ProMenuFileRegister((char*)"TkMenu", (char*)"tkmenu.mnu", &menu_id);
TEST_CALL_REPORT("ProMenuFileRegister()", "ProTestMenu()", status,
status != PRO_TK_NO_ERROR);
status = ProMenubuttonLocationSet((char*)"TkMenu", (char*)"Done", -1);
TEST_CALL_REPORT("ProMenubuttonLocationSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkMenu", (char*)"StringsSelect",
(ProMenubuttonAction)ProTestMenuAction, fp, PRO_TEST_MENU_STRINGS);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkMenu", (char*)"Activate",
(ProMenubuttonAction)ProTestMenuAction, fp, PRO_TEST_MENU_ACTIVATE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkMenu", (char*)"Deactivate",
(ProMenubuttonAction)ProTestMenuAction, fp, PRO_TEST_MENU_DEACTIVATE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
action = PRO_TEST_MENU_DONE;
status = ProMenubuttonGenactionSet((char*)"TkMenu", (char*)"Done",
(ProMenubuttonGenaction)ProTestMenuGenaction, fp, NULL, NULL,
NULL, NULL, &action);
TEST_CALL_REPORT("ProMenubuttonGenactionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkMenu", (char*)"TkMenu",
(ProMenubuttonAction) ProMenuHold, NULL, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
/*----------------------------------------------------------------------------*\
Setup pre- and post- actions for the done button
\*----------------------------------------------------------------------------*/
status = ProMenubuttonPreactionSet((char*)"TkMenu", (char*)"Done",
(ProMenubuttonAction)ProTestMenuPremode, fp, 0);
TEST_CALL_REPORT("ProMenubuttonPreactionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonPostactionSet((char*)"TkMenu", (char*)"Done",
(ProMenubuttonAction)ProTestMenuPostmode, fp, 0);
TEST_CALL_REPORT("ProMenubuttonPostactionSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
/*----------------------------------------------------------------------------*\
Display and Process the main testing menu
\*----------------------------------------------------------------------------*/
if( !menuTestMode )
{
status = ProMenuDatamodeSet((char*)"TkMenu", PRO_B_TRUE);
TEST_CALL_REPORT("ProMenuDatamodeSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonDelete((char*)"TkMenu", (char*)"Deactivate", &result);
TEST_CALL_REPORT("ProMenubuttonDelete()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonVisibilitySet((char*)"TkMenu", (char*)"Activate", PRO_B_FALSE);
TEST_CALL_REPORT("ProMenubuttonVisibilitySet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuCreate(PROMENUTYPE_MAIN, (char*)"TkMenu", &menu_id);
TEST_CALL_REPORT("ProMenuCreate()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
}
else
{
status = ProMenuModeSet((char*)"TkMenu", PROMENUMODE_OPERATIONAL);
TEST_CALL_REPORT("ProMenuModeSet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuPush();
TEST_CALL_REPORT("ProMenuPush()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuCreate(PROMENUTYPE_MAIN, (char*)"TkMenu", &menu_id);
TEST_CALL_REPORT("ProMenuCreate()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonHighlight((char*)"TkMenu", (char*)"StringsSelect");
TEST_CALL_REPORT("ProMenubuttonHighlight()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonDeactivate((char*)"TkMenu", (char*)"Deactivate");
TEST_CALL_REPORT("ProMenubuttonDeactivate()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
}
status = ProMenuProcess((char*)"TkMenu", &action);
TEST_CALL_REPORT("ProMenuProcess()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR && status != PRO_TK_E_FOUND);
status = ProMenuVisibilityGet((char*)"TkMain", &value);
TEST_CALL_REPORT("ProMenuVisibilityGet()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR && status != PRO_TK_E_FOUND);
if (value == PRO_B_FALSE)
{
status = ProMenuPop();
TEST_CALL_REPORT("ProMenuPop()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
}
fclose(fp);
return(0);
}
/*============================================================================*\
Function : ProTestMenuPreMode
Purpose : Function used for testing ProMenubuttonPreactionSet()
\*============================================================================*/
int ProTestMenuPremode(FILE *fp, int b)
{
ProError status;
ProTKFprintf(fp, "PreAction called\n");
TEST_CALL_REPORT("ProMenubuttonAction()", "ProTestMenuPremode()", PRO_TK_NO_ERROR, 0);
if( menuTestMode )
{
ProUtilMsgPrint("gen", "TEST %0s",
"Cannot currently leave menu test mode!");
status = ProMenuCommandPush((char*)"StringsSelect");
TEST_CALL_REPORT("ProMenuCommandPush()", "ProTestMenu()",
status, status != PRO_TK_NO_ERROR);
return(1);
}
return(0);
}
/*============================================================================*\
Function : ProTestMenuPostMode
Purpose : Function used for testing ProMenubuttonPostactionSet()
\*============================================================================*/
int ProTestMenuPostmode(FILE *fp, int b)
{
TEST_CALL_REPORT("ProMenubuttonAction()", "ProTestMenuPostmode()", PRO_TK_NO_ERROR, 0);
ProTKFprintf(fp, "PostAction called\n");
ProUtilMsgPrint("gen", "TEST %0s", "Menu testing complete!");
return(0);
}
/*============================================================================*\
Function : ProTestMenuAction
Purpose : Available actions for menu picks
\*============================================================================*/
int ProTestMenuAction(FILE *fp, int choice)
{
ProError status;
int n_selected;
wchar_t **selected;
wchar_t title[20];
char mess[100], button[20];
int i;
static int exit_number=-1;
TEST_CALL_REPORT("ProMenubuttonAction()", "ProTestMenuAction()", PRO_TK_NO_ERROR, 0);
switch(choice)
{
case PRO_TEST_MENU_DONE:
exit_number++;
switch (exit_number%3)
{
case 0:
ProUtilMsgPrint("gen", "TEST %0s", "Can not leave menu now."
" Press once more.");
status = ProMenuHold();
TEST_CALL_REPORT("ProMenuHold()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
break;
case 1:
status = ProMenuDeleteWithStatus(choice);
TEST_CALL_REPORT("ProMenuDeleteWithStatus()",
"ProTestMenuAction()", status, status != PRO_TK_NO_ERROR);
break;
case 2:
status = ProMenuDelete();
TEST_CALL_REPORT("ProMenuDelete()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
break;
}
break;
case PRO_TEST_MENU_ACTIVATE:
status = ProMenubuttonDeactivate((char*)"TkMenu", (char*)"Activate");
TEST_CALL_REPORT("ProMenubuttonDeactivate()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActivate((char*)"TkMenu", (char*)"Deactivate");
TEST_CALL_REPORT("ProMenubuttonActivate()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_MENU_DEACTIVATE:
status = ProMenubuttonActivate((char*)"TkMenu", (char*)"Activate");
TEST_CALL_REPORT("ProMenubuttonActivate()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonDeactivate((char*)"TkMenu", (char*)"Deactivate");
TEST_CALL_REPORT("ProMenubuttonDeactivate()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
break;
case PRO_TEST_MENU_STRINGS:
status = ProMenubuttonUnhighlight((char*)"TkMenu", (char*)"StringsSelect");
TEST_CALL_REPORT("ProMenubuttonUnhighlight()",
"ProTestMenuAction()", status, status != PRO_TK_NO_ERROR);
ProStringToWstring(title, (char*)"Strings");
status = ProMenuStringsSelect(title, strings, 1, help, &selected,
&n_selected);
TEST_CALL_REPORT("ProMenuStringsSelect()", "ProTestMenuAction()",
status, status != PRO_TK_NO_ERROR);
for( i = 0; i < n_selected; i++ )
{
ProWstringToString(button, selected[i]);
ProTKSprintf(mess, "%s was selected", button);
ProTKFprintf(fp, "%s\n", mess);
ProUtilMsgPrint("gen", "TEST %0s", mess);
}
break;
default:
break;
}
menuTestMode = PRO_B_FALSE;
return(0);
}
/*============================================================================*\
Function : ProTestMenuGenaction
Purpose : Available actions for menu picks
\*============================================================================*/
int ProTestMenuGenaction(FILE *fp, void *b, void *c, void *d, void *e, int *f)
{
TEST_CALL_REPORT("ProMenubuttonGenaction()",
"ProTestMenuGenaction()", PRO_TK_NO_ERROR, 0);
ProTestMenuAction(fp, *f);
return (0);
}
/*============================================================================*\
Function : ProTestMacro
Purpose : Run macro entered by user
\*============================================================================*/
int ProTestMacro( void* p_dummy, int int_dummy )
{
#ifndef PT_PRODUCTS_BUILD
ProError status;
ProMacro w_macro;
ProMacro w_default_macro;
char default_macro[] = "#MODE;#PART;#LIST;";
char buffer[ PRO_LINE_SIZE ];
ProStringToWstring( w_default_macro, default_macro );
ProTKSprintf( buffer, "Enter macro keys [%s]: ", default_macro );
ProUtilMsgPrint( "gen", "TEST %0s", buffer );
if( !ProUtilStringGet( w_macro, w_default_macro, PRO_MACRO_SIZE ) )
return -1;
status = ProMacroLoad( w_macro );
TEST_CALL_REPORT( "ProMacroLoad()", "ProTestMacro()",
status, status != PRO_TK_NO_ERROR );
#endif
return 0;
}