################################################################################
# TSL-LIBRARY: EMOS_STD_err_lib
################################################################################
# Copyright (C) 2003 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.2 $
# $Author: drajovic $
# $Date: 2004/11/07 22:26:27 $
# $Source: C:/Archive/FRAMEWORK/EMOS_GPL/STD/emos_std_err_lib/script,v $
# $NoKeywords: $
################################################################################
#/***
#* This library implements an interface to descriptions of WinRunner errors.
#* All information about error codes ant the corresponding descriptions are
#* maintained in Excel table "default.xls". To keep this library up to date
#* some manual work is necessary. Our approach is two-fold:
#* <ul>
#* <li>The "official" codes are collected from WinRunner on-line help
#* as this seems to be the only place where Mercury keeps the up-to-date
#* information. This codes are listed in Excel sheet named "documented codes".
#* </li>
#* <li>The list of additional (undocumented) codes is produced by searching
#* the WinRunner "lib" directory and merging the codes that we found into
#* the official list. The merged list is kept in worksheet "all codes".
#* </li>
#* </ul>
#* By default "all codes" are activated. However you may change this by
#* setting the other sheet as default (note that the file is read-only).
#* <h4>Language support</h4>
#* Note that this library supports two languages so far: English and German.
#* We use codes "EN" and "DE" respectively. We have decided to keep our own
#* list of language codes (see err_get_supproted_languages()) because we cannot
#* rely on WinRunner's undocumented features such as get_lang() function
#* (which returns "DEU" for German and God knows what for other environments).
#* <p>You are welcome to add additional languages. Please inform us about this
#* so we can merge your language into our distribution.
#* <h4>Typical usage</h4>
#* This library is automatically loaded with EMOS Framework. By default english
#* texts are loaded. You would normally change this setting in your startup test, e.g.
#* <pre>
#* err_set_language( "DE" );
#* </pre>
#* To print formatted error descriptions you could do following in your code:
#* <pre>
#* rc = set_window( "some non-existing window" );
#* if ( rc != E_OK )
#* {
#* print( err_perror( rc ) );
#* tl_step( "Argh!", FAIL, "Have enough for today." );
#* treturn rc;
#* }
#* </pre>
#* <h4>Acknowledgements</h4>
#* We would especially like to thank Michael Skobowsky from DAT
#* (mailto:Michael.Skobowsky@dat.de) for his German translation and for
#* all his enthusiastic support and ideas.
#*/
static errCodeArr[];
static errDescArr[];
static langArr[] = { "EN", "DE" };
static defLang = "EN";
#/**
#* Initialises the internal data structures from external table "default.xls".
#* @return E_OK if initialisation OK, otherwise failure.
#*/
static function err_init()
{
auto table = "default.xls";
auto errNr, errCode, errDesc;
auto lang, i;
auto rc;
rc = ddt_open(table, DDT_MODE_READ);
if (rc!= E_OK && rc != E_FILE_OPEN)
{
debug_msg( "Cannot open table with error descriptions." );
debug_msg( "Not critical error. No error descriptions available." );
return rc;
}
while( rc == E_OK )
{
errNr = ddt_val(table, "ErrorNr");
errCode = ddt_val(table, "ErrorCode");
errCodeArr[ errNr ] = errCode;
for( i in langArr )
{
lang = langArr[i];
errDesc = ddt_val(table, "ErrorDesc_" & lang);
errDescArr[errNr, lang] = errDesc;
}
rc = ddt_next_row(table);
}
ddt_close(table);
return E_OK;
}
#/**
#* Returns the comma-separated list of the supported languages for
#* error descriptions.
#*/
public function err_get_supproted_languages()
{
auto i, msg;
for ( i in langArr )
msg = msg & langArr[i] & ",";
return substr( msg, 1, (length( msg ) - 1) );
}
#/**
#* Sets the default language to the given <code>lang</code> code.
#* This function returns the code of the new default language.
#* If invalid language code is given, no change is made and the old
#* default code is returned. The available language codes are returned
#* via err_get_supported_languages().
#* @param lang language code
#*/
public function err_set_language( in lang )
{
auto i;
for ( i in langArr )
if ( lang == langArr[i] )
defLang = lang;
return defLang;
}
#/**
#* Returns the code of the default language.
#*/
public function err_get_language()
{
return defLang;
}
#/**
#* Returns <code>TRUE</code> if given <code>errNr</code> is a known error code.
#* Otherwise <code>FALSE</code> is returned.
#* @param errNr error number
#*/
public function err_is_error( in errNr )
{
if ( errNr in errCodeArr )
return TRUE;
return FALSE;
}
#/**
#* Returns the error description for the given error number and the langauge code.
#* If no language code was given, the default language is taken.
#* For non-existing error numbers an empty string is returned.
#* @param errNr error number
#*/
public function err_get_error_desc( in errNr, in lang )
{
# auto lang;
if ( !err_is_error( errNr ) )
return "";
if ( nargs() < 2 )
lang = err_get_language();
else if ( lang in langArr )
defLang = lang;
else
lang = err_get_language();
return errDescArr[errNr, lang];
}
#/**
#* Returns the error code as text for the given error number, e.g. "E_GENERAL_ERROR".
#* For non-existing error numbers an empty string is returned.
#* @param errNr error number
#*/
public function err_get_error_code( in errNr )
{
if ( !err_is_error( errNr ) )
return "";
return errCodeArr[errNr];
}
#/**
#* Returns formatted error message, e.g. "[-10001] General error occurred. (E_GENERAL_ERROR)".
#* The message is also printed out via debug_msg().
#* <p>NOTE: This function only supports the default language.
#* @param errNr error number
#*/
public function err_perror( in errNr )
{
auto msg;
if ( nargs() < 1 )
return "";
msg = sprintf( "[%s] %s (%s)",
errNr,
err_get_error_desc( errNr ),
err_get_error_code( errNr ) );
debug_msg( msg );
return msg;
}
#/**
#* Triggers automatic initialisatation at the time when library is loaded.
#* Also reports the status of the initialisation.
#*/
public const STD_ERR_INIT = err_init();
#-------------------------------------------------------------------------
# static function assert_equal( in expr1, in expr2 )
# {
# auto fmt = "%s: '%s' : '%s'";
#
# if ( expr1 == expr2 )
# {
# printf( fmt, "OK", expr1, expr2 );
# return TRUE;
# }
# else
# {
# printf( fmt, "ERR", expr1, expr2 );
# return FALSE;
# }
# }
#
# static function unit_test()
# {
# assert_equal( err_get_supproted_languages(), "EN" );
# assert_equal( err_set_language(), "EN" );
# assert_equal( err_set_language("xxx"), "EN" );
# assert_equal( err_set_language("EN"), "EN" );
# assert_equal( err_get_language(), "EN" );
# assert_equal( err_is_error(), FALSE );
# assert_equal( err_is_error( -123 ), FALSE );
# assert_equal( err_is_error( -10001 ), TRUE );
# assert_equal( err_get_error_desc(), "" );
# assert_equal( err_get_error_desc( 123 ), "" );
# assert_equal( err_get_error_desc( E_ILLEGAL_PARAMETER ), "Specified value for one or more parameters is invalid." );
# assert_equal( err_get_error_desc( E_ILLEGAL_PARAMETER, "EN" ), "Specified value for one or more parameters is invalid." );
# assert_equal( err_get_error_desc( E_ILLEGAL_PARAMETER, "xxx" ), "Specified value for one or more parameters is invalid." );
# }
#
# public function run_unit_test()
# {
# unit_test();
# }