package edu.neu.ccs.evergreen.ir;

import static org.junit.Assert.*;

import org.junit.Test;

public class RelationCoreNmapTest {

    int maxRank = RelationCore.MaxRank;
    @Test
    public final void testNMap() {
        //Nmaping a magic number produces the complementing magic number
        for(int rank=1;rank<maxRank;rank++){
            for(int variablePosition=0;variablePosition<rank;variablePosition++){
                for(int value=0;value<=1;value++){
                    int relationNumber = RelationCore.getMagicNumber(rank, variablePosition, value);
                    int nMappedRelationNumber = RelationCore.nMap(relationNumber, rank, variablePosition);
                    int mask = RelationCore.getMask(rank);
                    assertTrue((mask-nMappedRelationNumber)==relationNumber);
                }
            }
        }
        //Nmaping a relation for the same variable twice produces the same relation
        for(int rank=1;rank<maxRank;rank++){
            if(RelationCore.getMask(rank)>0){
                for(int relationNumber=0;relationNumber<RelationCore.getMask(rank);relationNumber++){
                    for(int variablePosition=0;variablePosition<rank;variablePosition++){
                        int nMappedRelationNumber = RelationCore.nMap(relationNumber, rank, variablePosition);
                        int originalRelationNumber = RelationCore.nMap(nMappedRelationNumber, rank, variablePosition);
                        //System.out.println(relationNumber+","+originalRelationNumber);
                        
                        assertTrue(relationNumber==originalRelationNumber);
                    }
                }
            }else{
                for(int relationNumber=0xFFFFFFFF;relationNumber<0x7FFFFFFE;relationNumber++){
                    for(int variablePosition=0;variablePosition<rank;variablePosition++){
                        int nMappedRelationNumber = RelationCore.nMap(relationNumber, rank, variablePosition);
                        int originalRelationNumber = RelationCore.nMap(nMappedRelationNumber, rank, variablePosition);
                        //System.out.println(relationNumber+","+originalRelationNumber);
                        
                        assertTrue(relationNumber==originalRelationNumber);
                    }                   
                }
                for(int variablePosition=0;variablePosition<rank;variablePosition++){
                    int relationNumber =  0x7FFFFFFF;
                    int nMappedRelationNumber = RelationCore.nMap(relationNumber, rank, variablePosition);
                    int originalRelationNumber = RelationCore.nMap(nMappedRelationNumber, rank, variablePosition);
                    //System.out.println(relationNumber+","+originalRelationNumber);
                    
                    assertTrue(relationNumber==originalRelationNumber);
                }

            }
        }
    }

}