package org.springframework.security.crypto.util;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import org.junit.Test;
import org.springframework.security.crypto.codec.Hex;

public class EncodingUtilsTests {

    @Test
    public void hexEncode() {
        byte[] bytes = new byte[] { (byte)0x01, (byte)0xFF, (byte)65, (byte)66, (byte)67, (byte)0xC0, (byte)0xC1, (byte)0xC2 };
        String result = new String(Hex.encode(bytes));
        assertEquals("01ff414243c0c1c2", result);
    }

    @Test
    public void hexDecode() {
        byte[] bytes = new byte[] { (byte)0x01, (byte)0xFF, (byte)65, (byte)66, (byte)67, (byte)0xC0, (byte)0xC1, (byte)0xC2 };
        byte[] result = Hex.decode("01ff414243c0c1c2");
        assertTrue(Arrays.equals(bytes, result));
    }

    @Test
    public void concatenate() {
        byte[] bytes = new byte[] { (byte)0x01, (byte)0xFF, (byte)65, (byte)66, (byte)67, (byte)0xC0, (byte)0xC1, (byte)0xC2 };
        byte[] one = new byte[] { (byte)0x01 };
        byte[] two = new byte[] { (byte)0xFF, (byte)65, (byte)66 };
        byte[] three = new byte[] { (byte)67, (byte)0xC0, (byte)0xC1, (byte)0xC2 };
        assertTrue(Arrays.equals(bytes, EncodingUtils.concatenate(one, two, three)));
    }

    @Test
    public void subArray() {
        byte[] bytes = new byte[] { (byte)0x01, (byte)0xFF, (byte)65, (byte)66, (byte)67, (byte)0xC0, (byte)0xC1, (byte)0xC2 };
        byte[] two = new byte[] { (byte)0xFF, (byte)65, (byte)66 };
        byte[] subArray = EncodingUtils.subArray(bytes, 1, 4);
        assertEquals(3, subArray.length);
        assertTrue(Arrays.equals(two, subArray));
    }

}
