blob: d50eb233075ff9084974fde24bad238625104b77 [file] [log] [blame]
/*
* 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 java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import org.apache.sysds.api.DMLScript;
import org.apache.sysds.conf.ConfigurationManager;
import org.apache.sysds.conf.DMLConfig;
import org.apache.sysds.parser.DMLProgram;
import org.apache.sysds.parser.DMLTranslator;
import org.apache.sysds.parser.LanguageException;
import org.apache.sysds.parser.ParserFactory;
import org.apache.sysds.parser.ParserWrapper;
import org.apache.sysds.test.AutomatedTestBase;
import org.apache.sysds.test.TestConfiguration;
import org.junit.Assert;
import org.junit.Test;
/**
* GENERAL NOTE
* * All tests should either return a controlled exception form validate (no runtime exceptions).
* Hence, we run two tests (1) validate only, and (2) a full dml runtime test.
*
* * if/else conditional type changes:
* 1a: ok, 1b: ok, 1c: err, 1d: err, 1e: err, 1f: err, 1g: err, 1h: err
* * for conditional type changes:
* 2a: ok, 2b: ok, 2c: err, 2d: err, 2e: err, 2f: err
* * while conditioanl type changes:
* 3a: ok, 3b: ok, 3c: err, 3d: err, 3e: err, 3f: err
* * sequential type changes (all ok):
* - within dags: 4a: ok, 4b: ok
* - across dags w/ functions: 4c: ok, 4d: ok
* - across dags w/o functions: 4e: ok, 4f: ok
* *
*/
public class DataTypeChangeTest extends AutomatedTestBase
{
private final static String TEST_DIR = "functions/misc/";
private final static String TEST_CLASS_DIR = TEST_DIR + DataTypeChangeTest.class.getSimpleName() + "/";
@Override
public void setUp() {
}
//if conditional type changes
@Test
public void testDataTypeChangeValidate1a() { runTest("dt_change_1a", null); }
@Test
public void testDataTypeChangeValidate1b() { runTest("dt_change_1b", null); }
@Test
public void testDataTypeChangeValidate1c() { runTest("dt_change_1c", LanguageException.class); }
@Test
public void testDataTypeChangeValidate1d() { runTest("dt_change_1d", LanguageException.class); }
@Test
public void testDataTypeChangeValidate1e() { runTest("dt_change_1e", LanguageException.class); }
@Test
public void testDataTypeChangeValidate1f() { runTest("dt_change_1f", LanguageException.class); }
@Test
public void testDataTypeChangeValidate1g() { runTest("dt_change_1g", LanguageException.class); }
@Test
public void testDataTypeChangeValidate1h() { runTest("dt_change_1h", LanguageException.class); }
//for conditional type changes
@Test
public void testDataTypeChangeValidate2a() { runTest("dt_change_2a", null); }
@Test
public void testDataTypeChangeValidate2b() { runTest("dt_change_2b", null); }
@Test
public void testDataTypeChangeValidate2c() { runTest("dt_change_2c", LanguageException.class); }
@Test
public void testDataTypeChangeValidate2d() { runTest("dt_change_2d", LanguageException.class); }
@Test
public void testDataTypeChangeValidate2e() { runTest("dt_change_2e", LanguageException.class); }
@Test
public void testDataTypeChangeValidate2f() { runTest("dt_change_2f", LanguageException.class); }
//while conditional type changes
@Test
public void testDataTypeChangeValidate3a() { runTest("dt_change_3a", null); }
@Test
public void testDataTypeChangeValidate3b() { runTest("dt_change_3b", null); }
@Test
public void testDataTypeChangeValidate3c() { runTest("dt_change_3c", LanguageException.class); }
@Test
public void testDataTypeChangeValidate3d() { runTest("dt_change_3d", LanguageException.class); }
@Test
public void testDataTypeChangeValidate3e() { runTest("dt_change_3e", LanguageException.class); }
@Test
public void testDataTypeChangeValidate3f() { runTest("dt_change_3f", LanguageException.class); }
//sequence conditional type changes
@Test
public void testDataTypeChangeValidate4a() { runTest("dt_change_4a", null); }
@Test
public void testDataTypeChangeValidate4b() { runTest("dt_change_4b", null); }
@Test
public void testDataTypeChangeValidate4c() { runTest("dt_change_4c", null); }
@Test
public void testDataTypeChangeValidate4d() { runTest("dt_change_4d", null); }
@Test
public void testDataTypeChangeValidate4e() { runTest("dt_change_4e", null); }
@Test
public void testDataTypeChangeValidate4f() { runTest("dt_change_4f", null); }
private void runTest( String testName, Class<?> exceptionExpected )
{
String RI_HOME = SCRIPT_DIR + TEST_DIR;
fullDMLScriptName = RI_HOME + testName + ".dml";
programArgs = new String[]{};
//validate test only
runValidateTest(fullDMLScriptName, exceptionExpected != null);
//integration test from outside SystemDS
runTest(true, exceptionExpected != null, exceptionExpected, -1);
}
private void runValidateTest( String fullTestName, boolean expectedException )
{
boolean raisedException = false;
try
{
// Tell the superclass about the name of this test, so that the superclass can
// create temporary directories.
TestConfiguration testConfig = new TestConfiguration(TEST_CLASS_DIR, fullTestName,
new String[] {});
addTestConfiguration(fullTestName, testConfig);
loadTestConfiguration(testConfig);
DMLConfig conf = new DMLConfig(getCurConfigFile().getPath());
ConfigurationManager.setLocalConfig(conf);
String dmlScriptString="";
HashMap<String, String> argVals = new HashMap<>();
//read script
try( BufferedReader in = new BufferedReader(new FileReader(fullTestName)) ) {
String s1 = null;
while ((s1 = in.readLine()) != null)
dmlScriptString += s1 + "\n";
}
//parsing and dependency analysis
ParserWrapper parser = ParserFactory.createParser();
DMLProgram prog = parser.parse(DMLScript.DML_FILE_PATH_ANTLR_PARSER, dmlScriptString, argVals);
DMLTranslator dmlt = new DMLTranslator(prog);
dmlt.liveVariableAnalysis(prog);
dmlt.validateParseTree(prog);
}
catch(LanguageException ex)
{
raisedException = true;
if(raisedException!=expectedException)
ex.printStackTrace();
}
catch(Exception ex2)
{
ex2.printStackTrace();
throw new RuntimeException(ex2);
//Assert.fail( "Unexpected exception occured during test run." );
}
//check correctness
Assert.assertEquals(expectedException, raisedException);
}
}