package org.spongycastle.util.encoders.test;

import java.util.Arrays;
import java.util.Random;

import org.spongycastle.util.encoders.Base64;
import org.spongycastle.util.encoders.Hex;
import org.spongycastle.util.test.SimpleTest;

public class EncoderTest
    extends SimpleTest
{
    public static final boolean DEBUG = true;


    public static void main(
        String[]    args)
    {
        runTest(new EncoderTest());
    }

    public String getName()
    {
        return "Encoder";
    }
    
    /*
     *
     *  TESTS
     *
     */

    public void performTest()
    {
        testHex();
        testBase64();
        testBase64WithNL();
    }
    
    
    public void testBase64()
    {
        try
        {
            Random _r = new Random();
            
            byte[] _orig1024 = new byte[1024];
            _r.nextBytes(_orig1024);
            
            byte[] _orig2048 = new byte[2048];
            _r.nextBytes(_orig2048);
            
            byte[] _orig4096 = new byte[4096];
            _r.nextBytes(_orig4096);
            
            byte[] _orig8192 = new byte[8192];
            _r.nextBytes(_orig8192);
            
            byte[] _enc1024 = Base64.encode(_orig1024);
            byte[] _enc2048 = Base64.encode(_orig2048);
            byte[] _enc4096 = Base64.encode(_orig4096);
            byte[] _enc8192 = Base64.encode(_orig8192);
            
            byte[] _dec1024 = Base64.decode(_enc1024);
            byte[] _dec2048 = Base64.decode(_enc2048);
            byte[] _dec4096 = Base64.decode(_enc4096);
            byte[] _dec8192 = Base64.decode(_enc8192);
            
            if(!Arrays.equals(_orig1024, _dec1024))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig2048, _dec2048))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig4096, _dec4096))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig8192, _dec8192))
            {
                fail("Failed Base64 test");
            }
            
            
            
            byte[] _orig1025 = new byte[1025];
            _r.nextBytes(_orig1025);
            
            byte[] _orig2049 = new byte[2049];
            _r.nextBytes(_orig2049);
            
            byte[] _orig4097 = new byte[4097];
            _r.nextBytes(_orig4097);
            
            byte[] _orig8193 = new byte[8193];
            _r.nextBytes(_orig8193);
            
            byte[] _enc1025 = Base64.encode(_orig1025);
            byte[] _enc2049 = Base64.encode(_orig2049);
            byte[] _enc4097 = Base64.encode(_orig4097);
            byte[] _enc8193 = Base64.encode(_orig8193);
            
            byte[] _dec1025 = Base64.decode(_enc1025);
            byte[] _dec2049 = Base64.decode(_enc2049);
            byte[] _dec4097 = Base64.decode(_enc4097);
            byte[] _dec8193 = Base64.decode(_enc8193);
            
            if(!Arrays.equals(_orig1025, _dec1025))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig2049, _dec2049))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig4097, _dec4097))
            {
                fail("Failed Base64 test");
            }
            
            if(!Arrays.equals(_orig8193, _dec8193))
            {
                fail("Failed Base64 test");
            }
        }
        catch(Exception ex)
        {
            fail("Failed Base64 test");
        }
    }

    public void testBase64WithNL()
    {
        byte[] dec = Base64.decode("SVNC" + "\n" + "QUQ=\n");

        if (dec.length != 5)
        {
            fail("got length " + dec.length + " when expecting 10");
        }
        
        if (!areEqual(dec, Base64.decode("SVNCQUQ=")))
        {
            fail("decodings are not equal");
        }
    }
    
    public void testHex()
    {
        try
        {
            Random _r = new Random();
            
            byte[] _orig1024 = new byte[1024];
            _r.nextBytes(_orig1024);
            
            byte[] _orig2048 = new byte[2048];
            _r.nextBytes(_orig2048);
            
            byte[] _orig4096 = new byte[4096];
            _r.nextBytes(_orig4096);
            
            byte[] _orig8192 = new byte[8192];
            _r.nextBytes(_orig8192);
            
            byte[] _enc1024 = Hex.encode(_orig1024);
            byte[] _enc2048 = Hex.encode(_orig2048);
            byte[] _enc4096 = Hex.encode(_orig4096);
            byte[] _enc8192 = Hex.encode(_orig8192);
            
            byte[] _dec1024 = Hex.decode(_enc1024);
            byte[] _dec2048 = Hex.decode(_enc2048);
            byte[] _dec4096 = Hex.decode(_enc4096);
            byte[] _dec8192 = Hex.decode(_enc8192);
            
            if(!Arrays.equals(_orig1024, _dec1024))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig2048, _dec2048))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig4096, _dec4096))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig8192, _dec8192))
            {
                fail("Failed Hex test");
            }
            
            
            byte[] _orig1025 = new byte[1025];
            _r.nextBytes(_orig1025);
            
            byte[] _orig2049 = new byte[2049];
            _r.nextBytes(_orig2049);
            
            byte[] _orig4097 = new byte[4097];
            _r.nextBytes(_orig4097);
            
            byte[] _orig8193 = new byte[8193];
            _r.nextBytes(_orig8193);
            
            byte[] _enc1025 = Hex.encode(_orig1025);
            byte[] _enc2049 = Hex.encode(_orig2049);
            byte[] _enc4097 = Hex.encode(_orig4097);
            byte[] _enc8193 = Hex.encode(_orig8193);
            
            byte[] _dec1025 = Hex.decode(_enc1025);
            byte[] _dec2049 = Hex.decode(_enc2049);
            byte[] _dec4097 = Hex.decode(_enc4097);
            byte[] _dec8193 = Hex.decode(_enc8193);
            
            if(!Arrays.equals(_orig1025, _dec1025))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig2049, _dec2049))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig4097, _dec4097))
            {
                fail("Failed Hex test");
            }
            
            if(!Arrays.equals(_orig8193, _dec8193))
            {
                fail("Failed Hex test");
            }
        }
        catch(Exception ex)
        {
            fail("Failed Hex test");
        }
    }
}
