/**
 *******************************************************************************
 * Copyright (C) 2001-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test.sample;

import com.ibm.icu.dev.test.ModuleTest;
import com.ibm.icu.dev.test.TestDataModule;
import com.ibm.icu.dev.test.TestDataModule.DataMap;

public class ModuleTestSample extends ModuleTest {
    public static void main(String[] args) throws Exception {
	new ModuleTestSample().run(args);
    }

    // standard loop, settings and cases
    public void Test01() {
	while (nextSettings()) {
	    logln("--------");
	    logln("String: " + settings.getString("aString"));
	    if (settings.isDefined("anInt")) {
		logln("Int: " + settings.getInt("anInt"));
	    }
	    logln("Boolean: " + settings.getBoolean("aBoolean"));

	    while (nextCase()) {
		logln("  ----");
		logln("  StringArray: " + printArray(testcase.getStringArray("aStringArray")));
		logln("  IntArray: " + printArray(testcase.getIntArray("anIntArray")));
		logln("  BooleanArray: " + printArray(testcase.getBooleanArray("aBooleanArray")));
	    }
	}
    }

    // loop with just cases
    public void Test02() {
	while (nextCase()) {
	    logln("----");
	    logln("String: " + testcase.getString("aString"));
	    logln("Int: " + testcase.getInt("anInt"));
	    logln("Boolean: " + testcase.getBoolean("aBoolean"));
	}
    }

    // no cases, just uses info for test
    public void Test03() {
	DataMap info = testInfo();
	if (info != null) {
	    logln(info.getString(TestDataModule.DESCRIPTION)); // standard
	    logln(info.getString("Extra")); // test-specific
	}
    }

    // no data, ModuleTest should not allow this to execute by default
    public void Test04() {
	errln("Test04 should not execute!");
    }

    // special override of validateMethod allows Test05 
    // to execute even though it has no data in the module
    protected boolean validateMethod(String methodName) {
	return methodName.equals("Test05") ? true : super.validateMethod(methodName);
    }

    // no data, but override of validateMethod allows it to execute
    public void Test05() {
	logln("Test05 executed.");
    }

    // The test data contains an error in the third case.  When getInt("Data") is
    // executed the error is logged and iteration stops.
    public void Test06() {
	while (nextCase()) {
	    logln("----");
	    logln("isGood: " + testcase.getString("IsGood"));
	    logln("  Data: " + testcase.getInt("Data"));
	}
    }

    // The test using the data reports an error, which also automatically stops iteration.
    public void Test07() {
	while (nextSettings()) {
	    int value = settings.getInt("Value");
	    while (nextCase()) {
		int factor = testcase.getInt("Factor");
		float result = (float)value / factor;
		if (result != (int)result) {
		    errln("the number '" + factor + "' is not a factor of the number '" + value + "'");
		} else {
		    logln("'" + factor + "' is a factor of '" + value + "'");
		}
	    }
	}
    }

    // The number of data elements is incorrect
    public void Test08() {
	while (nextCase()) {
	    int one = testcase.getInt("One");
	    int two = testcase.getInt("Two");
	    int three = testcase.getInt("Three");
	    logln("got: " + one + ", " + two + ", " + three);
	}
    }

    public void Test09() {
        while (nextCase()) {
            int radix = testcase.getInt("Radix");
            int[] pow = testcase.getIntArray("Power");
            int[] val = testcase.getIntArray("Value");
            logln("radix: " + radix + " pow: " + printArray(pow) + " val: " + printArray(val));
            for (int i = 0; i < pow.length; ++i) {
                if (val[i] != (int)Math.pow(radix, pow[i])) {
                    errln("radix: " + radix + " to power " + pow[i] + " != " + val[i]);
                    break;
                }
            }
        }
    }
                
    // utility print functions to display the data from the resource
    String printArray(String[] a) {
	StringBuffer buf = new StringBuffer("String[] {");
	for (int i = 0; i < a.length; ++i) {
	    if (i != 0) {
		buf.append(",");
	    }
	    buf.append(" " + a[i]);
	}
	buf.append(" }");
	return buf.toString();
    }

    String printArray(int[] a) {
	StringBuffer buf = new StringBuffer("int[] {");
	for (int i = 0; i < a.length; ++i) {
	    if (i != 0) {
		buf.append(",");
	    }
	    buf.append(" " + a[i]);
	}
	buf.append(" }");
	return buf.toString();
    }

    String printArray(boolean[] a) {
	StringBuffer buf = new StringBuffer("boolean[] {");
	for (int i = 0; i < a.length; ++i) {
	    if (i != 0) {
		buf.append(",");
	    }
	    buf.append(" " + a[i]);
	}
	buf.append(" }");
	return buf.toString();
    }
}
