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 }