Search code examples
pathnunitnant

How to get the path to NUnit nunit-console.exe


I'm trying to make a Nant script, it has been going well so far, but I wish to not hard code file locations. This is well and good until I have to execute nunit-console.exe which I can't seem to do. What I have found so far relating to this is:

<target name="test">
      <property name="windows-path" value="${string::to-lower(environment::get-variable('PATH'))}"/>
      <property name="nunit-in-path" value="${string::contains(windows-path, 'nunit')}"/>
      <echo message="${nunit-in-path}"/>
</target>

But this fails every time, so I would like to know couple of things:

  1. What does string::to-lower(environment::get-variable('PATH')) actually do?
  2. How do I make it so this doesn't break no matter what version of windows you use or where the nunit-console.exe is? (For example I have NUnit in Program Files(x86) on my PC but in Program Files on my laptop)

Solution

  • Ok I seem to have got it now, this is how my script looks now:

    <?xml version="1.0"?>
    <project name="Calculator" default="execute" basedir=".">
        <property name="InstallationDir" value="C:\BoolCalc" readonly="false"/>
        <property name="NUnitLocation" value="${path::combine(directory::get-current-directory(), 'NUnit\bin\net-2.0\nunit-console.exe')}" readonly="false" />
    
        <description>The build scripts for the bool calculator</description>
    
        <target name="clean" description="Remove all previous versions and generated files"><!--This ensures that old files are deleted if they are there and does nothing if they aren't-->
            <delete dir="${InstallationDir}" failonerror="false" /><!-- This deletes the directory on your computer for the previous versions, if there are any  -->
            <delete file="test\Calc.exe" failonerror="false" />
        </target>
    
        <target name="build" description="compiles the source code" depends="clean">
            <csc target="exe" output="test\Calc.exe" >
                <sources>
                    <include name="src\*.cs" />
                </sources>
                <references>
                    <include name="lib\nunit.framework.dll" />
                </references>
            </csc>
        </target>
    
        <target name="testProgram" description="Run unit tests" depends="build">
            <exec program="${NUnitLocation}"
             workingdir="test\"
             commandline="Calc.exe /xml:TestResults.xml /nologo" />
        </target>
    
        <target name="install" depends="testProgram">
            <echo message="Installing the boolean calculator to ${InstallationDir}"/>
            <copy todir="${InstallationDir}" overwrite="true">
                <fileset basedir="test\">
                    <include name="Calc.exe" />
                </fileset>
            </copy>
        </target>
    
        <target name="execute" depends="install">
            <echo message="Executing the calculator in ${InstallationDir}"/>
            <exec program="${InstallationDir}\Calc.exe" commandline="Calc.exe" />
        </target>
    </project>
    

    I took the advice and stuffed the Nunit file into workingdir and then create a complete path by using the combine and get-current-directory() to get its exact location.

    If you see anything wrong with this script, or something that could be improved please let me know. And thanks to calavera for explaining what I was confused about (didn't know I could do that) and thanks to Tim Robinson and Mark Simpson for the solution.