420 lines
9.8 KiB
C
420 lines
9.8 KiB
C
|
/* t4unique.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */
|
||
|
|
||
|
/* Tests CodeBase unique entry code. */
|
||
|
|
||
|
#include "d4all.h"
|
||
|
#ifdef __TURBOC__
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
|
||
|
#include "t4test.h"
|
||
|
|
||
|
#ifndef S4INDEX_OFF
|
||
|
|
||
|
CODE4 cb;
|
||
|
DATA4 *data, *data2;
|
||
|
FIELD4 *c_field, *d_field, *n_field, *num, *char1, *char2 ;
|
||
|
TAG4 *tag ;
|
||
|
int count = 9 ;
|
||
|
|
||
|
static FIELD4INFO fields[] =
|
||
|
{
|
||
|
{ "N_FIELD", 'N', 8, 0 },
|
||
|
{ "C_FIELD", 'C', 8, 0 },
|
||
|
{ "D_FIELD", 'D', 8, 0 },
|
||
|
{ 0, 0,0,0 },
|
||
|
} ;
|
||
|
|
||
|
static TAG4INFO tags[] =
|
||
|
{
|
||
|
#ifdef N4OTHER
|
||
|
{ "N_TAG", "N_FIELD", "", r4unique_continue, 0 },
|
||
|
{ "C_TAG", "C_FIELD", "", r4unique_continue, 0 },
|
||
|
{ "D_TAG", "D_FIELD", "", r4unique_continue, 0 },
|
||
|
#else
|
||
|
{ "N_TAG", "N_FIELD", "", r4unique_continue, r4descending },
|
||
|
{ "C_TAG", "C_FIELD", "", r4unique_continue, r4descending },
|
||
|
{ "D_TAG", "D_FIELD", "", r4unique_continue, r4descending },
|
||
|
#endif
|
||
|
{ 0,0,0, 0, 0 },
|
||
|
} ;
|
||
|
|
||
|
static FIELD4INFO fields2[] =
|
||
|
{
|
||
|
{ "NUM", 'N', 8, 0 },
|
||
|
{ "CHAR1", 'C', 8, 0 },
|
||
|
{ "CHAR2", 'C', 8, 0 },
|
||
|
{ 0, 0,0,0 },
|
||
|
} ;
|
||
|
|
||
|
static TAG4INFO tags2[] =
|
||
|
{
|
||
|
{ "TAG1", "NUM", "", r4unique_continue, 0 },
|
||
|
{ "TAG2", "NUM", "", r4unique, 0 },
|
||
|
|
||
|
{ "TAG3", "NUM", ".NOT. DELETED()", r4unique_continue, 0 },
|
||
|
{ "TAG4", "NUM", ".NOT. DELETED()", r4unique, 0 },
|
||
|
|
||
|
{ "TAG5", "CHAR1", "", r4unique_continue, 0 },
|
||
|
{ "TAG6", "CHAR1", "", r4unique, 0 },
|
||
|
|
||
|
{ "TAG7", "CHAR1", ".NOT. DELETED()", r4unique_continue, 0 },
|
||
|
{ "TAG8", "CHAR1", ".NOT. DELETED()", r4unique, 0 },
|
||
|
|
||
|
{ "TAG9", "CHAR1+CHAR2", "", r4unique_continue, 0 },
|
||
|
{ "TAG10", "CHAR1+CHAR2", "", r4unique, 0 },
|
||
|
|
||
|
{ "TAG11", "CHAR1+CHAR2", ".NOT. DELETED()", r4unique_continue, 0 },
|
||
|
{ "TAG12", "CHAR1+CHAR2", ".NOT. DELETED()", r4unique, 0 },
|
||
|
{ 0,0,0, 0, 0 },
|
||
|
} ;
|
||
|
|
||
|
static int test_tag( D4DISPLAY *display )
|
||
|
{
|
||
|
#ifdef N4OTHER
|
||
|
long r = 1 ;
|
||
|
#else
|
||
|
long r = 9 ;
|
||
|
#endif
|
||
|
|
||
|
if ( d4top( data ) != 0 )
|
||
|
t4severe( t4err_go, "01" ) ;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( d4eof( data ) )
|
||
|
break ;
|
||
|
if ( d4display_quit( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
if ( d4recno( data ) != r )
|
||
|
t4severe( t4err_recno, "02" ) ;
|
||
|
|
||
|
#ifdef N4OTHER
|
||
|
r += 2 ;
|
||
|
#else
|
||
|
r -= 2 ;
|
||
|
#endif
|
||
|
if ( d4skip( data, 1L ) < 0 )
|
||
|
t4severe( t4err_skip, "03" ) ;
|
||
|
}
|
||
|
|
||
|
if ( d4go( data, 2L ) != 0 )
|
||
|
t4severe( t4err_go, "04" ) ;
|
||
|
|
||
|
#ifndef N4OTHER
|
||
|
if ( d4skip( data, 2L ) != r4eof )
|
||
|
#else
|
||
|
if ( d4skip( data, 5 ) != r4eof )
|
||
|
#endif
|
||
|
t4severe( t4err_skip, "05" ) ;
|
||
|
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
static int test_unique( D4DISPLAY *display, int do_open )
|
||
|
{
|
||
|
long start_date, r ;
|
||
|
char hold[10] ;
|
||
|
start_date = date4long( "19800101" ) ;
|
||
|
|
||
|
cb.skip_error = 0 ;
|
||
|
cb.safety = 0 ;
|
||
|
|
||
|
if (do_open)
|
||
|
{
|
||
|
data = d4open( &cb, "T4UNIQUE" ) ;
|
||
|
d4zap( data, 1L, d4reccount(data) ) ;
|
||
|
}
|
||
|
else
|
||
|
data = d4create( &cb, "T4UNIQUE", fields, tags ) ;
|
||
|
|
||
|
if ( data == 0 )
|
||
|
t4severe( t4err_data, "06" ) ;
|
||
|
|
||
|
d4opt_start( &cb ) ;
|
||
|
|
||
|
c_field = d4field( data, "C_FIELD" ) ;
|
||
|
d_field = d4field( data, "D_FIELD" ) ;
|
||
|
n_field = d4field( data, "N_FIELD" ) ;
|
||
|
if ( c_field == 0 || d_field == 0 || n_field == 0 )
|
||
|
t4severe( t4err_field, "07" ) ;
|
||
|
|
||
|
for ( r = 1; r <= 10; r++ )
|
||
|
{
|
||
|
if ( d4display_quit( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
if ( d4append_start(data, 0) < 0 )
|
||
|
t4severe( t4err_append, "08" ) ;
|
||
|
|
||
|
f4assign_long( n_field, (r+1)/2 ) ;
|
||
|
f4assign_long( c_field, (r+1)/2 ) ;
|
||
|
f4assign_long( d_field, start_date + (r+1)/2 ) ;
|
||
|
|
||
|
if ( d4append(data) < 0 )
|
||
|
t4severe( t4err_append, "09" ) ;
|
||
|
}
|
||
|
|
||
|
d4display_str( display, "Testing using tags . . . ", 1 ) ;
|
||
|
|
||
|
tag = d4tag( data, "N_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "10" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
if ( d4seek_double( data, 2.0 ) != 0 )
|
||
|
t4severe( t4err_seek, "11" ) ;
|
||
|
if ( d4recno( data ) != 3 )
|
||
|
t4severe( t4err_recno, "12" ) ;
|
||
|
|
||
|
tag = d4tag( data, "D_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "13" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
tag = d4tag( data, "C_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "14" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
if ( d4reindex( data ) != 0 )
|
||
|
t4severe( t4err_reindex, "15" ) ;
|
||
|
|
||
|
tag = d4tag( data, "N_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "16" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
tag = d4tag( data, "D_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "17" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
tag = d4tag( data, "C_TAG" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "18" ) ;
|
||
|
d4tag_select( data, tag ) ;
|
||
|
if ( test_tag( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
#ifndef N4OTHER
|
||
|
if (do_open)
|
||
|
{
|
||
|
data2 = d4open( &cb, "T4UNIQU2" ) ;
|
||
|
if ( data2 == 0 )
|
||
|
t4severe( t4err_data, "19" ) ;
|
||
|
|
||
|
for ( r = 0, tag = 0; r < 6; r++ ) /* set every second tag.unique_error to r4unique */
|
||
|
{
|
||
|
tag = d4tag_next( data2 , d4tag_next( data2, tag ) ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "20" ) ;
|
||
|
tag->unique_error = r4unique ;
|
||
|
}
|
||
|
|
||
|
if ( d4zap( data2, 6L, d4reccount( data2 ) ) != 0 ) /* delete half the records */
|
||
|
t4severe( t4err_zap, "21" ) ;
|
||
|
count -= 5 ; /* set count so that append adds zapped records back */
|
||
|
if ( d4check( data2 ) != 0 )
|
||
|
t4severe( t4err_check, "22" ) ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
d4display_str( display, "T4UNIQUE: Part two . . . ", 1 ) ;
|
||
|
data2 = d4create( &cb, "T4UNIQU2", fields2, tags2 ) ;
|
||
|
if ( data2 == 0 )
|
||
|
t4severe( t4err_data, "23" ) ;
|
||
|
}
|
||
|
|
||
|
num = d4field( data2, "NUM" ) ;
|
||
|
char1 = d4field( data2, "CHAR1" ) ;
|
||
|
char2 = d4field( data2, "CHAR2" ) ;
|
||
|
if ( num == 0 || char1 == 0 || char2 == 0 )
|
||
|
t4severe( t4err_field, "24" ) ;
|
||
|
|
||
|
for ( r = count; r >= 0; r-- )
|
||
|
{
|
||
|
if ( d4display_quit( display ) )
|
||
|
return 1 ;
|
||
|
|
||
|
if ( d4append_start( data2, 0) < 0 )
|
||
|
t4severe( t4err_append, "25" ) ;
|
||
|
|
||
|
f4assign_long( num, (r*100000+24689) ) ;
|
||
|
c4ltoa45( (r*100000+24689), hold, 8 ) ;
|
||
|
f4assign( char1, hold ) ;
|
||
|
c4ltoa45( (r*100000+24689), hold, 8 ) ;
|
||
|
f4assign( char2, hold ) ;
|
||
|
|
||
|
if ( d4append( data2 ) < 0 )
|
||
|
t4severe( t4err_append, "26" ) ;
|
||
|
}
|
||
|
|
||
|
if ( d4check( data2 ) != 0 )
|
||
|
t4severe( t4err_check, "27" ) ;
|
||
|
|
||
|
tag = d4tag( data2, "TAG6" ) ;
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "28" ) ;
|
||
|
d4tag_select( data2, tag ) ;
|
||
|
|
||
|
if ( d4go( data2, 2L ) != 0 )
|
||
|
t4severe( t4err_go, "29" ) ;
|
||
|
f4assign( char1, " 724689" ) ; /* create non-unique key situation */
|
||
|
if ( d4flush( data2 ) != r4unique )
|
||
|
t4severe( t4err_flush, "30" ) ;
|
||
|
data2->record_changed = 0 ; /* replace with d4abort_change */
|
||
|
|
||
|
if ( d4seek( data2, " 824689" ) ) /* check that no change made to tag */
|
||
|
t4severe( t4err_seek, "31" ) ;
|
||
|
|
||
|
if ( memcmp( f4ptr( char1 ), " 824689", 8 ) ) /* check record unchanged */
|
||
|
t4severe( t4err_field, "32" ) ;
|
||
|
|
||
|
if ( d4check( data2 ) != 0 )
|
||
|
t4severe( t4err_check, "33" ) ;
|
||
|
|
||
|
tag = d4tag( data2, "TAG2" ) ; /* check that previous tags not updated */
|
||
|
if ( tag == 0 )
|
||
|
t4severe( t4err_tag, "34" ) ;
|
||
|
d4tag_select( data2, tag ) ;
|
||
|
if ( d4seek_double( data2, 724689.0 ) )
|
||
|
t4severe( t4err_seek, "35" ) ;
|
||
|
if ( d4seek( data2, "724689" ) )
|
||
|
t4severe( t4err_seek, "36" ) ;
|
||
|
|
||
|
if ( d4append_start( data2, 0 ) != 0 )
|
||
|
t4severe( t4err_append, "37" ) ;
|
||
|
f4assign_long( num, 99999999 ) ;
|
||
|
f4assign( char1, "99999999" ) ;
|
||
|
f4assign( char2, "99999999" ) ;
|
||
|
if ( d4append_start( data2, 0 ) != 0 )
|
||
|
t4severe( t4err_append, "38" ) ;
|
||
|
if ( d4flush( data2 ) != 0 )
|
||
|
t4severe( t4err_flush, "39" ) ;
|
||
|
|
||
|
if ( d4seek_double( data2, 99999999.0 ) != r4eof ) /* check that no change made to tag */
|
||
|
t4severe( t4err_seek, "40" ) ;
|
||
|
|
||
|
if ( d4check( data2 ) != 0 )
|
||
|
t4severe( t4err_check, "41" ) ;
|
||
|
#endif
|
||
|
|
||
|
if ( d4close_all( &cb ) < 0 )
|
||
|
t4severe( t4err_close, "42" ) ;
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int test_with_mem_check( D4DISPLAY *display )
|
||
|
{
|
||
|
d4init( &cb ) ;
|
||
|
|
||
|
cb.hWnd = (unsigned) display->hWnd ;
|
||
|
#ifdef S4DLL
|
||
|
cb.hInst = (unsigned) display->hInst ;
|
||
|
#endif
|
||
|
|
||
|
if ( test_unique( display, 0 ) )
|
||
|
return 1 ;
|
||
|
if ( test_unique( display, 1 ) )
|
||
|
return 1 ;
|
||
|
|
||
|
#ifndef S4TEST_KEEP_FILES
|
||
|
u4remove( "T4UNIQUE.dbf" ) ;
|
||
|
u4remove( "T4UNIQU2.dbf" ) ;
|
||
|
#ifdef N4OTHER
|
||
|
u4remove( "T4UNIQUE.CGP" ) ;
|
||
|
u4remove( "T4UNIQU2.CGP" ) ;
|
||
|
#endif
|
||
|
#ifdef S4MDX
|
||
|
u4remove( "T4UNIQUE.mdx" ) ;
|
||
|
u4remove( "T4UNIQU2.mdx" ) ;
|
||
|
#endif
|
||
|
#ifdef S4FOX
|
||
|
u4remove( "T4UNIQUE.cdx" ) ;
|
||
|
u4remove( "T4UNIQU2.cdx" ) ;
|
||
|
#endif
|
||
|
#ifdef S4CLIPPER
|
||
|
u4remove( "N_TAG.NTX" ) ;
|
||
|
u4remove( "C_TAG.NTX" ) ;
|
||
|
u4remove( "D_TAG.NTX" ) ;
|
||
|
u4remove( "TAG1.NTX" ) ;
|
||
|
u4remove( "TAG2.NTX" ) ;
|
||
|
u4remove( "TAG3.NTX" ) ;
|
||
|
u4remove( "TAG4.NTX" ) ;
|
||
|
u4remove( "TAG5.NTX" ) ;
|
||
|
u4remove( "TAG6.NTX" ) ;
|
||
|
u4remove( "TAG7.NTX" ) ;
|
||
|
u4remove( "TAG8.NTX" ) ;
|
||
|
u4remove( "TAG9.NTX" ) ;
|
||
|
u4remove( "TAG10.NTX" ) ;
|
||
|
u4remove( "TAG11.NTX" ) ;
|
||
|
u4remove( "TAG12.NTX" ) ;
|
||
|
#endif
|
||
|
#ifdef S4NDX
|
||
|
u4remove( "N_TAG.NDX" ) ;
|
||
|
u4remove( "C_TAG.NDX" ) ;
|
||
|
u4remove( "D_TAG.NDX" ) ;
|
||
|
u4remove( "TAG1.NDX" ) ;
|
||
|
u4remove( "TAG2.NDX" ) ;
|
||
|
u4remove( "TAG3.NDX" ) ;
|
||
|
u4remove( "TAG4.NDX" ) ;
|
||
|
u4remove( "TAG5.NDX" ) ;
|
||
|
u4remove( "TAG6.NDX" ) ;
|
||
|
u4remove( "TAG7.NDX" ) ;
|
||
|
u4remove( "TAG8.NDX" ) ;
|
||
|
u4remove( "TAG9.NDX" ) ;
|
||
|
u4remove( "TAG10.NDX" ) ;
|
||
|
u4remove( "TAG11.NDX" ) ;
|
||
|
u4remove( "TAG12.NDX" ) ;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
d4init_undo(&cb) ;
|
||
|
mem4reset() ;
|
||
|
|
||
|
#ifdef S4DEBUG
|
||
|
mem4check_memory() ;
|
||
|
|
||
|
#ifndef S4DLL
|
||
|
if ( mem4free_check(100) != 0 )
|
||
|
t4severe( t4err_memory, "43" ) ;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
int S4FUNCTION t4test( D4DISPLAY *display )
|
||
|
{
|
||
|
#ifdef S4INDEX_OFF
|
||
|
display->y += 2 ;
|
||
|
d4display_str( display, "T4GROUP: REQUIRES INDEXING (S4INDEX_OFF DEFINED)", 1) ;
|
||
|
d4display_str( display, "", 1) ;
|
||
|
return 1 ;
|
||
|
#else
|
||
|
d4display_str( display, "T4UNIQUE Test ", 1 ) ;
|
||
|
d4display_str( display, " ", 1 ) ;
|
||
|
|
||
|
if ( test_with_mem_check( display ) )
|
||
|
e4exit(&cb) ;
|
||
|
|
||
|
display->y += 2 ;
|
||
|
d4display_str( display, "T4UNIQUE: SUCCESS", 1) ;
|
||
|
#endif
|
||
|
return 1 ;
|
||
|
}
|