/**
 * Copyright [2012-2014] eBay Software Foundation
 *
 * Licensed 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 ml.shifu.shifu.meta;

import ml.shifu.shifu.container.meta.MetaFactory;
import ml.shifu.shifu.container.meta.ValidateResult;
import ml.shifu.shifu.container.obj.ModelConfig;
import ml.shifu.shifu.container.obj.ModelTrainConf;
import ml.shifu.shifu.container.obj.ModelTrainConf.ALGORITHM;
import ml.shifu.shifu.core.alg.NNTrainer;
import org.apache.commons.io.FileUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * MetaFactoryTest class
 */
public class MetaFactoryTest {

    private ModelConfig modelConfig;

    @BeforeClass
    public void setUp() throws IOException {
        modelConfig = ModelConfig.createInitModelConfig("unittest", ALGORITHM.NN, "a model config for unit-test");
        modelConfig.getBasic().setName("TestMode");
        modelConfig.getBasic().setAuthor("Author");
    }

    @Test
    public void testGetModelConfigMeta() {
        Assert.assertEquals(MetaFactory.getModelConfigMeta().size(), 106);
    }

    @Test
    public void testValidateModelConfig() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig);
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelBasicConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getBasic());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelSouceDataConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getDataSet());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelStatsConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getStats());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelVarSelectConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getVarSelect());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelNormalizeConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getNormalize());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelTrainAConf() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getTrain());
        Assert.assertTrue(result.getStatus());

        Map<String, Object> originalParams = modelConfig.getTrain().getParams();

        Map<String, Object> params = new HashMap<String, Object>();
        List<Object> nodesList = new ArrayList<Object>();
        nodesList.add("a");
        nodesList.add(45);

        params.put(NNTrainer.NUM_HIDDEN_NODES, nodesList);
        modelConfig.getTrain().setParams(params);
        result = MetaFactory.validate(modelConfig.getTrain());
        Assert.assertFalse(result.getStatus());
        modelConfig.getTrain().setParams(originalParams);
    }

    @Test
    public void testValidateModelEvalList() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getEvals());
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelEval() throws Exception {
        ValidateResult result = MetaFactory.validate(modelConfig.getEvals().get(0));
        Assert.assertTrue(result.getStatus());
    }

    @Test
    public void testValidateModelTrainBConf() throws Exception {
        ModelTrainConf trainConf = new ModelTrainConf();
        trainConf.setAlgorithm("test");
        trainConf.setBaggingNum(10);
        trainConf.setTrainOnDisk(null);

        ValidateResult result = MetaFactory.validate(trainConf);
        Assert.assertFalse(result.getStatus());
    }

    @AfterClass
    public void tearDown() throws IOException {
        FileUtils.deleteDirectory(new File("unittest"));
    }

}

@@ -1803,9 +1803,9 @@
 , 10
-6
+7
 );%0A 

Change MetaFactoryTest size test from 106 to 107, due to the extra option for MissValueFillType