/*
 *******************************************************************************
 * Copyright (C) 2002-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

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

import java.util.Comparator;

public class TestComparator {

    // test the symmetry and transitivity
    public void test(Comparator comp, int count) {
        Object c = null;
        Object b = newObject(c);
        Object a = newObject(b);
        int compab = comp.compare(a,b);
        while (--count >= 0) {
            // rotate old values
            c = b;
            b = a;
            int compbc = compab;
            
            // allocate new and get comparisons
            a = newObject(b);
            compab = comp.compare(a,b);
            int compba = comp.compare(b,a);
            int compac = comp.compare(a,c);
            
            // check symmetry
            if (compab != -compba) {
                log("Symmetry Failure", new Object[] {a, b});
            }
            
            // check transitivity
            check(a, b, c,  compab,  compbc,  compac);
            check(a, c, b,  compab, -compbc,  compab);
            check(b, a, c, -compab,  compac,  compbc);
            check(b, c, a,  compbc, -compac, -compab);
            check(c, a, b, -compac,  compab, -compbc);
            check(c, b, a, -compbc, -compab, -compac);
        }
    }
    
    private void check(Object a, Object b, Object c, 
      int compab, int compbc, int compac) {
        if (compab <= 0 && compbc <= 0 && !(compac <= 0)) {
            log("Transitivity Failure", new Object[] {a, b, c});             
        }
    }
   
    public Object newObject(Object c) {
        // return a new object
        return "";
    }
    
    public String format(Object c) {
        // return a new object
        return c.toString();
    }
    
    public void log(String title, Object[] arguments) {
        String result = title + ": [";
        for (int i = 0; i < arguments.length; ++i) {
            if (i != 0) result += ", ";
            result += format(arguments[i]);
        }
        result += "]";
        throw new RuntimeException(result);
    }
}
