/*
 * LensKit, an open source recommender systems toolkit.
 * Copyright 2010-2013 Regents of the University of Minnesota and contributors
 * Work on LensKit has been funded by the National Science Foundation under
 * grants IIS 05-34939, 08-08692, 08-12148, and 10-17697.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package org.grouplens.lenskit.test;

import org.grouplens.lenskit.core.LenskitRecommenderEngineFactory;
import org.grouplens.lenskit.eval.CommandException;
import org.grouplens.lenskit.eval.algorithm.LenskitAlgorithmInstanceCommand;
import org.grouplens.lenskit.eval.config.EvalConfig;
import org.grouplens.lenskit.eval.data.GenericDataSource;
import org.grouplens.lenskit.eval.metrics.predict.CoveragePredictMetric;
import org.grouplens.lenskit.eval.metrics.predict.MAEPredictMetric;
import org.grouplens.lenskit.eval.metrics.predict.RMSEPredictMetric;
import org.grouplens.lenskit.eval.traintest.SimpleEvalCommand;
import org.grouplens.lenskit.util.table.Table;
import org.junit.Test;

import java.io.File;
import java.util.Properties;

import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

/**
 * A test suite that does cross-validation of an algorithm.
 */
public abstract class CrossfoldTestSuite extends ML100KTestSuite {
    protected String workDirName = System.getProperty("lenskit.temp.dir");

    protected abstract void configureAlgorithm(LenskitRecommenderEngineFactory factory);

    protected abstract void checkResults(Table table);

    @Test
    public void testAlgorithmAccuracy() throws CommandException {
        if (workDirName == null) {  // no property specified
            workDirName = "data/temp";
        }
        File workDir = new File(workDirName);
        try {
            workDir.mkdirs();
        } catch(SecurityException se) {
            throw new IllegalStateException("must configure lenskit.temp.dir to refer to a directory "
                                            + "in which a temp directory can be created");
        }

        SimpleEvalCommand evalCommand = new SimpleEvalCommand("train-test");
        Properties props =  new Properties(System.getProperties());
        props.setProperty(EvalConfig.DATA_DIR_PROPERTY, workDirName);
        evalCommand.setConfig(new EvalConfig(props));
        LenskitAlgorithmInstanceCommand algo = new LenskitAlgorithmInstanceCommand();
        configureAlgorithm(algo.getFactory());
        evalCommand.addAlgorithm(algo);

        evalCommand.addDataset(new GenericDataSource("ml-100k", daoFactory), 5, 0.2);

        evalCommand.addMetric(new CoveragePredictMetric())
                   .addMetric(new RMSEPredictMetric())
                   .addMetric(new MAEPredictMetric());


        Table result = evalCommand.call();
        assertThat(result, notNullValue());
        checkResults(result);
    }
}

@@ -1679,20 +1679,83 @@
 g.junit.
-Test
+Rule;%0Aimport org.junit.Test;%0Aimport org.junit.rules.TemporaryFolder
 ;%0A%0Aimpor
@@ -2041,76 +2041,71 @@
     
-protected String workDirName = System.getProperty(%22lenskit.temp.dir%22
+@Rule%0A    public TemporaryFolder workDir = new TemporaryFolder(
 );%0A%0A
@@ -2330,453 +2330,8 @@
 n %7B%0A
-        if (workDirName == null) %7B  // no property specified%0A            workDirName = %22data/temp%22;%0A        %7D%0A        File workDir = new File(workDirName);%0A        try %7B%0A            workDir.mkdirs();%0A        %7D catch(SecurityException se) %7B%0A            throw new IllegalStateException(%22must configure lenskit.temp.dir to refer to a directory %22%0A                                            + %22in which a temp directory can be created%22);%0A        %7D%0A%0A
     
@@ -2538,12 +2538,36 @@
 kDir
-Name
+.getRoot().getAbsolutePath()
 );%0A 

Use temporary directory for work output (refs #317)