/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jena.tools.schemagen;


// Imports
///////////////

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.Collection;

import jena.schemagen.SchemagenOptions.OPT;

import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * <p>This test checks basic coverage of the options from schemagen: if more options are added,
 * without updating the option setters, this test should give a compile warning in @{@link #setParamValue(Source)}</p>
 */
@RunWith( Parameterized.class )
public class SourceParameterTest
{
    /***********************************/
    /* Constants                       */
    /***********************************/

    /** Test parameters are formed from the schemagen options
     **/
    @Parameters
    public static Collection<Object[]> testParameters() {
        Collection<Object[]> params = new ArrayList<>();

        for (OPT opt: OPT.values()) {
            Object[] par = new Object[2];
            par[0] = opt;
            par[1] = opt.name();

            params.add( par );
        }

        return params;
    }


    /***********************************/
    /* Static variables                */
    /***********************************/

    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        //
    }

    /***********************************/
    /* Instance variables              */
    /***********************************/

    private OPT option;
    private String optionName;
    private Object expected;

    /***********************************/
    /* Constructors                    */
    /***********************************/

    public SourceParameterTest( OPT paramVal, String paramName ) {
        option = paramVal;
        optionName = paramName;
    }

    /***********************************/
    /* External signature methods      */
    /***********************************/

    /**
     * @throws SchemagenOptionsConfigurationException
     */
    @Test
    public void testGetOption() throws SchemagenOptionsConfigurationException {
        Source s = new Source();
        setParamValue( s );
        SchemagenOptions so = new SchemagenOptions(null, s);
        if (expected instanceof Resource)
        {
        	assertEquals( optionName, expected, so.getOption( option ).asResource() );
        }
        else
        {
        	assertEquals( optionName, expected, so.getOption( option ).asLiteral().getValue() );
        }
    }


    /***********************************/
    /* Internal implementation methods */
    /***********************************/

    protected void setParamValue( Source s ) {
        switch (option) {
            case INPUT:
                s.setInput( optionName );

                expected = optionName;
                break;

            case CLASS_SECTION:
                s.setClassSection( optionName );

                expected = optionName;
                break;

            case CLASSDEC:
                s.setClassDec( optionName );

                expected = optionName;
                break;

            case CLASSNAME:
                s.setClassName( optionName );

                expected = optionName;
                break;

            case CLASSNAME_SUFFIX:
                s.setClassNameSuffix( optionName );

                expected = optionName;
                break;

            case CLASS_TEMPLATE:
                s.setClassTemplate( optionName );

                expected = optionName;
                break;

            case CONFIG_FILE:
                s.setConfigFile( optionName );

                expected = optionName;
                break;
                
            case DATATYPES_SECTION:
                s.setDatatypesSection( optionName );

                expected = optionName;
                break;

            case DATATYPE_TEMPLATE:
                s.setDatatypeTemplate( optionName );

                expected = optionName;
                break;

            case DECLARATIONS:
                s.setDeclarations( optionName );

                expected = optionName;
                break;

            case ENCODING:
                s.setEncoding( optionName );

                expected = optionName;
                break;

            case FOOTER:
                s.setFooter( optionName );

                expected = optionName;
                break;

            case HEADER:
                s.setHeader( optionName );

                expected = optionName;
                break;

            case INCLUDE:
                s.setInclude( optionName );

                expected = optionName;
                break;

            case INDIVIDUALS_SECTION:
                s.setIndividualsSection( optionName );

                expected = optionName;
                break;

            case INDIVIDUAL_TEMPLATE:
                s.setIndividualTemplate( optionName );

                expected = optionName;
                break;

            case MARKER:
                s.setMarker( optionName );

                expected = optionName;
                break;

            case NAMESPACE:
                s.setNamespace( optionName );

                //expected = optionName;
                expected = ResourceFactory.createResource( optionName ); 
                break;

            case OUTPUT:
                s.setOutput( optionName );

                expected = optionName;
                break;

            case PACKAGENAME:
                s.setPackageName( optionName );

                expected = optionName;
                break;

            case PROPERTY_SECTION:
                s.setPropertySection( optionName );

                expected = optionName;
                break;

            case PROP_TEMPLATE:
                s.setPropTemplate( optionName );

                expected = optionName;
                break;

            case ROOT:
                s.setRoot( optionName );

                expected = optionName;
                break;

            // Boolean options
            case DOS:
                s.setDos( true );

                expected = true;
                break;

            case HELP:
                s.setHelp( true );

                expected = true;
                break;

            case INCLUDE_SOURCE:
                s.setIncludeSource( true );

                expected = true;
                break;

            case LANG_DAML:
                s.setLangDaml( true );

                expected = true;
                break;

            case LANG_OWL:
                s.setLangOwl( true );

                expected = true;
                break;

            case LANG_RDFS:
                s.setLangRdfs( true );

                expected = true;
                break;

            case NOCLASSES:
                s.setNoClasses( true );

                expected = true;
                break;
                
            case NODATATYPES:
                s.setNoDatatypes( true );

                expected = true;
                break;
            case NOHEADER:
                s.setNoHeader( true );

                expected = true;
                break;

            case NOINDIVIDUALS:
                s.setNoIndividuals( true );

                expected = true;
                break;

            case NOPROPERTIES:
                s.setNoProperties( true );

                expected = true;
                break;

            case NO_COMMENTS:
                s.setNoComments( true );

                expected = true;
                break;

            case NO_STRICT:
                s.setNoStrict( true );

                expected = true;
                break;

            case ONTOLOGY:
                s.setOntology( true );

                expected = true;
                break;

            case STRICT_INDIVIDUALS:
                s.setStrictIndividuals( true );

                expected = true;
                break;

            case UC_NAMES:
                s.setUcNames( true );

                expected = true;
                break;

            case USE_INF:
                s.setUseInf( true );

                expected = true;
                break;

        }
    }

    /***********************************/
    /* Inner class definitions         */
    /***********************************/

}

