package de.sciss.jcollider.test; import java.awt.EventQueue; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import de.sciss.jcollider.Bus; import de.sciss.jcollider.Constants; import de.sciss.jcollider.Server; /** * @version 0.36, 08-Oct-09 * @author Hanns Holger Rutz */ public class BusTests { private Server s = null; private final Random rnd = new Random(); public BusTests() { System.out.println( "Testing bus behaviour.\nAssuming scsynth is" + "running on udp port 57110...\n" ); try { s = new Server( "Test" ); s.start(); s.dumpIncomingOSC( Constants.kDumpText ); s.dumpOutgoingOSC( Constants.kDumpText ); iter( 0 ); } catch( IOException e1 ) { e1.printStackTrace(); } } protected void test( boolean success, String name ) { if( !success ) throw new AssertionError( name ); } protected void test( float val1, float val2, String name ) { if( val1 != val2 ) throw new AssertionError( name + " (" + val1 + " != " + val2 + ")" ); } protected void test( int val1, int val2, String name ) { if( val1 != val2 ) throw new AssertionError( name + " (" + val1 + " != " + val2 + ")" ); } protected void nextIter( Bus lastBus, final int iter ) { if( iter % 100 == 0 ) { System.out.println( "(Not freeing bus)" ); } else { lastBus.free(); } if( iter == 1000 ) { System.out.println( "\nAll tests successful!" ); System.exit( 0 ); } EventQueue.invokeLater( new Runnable() { public void run() { try { iter( iter ); } catch( IOException e1 ) { e1.printStackTrace(); } } }); } protected void iter( final int iter ) throws IOException { final int numCh = rnd.nextInt( 32 ) + 1; final Bus b = Bus.control( s, numCh ); System.out.print( "#" + iter + " test " + b ); if( iter < 333 ) { System.out.println( " : single set / get" ); final float val1 = rnd.nextFloat(); b.set( val1 ); b.get( new Bus.GetCompletionAction() { public void completion( Bus bus, float[] values ) { test( values.length, 1, "numChannels" ); for( int i = 0; i < values.length; i++ ) { test( values[ i ], val1, "value at " + i ); } nextIter( b, iter + 1 ); } }); } else if( iter < 667 ) { System.out.println( " : multi set / get" ); final int numVals = rnd.nextInt( b.getNumChannels() ) + 1; final float[] vals = new float[ numVals ]; for( int i = 0; i < numVals; i++ ) { vals[ i ] = rnd.nextFloat(); } final List collOff = new ArrayList( b.getNumChannels() ); for( int i = 0; i < b.getNumChannels(); i++ ) { collOff.add( new Integer( i )); } final int offsets[] = new int[ numVals ]; for( int i = 0; i < numVals; i++ ) { offsets[ i ] = ((Integer) collOff.remove( rnd.nextInt( collOff.size() ))).intValue(); } b.set( offsets, vals ); b.get( offsets, new Bus.GetCompletionAction() { public void completion( Bus bus, float[] values ) { test( values.length, numVals, "numChannels" ); for( int i = 0; i < values.length; i++ ) { test( values[ i ], vals[ i ], "value at " + i ); } nextIter( b, iter + 1 ); } }); } else { System.out.println( " : multi setn / getn" ); final int numIntervals = Math.min( 4, rnd.nextInt( b.getNumChannels() ) + 1 ); final int numChans[] = new int[ numIntervals ]; final int offsets[] = new int[ numIntervals ]; final float[][] vals = new float[ numIntervals ][]; for( int i = 0, off = 0; i < numIntervals; i++ ) { //System.out.println( "i = " + i + "; off " + off + "; numInt = " + numIntervals + "; numCh = " + b.getNumChannels() ); final int skip = Math.max( 1, rnd.nextInt( (b.getNumChannels() - off) - (numIntervals - i) + 1 )); offsets[ i ] = off; numChans[ i ] = rnd.nextInt( skip ) + 1; vals[ i ] = new float[ numChans[ i ]]; for( int j = 0; j < numChans[ i ]; j++ ) { vals[ i ][ j ] = rnd.nextFloat(); } off += skip; } b.setn( offsets, vals ); b.getn( offsets, numChans, new Bus.GetCompletionAction() { public void completion( Bus bus, float[] values ) { for( int i = 0, j = 0; i < numIntervals; i++ ) { for( int k = 0; k < numChans[ i ]; k++, j++ ) { test( values[ j ], vals[ i ][ k ], "value at " + j ); } } nextIter( b, iter + 1 ); } }); } } }