package de.axone.tools;
import static org.testng.Assert.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.testng.annotations.Test;
@Test( groups="tools.e" )
public class ETest {
private static final class StringOutputStream extends OutputStream {
StringBuffer buf = new StringBuffer();
@Override
public void write( int b ) throws IOException {
Character c = Character.valueOf( (char)b );
buf.append( c );
}
@Override
public String toString(){
return buf.toString();
}
public void clear(){
buf = new StringBuffer();
}
}
private StringOutputStream s = new StringOutputStream();
private PrintStream saveOut = null,
tmpOut = new PrintStream( s );
public void testE() throws Exception {
try {
saveOut = System.out;
System.setOut( tmpOut );
String string="text";
E.cho( (Object)null ); assertOut( s, "(-null-)" );
E.cho( (Object[])null ); assertOut( s, "(-null-)" );
E.cho( string ); assertOut( s, "text" );
// Primitives
boolean booleanV=true;
byte byteV=12;
char charV='c';
int intV=12345;
double doubleV=123.45;
E.cho( booleanV ); assertOut( s, "true" );
E.cho( byteV ); assertOut( s, "12" );
E.cho( charV ); assertOut( s, "c" );
E.cho( intV ); assertOut( s, "12345" );
E.cho( doubleV ); assertOut( s, "123.45" );
E.cho( booleanV, byteV, charV, intV, doubleV );
assertOut( s, "true, 12, c, 12345, 123.45" );
// Wrapers
Boolean booleanO=booleanV;
Byte byteO=byteV;
Character charO=charV;
Integer intO=intV;
Double doubleO=doubleV;
E.cho( booleanO ); assertOut( s, "true" );
E.cho( byteO ); assertOut( s, "12" );
E.cho( charO ); assertOut( s, "c" );
E.cho( intO ); assertOut( s, "12345" );
E.cho( doubleO ); assertOut( s, "123.45" );
// Primitive Arrays
boolean [] booleanA=new boolean[]{ true, false };
byte [] byteA=new byte[]{ (byte)1, (byte)2, (byte)3 };
char [] charA=new char[]{ 'a', 'b', 'c' };
int [] intA=new int[]{ 12345, 12346, 12347 };
double [] doubleA = new double[]{ 123.45, 123.46, 123.47 };
E.cho( booleanA ); assertOut( s, "['true', 'false']" );
E.cho( byteA ); assertOut( s, "['1', '2', '3']" );
E.cho( charA ); assertOut( s, "['a', 'b', 'c']" );
E.cho( intA ); assertOut( s, "['12345', '12346', '12347']" );
E.cho( doubleA ); assertOut( s, "['123.45', '123.46', '123.47']" );
// Wrapper Arrays
Boolean [] booleanOA=new Boolean[]{ true, false };
Byte [] byteOA=new Byte[]{ (byte)1, (byte)2, (byte)3 };
Character [] charOA=new Character[]{ 'a', 'b', 'c' };
Integer [] intOA=new Integer[]{ 12345, 12346, 12347 };
Double [] doubleOA = new Double[]{ 123.45, 123.46, 123.47 };
E.cho( (Object[])booleanOA ); assertOut( s, "true, false" );
E.cho( (Object[])byteOA ); assertOut( s, "1, 2, 3" );
E.cho( (Object[])charOA ); assertOut( s, "a, b, c" );
E.cho( (Object[])intOA ); assertOut( s, "12345, 12346, 12347" );
E.cho( (Object[])doubleOA ); assertOut( s, "123.45, 123.46, 123.47" );
E.cho( (Object)booleanOA ); assertOut( s, "['true', 'false']" );
E.cho( (Object)byteOA ); assertOut( s, "['1', '2', '3']" );
E.cho( (Object)charOA ); assertOut( s, "['a', 'b', 'c']" );
E.cho( (Object)intOA ); assertOut( s, "['12345', '12346', '12347']" );
E.cho( (Object)doubleOA ); assertOut( s, "['123.45', '123.46', '123.47']" );
// List
List<Boolean> booleanOL=Arrays.asList( true, false );
List<Byte> byteOL=Arrays.asList( (byte)1, (byte)2, (byte)3 );
List<Character> charOL=Arrays.asList( 'a', 'b', 'c' );
List<Integer> intOL=Arrays.asList( 12345, 12346, 12347 );
List<Double> doubleOL=Arrays.asList( 123.45, 123.46, 123.47 );
E.cho( booleanOL ); assertOut( s, "('true', 'false')" );
E.cho( byteOL ); assertOut( s, "('1', '2', '3')" );
E.cho( charOL ); assertOut( s, "('a', 'b', 'c')" );
E.cho( intOL ); assertOut( s, "('12345', '12346', '12347')" );
E.cho( doubleOL ); assertOut( s, "('123.45', '123.46', '123.47')" );
Map<Integer,Boolean> ibM = Mapper.linkedHashMap( new Integer[]{1, 2}, new Boolean[]{true, false} );
E.cho( ibM ); assertOut( s, "{'1'=>'true', '2'=>'false'}" );
Map<Character,String> csM = Mapper.linkedHashMap( new Character[]{'a', 'b'}, new String[]{"AAA", "BBB"} );
E.cho( csM ); assertOut( s, "{'a'=>'AAA', 'b'=>'BBB'}" );
List<Integer> l1 = Arrays.asList( 100, 101, 102 );
List<Integer> l2 = Arrays.asList( 200, 201, 202, null );
Map<Byte,List<?>> bslM = Mapper.hashMap(
new Byte[]{ (byte)1, (byte)2 },
new List<?>[]{ l1, l2 }
);
E.cho( bslM ); assertOut( s, "{'1'=>('100', '101', '102'), '2'=>('200', '201', '202', (-null-))}" );
// Keep line number stable or this will fail
a(); assertOut( s, "[test] < (ETest.java:159) < (ETest.java:158) < (ETest.java:147)" );
} finally {
if( saveOut != null ) try {
System.setOut( saveOut );
} catch( Throwable t ){
t.printStackTrace(); //<-- goes to err
}
}
}
private void a(){ b(); }
private void b(){ c(); }
private void c(){
E._x( 3, "test" );
}
private static final Pattern CLASS_PREFIX =
Pattern.compile( "^>>> \\(ETest.java:[0-9]+\\) " );
private static final Pattern NL =
Pattern.compile( "\n$" );
private static final String EMPTY = "";
private void assertOut( StringOutputStream s, String text ){
String ref = s.toString();
ref = CLASS_PREFIX.matcher( ref ).replaceAll( EMPTY );
ref = NL.matcher( ref ).replaceAll( EMPTY );
/*
ref = ref
.replaceAll( "^>>> \\(ETest.java:[0-9]+\\) ", "" )
.replaceAll( "\n$", "" );
;
*/
assertEquals( ref, text );
s.clear();
}
}