    001    /* Copyright 2000, 2001, Compaq Computer Corporation */
    002
    003    package javafe.util;
    004
    005    import java.util.Random;
    006    import java.io.*;
    007
    008    public class CorrelatedReaderTest
    009    {
    010      static final int SEED          = 0xCAFEBABE;
    011      static final int MASKRESET     = 0x1f;
    012      static final int MASKSUBREADER = 0x1ff;
    013      static final int MASKDISCARD   = 0xf;
    014
    015      //----------------------------------------------------------------------
    016
    017      //@ ensures false;
    018      //@ diverges true;
    019      //@ signals (Exception) false;
    020      static void error() {
    021        System.out.println("Usage: java CorrelatedReader [locs|reset|subreader]");
    022        System.exit(1);
    023      }
    024
    025      /** A test harness.
    026       */
    027
    028      //@ requires \nonnullelements(argv);
    029      public static void main(String[] argv)
    030            throws IOException, IndexOutOfBoundsException {
    031
    032        CorrelatedReader cin = new FileCorrelatedReader( System.in, "stdin" );
    033        Random random = new Random( SEED ); // deterministic test
    034        int c;
    035
    036        try {
    037          if( argv.length != 1 ) {
    038            error();
    039          }
    040          else if( argv[0].equals("locs") ) {
    041            while( (c=cin.read()) != -1 ) {
    042              int loc=cin.getLocation();
    043              System.out.println("["+c+"'"+ (new Character((char)c)).toString()
    044                                 +"' loc:"+ loc+" "+Location.toString(loc)
    045                                 +" offset "+Location.toOffset(loc)+"]");
    046            }
    047          }
    048          else if( argv[0].equals("reset") ) {
    049
    050            while( (c=cin.read()) != -1 ) {
    051              cin.mark();
    052              c=cin.read();
    053              int loc=cin.getLocation();
    054              /*
    055                System.out.println("["+c+"'"+ (new Character((char)c)).toString()
    056                                   +"' loc:"+ loc+" "+Location.toString(loc)
    057                                   +" offset "+Location.toOffset(loc)+"]");
    058              */
    059
    060              int toRead = random.nextInt() & MASKRESET ;
    061              for(int j=0; j<toRead; j++) cin.read();
    062              cin.reset();
    063              int c2=cin.read();
    064              int loc2 = cin.getLocation();
    065              Assert.notFalse( c==c2 && loc==loc2,          //@ nowarn Pre;
    066                              "c="+c
    067                              +" c2="+c2
    068                              +" loc="+loc
    069                              +" loc2="+loc2);
    070            }
    071          }
    072          else if( argv[0].equals("subreader") ) {
    073
    074            while( (c=cin.read()) != -1 ) {
    075
    076              StringBuffer sb = new StringBuffer();
    077
    078
    079
    080              // mark the position of the next character;
    081              // then get the next character and its location:
    082              cin.mark();
    083              sb.append( (char)cin.read() );
    084              int loc=cin.getLocation();
    085
    086
    087              int toRead = random.nextInt() & MASKSUBREADER;
    088              int read;
    089
    090              for(read=1; read<toRead && (c=cin.read()) != -1; read++)
    091                sb.append( (char)c );
    092
    093
    094              int discard = random.nextInt() & MASKDISCARD;
    095              if( discard > read )
    096                  discard = read;
    097
    098              CorrelatedReader subReader = cin.createReaderFromMark(discard);
    099
    100              // Test location if subReader not empty:
    101              if (discard<read) {
    102                  // loc2 = location of first character in subReader:
    103                  subReader.mark();
    104                  subReader.read();
    105                  int loc2 = subReader.getLocation();
    106                  subReader.reset();
    107
    108                  Assert.notFalse(loc==loc2,                        //@ nowarn Pre;
    109                                  "loc="+loc
    110                                  +" loc2="+loc2
    111                                  +" read="+read
    112                                  +" discard="+discard );
    113              }
    114
    115
    116              for(int j=0; j<read-discard; j++) {
    117                int sc = subReader.read();
    118                Assert.notFalse(sb.charAt(j) == sc,         //@ nowarn Pre;
    119                                "sc='"+(char)sc+"'"
    120                                +" sb("+j+")='"+sb.charAt(j)+"'"
    121                                +"sb='"+sb+"'"
    122                                +" loc="+loc
    123                                +" read="+read+" discard="+discard );
    124              }
    125
    126              Assert.notFalse( subReader.read() == -1 );    //@ nowarn Pre;
    127            }
    128          }
    129          else
    130            error();
    131        } catch( AssertionFailureException e ) {
    132          e.printStackTrace();
    133          System.exit(1);
    134        }
    135      }
    136    }