import junit.framework.TestCase;
import java.util.Random;



public class MatrixTest extends TestCase 
{

    private final int ANZAHL = 10; 
    private final int WIEDERHOLUNGEN = 100 ; 
    private final int DIM = 5 ; 
    private final double EPSILON = 1E-14 ;

    private Matrix[] dieMatrizen ;
    private Random gen ;

    protected void setUp() 
    {
 
	dieMatrizen = new Matrix[ANZAHL] ; 
	gen = new Random() ;
	double hilf[][] = new double[DIM][DIM] ;
	for ( int num = 0 ; num < ANZAHL ; num++ ) 
	    {
		for ( int i = 0 ;  i < DIM ; i++ )
		    for ( int j = 0 ;  j < DIM ; j++ )
			hilf[i][j] = gen.nextDouble() ;
		dieMatrizen[num] = new Matrix( hilf ) ; 
	    } 
    }


    protected void tearDown() 
    {
	for ( int num = 0 ; num < ANZAHL ; num++ )
	    dieMatrizen[num] = null ;
	gen = null ;
    }


    public void testMultiply()
    {
	Matrix produkt ;
	Vektor test ; 
	Vektor v1 ;
	Vektor v2 ; 
	double[] hilf = new double[DIM] ; 
	for ( int i = 0 ; i < ANZAHL ; i++ )
	    for ( int j = 0 ; j < ANZAHL ; j++ ) 
		{
		    produkt = dieMatrizen[i].multiply( dieMatrizen[j] ) ;
		    for ( int w = 0 ; w < WIEDERHOLUNGEN ; w++ ) 
			{ 
			    for ( int k = 0 ; k < DIM ; k++ ) 
				hilf[k] = gen.nextDouble() ;
		            test = new Vektor( hilf ) ;
			    v1 = dieMatrizen[i].multiply( dieMatrizen[j].multiply( test ) ) ;
			    v2 = produkt.multiply( test ) ;
			    for ( int k = 0 ; k < DIM ; k++ ) 
				assertEquals( "Fehler bei Test Nr. " + i + "," + j + " an der Stelle " + k , 
					      v1.getB()[k] , v2.getB()[k] , v1.getB()[k]*EPSILON ) ;
			}
		}
    }


    public static void main(String[] args) 
    {
	Class testklasse = MatrixTest.class;
	junit.textui.TestRunner.run(testklasse);
    }

}
