/*******************************************************************************
 * (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0 which accompany this distribution.
 *
 * The Apache License is available at
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 *******************************************************************************/

package io.cloudslang.lang.compiler.modeller.transformers;

import com.google.common.collect.Sets;
import java.util.Set;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

/**
 * @author Bonczidai Levente
 * @since 5/5/2016
 */
public class AbstractTransformerTest extends TransformersTestParent {

    @Rule
    public ExpectedException exception = ExpectedException.none();;
    private AbstractTransformer abstractTransformer;
    private Set<String> mandatoryKeys;
    private Set<String> optionalKeys;
    private String mandatoryKey1;
    private String mandatoryKey2;
    private String optionalKey1;
    private String invalidKey1;

    @Before
    public void setUp(){
        abstractTransformer = new AbstractTransformer() {};
        mandatoryKey1 = "mandatory1";
        mandatoryKey2 = "mandatory2";
        optionalKey1 = "optional1";
        invalidKey1 = "invalid1";
        mandatoryKeys = Sets.newHashSet(mandatoryKey1, mandatoryKey2);
        optionalKeys = Sets.newHashSet(optionalKey1);
    }

    @Test
    public void testNulls() throws Exception {
        exception.expect(IllegalArgumentException.class);
        abstractTransformer.validateKeySet(null, null, null);
    }

    @Test
    public void testMandatoryKeys() throws Exception {
        abstractTransformer.validateKeySet(
                Sets.newHashSet(mandatoryKey1, mandatoryKey2),
                mandatoryKeys,
                optionalKeys
        );
    }

    @Test
    public void testMandatoryAndOptionalKeys() throws Exception {
        abstractTransformer.validateKeySet(
                Sets.newHashSet(mandatoryKey1, mandatoryKey2, optionalKey1),
                mandatoryKeys,
                optionalKeys
        );
    }

    @Test
    public void testInvalidKeys() throws Exception {
        exception.expect(RuntimeException.class);
        exception.expectMessage(AbstractTransformer.INVALID_KEYS_ERROR_MESSAGE_PREFIX);
        exception.expectMessage(invalidKey1);
        abstractTransformer.validateKeySet(
                Sets.newHashSet(mandatoryKey1, mandatoryKey2, invalidKey1),
                mandatoryKeys,
                optionalKeys
        );
    }

    @Test
    public void testMissingKeys() throws Exception {
        exception.expect(RuntimeException.class);
        exception.expectMessage(AbstractTransformer.MISSING_KEYS_ERROR_MESSAGE_PREFIX);
        exception.expectMessage(mandatoryKey2);
        abstractTransformer.validateKeySet(
                Sets.newHashSet(mandatoryKey1, optionalKey1),
                mandatoryKeys,
                optionalKeys
        );
    }

}
add back test