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

import static org.junit.Assert.*;

import org.junit.Test;

/**
 * @author mohsen
 *
 */
public class RelationCoreMagicNumbersTest {
    
    int maxRank = RelationCore.MaxRank; // for loops over all possible relation ranks to use
    /**
     * Test method for {@link edu.neu.ccs.evergreen.ir.RelationCore#getMagicNumber(int, int, int)}.
     * check that the magic number at 0 is the 1's complement of that of 1
     * Check using the known magic numbers for rank 3
     */
    @Test
    public void testGetMagicNumber() {
        //Check that magic(n,m,0) is the 1's complement of magic(n,m,1)
        for(int rank=1; rank <= maxRank; rank++){
            int allOnes = RelationCore.getMask(rank);
            for(int variablePosition=0; variablePosition<rank; variablePosition++){
                int m0 = RelationCore.getMagicNumber(rank, variablePosition, 0);
                int m1 = RelationCore.getMagicNumber(rank, variablePosition, 1);
                int sum = m0+m1;
                System.out.println("rank:"+rank+" vPos:"+variablePosition+" m0:"+m0+" m1:"+m1+" sum:"+sum+" AllOnes"+allOnes);
                assertTrue(allOnes==sum);
            }
            System.out.println("================");
        }
        
        //magic numbers for rank 1
        assertTrue(RelationCore.getMagicNumber(1, 0, 0)==0x1);
        assertTrue(RelationCore.getMagicNumber(1, 0, 1)==0x2);
        //magic numbers for rank 2
        assertTrue(RelationCore.getMagicNumber(2, 0, 0)==0x5);
        assertTrue(RelationCore.getMagicNumber(2, 0, 1)==0xA);
        assertTrue(RelationCore.getMagicNumber(2, 1, 0)==0x3);
        assertTrue(RelationCore.getMagicNumber(2, 1, 1)==0xC);
        //magic numbers for rank 3 in Hex
        assertTrue(RelationCore.getMagicNumber(3, 0, 0)==0x55);
        assertTrue(RelationCore.getMagicNumber(3, 0, 1)==0xAA);
        assertTrue(RelationCore.getMagicNumber(3, 1, 0)==0x33);
        assertTrue(RelationCore.getMagicNumber(3, 1, 1)==0xCC);
        assertTrue(RelationCore.getMagicNumber(3, 2, 0)==0x0F);
        assertTrue(RelationCore.getMagicNumber(3, 2, 1)==0xF0);
        //magic numbers for rank 3 in Decimal (Well Known
        assertTrue(RelationCore.getMagicNumber(3, 0, 0)==85);
        assertTrue(RelationCore.getMagicNumber(3, 0, 1)==170);
        assertTrue(RelationCore.getMagicNumber(3, 1, 0)==51);
        assertTrue(RelationCore.getMagicNumber(3, 1, 1)==204);
        assertTrue(RelationCore.getMagicNumber(3, 2, 0)==15);
        assertTrue(RelationCore.getMagicNumber(3, 2, 1)==240);
        //magic numbers for rank 4
        assertTrue(RelationCore.getMagicNumber(4, 0, 0)==0x5555);
        assertTrue(RelationCore.getMagicNumber(4, 0, 1)==0xAAAA);
        assertTrue(RelationCore.getMagicNumber(4, 1, 0)==0x3333);
        assertTrue(RelationCore.getMagicNumber(4, 1, 1)==0xCCCC);
        assertTrue(RelationCore.getMagicNumber(4, 2, 0)==0x0F0F);
        assertTrue(RelationCore.getMagicNumber(4, 2, 1)==0xF0F0);
        assertTrue(RelationCore.getMagicNumber(4, 3, 0)==0x00FF);
        assertTrue(RelationCore.getMagicNumber(4, 3, 1)==0xFF00);
        //magic numbers for rank 5
        assertTrue(RelationCore.getMagicNumber(5, 0, 0)==0x55555555);
        assertTrue(RelationCore.getMagicNumber(5, 0, 1)==0xAAAAAAAA);
        assertTrue(RelationCore.getMagicNumber(5, 1, 0)==0x33333333);
        assertTrue(RelationCore.getMagicNumber(5, 1, 1)==0xCCCCCCCC);
        assertTrue(RelationCore.getMagicNumber(5, 2, 0)==0x0F0F0F0F);
        assertTrue(RelationCore.getMagicNumber(5, 2, 1)==0xF0F0F0F0);
        assertTrue(RelationCore.getMagicNumber(5, 3, 0)==0x00FF00FF);
        assertTrue(RelationCore.getMagicNumber(5, 3, 1)==0xFF00FF00);
        assertTrue(RelationCore.getMagicNumber(5, 4, 0)==0x0000FFFF);
        assertTrue(RelationCore.getMagicNumber(5, 4, 1)==0xFFFF0000);       
    }

}