campo-sirio/cb5/t4expr.c

695 lines
14 KiB
C
Raw Normal View History

/* t4expr.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved.
Tests Code Base Expression Evaluation Routines.
*/
#include "d4all.h"
#ifdef __TURBOC__
#pragma hdrstop
#endif
#include "t4test.h"
static FIELD4INFO testfields[] =
{
/* name, type, len_field, dec */
{"N1", 'F', 5, 2, },
{"N2", 'N', 10, 0, },
{"N3", 'N', 8, 3, },
{"N4", 'N', 19, 10, },
{"C1", 'C', 10, 0, },
{"C2", 'C', 10, 0, },
{"C3", 'C', 10, 0, },
{"C4", 'C', 15, 0, },
{"C5", 'C', 15, 0, },
{"C6", 'C', 5, 0, },
{"D1", 'D', 8, 0, },
{"D2", 'D', 8, 0, },
{"L1", 'L', 1, 0, },
{"L2", 'L', 1, 0, },
{0,0,0,0,}
};
typedef struct test_expr_st
{
char expr[30] ;
char result[50] ;
char result_type ;
} TEST_EXPR ;
CODE4 cb;
DATA4 *data;
/* this is required because of potential 'double return'
problems that may occur in cross-platform DLL usage */
static TEST_EXPR test_expr[] =
{
{ ".NOT. .F. ",
"1 ",
r4log
},
{ "5>4.AND.6.7>4.3 ",
"1 ",
r4log
},
{ "\"NEW \" - \"ME \" ",
"NEWME \0 ",
r4str
},
{ "'NEW ' - 'ME ' ",
"NEWME \0 ",
r4str
},
/* 5 */
{ ".T. .AND. .F. ",
"0 ",
r4log
},
{ "IIF(C1=\"SMUR\",\"TRUE\",\"FALS\")",
"FALS\0 ",
r4str
},
{ "((((7))))*(1+2) ",
"21 ",
r4num_doub
},
{ "N1+N2 ",
"12 ",
r4num_doub
},
{ "N1-N2 ",
"8 ",
r4num_doub
},
/* 10 */
{ "N1*N2 ",
"20 ",
r4num_doub
},
{ "N1/N2 ",
"5 ",
r4num_doub
},
{ "C1+C2 ",
"character1CHARACTER2\0 ",
r4str
},
{ "C1-C2 ",
"character1CHARACTER2\0 ",
r4str
},
{ "C1-C4-C5 ",
"character11988020119880323 \0",
r4str
},
/* 15 */
{ "C5-C1-C3-C2 ",
"19880323character1ChArAcTeR3CHARACTER2 \0",
r4str
},
{ "C1=C2 ",
"0 ",
r4log
},
{ "C1=C3 ",
"0 ",
r4log
},
{ "C1>C2 ",
"1 ",
r4log
},
{ "C1<C2 ",
"0 ",
r4log
},
/* 20 */
{ "C1<>C2 ",
"1 ",
r4log
},
{ "C1#C2 ",
"1 ",
r4log
},
{ "C1#C2 ",
"1 ",
r4log
},
{ "C1<>C3 ",
"1 ",
r4log
},
{ "C1$C2 ",
"0 ",
r4log
},
/* 25 */
{ "\"ST\"$\"MOST\" ",
"1 ",
r4log
},
#ifndef __SC__
#ifdef _MSC_VER
#pragma warning( disable : 4129 )
#endif
{ "\[ST\]$\[MOST\] ",
"1 ",
r4log
},
#ifdef _MSC_VER
#pragma warning( default : 4129 )
#endif
#endif
#ifdef S4GERMAN
{ "CTOD(\"01.02.88\") ",
"19880201\0 ",
r4date_doub
},
{ "DTOC(D2) ",
"23.03.88\0 ",
r4str
},
#else
{ "CTOD(\"02/01/88\") ",
"19880201\0 ",
r4date_doub
},
{ "DTOC(D2) ",
"03/23/88\0 ",
r4str
},
#endif
{ "STOD(C4) ",
"19880201\0 ",
r4date_doub
},
/* 30 */
{ "DTOS(D2) ",
"19880323\0 ",
r4str
},
{ "D1=STOD(C4) ",
"1 ",
r4log
},
{ "C5=DTOS(D2) ",
"1 ",
r4log
},
{ "IIF(C1=\"SMUR\",\"TRUE\",\"FALS\")",
"FALS\0 ",
r4str
},
{ "RECCOUNT() ",
"1 ",
r4num_doub
},
/* 35 */
{ "RECNO() ",
"1 ",
r4num_doub
},
{ "STR(5.7,4,2) ",
"5.70\0 ",
r4str
},
{ "VAL(\"2323\") ",
"2323 ",
r4num_doub
},
{ "SUBSTR(C1,2,2) ",
"ha\0 ",
r4str
},
{ "C1 + SUBSTR(C1,2,2) ",
"character1ha\0 ",
r4str
},
{ "3*4-2 ",
"10 ",
r4num_doub
},
{ "L1 ",
"0 ",
r4log
},
{ ".NOT. .T. ",
"0 ",
r4log
},
{ ".NOT. .F. ",
"1 ",
r4log
},
{ ".T. ",
"1 ",
r4log
},
{ ".T. .OR. .F. ",
"1 ",
r4log
},
{ ".T. .AND. .F. ",
"0 ",
r4log
},
{ "\"A \" + \"B \" ",
"A B \0 ",
r4str
},
{ "\"NEW \" - \"ME \" ",
"NEWME \0 ",
r4str
},
{ "\" \" - \" ab\" ",
" ab \0 ",
r4str
},
{ "((((7))))*(1+2) ",
"21 ",
r4num_doub
},
{ " IIF( .F. , 1, 2) ",
"2 ",
r4num_doub
},
{ " IIF ( .T., \"G\", \"B\" )",
"G\0 ",
r4str
},
{ "(4*3)<=(2*6) ",
"1 ",
r4log
},
{ " .F. .AND. .F. .OR. .T. ",
"1 ",
r4log
},
{ " .NOT. .F. .AND. .F. ",
"0 ",
r4log
},
{ " .NOT. .F. .AND. .F. .OR. .T.",
"1 ",
r4log
},
{ " .NOT. 3 > 2 ",
"0 ",
r4log
},
{ " C6+ DEL()",
"CHAR *\0 ",
r4str
},
{ "DELETED() ",
"1 ",
r4log
},
{ "MONTH(DATE() ) ",
"7 ",
1
},
{ "RECCOUNT() + 3 ",
"4 ",
r4num_doub
},
{ "RECNO() ",
"1 ",
r4num_doub
},
{ "STR(5.73,6,3) ",
" 5.730\0 ",
r4str
},
{ "STR(9.643,3) ",
" 10\0 ",
r4str
},
{ "YEAR(D2 ) ",
"1988 ",
r4num_doub
},
{ "DATE() ",
" ",
1
},
{ "TIME() ",
" ",
2
},
#ifndef S4NO_POW
#ifndef __ZTC__
/* Zortech fails because Zortech 'pow' does not round the result. */
{ "N1^N2 ",
"100 ",
r4num_doub
},
{ "2^4 ",
"16 ",
r4num_doub
},
{ "3**5 ",
"243 ",
r4num_doub
},
#endif
#endif
#ifndef S4UNIX
#ifndef __ZTC__
#ifndef __HIGHC__
{ "N4-N3 ",
"986419.754001 ",
r4num_doub
},
{ "STR(22.2,5,1) ",
" 22.2\0 ",
r4str
},
{ "STR(21.5,6,0) ",
" 22\0 ",
r4str
},
#endif
#endif
#endif
#ifndef S4UNIX
#ifndef S4NO_POW
#ifndef __HIGHC__
#ifndef __ZTC__
{ "((13))**7+13 ",
"62748530 ",
r4num_doub
},
#endif
{ "((13))^7+13 ",
"62748530 ",
r4num_doub
},
#endif
#endif
#endif
{ "STR(22.2,6,2)+STR(11.1,7,1) ",
" 22.20 11.1\0 ",
r4str
},
{ "STR(1.5,3,1)+STR(1.9345,4,2) ",
"1.51.93\0 ",
r4str
},
{ "'ooga'+STR(1.9345,4,2) ",
"ooga1.93\0 ",
r4str
},
{ "\0 ",
" ",
'\0'
},
};
static int do_test( D4DISPLAY *disp )
{
int i, str_len ;
char logical;
double d ;
EXPR4 *ptr ;
char *buf, *key_result;
char date_buf[20] ;
#ifdef S4WINDOWS
cb.hWnd = (unsigned) disp->hWnd ;
#ifdef S4DLL
cb.hInst = (unsigned) disp->hInst ;
#endif
#endif
cb.safety = '\0';
#ifdef S4OPEN_FILE
data = d4open( &cb, "T4EXPR" ) ;
#else
data = d4create( &cb, "T4EXPR", testfields, 0);
#endif
if ( cb.error_code || data == 0 )
t4severe( t4err_data, "01" ) ;
d4opt_start( &cb ) ;
if ( d4append_start(data, 0) < 0)
t4severe( t4err_append, "02" ) ;
f4assign( (d4field(data, "C1")), "character1");
f4assign( (d4field(data, "C2")), "CHARACTER2");
f4assign( (d4field(data, "C3")), "ChArAcTeR3");
f4assign( (d4field(data, "C4")), "19880201");
f4assign( (d4field(data, "C5")), "19880323");
f4assign( (d4field(data, "C6")), "CHAR");
d = 10.0 ;
f4assign_double( (d4field(data, "N1")), d ) ;
d = 2.0 ;
f4assign_double( (d4field(data, "N2")), d );
d = 1234.567 ;
f4assign_double( (d4field(data, "N3")), d );
d = 987654.321001 ;
f4assign_double( (d4field(data, "N4")), d );
f4assign( ( d4field(data, "D1" ) ), "19880201" ) ;
f4assign( ( d4field(data, "D2" ) ), "19880323" ) ;
logical = 'F';
f4assign( ( d4field( data, "L1" ) ), &logical ) ;
logical = 'T';
f4assign( ( d4field( data, "L2" ) ), &logical ) ;
d4delete( data ) ;
if ( d4append( data ) < 0 )
t4severe( t4err_append, "03" ) ;
for ( i=0; test_expr[i].result_type != '\0'; i++ )
{
if ( d4display_quit( disp ) )
return 1 ;
d4display_num( disp, i, 1 ) ;
d4display_str( disp, ") On Expression: ", 0 ) ;
d4display_str( disp, test_expr[i].expr, 0 ) ;
ptr = expr4parse(data, test_expr[i].expr ) ;
if ( ptr == (void *) 0 )
t4severe( t4err_expr, "04" ) ;
if (expr4vary(ptr, &buf) < 0)
t4severe( t4err_expr, "05" ) ;
if ( test_expr[i].result_type == 1 )/* DATE() function, cannot compare */
{
date4assign(buf, (long) *(double *)buf ) ;
buf[8] = '\0' ;
date4format(buf, date_buf, "MMM DD/CCYY" ) ;
d4display_str( disp, "", 1 ) ;
d4display_str( disp, "DATE:", 0) ;
d4display_str( disp, date_buf, 1) ;
}
if ( test_expr[i].result_type == 2 )/* TIME() function, cannot compare */
{
d4display_str( disp, "TIME:", 0) ;
d4display_str( disp, buf, 1) ;
d4display_str( disp, "", 1 ) ;
}
if ( test_expr[i].result_type > 10 )
{
if ( (char) expr4type(ptr) != test_expr[i].result_type )
t4severe( t4err_expr, "06" ) ;
switch ( (char) expr4type(ptr) )
{
case r4str :
str_len = expr4key( ptr, &key_result ) ;
if ( memcmp( buf, test_expr[i].result, str_len ) != 0 )
{
e4describe( &cb, 0, "t4expr EXPR(r4str):", test_expr[i].expr, (char *) 0 ) ;
e4exit( &cb) ;
}
if ( strcmp( key_result, test_expr[i].result) != 0 )
{
e4describe( &cb, 0, "t4expr EXPR(r4str):", test_expr[i].expr, (char *) 0 ) ;
e4exit( &cb) ;
}
break ;
case r4log :
if ( ( *(int*) buf && !(c4atoi(test_expr[i].result,1)) ) ||
( !*(int*) buf && (c4atoi(test_expr[i].result,1)) ) )
{
e4describe( &cb, 0, "t4expr EXPR(r4log):", test_expr[i].expr, (char *) 0 ) ;
e4exit( &cb) ;
}
break;
case r4num_doub :
#ifndef S4WINDOWS
c4atod2(test_expr[i].result, 30, &d );
if ( *(double *) buf != d )
{
e4describe( &cb, 0, "t4expr EXPR(r4num_doub):", test_expr[i].expr, (char *) 0 ) ;
e4exit( &cb) ;
}
#endif
break;
case r4date_doub :
{
char buf2[8] ;
long d_ptr ;
d_ptr = (long) *(double *) buf;
date4assign( buf2, d_ptr ) ;
if ( memcmp( buf2, test_expr[i].result, 8) != 0 )
{
e4describe( &cb, 0, "t4expr EXPR)r4date_doub):", test_expr[i].expr, (char *) 0 ) ;
e4exit( &cb) ;
}
break;
}
}
}
expr4free(ptr) ;
}
if ( d4close_all( &cb ) != 0 )
t4severe( t4err_close, "07" ) ;
return 0 ;
}
static int test_with_mem_check( D4DISPLAY *disp )
{
d4init( &cb ) ;
if ( do_test( disp ) )
return 1 ;
#ifndef S4TEST_KEEP_FILES
u4remove( "T4EXPR.dbf" ) ;
#endif
d4init_undo(&cb) ;
mem4reset() ;
#ifdef S4DEBUG
mem4check_memory() ;
#ifndef S4DLL
if ( mem4free_check(100) != 0 )
t4severe( t4err_memory, "08" ) ;
#endif
#endif
return 0 ;
}
int S4FUNCTION t4test( D4DISPLAY *disp )
{
if ( test_with_mem_check( disp ) )
t4severe( t4err_general, "09" ) ;
if ( test_with_mem_check( disp ) )
t4severe( t4err_general, "10" ) ;
if ( test_with_mem_check( disp ) )
t4severe( t4err_general, "11" ) ;
d4display_str( disp, "T4EXPR: SUCCESS", 1) ;
d4display_str( disp, "", 1) ;
return 1 ;
}