scripts for validation on windows

This commit is contained in:
Malcolm Noyes 2013-12-09 14:32:35 +00:00
parent 36cb967220
commit a0af453cda
18 changed files with 3761 additions and 11 deletions

View File

@ -16,13 +16,19 @@ Global
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
DebugMbcs|Win32 = DebugMbcs|Win32
Release|Win32 = Release|Win32
ReleaseMbcs|Win32 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.Debug|Win32.ActiveCfg = Debug|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.Debug|Win32.Build.0 = Debug|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.DebugMbcs|Win32.ActiveCfg = DebugMbcs|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.DebugMbcs|Win32.Build.0 = DebugMbcs|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.Release|Win32.ActiveCfg = Release|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.Release|Win32.Build.0 = Release|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.ReleaseMbcs|Win32.ActiveCfg = ReleaseMbcs|Win32
{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}.ReleaseMbcs|Win32.Build.0 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,17 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="DebugMbcs|Win32">
<Configuration>DebugMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseMbcs|Win32">
<Configuration>ReleaseMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<TargetName>DefaultTest</TargetName>
<TargetName>$(ProjectName)</TargetName>
<ProjectTypes>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}</ProjectTypes>
<ProjectGUID>{7CC06A6B-763E-42B3-AF6C-8F1E340372A1}</ProjectGUID>
<Keyword>ManagedCProj</Keyword>
@ -23,24 +31,42 @@
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CLRSupport>true</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CLRSupport>Safe</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CLRSupport>Safe</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="PropertySheets">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="PropertySheets">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<PropertyGroup>
<PostBuildEventCommand>if exist app.config copy app.config "$(OutDir)app.config"</PostBuildEventCommand>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">true</LinkIncremental>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
@ -58,6 +84,22 @@
</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>..\..\..\include</AdditionalIncludeDirectories>
<CompileAsManaged>true</CompileAsManaged>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>
</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
@ -72,6 +114,20 @@
</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<CompileAsManaged>true</CompileAsManaged>
<AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>
</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
<Reference Include="System" />
@ -81,6 +137,7 @@
<ItemGroup>
<ClCompile Include="..\..\SelfTest\ApproxTests.cpp" />
<ClCompile Include="..\..\SelfTest\BDDTests.cpp" />
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp" />
<ClCompile Include="..\..\SelfTest\ClassTests.cpp" />
<ClCompile Include="..\..\SelfTest\CmdLineTests.cpp" />
<ClCompile Include="..\..\SelfTest\ConditionTests.cpp" />
@ -90,13 +147,18 @@
<ClCompile Include="..\..\SelfTest\MessageInstantiationTests2.cpp" />
<ClCompile Include="..\..\SelfTest\MessageTests.cpp" />
<ClCompile Include="..\..\SelfTest\MiscTests.cpp" />
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp" />
<ClCompile Include="..\..\SelfTest\SectionTrackerTests.cpp" />
<ClCompile Include="..\..\SelfTest\TestMain.cpp" />
<ClCompile Include="..\..\SelfTest\TrickyTests.cpp" />
<ClCompile Include="..\..\SelfTest\VariadicMacrosTests.cpp" />
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp" />
<ClCompile Include="AssemblyInfo.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>

View File

@ -63,6 +63,18 @@
<ClCompile Include="..\..\SelfTest\MessageInstantiationTests2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\TestMain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">

View File

@ -94,8 +94,6 @@
<ClCompile Include="..\..\..\SelfTest\ApproxTests.cpp" />
<ClCompile Include="..\..\..\SelfTest\BDDTests.cpp" />
<ClCompile Include="..\..\..\SelfTest\CmdLineTests.cpp" />
<ClCompile Include="..\..\..\SelfTest\MessageInstantiationTests1.cpp" />
<ClCompile Include="..\..\..\SelfTest\MessageInstantiationTests2.cpp" />
<ClCompile Include="..\..\..\SelfTest\SectionTrackerTests.cpp" />
<ClCompile Include="..\..\..\SelfTest\TestMain.cpp" />
<ClCompile Include="..\..\..\SelfTest\catch_self_test.cpp" />

View File

@ -28,12 +28,6 @@
<ClCompile Include="..\..\..\SelfTest\GeneratorTests.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\..\SelfTest\MessageInstantiationTests1.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\..\SelfTest\MessageInstantiationTests2.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\..\SelfTest\MessageTests.cpp">
<Filter>Sources</Filter>
</ClCompile>

View File

@ -6,13 +6,19 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
DebugMbcs|Win32 = DebugMbcs|Win32
Release|Win32 = Release|Win32
ReleaseMbcs|Win32 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9757CB21-B840-49A6-B057-9F322E543DD6}.Debug|Win32.ActiveCfg = Debug|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.Debug|Win32.Build.0 = Debug|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.DebugMbcs|Win32.ActiveCfg = DebugMbcs|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.DebugMbcs|Win32.Build.0 = DebugMbcs|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.Release|Win32.ActiveCfg = Release|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.Release|Win32.Build.0 = Release|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.ReleaseMbcs|Win32.ActiveCfg = ReleaseMbcs|Win32
{9757CB21-B840-49A6-B057-9F322E543DD6}.ReleaseMbcs|Win32.Build.0 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,17 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="DebugMbcs|Win32">
<Configuration>DebugMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseMbcs|Win32">
<Configuration>ReleaseMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<TargetName>DefaultTest</TargetName>
<TargetName>$(ProjectName)</TargetName>
<ProjectTypes>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}</ProjectTypes>
<ProjectGUID>{9757CB21-B840-49A6-B057-9F322E543DD6}</ProjectGUID>
<Keyword>ManagedCProj</Keyword>
@ -24,30 +32,54 @@
<CLRSupport>Safe</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v110</PlatformToolset>
<CLRSupport>Safe</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v110</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v110</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="PropertySheets">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="PropertySheets">
<Import Project="$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\11.0\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
<PropertyGroup>
<PostBuildEventCommand>if exist app.config copy app.config "$(OutDir)app.config"</PostBuildEventCommand>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
@ -66,6 +98,25 @@
<Command>taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories>
<CompileAsManaged>true</CompileAsManaged>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>
</AdditionalDependencies>
</Link>
<PreBuildEvent>
<Command>taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
@ -79,6 +130,20 @@
<AdditionalDependencies />
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories>
<CompileAsManaged>true</CompileAsManaged>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>
</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework">
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll</HintPath>
@ -91,6 +156,7 @@
<ItemGroup>
<ClCompile Include="..\..\SelfTest\ApproxTests.cpp" />
<ClCompile Include="..\..\SelfTest\BDDTests.cpp" />
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp" />
<ClCompile Include="..\..\SelfTest\ClassTests.cpp" />
<ClCompile Include="..\..\SelfTest\CmdLineTests.cpp" />
<ClCompile Include="..\..\SelfTest\ConditionTests.cpp" />
@ -100,13 +166,18 @@
<ClCompile Include="..\..\SelfTest\MessageInstantiationTests2.cpp" />
<ClCompile Include="..\..\SelfTest\MessageTests.cpp" />
<ClCompile Include="..\..\SelfTest\MiscTests.cpp" />
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp" />
<ClCompile Include="..\..\SelfTest\SectionTrackerTests.cpp" />
<ClCompile Include="..\..\SelfTest\TestMain.cpp" />
<ClCompile Include="..\..\SelfTest\TrickyTests.cpp" />
<ClCompile Include="..\..\SelfTest\VariadicMacrosTests.cpp" />
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp" />
<ClCompile Include="AssemblyInfo.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>

View File

@ -63,6 +63,18 @@
<ClCompile Include="..\..\SelfTest\MessageInstantiationTests2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\TestMain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">

View File

@ -6,13 +6,19 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
DebugMbcs|Win32 = DebugMbcs|Win32
Release|Win32 = Release|Win32
ReleaseMbcs|Win32 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.Debug|Win32.ActiveCfg = Debug|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.Debug|Win32.Build.0 = Debug|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.DebugMbcs|Win32.ActiveCfg = DebugMbcs|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.DebugMbcs|Win32.Build.0 = DebugMbcs|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.Release|Win32.ActiveCfg = Release|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.Release|Win32.Build.0 = Release|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.ReleaseMbcs|Win32.ActiveCfg = ReleaseMbcs|Win32
{977CE524-3FC7-4281-9C1B-77C210F24A9B}.ReleaseMbcs|Win32.Build.0 = ReleaseMbcs|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,10 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="DebugMbcs|Win32">
<Configuration>DebugMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseMbcs|Win32">
<Configuration>ReleaseMbcs</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@ -23,6 +31,20 @@
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
@ -37,6 +59,12 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@ -44,6 +72,12 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
@ -62,6 +96,36 @@
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../../../include;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../../../include;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
@ -88,6 +152,7 @@
<ItemGroup>
<ClCompile Include="..\..\SelfTest\ApproxTests.cpp" />
<ClCompile Include="..\..\SelfTest\BDDTests.cpp" />
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp" />
<ClCompile Include="..\..\SelfTest\ClassTests.cpp" />
<ClCompile Include="..\..\SelfTest\CmdLineTests.cpp" />
<ClCompile Include="..\..\SelfTest\ConditionTests.cpp" />
@ -97,11 +162,16 @@
<ClCompile Include="..\..\SelfTest\MessageInstantiationTests2.cpp" />
<ClCompile Include="..\..\SelfTest\MessageTests.cpp" />
<ClCompile Include="..\..\SelfTest\MiscTests.cpp" />
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp" />
<ClCompile Include="..\..\SelfTest\SectionTrackerTests.cpp" />
<ClCompile Include="..\..\SelfTest\TestMain.cpp" />
<ClCompile Include="..\..\SelfTest\TrickyTests.cpp" />
<ClCompile Include="..\..\SelfTest\VariadicMacrosTests.cpp" />
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DebugMbcs|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseMbcs|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>

View File

@ -68,5 +68,17 @@
<ClCompile Include="..\..\SelfTest\TrickyTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\catch_self_test.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\RunAllTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\TestMain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\SelfTest\VisualStudioTests.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

716
scripts/approvalVSTests.py Normal file
View File

@ -0,0 +1,716 @@
#!/c/Python27/python
import os
import sys
import subprocess
import re
import xml.etree.cElementTree as etree
from scriptCommon import catchPath
#from rawfile import writeRawFile
#from rawfile import parseRawFileIntoTree
from catch_test_run import TestRunApprovedHandler
from catch_test_run import TestRunData
from catch_test_run import TestRunResultHandler
from catch_test_case import TestCaseResultParser
from catch_test_case import TestCaseData
rootPath = os.path.join(os.path.join(os.path.join( catchPath, 'projects'), 'SelfTest'), 'Baselines' )
if len(sys.argv) == 2:
cmdPath = sys.argv[1]
else:
if sys.platform == 'win32':
cmdPath = os.path.join( catchPath, 'projects\\VS2010\\TestCatch\\Release\\TestCatch.exe' )
dllPath = os.path.join( catchPath, 'projects\\VS2010\\ManagedTestCatch\\Release\\ManagedTestCatch.dll' )
else:
cmdPath = os.path.join( catchPath, 'projects/XCode4/CatchSelfTest/DerivedData/CatchSelfTest/Build/Products/Debug/CatchSelfTest' )
print cmdPath
overallResult = 0
def approve( baseName, args ):
global overallResult
args[0:0] = [cmdPath]
baselinesPath = os.path.join( rootPath, '{0}.approved.txt'.format( baseName ) )
baselinesSortedPath = os.path.join( rootPath, '{0}.sorted.approved.txt'.format( baseName ) )
rawResultsPath = os.path.join( rootPath, '_{0}.tmp'.format( baseName ) )
if os.path.exists( baselinesPath ):
approvedFileHandler = TestRunApprovedHandler(baselinesPath)
baselinesPathNew = os.path.join( rootPath, '{0}.approved.new.txt'.format( baseName ) )
approvedFileHandler.writeRawFile(baselinesPathNew)
approvedFileHandler.writeSortedRawFile(baselinesSortedPath)
else:
raise Exception("Base file does not exist: '" + baselinesPath + "'")
if not(os.path.exists( args[0] )):
raise Exception("Executable does not exist: '" + args[0] + "'")
f = open( rawResultsPath, 'w' )
subprocess.call( args, stdout=f, stderr=f )
f.close()
if os.path.exists( rawResultsPath ):
resultFileHandler = TestRunResultHandler(rawResultsPath)
rawPathNew = os.path.join( rootPath, '{0}.rewrite.txt'.format( baseName ) )
#print "F:",rawPathNew,",",approvedFileHandler.current.outputLine
resultFileHandler.writeRawFile(rawPathNew)
rawPathNewSorted = os.path.join( rootPath, '{0}.sorted.unapproved.txt'.format( baseName ) )
resultFileHandler.writeSortedUnapprovedFile(rawPathNewSorted, approvedFileHandler.current.outputLine)
else:
raise Exception("Results file does not exist: '" + rawResultsPath + "'")
#os.remove( rawResultsPath )
print
print baseName + ":"
if os.path.exists( baselinesSortedPath ) and os.path.exists( rawPathNewSorted ):
diffResult = subprocess.call([ "diff", "--ignore-all-space", baselinesSortedPath, rawPathNewSorted ] )
if diffResult == 0:
#os.remove( filteredResultsPath )
if not(sys.platform == 'win32'):
print " \033[92mResults matched"
else:
print " Results matched"
else:
if not(sys.platform == 'win32'):
print " \n****************************\n \033[91mResults differed"
else:
print " \n****************************\n Results differed"
if diffResult > overallResult:
overallResult = diffResult
if not(sys.platform == 'win32'):
print "\033[0m"
def approveJunit( baseName, args ):
global overallResult
args[0:0] = [cmdPath]
baselinesPath = os.path.join( rootPath, '{0}.approved.txt'.format( baseName ) )
baselinesSortedPath = os.path.join( rootPath, '{0}.sorted.approved.txt'.format( baseName ) )
#baselinesFixedPath = os.path.join( rootPath, '{0}.rewrite.approved.txt'.format( baseName ) )
rawResultsPath = os.path.join( rootPath, '_{0}.tmp'.format( baseName ) )
if os.path.exists( baselinesPath ):
xml = ""
f = open( baselinesPath, 'r' )
for line in f:
xml += line
xml = xml.replace("<line number>", "&lt;line number&gt;")
xml = xml.replace("<hex digits>", "&lt;hex digits&gt;")
#f2 = open( baselinesFixedPath, 'wb' )
#f2.write(xml)
#f2.close()
# ClassTests.cpp:<line number>
otherApprovedTestParser = re.compile( r'(.*\..pp).*:<(.*).*>' )
testRun = TestRunData()
testcase = None
root = etree.fromstring(xml)
for testsuites in root:
if testsuites.tag == "testsuite":
testRun = TestRunData()
testRun.appname = testsuites.get("name")
testRun.errors = testsuites.get("errors")
testRun.failures = testsuites.get("failures")
testRun.tests = testsuites.get("tests")
for tc in testsuites:
if tc.tag == "testcase":
cls = tc.get("classname")
#print "C:",cls,tc
if len(cls):
testcase = testRun.addClassTestCase(cls, tc.get("name"))
else:
testcase = testRun.addTestCase(tc.get("name"))
for prop in tc:
if prop.tag == "failure":
text = prop.text.strip()
lines = text.splitlines()
filename = ""
lineNumber = ""
output = []
for l in lines:
m = otherApprovedTestParser.match(l)
if m:
filename = m.group(1)
lineNumber = m.group(2)
else:
output.append(l)
testcase.addFailure(filename, lineNumber, output, prop.get("message"), prop.get("type"))
elif prop.tag == "error":
text = prop.text.strip()
lines = text.splitlines()
filename = ""
lineNumber = ""
output = []
for l in lines:
m = otherApprovedTestParser.match(l)
if m:
filename = m.group(1)
lineNumber = m.group(2)
else:
output.append(l)
testcase.addError(filename, lineNumber, output, prop.get("message"), prop.get("type"))
elif prop.tag == "system-out":
text = prop.text.strip()
lines = text.splitlines()
testcase.addSysout(lines)
elif prop.tag == "system-err":
text = prop.text.strip()
lines = text.splitlines()
testcase.addSyserr(lines)
elif tc.tag == "system-out":
text = tc.text.strip()
lines = text.splitlines()
testRun.addSysout(lines)
elif tc.tag == "system-err":
text = tc.text.strip()
lines = text.splitlines()
testRun.addSyserr(lines)
else:
print tc.tag
lines = testRun.generateSortedUnapprovedJunit()
rawWriteFile = open( baselinesSortedPath, 'wb' )
for line in lines:
#print "L:",line
rawWriteFile.write(line + "\n")
rawWriteFile.close()
if not(os.path.exists( args[0] )):
raise Exception("Executable does not exist: '" + args[0] + "'")
f = open( rawResultsPath, 'w' )
subprocess.call( args, stdout=f, stderr=f )
f.close()
rawSortedPath = os.path.join( rootPath, '{0}.sorted.unapproved.txt'.format( baseName ) )
if os.path.exists( rawResultsPath ):
xml = ""
f = open( rawResultsPath, 'r' )
for line in f:
xml += line
#xml = xml.replace("<line number>", "&lt;line number&gt;")
#xml = xml.replace("<hex digits>", "&lt;hex digits&gt;")
# ClassTests.cpp:<line number>
otherResultsTestParser = re.compile( r'(.*\\)(.*\..pp).*\((.*).*\)' )
testRun = TestRunData()
testcase = None
root = etree.fromstring(xml)
for testsuites in root:
if testsuites.tag == "testsuite":
testRun = TestRunData()
testRun.appname = testsuites.get("name")
testRun.errors = testsuites.get("errors")
testRun.failures = testsuites.get("failures")
testRun.tests = testsuites.get("tests")
for tc in testsuites:
if tc.tag == "testcase":
cls = tc.get("classname")
#print "C:",cls,tc
if len(cls):
if cls.startswith("::"):
cls = cls[2:]
testcase = testRun.addClassTestCase(cls, tc.get("name"))
else:
testcase = testRun.addTestCase(tc.get("name"))
for prop in tc:
if prop.tag == "failure":
text = prop.text.strip()
lines = text.splitlines()
filename = ""
lineNumber = ""
output = []
for l in lines:
m = otherResultsTestParser.match(l)
if m:
filename = m.group(2)
lineNumber = "line number"
else:
output.append(l)
testcase.addFailure(filename, lineNumber, output, prop.get("message"), prop.get("type"))
elif prop.tag == "error":
text = prop.text.strip()
lines = text.splitlines()
filename = ""
lineNumber = ""
output = []
for l in lines:
m = otherResultsTestParser.match(l)
if m:
filename = m.group(2)
lineNumber = "line number"
else:
output.append(l)
testcase.addError(filename, lineNumber, output, prop.get("message"), prop.get("type"))
elif prop.tag == "system-out":
text = prop.text.strip()
lines = text.splitlines()
testcase.addSysout(lines)
elif prop.tag == "system-err":
text = prop.text.strip()
lines = text.splitlines()
testcase.addSyserr(lines)
elif tc.tag == "system-out":
text = tc.text.strip()
lines = text.splitlines()
testRun.addSysout(lines)
elif tc.tag == "system-err":
text = tc.text.strip()
lines = text.splitlines()
testRun.addSyserr(lines)
else:
print tc.tag
lines = testRun.generateSortedUnapprovedJunit()
rawWriteFile = open( rawSortedPath, 'wb' )
for line in lines:
#print "L:",line
rawWriteFile.write(line + "\n")
rawWriteFile.close()
def addSubSection(testcase, section, exp):
r = exp.find("OverallResults")
if r != None:
ores = []
ores.append(r.get("successes"))
ores.append(r.get("failures"))
if section == None:
section = testcase.addSection(exp.get("name"), exp.get("description"), ores)
else:
section = testcase.addSubSection(section, exp.get("name"), exp.get("description"), ores)
e1 = False
for tmp in exp:
if tmp.tag == "OverallResults":
pass
elif tmp.tag == "Exception":
filename = tmp.get("filename")
text = tmp.text
ls = text.splitlines()
testcase.addSubException(section, filename, ls)
elif tmp.tag == "Section":
addSubSection(testcase, section, tmp)
elif tmp.tag == "Failure":
text = tmp.text
ls = text.splitlines()
testcase.addSubFailure(section, ls)
elif tmp.tag == "Expression":
#print "Exp:",tmp
e1 = True
result = tmp.get("success")
filename = tmp.get("filename")
subSection = testcase.addSubExpression(section,result,filename)
subExp = []
for cond in tmp:
if cond.tag == "Original":
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Expanded" and len(subExp) == 1:
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Exception" and len(subExp) == 2:
subExp.append(cond.get("filename"))
text = cond.text
ls = text.splitlines()
subExp.append(ls)
else:
print "SX:",cond.tag
if len(subExp) >= 2:
testcase.addExpressionDetails(subSection, subExp)
else:
print "Z:",tmp.tag
#if e1:
# print "Section:",section
def addResultsSubSection(otherResultsTestParser, testcase, section, exp):
r = exp.find("OverallResults")
if r != None:
ores = []
ores.append(r.get("successes"))
ores.append(r.get("failures"))
if section == None:
section = testcase.addSection(exp.get("name"), exp.get("description"), ores)
else:
section = testcase.addSubSection(section, exp.get("name"), exp.get("description"), ores)
e1 = False
for tmp in exp:
if tmp.tag == "OverallResults":
pass
elif tmp.tag == "Exception":
filename = tmp.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
text = tmp.text
ls = text.splitlines()
testcase.addSubException(section, filename, ls)
elif tmp.tag == "Section":
addResultsSubSection(otherResultsTestParser, testcase, section, tmp)
elif tmp.tag == "Failure":
text = tmp.text
ls = text.splitlines()
testcase.addSubFailure(section, ls)
elif tmp.tag == "Expression":
#print "Exp:",tmp
e1 = True
result = tmp.get("success")
filename = tmp.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
subSection = testcase.addSubExpression(section,result,filename)
subExp = []
for cond in tmp:
if cond.tag == "Original":
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Expanded" and len(subExp) == 1:
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Exception" and len(subExp) == 2:
filename = cond.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
subExp.append(filename)
text = cond.text
ls = text.splitlines()
subExp.append(ls)
else:
print "SX:",cond.tag
if len(subExp) >= 2:
testcase.addExpressionDetails(subSection, subExp)
else:
print "Z:",tmp.tag
#if e1:
# print "Section:",section
def approveXml( baseName, args ):
global overallResult
args[0:0] = [cmdPath]
baselinesPath = os.path.join( rootPath, '{0}.approved.txt'.format( baseName ) )
baselinesSortedPath = os.path.join( rootPath, '{0}.sorted.approved.txt'.format( baseName ) )
#baselinesFixedPath = os.path.join( rootPath, '{0}.rewrite.approved.txt'.format( baseName ) )
rawResultsPath = os.path.join( rootPath, '_{0}.tmp'.format( baseName ) )
if os.path.exists( baselinesPath ):
xml = ""
f = open( baselinesPath, 'r' )
for line in f:
xml += line
xml = xml.replace("<hex digits>", "&lt;hex digits&gt;")
#otherApprovedTestParser = re.compile( r'(.*\..pp).*:<(.*).*>' )
testRun = TestRunData()
testcase = None
root = etree.fromstring(xml)
testRun.appname = root.get("name")
for ts in root:
#print ts.tag
for tc in ts:
if tc.tag == "TestCase":
testcase = testRun.addTestCase(tc.get("name"))
for exp in tc:
if exp.tag == "Expression":
result = exp.get("success")
filename = exp.get("filename")
section = testcase.addExpression(result,filename)
subExp = []
for cond in exp:
if cond.tag == "Original":
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Expanded" and len(subExp) == 1:
text = cond.text
ls = text.splitlines()
subExp.append(ls)
elif cond.tag == "Exception" and len(subExp) == 2:
subExp.append(cond.get("filename"))
text = cond.text
ls = text.splitlines()
subExp.append(ls)
else:
print "X:",cond.tag
if len(subExp) >= 2:
testcase.addExpressionDetails(section, subExp)
elif exp.tag == "Exception":
filename = exp.get("filename")
text = exp.text
ls = text.splitlines()
section = testcase.addException(filename,ls)
elif exp.tag == "Section":
addSubSection(testcase, None, exp)
elif exp.tag == "Info":
text = exp.text
ls = text.splitlines()
section = testcase.addInfo(ls)
elif exp.tag == "Warning":
text = exp.text
ls = text.splitlines()
section = testcase.addWarning(ls)
elif exp.tag == "Failure":
text = exp.text
ls = text.splitlines()
section = testcase.addSimpleFailure(ls)
elif exp.tag == "OverallResult":
testcase.addOverallResult(exp.get("success"))
else:
print "E:",exp.tag
elif tc.tag == "OverallResults":
testRun.tests = tc.get("successes")
testRun.failures = tc.get("failures")
else:
print "U:",tc.tag
lines = testRun.generateSortedUnapprovedXml()
rawWriteFile = open( baselinesSortedPath, 'wb' )
for line in lines:
#print "L:",line
rawWriteFile.write(line + "\n")
rawWriteFile.close()
if not(os.path.exists( args[0] )):
raise Exception("Executable does not exist: '" + args[0] + "'")
f = open( rawResultsPath, 'w' )
subprocess.call( args, stdout=f, stderr=f )
f.close()
rawSortedPath = os.path.join( rootPath, '{0}.sorted.unapproved.txt'.format( baseName ) )
if os.path.exists( rawResultsPath ):
xml = ""
f = open( rawResultsPath, 'r' )
for line in f:
xml += line
#xml = xml.replace("<hex digits>", "&lt;hex digits&gt;")
otherResultsTestParser = re.compile( r'(.*\\)(.*\..pp)' )
hexParser = re.compile( r'(.*)\b(0[xX][0-9a-fA-F]+)\b(.*)' )
testRun = TestRunData()
testcase = None
root = etree.fromstring(xml)
testRun.appname = root.get("name")
if testRun.appname == "TestCatch.exe":
testRun.appname = "CatchSelfTest"
for ts in root:
#print ts.tag
for tc in ts:
if tc.tag == "TestCase":
testcase = testRun.addTestCase(tc.get("name"))
for exp in tc:
if exp.tag == "Expression":
result = exp.get("success")
filename = exp.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
section = testcase.addExpression(result,filename)
subExp = []
for cond in exp:
if cond.tag == "Original":
text = cond.text
tmp = text.splitlines()
ls = []
for li in tmp:
m = hexParser.match(li)
if m:
while m:
#print li, m.group(1), m.group(3)
li = m.group(1) + "0x<hex digits>" + m.group(3)
m = hexParser.match(li)
ls.append(li)
subExp.append(ls)
elif cond.tag == "Expanded" and len(subExp) == 1:
text = cond.text
tmp = text.splitlines()
ls = []
for li in tmp:
m = hexParser.match(li)
if m:
while m:
#print li, m.group(1), m.group(3)
li = m.group(1) + "0x<hex digits>" + m.group(3)
m = hexParser.match(li)
ls.append(li)
subExp.append(ls)
elif cond.tag == "Exception" and len(subExp) == 2:
filename = cond.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
subExp.append(filename)
text = cond.text
ls = text.splitlines()
subExp.append(ls)
else:
print "X:",cond.tag
if len(subExp) >= 2:
testcase.addExpressionDetails(section, subExp)
elif exp.tag == "Exception":
filename = exp.get("filename")
m = otherResultsTestParser.match(filename)
if m:
filename = "/Users/philnash/Dev/OSS/Catch/projects/SelfTest/" + m.group(2)
text = exp.text
ls = text.splitlines()
section = testcase.addException(filename,ls)
elif exp.tag == "Section":
addResultsSubSection(otherResultsTestParser, testcase, None, exp)
elif exp.tag == "Info":
text = exp.text
ls = text.splitlines()
section = testcase.addInfo(ls)
elif exp.tag == "Warning":
text = exp.text
ls = text.splitlines()
section = testcase.addWarning(ls)
elif exp.tag == "Failure":
text = exp.text
ls = text.splitlines()
section = testcase.addSimpleFailure(ls)
elif exp.tag == "OverallResult":
testcase.addOverallResult(exp.get("success"))
else:
print "E:",exp.tag
elif tc.tag == "OverallResults":
testRun.tests = tc.get("successes")
testRun.failures = tc.get("failures")
else:
print "U:",tc.tag
lines = testRun.generateSortedUnapprovedXml()
rawWriteFile = open( rawSortedPath, 'wb' )
for line in lines:
#print "L:",line
rawWriteFile.write(line + "\n")
rawWriteFile.close()
def parseTrxFile(trxFile):
print "TRX file:" ,trxFile
if os.path.exists( trxFile ):
xml = ""
f = open( trxFile, 'r' )
for line in f:
xml += line
#otherResultsTestParser = re.compile( r'(.*\\)(.*\..pp)' )
#hexParser = re.compile( r'(.*)\b(0[xX][0-9a-fA-F]+)\b(.*)' )
testRun = TestRunData()
testRun.appname = "CatchSelfTest"
root = etree.fromstring(xml)
if testRun.appname == "TestCatch.exe":
testRun.appname = "CatchSelfTest"
qname=re.compile("{(?P<ns>.*)}(?P<element>.*)")
ids = []
for ts in root:
m = qname.match(ts.tag)
if m:
tag = m.group(2)
print tag
if tag != None:
if tag == "TestDefinitions":
for tc in ts:
m = qname.match(tc.tag)
if m:
tag = m.group(2)
if tag != None and tag == "UnitTest":
name = tc.get("name")
id = tc.get("id")
for item in tc:
m = qname.match(item.tag)
if m:
tag = m.group(2)
if tag != None and tag == "Description":
desc = item.text
#print desc, id
ids.append([id,desc])
elif tag == "Results":
#print ids
ids = dict(ids)
#print ids["87ec526a-e414-1a3f-ba0f-e210b204bb42"]
resultParser = TestCaseResultParser()
for tc in ts:
m = qname.match(tc.tag)
if m:
tag = m.group(2)
if tag != None and tag == "UnitTestResult":
outcome = tc.get("outcome")
id = tc.get("testId")
if len(id) > 0:
for item in tc:
m = qname.match(item.tag)
if m:
tag = m.group(2)
if tag != None and tag == "Output":
for sub in item:
m = qname.match(sub.tag)
if m:
tag = m.group(2)
if tag != None and tag == "StdOut":
desc = sub.text
lines = desc.splitlines()
if (len(lines) > 2 and
lines[0].startswith("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") and
lines[1].startswith("Using Catch v") ):
lines = lines[2:-1]
#print "*******",desc
#print lines
for line in lines:
testcase = resultParser.parseResultLine(line)
if isinstance(testcase, TestCaseData):
testRun.testcases.append(testcase)
lines = testRun.generateSortedUnapprovedLines(0)
rawSortedPath = os.path.join( rootPath, 'mstest.trx.sorted.unapproved.txt' )
rawWriteFile = open( rawSortedPath, 'wb' )
for line in lines:
#print "L:",line
rawWriteFile.write(line + "\n")
rawWriteFile.close()
def approveMsTest( baseName ):
rawResultsPath = os.path.join( rootPath, '_{0}.tmp'.format( baseName ) )
if not(os.path.exists( dllPath )):
raise Exception("Managed DLL does not exist: '" + dllPath + "'")
args = []
args.append("MSTest.exe")
args.append("/testcontainer:" + dllPath)
#f = open( rawResultsPath, 'w' )
#subprocess.call( args, stdout=f, stderr=f )
#f.close()
#if os.path.exists( rawResultsPath ):
# f = open( rawResultsPath, 'r' )
# for line in f:
line = "Results file: c:\Projects\Catch\TestResults\NoyesMa_SACHDEW7 2013-12-09 11_43_57.trx"
if line.startswith("Results file:"):
trxFile = line[13:].strip()
parseTrxFile(trxFile)
# Standard console reporter
#approve( "console.std", ["~_"] )
# console reporter, include passes, warn about No Assertions
#approve( "console.sw", ["~_", "-s", "-w", "NoAssertions"] )
# console reporter, include passes, warn about No Assertions, limit failures to first 4
#approve( "console.swa4", ["~_", "-s", "-w", "NoAssertions", "-x", "4"] )
# junit reporter, include passes, warn about No Assertions
#approveJunit( "junit.sw", ["~_", "-s", "-w", "NoAssertions", "-r", "junit"] )
# xml reporter, include passes, warn about No Assertions
#approveXml( "xml.sw", ["~_", "-s", "-w", "NoAssertions", "-r", "xml"] )
#mstest runner, xml output
approveMsTest( "mstest.sw")
if overallResult <> 0:
print "run approve.py to approve new baselines"
exit( overallResult)

398
scripts/catch_conditions.py Normal file
View File

@ -0,0 +1,398 @@
import re
class RandomOutput:
def __init__(self):
output = []
class TestConditionData:
NONE = 0
CONDITION = 1
EXPANSION = 2
MESSAGES = 3
hexParser = re.compile( r'(.*)\b(0[xX][0-9a-fA-F]+)\b(.*)' )
def __init__(self):
self.state = self.NONE
self.filenamePrefix = ""
self.filename = ""
self.lineNumber = ""
self.reason = ""
self.condition = ""
self.expansionPrefix = ""
self.expansion = []
self.messagePrefix = ""
self.messages = []
self.output = []
self.noAssertions = ""
def __eq__(self, other):
return (self.filenamePrefix == other.filenamePrefix and
self.filename == other.filename and self.lineNumber == other.lineNumber and
self.reason == other.reason and self.condition == other.condition and
self.expansion == other.expansion and self.messagePrefix == other.messagePrefix and
self.output == other.output and self.noAssertions == other.noAssertions)
def empty(self):
if self.state == self.NONE:
return True
return False
def __repr__(self):
result = ("[" + self.reason + ", " + self.filename + ", " + self.lineNumber + ", " + self.condition +
", " + self.expansionPrefix + ", [ ")
suffix = ""
for msg in self.expansion:
result += suffix
result += repr(msg)
suffix = ", "
result += "], " + self.messagePrefix + ", [ "
suffix = ""
for msg in self.messages:
result += suffix
result += repr(msg)
suffix = ", "
result += " ], [ "
suffix = ""
for msg in self.output:
result += suffix
result += repr(msg)
suffix = ", "
result += " ] ]"
return result
def parseCondition(self,line):
if len(line):
if self.state == self.CONDITION and line.startswith(" "):
self.condition = line.strip()
elif self.state == self.CONDITION:
if len(self.reason) == 0 and line.startswith("PASSED:"):
self.reason = line.strip()
elif line.startswith("warning:") or line.startswith("with message"):
self.messagePrefix = line.strip()
self.state = self.MESSAGES
elif not(line.startswith(" ")):
self.expansionPrefix = line.strip()
self.state = self.EXPANSION
else:
raise Exception("Unknown condition parse line: '" + line + "'")
elif self.state == self.EXPANSION:
if line.startswith("with message"):
self.messagePrefix = line.strip()
self.state = self.MESSAGES
elif line.startswith(" "):
#print "***LINE: ", line
self.expansion.append(line[2:].rstrip())
elif line.startswith("... message truncated due"):
#print "***MSG: ", line
self.messagePrefix = line.strip()
else:
#print "***OUTPUT: ", line
self.output.append(line.strip())
elif self.state == self.MESSAGES:
if line.startswith(" "):
#print "***MESSAGE: ", line
self.messages.append(line.strip())
else:
#print "***OUTPUT: ", line
self.output.append(line.strip())
else:
raise Exception("Unknown parse line: '" + line + "'")
if len(self.output) == 10:
if (self.output[0] == "Message from section one" and self.output[1] == "Message from section two" and
self.output[2] == "Some information" and self.output[3] == "An error" and
self.output[4] == "Message from section one" and self.output[5] == "Message from section two" and
self.output[6] == "Some information" and self.output[7] == "An error" and
self.output[8] == "hello" and self.output[9] == "hello" ):
obj = RandomOutput()
obj.output = self.output
self.output = []
raise obj
elif len(self.output) == 2:
if (self.output[0] == "hello" and self.output[1] == "hello" ):
obj = RandomOutput()
obj.output = self.output
self.output = []
raise obj
def generateApprovedLines(self):
if self.empty():
raise Exception("Empty condition..." + repr(self))
lines = []
extraLine = False
if len(self.filename):
line = self.filename + ":<" + self.lineNumber + ">:"
reasonOnSameLine = False
if self.reason == "FAILED":
line += " " + "FAILED:"
reasonOnSameLine = True
lines.append(line)
if not(reasonOnSameLine) and len(self.reason):
lines.append(self.reason)
if len(self.condition):
lines.append(" " + self.condition)
if len(self.expansionPrefix):
lines.append(self.expansionPrefix)
extraLine = True
if len(self.expansion):
for line in self.expansion:
m = self.hexParser.match(line)
if m:
while m:
line = m.group(1) + "0x<hex digits>" + m.group(3)
m = self.hexParser.match(line)
lines.append(" " + line)
if len(self.messagePrefix):
lines.append(self.messagePrefix)
extraLine = True
if len(self.messages):
for msg in self.messages:
lines.append(" " + msg)
lines.append("")
if len(self.noAssertions) > 0:
if extraLine:
lines.append("")
lines.append(self.noAssertions)
lines.append("")
if len(self.output):
for msg in self.output:
lines.append(msg)
return lines
def generateResultLines(self):
if self.empty():
raise Exception("Empty condition..." + repr(self))
lines = []
extraLine = False
if len(self.filename):
if len(self.filenamePrefix):
line = self.filenamePrefix + self.filename + "(" + self.lineNumber + "):"
else:
line = self.filename + "(" + self.lineNumber + "):"
reasonOnSameLine = False
if self.reason == "FAILED":
line += " " + "FAILED:"
reasonOnSameLine = True
if (len(self.messagePrefix) > 0 and self.messagePrefix == "warning:" or
self.reason == "PASSED:" or self.expansionPrefix.startswith("FAILED - but was ok") ):
line += " "
lines.append(line)
if not(reasonOnSameLine) and len(self.reason):
lines.append(self.reason)
if len(self.condition):
lines.append(" " + self.condition)
if len(self.expansionPrefix):
lines.append(self.expansionPrefix)
extraLine = True
if len(self.expansion):
for line in self.expansion:
lines.append(" " + line)
if len(self.messagePrefix):
lines.append(self.messagePrefix)
extraLine = True
if len(self.messages):
for msg in self.messages:
lines.append(" " + msg)
lines.append("")
if len(self.noAssertions) > 0:
if extraLine:
lines.append("")
lines.append(self.noAssertions)
lines.append("")
if len(self.output):
for msg in self.output:
lines.append(msg)
return lines
def generateUnapprovedLines(self):
if self.empty():
raise Exception("Empty condition..." + repr(self))
lines = []
extraLine = False
if len(self.filename):
line = self.filename + ":<" + "line number" + ">:"
reasonOnSameLine = False
if self.reason == "FAILED":
line += " " + "FAILED:"
reasonOnSameLine = True
lines.append(line)
if not(reasonOnSameLine) and len(self.reason):
lines.append(self.reason)
if len(self.condition):
lines.append(" " + self.condition)
if len(self.expansionPrefix):
lines.append(self.expansionPrefix)
extraLine = True
if len(self.expansion):
for line in self.expansion:
m = self.hexParser.match(line)
if m:
while m:
line = m.group(1) + "0x<hex digits>" + m.group(3)
m = self.hexParser.match(line)
lines.append(" " + line)
if len(self.messagePrefix):
lines.append(self.messagePrefix)
extraLine = True
if len(self.messages):
for msg in self.messages:
lines.append(" " + msg)
lines.append("")
if len(self.noAssertions) > 0:
if extraLine:
lines.append("")
lines.append(self.noAssertions)
lines.append("")
if len(self.output):
for msg in self.output:
lines.append(msg)
return lines
def addFailure(self, filename, lineNumber, output, message, type):
self.reason = "failure"
self.filename = filename
self.lineNumber = lineNumber
self.condition = type
if message != None:
self.expansion.append(message)
self.output = output
def addError(self, filename, lineNumber, output, message, type):
self.reason = "error"
self.filename = filename
self.lineNumber = lineNumber
self.condition = type
if message != None:
self.expansion.append(message)
self.output = output
def generateUnapprovedJunit(self):
lines = []
msg = ""
for m in self.expansion:
msg += m
msg = msg.replace("\"", "&quot;")
msg = msg.replace("<", "&lt;")
msg = msg.replace("&lt;hex digits>", "<hex digits>")
#msg = msg.replace(">", "&gt;")
#print "R:",self.reason,msg,self.condition
if len(self.reason) > 0:
l = " <" + self.reason
if len(msg) > 0:
m = self.hexParser.match(msg)
if m:
while m:
msg = m.group(1) + "0x<hex digits>" + m.group(3)
m = self.hexParser.match(msg)
l += " message=\"" + msg + "\""
if self.condition != None:
l += " type=\"" + self.condition + "\""
l += ">"
lines.append(l)
if len(self.output) > 0:
for o in self.output:
lines.append(o)
if len(self.filename) > 0:
lines.append(self.filename + ":<" + self.lineNumber + ">")
lines.append(" </" + self.reason + ">")
return lines
class TestConditionApprovedParser:
failedApprovedTestParser = re.compile( r'(.*\..pp).*:<(.*).*>:(.*FAILED)' )
otherApprovedTestParser = re.compile( r'(.*\..pp).*:<(.*).*>:' )
def __init__(self):
self.current = TestConditionData()
def parseApprovedLine(self,line):
result = None
if line.startswith("==============================================================================="):
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
elif line.startswith("-------------------------------------------------------------------------------"):
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
else:
if line.startswith("No assertions in"):
self.current.noAssertions = line.strip()
self.current.state = self.current.MESSAGES
else:
m = self.failedApprovedTestParser.match(line)
if m:
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
self.current.filename = m.group(1).strip()
self.current.lineNumber = m.group(2).strip()
self.current.reason = m.group(3).strip()
self.current.state = self.current.CONDITION
else:
m = self.otherApprovedTestParser.match(line)
if m:
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
self.current.filename = m.group(1).strip()
self.current.lineNumber = m.group(2).strip()
self.current.state = self.current.CONDITION
elif not(self.current.empty()):
self.current.parseCondition(line)
return result
class TestConditionResultParser:
failedResultsTestParser = re.compile( r'(.*\\)(.*\..pp).*\((.*).*\):(.*FAILED)' )
otherResultsTestParser = re.compile( r'(.*\\)(.*\..pp).*\((.*).*\):' )
def __init__(self):
self.current = TestConditionData()
def parseResultLine(self,line):
result = None
if line.startswith("==============================================================================="):
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
elif line.startswith("-------------------------------------------------------------------------------"):
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
else:
if line.startswith("No assertions in"):
self.current.noAssertions = line.strip()
self.current.state = self.current.MESSAGES
else:
m = self.failedResultsTestParser.match(line)
if m:
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
self.current.filenamePrefix = m.group(1).strip()
self.current.filename = m.group(2).strip()
self.current.lineNumber = m.group(3).strip()
self.current.reason = m.group(4).strip()
self.current.state = self.current.CONDITION
else:
m = self.otherResultsTestParser.match(line)
if m:
if not(self.current.empty()):
result = self.current
self.current = TestConditionData()
self.current.filenamePrefix = m.group(1).strip()
self.current.filename = m.group(2).strip()
self.current.lineNumber = m.group(3).strip()
self.current.state = self.current.CONDITION
elif not(self.current.empty()):
self.current.parseCondition(line)
return result

584
scripts/catch_test_case.py Normal file
View File

@ -0,0 +1,584 @@
import re
from catch_conditions import TestConditionData
from catch_conditions import TestConditionApprovedParser
from catch_conditions import TestConditionResultParser
class EndOfClassName:
@staticmethod
def parseRawLine(line):
if line.startswith("..............................................................................."):
return ParseResult.END_OF_CLASS_NAME
return ParseResult.NONE
class TestCaseData:
def __init__(self):
self.name = ""
self.nameParts = []
self.classname = "global"
self.sections = []
self.filenamePrefix = ""
self.filename = ""
self.lineNumber = ""
self.conditions = []
self.sysout = []
self.syserr = []
self.result = ""
def __eq__(self, other):
return self.__dict__ == other.__dict__
def __repr__(self):
result = "[" + self.name + ", [ "
suffix = ""
for section in self.sections:
result += suffix
result += repr(section)
suffix = ", "
result + " ] "
result += self.filename + ", " + self.lineNumber + " [ "
suffix = ""
for cond in self.conditions:
result += suffix
result += repr(cond)
suffix = ", "
result + " ] ]"
return result
def empty(self):
if len(self.name):
return False
return True
def generateApprovedLines(self):
if self.empty():
raise Exception("Empty test case..." + repr(self))
lines = []
if len(self.name):
lines.append("-------------------------------------------------------------------------------")
for n in self.nameParts:
lines.append(n)
if len(self.sections) > 0:
for section in self.sections:
lines.append(" " + section)
lines.append("-------------------------------------------------------------------------------")
if len(self.filename):
lines.append(self.filename + ":<" + self.lineNumber + ">")
lines.append("...............................................................................")
lines.append("")
for cond in self.conditions:
lines += cond.generateApprovedLines()
return lines
def generateResultLines(self):
if self.empty():
raise Exception("Empty test case..." + repr(self))
lines = []
if len(self.name):
lines.append("-------------------------------------------------------------------------------")
for n in self.nameParts:
lines.append(n)
if len(self.sections) > 0:
for section in self.sections:
lines.append(" " + section)
lines.append("-------------------------------------------------------------------------------")
if len(self.filename):
lines.append(self.filenamePrefix + self.filename + "(" + self.lineNumber + ")")
lines.append("...............................................................................")
lines.append("")
for cond in self.conditions:
lines += cond.generateResultLines()
return lines
def generateUnapprovedLines(self):
if self.empty():
raise Exception("Empty test case..." + repr(self))
lines = []
if len(self.name):
lines.append("-------------------------------------------------------------------------------")
for n in self.nameParts:
lines.append(n)
if len(self.sections) > 0:
for section in self.sections:
lines.append(" " + section)
lines.append("-------------------------------------------------------------------------------")
if len(self.filename):
lines.append(self.filename + ":<" + "line number" + ">")
lines.append("...............................................................................")
lines.append("")
for cond in self.conditions:
lines += cond.generateUnapprovedLines()
return lines
def generateUnapprovedJunit(self):
lines = []
condLines = []
for cond in self.conditions:
condLines += cond.generateUnapprovedJunit()
if len(self.name):
l = " <testcase classname=\"" + self.classname + "\" name=\"" + self.name + "\" time=\"{duration}\""
if len(condLines) > 0 or len(self.sysout) > 0 or len(self.syserr) > 0:
l += ">"
else:
l += "/>"
lines.append(l)
#if len(self.sections) > 0:
# for section in self.sections:
# lines.append(" " + section)
#if len(self.filename):
# lines.append(self.filename + ":<" + "line number" + ">")
# lines.append("...............................................................................")
lines += condLines
if len(self.sysout) > 0:
lines.append(" <system-out>")
for l in self.sysout:
lines.append(l)
lines.append(" </system-out>")
if len(self.syserr) > 0:
lines.append(" <system-err>")
for l in self.syserr:
lines.append(l)
lines.append(" </system-err>")
if len(condLines) > 0 or len(self.sysout) > 0 or len(self.syserr) > 0:
lines.append(" </testcase>")
return lines
def generateRecursiveSection(self, prefix, section):
lines = []
#print "S:",section
if section[0] == "S":
l = " " + prefix + "<Section name=\"" + section[1] + "\""
if section[2] != None:
li = section[2]
li = li.replace("&","&amp;")
li = li.replace("<","&lt;")
li = li.replace("&lt;hex digits>","<hex digits>")
li = li.replace("\"","&quot;")
l += " description=\"" + li + "\""
l += ">"
lines.append(l)
if len(section) > 4:
index = 4
while index < len(section):
tmp = section[index]
if len(tmp) > 0:
if tmp[0] == "E":
l = " " + prefix + "<Expression success=\"" + tmp[1] + "\""
if tmp[2] != None:
l += " filename=\"" + tmp[2] + "\""
l += " >"
lines.append(l)
if len(tmp) > 3:
cond = tmp[3]
if len(cond[0]) > 0:
lines.append(" " + prefix + "<Original>")
for li in cond[0]:
if len(li.strip()) > 0:
li = li.replace("<","&lt;")
li = li.replace("&lt;hex digits>","<hex digits>")
li = li.replace("\"","&quot;")
lines.append(li)
lines.append(" " + prefix + "</Original>")
if len(cond[1]) > 0:
lines.append(" " + prefix + "<Expanded>")
for li in cond[1]:
if len(li.strip()) > 0:
li = li.replace("<","&lt;")
li = li.replace("&lt;hex digits>","<hex digits>")
li = li.replace("\"","&quot;")
lines.append(li)
lines.append(" " + prefix + "</Expanded>")
if len(cond) > 2:
filename = cond[2]
lines.append(" " + prefix + "<Exception filename=\"" + filename + "\" >")
if len(cond) > 3:
tmp = cond[3]
for li in tmp:
if len(li.strip()) > 0:
lines.append(li)
lines.append(" " + prefix + "</Exception>")
elif len(tmp) > 4:
print "RE:",tmp[4]
l = " " + prefix + "</Expression>"
lines.append(l)
elif tmp[0] == "X":
l = " " + prefix + "<Exception filename=\"" + tmp[1] + "\" >"
lines.append(l)
for li in tmp[2]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Exception>"
lines.append(l)
elif tmp[0] == "F":
l = " " + prefix + "<Failure>"
lines.append(l)
for li in tmp[1]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Failure>"
lines.append(l)
elif tmp[0] == "S":
lines += self.generateRecursiveSection(prefix + " ", tmp)
else:
print "RS2:",tmp[0]
else:
print "RS:",section[index]
index += 1
lines.append(" " + prefix + "<OverallResults successes=\"" + section[3][0] + "\" failures=\"" + section[3][1] + "\"/>")
l = " " + prefix + "</Section>"
lines.append(l)
return lines
def generateSection(self, prefix, sections):
lines = []
for section in sections:
#print "S:",section
if section[0] == "S":
lines += self.generateRecursiveSection(prefix, section)
elif section[0] == "E":
l = " " + prefix + "<Expression success=\"" + section[1] + "\""
if section[2] != None:
l += " filename=\"" + section[2] + "\""
l += " >"
lines.append(l)
if len(section) > 3:
cond = section[3]
if len(cond[0]) > 0:
lines.append(" " + prefix + "<Original>")
for li in cond[0]:
if len(li.strip()) > 0:
li = li.replace("&","&amp;")
li = li.replace("<","&lt;")
li = li.replace("&lt;hex digits>","<hex digits>")
li = li.replace("\"","&quot;")
lines.append(li)
lines.append(" " + prefix + "</Original>")
if len(cond[1]) > 0:
lines.append(" " + prefix + "<Expanded>")
for li in cond[1]:
if len(li.strip()) > 0:
li = li.replace("<","&lt;")
li = li.replace("&lt;hex digits>","<hex digits>")
li = li.replace("\"","&quot;")
lines.append(li)
lines.append(" " + prefix + "</Expanded>")
if len(cond) > 2:
filename = cond[2]
lines.append(" " + prefix + "<Exception filename=\"" + filename + "\" >")
if len(cond) > 3:
tmp = cond[3]
for li in tmp:
if len(li.strip()) > 0:
lines.append(li)
lines.append(" " + prefix + "</Exception>")
elif len(section) > 4:
print "RE:",section[4]
l = " " + prefix + "</Expression>"
lines.append(l)
elif section[0] == "X":
l = " " + prefix + "<Exception filename=\"" + section[1] + "\" >"
lines.append(l)
for li in section[2]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Exception>"
lines.append(l)
elif section[0] == "I":
l = " " + prefix + "<Info>"
lines.append(l)
for li in section[1]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Info>"
lines.append(l)
elif section[0] == "W":
l = " " + prefix + "<Warning>"
lines.append(l)
for li in section[1]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Warning>"
lines.append(l)
elif section[0] == "F":
l = " " + prefix + "<Failure>"
lines.append(l)
for li in section[1]:
if len(li.strip()) > 0:
lines.append(li)
l = " " + prefix + "</Failure>"
lines.append(l)
return lines
def generateUnapprovedXml(self):
lines = []
if len(self.name):
l = " <TestCase name=\"" + self.name + "\">"
lines.append(l)
if len(self.sections) > 0:
prefix = " "
lines += self.generateSection(prefix, self.sections)
if len(self.result) > 0:
lines.append(" <OverallResult success=\"" + self.result + "\"/>")
if len(self.name):
l = " </TestCase>"
lines.append(l)
return lines
def addFailure(self, filename, lineNumber, output, message, type):
self.filename = filename
self.lineNumber = lineNumber
condition = TestConditionData()
condition.addFailure(filename, lineNumber, output, message, type)
self.conditions.append(condition)
def addError(self, filename, lineNumber, output, message, type):
self.filename = filename
self.lineNumber = lineNumber
condition = TestConditionData()
condition.addError(filename, lineNumber, output, message, type)
self.conditions.append(condition)
def addSysout(self, output):
self.sysout = output
def addSyserr(self, output):
self.syserr = output
def addOverallResult(self,r):
self.result = r
def addSection(self,name,desc, results):
section = []
section.append("S")
section.append(name)
section.append(desc)
section.append(results)
self.sections.append(section)
return section
def addExpression(self,result,filename):
section = []
section.append("E")
section.append(result)
section.append(filename)
self.sections.append(section)
return section
def addException(self,filename,text):
section = []
section.append("X")
section.append(filename)
section.append(text)
#print section
self.sections.append(section)
return section
def addInfo(self,text):
section = []
section.append("I")
section.append(text)
self.sections.append(section)
return section
def addWarning(self,text):
section = []
section.append("W")
section.append(text)
self.sections.append(section)
return section
def addSimpleFailure(self,text):
section = []
section.append("F")
section.append(text)
self.sections.append(section)
return section
def addExpressionDetails(self, section, subExp):
section.append(subExp)
def addSubException(self, section, filename, text):
tmp = []
tmp.append("X")
tmp.append(filename)
tmp.append(text)
section.append(tmp)
def addSubFailure(self, section, text):
tmp = []
tmp.append("F")
tmp.append(text)
section.append(tmp)
def addSubExpression(self,section,result,filename):
tmp = []
tmp.append("E")
tmp.append(result)
tmp.append(filename)
section.append(tmp)
#print "Section:",section
return tmp
def addSubSection(self,section,name,desc,results):
tmp = []
tmp.append("S")
tmp.append(name)
tmp.append(desc)
tmp.append(results)
section.append(tmp)
#print "Section:",section
return tmp
class TestCaseApprovedParser:
NONE = 0
TEST_CASE_NAME_EXPECTED = 1
TEST_CASE_NAME = 2
TEST_CLASS_EXPECTED = 3
END_OF_CLASS_NAME_EXPECTED = 4
TEST_CONDITION_EXPECTED = 5
testFilenameParser = re.compile( r'(.*\..pp).*:<(.*).*>' )
def __init__(self):
self.state = self.NONE
self.current = TestCaseData()
self.conditionParser = TestConditionApprovedParser()
def parseApprovedLine(self,line):
result = None
if self.state == self.NONE:
if line.startswith("-------------------------------------------------------------------------------"):
self.state = self.TEST_CASE_NAME_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_NAME_EXPECTED:
if len(line):
self.current.name = line.strip()
self.current.nameParts.append(line.strip())
self.state = self.TEST_CASE_NAME
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_NAME:
if line.startswith("-------------------------------------------------------------------------------"):
self.state = self.TEST_CLASS_EXPECTED
elif line.startswith(" "):
#print "***SECTION: ",line
self.current.sections.append(line[2:])
elif len(line):
if len(self.current.name) > 0:
self.current.name += line.strip()
else:
self.current.name = line.strip()
self.current.nameParts.append(line.strip())
elif self.state == self.TEST_CLASS_EXPECTED:
m = self.testFilenameParser.match(line)
if m:
self.current.filename = m.group(1).strip()
self.current.lineNumber = m.group(2).strip()
self.state = self.END_OF_CLASS_NAME_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.END_OF_CLASS_NAME_EXPECTED:
if line.startswith("..............................................................................."):
self.state = self.TEST_CONDITION_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CONDITION_EXPECTED:
#print "**** LINE " + line
condition = self.conditionParser.parseApprovedLine(line)
if isinstance(condition, TestConditionData):
#print "**** CASE " + repr(condition)
self.current.conditions.append(condition)
if line.startswith("-------------------------------------------------------------------------------"):
result = self.current
self.current = TestCaseData()
self.state = self.TEST_CASE_NAME_EXPECTED
elif line.startswith("==============================================================================="):
result = self.current
self.current = TestCaseData()
self.state = self.NONE
return result
class TestCaseResultParser:
NONE = 0
TEST_CASE_NAME_EXPECTED = 1
TEST_CASE_NAME = 2
TEST_CLASS_EXPECTED = 3
END_OF_CLASS_NAME_EXPECTED = 4
TEST_CONDITION_EXPECTED = 5
testFilenameParser = re.compile( r'(.*\\)(.*\..pp).*\((.*).*\)' )
def __init__(self):
self.state = self.NONE
self.current = TestCaseData()
self.conditionParser = TestConditionResultParser()
def parseResultLine(self,line):
result = None
if self.state == self.NONE:
if line.startswith("-------------------------------------------------------------------------------"):
self.state = self.TEST_CASE_NAME_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_NAME_EXPECTED:
if len(line):
self.current.name = line.strip()
self.current.nameParts.append(line.strip())
self.state = self.TEST_CASE_NAME
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_NAME:
if line.startswith("-------------------------------------------------------------------------------"):
self.state = self.TEST_CLASS_EXPECTED
elif line.startswith(" "):
#print "***SECTION: ",line
self.current.sections.append(line[2:])
elif len(line):
if len(self.current.name) > 0:
self.current.name += line.strip()
else:
self.current.name = line.strip()
self.current.nameParts.append(line.strip())
elif self.state == self.TEST_CLASS_EXPECTED:
m = self.testFilenameParser.match(line)
if m:
self.current.filenamePrefix = m.group(1).strip()
self.current.filename = m.group(2).strip()
self.current.lineNumber = m.group(3).strip()
self.state = self.END_OF_CLASS_NAME_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.END_OF_CLASS_NAME_EXPECTED:
if line.startswith("..............................................................................."):
self.state = self.TEST_CONDITION_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CONDITION_EXPECTED:
#print "**** LINE " + line
condition = self.conditionParser.parseResultLine(line)
if isinstance(condition, TestConditionData):
#print "**** CASE " + repr(condition)
self.current.conditions.append(condition)
if line.startswith("-------------------------------------------------------------------------------"):
result = self.current
self.current = TestCaseData()
self.state = self.TEST_CASE_NAME_EXPECTED
elif line.startswith("==============================================================================="):
result = self.current
self.current = TestCaseData()
self.state = self.NONE
return result

430
scripts/catch_test_run.py Normal file
View File

@ -0,0 +1,430 @@
import re
import os
from catch_test_case import TestCaseApprovedParser
from catch_test_case import TestCaseResultParser
from catch_test_case import TestCaseData
from catch_conditions import RandomOutput
class TestRunData:
def __init__(self):
self.appname = ""
self.version = ""
self.testcases = []
self.results = ""
self.output = []
self.outputLine = 0
self.writtenOutput = False
self.sysout = []
self.syserr = []
self.errors = ""
self.failures = ""
self.tests = ""
def __eq__(self, other):
return self.__dict__ == other.__dict__
def __repr__(self):
result = "[" + self.appname + ", " + self.version + " [ "
suffix = ""
for case in self.testcases:
result += suffix
result += repr(case)
suffix = ", "
result += " ]"
result += self.results
result += " ]"
return result
def empty(self):
if len(self.appname):
return False
return True
def generateApprovedLines(self):
if self.empty():
raise Exception("Empty test run..." + repr(self))
lines = []
self.writtenOutput = False
if not(self.writtenOutput) and len(self.output) > 0 and self.outputLine == 0:
lines += self.output
self.writtenOutput = True
if len(self.appname):
lines.append("")
lines.append("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
lines.append(self.appname + " is a " + self.version + " host application.")
lines.append("Run with -? for options")
lines.append("")
for case in self.testcases:
lines += case.generateApprovedLines()
if not(self.writtenOutput) and len(self.output) > 0 and len(lines) >= self.outputLine:
lines += self.output
self.writtenOutput = True
lines.append("===============================================================================")
lines.append(self.results)
lines.append("")
return lines
def generateSortedApprovedLines(self):
if self.empty():
raise Exception("Empty test run..." + repr(self))
lines = []
self.writtenOutput = False
if not(self.writtenOutput) and len(self.output) > 0 and self.outputLine == 0:
lines += self.output
self.writtenOutput = True
if len(self.appname):
lines.append("")
lines.append("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
lines.append(self.appname + " is a " + self.version + " host application.")
lines.append("Run with -? for options")
lines.append("")
sortedTestcases = sorted(self.testcases, key=lambda x: x.name, reverse=False)
for case in sortedTestcases:
lines += case.generateApprovedLines()
if not(self.writtenOutput) and len(self.output) > 0 and len(lines) >= self.outputLine:
lines += self.output
self.writtenOutput = True
lines.append("===============================================================================")
lines.append(self.results)
lines.append("")
return lines
def generateResultLines(self):
if self.empty():
raise Exception("Empty test run..." + repr(self))
lines = []
self.writtenOutput = False
if not(self.writtenOutput) and len(self.output) > 0 and self.outputLine == 0:
lines += self.output
self.writtenOutput = True
if len(self.appname):
lines.append("")
lines.append("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
lines.append(self.appname + " is a " + self.version + " host application.")
lines.append("Run with -? for options")
lines.append("")
for case in self.testcases:
lines += case.generateResultLines()
if not(self.writtenOutput) and len(self.output) > 0 and len(lines) >= self.outputLine:
lines += self.output
self.writtenOutput = True
lines.append("===============================================================================")
lines.append(self.results)
lines.append("")
return lines
def generateUnapprovedLines(self, outputLine):
if self.empty():
raise Exception("Empty test run..." + repr(self))
lines = []
self.writtenOutput = False
#print "U:",outputLine,",",self.output
if not(self.writtenOutput) and len(self.output) > 0 and outputLine == 0:
lines += self.output
self.writtenOutput = True
if len(self.appname):
lines.append("")
lines.append("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
lines.append("CatchSelfTest" + " is a " + "<version>" + " host application.")
lines.append("Run with -? for options")
lines.append("")
for case in self.testcases:
lines += case.generateUnapprovedLines()
if not(self.writtenOutput) and len(self.output) > 0 and len(lines) >= outputLine:
lines += self.output
self.writtenOutput = True
lines.append("===============================================================================")
lines.append(self.results)
lines.append("")
return lines
def generateSortedUnapprovedLines(self, outputLine):
if self.empty():
raise Exception("Empty test run..." + repr(self))
lines = []
self.writtenOutput = False
#print "U:",outputLine,",",self.output
if not(self.writtenOutput) and len(self.output) > 0 and outputLine == 0:
lines += self.output
self.writtenOutput = True
if len(self.appname):
lines.append("")
lines.append("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
lines.append("CatchSelfTest" + " is a " + "<version>" + " host application.")
lines.append("Run with -? for options")
lines.append("")
sortedTestcases = sorted(self.testcases, key=lambda x: x.name, reverse=False)
for case in sortedTestcases:
lines += case.generateUnapprovedLines()
if not(self.writtenOutput) and len(self.output) > 0 and len(lines) >= outputLine:
lines += self.output
self.writtenOutput = True
lines.append("===============================================================================")
lines.append(self.results)
lines.append("")
return lines
def generateSortedUnapprovedJunit(self):
lines = []
#print "U:",outputLine,",",self.output
lines.append("<testsuites>")
l = " <testsuite name=\""
l += self.appname
l += "\" errors=\""
l += self.errors
l += "\" failures=\""
l += self.failures
l += "\" tests=\""
l += self.tests
l += "\" hostname=\"tbd\" time=\"{duration}\" timestamp=\"tbd\">"
lines.append(l)
sortedTestcases = sorted(self.testcases, key=lambda x: x.classname, reverse=False)
sortedTestcases = sorted(sortedTestcases, key=lambda x: x.name, reverse=False)
#sortedTestcases = self.testcases
for case in sortedTestcases:
lines += case.generateUnapprovedJunit()
if len(self.sysout) > 0:
lines.append(" <system-out>")
for l in self.sysout:
lines.append(l)
lines.append(" </system-out>")
if len(self.syserr) > 0:
lines.append(" <system-err>")
for l in self.syserr:
lines.append(l)
lines.append(" </system-err>")
lines.append(" </testsuite>")
lines.append("</testsuites>")
return lines
def generateSortedUnapprovedXml(self):
lines = []
#print "U:",outputLine,",",self.output
lines.append("<Catch name=\"" + self.appname + "\">")
lines.append(" <Group name=\"~_\">")
sortedTestcases = sorted(self.testcases, key=lambda x: x.classname, reverse=False)
sortedTestcases = sorted(sortedTestcases, key=lambda x: x.name, reverse=False)
#sortedTestcases = self.testcases
for case in sortedTestcases:
lines += case.generateUnapprovedXml()
l = "<OverallResults successes=\""
# successes="663" failures="109"
l += self.tests
l += "\" failures=\""
l += self.failures
l += "\"/>"
lines.append(" " + l)
lines.append(" </Group>")
lines.append(" " + l)
lines.append("</Catch>")
return lines
def addTestCase(self, name):
testcase = TestCaseData()
testcase.name = name
testcase.nameParts.append(name)
self.testcases.append(testcase)
return testcase
def addClassTestCase(self, cls, name):
testcase = TestCaseData()
testcase.classname = cls
testcase.name = name
testcase.nameParts.append(name)
self.testcases.append(testcase)
return testcase
def addSysout(self, output):
self.sysout = output
def addSyserr(self, output):
self.syserr = output
class TestRunApprovedParser:
NONE = 0
VERSION_EXPECTED = 1
TEST_CASE_EXPECTED = 2
END_RUN_INFO = 3
versionParser = re.compile( r'(.*)is a (<version>*).*' )
def __init__(self):
self.state = self.NONE
self.current = TestRunData()
self.testcaseParser = TestCaseApprovedParser()
self.lineNumber = 0
def parseApprovedLine(self,line):
result = None
if self.state == self.NONE:
if line.startswith("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"):
self.state = self.VERSION_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.VERSION_EXPECTED:
m = self.versionParser.match(line)
if m:
self.current.appname = m.group(1).strip()
self.current.version = m.group(2).strip()
self.state = self.TEST_CASE_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_EXPECTED:
if line == "Run with -? for options":
pass
else:
testcase = None
try:
testcase = self.testcaseParser.parseApprovedLine(line)
except RandomOutput as e:
#print "E:", self.lineNumber, ", ",e.output
self.current.output = e.output
self.current.outputLine = self.lineNumber - 10
if isinstance(testcase, TestCaseData):
self.current.testcases.append(testcase)
if line.startswith("==============================================================================="):
self.state = self.END_RUN_INFO
elif self.state == self.END_RUN_INFO:
if len(line):
self.current.results = line.strip()
result = self.current
self.lineNumber += 1
return result
class TestRunApprovedHandler:
def __init__(self, filePath):
rawFile = open( filePath, 'r' )
parser = TestRunApprovedParser()
lineNumber = 0
self.current = None
for line in rawFile:
line = line.rstrip()
#print "L:", lineNumber, "'",line,"'"
result = parser.parseApprovedLine(line)
if isinstance(result, TestRunData):
self.current = result
lineNumber += 1
if not(isinstance(self.current, TestRunData) ):
raise Exception("File could not be parsed: '" + filePath + "'")
def writeRawFile(self,filePath):
rawWriteFile = open( filePath, 'wb' )
lines = self.current.generateApprovedLines()
for line in lines:
rawWriteFile.write(line + "\n")
def writeSortedRawFile(self,filePath):
rawWriteFile = open( filePath, 'wb' )
lines = self.current.generateSortedApprovedLines()
for line in lines:
rawWriteFile.write(line + "\n")
class TestRunResultParser:
NONE = 0
VERSION_EXPECTED = 1
TEST_CASE_EXPECTED = 2
END_RUN_INFO = 3
versionParser = re.compile( r'(.*)is a (Catch v[0-9]*.[0-9]* b[0-9]*).*' )
def __init__(self):
self.state = self.NONE
self.current = TestRunData()
self.testcaseParser = TestCaseResultParser()
self.lineNumber = 0
def parseResultLine(self,line):
result = None
if self.state == self.NONE:
if line.startswith("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"):
self.state = self.VERSION_EXPECTED
elif len(line):
self.current.output.append(line.strip())
if len(self.current.output) == 10:
if (self.current.output[0] == "Message from section one" and self.current.output[1] == "Message from section two" and
self.current.output[2] == "Some information" and self.current.output[3] == "An error" and
self.current.output[4] == "Message from section one" and self.current.output[5] == "Message from section two" and
self.current.output[6] == "Some information" and self.current.output[7] == "An error" and
self.current.output[8] == "hello" and self.current.output[9] == "hello" ):
self.current.outputLine = self.lineNumber - 9
elif self.state == self.VERSION_EXPECTED:
m = self.versionParser.match(line)
if m:
self.current.appname = m.group(1).strip()
self.current.version = m.group(2).strip()
self.state = self.TEST_CASE_EXPECTED
elif len(line):
raise Exception("Unknown parse line: '" + line + "'")
elif self.state == self.TEST_CASE_EXPECTED:
if line == "Run with -? for options":
pass
else:
testcase = None
try:
testcase = self.testcaseParser.parseResultLine(line)
except RandomOutput as e:
#print "E:", self.lineNumber, ", ",e.output
self.current.output = e.output
self.current.outputLine = self.lineNumber - 10
if isinstance(testcase, TestCaseData):
self.current.testcases.append(testcase)
if line.startswith("==============================================================================="):
self.state = self.END_RUN_INFO
elif self.state == self.END_RUN_INFO:
if len(line):
self.current.results = line.strip()
result = self.current
self.lineNumber += 1
return result
class TestRunResultHandler:
def __init__(self, filePath):
rawFile = open( filePath, 'r' )
parser = TestRunResultParser()
lineNumber = 0
self.current = None
for line in rawFile:
line = line.rstrip()
#print "L:", lineNumber, "'",line,"'"
result = parser.parseResultLine(line)
if isinstance(result, TestRunData):
self.current = result
lineNumber += 1
if not(isinstance(self.current, TestRunData) ):
raise Exception("File could not be parsed: '" + filePath + "'")
def writeRawFile(self,filePath):
rawWriteFile = open( filePath, 'wb' )
lines = self.current.generateResultLines()
for line in lines:
rawWriteFile.write(line + os.linesep)
def writeUnapprovedFile(self,filePath,outputLine):
rawWriteFile = open( filePath, 'wb' )
lines = self.current.generateUnapprovedLines(outputLine)
for line in lines:
rawWriteFile.write(line + "\n")
def writeSortedUnapprovedFile(self,filePath,outputLine):
rawWriteFile = open( filePath, 'wb' )
lines = self.current.generateSortedUnapprovedLines(outputLine)
for line in lines:
rawWriteFile.write(line + "\n")

698
scripts/test_conditions.py Normal file
View File

@ -0,0 +1,698 @@
import unittest
import catch_conditions
from catch_conditions import TestConditionApprovedParser
from catch_conditions import TestConditionResultParser
from catch_conditions import TestConditionData
from catch_conditions import RandomOutput
class ConditionTest(unittest.TestCase):
def testConditionEquality(self):
c1 = TestConditionData()
c2 = TestConditionData()
c1.state = TestConditionData.CONDITION
c2.state = TestConditionData.EXPANSION
c1.filenamePrefix = "..\\..\\Test"
c2.filenamePrefix = "..\\..\\Test"
self.assertTrue(c1 == c2)
c2.filenamePrefix = "..\\..\\Junk"
self.assertFalse(c1 == c2)
self.assertTrue(c1 != c2)
def testEndOfTestRunIsFound(self):
obj = TestConditionApprovedParser()
line = "==============================================================================="
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.empty())
def testEndOfTestCaseIsFound(self):
obj = TestConditionApprovedParser()
line = "-------------------------------------------------------------------------------"
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.empty())
def testFailedConditionIsFound(self):
obj = TestConditionApprovedParser()
line = "ClassTests.cpp:<line number>: FAILED:"
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue( not(obj.current.empty()) )
def testOtherConditionIsFound(self):
obj = TestConditionApprovedParser()
line = "ClassTests.cpp:<line number>:"
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue( not(obj.current.empty()) )
def testFailedConditionSetsReason(self):
obj = TestConditionApprovedParser()
line = "ClassTests.cpp:<line number>: FAILED:"
result = obj.parseApprovedLine(line)
self.assertTrue(obj.current.reason == "FAILED")
self.assertTrue(obj.current.filename == "ClassTests.cpp")
self.assertTrue(obj.current.lineNumber == "line number")
def testOtherConditionSetsFileNameAndLine(self):
obj = TestConditionApprovedParser()
line = "MessageTests.cpp:<line number>:"
result = obj.parseApprovedLine(line)
self.assertTrue(obj.current.filename == "MessageTests.cpp")
self.assertTrue(obj.current.lineNumber == "line number")
def testFailedConditionSetsCondition(self):
obj = TestConditionApprovedParser()
lines = ["ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
""]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.condition == "REQUIRE( s == \"world\" )")
newLines = obj.current.generateApprovedLines()
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testExpansionConditionReturnsExpansion(self):
obj = TestConditionApprovedParser()
lines = ["ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:" ]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
def testExpansionSetsExpansion(self):
obj = TestConditionApprovedParser()
lines = [ "ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" 1 == 2",
"",
"-------------------------------------------------------------------------------"
]
for line in lines:
result = obj.parseApprovedLine(line)
#print lines
self.assertTrue(isinstance(result, TestConditionData))
self.assertTrue(len(result.expansion) == 1)
self.assertTrue(result.expansion[0] == "1 == 2")
newLines = result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testTwoConditions(self):
obj = TestConditionApprovedParser()
lines = [ "ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.int_seven == 6 )",
"with expansion:",
" 7 == 6",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.int_seven == 8 )",
"with expansion:",
" 7 == 8",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testSuccessConditions(self):
obj = TestConditionApprovedParser()
lines = [ "ApproxTests.cpp:<line number>:",
"PASSED:",
" REQUIRE( d == Approx( 1.23 ) )",
"with expansion:",
" 1.23 == Approx( 1.23 )",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print result
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testConditionsWithoutExpansion(self):
obj = TestConditionApprovedParser()
lines = [ "ConditionTests.cpp:<line number>: FAILED:",
" CHECK( false != false )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( true != true )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( !true )",
"with expansion:",
" false",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testExceptionsExplicit(self):
obj = TestConditionApprovedParser()
lines = [ "ExceptionTests.cpp:<line number>: FAILED:",
" CHECK_THROWS_AS( thisThrows() )",
"due to unexpected exception with message:",
" expected exception",
"",
"ExceptionTests.cpp:<line number>: FAILED:",
" CHECK_THROWS_AS( thisDoesntThrow() )",
"because no exception was thrown where one was expected:",
"",
"ExceptionTests.cpp:<line number>: FAILED:",
" CHECK_NOTHROW( thisThrows() )",
"due to unexpected exception with message:",
" expected exception",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testExceptionsImplicit(self):
obj = TestConditionApprovedParser()
lines = [ "ExceptionTests.cpp:<line number>: FAILED:",
"due to unexpected exception with message:",
" unexpected exception",
"",
"ExceptionTests.cpp:<line number>: FAILED:",
" {Unknown expression after the reported line}",
"due to unexpected exception with message:",
" unexpected exception",
"",
"ExceptionTests.cpp:<line number>: FAILED:",
"due to unexpected exception with message:",
" 3.14",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testWarning(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>:",
"warning:",
" this is a warning",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMessages1(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>: FAILED:",
" REQUIRE( a == 1 )",
"with expansion:",
" 2 == 1",
"with messages:",
" this message should be logged",
" so should this",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMessagesExplicitFail(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>: FAILED:",
"explicitly with message:",
" This is a failure",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMessagesOutput(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>: FAILED:",
"explicitly with message:",
" Message from section two",
"",
"Message from section one",
"Message from section two",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiMessages(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>: FAILED:",
" REQUIRE( i < 10 )",
"with expansion:",
" 10 < 10",
"with messages:",
" current counter 10",
" i := 10",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMiscMessages(self):
obj = TestConditionApprovedParser()
lines = [ "MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[0] (1) is even",
"",
"MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[1] (1) is even",
"",
"MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[3] (3) is even",
"",
"MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[4] (5) is even",
"",
"MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[6] (13) is even",
"",
"MiscTests.cpp:<line number>: FAILED:",
" CHECK( ( fib[i] % 2 ) == 0 )",
"with expansion:",
" 1 == 0",
"with message:",
" Testing if fib[7] (21) is even",
"",
"Some information",
"An error",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testRandomOutput(self):
obj = TestConditionApprovedParser()
lines = [ "MiscTests.cpp:<line number>: FAILED:",
"explicitly with message:",
" to infinity and beyond",
"",
"Message from section one",
"Message from section two",
"Some information",
"An error",
"Message from section one",
"Message from section two",
"Some information",
"An error",
"hello",
"hello",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
try:
result = obj.parseApprovedLine(line)
except RandomOutput as e:
randomOutput = e.output
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
self.assertTrue( len(randomOutput) == 10)
newLines += randomOutput
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiLineWarning(self):
obj = TestConditionApprovedParser()
lines = [ "TrickyTests.cpp:<line number>:",
"warning:",
" Uncomment the code in this test to check that it gives a sensible compiler",
" error",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiMessagesAfterCondition(self):
obj = TestConditionApprovedParser()
lines = [ "MiscTests.cpp:<line number>: FAILED:",
" REQUIRE( false )",
"with messages:",
" hi",
" i := 7",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testNoAssertions(self):
obj = TestConditionApprovedParser()
lines = [ "",
"No assertions in test case './succeeding/exceptions/implicit'",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testNoAssertionsWithOutput(self):
obj = TestConditionApprovedParser()
lines = [ "",
"No assertions in section 'one'",
"",
"Message from section two",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testFailedButOk(self):
obj = TestConditionApprovedParser()
lines = [ "MessageTests.cpp:<line number>:",
"FAILED - but was ok:",
" CHECK_NOFAIL( 1 == 2 )",
"",
"",
"No assertions in test case './succeeding/nofail'",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiLineExpansion(self):
obj = TestConditionApprovedParser()
lines = [ "MiscTests.cpp:<line number>:",
"PASSED:",
" CHECK_THAT( testStringForMatching() AllOf( Catch::Contains( \"string\" ), Catch::Contains( \"abc\" ) ) )",
"with expansion:",
" \"this string contains 'abc' as a substring\" ( contains: \"string\" and",
" contains: \"abc\" )",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiLineExpansionWithWrap(self):
obj = TestConditionApprovedParser()
lines = [ "TestMain.cpp:<line number>:",
"PASSED:",
" CHECK( text.toString() == \" one two\n three\n four\" )",
"with expansion:",
" \" one two",
" three",
" four\"",
" ==",
" \" one two",
" three",
" four\"",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
randomOutput = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testMultiLineExpansionWithTruncation(self):
obj = TestConditionApprovedParser()
lines = [ "TestMain.cpp:<line number>:",
"PASSED:",
" CHECK_THAT( t.toString() EndsWith( \"... message truncated due to excessive size\" ) )",
"with expansion:",
" \"***************************************************************************-",
" ***-",
" ****************************************************************************-",
" **-",
"... message truncated due to excessive size",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testBasicResultsParser(self):
obj = TestConditionResultParser()
lines = [ "..\..\..\SelfTest\ClassTests.cpp(28): FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseResultLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateResultLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testBasicResultsWarning(self):
obj = TestConditionResultParser()
lines = [ "..\..\..\SelfTest\MessageTests.cpp(17): ",
"warning:",
" this is a warning",
"",
"-------------------------------------------------------------------------------"
]
newLines = []
for line in lines:
result = obj.parseResultLine(line)
if isinstance(result, TestConditionData):
#print result
newLines += result.generateResultLines()
newLines.append("-------------------------------------------------------------------------------")
#print lines
#print newLines
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
if __name__ == '__main__':
unittest.main()

341
scripts/test_test_case.py Normal file
View File

@ -0,0 +1,341 @@
import unittest
from catch_test_case import TestCaseApprovedParser
from catch_test_case import TestCaseResultParser
from catch_test_case import TestCaseData
from catch_conditions import TestConditionData
class TestCaseTest(unittest.TestCase):
def testTestCaseEquality(self):
c1 = TestConditionData()
c2 = TestConditionData()
c1.filenamePrefix = "..\\..\\Test"
c2.filenamePrefix = "..\\..\\Junk"
t1 = TestCaseData()
t2 = TestCaseData()
t1.name = "Test 1"
t2.name = "Test 1"
t1.conditions.append(c1)
t1.conditions.append(c2)
t2.conditions.append(c1)
t2.conditions.append(c2)
self.assertTrue(t1 == t2)
c3 = TestConditionData()
c3.filenamePrefix = "..\\..\\Fail"
t2.conditions.append(c3)
self.assertFalse(t1 == t2)
t1.conditions.append(c3)
self.assertTrue(t1 == t2)
t2.name = "Test 2"
self.assertFalse(t1 == t2)
def testEndOfTestCaseIsFound(self):
obj = TestCaseApprovedParser()
line = "-------------------------------------------------------------------------------"
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.empty())
def testTestCaseNameIsFound(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------" ]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.name == "./failing/TestClass/failingCase")
self.assertTrue( not(obj.current.empty()) )
def testTestCaseClassIsFound(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"..............................................................................." ]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(obj.current.filename == "ClassTests.cpp")
self.assertTrue(obj.current.lineNumber == "line number")
def testPartialConditionRequiresMoreData(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"ClassTests.cpp:<line number>: FAILED:" ]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(len(obj.current.conditions) == 0)
def testTestCaseConditionIsFound(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\""]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
self.assertTrue(not(obj.conditionParser.current.empty()))
self.assertTrue(obj.conditionParser.current.reason == "FAILED")
def testTestCaseConditionIsInsertedIntoList(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------"]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(isinstance(result, TestCaseData))
self.assertTrue(len(result.conditions) > 0)
self.assertTrue(result.conditions[0].filename == "ClassTests.cpp" )
self.assertTrue(result.conditions[0].lineNumber == "line number" )
self.assertTrue(result.conditions[0].reason == "FAILED" )
newLines = result.generateApprovedLines()
newLines.append("-------------------------------------------------------------------------------")
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testTwoTestCases(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------",
"./failing/Fixture/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( m_a == 2 )",
"with expansion:",
" 1 == 2",
"",
"==============================================================================="
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestCaseData):
newLines += result.generateApprovedLines()
newLines.append("===============================================================================")
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testTestCaseMultiConditionMatches(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/conditions/equality",
"-------------------------------------------------------------------------------",
"ConditionTests.cpp:<line number>",
"...............................................................................",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.int_seven == 6 )",
"with expansion:",
" 7 == 6",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.int_seven == 8 )",
"with expansion:",
" 7 == 8",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.int_seven == 0 )",
"with expansion:",
" 7 == 0",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.float_nine_point_one == Approx( 9.11f ) )",
"with expansion:",
" 9.1 == Approx( 9.11 )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.float_nine_point_one == Approx( 9.0f ) )",
"with expansion:",
" 9.1 == Approx( 9 )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.float_nine_point_one == Approx( 1 ) )",
"with expansion:",
" 9.1 == Approx( 1 )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.float_nine_point_one == Approx( 0 ) )",
"with expansion:",
" 9.1 == Approx( 0 )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.double_pi == Approx( 3.1415 ) )",
"with expansion:",
" 3.1415926535 == Approx( 3.1415 )",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.str_hello == \"goodbye\" )",
"with expansion:",
" \"hello\" == \"goodbye\"",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.str_hello == \"hell\" )",
"with expansion:",
" \"hello\" == \"hell\"",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.str_hello == \"hello1\" )",
"with expansion:",
" \"hello\" == \"hello1\"",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( data.str_hello.size() == 6 )",
"with expansion:",
" 5 == 6",
"",
"ConditionTests.cpp:<line number>: FAILED:",
" CHECK( x == Approx( 1.301 ) )",
"with expansion:",
" 1.3 == Approx( 1.301 )",
"",
"==============================================================================="
]
for line in lines:
result = obj.parseApprovedLine(line)
self.assertTrue(isinstance(result, TestCaseData))
newLines = result.generateApprovedLines()
newLines.append("===============================================================================")
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testOneSection(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/message/sections",
" one",
"-------------------------------------------------------------------------------",
"MessageTests.cpp:<line number>",
"...............................................................................",
"",
"MessageTests.cpp:<line number>: FAILED:",
"explicitly with message:",
" Message from section one",
"",
"==============================================================================="
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestCaseData):
newLines += result.generateApprovedLines()
newLines.append("===============================================================================")
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testOneSection(self):
obj = TestCaseApprovedParser()
lines = [ "-------------------------------------------------------------------------------",
"Comparisons between unsigned ints and negative signed ints match c++ standard",
"behaviour",
"-------------------------------------------------------------------------------",
"ConditionTests.cpp:<line number>",
"...............................................................................",
"",
"ConditionTests.cpp:<line number>:",
"PASSED:",
" CHECK( ( -1 > 2u ) )",
"with expansion:",
" true",
"",
"ConditionTests.cpp:<line number>:",
"PASSED:",
" CHECK( -1 > 2u )",
"with expansion:",
" -1 > 2",
"",
"==============================================================================="
]
newLines = []
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestCaseData):
newLines += result.generateApprovedLines()
newLines.append("===============================================================================")
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testCaseBasicResults(self):
obj = TestCaseResultParser()
lines = [ "-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"..\..\..\SelfTest\ClassTests.cpp(34)",
"...............................................................................",
"",
"..\..\..\SelfTest\ClassTests.cpp(28): FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"==============================================================================="
]
newLines = []
for line in lines:
result = obj.parseResultLine(line)
if isinstance(result, TestCaseData):
newLines += result.generateResultLines()
newLines.append("===============================================================================")
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
if __name__ == '__main__':
unittest.main()

334
scripts/test_test_run.py Normal file
View File

@ -0,0 +1,334 @@
import unittest
import catch_test_case
from catch_test_run import TestRunData
from catch_test_run import TestRunApprovedParser
from catch_test_run import TestRunResultParser
from catch_test_case import TestCaseData
from catch_conditions import TestConditionData
class TestCaseTest(unittest.TestCase):
def testTestRunEquality(self):
c1 = TestConditionData()
c2 = TestConditionData()
c1.filenamePrefix = "..\\..\\Test"
c2.filenamePrefix = "..\\..\\Junk"
t1 = TestCaseData()
t2 = TestCaseData()
t1.name = "Test 1"
t2.name = "Test 1"
t1.conditions.append(c1)
t1.conditions.append(c2)
t2.conditions.append(c1)
t2.conditions.append(c2)
r1 = TestRunData()
r2 = TestRunData()
r1.appname = "One"
r2.appname = "One"
self.assertTrue(r1 == r2)
r1.testcases.append(t1)
self.assertFalse(r1 == r2)
r2.testcases.append(t2)
self.assertTrue(r1 == r2)
c3 = TestConditionData()
c3.filenamePrefix = "..\\..\\Fail"
t2.conditions.append(c3)
self.assertFalse(r1 == r2)
def testStartOfTestRunIsFound(self):
obj = TestRunApprovedParser()
line = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
result = obj.parseApprovedLine(line)
self.assertTrue(result == None)
def testTestRunVersionIsSet(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options" ]
for line in lines:
result = obj.parseApprovedLine(line)
#print obj
self.assertTrue(result == None)
self.assertTrue(obj.current.appname == "CatchSelfTest")
self.assertTrue(obj.current.version == "<version>")
def testTestRunParsesTestCase(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:"
" \"hello\" == \"world\""]
for line in lines:
result = obj.parseApprovedLine(line)
#print obj
self.assertTrue(obj.testcaseParser.conditionParser.current.filename == "ClassTests.cpp" )
self.assertTrue(obj.testcaseParser.conditionParser.current.lineNumber == "line number" )
self.assertTrue(obj.testcaseParser.conditionParser.current.reason == "FAILED" )
def testTestRunAddsTestCase(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:"
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------"
]
for line in lines:
result = obj.parseApprovedLine(line)
#print obj
self.assertTrue( result == None )
self.assertTrue( len(obj.current.testcases) == 1 )
self.assertTrue(obj.current.testcases[0].filename == "ClassTests.cpp" )
self.assertTrue(obj.current.testcases[0].lineNumber == "line number" )
self.assertTrue( len(obj.current.testcases[0].conditions) == 1 )
self.assertTrue(obj.current.testcases[0].conditions[0].filename == "ClassTests.cpp" )
self.assertTrue(obj.current.testcases[0].conditions[0].lineNumber == "line number" )
self.assertTrue(obj.current.testcases[0].conditions[0].reason == "FAILED" )
def testTestRunParsesTwoTestCases(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------",
"./failing/Fixture/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( m_a == 2 )",
"with expansion:",
" 1 == 2",
"",
"===============================================================================",
"122 test cases - 35 failed (753 assertions - 90 failed)",
""
]
testRun = None
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestRunData):
testRun = result
self.assertTrue( isinstance(testRun, TestRunData) )
newLines = testRun.generateApprovedLines()
#for line in newLines:
# print "L:",line
#print len(lines),",",len(newLines)
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testTestRunWithRandomOutput(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"MiscTests.cpp:<line number>: FAILED:",
"explicitly with message:",
" to infinity and beyond",
"",
"Message from section one",
"Message from section two",
"Some information",
"An error",
"Message from section one",
"Message from section two",
"Some information",
"An error",
"hello",
"hello",
"===============================================================================",
"122 test cases - 35 failed (753 assertions - 90 failed)",
""
]
testRun = None
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestRunData):
testRun = result
self.assertTrue( isinstance(testRun, TestRunData) )
#print "O:",result.outputLine
self.assertTrue( testRun.outputLine == 14 )
newLines = testRun.generateApprovedLines()
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testRunBasicResult(self):
obj = TestRunResultParser()
lines = [ "Message from section one",
"Message from section two",
"Some information",
"An error",
"Message from section one",
"Message from section two",
"Some information",
"An error",
"hello",
"hello",
"",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"TestCatch.exe is a Catch v1.0 b13 host application.",
"Run with -? for options",
"",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"..\..\..\SelfTest\ClassTests.cpp(34)",
"...............................................................................",
"",
"..\..\..\SelfTest\ClassTests.cpp(28): FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"===============================================================================",
"122 test cases - 35 failed (753 assertions - 90 failed)",
""
]
testRun = None
for line in lines:
result = obj.parseResultLine(line)
if isinstance(result, TestRunData):
testRun = result
self.assertTrue( isinstance(testRun, TestRunData) )
#print "O:",testRun.outputLine
self.assertTrue( testRun.outputLine == 0 )
newLines = testRun.generateResultLines()
#for line in newLines:
# print line
self.assertTrue( len(lines) == len(newLines) )
self.assertTrue( lines == newLines )
def testTestRunSorted(self):
obj = TestRunApprovedParser()
lines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"-------------------------------------------------------------------------------",
"./failing/Fixture/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( m_a == 2 )",
"with expansion:",
" 1 == 2",
"",
"===============================================================================",
"122 test cases - 35 failed (753 assertions - 90 failed)",
""
]
testRun = None
for line in lines:
result = obj.parseApprovedLine(line)
if isinstance(result, TestRunData):
testRun = result
self.assertTrue( isinstance(testRun, TestRunData) )
newLines = testRun.generateSortedApprovedLines()
#for line in newLines:
# print "L:",line
#print len(lines),",",len(newLines)
expectedLines = [ "",
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
"CatchSelfTest is a <version> host application.",
"Run with -? for options",
"",
"-------------------------------------------------------------------------------",
"./failing/Fixture/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( m_a == 2 )",
"with expansion:",
" 1 == 2",
"",
"-------------------------------------------------------------------------------",
"./failing/TestClass/failingCase",
"-------------------------------------------------------------------------------",
"ClassTests.cpp:<line number>",
"...............................................................................",
"",
"ClassTests.cpp:<line number>: FAILED:",
" REQUIRE( s == \"world\" )",
"with expansion:",
" \"hello\" == \"world\"",
"",
"===============================================================================",
"122 test cases - 35 failed (753 assertions - 90 failed)",
""
]
self.assertTrue( len(expectedLines) == len(newLines) )
self.assertTrue( expectedLines == newLines )
if __name__ == '__main__':
unittest.main()