/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Business Objects nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* RuntimeRegression_Test.java
* Creation date: June 1, 2005.
* By: Raymond Cypher
*/
package org.openquark.cal.machine;
import java.util.List;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.openquark.cal.CALPlatformTestModuleNames;
import org.openquark.cal.compiler.AdjunctSource;
import org.openquark.cal.compiler.Compiler;
import org.openquark.cal.compiler.CompilerMessageLogger;
import org.openquark.cal.compiler.MessageLogger;
import org.openquark.cal.compiler.QualifiedName;
import org.openquark.cal.compiler.io.EntryPoint;
import org.openquark.cal.compiler.io.EntryPointSpec;
import org.openquark.cal.internal.module.Cal.Core.CAL_Prelude_internal;
import org.openquark.cal.module.Cal.Core.CAL_Prelude;
import org.openquark.cal.runtime.CALExecutorException;
import org.openquark.cal.runtime.ExecutionContext;
import org.openquark.cal.runtime.MachineType;
import org.openquark.cal.services.BasicCALServices;
import org.openquark.cal.services.CALServicesTestUtilities;
import org.openquark.cal.services.WorkspaceManager;
/**
* A set of unit tests to be run to verify correct behaviour of the
* CAL runtime.
* @author RCypher
*/
public class RuntimeRegression_Test extends TestCase {
/**
* A copy of CAL services for use in the test cases.
*/
private static BasicCALServices leccCALServices;
private static BasicCALServices gCALServices;
private static final boolean test_g_machine = true;
private static final boolean test_lecc_machine = true;
/**
* @return a test suite containing all the test cases for testing CAL source
* generation.
*/
public static Test suite() {
TestSuite suite = new TestSuite(RuntimeRegression_Test.class);
return new TestSetup(suite) {
protected void setUp() {
oneTimeSetUp();
}
protected void tearDown() {
oneTimeTearDown();
}
};
}
/**
* Performs the setup for the test suite.
*/
private static void oneTimeSetUp() {
try {
if (test_lecc_machine) {
leccCALServices = CALServicesTestUtilities.getCommonCALServices(MachineType.LECC, "cal.platform.test.cws");
}
if (test_g_machine) {
gCALServices = CALServicesTestUtilities.getCommonCALServices(MachineType.G, "cal.platform.test.cws");
}
} catch (Exception e) {
System.out.println("Failed to compile workspaces: " + e.getLocalizedMessage());
} catch (Error e) {
System.out.println("Failed to compile workspaces: " + e.getLocalizedMessage());
}
}
/**
* Performs the tear down for the test suite.
*/
private static void oneTimeTearDown() {
leccCALServices = null;
gCALServices = null;
}
/**
* Constructor for RuntimeRegression_Test.
*
* @param name
* the name of the test.
*/
public RuntimeRegression_Test(String name) {
super(name);
}
/**
* Runs the specified function without any arguments.
*
* @param funcName
* the function to be run
* @param calServices
* the copy of BasicCALServices to use
* @param context
* @return the result from running the function
* @throws CALExecutorException
*/
private Object runCAF(QualifiedName funcName, BasicCALServices calServices, ExecutionContext context)
throws CALExecutorException {
CompilerMessageLogger ml = new MessageLogger ();
// Compile it, indicating that this is an adjunct
EntryPoint targetEntryPoint =
calServices.getWorkspaceManager().getCompiler().getEntryPoint(
EntryPointSpec.make(funcName), funcName.getModuleName(), ml);
if (targetEntryPoint == null) {
return null;
}
if (context == null) {
context = calServices.getWorkspaceManager().makeExecutionContextWithDefaultProperties();
}
CALExecutor runtime = calServices.getWorkspaceManager().makeExecutor(context);
CALExecutorException exception = null;
Object result = null;
try {
result = runtime.exec (targetEntryPoint, new Object[]{});
} catch (CALExecutorException e) {
exception = e;
}
calServices.getWorkspaceManager().resetCachedResults(runtime.getContext());
runtime = null;
if (exception != null) {
throw exception;
}
return result;
}
/**
* Test invoking a non-zero arity run target.
*/
public void testInvokingNonCAF_lecc () {
if (test_lecc_machine) {
WorkspaceManager workspaceManager = leccCALServices.getWorkspaceManager();
Compiler compiler = leccCALServices.getCompiler();
CompilerMessageLogger messageLogger = new MessageLogger();
EntryPoint entryPoint = compiler.getEntryPoint(
EntryPointSpec.make(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "nonCAFEntryPoint")),
CALPlatformTestModuleNames.RuntimeRegression, messageLogger);
if (messageLogger.getNMessages() > 0) {
System.err.println(messageLogger.toString());
}
final ExecutionContext executionContext = leccCALServices.getWorkspaceManager().makeExecutionContextWithDefaultProperties();
CALExecutor executor = workspaceManager.makeExecutor(executionContext);
try {
Object result = executor.exec(entryPoint, new Object[] { new Integer(1), new Integer(2)});
assertTrue(((Integer)result).intValue() == 6);
} catch (CALExecutorException e) {
fail(e.toString());
}
}
}
/**
* Test invoking a non-zero arity run target.
*/
public void testInvokingNonCAF_g () {
if (test_g_machine) {
WorkspaceManager workspaceManager = gCALServices.getWorkspaceManager();
Compiler compiler = gCALServices.getCompiler();
CompilerMessageLogger messageLogger = new MessageLogger();
EntryPoint entryPoint = compiler.getEntryPoint(
EntryPointSpec.make(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "nonCAFEntryPoint")),
CALPlatformTestModuleNames.RuntimeRegression, messageLogger);
if (messageLogger.getNMessages() > 0) {
System.err.println(messageLogger.toString());
}
final ExecutionContext executionContext = gCALServices.getWorkspaceManager().makeExecutionContextWithDefaultProperties();
CALExecutor executor = workspaceManager.makeExecutor(executionContext);
try {
Object result = executor.exec(entryPoint, new Object[] { new Integer(1), new Integer(2)});
assertTrue(((Integer)result).intValue() == 6);
} catch (CALExecutorException e) {
fail(e.toString());
}
}
}
/**
* Test debug functions for listing CAFs and showing CAF space usage.
* @throws CALExecutorException
*/
public void testCAFSpaceUsage_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageAliasCAF"), leccCALServices, null);
assertNotNull(result);
result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageLiteralCAF"), leccCALServices, null);
assertNotNull(result);
result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageAliasLiteralCAF"), leccCALServices, null);
assertNotNull(result);
// List<?> cafs = (List<?>)runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testListingDebugCAFs"), leccCALServices, null);
// boolean foundPrelude = false;
// for (int i = 0, n = cafs.size(); i < n && !foundPrelude; ++i) {
// foundPrelude = (((String)cafs.get(i)).indexOf(CAL_Prelude.MODULE_NAME.toSourceText()) >= 0);
// }
// assertTrue(!foundPrelude);
// List<?> cafs = (List<?>)runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testListingDebugCAFsWithDependees"), leccCALServices, null);
// boolean foundPrelude = false;
// for (int i = 0, n = cafs.size(); i < n && !foundPrelude; ++i) {
// foundPrelude = (((String)cafs.get(i)).indexOf(CAL_Prelude.MODULE_NAME.toSourceText()) >= 0);
// }
// assertTrue(foundPrelude);
}
}
public void testCAFSpaceUsage_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageAliasCAF"), gCALServices, null);
assertNotNull(result);
result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageLiteralCAF"), gCALServices, null);
assertNotNull(result);
result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testSpaceUsageAliasLiteralCAF"), gCALServices, null);
assertNotNull(result);
List<?> cafs = (List<?>)runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testListingDebugCAFs"), gCALServices, null);
boolean foundPrelude = false;
for (int i = 0, n = cafs.size(); i < n && !foundPrelude; ++i) {
foundPrelude = (((String)cafs.get(i)).indexOf(CAL_Prelude.MODULE_NAME.toSourceText()) >= 0);
}
assertTrue(!foundPrelude);
cafs = (List<?>)runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testListingDebugCAFsWithDependees"), gCALServices, null);
foundPrelude = false;
for (int i = 0, n = cafs.size(); i < n && !foundPrelude; ++i) {
foundPrelude = (((String)cafs.get(i)).indexOf(CAL_Prelude.MODULE_NAME.toSourceText()) >= 0);
}
assertTrue(foundPrelude);
}
}
public void testInvalidCoercion_lecc () {
if (leccCALServices != null) {
CompilerMessageLogger logger = new MessageLogger();
AdjunctSource as = new AdjunctSource.FromText("testRunTarget = jObjectToInteger (unsafeCoerce (1 :: Int));");
EntryPoint entryPoint =
leccCALServices.getCompiler().getEntryPoint(
as,
EntryPointSpec.make(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testRunTarget")),
CALPlatformTestModuleNames.RuntimeRegression,
logger);
CALExecutor runtime = leccCALServices.getWorkspaceManager().makeExecutorWithNewContextAndDefaultProperties();
try {
runtime.exec (entryPoint, new Object[]{});
} catch (Exception e) {
String causeMessage = e.getCause().getCause().getLocalizedMessage();
int i = causeMessage.indexOf("mismatch");
assertTrue(i >= 0);
} catch (Error e) {
String causeMessage = e.getCause().getLocalizedMessage();
int i = causeMessage.indexOf("mismatch");
assertTrue(i >= 0);
}
}
}
/**
* Execute RuntimeRegression.spaceTest1
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest1_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest1"), leccCALServices, null);
assertEquals(new Double(5.0000005E13), result);
}
}
public void testSpaceTest1_g() throws CALExecutorException {
if(test_g_machine) {
// There is a known issue in the g-machine which currently prevents this test
// from completing. At this point in time it is expected to fail with an
// out of memory error.
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest1g"), gCALServices, null);
assertEquals(new Double(4.5000015E12), result);
}
}
/**
* Execute RuntimeRegression.spaceTest2
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest2_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest2"), leccCALServices, null);
assertEquals(new Character('a'), result);
}
}
public void testSpaceTest2_g() throws CALExecutorException {
if(test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest2g"), gCALServices, null);
assertEquals(new Character('a'), result);
}
}
/**
* Execute RuntimeRegression.spaceTest3
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest3_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest3"), leccCALServices, null);
assertEquals(new Double(1.0E7), result);
}
}
public void testSpaceTest3_g() throws CALExecutorException {
if(test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest3g"), gCALServices, null);
assertEquals(new Double(1000000.0), result);
}
}
/**
* Execute RuntimeRegression.spaceTest4
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest4_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest4"), leccCALServices, null);
assertEquals(new Double(5000000.5), result);
}
}
public void testSpaceTest4_g() throws CALExecutorException {
if(test_g_machine){
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest4g"), gCALServices, null);
assertEquals(new Double(500000.5), result);
}
}
/**
* Execute RuntimeRegression.spaceTest5
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest5_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest5"), leccCALServices, null);
assertEquals(new Double(5000000.5), result);
}
}
public void testSpaceTest5_g() throws CALExecutorException {
if(test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest5g"), gCALServices, null);
assertEquals(new Double(500000.5), result);
}
}
/**
* Execute RuntimeRegression.spaceTest6
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest6_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest6"), leccCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
/**
* Execute RuntimeRegression.spaceTest7
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest7_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest7"), leccCALServices, null);
assertEquals("True", result);
}
}
/**
* Execute RuntimeRegression.spaceTest8
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest8_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest8"), leccCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
/**
* Execute RuntimeRegression.spaceTest9
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest9_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest9"), leccCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
/**
* Execute RuntimeRegression.spaceTest11
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testSpaceTest11_lecc() throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest11"), leccCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
public void testSpaceTest11_g() throws CALExecutorException {
if(test_g_machine) {
// Currently there is a known bug in the g-machine that prevents this test from completing successfully.
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "spaceTest11g"), gCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
/**
* Execute RuntimeRegression.testPartialApplications
* We are checking that the function runs to completion and produces the expected value.
* @throws CALExecutorException
*/
public void testPartialApplications_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testPartialApplications(leccCALServices);
}
}
public void testPartialApplications_g() throws CALExecutorException {
if(test_g_machine) {
help_testPartialApplications(gCALServices);
}
}
private void help_testPartialApplications(BasicCALServices calServices) throws CALExecutorException {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testPartialApplications"), calServices, null);
assertEquals(Boolean.TRUE, result);
}
/**
* Test transient memoization. i.e. memoization which only exists for the duration of a function
* evaluation. This tests memoization of a single argument function.
* @throws CALExecutorException
*/
public void testMemoization_Transient_one_param_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testMemoization_Transient(leccCALServices, "instanceCacheTest");
}
}
public void testMemoization_Transient_one_param_g() throws CALExecutorException {
if (test_g_machine) {
help_testMemoization_Transient(gCALServices, "instanceCacheTest");
}
}
/**
* Test transient memoization. i.e. memoization which only exists for the duration of a function
* evaluation. This tests memoization of a four argument function.
* @throws CALExecutorException
*/
public void testMemoization_Transient_four_param_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testMemoization_Transient(leccCALServices, "instanceCacheTestForMultipleParams");
}
}
public void testMemoization_Transient_four_param_g() throws CALExecutorException {
if (test_g_machine) {
help_testMemoization_Transient(gCALServices, "instanceCacheTestForMultipleParams");
}
}
/**
* Test transient memoization. i.e. memoization which only exists for the duration of a function
* evaluation.
* @param calServices
* @param function
* @throws CALExecutorException
*/
private void help_testMemoization_Transient(BasicCALServices calServices, String function) throws CALExecutorException {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.Memoize_Tests, function), calServices, null);
assertEquals(Boolean.TRUE, result);
}
/**
* Test context scope memoization. i.e. memoization which exists for the duration of an
* execution context.
* @throws CALExecutorException
*/
public void testMemoization_Context_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testMemoization_Context(leccCALServices);
}
}
public void testMemoization_Context_g() throws CALExecutorException {
if (test_g_machine) {
help_testMemoization_Context(gCALServices);
}
}
/**
* Test context scope memoization. i.e. memoization which exists for the duration of an
* execution context.
* @param calServices
* @throws CALExecutorException
*/
private void help_testMemoization_Context(BasicCALServices calServices) throws CALExecutorException {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.Memoize_Tests, "multiInstanceCacheTestForFourParams"), calServices, null);
assertEquals(Boolean.TRUE, result);
}
/**
* Test CAF cacheing. We want to verify that there is a different CAF instance
* for each execution context.
* We do this by wrapping a zero arity foreign function in a CAF. The foreign function
* returns a different value each time it is called.
* @throws CALExecutorException
*/
public void testCAF_Cacheing_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testCAF_Cacheing(leccCALServices);
}
}
public void testCAF_Cacheing_g() throws CALExecutorException {
if (test_g_machine) {
help_testCAF_Cacheing(gCALServices);
}
}
private void help_testCAF_Cacheing (BasicCALServices calServices) throws CALExecutorException {
CompilerMessageLogger ml = new MessageLogger ();
// Compile it, indicating that this is an adjunct
EntryPoint targetEntryPoint =
calServices.getWorkspaceManager().getCompiler().getEntryPoint(
EntryPointSpec.make(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "getCallCountCAF")),
CALPlatformTestModuleNames.RuntimeRegression, ml);
if (targetEntryPoint == null) {
fail();
}
// Create an executor and run the CAF twice.
CALExecutor runtime = calServices.getWorkspaceManager().makeExecutorWithNewContextAndDefaultProperties();
Object result1 = runtime.exec (targetEntryPoint, new Object[]{});
Object result2 = runtime.exec (targetEntryPoint, new Object[]{});
// Create a second executor (and execution context) and run the CAF twice more.
runtime = calServices.getWorkspaceManager().makeExecutorWithNewContextAndDefaultProperties();
Object result3 = runtime.exec (targetEntryPoint, new Object[]{});
Object result4 = runtime.exec (targetEntryPoint, new Object[]{});
// The two results should be different, since each run has its own execution context.
assertTrue(result1.equals(result2));
assertTrue(result3.equals(result4));
assertTrue(!result1.equals(result3));
}
/**
* Run Cal_PlatformTestSuite.testModule.
* This function is the general purpose regression testing function
* designed to exercise as many language/runtime features in CAL as possible.
* @throws CALExecutorException
*/
public void test_platform_lecc () throws CALExecutorException {
if (test_lecc_machine) {
help_testPlatform(leccCALServices);
}
}
public void test_pptlatform_g () throws CALExecutorException {
if (test_g_machine) {
help_testPlatform(gCALServices);
}
}
private void help_testPlatform (BasicCALServices calServices) throws CALExecutorException {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.CAL_PlatForm_Test_suite, "testModule"), calServices, null);
assertEquals(Boolean.TRUE, result);
}
/**
* Test automatically generated input/output instances.
* @throws CALExecutorException
*/
public void testDerivedIO_lecc() throws CALExecutorException {
if (test_lecc_machine) {
help_testDerivedIO(leccCALServices);
}
}
public void testDerivedIO_g() throws CALExecutorException {
if (test_g_machine) {
help_testDerivedIO(gCALServices);
}
}
private void help_testDerivedIO (BasicCALServices calServices) throws CALExecutorException {
// The first three test functions in M2 should all complete succesfully and return true.
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testOutThenInMyInt"), calServices, null);
assertEquals(Boolean.TRUE, result);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testOutThenInMyLong"), calServices, null);
assertEquals(Boolean.TRUE, result);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testMyString"), calServices, null);
assertEquals(Boolean.TRUE, result);
// The next three functions should all fail with a class cast exception.
// runCAF will throw a CALExecutorException in the case of a failure in
// evaluation.
try {
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testOutThenIn3"), calServices, null);
assertTrue(false);
} catch (CALExecutorException e) {
Throwable cause = e.getCause();
assertTrue (cause instanceof ClassCastException);
}
try {
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testOutThenIn4"), calServices, null);
assertTrue(false);
} catch (CALExecutorException e) {
Throwable cause = e.getCause();
assertTrue (cause instanceof ClassCastException);
}
try {
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.M2, "testMyString2"), calServices, null);
assertTrue(false);
} catch (CALExecutorException e) {
Throwable cause = e.getCause();
assertTrue (cause instanceof ClassCastException);
}
}
/**
* Test resolution of alias functions with different strictness.
*/
public void testAliasingWithStrictness_lecc() {
if (test_lecc_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias1").getAliasOf() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias2").getAliasOf() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias3").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias4").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias5").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias6").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias7").getAliasOf() != null);
}
}
/**
* Test a function aliasing a function with the same name from a different module.
*/
public void testAliasingWithSameName_lecc() {
if (test_lecc_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("filter").getAliasOf() != null);
}
}
/**
* Test a CAF aliasing a non-CAF.
*/
public void testAliasingWithCAF_to_nonCAF_lecc() {
if (test_lecc_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasingCAF").getAliasOf() != null);
}
}
/**
* Test CAFs aliasing CAFs defined as a literal value.
*/
public void testAliasingWithCAF_to_Literal_lecc() {
if (test_lecc_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("literalCAF").getLiteralValue() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF").getLiteralValue() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF2").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF2").getLiteralValue() != null);
}
}
/**
* Test a CAF aliasing a zero arity and non-zero arity foreign function.
*/
public void testAliasingWithCAF_to_ForeignFunction_lecc () {
if (test_lecc_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("appendStringNoCase").getAliasOf().equals(CAL_Prelude_internal.Functions.appendString));
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedForeignCAF").getAliasOf() == null);
}
}
/**
* Test resolution of alias functions with different strictness.
*/
public void testAliasingWithStrictness_g() {
if (test_g_machine) {
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias1").getAliasOf() != null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias2").getAliasOf() != null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias3").getAliasOf() == null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias4").getAliasOf() == null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias5").getAliasOf() == null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias6").getAliasOf() == null);
assertTrue(gCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("alias7").getAliasOf() != null);
}
}
/**
* Test a function aliasing a function with the same name from a different module.
*/
public void testAliasingWithSameName_g() {
if (test_g_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("filter").getAliasOf() != null);
}
}
/**
* Test a CAF aliasing a non-CAF.
*/
public void testAliasingWithCAF_to_nonCAF_g() {
if (test_g_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasingCAF").getAliasOf() != null);
}
}
/**
* Test CAFs aliasing CAFs defined as a literal value.
*/
public void testAliasingWithCAF_to_Literal_g() {
if (test_g_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("literalCAF").getLiteralValue() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF").getLiteralValue() != null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF2").getAliasOf() == null);
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedLiteralCAF2").getLiteralValue() != null);
}
}
/**
* Test a CAF aliasing a zero arity and non-zero arity foreign function.
*/
public void testAliasingWithCAF_to_ForeignFunction_g () {
if (test_g_machine) {
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("appendStringNoCase").getAliasOf().equals(CAL_Prelude_internal.Functions.appendString));
assertTrue(leccCALServices.getWorkspaceManager().getModuleTypeInfo(CALPlatformTestModuleNames.RuntimeRegression).getModule().getFunction("aliasedForeignCAF").getAliasOf() == null);
}
}
public void test64KClassFileLimit_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "sixtyFourKbLimit"), leccCALServices, null);
assertEquals(new Double(199.0), result);
}
}
public void test64KClassFileLimit_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "sixtyFourKbLimit"), gCALServices, null);
assertEquals(new Double(199.0), result);
}
}
public void testExcerciseLetVars_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "exerciseLetVars"), leccCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
public void testExcerciseLetVars_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "exerciseLetVars"), gCALServices, null);
assertEquals(Boolean.TRUE, result);
}
}
/**
* Test using input and output to convert between JObject and unboxed values
* when dealing with literals.
* @throws CALExecutorException
*/
public void testIOForStrictLiteralValues_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictIntObject"), leccCALServices, null);
assertEquals(result, Boolean.FALSE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictCharObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictBooleanObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictLongObject"), leccCALServices, null);
assertEquals(result, new Long(2));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictByteObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictDoubleObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictFloatObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictForeignObject"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
public void testIOForStrictLiteralValues_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictIntObject"), gCALServices, null);
assertEquals(result, Boolean.FALSE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictCharObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictBooleanObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictLongObject"), gCALServices, null);
assertEquals(result, new Long(2));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictByteObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictDoubleObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictFloatObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictForeignObject"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
public void testIOForStrictForeignValuesFromPrimitive_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromForeignInt"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromPrimOpInt"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromLiteralInt"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
public void testIOForStrictForeignValuesFromPrimitive_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromForeignInt"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromPrimOpInt"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "testStrictJObjectFromLiteralInt"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
/**
* Test a case where the ordering of arguments in a tail recursive function has caused problems.
* @throws CALExecutorException
*/
public void testTailRecursiveArgumentOrdering1_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "recursiveArgOrderingTest"), leccCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
public void testTailRecursiveArgumentOrdering1_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF (QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "recursiveArgOrderingTest"), gCALServices, null);
assertEquals(result, Boolean.TRUE);
}
}
/**
* Run tests of the behavior of the Prelude.seq primitive.
* @throws CALExecutorException
*/
public void testSeq_lecc () throws CALExecutorException {
if (test_lecc_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest1"), leccCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest2"), leccCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest3"), leccCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest4"), leccCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest5"), leccCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest1"), leccCALServices, null);
assertEquals(result, new Double(0.0));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest2"), leccCALServices, null);
assertEquals(result, new Double(0.0));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest3"), leccCALServices, null);
assertEquals(result, new Double(7.0));
}
}
public void testSeq_g () throws CALExecutorException {
if (test_g_machine) {
Object result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest1"), gCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest2"), gCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest3"), gCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest4"), gCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqAssociativityTest5"), gCALServices, null);
assertEquals(result, "a, b, c");
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest1"), gCALServices, null);
assertEquals(result, new Double(0.0));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest2"), gCALServices, null);
assertEquals(result, new Double(0.0));
result = runCAF(QualifiedName.make(CALPlatformTestModuleNames.RuntimeRegression, "seqTest3"), gCALServices, null);
assertEquals(result, new Double(7.0));
}
}
/**
* Tests the error message generated when trying to reduce a circular record definition
* or circular let variable definition in the lecc machine.
* circularLetVarDefinition =
* let
* a = b;
* b = c;
* c = a;
* in
* a + b + c + 1.0;
*
* circularRecordDefinition =
* let
* (a, b, c) = (c, a, b);
* in
* a + b + c + 1.0;
*
*/
public void testCircularRecordAndLetVarInLECC () {
if (test_lecc_machine) {
try {
runCAF (QualifiedName.make(CALPlatformTestModuleNames.M2, "circularLetVarDefinition"), leccCALServices, null);
fail ("Unexpected result from M2.circularLetVarDef");
} catch (CALExecutorException e) {
String message = e.getCause().getMessage();
assertEquals(message, "Invalid reduction state in indirection. This is probably caused by a circular let variable definition.");
}
try {
runCAF (QualifiedName.make(CALPlatformTestModuleNames.M2, "circularRecordDefinition"), leccCALServices, null);
fail ("Unexpected result from M2.circularLetVarDef");
} catch (CALExecutorException e) {
String message = e.getCause().getMessage();
assertEquals(message, "Invalid reduction state in record selection. This is probably caused by a circular record definition.");
}
}
}
}