package com.openshift.internal.restclient.model.template;

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

import org.fest.assertions.Assertions;
import org.jboss.dmr.ModelNode;
import org.junit.Test;

import com.openshift.restclient.model.template.IParameter;

public class ParameterTest {

    private Parameter param = new Parameter(new ModelNode());

    @Test
    public void testGetNameWhenUndefined() {
        assertEquals("", param.getValue());
    }

    @Test
    public void testGetDescriptionWhenUndefined() {
        assertEquals("", param.getDescription());
    }

    @Test
    public void testGetFromWhenUndefined() {
        assertEquals("", param.getFrom());
    }

    @Test
    public void testGetGeneratorNameWhenUndefined() {
        assertEquals("", param.getGeneratorName());
    }

    @Test
    public void testIsRequiredUndefined() {
        assertFalse(param.isRequired());
    }

    @Test
    public void testIsRequiredFalse() {
        ModelNode node = new ModelNode();
        node.get("required").set(false);
        param = new Parameter(node);
        assertFalse(param.isRequired());
    }

    @Test
    public void testIsRequired() {
        ModelNode node = new ModelNode();
        node.get("required").set(true);
        param = new Parameter(node);
        assertTrue(param.isRequired());
    }

    @Test
    public void shouldNotEqualsIfFromIsDifferent() {
        // pre-requisistes
        ModelNode node = new ModelNode();
        node.get("from").set("42");
        IParameter parameter = new Parameter(node);

        ModelNode otherNode = new ModelNode();
        otherNode.get("from").set("84");
        IParameter otherParameter = new Parameter(otherNode);

        // operation
        // verification
        Assertions.assertThat(parameter).isNotEqualTo(otherParameter);
        Assertions.assertThat(otherParameter).isNotEqualTo(parameter);
    }

    @Test
    public void shouldNotEqualsIfGeneratorNameIsDifferent() {
        // pre-requisistes
        ModelNode node = new ModelNode();
        node.get("generate").set("42");
        IParameter parameter = new Parameter(node);

        ModelNode otherNode = new ModelNode();
        otherNode.get("generate").set("84");
        IParameter otherParameter = new Parameter(otherNode);

        // operation
        // verification
        Assertions.assertThat(parameter).isNotEqualTo(otherParameter);
        Assertions.assertThat(otherParameter).isNotEqualTo(parameter);
    }

    @Test
    public void shouldNotEqualsIfNameIsDifferent() {
        // pre-requisistes
        ModelNode node = new ModelNode();
        node.get("name").set("42");
        IParameter parameter = new Parameter(node);

        ModelNode otherNode = new ModelNode();
        otherNode.get("name").set("84");
        IParameter otherParameter = new Parameter(otherNode);

        // operation
        // verification
        Assertions.assertThat(parameter).isNotEqualTo(otherParameter);
        Assertions.assertThat(otherParameter).isNotEqualTo(parameter);
    }

    @Test
    public void shouldNotEqualsIfValueIsDifferent() {
        // pre-requisistes
        ModelNode node = new ModelNode();
        node.get("value").set("42");
        IParameter parameter = new Parameter(node);

        ModelNode otherNode = new ModelNode();
        otherNode.get("value").set("84");
        IParameter otherParameter = new Parameter(otherNode);

        // operation
        // verification
        Assertions.assertThat(parameter).isNotEqualTo(otherParameter);
        Assertions.assertThat(otherParameter).isNotEqualTo(parameter);
    }

    @Test
    public void shouldNotEqualsIfIsRequiredIsDifferent() {
        // pre-requisistes
        ModelNode node = new ModelNode();
        node.get("required").set(true);
        IParameter parameter = new Parameter(node);

        ModelNode otherNode = new ModelNode();
        otherNode.get("required").set(false);
        IParameter otherParameter = new Parameter(otherNode);

        // operation
        // verification
        Assertions.assertThat(parameter).isNotEqualTo(otherParameter);
        Assertions.assertThat(otherParameter).isNotEqualTo(parameter);
    }

}
