package org.jcodec.common.dct;

import static org.jcodec.common.dct.IntDCT.DESCALE;
import static org.jcodec.common.dct.IntDCT.range_limit;

import java.nio.IntBuffer;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

public class IntDCTTest {
    
    @Test
    @Ignore
    public void testPerformance() throws Exception {
        int[] input = new int[] { -416, -33, -60, 32, 48, -40, 0, 0, 0, -24,
                -56, 19, 26, 0, 0, 0, -42, 13, 80, -24, -40, 0, 0, 0, -56, 17,
                44, -29, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IntDCT dct = new IntDCT();
        int count = 40000000;
        IntBuffer ws = IntBuffer.allocate(64);
        IntBuffer out = IntBuffer.allocate(64);
        IntBuffer inptr = IntBuffer.wrap(input);
        long start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            ws.clear();
            out.clear();
            inptr.clear();
            dct.decode(inptr, ws, out);
        }
        long time = System.currentTimeMillis() - start;
        long kdctPerSec = count / time;
        System.out.println(kdctPerSec + "kdct/sec");
    }
    
    @Test
    public void testRangeLimit() {
        Assert.assertEquals(-128 & 0xff, range_limit(0));
        Assert.assertEquals(-127 & 0xff, range_limit(1));
        Assert.assertEquals(-1 & 0xff, range_limit(133));
        Assert.assertEquals(126, range_limit(1022));

        for (int i = -256; i < 1024; i++) {
            System.out.printf("range_limit(%4d) == %4d\n", i, range_limit(i));
        }
    }
    
    @Test
    public void testDescale() {
        Assert.assertEquals(-4063, DESCALE(-8321313, 11));
        Assert.assertEquals(18, DESCALE(36362, 11));
    }

}
