/**
*******************************************************************************
* Copyright (C) 1996-2003, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/util/VersionInfoTest.java,v $ 
* $Date: 2003/06/03 18:49:31 $ 
* $Revision: 1.7 $
*
*******************************************************************************
*/


package com.ibm.icu.dev.test.util;


import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.util.VersionInfo;


/**
* Testing class for VersionInfo
* @author Syn Wee Quek
* @since release 2.1 March 01 2002
*/
public final class VersionInfoTest extends TestFmwk 
{ 
    // constructor ---------------------------------------------------
  
    /**
    * Constructor
    */
    public VersionInfoTest()
    {
    }

    // public methods -----------------------------------------------
    
    public static void main(String arg[]) 
    {
        VersionInfoTest test = new VersionInfoTest();
        try {
	        test.run(arg);
        } catch (Exception e) {
        	test.errln("Error testing VersionInfo");
        }
    }
    
    /**
     * Test that the instantiation works
     */
    public void TestInstance()
    {
    	VersionInfo version=null;
    	for (int i = 0; i < INSTANCE_INVALID_STRING_.length; i ++) {
    		try {
    			version = 
    			        VersionInfo.getInstance(INSTANCE_INVALID_STRING_[i]);
    			errln("\"" + INSTANCE_INVALID_STRING_[i] + 
    			      "\" should produce an exception");
    		} catch (RuntimeException e) {
    		}
    	}
    	for (int i = 0; i < INSTANCE_VALID_STRING_.length; i ++) {
	    	try {
	    		version = VersionInfo.getInstance(INSTANCE_VALID_STRING_[i]);
	    	} catch (RuntimeException e) {
	    		errln("\"" + INSTANCE_VALID_STRING_[i] + 
	    		      "\" should produce an valid version");
	    	}
    	}
    	for (int i = 0; i < INSTANCE_INVALID_INT_.length; i ++) {
	    	try {
	    		version = getInstance(INSTANCE_INVALID_INT_[i]);
	    		errln("invalid ints should produce an exception");
	    	} catch (RuntimeException e) {
	    	}
    	}
    	for (int i = 0; i < INSTANCE_VALID_INT_.length; i ++) {
	    	try {
	    		version = getInstance(INSTANCE_VALID_INT_[i]);
	    	} catch (RuntimeException e) {
	    		errln("valid ints should not produce an exception");
	    	}
    	}
        if(version==null){};
    }
    
    /**
     * Test that the comparison works
     */
    public void TestCompare()
    {
    	for (int i = 0; i < COMPARE_NOT_EQUAL_STRING_.length; i += 2) {
    		VersionInfo v1 = 
    		            VersionInfo.getInstance(COMPARE_NOT_EQUAL_STRING_[i]);
    		VersionInfo v2 = 
    		        VersionInfo.getInstance(COMPARE_NOT_EQUAL_STRING_[i + 1]);
    		if (v1.compareTo(v2) == 0) {
    			errln(COMPARE_NOT_EQUAL_STRING_[i] + " should not equal " +
    			      COMPARE_NOT_EQUAL_STRING_[i + 1]);
    		}
    	}
    	for (int i = 0; i < COMPARE_NOT_EQUAL_INT_.length; i += 2) {
    		VersionInfo v1 = getInstance(COMPARE_NOT_EQUAL_INT_[i]);
    		VersionInfo v2 = getInstance(COMPARE_NOT_EQUAL_INT_[i + 1]);
    		if (v1.compareTo(v2) == 0) {
    			errln(COMPARE_NOT_EQUAL_INT_[i] + " should not equal " +
    			      COMPARE_NOT_EQUAL_INT_[i + 1]);
    		}
    	}
    	for (int i = 0; i < COMPARE_EQUAL_STRING_.length - 1; i ++) {
    		VersionInfo v1 = 
    		            VersionInfo.getInstance(COMPARE_EQUAL_STRING_[i]);
    		VersionInfo v2 = 
    		        VersionInfo.getInstance(COMPARE_EQUAL_STRING_[i + 1]);
    		if (v1.compareTo(v2) != 0) {
    			errln(COMPARE_EQUAL_STRING_[i] + " should equal " +
    			      COMPARE_EQUAL_STRING_[i + 1]);
    		}
    	}
    	for (int i = 0; i < COMPARE_EQUAL_INT_.length - 1; i ++) {
    		VersionInfo v1 = getInstance(COMPARE_EQUAL_INT_[i]);
    		VersionInfo v2 = getInstance(COMPARE_EQUAL_INT_[i + 1]);
    		if (v1.compareTo(v2) != 0) {
    			errln(COMPARE_EQUAL_INT_[i] + " should equal " +
    			      COMPARE_EQUAL_INT_[i + 1]);
    		}
    	}
    	for (int i = 0; i < COMPARE_LESS_.length - 1; i ++) {
    		VersionInfo v1 = VersionInfo.getInstance(COMPARE_LESS_[i]);
    		VersionInfo v2 = VersionInfo.getInstance(COMPARE_LESS_[i + 1]);
    		if (v1.compareTo(v2) >= 0) {
    			errln(COMPARE_LESS_[i] + " should be less than " + 
    			      COMPARE_LESS_[i + 1]);
    		}
    		if (v2.compareTo(v1) <= 0) {
    			errln(COMPARE_LESS_[i + 1] + " should be greater than " + 
    			      COMPARE_LESS_[i]);
    		}
    	}
    }
    
    /**
     * Test that the getter function works
     */
    public void TestGetter()
    {
    	for (int i = 0; i < GET_STRING_.length; i ++) {
    		VersionInfo v = VersionInfo.getInstance(GET_STRING_[i]);
    		if (v.getMajor() != GET_RESULT_[i << 2] ||
    		    v.getMinor() != GET_RESULT_[(i << 2) + 1] ||
    		    v.getMilli() != GET_RESULT_[(i << 2) + 2] ||
    		    v.getMicro() != GET_RESULT_[(i << 2) + 3]) {
    		    errln(GET_STRING_[i] + " should return major=" + 
    		          GET_RESULT_[i << 2] + " minor=" + 
    		          GET_RESULT_[(i << 2) + 1] + " milli=" + 
    		          GET_RESULT_[(i << 2) + 2] + " micro=" +
    		          GET_RESULT_[(i << 2) + 3]);  
    		}
    		v = getInstance(GET_INT_[i]);
    		if (v.getMajor() != GET_RESULT_[i << 2] ||
    		    v.getMinor() != GET_RESULT_[(i << 2) + 1] ||
    		    v.getMilli() != GET_RESULT_[(i << 2) + 2] ||
    		    v.getMicro() != GET_RESULT_[(i << 2) + 3]) {
    		    errln(GET_STRING_[i] + " should return major=" + 
    		          GET_RESULT_[i << 2] + " minor=" + 
    		          GET_RESULT_[(i << 2) + 1] + " milli=" + 
    		          GET_RESULT_[(i << 2) + 2] + " micro=" +
    		          GET_RESULT_[(i << 2) + 3]);  
    		}
    	}
    }
    
    /**
     * Test toString()
     */
	public void TesttoString() 
	{
		for (int i = 0; i < TOSTRING_STRING_.length; i ++) {
    		VersionInfo v = VersionInfo.getInstance(TOSTRING_STRING_[i]);
    		if (!v.toString().equals(TOSTRING_RESULT_[i])) {
    	    	errln("toString() for " + TOSTRING_STRING_[i] + 
    	    	      " should produce " + TOSTRING_RESULT_[i]);
    		}
    		v = getInstance(TOSTRING_INT_[i]);
    		if (!v.toString().equals(TOSTRING_RESULT_[i])) {
    	    	errln("toString() for " + TOSTRING_INT_[i] + 
    	    	      " should produce " + TOSTRING_RESULT_[i]);
    		}
		}
	}
	
	// private methods --------------------------------------------------
	
	/**
	 * int array versioninfo creation
	 */
	private static VersionInfo getInstance(int data[])
	{
		switch (data.length) {
	    	case 1:
	    		return VersionInfo.getInstance(data[0]);
	    	case 2:
	    		return VersionInfo.getInstance(data[0], data[1]);
	    	case 3:
	    		return VersionInfo.getInstance(data[0], data[1], data[2]);
	    	default:
	    		return VersionInfo.getInstance(data[0], data[1], data[2], 
	    		                               data[3]);
		}
	}
	
	// private data members --------------------------------------------
	
	/**
	 * Test instance data
	 */
	private static final String INSTANCE_INVALID_STRING_[] = {
		"a",
		"-1",
		"-1.0",
		"-1.0.0",
		"-1.0.0.0",
		"0.-1",
		"0.0.-1",
		"0.0.0.-1",
		"256",
		"256.0",
		"256.0.0",
		"256.0.0.0",
		"0.256",
		"0.0.256",
		"0.0.0.256",
		"1.2.3.4.5"
	};
	private static final String INSTANCE_VALID_STRING_[] = {
		"255",
		"255.255",
		"255.255.255",
		"255.255.255.255"
	};
	private static final int INSTANCE_INVALID_INT_[][] = {
		{-1},
		{-1, 0},
		{-1, 0, 0},
		{-1, 0, 0, 0},
		{0, -1},
		{0, 0, -1},
		{0, 0, 0, -1},
		{256},
		{256, 0},
		{256, 0, 0},
		{256, 0, 0, 0},
		{0, 256},
		{0, 0, 256},
		{0, 0, 0, 256},
	};
	private static final int INSTANCE_VALID_INT_[][] = {
		{255},
		{255, 255},
		{255, 255, 255},
		{255, 255, 255, 255}
	};
	
	/**
	 * Test compare data
	 */
	private static final String COMPARE_NOT_EQUAL_STRING_[] = {
		"2.0.0.0", "3.0.0.0"
	};
	private static final int COMPARE_NOT_EQUAL_INT_[][] = {
		{2, 0, 0, 0}, {3, 0, 0, 0}
	};
	private static final String COMPARE_EQUAL_STRING_[] = {
		"2.0.0.0", "2.0.0", "2.0", "2"
	};
	private static final int COMPARE_EQUAL_INT_[][] = {
		{2}, {2, 0}, {2, 0, 0}, {2, 0, 0, 0}	
	};
	private static final String COMPARE_LESS_[] = {
		"0", "0.0.0.1", "0.0.1", "0.1", "1", "2", "2.1", "2.1.1", "2.1.1.1"
	};
	
	/**
	 * Test Getter data
	 */
	private static final String GET_STRING_[] = {
		"0",
		"1.1",
		"2.1.255",
		"3.1.255.100"
	};
	private static final int GET_INT_[][] = {
		{0},
		{1, 1},
		{2, 1, 255},
		{3, 1, 255, 100}
	};
	private static final int GET_RESULT_[] = {
		0, 0, 0, 0,
		1, 1, 0, 0,
		2, 1, 255, 0,
		3, 1, 255, 100
	};
	
	/**
	 * Test toString data
	 */
	private static final String TOSTRING_STRING_[] = {
		"0",
		"1.1",
		"2.1.255",
		"3.1.255.100"	
	};
	private static final int TOSTRING_INT_[][] = {
		{0},
		{1, 1},
		{2, 1, 255},
		{3, 1, 255, 100}
	};
	private static final String TOSTRING_RESULT_[] = {
		"0.0.0.0",
		"1.1.0.0",
		"2.1.255.0",
		"3.1.255.100"	
	};
}