/*
*
* Copyright 2002-2004 The Ant-Contrib project
*
* 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 net.sf.antcontrib.cpptasks;
import java.io.File;
import java.io.IOException;
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
import net.sf.antcontrib.cpptasks.compiler.Linker;
import net.sf.antcontrib.cpptasks.devstudio.DevStudioLinker;
import net.sf.antcontrib.cpptasks.gcc.GccLinker;
import net.sf.antcontrib.cpptasks.types.FlexLong;
import net.sf.antcontrib.cpptasks.types.LibrarySet;
import net.sf.antcontrib.cpptasks.types.LinkerArgument;
import net.sf.antcontrib.cpptasks.types.SystemLibrarySet;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.FlexInteger;
import org.apache.tools.ant.types.Reference;
/**
* Tests for LinkerDef class.
*/
public final class TestLinkerDef
extends TestProcessorDef {
/**
* Constructor.
*
* @param name
* test name
*/
public TestLinkerDef(final String name) {
super(name);
}
/**
* Creates a processor.
*
* @return new linker
*/
protected ProcessorDef create() {
return new LinkerDef();
}
/**
* Test if setting the classname attribute to the name of the GCC linker
* results in the singleton GCC linker.
*/
public void testGetGcc() {
LinkerDef linkerDef = (LinkerDef) create();
linkerDef.setClassname("net.sf.antcontrib.cpptasks.gcc.GccLinker");
Linker comp = (Linker) linkerDef.getProcessor();
assertNotNull(comp);
assertSame(GccLinker.getInstance(), comp);
}
/**
* Test if setting the classname attribute to the name of the MSVC linker
* results in the singleton MSVC linker.
*/
public void testGetMSVC() {
LinkerDef linkerDef = (LinkerDef) create();
linkerDef
.setClassname("net.sf.antcontrib.cpptasks.devstudio.DevStudioLinker");
Linker comp = (Linker) linkerDef.getProcessor();
assertNotNull(comp);
assertSame(DevStudioLinker.getInstance(), comp);
}
/**
* Tests if setting the classname attribute to an bogus classname results in
* a BuildException.
*
*/
public void testUnknownClass() {
LinkerDef linkerDef = (LinkerDef) create();
try {
linkerDef
.setClassname("net.sf.antcontrib.cpptasks.bogus.BogusLinker");
} catch (BuildException ex) {
return;
}
fail("should have thrown exception");
}
/**
* Tests if setting the classname to the name of a class that doesn't
* support Linker throws a BuildException.
*
*/
public void testWrongType() {
LinkerDef linkerDef = (LinkerDef) create();
try {
linkerDef.setClassname("net.sf.antcontrib.cpptasks.CCTask");
} catch (ClassCastException ex) {
return;
}
fail("should have thrown exception");
}
/**
* Gets the command line arguments that appear before the filenames.
*
* @param processor processor under test
* @return command line arguments
*/
protected String[] getPreArguments(final ProcessorDef processor) {
return ((CommandLineLinkerConfiguration) getConfiguration(processor))
.getPreArguments();
}
/**
* Sets the name attribute.
*
* @param linker
* linker defintion
* @param name
* linker name
*/
private static void setLinkerName(final LinkerDef linker,
final String name) {
LinkerEnum linkerName = new LinkerEnum();
linkerName.setValue(name);
linker.setName(linkerName);
}
/**
* Tests that linkerarg's that appear in the base linker are effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsLinkerArgs() {
LinkerDef baseLinker = new LinkerDef();
LinkerArgument linkerArg = new LinkerArgument();
linkerArg.setValue("/base");
baseLinker.addConfiguredLinkerArg(linkerArg);
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
String[] preArgs = getPreArguments(extendedLinker);
assertEquals(1, preArgs.length);
assertEquals("/base", preArgs[0]);
}
/**
* Verify linkerarg's that appear in the base linker are effective when
* creating the command line for a linker that extends it, even if the
* linker is brought in through a reference.
*/
public void testExtendsLinkerArgsViaReference() {
Project project = new Project();
LinkerDef baseLinker = new LinkerDef();
baseLinker.setProject(project);
baseLinker.setId("base");
project.addReference("base", baseLinker);
LinkerArgument linkerArg = new LinkerArgument();
linkerArg.setValue("/base");
baseLinker.addConfiguredLinkerArg(linkerArg);
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
extendedLinker.setProject(project);
extendedLinker.setId("extended");
project.addReference("extended", extendedLinker);
LinkerDef linkerRef = new LinkerDef();
linkerRef.setProject(project);
linkerRef.setRefid(new Reference(project, "extended"));
String[] preArgs = getPreArguments(linkerRef);
assertEquals(1, preArgs.length);
assertEquals("/base", preArgs[0]);
}
/**
* Tests that fileset's that appear in the base linker are effective when
* creating the command line for a linker that extends it.
* @throws IOException if unable to create or delete temporary file
*/
public void testExtendsFileSet() throws IOException {
super.testExtendsFileSet(File.createTempFile("cpptaskstest", ".o"));
}
/**
* Tests that libset's that appear in the base linker are effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsLibSet() {
LinkerDef baseLinker = new LinkerDef();
LibrarySet libset = new LibrarySet();
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
libset.setProject(baseLinker.getProject());
CUtil.StringArrayBuilder libs = new CUtil.StringArrayBuilder("advapi32");
libset.setLibs(libs);
baseLinker.addLibset(libset);
CommandLineLinkerConfiguration config = (CommandLineLinkerConfiguration)
getConfiguration(extendedLinker);
String[] libnames = config.getLibraryNames();
assertEquals(1, libnames.length);
assertEquals("advapi32", libnames[0]);
}
/**
* Tests that syslibset's that appear in the base linker are effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsSysLibSet() {
LinkerDef baseLinker = new LinkerDef();
SystemLibrarySet libset = new SystemLibrarySet();
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
libset.setProject(baseLinker.getProject());
CUtil.StringArrayBuilder libs = new CUtil.StringArrayBuilder("advapi32");
libset.setLibs(libs);
baseLinker.addSyslibset(libset);
CommandLineLinkerConfiguration config = (CommandLineLinkerConfiguration)
getConfiguration(extendedLinker);
String[] libnames = config.getLibraryNames();
assertEquals(1, libnames.length);
assertEquals("advapi32", libnames[0]);
}
/**
* Tests that the base attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsBase() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setBase(new FlexLong("10000"));
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
setLinkerName(extendedLinker, "msvc");
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/BASE:0x2710", preArgs[3]);
}
/**
* Tests that the stack attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsStack() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setStack(new FlexInteger("10000"));
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
setLinkerName(extendedLinker, "msvc");
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/STACK:0x2710", preArgs[3]);
}
/**
* Tests that the entry attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsEntry() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setEntry("foo");
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("-e", preArgs[0]);
assertEquals("foo", preArgs[1]);
}
/**
* Tests that the fixed attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsFixed() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setFixed(true);
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
setLinkerName(extendedLinker, "msvc");
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/FIXED", preArgs[3]);
}
/**
* Tests that the incremental attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsIncremental() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setIncremental(true);
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
setLinkerName(extendedLinker, "msvc");
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:YES", preArgs[2]);
}
/**
* Tests that the map attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsMap() {
LinkerDef baseLinker = new LinkerDef();
baseLinker.setMap(true);
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
setLinkerName(extendedLinker, "msvc");
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/MAP", preArgs[3]);
}
/**
* Tests that the rebuild attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsRebuild() {
testExtendsRebuild(new LinkerDef());
}
/**
* Tests that the name attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsName() {
LinkerDef baseLinker = new LinkerDef();
setLinkerName(baseLinker, "msvc");
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
extendedLinker.setBase(new FlexLong("10000"));
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/BASE:0x2710", preArgs[3]);
}
/**
* Tests that the classname attribute in the base linker is effective when
* creating the command line for a linker that extends it.
*/
public void testExtendsClassname() {
LinkerDef baseLinker = new LinkerDef();
baseLinker
.setClassname("net.sf.antcontrib.cpptasks.devstudio.DevStudioLinker");
LinkerDef extendedLinker = (LinkerDef) createExtendedProcessorDef(
baseLinker);
extendedLinker.setBase(new FlexLong("10000"));
String[] preArgs = getPreArguments(extendedLinker);
assertEquals("/NOLOGO", preArgs[0]);
assertEquals("/SUBSYSTEM:WINDOWS", preArgs[1]);
assertEquals("/INCREMENTAL:NO", preArgs[2]);
assertEquals("/BASE:0x2710", preArgs[3]);
}
}