/*
 * 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.sysds.test.functions.misc;

import org.apache.sysds.parser.LanguageException;
import org.apache.sysds.parser.ParseException;
import org.apache.sysds.test.AutomatedTestBase;
import org.apache.sysds.test.TestConfiguration;
import org.apache.sysds.test.TestUtils;
import org.junit.Assert;
import org.junit.Test;

public class FunctionPotpourriTest extends AutomatedTestBase 
{
	private final static String[] TEST_NAMES = new String[] {
		"FunPotpourriNoReturn",
		"FunPotpourriComments",
		"FunPotpourriNoReturn2",
		"FunPotpourriEval",
		"FunPotpourriSubsetReturn",
		"FunPotpourriSubsetReturnDead",
		"FunPotpourriNamedArgsSingle",
		"FunPotpourriNamedArgsMulti",
		"FunPotpourriNamedArgsPartial",
		"FunPotpourriNamedArgsUnknown1",
		"FunPotpourriNamedArgsUnknown2",
		"FunPotpourriNamedArgsIPA",
		"FunPotpourriDefaultArgScalar",
		"FunPotpourriDefaultArgMatrix",
		"FunPotpourriDefaultArgScalarMatrix1",
		"FunPotpourriDefaultArgScalarMatrix2",
		"FunPotpourriNamedArgsQuotedAssign",
		"FunPotpourriMultiReturnBuiltin1",
		"FunPotpourriMultiReturnBuiltin2",
		"FunPotpourriNestedParforEval",
		"FunPotpourriMultiEval",
		"FunPotpourriEvalPred",
		"FunPotpourriEvalListArg",
	};
	
	private final static String TEST_DIR = "functions/misc/";
	private final static String TEST_CLASS_DIR = TEST_DIR + FunctionPotpourriTest.class.getSimpleName() + "/";
	
	@Override
	public void setUp() {
		TestUtils.clearAssertionInformation();
		for(String testName : TEST_NAMES)
			addTestConfiguration( testName, new TestConfiguration(TEST_CLASS_DIR, testName, new String[] { "R" }) );
	}

	@Test
	public void testFunctionNoReturn() {
		runFunctionTest( TEST_NAMES[0], null );
	}
	
	@Test
	public void testFunctionComments() {
		runFunctionTest( TEST_NAMES[1], null );
	}
	
	@Test
	public void testFunctionNoReturnSpec() {
		runFunctionTest( TEST_NAMES[2], null );
	}
	
	@Test
	public void testFunctionEval() {
		runFunctionTest( TEST_NAMES[3], null );
	}
	
	@Test
	public void testFunctionSubsetReturn() {
		runFunctionTest( TEST_NAMES[4], null );
	}
	
	@Test
	public void testFunctionSubsetReturnDead() {
		runFunctionTest( TEST_NAMES[5], null );
	}
	
	@Test
	public void testFunctionNamedArgsSingleErr() {
		runFunctionTest( TEST_NAMES[6], ParseException.class );
	}
	
	@Test
	public void testFunctionNamedArgsMultiErr() {
		runFunctionTest( TEST_NAMES[7], ParseException.class );
	}

	@Test
	public void testFunctionNamedArgsPartial() {
		runFunctionTest( TEST_NAMES[8], LanguageException.class );
	}
	
	@Test
	public void testFunctionNamedArgsUnkown1() {
		runFunctionTest( TEST_NAMES[9], LanguageException.class );
	}
	
	@Test
	public void testFunctionNamedArgsUnkown2() {
		runFunctionTest( TEST_NAMES[10], NullPointerException.class );
	}
	
	@Test
	public void testFunctionNamedArgsIPA() {
		runFunctionTest( TEST_NAMES[11], null );
	}
	
	@Test
	public void testFunctionDefaultArgsScalar() {
		runFunctionTest( TEST_NAMES[12], null );
	}
	
	@Test
	public void testFunctionDefaultArgsMatrix() {
		runFunctionTest( TEST_NAMES[13], null );
	}
	
	@Test
	public void testFunctionDefaultArgsScalarMatrix1() {
		runFunctionTest( TEST_NAMES[14], null );
	}
	
	@Test
	public void testFunctionDefaultArgsScalarMatrix2() {
		runFunctionTest( TEST_NAMES[15], null );
	}
	
	@Test
	public void testFunctionNamedArgsQuotedAssign() {
		runFunctionTest( TEST_NAMES[16], null );
	}
	
	@Test
	public void testFunctionMultiReturnBuiltin1() {
		runFunctionTest( TEST_NAMES[17], null );
	}
	
	@Test
	public void testFunctionMultiReturnBuiltin2() {
		runFunctionTest( TEST_NAMES[18], null );
	}
	
	@Test
	public void testFunctionNestedParforEval() {
		runFunctionTest( TEST_NAMES[19], null );
	}
	
	@Test
	public void testFunctionMultiEval() {
		runFunctionTest( TEST_NAMES[20], null );
	}
	
	@Test
	public void testFunctionEvalPred() {
		runFunctionTest( TEST_NAMES[21], null );
	}
	
//	@Test
//	public void testFunctionEvalListArg() {
//		runFunctionTest( TEST_NAMES[22], null );
//	}
	
	private void runFunctionTest(String testName, Class<?> error) {
		TestConfiguration config = getTestConfiguration(testName);
		loadTestConfiguration(config);
		setOutputBuffering(false);
		
		String HOME = SCRIPT_DIR + TEST_DIR;
		fullDMLScriptName = HOME + testName + ".dml";
		programArgs = new String[]{"-explain", "hops", "-stats",
			"-args", String.valueOf(error).toUpperCase()};

		runTest(true, error != null, error, -1);

		if( testName.equals(TEST_NAMES[17]) )
			Assert.assertTrue(heavyHittersContainsString("print"));
	}
}
