################################################################################
# TSL-LIBRARY: EMOS_STD_misc_lib
################################################################################
# Copyright (C) 2000 EMOS Computer Consulting GmbH
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# For further information please contact:
#
# Dean Rajovic
# EMOS Computer Consulting GmbH
# Oskar-Messter-Straße 25
# 85737 Ismaning
# Germany
# tel.: +49 89 608 765-0
# mailto:drajovic@emos.de
# http://www.emos.de
################################################################################
# $Revision: 1.1.1.1 $
# $Author: drajovic $
# $Date: 2004/03/24 20:14:03 $
# $Archive: /MERCURY/TSL_PROJECTS/EMOS_GPL/STD/emos_std_misc_lib/script $
# $NoKeywords: $
################################################################################
#/***
#* Contains some general-purpose miscellaneous function that do not seem to
#* fit nicely into any other EMOS library.
#*<p> PUBLIC CONSTANTS:
#*<ul>
#* <li> ARRSEP</li>
#*</ul>
#*/
static debug = TRUE;
#/**
#* Turns debug mode on/off.
#* @param mode (in) TRUE = turn debug on, else turn debug off
#*/
public function set_debug( in mode )
{
if ( mode == TRUE )
debug = TRUE;
else
debug = FALSE;
}
#/**
#* Returns the debug mode.
#* @return
#* TRUE = debug mode on
#* FALSE = debug mode off
#*/
public function is_debug( )
{
return debug;
}
#/**
#* In debug-mode produces a "report_msg" formated as "DEBUG: <code>msg</code>".
#* Otherwise just returns (no message produced).
#* @param msg (in) message to be reported in debug mode
#*/
public function debug_msg( in msg )
{
auto txt;
if ( !debug )
return;
txt = "DEBUG: " & msg;
report_msg( txt );
}
#/**
#* In debug-mode produces a "report_msg" formated as "DEBUG: <code>msg</code>" if debug level >= 2.
#* Otherwise just returns (no message produced).
#* @param msg (in) message to be reported in debug mode
#*/
public function debug_msg2( in msg )
{
auto txt;
if ( debug < 2 )
return;
txt = "DEBUG: " & msg;
report_msg( txt );
}
#/**
#* Defines the level for loggin call chains. Default=2 --> log short & full calls
#*/
static log_call_level = 2;
#/**
#* Defines the level for logging call chains.
#* @param level (in)
#* 0 = no call logging;
#* 1 = log only full chains (in case of error);
#* 2 = log full chains and short chains (in case of E_OK)
#*/
public function set_log_call_level ( in level )
{
log_call_level = level;
}
#/**
#* Returns the level for logging call chains.
#*/
public function get_log_call_level()
{
return log_call_level;
}
#/**
#* Wrapper around GUI_load(). It makes sure that the <code>gui</code> is unloaded first
#* before the load is attempted (avoids a message). Additionally it produces
#* a tl_step() message documenting the outcome of invoked GUI_load() function.
#* @param gui (in) filename/path of a GUI-map to be loaded
#* @return
#* E_OK: operation successfull
#* otherwise: see return values for GUI_load()
#*/
public function load_GUI ( in gui )
{
auto rc, msg;
GUI_unload( gui );
rc = GUI_load( gui );
msg = sprintf( "%s [rc=%s]", gui, rc);
tl_step( "GUI-Map laden", rc, msg );
return rc;
}
#/**
#* Converts a string "Y"/"Yes" or German equivalent "J"/"Ja"
#* (case-insensitive!) to boolean.
#* This function is particularly useful when reading user input (either
#* interactivelly or from data-tables).
#*<p> NOTE!
#* Blanks are trimmed from both sides of <str> before comparison.
#* @param str (in) string to be evaluated
#* @return
#* TRUE: string resambles to "y","yes","j" or "ja"
#* FALSE: string resambles to anything else
#*/
public function yes ( in str )
{
return Ja( str );
}
#/**
#* Converts a string "Y"/"Yes" or German equivalent "J"/"Ja"
#* (case-insensitive!) to boolean.
#* This function is particularly useful when reading user input (either
#* interactivelly or from data-tables).
#*<p> NOTE!
#* Blanks are trimmed from both sides of <str> before comparison.
#* @param str (in) string to be evaluated
#* @return
#* TRUE: string resambles to "y","yes","j" or "ja"
#* FALSE: string resambles to anything else
#*/
public function Ja ( in str )
{
switch ( tolower( strip_both( str ) ) )
{
case "j":
case "ja":
case "y":
case "yes":
return TRUE;
default:
return FALSE;
}
# return compare_text( jaNein, "ja", "JA", "ja" );
}
#/**
#* Mercury has managed again to confuse "timeout" amd "timeout_msec".
#* In version 7.00 and 7.01 "timeout_msec" did not work properly.
#* As of Version 7.5 "timeout" does not work any more.
#* The following three variables are used to determine what behavior is currently
#* active on your machine in order to apply the correct logic.
#*/
static const def_timeout = getvar("timeout_msec" );
static const tmp_timeout = setvar("timeout", 1 );
static const is_timeout_ok = getvar("timeout");
static const restore_timeout = setvar("timeout_msec", def_timeout);
#/**
#* Stores the current timeout value which is used in restore_timeout().
#*/
static timeout = getvar( is_timeout_ok ? "timeout" : "timeout_msec" );
#/**
#* Wrapper around setvar("timeout"). It saves the current timeout before
#* setting it to the new value.
#* @param time (in) timeout (in seconds) to be set
#*/
public function set_timeout( in time )
{
#printf( "set_timeout(%s)", time );
#printf( "\tbefore=%s", getvar( is_timeout_ok ? "timeout" : "timeout_msec" ) );
timeout = getvar( is_timeout_ok ? "timeout" : "timeout_msec" );
setvar( is_timeout_ok ? "timeout" : "timeout_msec", is_timeout_ok ? time : time*1000 );
#printf( "\t after=%s", getvar( is_timeout_ok ? "timeout" : "timeout_msec" ) );
}
#/**
#* Restores the timeout that has been overriden by the last invocation of the
#* set_timeout() function.
#*/
public function restore_timeout( )
{
#printf( "restore_timeout()" );
#printf( "\tbefore=%s", getvar( is_timeout_ok ? "timeout" : "timeout_msec" ) );
setvar( is_timeout_ok ? "timeout" : "timeout_msec", timeout );
#printf( "\t after=%s", getvar( is_timeout_ok ? "timeout" : "timeout_msec" ) );
}
#/**
#* WR has a nice bug with in-operator operating on multi-dimensional
#* arrays. For example <code>for ( i in arr )</code> returns different
#* occasionally returns different separators (mostly pipe | but simetimes
#* something else that appears as bold pipe)
#* With this function we determine the separator dynamically as it seems
#* to stay constant during the single WR invocation.
#*/
static function get_arrsep ()
{
auto arr[], i;
arr[0,0] = 0;
for ( i in arr ) return substr( i, 2, 1 );
}
public const ARRSEP = get_arrsep();
static lastrc=0;
#/**
#* returns !0 if rc == E_OK
#*/
public function pass( in rc )
{
lastrc=rc;
return rc==E_OK;
}
#/**
# returns !0 if rc != E_OK
#*/
public function fail( in rc )
{
lastrc=rc;
return rc!=E_OK;
}
#/**
#* what was the last error
#*/
public function getLastRc()
{
return lastrc;
}
#----------------------------
static pathIdx;
static pathArr[];
#/**
#* Remembers all inquired paths for quicker access.
#*/
static pathCache[];
static function addPath ( in path )
{
if( path != "" )
pathArr[pathIdx++] = path;
}
static function extractPath ( in searchPath )
{
auto start, end;
extern RSTART, RLENGTH;
if( start = match( searchPath, "<.*>" ) )
{
end = RLENGTH;
addPath( substr( searchPath, start+1, end-2 ) );
extractPath( substr( searchPath, 1, start-1 ) );
extractPath( substr( searchPath, start+end ) );
}
else if( start = match( searchPath, "\".*\"" ) )
{
end = RLENGTH;
addPath( substr( searchPath, start+1, end-2 ) );
extractPath( substr( searchPath, 1, start-1 ) );
extractPath( substr( searchPath, start+end ) );
}
else if( end = index( searchPath, " " ) )
{
addPath( substr( searchPath, 1, end-1 ) );
extractPath( substr( searchPath, end+1 ) );
}
else
{
addPath( searchPath );
}
}
#/**
#* Returns true if specified test refers to a WinRunner compiled module
#* @param test (in) name of the test
#* @return true if test is the compiled module otherwise false
#*/
public function splitSearchPath ( out outArr[] )
{
auto path = getvar("searchpath");
auto i;
pathIdx = 0;
for( i in pathArr ) delete pathArr[i];
extractPath( path );
for( i in pathArr ) outArr[i] = pathArr[i];
}
# static function test_splitSearchPath ( in path )
# {
# auto i;
# pathIdx = 0;
# for( i in pathArr ) delete pathArr[i];
# extractPath( path );
# for( i in pathArr ) print pathArr[i];
# }
# test_splitSearchPath( "" );
# test_splitSearchPath( "a" );
# test_splitSearchPath( "a b c" );
# test_splitSearchPath( "<a>" );
# test_splitSearchPath( "<a><b><c>" );
# test_splitSearchPath( "<a> <b> <c>" );
# test_splitSearchPath( "a<b>c" );
# test_splitSearchPath( "a \"b b b\" <c>" );
# test_splitSearchPath( "[TD]a b <[TD]c>" );
#/**
#* Returns true if the given test name refers to a compiled module otherwise
#* false is returned. Search path is taken into account.
#* @param test (in) name of the test
#* @return true if the given test name refers to a compiled module otherwise
#* false
#*/
public function isCompiledModule( in test )
{
auto pathArr[];
auto i;
auto rc;
auto line;
auto hdrFile;
if ( test in pathCache )
return pathCache[test];
splitSearchPath( pathArr );
for( i in pathArr )
{
hdrFile = join_path( pathArr[i], test, "\\" ) & "\\header";
rc = file_open( hdrFile, FO_MODE_READ );
if ( rc == E_OK )
{
while( file_getline( hdrFile, line ) == E_OK )
{
if ( match( line, "TYPE=CM" ) )
{
file_close( hdrFile );
pathCache[test] = TRUE;
return TRUE;
}
}
file_close( hdrFile );
}
}
pathCache[test] = FALSE;
return FALSE;
}
#/**
#* Creates a new file.
#* @param dir directory name or full path name (second parameter must be empty)
#* @param name filename (if empty, fullpath assumed in first parameter)
#* @return E_OK success, else failire
#*/
public function create_file( in dir, in name )
{
auto rc;
auto file;
if ( nargs() > 1 )
file = join_path( dir, name, "\\" );
else
file = dir;
rc = file_open( file, FO_MODE_WRITE );
file_close( file );
return rc;
}
################################################################################
# TSL-LIBRARY: EMOS_STD_misc_lib
################################################################################