/**
 * @author Ognjen Savkovic (ognjen.savkovic@unibz.it)
 * 
 * This class tests methods from ArrayUtility
 */
public class testArrayUtility {
	
	
	public static void main(String[] args) {
								 
		testMethodsLab1();
		testMethodsLab2();
		
	}

	public static void testMethodsLab1(){
		
		testFindMax();
		testFindMaxPos();
		testFindMin();
		testFindMinPos();
		testShiftRight();
		testShiftLeft();
		testCreateRandomArray();
		testCreateRandomMatrix();
		testFindInSortedArray();
		testFindFirstInSortedArray();
		testMaxSortShiftRight();
		testMaxSortSwap();
		
	}
	
	public static void testMethodsLab2(){
		
		testBubbleSort();
		testFindMinMBubbleSort();
		
	}
	
	
	
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	// LAB 1
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////

	public static void testFindMax(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;
		
		System.out.println("testFindMax");
		printIntArray("A",A);
		System.out.println("The maximal element between i and j in A is: "+ArrayUtility.findMax(A,i,j));
		System.out.println();
		
	}
	
	public static void testFindMaxPos(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;
		
		System.out.println("testFindMaxPos");
		printIntArray("A",A);
		System.out.println("The (first) position of maximal element between i and j in A is: "+ArrayUtility.findMaxPos(A,i,j));
		System.out.println();
	}
	
	public static void testFindMin(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;
		
		System.out.println("testFindMin");
		printIntArray("A",A);
		System.out.println("The minimal element between i and j in A is: "+ArrayUtility.findMin(A,i,j));
		System.out.println();
	}
	
	public static void testFindMinPos(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;
		
		System.out.println("testFindMinPos");
		printIntArray("A",A);
		System.out.println("The (first) position of minimal element between i and j in A is: "+ArrayUtility.findMinPos(A,i,j));
		System.out.println();
	}
	
	public static void testShiftRight(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;
		
		System.out.println("testShiftRight");
		printIntArray("A",A);
		ArrayUtility.shiftRight(A,i,j);
	    System.out.println("Shift on the right all the elements in A from position 2 to 5:");
	    printIntArray("A",A);
	    System.out.println();
	}
	
	public static void testShiftLeft(){
		int [] A = { 1, -2, 3, 9, 8, 11, -5, 4};
		int i = 2;
		int j = 5;		
		 
		System.out.println("testShiftLeft");
		printIntArray("A",A);
		ArrayUtility.shiftLeft(A,i,j);
		System.out.println("Shift on the left all the elements in A from position 2 to 5: ");
		printIntArray("A",A);
		System.out.println();
	}
	
	public static void testCreateRandomArray(){
		
		 int [] C = ArrayUtility.createRandomArray(5,10,15);
		
		 System.out.println("testCreateRandomArray");
		 System.out.println("Returns an array of size 5 of random elements betweeb 10 and 15");
		 printIntArray("C",C);
		 System.out.println();
	}
	
	
	public static void testCreateRandomMatrix(){
		
	    int [][] D = ArrayUtility.createRandomMatrix(5,5,1,15);
	    
		System.out.println("testCreateRandomMatrix");
	    System.out.println("Returns a matrix of size 5x5 of random elements between 1 and 15");
	    System.out.println("D=");
	    for(int[] k:D){
	    	for(int l:k)
	          System.out.print(" "+l);
	    	System.out.print("\n");
	    }
		System.out.println();
		 
	}
	
	
	public static void testFindInSortedArray(){
		 
		 int [] F = { -11, -3, -1, 2, 8, 11, 15, 23};
		    
		 System.out.println("testFindInSortedArray");
		 printIntArray("F",F);
		 System.out.println("findInSortedArray(F,15):"+ArrayUtility.findInSortedArray(F,15));
		 System.out.println("findInSortedArray(F,13):"+ArrayUtility.findInSortedArray(F,13));
		 System.out.println();
	    
	}
	
	
	public static void testFindFirstInSortedArray(){
		 	  
	    int [] G = { -11, -3, -3, -1, 2, 2, 2, 8, 11, 11, 15, 23};
	    
	    System.out.println("testFindInSortedArray");
		printIntArray("G",G);
		System.out.println("findFirstInSortedArray(G,2):"+ArrayUtility.findFirstInSortedArray(G,2));
		System.out.println("findFirstInSortedArray(G,13):"+ArrayUtility.findFirstInSortedArray(G,13));
		System.out.println();
	    
	    
	}
	
	
	public static void testMaxSortShiftRight(){
			  
	    int [] H = { 1, -2, 3, 9, -8, 11, -5, 4};
	     
	    System.out.println("testMaxSortShiftRight");
		printIntArray("H",H);
		ArrayUtility.maxSortShiftRight(H);
		System.out.println("maxSortShiftRight(H):");
		printIntArray("H",H);
		System.out.println();
	       
	}
	
	

	public static void testMaxSortSwap(){
		 
	    int [] J = { 1, -2, 3, 9, -8, 11, -5, 4};
	    
	    System.out.println("testMaxSortSwap");
		printIntArray("J",J);
		ArrayUtility.maxSortSwap(J);
		System.out.println("maxSortSwap(J):");
		printIntArray("J",J);
		System.out.println();
	   	        
	    
	}
	
	//////////////////////////////////////////////////////////////////
	// Auxiliary methods for printing arrays
	
	public static void printIntArray(String arrayName, int []A){
		System.out.println(arrayName+"=");
		for(int i=0; i<A.length; i++)
			System.out.print(" "+A[i]);
		System.out.println("");
	}
	
	public static void printLongArray(String arrayName, long []A){
		System.out.println(arrayName+"=");
		for(int i=0; i<A.length; i++)
			System.out.print(" "+A[i]);
		System.out.println("");
	}

	
	
	
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	// LAB 2
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////

	
	public static void testBubbleSort(){
		int [] A = {-1, -10, 3, 4, 5, 0, -15, 7, 4};
		
		System.out.println("testBubbleSort");
		printIntArray("A",A);
		ArrayUtility.bubbleSort(A);
		System.out.println("bubbleSort(A):");
		printIntArray("A",A);
		System.out.println();

	}
	
	
	public static void testFindMinMBubbleSort(){
		System.out.println("FindMinMBubbleSort()="+ArrayUtility.findMinMBubbleSort());
	}
	


	
	
}