//
//		sio_8211DirEntry_t 
//


#include <iostream>
#include <strstream>

#include <cassert>

#ifdef _MSC_VER
#pragma warning(disable:4786)
#endif

using namespace std;


#include <sdts++/io/sio_8211DirEntry.h>
#include <sdts++/io/sio_8211DRLeader.h>



int main(int argc, char** argv)
{

  sio_8211DirEntry dir_entry;
  sio_8211DRLeader tmp_leader;  // bogus leader to be used by dir entry


  // insure everything initialized sanely

  assert( 0  == dir_entry.getPosition() );
  assert( 0  == dir_entry.getFieldLength() );
  assert( "" == dir_entry.getTag() );
  assert( 0  == dir_entry.getField() );
  assert( 0  == dir_entry.getLeader() );


  // we don't need a real field, we just want to make sure that the
  // address is ok
  dir_entry.setField( reinterpret_cast<sio_8211Field const*>( 0xbad ) );

  // unfortunately we do need a real leader because a side effect of
  // setting the position, field length, and tag is that the leader
  // widts are automagically updated
  dir_entry.setLeader( &tmp_leader );

  dir_entry.setPosition( 10 );
  dir_entry.setFieldLength( 200 );
  dir_entry.setTag( "BOGUS" );


  // natch, we now make sure we get back what we set
  assert( 10      == dir_entry.getPosition() );
  assert( 200     == dir_entry.getFieldLength() );
  assert( "BOGUS" == dir_entry.getTag() );
  assert( reinterpret_cast<sio_8211Field const*>(0xbad) == dir_entry.getField() );
  assert( &tmp_leader == dir_entry.getLeader() );


  // as a side-effect of some of the sets, the leader will have
  // modified field widths, so we need to check that, too

  assert( 2 == tmp_leader.getSizeOfFieldPosField() ); // 10 is 2 characters wide

  assert( 3 == tmp_leader.getSizeOfFieldLengthField() ); // 200 is 3 characters wide

  assert( strlen("BOGUS") == tmp_leader.getSizeOfFieldTagField() );


  {  // exercise copy ctor

    sio_8211DirEntry dir_entry_copy( dir_entry );


    // obviously the values should be the same as what's in the old dir_entry

    assert( 10      == dir_entry.getPosition() );
    assert( 200     == dir_entry.getFieldLength() );
    assert( "BOGUS" == dir_entry.getTag() );
    assert( reinterpret_cast<sio_8211Field const*>(0xbad) == dir_entry.getField() );
    assert( &tmp_leader == dir_entry.getLeader() );

  }


  {  // exercise assignment operator

    sio_8211DirEntry dir_entry_copy;

    dir_entry_copy = dir_entry;


    // obviously the values should be the same as what's in the old dir_entry

    assert( 10      == dir_entry.getPosition() );
    assert( 200     == dir_entry.getFieldLength() );
    assert( "BOGUS" == dir_entry.getTag() );
    assert( reinterpret_cast<sio_8211Field const*>(0xbad) == dir_entry.getField() );
    assert( &tmp_leader == dir_entry.getLeader() );

  }


  {  // test stream operators

    strstream ss;

    ss << dir_entry;


    sio_8211DirEntry dir_entry_copy(tmp_leader); // have to re-use leader for
    // proper formatting information

    ss >> dir_entry_copy;


    // obviously the values should be the same as what's in the old dir_entry

    assert( 10      == dir_entry_copy.getPosition() );
    assert( 200     == dir_entry_copy.getFieldLength() );
    assert( "BOGUS" == dir_entry_copy.getTag() );
    // We don't check the sio_8211Field pointer as that won't get set during
    // a read from an input stream.
    assert( &tmp_leader == dir_entry_copy.getLeader() );

  }

  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1