/* t4mul2.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */

/* Tests CodeBase multi-user capabilities. */

/*    1.  Erase 't4mul2.dbf', 't4mul2.dbt' and 't4mul2.mdx' */
/*    2.  Run 't4mul2' on one station. */
/*    3.  Run 't4mul2' on a second station. */

#include "d4all.h"
#ifdef __TURBOC__
#pragma hdrstop
#endif


#include "t4test.h"

#ifdef S4WINDOWS
/* currently just exclude <conio.h> */
#else
#ifdef S4UNIX
#ifdef S4CURSES
/*       #include <curses.h>  */
#else
/*       #include <tinfo.h>   */
#endif
#else
#include <conio.h>
#endif
#endif

static FIELD4INFO fields[] =
{
{ "TEST", 'C', 10, 0 },
{ "MEM",  'M', 10, 0 },
{ 0, 0,0,0 },
} ;

#ifndef S4INDEX_OFF
static TAG4INFO tags[] =
{
{  "TAG", "TEST", "", 0, 0 },
{  0, 0, 0, 0, 0 },
} ;
#endif

CODE4 cb;
CODE4 S4PTR *cb_ptr ;
DATA4 S4PTR *t4mul2 ;
INDEX4 S4PTR *test_index ;
FIELD4 S4PTR *field, S4PTR *mfield ;


static int test_mul2( D4DISPLAY *display, long num_recs )
{
  char buf[11] ;
  int did_create = 1 ;
  long i_rec, r, mfield_info ;

  cb.create_error = 0 ;

#ifdef S4INDEX_OFF
  t4mul2 = d4create( cb_ptr, "T4MUL2", fields, 0 ) ;
#else
  t4mul2 = d4create( cb_ptr, "T4MUL2", fields, tags ) ;
#endif
  if ( t4mul2 == 0 )
  {
    did_create = 0 ;
    cb.auto_open = 0 ;

    d4display_str( display,  "Opening Database. . .", 1 ) ;

    t4mul2 = d4open( cb_ptr, "T4MUL2" ) ;
    if ( t4mul2 == 0 )
      e4severe( e4result, "t4mul2.c:  Opening database." ) ;

    if ( (test_index = i4open( t4mul2, "T4MUL2" ))  == 0 )
      e4severe( e4result, "Opening Index" ) ;
  }

  field = d4field( t4mul2, "TEST" ) ;
  mfield = d4field( t4mul2, "MEM" ) ;

  if ( field == 0 || mfield == 0 )
    e4severe( e4result, "t4mul2.c" ) ;

  d4display_str( display,  "    Record:  ", 1 ) ;

  for ( i_rec = 1L; i_rec <= num_recs; i_rec++ )
  {
    if ( d4display_quit( display ) )
      return 1 ;

    if ( d4append_start( t4mul2, 0 ) != 0 )
      e4severe( e4result, "t4mul2.c" ) ;

    if ( did_create )
    {
      display->x = (int) 0 ;
      d4display_str( display,  "    Record:  ", 0 ) ;
      d4display_num( display, i_rec, 0 ) ;
      d4display_str( display,  "     New Value:  ", 0 ) ;
      d4display_num( display, i_rec, 0 ) ;
      d4display_str( display,  "       ", 0 ) ;
      f4assign_long( field, (long) i_rec ) ;

      c4ltoa45( (long) i_rec, (char S4PTR *) buf, 10 ) ;
      buf[10] = '\0' ;
      f4memo_assign_n( mfield, (char S4PTR *) buf, 10 ) ;
    }
    else
    {
      display->x = (int) 0 ;
      d4display_str( display,  "    Record:  ", 0 ) ;
      d4display_num( display, i_rec, 0 ) ;
      d4display_str( display,  "       ", 0 ) ;

      f4assign_long( field, (long) num_recs - i_rec ) ;
      c4ltoa45( (long) num_recs - i_rec, (char S4PTR *) buf, 10 ) ;
      buf[10] = '\0' ;
      f4memo_assign_n( mfield, (char S4PTR *) buf, 10 ) ;
    }
    if ( d4append( t4mul2 ) < 0 )
      e4severe( e4result, "t4mul2: d4append()" ) ;

    d4display_str( display, "Before d4unlock()", 1 ) ;

    if ( d4unlock( t4mul2 ) != 0 )
      e4severe( e4result, "t4mul2.c" ) ;
  }

  d4display_str( display,  "        Checking Index File . . .  ", 1 ) ;

  if ( d4check( t4mul2 ) != 0 )
    e4severe( e4result, "d4check()" ) ;

  d4display_str( display,  "        Skipping down File . . .  ", 1 ) ;
  d4display_str( display,  "    Record:  ", 1 ) ;

  for ( r = d4reccount( t4mul2 ); r >= 1; r-- )
  {

    if ( d4display_quit( display ) )
      return 1 ;

    if ( d4go( t4mul2, (long)r ) != 0 )
      e4severe( e4result, "t4mul2.c" ) ;
    display->x = (int) 0 ;
    d4display_str( display,  "    Record:  ", 0 ) ;
    d4display_num( display, r, 0 ) ;
    d4display_str( display,  "       ", 0 ) ;

    mfield_info = c4atol( f4memo_str(mfield), 10 ) ;

    if ( f4long(field) != mfield_info )
      e4severe( e4result, "t4mul2.c" ) ;
  }

  if ( d4close_all( cb_ptr ) != 0 )
    e4severe( e4result, "t4mul2.c" ) ;

#ifdef S4LOCK_CHECK
  if ( l4lock_check() != 0 )
    e4severe( e4result, "Not everything was unlocked" ) ;
#endif

  return 0 ;
}


static int  test_with_mem_check( D4DISPLAY *display, long num_recs )
{
  d4init( cb_ptr ) ;

  cb.hWnd = (unsigned) display->hWnd ;
#ifdef S4DLL
  cb.hInst = (unsigned) display->hInst ;
#endif

  if ( test_mul2( display, num_recs ) )
    return 1 ;

  d4init_undo( &cb ) ;
  mem4reset() ;

#ifdef S4DEBUG
  mem4check_memory() ;

#ifndef S4DLL
  if ( mem4free_check(100) != 0 )
    e4severe( e4result, "t4mul2:  Memory items not freed" ) ;
#endif
#endif

  return 0 ;
}


int S4FUNCTION t4test( D4DISPLAY *display )
{
  long num_recs = 0 ;

  cb_ptr = &cb ;
  num_recs = atol( d4parsestring_nparm( &display->parse_str ) ) ;
  if ( num_recs <= 0 )
    e4severe( 0, "T4MUL2:  Missing command line parameter(s)" ) ;
  
  d4display_str( display,  "T4MUL2 Test  ", 1 ) ;
  d4display_str( display,  " ", 1 ) ;
  d4display_str( display,  "Number of Recs:   ", 1 ) ;
  d4display_num( display,  (long) num_recs, 0 ) ;
  d4display_str( display,  "", 1 ) ;

  if ( test_with_mem_check( display, num_recs ) )
    e4severe( e4result, "t4mul2.c" ) ;

  display->y += 2 ;
  d4display_str( display, "T4MUL2:   SUCCESS", 1 ) ;
  d4display_str( display, "", 1 ) ;
  return 1 ;
}
