/**
 * 
 */
package edu.neu.ccs.evergreen.ir;

import static org.junit.Assert.*;

import org.junit.Test;

/**
 * @author mohsen
 *
 */
public class RelationCoreIrrelevantVariables {
    
    int maxRank = RelationCore.MaxRank; // for loops over all possible relation ranks to use
    /**
     * Test method for {@link edu.neu.ccs.evergreen.ir.RelationCore#isIrrelevant(int, int, int)}.
     */
    @Test
    public final void testIsIrrelevant() {
        //A relation which is one of the magic numbers
        //Must be independent of the rest of the variables
        for(int rank=1;rank<=maxRank;rank++){
            for(int variablePosition=0;variablePosition<rank;variablePosition++){
                for(int value=0;value<=1;value++){
                    //System.out.println(""+variablePosition+", "+value);
                    int relationNumber = RelationCore.getMagicNumber(rank, variablePosition, value);
                    for(int otherVariablePosition=0;otherVariablePosition<rank;otherVariablePosition++){
                        if(otherVariablePosition==variablePosition) continue;
                        assertTrue(RelationCore.isIrrelevant(relationNumber, rank, otherVariablePosition));
                    }
                }
            }
            //System.out.println(""+rank);
        }
        //A relation which is all 0 or all 1 is independent of all of its variables
        for(int rank=1;rank<=maxRank;rank++){
            for(int variablePosition=0;variablePosition<rank;variablePosition++){
                int r1 = 0;
                int r2 = RelationCore.getMask(rank);
                assertTrue(RelationCore.isIrrelevant(r1, rank, variablePosition));
                assertTrue(RelationCore.isIrrelevant(r2, rank, variablePosition));
            }
        }
    }
    /**
     * Test method for {@link edu.neu.ccs.evergreen.ir.RelationCore#numberOfRelevantVariables(int, int)}.
     */
    @Test
    public final void testNumberOfRelevantVariables() {
        //A relation which is one of the magic numbers
        //Must have one relevant variable
        for(int rank=1;rank<=maxRank;rank++){
            for(int variablePosition=0;variablePosition<rank;variablePosition++){
                for(int value=0;value<=1;value++){
                    //System.out.println(""+variablePosition+", "+value);
                    int relationNumber = RelationCore.getMagicNumber(rank, variablePosition, value);
                    assertTrue(RelationCore.numberOfRelevantVariables(relationNumber, rank)==1);
                }
            }
            //System.out.println(""+rank);
        }
        // A relation which is all 0 or all 1 is independent of all of its variables
        for(int rank=1;rank<=maxRank;rank++){
            int r1 = 0;
            int r2 = RelationCore.getMask(rank);
            assertTrue(RelationCore.numberOfRelevantVariables(r1, rank)==0);
            assertTrue(RelationCore.numberOfRelevantVariables(r2, rank)==0);
        }       
    }
        
    //TODO: add cross check using reduction
}