package org.ovirt.engine.core.dal.dbbroker;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Random;
import java.util.UUID;

import org.apache.commons.lang.RandomStringUtils;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.compat.NGuid;
import org.ovirt.engine.core.compat.Version;

/** A test case for the {@link CustomMapSqlParameterSource} */
public class CustomMapSqlParameterSourceTest {

    /** The {@link CustomMapSqlParameterSourceTest} to be tested */
    private CustomMapSqlParameterSource paramSource;

    /** Name of the parameter to pass */
    private String paramName;

    public static enum TestEnum {
        ONE,
        TWO,
        THREE;
    }

    public static enum TestEnumWithGetValue {
        ONE,
        TWO,
        THREE;

        public int getValue() {
            return ordinal() * -1;
        }
    }

    @Before
    public void setUp() {
        DbEngineDialect dialectMock = mock(DbEngineDialect.class);
        when(dialectMock.getParamNamePrefix()).thenReturn("");
        paramSource = new CustomMapSqlParameterSource(dialectMock);

        paramName = RandomStringUtils.randomAlphabetic(10);
    }

    @Test
    public void testAddValuePrimitive() {
        int paramValue = new Random().nextInt();

        paramSource.addValue(paramName, paramValue);
        assertEquals("wrong value returned from parameter source",
                paramValue,
                paramSource.getValue(paramName));
    }

    @Test
    public void testAddValueEnum() {
        paramSource.addValue(paramName, TestEnum.TWO);
        assertEquals("wrong value returned from parameter source",
                TestEnum.TWO.ordinal(),
                paramSource.getValue(paramName));
    }

    @Test
    public void testAddValueEnumWithGetValue() {
        paramSource.addValue(paramName, TestEnumWithGetValue.TWO);
        assertEquals("wrong value returned from parameter source",
                TestEnumWithGetValue.TWO.getValue(),
                paramSource.getValue(paramName));
    }

    @Test
    public void testAddValueNGuid() {
        NGuid guid = new NGuid(UUID.randomUUID());

        paramSource.addValue(paramName, guid);
        assertEquals("wrong value returned from parameter source",
                guid.toString(),
                paramSource.getValue(paramName));
    }

    @Test
    public void testAddValueVersion() {
        Version verision = new Version(new Random().nextInt(), new Random().nextInt());

        paramSource.addValue(paramName, verision);
        assertEquals("wrong value returned from parameter source",
                verision.toString(),
                paramSource.getValue(paramName));
    }

    @Test
    public void testAddValueNull() {
        paramSource.addValue(paramName, null);
        assertNull("wrong value returned from parameter source",
                paramSource.getValue(paramName));
    }
}
