Remove test files

This commit is contained in:
John
2021-06-10 14:58:34 +01:00
parent 169d4da288
commit af0bcb0636
37 changed files with 0 additions and 7764 deletions
@@ -1,370 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Factory/TestImpactBuildTargetDescriptorFactory.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
class BuildTargetDescriptorFactoryTestFixture
: public AllocatorsTestFixture
{
protected:
const AZStd::vector<AZStd::string> m_staticExclude = {".cmake"};
const AZStd::vector<AZStd::string> m_inputExclude = {".jinja"};
const AZStd::string m_autogenMatcher = {"(.*)\\..*"};
const AZStd::vector<AZStd::string> m_autogenInputs =
{
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/Log.ScriptCanvasNode.xml",
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasNode.xml",
"Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja",
"Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja"
};
const AZStd::vector<AZStd::string> m_autogenOutputs =
{
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.cpp",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.cpp"
};
const AZStd::vector<AZStd::string> m_staticSources =
{
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp",
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h",
"Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_autogen_files.cmake",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.cpp",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.cpp"
};
const AZStd::vector<AZStd::string> m_expectedStaticSources =
{
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp",
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.cpp",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.cpp"
};
const AZStd::string m_name = "ScriptCanvasDiagnosticLibrary.Static";
const AZStd::string m_outputName = "ScriptCanvasDiagnosticLibrary";
const AZStd::string m_path = "Gems/ScriptCanvasDiagnosticLibrary/Code";
const TestImpact::AutogenSources m_expectedAutogenSources =
{
{
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/Log.ScriptCanvasNode.xml",
{
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/Log.generated.cpp"
}
},
{
"Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasNode.xml",
{
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.h",
"windows_vs2019/Gems/ScriptCanvasDiagnosticLibrary/Code/Azcg/Generated/Source/DrawText.generated.cpp"
}
}
};
};
TEST_F(BuildTargetDescriptorFactoryTestFixture, NoRawData_ExpectArtifactException)
{
// Given an empty raw descriptor string
const AZStd::string rawTargetDescriptor;
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, InvalidRawData_ExpectArtifactException)
{
// Given a raw descriptor string of invalid data
const AZStd::string rawTargetDescriptor = "abcde";
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, NoAutogenMatcher_ExpectArtifactException)
{
// Given a valid raw descriptor string
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, m_staticSources, m_autogenInputs, m_autogenOutputs);
try
{
// When attempting to construct the build target descriptor with an empty autogen matcher
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, "");
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, EmptyName_ExpectArtifactException)
{
// Given a invalid raw descriptor string lacking build meta-data name
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString("", m_outputName, m_path, m_staticSources, m_autogenInputs, m_autogenOutputs);
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, EmptyOutputName_ExpectArtifactException)
{
// Given a invalid raw descriptor string lacking build meta-data output name
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, "", m_path, m_staticSources, m_autogenInputs, m_autogenOutputs);
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, EmptyPath_ExpectArtifactException)
{
// Given a invalid raw descriptor string lacking build meta-data path
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, "", m_staticSources, m_autogenInputs, m_autogenOutputs);
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, NoStaticSources_ExpectValidDescriptor)
{
const TestImpact::BuildTargetDescriptor expectedBuiltTarget =
GenerateBuildTargetDescriptor(m_name, m_outputName, m_path, {}, m_expectedAutogenSources);
// Given a valid raw descriptor string with no static sources
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, {}, m_autogenInputs, m_autogenOutputs);
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, {}, m_inputExclude, m_autogenMatcher);
// Expect the constructed build target descriptor to match the specified descriptor
EXPECT_TRUE(buildTarget == expectedBuiltTarget);
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, NoAutogenSources_ExpectValidDescriptor)
{
const TestImpact::BuildTargetDescriptor expectedBuiltTarget =
GenerateBuildTargetDescriptor(m_name, m_outputName, m_path, m_expectedStaticSources, {});
// Given a valid raw descriptor string with no autogen sources
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, m_staticSources, {}, {});
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Expect the constructed build target descriptor to match the specified descriptor
EXPECT_TRUE(buildTarget == expectedBuiltTarget);
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, NoStaticOrAutogenSources_ExpectValidDescriptor)
{
const TestImpact::BuildTargetDescriptor expectedBuiltTarget = GenerateBuildTargetDescriptor(m_name, m_outputName, m_path, {}, {});
// Given a valid raw descriptor string with no static or autogen sources
const AZStd::string rawTargetDescriptor = GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, {}, {}, {});
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Expect the constructed build target descriptor to match the specified descriptor
EXPECT_TRUE(buildTarget == expectedBuiltTarget);
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, AutogenOutputSourcesButNoAutogenInputSources_ExpectArtifactException)
{
// Given a valid raw descriptor string with autogen output sources but no autogen input sources
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, m_staticSources, {}, m_autogenOutputs);
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, AutogenInputSourcesButNoAutogenOutputSources_ExpectArtifactException)
{
// Given a valid raw descriptor string with autogen inout sources but no autogen output sources
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, m_staticSources, m_autogenInputs, {});
try
{
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(BuildTargetDescriptorFactoryTestFixture, StaticAndAutogenSources_ExpectValidDescriptor)
{
const TestImpact::BuildTargetDescriptor expectedBuiltTarget =
GenerateBuildTargetDescriptor(m_name, m_outputName, m_path, m_expectedStaticSources, m_expectedAutogenSources);
// Given a valid raw descriptor string with static and autogen sources
const AZStd::string rawTargetDescriptor =
GenerateBuildTargetDescriptorString(m_name, m_outputName, m_path, m_staticSources, m_autogenInputs, m_autogenOutputs);
// When attempting to construct the build target descriptor
const TestImpact::BuildTargetDescriptor buildTarget =
TestImpact::BuildTargetDescriptorFactory(rawTargetDescriptor, m_staticExclude, m_inputExclude, m_autogenMatcher);
// Expect the constructed build target descriptor to match the specified descriptor
EXPECT_TRUE(buildTarget == expectedBuiltTarget);
}
} // namespace UnitTest
@@ -1,522 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Factory/TestImpactModuleCoverageFactory.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
TEST(CoberturaModuleCoveragesFactory, ParseEmptyString_ThrowsArtifactException)
{
// Given an empty string
const AZStd::string rawCoverage;
try
{
// When attempting to parse the empty coverage
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(CoberturaModuleCoveragesFactory, ParseInvalidString_ThrowsArtifactException)
{
// Given an invalid string
const AZStd::string rawCoverage = "!@?";
try
{
// When attempting to parse the invalid coverage
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(CoberturaModuleCoveragesFactory, ParseEmptyCoverage_ExpectEmptyModuleCoverages)
{
// Given an empty coverage string
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617713965\" lines-covered=\"0\" lines-valid=\"0\" version=\"0\">"
" <sources/>"
" <packages/>"
"</coverage>"
"";
// When attempting to parse the empty coverage
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect an empty module coverages
EXPECT_TRUE(coverage.empty());
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetLineCoverageA_ReturnsValidLineCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetALineModuleCoverages();
// Given the raw line coverage output of TestTargetA
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617124634\" lines-covered=\"41\" lines-valid=\"41\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetA.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetA.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines>"
" <line number=\"22\" hits=\"1\"/>"
" <line number=\"23\" hits=\"1\"/>"
" <line number=\"24\" hits=\"1\"/>"
" <line number=\"25\" hits=\"1\"/>"
" <line number=\"27\" hits=\"1\"/>"
" <line number=\"28\" hits=\"1\"/>"
" <line number=\"29\" hits=\"1\"/>"
" <line number=\"30\" hits=\"1\"/>"
" <line number=\"32\" hits=\"1\"/>"
" <line number=\"33\" hits=\"1\"/>"
" <line number=\"34\" hits=\"1\"/>"
" <line number=\"35\" hits=\"1\"/>"
" <line number=\"37\" hits=\"1\"/>"
" <line number=\"38\" hits=\"1\"/>"
" <line number=\"39\" hits=\"1\"/>"
" <line number=\"40\" hits=\"1\"/>"
" <line number=\"42\" hits=\"1\"/>"
" <line number=\"43\" hits=\"1\"/>"
" <line number=\"44\" hits=\"1\"/>"
" <line number=\"45\" hits=\"1\"/>"
" <line number=\"47\" hits=\"1\"/>"
" <line number=\"48\" hits=\"1\"/>"
" <line number=\"49\" hits=\"1\"/>"
" <line number=\"50\" hits=\"1\"/>"
" <line number=\"52\" hits=\"1\"/>"
" <line number=\"53\" hits=\"1\"/>"
" <line number=\"54\" hits=\"1\"/>"
" <line number=\"55\" hits=\"1\"/>"
" <line number=\"57\" hits=\"1\"/>"
" <line number=\"58\" hits=\"1\"/>"
" <line number=\"59\" hits=\"1\"/>"
" <line number=\"60\" hits=\"1\"/>"
" <line number=\"62\" hits=\"1\"/>"
" <line number=\"63\" hits=\"1\"/>"
" <line number=\"64\" hits=\"1\"/>"
" <line number=\"65\" hits=\"1\"/>"
" <line number=\"67\" hits=\"1\"/>"
" <line number=\"68\" hits=\"1\"/>"
" <line number=\"69\" hits=\"1\"/>"
" <line number=\"70\" hits=\"1\"/>"
" <line number=\"73\" hits=\"1\"/>"
" </lines>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw line coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetSourceCoverageA_ReturnsValidSourceCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetASourceModuleCoverages();
// Given the raw source coverage output of TestTargetA
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617117760\" lines-covered=\"0\" lines-valid=\"0\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetA.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetA.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines/>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw source coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetLineCoverageB_ReturnsValidLineCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetBLineModuleCoverages();
// Given the raw line coverage output of TestTargetB
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617124605\" lines-covered=\"29\" lines-valid=\"29\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetB.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetB.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetB\\Code\\Tests\\TestImpactTestTargetB.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines>"
" <line number=\"29\" hits=\"1\"/>"
" <line number=\"30\" hits=\"1\"/>"
" <line number=\"31\" hits=\"1\"/>"
" <line number=\"32\" hits=\"1\"/>"
" <line number=\"34\" hits=\"1\"/>"
" <line number=\"35\" hits=\"1\"/>"
" <line number=\"36\" hits=\"1\"/>"
" <line number=\"37\" hits=\"1\"/>"
" <line number=\"39\" hits=\"1\"/>"
" <line number=\"40\" hits=\"1\"/>"
" <line number=\"41\" hits=\"1\"/>"
" <line number=\"42\" hits=\"1\"/>"
" <line number=\"44\" hits=\"1\"/>"
" <line number=\"45\" hits=\"1\"/>"
" <line number=\"46\" hits=\"1\"/>"
" <line number=\"47\" hits=\"1\"/>"
" <line number=\"49\" hits=\"1\"/>"
" <line number=\"50\" hits=\"1\"/>"
" <line number=\"51\" hits=\"1\"/>"
" <line number=\"52\" hits=\"1\"/>"
" <line number=\"54\" hits=\"1\"/>"
" <line number=\"55\" hits=\"1\"/>"
" <line number=\"56\" hits=\"1\"/>"
" <line number=\"57\" hits=\"1\"/>"
" <line number=\"59\" hits=\"1\"/>"
" <line number=\"66\" hits=\"1\"/>"
" <line number=\"68\" hits=\"1\"/>"
" <line number=\"75\" hits=\"1\"/>"
" <line number=\"78\" hits=\"1\"/>"
" </lines>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw line coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetSourceCoverageB_ReturnsValidSourceCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetBSourceModuleCoverages();
// Given the raw source coverage output of TestTargetB
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617117785\" lines-covered=\"0\" lines-valid=\"0\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetB.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetB.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetB\\Code\\Tests\\TestImpactTestTargetB.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines/>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw source coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetLineCoverageC_ReturnsValidLineCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetCLineModuleCoverages();
// Given the raw line coverage output of TestTargetC
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617124593\" lines-covered=\"25\" lines-valid=\"25\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetC.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetC.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines>"
" <line number=\"32\" hits=\"1\"/>"
" <line number=\"33\" hits=\"1\"/>"
" <line number=\"34\" hits=\"1\"/>"
" <line number=\"35\" hits=\"1\"/>"
" <line number=\"37\" hits=\"1\"/>"
" <line number=\"38\" hits=\"1\"/>"
" <line number=\"39\" hits=\"1\"/>"
" <line number=\"40\" hits=\"1\"/>"
" <line number=\"42\" hits=\"1\"/>"
" <line number=\"43\" hits=\"1\"/>"
" <line number=\"44\" hits=\"1\"/>"
" <line number=\"45\" hits=\"1\"/>"
" <line number=\"47\" hits=\"1\"/>"
" <line number=\"48\" hits=\"1\"/>"
" <line number=\"49\" hits=\"1\"/>"
" <line number=\"50\" hits=\"1\"/>"
" <line number=\"52\" hits=\"1\"/>"
" <line number=\"53\" hits=\"1\"/>"
" <line number=\"54\" hits=\"1\"/>"
" <line number=\"55\" hits=\"1\"/>"
" <line number=\"57\" hits=\"1\"/>"
" <line number=\"58\" hits=\"1\"/>"
" <line number=\"59\" hits=\"1\"/>"
" <line number=\"60\" hits=\"1\"/>"
" <line number=\"63\" hits=\"1\"/>"
" </lines>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw line coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetSourceCoverageC_ReturnsValidSourceCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetCSourceModuleCoverages();
// Given the raw source coverage output of TestTargetC
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617117796\" lines-covered=\"0\" lines-valid=\"0\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetC.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetC.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines/>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw source coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetLineCoverageD_ReturnsValidLineCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetDLineModuleCoverages();
// Given the raw line coverage output of TestTargetD
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"0.6470588235294118\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617124579\" lines-covered=\"55\" lines-valid=\"85\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetD.Tests.dll\" line-rate=\"0.6470588235294118\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetD.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line-rate=\"0.6470588235294118\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines>"
" <line number=\"56\" hits=\"1\"/>"
" <line number=\"57\" hits=\"1\"/>"
" <line number=\"58\" hits=\"1\"/>"
" <line number=\"59\" hits=\"1\"/>"
" <line number=\"61\" hits=\"1\"/>"
" <line number=\"62\" hits=\"0\"/>"
" <line number=\"63\" hits=\"0\"/>"
" <line number=\"64\" hits=\"0\"/>"
" <line number=\"66\" hits=\"1\"/>"
" <line number=\"67\" hits=\"1\"/>"
" <line number=\"68\" hits=\"1\"/>"
" <line number=\"69\" hits=\"1\"/>"
" <line number=\"71\" hits=\"1\"/>"
" <line number=\"72\" hits=\"1\"/>"
" <line number=\"73\" hits=\"1\"/>"
" <line number=\"74\" hits=\"1\"/>"
" <line number=\"76\" hits=\"1\"/>"
" <line number=\"77\" hits=\"1\"/>"
" <line number=\"78\" hits=\"1\"/>"
" <line number=\"79\" hits=\"1\"/>"
" <line number=\"81\" hits=\"1\"/>"
" <line number=\"82\" hits=\"1\"/>"
" <line number=\"83\" hits=\"1\"/>"
" <line number=\"84\" hits=\"1\"/>"
" <line number=\"86\" hits=\"1\"/>"
" <line number=\"87\" hits=\"1\"/>"
" <line number=\"88\" hits=\"1\"/>"
" <line number=\"89\" hits=\"1\"/>"
" <line number=\"91\" hits=\"1\"/>"
" <line number=\"92\" hits=\"0\"/>"
" <line number=\"93\" hits=\"0\"/>"
" <line number=\"94\" hits=\"0\"/>"
" <line number=\"96\" hits=\"1\"/>"
" <line number=\"97\" hits=\"0\"/>"
" <line number=\"98\" hits=\"0\"/>"
" <line number=\"99\" hits=\"0\"/>"
" <line number=\"101\" hits=\"1\"/>"
" <line number=\"102\" hits=\"1\"/>"
" <line number=\"103\" hits=\"1\"/>"
" <line number=\"104\" hits=\"1\"/>"
" <line number=\"106\" hits=\"1\"/>"
" <line number=\"107\" hits=\"0\"/>"
" <line number=\"108\" hits=\"0\"/>"
" <line number=\"109\" hits=\"0\"/>"
" <line number=\"111\" hits=\"1\"/>"
" <line number=\"112\" hits=\"0\"/>"
" <line number=\"113\" hits=\"0\"/>"
" <line number=\"114\" hits=\"0\"/>"
" <line number=\"116\" hits=\"1\"/>"
" <line number=\"117\" hits=\"0\"/>"
" <line number=\"118\" hits=\"0\"/>"
" <line number=\"119\" hits=\"0\"/>"
" <line number=\"121\" hits=\"1\"/>"
" <line number=\"128\" hits=\"1\"/>"
" <line number=\"130\" hits=\"1\"/>"
" <line number=\"137\" hits=\"1\"/>"
" <line number=\"139\" hits=\"1\"/>"
" <line number=\"146\" hits=\"1\"/>"
" <line number=\"148\" hits=\"1\"/>"
" <line number=\"155\" hits=\"1\"/>"
" <line number=\"157\" hits=\"1\"/>"
" <line number=\"158\" hits=\"1\"/>"
" <line number=\"159\" hits=\"1\"/>"
" <line number=\"160\" hits=\"1\"/>"
" <line number=\"162\" hits=\"1\"/>"
" <line number=\"163\" hits=\"0\"/>"
" <line number=\"164\" hits=\"0\"/>"
" <line number=\"165\" hits=\"0\"/>"
" <line number=\"167\" hits=\"1\"/>"
" <line number=\"168\" hits=\"1\"/>"
" <line number=\"169\" hits=\"1\"/>"
" <line number=\"170\" hits=\"1\"/>"
" <line number=\"172\" hits=\"1\"/>"
" <line number=\"173\" hits=\"0\"/>"
" <line number=\"174\" hits=\"0\"/>"
" <line number=\"175\" hits=\"0\"/>"
" <line number=\"177\" hits=\"1\"/>"
" <line number=\"178\" hits=\"0\"/>"
" <line number=\"179\" hits=\"0\"/>"
" <line number=\"180\" hits=\"0\"/>"
" <line number=\"182\" hits=\"1\"/>"
" <line number=\"183\" hits=\"0\"/>"
" <line number=\"184\" hits=\"0\"/>"
" <line number=\"185\" hits=\"0\"/>"
" <line number=\"188\" hits=\"1\"/>"
" </lines>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw line coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
TEST(CoberturaModuleCoveragesFactory, ParseTestTargetSourceCoverageD_ReturnsValidSourceCoverage)
{
const AZStd::vector<TestImpact::ModuleCoverage> expectedCoverage = GetTestTargetDSourceModuleCoverages();
// Given the raw source coverage output of TestTargetD
const AZStd::string rawCoverage =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<coverage line-rate=\"1\" branch-rate=\"0\" complexity=\"0\" branches-covered=\"0\" branches-valid=\"0\" timestamp=\"1617117804\" lines-covered=\"0\" lines-valid=\"0\" version=\"0\">"
" <sources>"
" <source>C:</source>"
" </sources>"
" <packages>"
" <package name=\"C:\\Lumberyard\\windows_vs2019\\bin\\debug\\TestImpact.TestTargetD.Tests.dll\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <classes>"
" <class name=\"TestImpactTestTargetD.cpp\" filename=\"Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">"
" <methods/>"
" <lines/>"
" </class>"
" </classes>"
" </package>"
" </packages>"
"</coverage>"
"";
// When the raw source coverage text is parsed
const AZStd::vector<TestImpact::ModuleCoverage> coverage = TestImpact::Cobertura::ModuleCoveragesFactory(rawCoverage);
// Expect the generated suite data to match that of the raw coverage text
EXPECT_TRUE(coverage == expectedCoverage);
}
} // namespace UnitTest
@@ -1,150 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Static/TestImpactTargetDescriptorCompiler.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
class TargetDescriptorCompilerTestFixture
: public AllocatorsTestFixture
{
public:
void SetUp() override
{
AllocatorsTestFixture::SetUp();
m_buildTargetDescriptors.emplace_back(TestImpact::BuildTargetDescriptor{{"TestTargetA", "", ""}, {}});
m_buildTargetDescriptors.emplace_back(TestImpact::BuildTargetDescriptor{{"TestTargetB", "", ""}, {}});
m_buildTargetDescriptors.emplace_back(TestImpact::BuildTargetDescriptor{{"ProductionTargetA", "", ""}, {}});
m_buildTargetDescriptors.emplace_back(TestImpact::BuildTargetDescriptor{{"ProductionTargetB", "", ""}, {}});
m_buildTargetDescriptors.emplace_back(TestImpact::BuildTargetDescriptor{{"ProductionTargetC", "", ""}, {}});
m_testTargetMetaMap.emplace("TestTargetA", TestImpact::TestTargetMeta{"", TestImpact::LaunchMethod::TestRunner});
m_testTargetMetaMap.emplace("TestTargetB", TestImpact::TestTargetMeta{"", TestImpact::LaunchMethod::StandAlone});
}
protected:
AZStd::vector<TestImpact::BuildTargetDescriptor> m_buildTargetDescriptors;
TestImpact::TestTargetMetaMap m_testTargetMetaMap;
};
TestImpact::ProductionTargetDescriptor ConstructProductionTargetDescriptor(const AZStd::string& name)
{
return TestImpact::ProductionTargetDescriptor{TestImpact::BuildTargetDescriptor{{name, "", ""}, {{}, {}}}};
}
TestImpact::TestTargetDescriptor ConstructTestTargetDescriptor(const AZStd::string& name, TestImpact::LaunchMethod launchMethod)
{
return TestImpact::TestTargetDescriptor{
TestImpact::BuildTargetDescriptor{{name, "", ""}, {{}, {}}}, TestImpact::TestTargetMeta{"", launchMethod}};
}
TEST_F(TargetDescriptorCompilerTestFixture, EmptyBuildTargetDescriptorList_ExpectArtifactException)
{
try
{
// Given an empty build target descriptor list but valid test target meta map
// When attempting to construct the test target
const auto& [productionTargetDescriptors, testTargetDescriptors] =
TestImpact::CompileTargetDescriptors({}, AZStd::move(m_testTargetMetaMap));
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(TargetDescriptorCompilerTestFixture, EmptyTestTargetMetaMap_ExpectArtifactException)
{
try
{
// Given a valid build target descriptor list but empty test target meta map
// When attempting to construct the test target
const auto& [productionTargetDescriptors, testTargetDescriptors] =
TestImpact::CompileTargetDescriptors(AZStd::move(m_buildTargetDescriptors), {});
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(TargetDescriptorCompilerTestFixture, TestTargetWithNoMatchingMeta_ExpectArtifactException)
{
try
{
// Given a valid build target descriptor list but a test target meta map with an orphan entry
m_testTargetMetaMap.emplace("Orphan", TestImpact::TestTargetMeta{"", TestImpact::LaunchMethod::TestRunner});
// When attempting to construct the test target
const auto& [productionTargetDescriptors, testTargetDescriptors] =
TestImpact::CompileTargetDescriptors(AZStd::move(m_buildTargetDescriptors), {});
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(TargetDescriptorCompilerTestFixture, ValidProductionTargetsAndTestTargetMetas_ExpectValidProductionAndTestTargets)
{
// Given a valid build target descriptor list and a valid test target meta map
// When attempting to construct the test target
const auto& [productionTargetDescriptors, testTargetDescriptors] =
TestImpact::CompileTargetDescriptors(AZStd::move(m_buildTargetDescriptors), AZStd::move(m_testTargetMetaMap));
// Expect the production targets to match the expected targets
EXPECT_TRUE(productionTargetDescriptors.size() == 3);
EXPECT_TRUE(productionTargetDescriptors[0] == ConstructProductionTargetDescriptor("ProductionTargetA"));
EXPECT_TRUE(productionTargetDescriptors[1] == ConstructProductionTargetDescriptor("ProductionTargetB"));
EXPECT_TRUE(productionTargetDescriptors[2] == ConstructProductionTargetDescriptor("ProductionTargetC"));
// Expect the test targets to match the expected targets
EXPECT_TRUE(testTargetDescriptors.size() == 2);
EXPECT_TRUE(testTargetDescriptors[0] == ConstructTestTargetDescriptor("TestTargetA", TestImpact::LaunchMethod::TestRunner));
EXPECT_TRUE(testTargetDescriptors[1] == ConstructTestTargetDescriptor("TestTargetB", TestImpact::LaunchMethod::StandAlone));
}
} // namespace UnitTest
@@ -1,589 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Factory/TestImpactTestEnumerationSuiteFactory.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/string/regex.h>
#include <AzCore/std/string/string.h>
#include <AzCore/std/tuple.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
TEST(GTestEnumerationSuiteFactory, ParseEmptyString_ThrowsArtifactException)
{
// Given an empty string
const AZStd::string rawEnum;
try
{
// When attempting to parse the empty suite
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(GTestEnumerationSuiteFactory, ParseInvalidString_ThrowsArtifactException)
{
// Given an invalid string
const AZStd::string rawEnum = "!@?";
try
{
// When attempting to parse the empty suite
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(GTestEnumerationSuiteFactory, ParseTestTargetA_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestEnumerationSuite> expectedSuites = GetTestTargetATestEnumerationSuites();
// Given the raw enum output of TestTargetA
const AZStd::string rawEnum =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<testsuites tests=\"10\" name=\"AllTests\">\n"
" <testsuite name=\"TestCase\" tests=\"7\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"22\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"27\" />\n"
" <testcase name=\"Test3_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"32\" />\n"
" <testcase name=\"Test4_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"37\" />\n"
" <testcase name=\"Test5_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"42\" />\n"
" <testcase name=\"Test6_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"47\" />\n"
" <testcase name=\"Test7_WillFail\" file=\"C:\\Tests\\TestImpactTestTargetA.cpp\" line=\"52\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixture\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp\" line=\"57\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp\" line=\"62\" />\n"
" <testcase name=\"Test3_WillPass\" file=\"C:\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp\" line=\"67\" />\n"
" </testsuite>\n"
"</testsuites>\n"
"\n";
// When the raw enumeration text is parsed
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Expect the generated suite data to match that of the raw enum text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestEnumerationSuiteFactory, ParseTestTargetB_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestEnumerationSuite> expectedSuites = GetTestTargetBTestEnumerationSuites();
// Given the raw enum output of TestTargetB
const AZStd::string rawEnum =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<testsuites tests=\"112\" name=\"AllTests\">\n"
" <testsuite name=\"TestCase\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"29\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"34\" />\n"
" <testcase name=\"Test3_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"39\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixture\" tests=\"1\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"44\" />\n"
" </testsuite>\n"
" <testsuite name=\"PermutationA/TestFixtureWithParams\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithParams\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" <testcase name=\"Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestImpactTestTargetB.cpp\" line=\"49\" />\n"
" </testsuite>\n"
"</testsuites>\n"
"\n";
// When the raw enumeration text is parsed
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Expect the generated suite data to match that of the raw enum text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestEnumerationSuiteFactory, ParseTestTargetC_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestEnumerationSuite> expectedSuites = GetTestTargetCTestEnumerationSuites();
// Given the raw enum output of TestTargetC
const AZStd::string rawEnum =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<testsuites tests=\"18\" name=\"AllTests\">\n"
" <testsuite name=\"TestFixture\" tests=\"2\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"32\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"37\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes/0\" tests=\"4\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"42\" />\n"
" <testcase name=\"Test2_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"47\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"52\" />\n"
" <testcase name=\"Test4_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"57\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes/1\" tests=\"4\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"42\" />\n"
" <testcase name=\"Test2_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"47\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"52\" />\n"
" <testcase name=\"Test4_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"57\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes/2\" tests=\"4\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"42\" />\n"
" <testcase name=\"Test2_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"47\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"52\" />\n"
" <testcase name=\"Test4_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"57\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes/3\" tests=\"4\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"42\" />\n"
" <testcase name=\"Test2_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"47\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"52\" />\n"
" <testcase name=\"Test4_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetC\\Code\\Tests\\TestImpactTestTargetC.cpp\" line=\"57\" />\n"
" </testsuite>\n"
"</testsuites>\n"
"\n";
// When the raw enumeration text is parsed
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Expect the generated suite data to match that of the raw enum text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestEnumerationSuiteFactory, ParseTestTargetD_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestEnumerationSuite> expectedSuites = GetTestTargetDTestEnumerationSuites();
// Given the raw enum output of TestTargetD
const AZStd::string rawEnum =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<testsuites tests=\"249\" name=\"AllTests\">\n"
" <testsuite name=\"TestCase\" tests=\"5\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"56\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"61\" />\n"
" <testcase name=\"Test3_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"66\" />\n"
" <testcase name=\"Test4_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"71\" />\n"
" <testcase name=\"Test5_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"76\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixture1\" tests=\"2\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"81\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"86\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixture2\" tests=\"2\">\n"
" <testcase name=\"Test1_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"91\" />\n"
" <testcase name=\"Test2_WillPass\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"96\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes1/0\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"157\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"162\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"167\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes1/1\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"157\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"162\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"167\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes1/2\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"157\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"162\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"167\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithTypes1/3\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"157\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"162\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"167\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/0\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"172\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"177\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"182\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/1\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"172\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"177\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"182\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/2\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"172\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"177\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"182\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/3\" tests=\"3\">\n"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"172\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"177\" />\n"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"182\" />\n"
" </testsuite>\n"
" <testsuite name=\"PermutationA/TestFixtureWithParams1\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" </testsuite>\n"
" <testsuite name=\"TestFixtureWithParams1\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"101\" />\n"
" </testsuite>\n"
" <testsuite name=\"PermutationA/DISABLED_TestFixtureWithParams2\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" </testsuite>\n"
" <testsuite name=\"DISABLED_TestFixtureWithParams2\" tests=\"54\">\n"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" file=\"C:\\Tests\\TestTargetD\\Code\\Tests\\TestImpactTestTargetD.cpp\" line=\"111\" />\n"
" </testsuite>\n"
"</testsuites>\n"
"\n";
// When the raw enumeration text is parsed
const AZStd::vector<TestImpact::TestEnumerationSuite> suites = TestImpact::GTest::TestEnumerationSuitesFactory(rawEnum);
// Expect the generated suite data to match that of the raw enum text
EXPECT_TRUE(suites == expectedSuites);
}
} // namespace UnitTest
@@ -1,592 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Factory/TestImpactTestRunSuiteFactory.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/string/regex.h>
#include <AzCore/std/string/string.h>
#include <AzCore/std/tuple.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
TEST(GTestRunSuiteFactory, ParseEmptyString_ThrowsArtifactException)
{
// Given an empty string
const AZStd::string rawRun;
try
{
// When attempting to parse the empty suite
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect a artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(GTestRunSuiteFactory, ParseInvalidString_ThrowsArtifactException)
{
// Given an invalid string
const AZStd::string rawRun = "!@?";
try
{
// When attempting to parse the invalid suite
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Do not expect the parsing to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect a artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(GTestRunSuiteFactory, ParseTestTargetA_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestRunSuite> expectedSuites = GetTestTargetATestRunSuites();
// Given the raw run output of TestTargetA
const AZStd::string rawRun =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<testsuites tests=\"10\" failures=\"1\" disabled=\"0\" errors=\"0\" timestamp=\"2021-03-26T19:02:37\" time=\"0.051\" name=\"AllTests\">"
" <testsuite name=\"TestCase\" tests=\"7\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"0.003\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test2_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test3_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test4_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test5_WillPass\" status=\"run\" time=\"0.001\" classname=\"TestCase\" />"
" <testcase name=\"Test6_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test7_WillFail\" status=\"run\" time=\"0.001\" classname=\"TestCase\">"
" <failure message=\"C:\\Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp:54&#x0A;Failed\" type=\"\"><![CDATA[C:\\Lumberyard\\Code\\Tools\\TestImpactFramework\\Runtime\\Code\\Tests\\TestTargetA\\Code\\Tests\\TestImpactTestTargetA.cpp:54"
"Failed]]></failure>"
" </testcase>"
" </testsuite>"
" <testsuite name=\"TestFixture\" tests=\"3\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.038\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.004\" classname=\"TestFixture\" />"
" <testcase name=\"Test2_WillPass\" status=\"run\" time=\"0\" classname=\"TestFixture\" />"
" <testcase name=\"Test3_WillPass\" status=\"run\" time=\"0.001\" classname=\"TestFixture\" />"
" </testsuite>"
"</testsuites>"
"";
// When the raw run text is parsed
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Expect the generated suite data to match that of the raw run text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestRunSuiteFactory, ParseTestTargetB_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestRunSuite> expectedSuites = GetTestTargetBTestRunSuites();
// Given the raw run output of TestTargetB
const AZStd::string rawRun =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<testsuites tests=\"112\" failures=\"0\" disabled=\"0\" errors=\"0\" timestamp=\"2021-03-27T11:56:14\" time=\"7.155\" name=\"AllTests\">"
" <testsuite name=\"TestCase\" tests=\"3\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.202\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.003\" classname=\"TestCase\" />"
" <testcase name=\"Test2_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test3_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" </testsuite>"
" <testsuite name=\"TestFixture\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.062\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.005\" classname=\"TestFixture\" />"
" </testsuite>"
" <testsuite name=\"PermutationA/TestFixtureWithParams\" tests=\"54\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"3.203\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithParams\" tests=\"54\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"3.36\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0.002\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" <testcase name=\"Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams\" />"
" </testsuite>"
"</testsuites>"
"";
// When the raw run text is parsed
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Expect the generated suite data to match that of the raw run text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestRunSuiteFactory, ParseTestTargetC_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestRunSuite> expectedSuites = GetTestTargetCTestRunSuites();
// Given the raw run output of TestTargetC
const AZStd::string rawRun =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<testsuites tests=\"18\" failures=\"0\" disabled=\"0\" errors=\"0\" timestamp=\"2021-03-27T12:35:40\" time=\"1.022\" name=\"AllTests\">"
" <testsuite name=\"TestFixture\" tests=\"2\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.125\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.004\" classname=\"TestFixture\" />"
" <testcase name=\"Test2_WillPass\" status=\"run\" time=\"0\" classname=\"TestFixture\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes/0\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.21\">"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/0\" />"
" <testcase name=\"Test2_WillPass\" type_param=\"int\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes/0\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes/0\" />"
" <testcase name=\"Test4_WillPass\" type_param=\"int\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes/0\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes/1\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.208\">"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes/1\" />"
" <testcase name=\"Test2_WillPass\" type_param=\"float\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes/1\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/1\" />"
" <testcase name=\"Test4_WillPass\" type_param=\"float\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/1\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes/2\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.199\">"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/2\" />"
" <testcase name=\"Test2_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/2\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/2\" />"
" <testcase name=\"Test4_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/2\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes/3\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.049\">"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/3\" />"
" <testcase name=\"Test2_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/3\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/3\" />"
" <testcase name=\"Test4_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes/3\" />"
" </testsuite>"
"</testsuites>"
"";
// When the raw run text is parsed
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Expect the generated suite data to match that of the raw run text
EXPECT_TRUE(suites == expectedSuites);
}
TEST(GTestRunSuiteFactory, ParseTestTargetD_ReturnsValidSuitesAndTests)
{
const AZStd::vector<TestImpact::TestRunSuite> expectedSuites = GetTestTargetDTestRunSuites();
// Given the raw run output of TestTargetD
const AZStd::string rawRun =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<testsuites tests=\"249\" failures=\"0\" disabled=\"181\" errors=\"0\" timestamp=\"2021-03-25T15:18:40\" time=\"0.314\" name=\"AllTests\">"
" <testsuite name=\"TestCase\" tests=\"5\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"0.003\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.001\" classname=\"TestCase\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" status=\"notrun\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test3_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test4_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" <testcase name=\"Test5_WillPass\" status=\"run\" time=\"0\" classname=\"TestCase\" />"
" </testsuite>"
" <testsuite name=\"TestFixture1\" tests=\"2\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"0.004\">"
" <testcase name=\"Test1_WillPass\" status=\"run\" time=\"0.002\" classname=\"TestFixture1\" />"
" <testcase name=\"Test2_WillPass\" status=\"run\" time=\"0\" classname=\"TestFixture1\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixture2\" tests=\"2\" failures=\"0\" disabled=\"2\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixture2\" />"
" <testcase name=\"Test2_WillPass\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixture2\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes1/0\" tests=\"3\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"0.001\">"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/0\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"int\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithTypes1/0\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/0\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes1/1\" tests=\"3\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"0.003\">"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithTypes1/1\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"float\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithTypes1/1\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/1\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes1/2\" tests=\"3\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/2\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"double\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithTypes1/2\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/2\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithTypes1/3\" tests=\"3\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"0.001\">"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/3\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"char\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithTypes1/3\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" status=\"run\" time=\"0\" classname=\"TestFixtureWithTypes1/3\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/0\" tests=\"3\" failures=\"0\" disabled=\"3\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" type_param=\"int\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/0\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"int\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/0\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"int\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/0\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/1\" tests=\"3\" failures=\"0\" disabled=\"3\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" type_param=\"float\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/1\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"float\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/1\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"float\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/1\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/2\" tests=\"3\" failures=\"0\" disabled=\"3\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" type_param=\"double\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/2\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"double\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/2\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"double\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/2\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixtureWithTypes2/3\" tests=\"3\" failures=\"0\" disabled=\"3\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass\" type_param=\"char\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/3\" />"
" <testcase name=\"DISABLED_Test2_WillPass\" type_param=\"char\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/3\" />"
" <testcase name=\"Test3_WillPass\" type_param=\"char\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithTypes2/3\" />"
" </testsuite>"
" <testsuite name=\"PermutationA/TestFixtureWithParams1\" tests=\"54\" failures=\"0\" disabled=\"27\" errors=\"0\" time=\"0.173\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"run\" time=\"0.001\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"run\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/TestFixtureWithParams1\" />"
" </testsuite>"
" <testsuite name=\"TestFixtureWithParams1\" tests=\"54\" failures=\"0\" disabled=\"27\" errors=\"0\" time=\"0.102\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"run\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"run\" time=\"0.001\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"TestFixtureWithParams1\" />"
" </testsuite>"
" <testsuite name=\"PermutationA/DISABLED_TestFixtureWithParams2\" tests=\"54\" failures=\"0\" disabled=\"54\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(1, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(1, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(1, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(1, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(1, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(1, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(1, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(1, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(1, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(2, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(2, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(2, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(2, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(2, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(2, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(2, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(2, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(2, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(4, &apos;\\x3&apos; (3), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(4, &apos;\\x3&apos; (3), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(4, &apos;\\x3&apos; (3), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(4, &apos;\\x5&apos; (5), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(4, &apos;\\x5&apos; (5), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(4, &apos;\\x5&apos; (5), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(4, &apos;\\a&apos; (7), -0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(4, &apos;\\a&apos; (7), 0)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(4, &apos;\\a&apos; (7), 1)\" status=\"notrun\" time=\"0\" classname=\"PermutationA/DISABLED_TestFixtureWithParams2\" />"
" </testsuite>"
" <testsuite name=\"DISABLED_TestFixtureWithParams2\" tests=\"54\" failures=\"0\" disabled=\"54\" errors=\"0\" time=\"0\">"
" <testcase name=\"Test1_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"Test1_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/0\" value_param=\"(8, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/1\" value_param=\"(8, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/2\" value_param=\"(8, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/3\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/4\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/5\" value_param=\"(8, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/6\" value_param=\"(8, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/7\" value_param=\"(8, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/8\" value_param=\"(8, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/9\" value_param=\"(16, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/10\" value_param=\"(16, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/11\" value_param=\"(16, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/12\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/13\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/14\" value_param=\"(16, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/15\" value_param=\"(16, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/16\" value_param=\"(16, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/17\" value_param=\"(16, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/18\" value_param=\"(32, &apos;\\t&apos; (9), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/19\" value_param=\"(32, &apos;\\t&apos; (9), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/20\" value_param=\"(32, &apos;\\t&apos; (9), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/21\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/22\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/23\" value_param=\"(32, &apos;\\r&apos; (13, 0xD), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/24\" value_param=\"(32, &apos;\\x11&apos; (17), -10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/25\" value_param=\"(32, &apos;\\x11&apos; (17), 0.05)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" <testcase name=\"DISABLED_Test2_WillPass/26\" value_param=\"(32, &apos;\\x11&apos; (17), 10)\" status=\"notrun\" time=\"0\" classname=\"DISABLED_TestFixtureWithParams2\" />"
" </testsuite>"
"</testsuites>"
"";
// When the raw run text is parsed
const AZStd::vector<TestImpact::TestRunSuite> suites = TestImpact::GTest::TestRunSuitesFactory(rawRun);
// Expect the generated suite data to match that of the raw run text
EXPECT_TRUE(suites == expectedSuites);
}
} // namespace UnitTest
@@ -1,239 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Artifact/Factory/TestImpactTestTargetMetaMapFactory.h>
#include <Artifact/TestImpactArtifactException.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
TEST(TestTargetMetaMapFactoryTest, NoRawData_ExpectArtifactException)
{
// Given an empty meta data string
const AZStd::string rawTestTargetMetaData;
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, InvalidRawData_ExpectArtifactException)
{
// Given a raw meta data string of invalid data
const AZStd::string rawTestTargetMetaData = "abcde";
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, EmptyTestMetaArray_ExpectArtifactException)
{
// Given a raw meta data string of valid JSON that contains no tests
const AZStd::string rawTestTargetMetaData =
"{"
" \"google\": {"
" \"test\": {"
" \"tests\": ["
" ]"
" }"
" }"
"}";
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, EmptyName_ExpectArtifactException)
{
// Given a raw meta data string with a test that has no name value
const AZStd::string rawTestTargetMetaData =
"{"
" \"google\": {"
" \"test\": {"
" \"tests\": ["
" { \"name\": \"\", \"namespace\": \"Legacy\", \"suite\": \"main\", \"launch_method\": \"test_runner\" }"
" ]"
" }"
" }"
"}";
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, EmptyBuildType_ExpectArtifactException)
{
// Given a raw meta data string with a test that has no build type
const AZStd::string rawTestTargetMetaData =
"{"
" \"google\": {"
" \"test\": {"
" \"tests\": ["
" { \"name\": \"TestName\", \"namespace\": \"Legacy\", \"suite\": \"main\", \"launch_method\": \"\" }"
" ]"
" }"
" }"
"}";
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, InvalidBuildType_ExpectArtifactException)
{
// Given a raw meta data string with a test that has an invalid build type
const AZStd::string rawTestTargetMetaData =
"{"
" \"google\": {"
" \"test\": {"
" \"tests\": ["
" { \"name\": \"TestName\", \"namespace\": \"Legacy\", \"suite\": \"main\", \"launch_method\": \"Unknown\" }"
" ]"
" }"
" }"
"}";
try
{
// When attempting to construct the test target
const TestImpact::TestTargetMetaMap testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Do not expect this statement to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ArtifactException& e)
{
// Expect an artifact exception
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(TestTargetMetaMapFactoryTest, ValidMetaData_ExpectValidTestMetaData)
{
// Given a raw meta data string valid test meta-data
const AZStd::string rawTestTargetMetaData =
"{"
" \"google\": {"
" \"test\": {"
" \"tests\": ["
" { \"name\": \"TestA\", \"namespace\": \"Legacy\", \"suite\": \"main\", \"launch_method\": \"test_runner\" },"
" { \"name\": \"TestB\", \"namespace\": \"\", \"suite\": \"main\", \"launch_method\": \"test_runner\" },"
" { \"name\": \"TestC\", \"namespace\": \"\", \"suite\": \"\", \"launch_method\": \"test_runner\" },"
" { \"name\": \"TestD\", \"namespace\": \"Legacy\", \"suite\": \"main\", \"launch_method\": \"stand_alone\" }"
" ]"
" }"
" }"
"}";
// When attempting to construct the test target
const auto testTargetMetaData = TestImpact::TestTargetMetaMapFactory(rawTestTargetMetaData);
// Expect the constructed test meta-data to match that of the supplied raw data
EXPECT_EQ(testTargetMetaData.size(), 4);
EXPECT_TRUE(testTargetMetaData.find("TestA") != testTargetMetaData.end());
EXPECT_TRUE((testTargetMetaData.at("TestA") == TestImpact::TestTargetMeta{"main", TestImpact::LaunchMethod::TestRunner}));
EXPECT_TRUE(testTargetMetaData.find("TestB") != testTargetMetaData.end());
EXPECT_TRUE((testTargetMetaData.at("TestB") == TestImpact::TestTargetMeta{"main", TestImpact::LaunchMethod::TestRunner}));
EXPECT_TRUE(testTargetMetaData.find("TestC") != testTargetMetaData.end());
EXPECT_TRUE((testTargetMetaData.at("TestC") == TestImpact::TestTargetMeta{"", TestImpact::LaunchMethod::TestRunner}));
EXPECT_TRUE(testTargetMetaData.find("TestD") != testTargetMetaData.end());
EXPECT_TRUE((testTargetMetaData.at("TestD") == TestImpact::TestTargetMeta{"main", TestImpact::LaunchMethod::StandAlone}));
}
} // namespace UnitTest
@@ -1,712 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Process/Scheduler/TestImpactProcessScheduler.h>
#include <AzCore/Debug/TraceMessageBus.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzCore/std/string/conversions.h>
#include <AzCore/std/tuple.h>
#include <AzTest/AzTest.h>
#include <vector>
namespace UnitTest
{
using SchedulerPermutation = AZStd::tuple
<
size_t, // Number of concurrent processes
size_t // Number of processes to launch
>;
class ProcessSchedulerTestFixtureWithParams
: public AllocatorsTestFixture
, private AZ::Debug::TraceMessageBus::Handler
, public ::testing::WithParamInterface<SchedulerPermutation>
{
private:
bool OnOutput(const char*, const char*) override;
void SetUp() override;
void TearDown() override;
protected:
void ConfigurePermutation();
void ExpectSuccessfulLaunch(TestImpact::ProcessId pid);
void ExpectGracefulExit(TestImpact::ProcessId pid);
void ExpectUnsuccessfulLaunch(TestImpact::ProcessId pid);
void ExpectExitCondition(
TestImpact::ProcessId pid, AZStd::optional<TestImpact::ExitCondition> expectedExitCondition = AZStd::nullopt);
void DoNotExpectExitCondition(TestImpact::ProcessId pid);
void ExpectTerminatedProcess(TestImpact::ProcessId pid);
void ExpectTimeoutProcess(TestImpact::ProcessId pid);
void ExpectUnlaunchedProcess(TestImpact::ProcessId pid);
void ExpectLargeStdOutput(TestImpact::ProcessId pid);
void ExpectLargeStdError(TestImpact::ProcessId pid);
void ExpectSmallStdOutput(TestImpact::ProcessId pid);
void ExpectSmallStdError(TestImpact::ProcessId pid);
void DoNotExpectStdOutput(TestImpact::ProcessId pid);
void DoNotExpectStdError(TestImpact::ProcessId pid);
struct ProcessResult
{
AZStd::optional<TestImpact::LaunchResult> m_launchResult;
AZStd::optional<TestImpact::ExitCondition> m_exitStatus;
AZStd::optional<AZStd::chrono::high_resolution_clock::time_point> m_createTime;
AZStd::optional<AZStd::chrono::high_resolution_clock::time_point> m_exitTime;
AZStd::chrono::milliseconds m_duration = AZStd::chrono::milliseconds(0);
AZStd::optional<TestImpact::ReturnCode> m_returnCode;
TestImpact::StdContent m_std;
};
size_t m_numMaxConcurrentProcesses = 0;
size_t m_numProcessesToLaunch = 0;
AZStd::unique_ptr<TestImpact::ProcessScheduler> m_processScheduler;
TestImpact::ProcessLaunchCallback m_processLaunchCallback;
TestImpact::ProcessExitCallback m_processExitCallback;
AZStd::vector<TestImpact::ProcessInfo> m_processInfos;
AZStd::vector<ProcessResult> m_processResults;
};
// Permutation values for small process batches
const std::vector<size_t> SmallNumMaxConcurrentProcesses = {1, 4, 8};
const std::vector<size_t> SmallNumProcessesToLaunch = {1, 8, 32};
// Permutation values for large process batches
const std::vector<size_t> LargeNumMaxConcurrentProcesses = {16, 32, 64};
const std::vector<size_t> LargeNumProcessesToLaunch = {128, 256, 512};
void ProcessSchedulerTestFixtureWithParams::ConfigurePermutation()
{
const auto& [numMaxConcurrentProcesses, numProcessesToLaunch] = GetParam();
m_numMaxConcurrentProcesses = numMaxConcurrentProcesses;
m_numProcessesToLaunch = numProcessesToLaunch;
}
// Consume AZ log spam
bool ProcessSchedulerTestFixtureWithParams::OnOutput([[maybe_unused]] const char*, [[maybe_unused]] const char*)
{
return true;
}
void ProcessSchedulerTestFixtureWithParams::SetUp()
{
UnitTest::AllocatorsTestFixture::SetUp();
AZ::Debug::TraceMessageBus::Handler::BusConnect();
ConfigurePermutation();
m_processLaunchCallback = [this](
TestImpact::ProcessId pid,
TestImpact::LaunchResult launchResult,
AZStd::chrono::high_resolution_clock::time_point createTime)
{
m_processResults[pid].m_launchResult = launchResult;
m_processResults[pid].m_createTime.emplace(createTime);
return TestImpact::CallbackResult::Continue;
};
m_processExitCallback = [this](
TestImpact::ProcessId pid,
TestImpact::ExitCondition exitStatus,
TestImpact::ReturnCode returnCode,
TestImpact::StdContent&& std,
AZStd::chrono::high_resolution_clock::time_point exitTime)
{
m_processResults[pid].m_std = std::move(std);
m_processResults[pid].m_returnCode.emplace(returnCode);
m_processResults[pid].m_exitStatus = exitStatus;
m_processResults[pid].m_exitTime = exitTime;
m_processResults[pid].m_duration =
AZStd::chrono::duration_cast<AZStd::chrono::milliseconds>(exitTime - *m_processResults[pid].m_createTime);
return TestImpact::CallbackResult::Continue;
};
m_processResults.resize(m_numProcessesToLaunch);
}
void ProcessSchedulerTestFixtureWithParams::TearDown()
{
AZ::Debug::TraceMessageBus::Handler::BusDisconnect();
UnitTest::AllocatorsTestFixture::TearDown();
}
// Expects the process to have exited under the specified circumstances
void ProcessSchedulerTestFixtureWithParams::ExpectExitCondition(
TestImpact::ProcessId pid, AZStd::optional<TestImpact::ExitCondition> expectedExitCondition)
{
const auto& [launchResult, exitStatus, createTime, exitTime, duration, returnCode, std] = m_processResults[pid];
// Expect the processes to have exited
EXPECT_TRUE(exitStatus.has_value());
// Expect the return code to be valid
EXPECT_TRUE(returnCode.has_value());
if (expectedExitCondition.has_value())
{
// Expect the process to have exited under the specified conditions
EXPECT_EQ(exitStatus, expectedExitCondition);
// Expect the return code to be that of the process's is (for gracefull exists) or that of the error code
// associated with the abnormal exit condition
EXPECT_EQ(returnCode,
expectedExitCondition == TestImpact::ExitCondition::Gracefull
? pid
: static_cast<TestImpact::ReturnCode>(*exitStatus));
}
// Expect the duration to be non zero and the create time and exit time to have values as the processes has been in-flight
EXPECT_GT(duration.count(), 0);
EXPECT_TRUE(createTime.has_value());
EXPECT_TRUE(exitTime.has_value());
// Expect the exit time to be later than the start time
EXPECT_GT(exitTime, createTime);
}
// Expects the process to not have exited for to lack of being in-flight
void ProcessSchedulerTestFixtureWithParams::DoNotExpectExitCondition(TestImpact::ProcessId pid)
{
const auto& [launchResult, exitStatus, createTime, exitTime, duration, returnCode, std] = m_processResults[pid];
// Expect the processes to not have exited as the process has not been launched successfully
EXPECT_FALSE(exitStatus.has_value());
// Expect the return code to be invalid
EXPECT_FALSE(returnCode.has_value());
// Expect the duration to be zero as the process has not been in-flight
EXPECT_EQ(duration.count(), 0);
// Do not expect the exit time to have a value
EXPECT_FALSE(exitTime.has_value());
}
// Expects the process to have been launched successfully, makes no assumptions about how it exited
void ProcessSchedulerTestFixtureWithParams::ExpectSuccessfulLaunch(TestImpact::ProcessId pid)
{
const auto& [launchResult, exitStatus, createTime, exitTime, duration, returnCode, std] = m_processResults[pid];
// Expect a launch to have been attempted by this process (not still in queue)
EXPECT_TRUE(launchResult.has_value());
// Expect the process to have launched successfully
EXPECT_EQ(launchResult, TestImpact::LaunchResult::Success);
}
// Expects the process to have failed to launch
void ProcessSchedulerTestFixtureWithParams::ExpectUnsuccessfulLaunch(TestImpact::ProcessId pid)
{
const auto& [launchResult, exitStatus, createTime, exitTime, duration, returnCode, std] = m_processResults[pid];
// Expect a launch to have been attempted by this process (not still in queue)
EXPECT_TRUE(launchResult.has_value());
// Expect the process to have launched unsuccessfully
EXPECT_EQ(launchResult, TestImpact::LaunchResult::Failure);
// Expect the create time to have a value as the process was technically created
EXPECT_TRUE(createTime.has_value());
DoNotExpectExitCondition(pid);
}
// Expects the process to have exited gracefully of its own accord (i.e. not terminated for any reason by the scheduler)
void ProcessSchedulerTestFixtureWithParams::ExpectGracefulExit(TestImpact::ProcessId pid)
{
ExpectSuccessfulLaunch(pid);
ExpectExitCondition(pid, TestImpact::ExitCondition::Gracefull);
}
// Expects the process to have been terminated by the client or scheduler
void ProcessSchedulerTestFixtureWithParams::ExpectTerminatedProcess(TestImpact::ProcessId pid)
{
ExpectSuccessfulLaunch(pid);
ExpectExitCondition(pid, TestImpact::ExitCondition::Terminated);
}
// Expects the process to have been terminated by the scheduler due to the process or scheduler timing out
void ProcessSchedulerTestFixtureWithParams::ExpectTimeoutProcess(TestImpact::ProcessId pid)
{
ExpectSuccessfulLaunch(pid);
ExpectExitCondition(pid, TestImpact::ExitCondition::Timeout);
}
// Expects the process to have not been attempted to launch (was still in the queue)
void ProcessSchedulerTestFixtureWithParams::ExpectUnlaunchedProcess(TestImpact::ProcessId pid)
{
const auto& [launchResult, exitStatus, createTime, exitTime, duration, returnCode, std] = m_processResults[pid];
// Expect a launch to not have been attempted by this process (still in queue)
EXPECT_FALSE(launchResult.has_value());
// Expect the create time to have a value as the process was technically created
EXPECT_FALSE(createTime.has_value());
DoNotExpectExitCondition(pid);
}
// Expects the std output to have been captured from the process with a large volume of text
void ProcessSchedulerTestFixtureWithParams::ExpectLargeStdOutput(TestImpact::ProcessId pid)
{
const auto& stdOut = m_processResults[pid].m_std.m_out;
// Expect standard output to have a value
EXPECT_TRUE(stdOut.has_value());
// Expect the output length to be that of the large text output from the child process
EXPECT_EQ(stdOut.value().length(), LargeTextSize);
}
// Expects the std error to have been captured from the process with a large volume of text
void ProcessSchedulerTestFixtureWithParams::ExpectLargeStdError(TestImpact::ProcessId pid)
{
const auto& stdErr = m_processResults[pid].m_std.m_err;
// Expect standard error to have a value
EXPECT_TRUE(stdErr.has_value());
// Expect the error length to be that of the large text output from the child process
EXPECT_EQ(stdErr.value().length(), LargeTextSize);
}
// Expects the std output to have been captured from the process with a small known text string
void ProcessSchedulerTestFixtureWithParams::ExpectSmallStdOutput(TestImpact::ProcessId pid)
{
const auto& stdOut = m_processResults[pid].m_std.m_out;
// Expect standard output to have a value
EXPECT_TRUE(stdOut.has_value());
// Expect the output to match the known stdout of the child
EXPECT_EQ(stdOut.value(), KnownTestProcessOutputString(pid));
}
// Expects the std error to have been captured from the process with a small known text string
void ProcessSchedulerTestFixtureWithParams::ExpectSmallStdError(TestImpact::ProcessId pid)
{
const auto& stdErr = m_processResults[pid].m_std.m_err;
// Expect standard error to have a value
EXPECT_TRUE(stdErr.has_value());
// Expect the output to match the known stderr of the child
EXPECT_EQ(stdErr.value(), KnownTestProcessErrorString(pid));
}
// Expects no standard output from the child process
void ProcessSchedulerTestFixtureWithParams::DoNotExpectStdOutput(TestImpact::ProcessId pid)
{
const auto& stdOut = m_processResults[pid].m_std.m_out;
// Do not expect standard output to have a value
EXPECT_FALSE(stdOut.has_value());
}
// Expects no standard error from the child process
void ProcessSchedulerTestFixtureWithParams::DoNotExpectStdError(TestImpact::ProcessId pid)
{
const auto& stdErr = m_processResults[pid].m_std.m_err;
// Do not expect standard error to have a value
EXPECT_FALSE(stdErr.has_value());
}
TEST_P(ProcessSchedulerTestFixtureWithParams, ValidProcesses_SuccessfulLaunches)
{
// Given a set of processes to launch with valid arguments
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
ExpectGracefulExit(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, ValidAndInvalidProcesses_LaunchSuccessesAndFailures)
{
const size_t invalidProcessGroup = 4;
// Given a mixture of processes to launch with valid and invalid arguments
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid % invalidProcessGroup == 0)
{
m_processInfos.emplace_back(
pid,
InvalidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
else
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
}
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid % invalidProcessGroup == 0)
{
ExpectUnsuccessfulLaunch(pid);
}
else
{
ExpectGracefulExit(pid);
}
DoNotExpectStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, ProcessTimeouts_InFlightProcessesTimeout)
{
const size_t timeoutProcessGroup = 4;
// Given a mixture of processes to launch with some processes sleeping indefinately
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid % timeoutProcessGroup == 0)
{
m_processInfos.emplace_back(pid, ValidProcessPath, ConstructTestProcessArgs(pid, LongSleep));
}
else
{
m_processInfos.emplace_back(pid, ValidProcessPath, ConstructTestProcessArgs(pid, NoSleep));
}
}
// When the process scheduler launches the processes with a process timeout value
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::chrono::milliseconds(100),
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid % timeoutProcessGroup == 0)
{
ExpectTimeoutProcess(pid);
}
else
{
ExpectExitCondition(pid);
}
DoNotExpectStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(
ProcessSchedulerTestFixtureWithParams, ProcessLaunchCallbackAbort_InFlightProcessesTerminatedAndQueuedProcessesUnlaunched)
{
const size_t processToAbort = 8;
// Given a set of processes to launch
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
// Given a launch callback that will return the abort value for the process to abort
const auto abortingLaunchCallback = [this, processToAbort](
TestImpact::ProcessId pid,
TestImpact::LaunchResult launchResult,
AZStd::chrono::high_resolution_clock::time_point createTime)
{
m_processLaunchCallback(pid, launchResult, createTime);
if (pid == processToAbort)
{
return TestImpact::CallbackResult::Abort;
}
else
{
return TestImpact::CallbackResult::Continue;
}
};
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
abortingLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid < processToAbort)
{
ExpectSuccessfulLaunch(pid);
}
else if (pid == processToAbort)
{
ExpectTerminatedProcess(pid);
}
else
{
ExpectUnlaunchedProcess(pid);
}
DoNotExpectStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, ProcessExitCallbackAbort_InFlightProcessesTerminated)
{
const size_t processToAbort = 4;
// Given a set of processes to launch
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
// Given an exit callback that will return the abort value for the process to abort
const auto abortingExitCallback = [this, processToAbort](
TestImpact::ProcessId pid,
TestImpact::ExitCondition exitStatus,
TestImpact::ReturnCode returnCode,
TestImpact::StdContent&& std,
AZStd::chrono::high_resolution_clock::time_point exitTime)
{
m_processExitCallback(pid, exitStatus, returnCode, std::move(std), exitTime);
if (pid == processToAbort)
{
return TestImpact::CallbackResult::Abort;
}
else
{
return TestImpact::CallbackResult::Continue;
}
};
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
abortingExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid < processToAbort)
{
ExpectSuccessfulLaunch(pid);
}
else if (pid == processToAbort)
{
ExpectGracefulExit(pid);
}
else
{
if (m_processResults[pid].m_launchResult.has_value())
{
ExpectSuccessfulLaunch(pid);
}
else
{
ExpectUnlaunchedProcess(pid);
}
}
DoNotExpectStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, SchedulerTimeout_QueuedAndInFlightProcessesTerminated)
{
const size_t processToTimeout = 0;
// Given a set of processes to launch where one process will sleep indefinately
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid == processToTimeout)
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, LongSleep));
}
else
{
m_processInfos.emplace_back(
pid,
ValidProcessPath,
ConstructTestProcessArgs(pid, NoSleep));
}
}
// When the process scheduler launches the processes with a scheduler timeout value
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::chrono::milliseconds(100)
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
if (pid == processToTimeout)
{
ExpectTimeoutProcess(pid);
}
else
{
if (m_processResults[pid].m_launchResult.has_value())
{
ExpectSuccessfulLaunch(pid);
}
else
{
ExpectUnlaunchedProcess(pid);
}
}
DoNotExpectStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, RedirectStdOut_StdOutputIsLargeTextString)
{
// Given a set of processes to launch
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
m_processInfos.emplace_back(
pid,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
ConstructTestProcessArgsLargeText(pid, NoSleep));
}
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
ExpectGracefulExit(pid);
ExpectLargeStdOutput(pid);
DoNotExpectStdError(pid);
}
}
TEST_P(ProcessSchedulerTestFixtureWithParams, RedirectStdError_StdErrorIsLargeTextString)
{
// Given a set of processes to launch
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
m_processInfos.emplace_back(
pid,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
ConstructTestProcessArgsLargeText(pid, NoSleep));
}
// When the process scheduler launches the processes
m_processScheduler = AZStd::make_unique<TestImpact::ProcessScheduler>(
m_processInfos,
m_processLaunchCallback,
m_processExitCallback,
m_numMaxConcurrentProcesses,
AZStd::nullopt,
AZStd::nullopt
);
for (size_t pid = 0; pid < m_numProcessesToLaunch; pid++)
{
ExpectGracefulExit(pid);
DoNotExpectStdOutput(pid);
ExpectLargeStdError(pid);
}
}
INSTANTIATE_TEST_CASE_P(
SmallConcurrentProcesses,
ProcessSchedulerTestFixtureWithParams,
::testing::Combine(
::testing::ValuesIn(SmallNumMaxConcurrentProcesses),
::testing::ValuesIn(SmallNumProcessesToLaunch)
));
INSTANTIATE_TEST_CASE_P(
LargeConcurrentProcesses,
ProcessSchedulerTestFixtureWithParams,
::testing::Combine(
::testing::ValuesIn(LargeNumMaxConcurrentProcesses),
::testing::ValuesIn(LargeNumProcessesToLaunch)
));
} // namespace UnitTest
@@ -1,491 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Process/TestImpactProcess.h>
#include <Process/TestImpactProcessLauncher.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/string/conversions.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
class ProcessTestFixture
: public AllocatorsTestFixture
{
protected:
void SetUp() override
{
UnitTest::AllocatorsTestFixture::SetUp();
}
void TearDown() override
{
if (m_process && m_process->IsRunning())
{
m_process->Terminate(0);
}
UnitTest::AllocatorsTestFixture::TearDown();
}
AZStd::unique_ptr<TestImpact::Process> m_process;
static constexpr const TestImpact::ProcessId m_id = 1;
static constexpr const TestImpact::ReturnCode m_terminateErrorCode = 666;
};
TEST_F(ProcessTestFixture, LaunchValidProcess_ProcessReturnsSuccessfully)
{
// Given a process launched with a valid binary
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process has exited
m_process->BlockUntilExit();
// Expect the process to no longer be running
EXPECT_FALSE(m_process->IsRunning());
}
TEST_F(ProcessTestFixture, LaunchInvalidProcessInfo_ThrowsProcessException)
{
try
{
// Given a process launched with an invalid binary
TestImpact::ProcessInfo processInfo(m_id, "");
// Do not expect this code to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ProcessException& e)
{
// Except a process exception to be thrown
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(ProcessTestFixture, LaunchInvalidBinary_ThrowsProcessException)
{
try
{
// Given a process launched with an ivalid binary
TestImpact::ProcessInfo processInfo(m_id, "#!#zz:/z/z/z.exe.z@");
// When the process is attempted launch
m_process = TestImpact::LaunchProcess(processInfo);
// Do not expect this code to be reachable
FAIL();
}
catch ([[maybe_unused]] const TestImpact::ProcessException& e)
{
// Except a process exception to be thrown
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST_F(ProcessTestFixture, GetProcessInfo_ReturnsProcessInfo)
{
// Given a process launched with a valid binary and args
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath, args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process has exited
m_process->BlockUntilExit();
// Expect the retrieved process info to match to process info used to launch the process
EXPECT_EQ(m_process->GetProcessInfo().GetId(), m_id);
EXPECT_EQ(m_process->GetProcessInfo().GetProcessPath(), ValidProcessPath);
EXPECT_EQ(m_process->GetProcessInfo().GetStartupArgs(), args);
}
TEST_F(ProcessTestFixture, GetReturnCodeAfterExit_ReturnsArg)
{
// Given a process launched with a valid binary and args
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath, args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process has exited
m_process->BlockUntilExit();
// Expect the process to no longer be running
EXPECT_FALSE(m_process->IsRunning());
// Expect the return value to be the process id
EXPECT_EQ(m_process->GetReturnCode(), m_id);
}
TEST_F(ProcessTestFixture, GetReturnCodeInFlight_ReturnsNullOpt)
{
// Given a process launched with a valid binary and args to sleep for 100 seconds
const AZStd::string args = ConstructTestProcessArgs(m_id, LongSleep);
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath, args);
// When the process is running
m_process = TestImpact::LaunchProcess(processInfo);
// Expect the return value to be empty
EXPECT_EQ(m_process->GetReturnCode(), AZStd::nullopt);
}
TEST_F(ProcessTestFixture, TerminateWithErrorCode_ReturnsErrorCode)
{
// Given a process launched with a valid binary and args to sleep for 100 seconds
const AZStd::string args = ConstructTestProcessArgs(m_id, LongSleep);
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath, args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process is terminated by the client with the specified error code
m_process->Terminate(m_terminateErrorCode);
// Expect the return value to be the error code specified in the Terminate call
EXPECT_EQ(m_process->GetReturnCode(), m_terminateErrorCode);
// Expect the process to no longer be running
EXPECT_FALSE(m_process->IsRunning());
}
TEST_F(ProcessTestFixture, CheckIsRunningWhilstRunning_ProcessIsRunning)
{
// Given a process launched with a valid binary and args to sleep for 100 seconds
const AZStd::string args = ConstructTestProcessArgs(m_id, LongSleep);
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath, args);
// When the process is running
m_process = TestImpact::LaunchProcess(processInfo);
// Expect the process to be running
EXPECT_TRUE(m_process->IsRunning());
}
TEST_F(ProcessTestFixture, CheckIsRunningWhilstNotRunning_ReturnsFalse)
{
// Given a process launched with a valid binary
TestImpact::ProcessInfo processInfo(m_id, ValidProcessPath);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process is terminated by the client
m_process->Terminate(0);
// Expect the process to be running
EXPECT_FALSE(m_process->IsRunning());
}
TEST_F(ProcessTestFixture, RedirectStdOut_OutputIsKnownTestProcessOutputString)
{
// Given a process launched with a valid binary and standard output redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Expect stdoutput to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdOutput());
// Do not expect stdouterr to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to match the known stdout of the child
EXPECT_EQ(m_process->ConsumeStdOut(), KnownTestProcessOutputString(m_id));
}
TEST_F(ProcessTestFixture, RedirectStdErr_OutputIsKnownTestProcessOutputString)
{
// Given a process launched with a valid binary and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Do not expect stdoutput to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdOutput());
// Expect stderror to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to match the known stdout of the child
EXPECT_EQ(m_process->ConsumeStdErr(), KnownTestProcessErrorString(m_id));
}
TEST_F(ProcessTestFixture, RedirectStdOutAndTerminate_OutputIsEmpty)
{
// Given a process launched with a valid binary and standard output redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process is terminated
m_process->Terminate(0);
// Expect stdoutput to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdOutput());
// Do not expect stdouterr to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
}
TEST_F(ProcessTestFixture, RedirectStdErrAndTerminate_OutputIsEmpty)
{
// Given a process launched with a valid binary and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process is terminated
m_process->Terminate(0);
// Do not expect stdoutput to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdOutput());
// Expect stderror to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to be empty
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
TEST_F(ProcessTestFixture, RedirectStdOutAndStdErrorRouting_OutputsAreKnownTestProcessOutputStrings)
{
// Given a process launched with a valid binary and both standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Expect stdoutput to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdOutput());
// Expect stderror to be rerouted to the parent
EXPECT_TRUE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to match the known stdout and stderr of the child
EXPECT_EQ(m_process->ConsumeStdOut(), KnownTestProcessOutputString(m_id));
EXPECT_EQ(m_process->ConsumeStdErr(), KnownTestProcessErrorString(m_id));
}
TEST_F(ProcessTestFixture, NoStdOutOrStdErrRedirect_OutputIsEmpty)
{
// Given a process launched with a valid binary and both standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgs(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Do not expect stdoutput to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdOutput());
// Do not expect stdouterr to be rerouted to the parent
EXPECT_FALSE(m_process->GetProcessInfo().ParentHasStdError());
// Expect the output to to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
TEST_F(ProcessTestFixture, LargePipeNoRedirects_OutputsAreEmpty)
{
// Given a process outputting large text with no standard output and no standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Expect the output to to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
TEST_F(ProcessTestFixture, LargePipeNoRedirectsAndTerminated_OutputsAreEmpty)
{
// Given a process outputting large text with no standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, LongSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
// When the process is running
m_process = TestImpact::LaunchProcess(processInfo);
// Expect the output to to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
// When the process is terminated
m_process->Terminate(0);
// Expect the output to to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
TEST_F(ProcessTestFixture, LargePipeRedirectsAndReadWhilstRunning_OutputsAreEmpty)
{
// Given a process outputting large text with no standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, ShortSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::None,
TestImpact::StdErrorRouting::None,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the outputs are read as the process is running
while (m_process->IsRunning())
{
// Expect the outputs to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
}
TEST_F(ProcessTestFixture, LargePipeRedirectsAndTerminated_OutputsAreEmpty)
{
// Given a process outputting large text with both standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, LongSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process is terminated
m_process->Terminate(0);
// Expect the outputs to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
TEST_F(ProcessTestFixture, LargePipeRedirectsAndBlockedUntilExit_OutputsAreLargeTextFileSize)
{
// Given a process outputting large text with both standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath,
args);
m_process = TestImpact::LaunchProcess(processInfo);
// When the process exits
m_process->BlockUntilExit();
// Expect the output lengths to be that of the large text output from the child process
EXPECT_EQ(m_process->ConsumeStdOut().value().length(), LargeTextSize);
EXPECT_EQ(m_process->ConsumeStdErr().value().length(), LargeTextSize);
}
TEST_F(ProcessTestFixture, LargePipeRedirectsAndReadWhilstRunning_TotalOutputsAreLargeTextFileSize)
{
// Given a process outputting large text with both standard output and standard error redirected to parent
const AZStd::string args = ConstructTestProcessArgsLargeText(m_id, NoSleep);
TestImpact::ProcessInfo processInfo(
m_id,
TestImpact::StdOutputRouting::ToParent,
TestImpact::StdErrorRouting::ToParent,
ValidProcessPath, args);
m_process = TestImpact::LaunchProcess(processInfo);
size_t stdOutBytes = 0;
size_t stdErrBytes = 0;
while (m_process->IsRunning())
{
// When the outputs are read as the process is running
if (auto output = m_process->ConsumeStdOut(); output.has_value())
{
stdOutBytes += output.value().length();
}
if (auto output = m_process->ConsumeStdErr(); output.has_value())
{
stdErrBytes += output.value().length();
}
}
// Expect the output lengths to be that of the large text output from the child process
EXPECT_EQ(stdOutBytes, LargeTextSize);
EXPECT_EQ(stdErrBytes, LargeTextSize);
// Expect the outputs to be empty
EXPECT_FALSE(m_process->ConsumeStdOut().has_value());
EXPECT_FALSE(m_process->ConsumeStdErr().has_value());
}
} // namespace UnitTest
@@ -1,352 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <TestImpactTestUtils.h>
#include <Target/TestImpactProductionTargetList.h>
#include <Target/TestImpactTestTargetList.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
namespace UnitTest
{
namespace
{
AZStd::string GenerateBuildTargetName(size_t index)
{
return AZStd::string::format("Target%u", index);
}
AZStd::string GenerateBuildTargetOutputName(size_t index)
{
return AZStd::string::format("Output%u", index);
}
AZ::IO::Path GenerateBuildTargetPath(size_t index)
{
return AZStd::string::format("C:\\Repo\\Dir%u", index);
}
AZStd::string GenerateTestTargetSuite(size_t index)
{
return AZStd::string::format("Suite%u", index);
}
TestImpact::LaunchMethod GenerateLaunchMethod(size_t index)
{
return index % 2 == 0 ? TestImpact::LaunchMethod::StandAlone : TestImpact::LaunchMethod::TestRunner;
}
AZStd::string GenerateStaticSourceFile(size_t index)
{
return AZStd::string::format("StaticSource%u", index);
}
TestImpact::AutogenPairs GenerateAutogenSourceFiles(size_t index)
{
TestImpact::AutogenPairs autogen;
autogen.m_input = AZStd::string::format("InputSource%u", index);
autogen.m_outputs.push_back(AZStd::string::format("OutputSource%u", index));
autogen.m_outputs.push_back(AZStd::string::format("OutputHeader%u", index));
return autogen;
}
TestImpact::TargetSources GenerateTargetSources(size_t index)
{
TestImpact::TargetSources sources;
sources.m_staticSources.resize(index + 1);
for (size_t i = 0; i < sources.m_staticSources.size(); i++)
{
sources.m_staticSources[i] = GenerateStaticSourceFile(i);
}
// Only generate autogen sources for even-numbered indexes
if (index % 2 == 0)
{
sources.m_autogenSources.resize(index + 1);
for (size_t i = 0; i < sources.m_autogenSources.size(); i++)
{
sources.m_autogenSources[i] = GenerateAutogenSourceFiles(i);
}
}
return sources;
}
TestImpact::ProductionTargetDescriptor GenerateProductionTargetDescriptor(size_t index = 0)
{
return TestImpact::ProductionTargetDescriptor(
{
TestImpact::BuildMetaData
{
GenerateBuildTargetName(index), GenerateBuildTargetOutputName(index), GenerateBuildTargetPath(index)
},
GenerateTargetSources(index)
});
}
TestImpact::TestTargetDescriptor GenerateTestTargetDescriptor(size_t index = 0)
{
return TestImpact::TestTargetDescriptor(
{
TestImpact::BuildMetaData
{
GenerateBuildTargetName(index), GenerateBuildTargetOutputName(index), GenerateBuildTargetPath(index)
},
GenerateTargetSources(index)
},
TestImpact::TestTargetMeta
{
GenerateTestTargetSuite(index), GenerateLaunchMethod(index)
});
}
} // namespace
template<typename Target>
typename Target::Descriptor GenerateTargetDescriptor(size_t index = 0)
{
static_assert(
AZStd::is_same_v<Target, TestImpact::ProductionTarget> || AZStd::is_same_v<Target, TestImpact::TestTarget>,
"Unexpected target type, wants TestImpact::ProductionTarget or TestImpact::TestTarget");
if constexpr (AZStd::is_same_v<Target, TestImpact::ProductionTarget>)
{
return GenerateProductionTargetDescriptor(index);
}
else
{
return GenerateTestTargetDescriptor(index);
}
}
void ValidateSources(const TestImpact::TargetSources& sources, size_t index = 0)
{
EXPECT_EQ(sources.m_staticSources.size(), index + 1);
for (size_t i = 0; i < sources.m_staticSources.size(); i++)
{
EXPECT_EQ(sources.m_staticSources[i], GenerateStaticSourceFile(i));
}
// Even numbered indexes have autogen sources
if (index % 2 == 0)
{
EXPECT_EQ(sources.m_autogenSources.size(), index + 1);
for (size_t i = 0; i < sources.m_autogenSources.size(); i++)
{
enum
{
OutputSource = 0,
OutputHeader = 1
};
const TestImpact::AutogenPairs expectedAutogenSources = GenerateAutogenSourceFiles(i);
EXPECT_EQ(sources.m_autogenSources[i].m_input, expectedAutogenSources.m_input);
EXPECT_EQ(sources.m_autogenSources[i].m_outputs[OutputSource], expectedAutogenSources.m_outputs[OutputSource]);
EXPECT_EQ(sources.m_autogenSources[i].m_outputs[OutputHeader], expectedAutogenSources.m_outputs[OutputHeader]);
}
}
else
{
EXPECT_TRUE(sources.m_autogenSources.empty());
}
}
void ValidateTarget(const TestImpact::ProductionTarget& target, size_t index = 0)
{
EXPECT_EQ(target.GetName(), GenerateBuildTargetName(index));
EXPECT_EQ(target.GetOutputName(), GenerateBuildTargetOutputName(index));
EXPECT_EQ(target.GetPath(), GenerateBuildTargetPath(index));
EXPECT_EQ(target.GetType(), TestImpact::TargetType::Production);
ValidateSources(target.GetSources(), index);
}
void ValidateTarget(const TestImpact::TestTarget& target, size_t index = 0)
{
EXPECT_EQ(target.GetName(), GenerateBuildTargetName(index));
EXPECT_EQ(target.GetOutputName(), GenerateBuildTargetOutputName(index));
EXPECT_EQ(target.GetPath(), GenerateBuildTargetPath(index));
EXPECT_EQ(target.GetType(), TestImpact::TargetType::Test);
EXPECT_EQ(target.GetSuite(), GenerateTestTargetSuite(index));
EXPECT_EQ(target.GetLaunchMethod(), GenerateLaunchMethod(index));
ValidateSources(target.GetSources(), index);
}
template<typename TargetList>
class TargetListFixture
: public AllocatorsTestFixture
{
public:
using TargetListType = TargetList;
using TargetType = typename TargetList::TargetType;
static constexpr size_t m_numTargets = 10;
};
using TargetTypes = testing::Types<TestImpact::ProductionTargetList, TestImpact::TestTargetList>;
TYPED_TEST_CASE(TargetListFixture, TargetTypes);
TYPED_TEST(TargetListFixture, CreateTarget_ExpectValidTarget)
{
// Given a target of the specified type
TargetType target(GenerateTargetDescriptor<TargetType>());
// Expect the target to match the procedurally generated target descriptor
ValidateTarget(target);
}
TYPED_TEST(TargetListFixture, CreateEmptyTargetList_ExpectTargetException)
{
try
{
// Given an empty target list
TargetListType targetList({});
// Do not expect the target list construction to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::TargetException& e)
{
// Expect a target exception to be thrown
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TYPED_TEST(TargetListFixture, CreateTargetListWithDuplicateDescriptor_ExpectTargetException)
{
try
{
// Given a set of target descriptors containing a single duplicate
AZStd::vector<TargetType::Descriptor> descriptors;
descriptors.reserve(m_numTargets);
for (size_t i = 0; i < m_numTargets; i++)
{
// Wrap the last index round to repeat the first index
descriptors.push_back(GenerateTargetDescriptor<TargetType>(i % (m_numTargets - 1)));
}
// When constructing the target list containing the duplicate target descriptor
TargetListType targetList(AZStd::move(descriptors));
// Do not expect the target list construction to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::TargetException& e)
{
// Expect a target exception to be thrown
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TYPED_TEST(TargetListFixture, CreateTargetListWithValidDescriptors_ExpectValidTargetList)
{
// Given a valid set of target descriptor
AZStd::vector<TargetType::Descriptor> descriptors;
descriptors.reserve(m_numTargets);
for (size_t i = 0; i < m_numTargets; i++)
{
descriptors.push_back(GenerateTargetDescriptor<TargetType>(i));
}
// When constructing the target list containing the valid target descriptors
TargetListType targetList(AZStd::move(descriptors));
// Expect the number of targets in the list to match the number of target descriptors used to construct the list
EXPECT_EQ(targetList.GetNumTargets(), m_numTargets);
for (size_t i = 0; i < targetList.GetNumTargets(); i++)
{
// Expect the target to match the procedurally generated target descriptor
ValidateTarget(targetList.GetTargets()[i], i);
// Expect the target obtained by name to match the procedurally generated target descriptor
auto target = targetList.GetTarget(GenerateBuildTargetName(i));
EXPECT_TRUE(target);
EXPECT_EQ(target->GetName(), GenerateBuildTargetName(i));
}
}
TYPED_TEST(TargetListFixture, FindNonExistantTargets_ExpectEmptyResults)
{
// Given a valid set of target descriptor
AZStd::vector<TargetType::Descriptor> descriptors;
descriptors.reserve(m_numTargets);
for (size_t i = 0; i < m_numTargets; i++)
{
descriptors.push_back(GenerateTargetDescriptor<TargetType>(i));
}
// When constructing the target list containing the valid target descriptors
TargetListType targetList(AZStd::move(descriptors));
// Expect the number of targets in the list to match the number of target descriptors used to construct the list
EXPECT_EQ(targetList.GetNumTargets(), m_numTargets);
for (size_t i = 0; i < targetList.GetNumTargets(); i++)
{
// When attempting to find a target that does not exist
auto target = targetList.GetTarget(GenerateBuildTargetName(i + targetList.GetNumTargets()));
// Expect an empty result
EXPECT_FALSE(target);
}
}
TYPED_TEST(TargetListFixture, FindNonExistantTargetsAndThrow_ExpectTargetExceptionss)
{
// Given a valid set of target descriptor
AZStd::vector<TargetType::Descriptor> descriptors;
descriptors.reserve(m_numTargets);
for (size_t i = 0; i < m_numTargets; i++)
{
descriptors.push_back(GenerateTargetDescriptor<TargetType>(i));
}
// When constructing the target list containing the valid target descriptors
TargetListType targetList(AZStd::move(descriptors));
// Expect the number of targets in the list to match the number of target descriptors used to construct the list
EXPECT_EQ(targetList.GetNumTargets(), m_numTargets);
for (size_t i = 0; i < targetList.GetNumTargets(); i++)
{
try
{
// When attempting to find a target that does not exist
targetList.GetTargetOrThrow(GenerateBuildTargetName(i + targetList.GetNumTargets()));
// Do not expect the target list construction to succeed
FAIL();
}
catch ([[maybe_unused]] const TestImpact::TargetException& e)
{
// Expect a target exception to be thrown
SUCCEED();
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
}
} // namespace UnitTest
@@ -1,150 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
#include <TestImpactFramework/TestImpactException.h>
namespace UnitTest
{
constexpr const char* Message = "String Constructor";
TEST(ExceptionTest, DefaultConstructor_HasEmptyMessageString)
{
// Given an exception instantiated with the default constructor
const TestImpact::Exception e;
// Expect the message to be an empty string
EXPECT_STREQ(e.what(), "\0");
}
TEST(ExceptionTest, StringConstructor_HasSpecifiedMessageString)
{
// Given an exception instantiated with a string
const AZStd::string msg(Message);
const TestImpact::Exception e(msg);
// Expect the message to be the specified string
EXPECT_STREQ(e.what(), Message);
}
TEST(ExceptionTest, StringLiteralConstructor_HasSpecifiedMessageString)
{
// Given an exception instantiated with a string literal
const TestImpact::Exception e(Message);
// Expect the message to be the specified string
EXPECT_STREQ(e.what(), Message);
}
TEST(ExceptionTest, InitializedWithLocalString_HasCopyOfLocalStringString)
{
try
{
// Given an exception instantiated with a string in local scope
throw(TestImpact::Exception(AZStd::string::format("%s", Message)));
// Do not expect this code to be reachable
FAIL();
}
catch (const TestImpact::Exception& e)
{
// Expect the message to be the specified out-of-scope string
EXPECT_STREQ(e.what(), Message);
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(ExceptionTest, InitializedWithLocalStringLiteral_HasCopyOfLocalStringString)
{
try
{
// Given an exception instantiated with a copy of the message string in local scope
throw(TestImpact::Exception(AZStd::string::format("%s", Message).c_str()));
// Do not expect this code to be reachable
FAIL();
}
catch (const TestImpact::Exception& e)
{
// Expect the message to be the specified out-of-scope string literal
EXPECT_STREQ(e.what(), Message);
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(ExceptionTest, EvalMacroFails_ExceptionTestThrown)
{
try
{
// Given an exception instantiated with a string literal in local scope
AZ_TestImpact_Eval(false, TestImpact::Exception, Message);
// Do not expect this code to be reachable
FAIL();
}
catch (const TestImpact::Exception& e)
{
// Expect the message contain the specified string
EXPECT_STREQ(e.what(), Message);
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
TEST(ExceptionTest, EvalMacroSucceeds_ExceptionTestNotThrown)
{
try
{
// Given an exception instantiated with a string literal in local scope
AZ_TestImpact_Eval(true, TestImpact::Exception, Message);
// Expect this code to be reachable
SUCCEED();
}
catch (...)
{
// Do not expect any exceptions
FAIL();
}
}
TEST(ExceptionTest, Throw_ExceptionTestThrown)
{
try
{
// Given an exception instantiated with a string literal in local scope
throw(TestImpact::Exception(Message));
}
catch (const TestImpact::Exception& e)
{
// Expect the message contain the specified string
EXPECT_STREQ(e.what(), Message);
}
catch (...)
{
// Do not expect any other exceptions
FAIL();
}
}
} // namespace UnitTest
@@ -1,159 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <TestImpactTestUtils.h>
#include <Test/Enumeration/TestImpactTestEnumeration.h>
#include <Test/Run/TestImpactTestRun.h>
#include <AzCore/IO/SystemFile.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
template<typename Flags>
constexpr bool IsFlagSet(Flags flags, Flags flag)
{
return TestImpact::Bitwise::IsFlagSet(flags, flag);
}
namespace UnitTest
{
// Named constants for array of targets lookup
enum
{
TestTargetA,
TestTargetB,
TestTargetC,
TestTargetD
};
// Named constants for max concurrency values
enum
{
OneConcurrentProcess = 1,
FourConcurrentProcesses = 4
};
// Validates that the specified job was executed and returned successfully
template<typename Job>
void ValidateJobExecutedSuccessfully(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::ExecutedWithSuccess);
EXPECT_TRUE(job.GetDuration() > AZStd::chrono::milliseconds(0));
EXPECT_TRUE(job.GetReturnCode().has_value());
EXPECT_EQ(job.GetReturnCode(), 0);
EXPECT_TRUE(job.GetPayload().has_value());
}
// Validates that the specified job has not been executed
template<typename Job>
void ValidateJobNotExecuted(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::NotExecuted);
EXPECT_EQ(job.GetStartTime(), AZStd::chrono::high_resolution_clock::time_point());
EXPECT_EQ(job.GetEndTime(), AZStd::chrono::high_resolution_clock::time_point());
EXPECT_EQ(job.GetDuration(), AZStd::chrono::milliseconds(0));
EXPECT_FALSE(job.GetReturnCode().has_value());
EXPECT_FALSE(job.GetPayload().has_value());
}
// Validates that the specified job failed to execute
template<typename Job>
void ValidateJobFailedToExecute(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::FailedToExecute);
EXPECT_EQ(job.GetStartTime(), AZStd::chrono::high_resolution_clock::time_point());
EXPECT_EQ(job.GetEndTime(), AZStd::chrono::high_resolution_clock::time_point());
EXPECT_EQ(job.GetDuration(), AZStd::chrono::milliseconds(0));
EXPECT_FALSE(job.GetReturnCode().has_value());
EXPECT_FALSE(job.GetPayload().has_value());
}
// Validates that the specified job executed but returned with error
template<typename Job>
void ValidateJobExecutedWithFailure(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::ExecutedWithFailure);
EXPECT_TRUE(job.GetDuration() > AZStd::chrono::milliseconds(0));
EXPECT_TRUE(job.GetReturnCode().has_value());
EXPECT_GT(job.GetReturnCode().value(), 0);
EXPECT_FALSE(job.GetPayload().has_value());
}
// Validates that the specified job was executed but was terminated by the job runner
template<typename Job>
void ValidateJobTimeout(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::Terminated);
EXPECT_TRUE(job.GetDuration() > AZStd::chrono::milliseconds(0));
EXPECT_TRUE(job.GetReturnCode().has_value());
EXPECT_EQ(job.GetReturnCode().value(), TestImpact::ProcessTimeoutErrorCode);
EXPECT_FALSE(job.GetPayload().has_value());
}
// Validates that the specified job executed but returned with error
template<typename Job>
void ValidateJobExecutedWithFailedTests(const Job& job)
{
EXPECT_EQ(job.GetResult(), TestImpact::JobResult::ExecutedWithFailure);
EXPECT_TRUE(job.GetDuration() > AZStd::chrono::milliseconds(0));
EXPECT_TRUE(job.GetReturnCode().has_value());
EXPECT_GT(job.GetReturnCode().value(), 0);
EXPECT_TRUE(job.GetPayload().has_value());
}
// Validates whether a test run completed (passed/failed)
template<typename Job>
void ValidateTestRunCompleted(const Job& job, TestImpact::TestRunResult result)
{
if (result == TestImpact::TestRunResult::Passed)
{
ValidateJobExecutedSuccessfully(job);
}
else
{
ValidateJobExecutedWithFailedTests(job);
}
}
// Validates that the specified test run matches the expected output
inline void ValidateTestTargetRun(const TestImpact::TestRun& actualResult, const TestImpact::TestRun& expectedResult)
{
EXPECT_TRUE(CheckTestRunsAreEqualIgnoreDurations(actualResult, expectedResult));
EXPECT_EQ(actualResult.GetNumTestSuites(), CalculateNumTestSuites(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumTests(), CalculateNumTests(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumEnabledTests(), CalculateNumEnabledTests(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumDisabledTests(), CalculateNumDisabledTests(expectedResult.GetTestSuites()));
EXPECT_GT(actualResult.GetDuration(), AZStd::chrono::milliseconds{0});
EXPECT_EQ(actualResult.GetNumPasses(), CalculateNumPassedTests(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumFailures(), CalculateNumFailedTests(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumRuns(), CalculateNumRunTests(expectedResult.GetTestSuites()));
EXPECT_EQ(actualResult.GetNumNotRuns(), CalculateNumNotRunTests(expectedResult.GetTestSuites()));
}
// Delete any existing data in the test run folder as not to pollute tests with data from previous test runs
// Note: the file IO operations of this fixture means it cannot be sharded by the test sharder due to file race conditions
inline void DeleteFiles(const AZStd::string& path, const AZStd::string& pattern)
{
AZ::IO::SystemFile::FindFiles(AZStd::string::format("%s/%s", path.c_str(), pattern.c_str()).c_str(), [&path](const char* file, bool isFile)
{
if (isFile)
{
AZ::IO::SystemFile::Delete(AZStd::string::format("%s/%s", path.c_str(), file).c_str());
}
return true;
});
};
} // namespace UnitTest
File diff suppressed because it is too large Load Diff
@@ -1,220 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <Artifact/Dynamic/TestImpactCoverage.h>
#include <Artifact/Dynamic/TestImpactTestEnumerationSuite.h>
#include <Artifact/Dynamic/TestImpactTestRunSuite.h>
#include <Artifact/Static/TestImpactBuildTargetDescriptor.h>
#include <Artifact/Static/TestImpactProductionTargetDescriptor.h>
#include <Artifact/Static/TestImpactTestTargetDescriptor.h>
#include <Artifact/Static/TestImpacttestTargetMeta.h>
#include <Process/TestImpactProcess.h>
#include <Test/Enumeration/TestImpactTestEnumeration.h>
#include <Test/Run/TestImpactTestCoverage.h>
#include <Test/Run/TestImpactTestRun.h>
#include <AzCore/std/optional.h>
#include <AzCore/std/string/string.h>
namespace UnitTest
{
// Common parameters for process related tests
inline constexpr const char* ValidProcessPath = LY_TEST_IMPACT_TEST_PROCESS_BIN;
inline constexpr const char* InvalidProcessPath = "!!!@@@---???";
inline constexpr const AZStd::chrono::milliseconds LongSleep = AZStd::chrono::minutes(60);
inline constexpr const size_t LargeTextSize = 0xFFFF - 1; // 65,535 chars less the null terminator
inline constexpr const AZStd::chrono::milliseconds ShortSleep = AZStd::chrono::milliseconds(500);
inline constexpr const AZStd::chrono::milliseconds NoSleep = AZStd::chrono::milliseconds(0);
// Writes the specified text string to the specified file
void WriteTextToFile(const AZStd::string& text, const AZ::IO::Path& path);
// Construct the arguments for launcing the test process
AZStd::string ConstructTestProcessArgs(TestImpact::ProcessId pid, AZStd::chrono::milliseconds sleepTime);
// Construct the arguments for launcing the test process with large text dump
AZStd::string ConstructTestProcessArgsLargeText(TestImpact::ProcessId pid, AZStd::chrono::milliseconds sleepTime);
// Known standard output string of the test process
AZStd::string KnownTestProcessOutputString(TestImpact::ProcessId pid);
// Known standard error string of the test process
AZStd::string KnownTestProcessErrorString(TestImpact::ProcessId pid);
// Generate a gtest typed test fixture name string based on the specified name and type
AZStd::string GenerateTypedFixtureName(const AZStd::string& name, size_t typeNum);
// Generate a gtest parameterized test fixture name string based on the specified name and permutation number
AZStd::string GenerateParameterizedFixtureName(
const AZStd::string& name,
const AZStd::optional<const AZStd::string>& prefix = AZStd::nullopt);
// Generate a gtest parameterized test name string based on the specified name and permutation number
AZStd::string GenerateParameterizedTestName(const AZStd::string& name, size_t testNum);
// Generate a JSON string of array elements from the specified vector
AZStd::string StringVectorToJSONElements(const AZStd::vector<AZStd::string> strings);
// Generate a build target descriptor string in JSON format from the specified build target description
AZStd::string GenerateBuildTargetDescriptorString(
const AZStd::string& name,
const AZStd::string& outputName,
const AZStd::string& path,
const AZStd::vector<AZStd::string>& staticSources,
const AZStd::vector<AZStd::string>& autogenInputs,
const AZStd::vector<AZStd::string>& autogenOutputs);
// Generate a build target descriptor from the specified build target description
// Note: no check for correctness of arguments is peformed
TestImpact::BuildTargetDescriptor GenerateBuildTargetDescriptor(
const AZStd::string& name,
const AZStd::string& outputName,
const AZStd::string& path,
const AZStd::vector<AZStd::string>& staticSources,
const TestImpact::AutogenSources& autogenSources);
// Procedurally generate a parameterized test suite based on the supplied parameters
TestImpact::TestEnumerationSuite GenerateParamterizedSuite(
const AZStd::pair<AZStd::string, bool>& fixture,
const AZStd::optional<AZStd::string>& permutation,
const AZStd::vector<AZStd::pair<AZStd::string, bool>> tests,
size_t permutationCount);
// Procedurally generate a typed test suite based on the supplied parameters
void GenerateTypedSuite(
const AZStd::pair<AZStd::string, bool>& fixture,
const AZStd::vector<AZStd::pair<AZStd::string, bool>> tests,
size_t permutationCount,
AZStd::vector<TestImpact::TestEnumerationSuite>& parentSuiteList);
// Helper functions for calculating test suite meta-data
size_t CalculateNumPassedTests(const AZStd::vector<TestImpact::TestRunSuite>& suites);
size_t CalculateNumFailedTests(const AZStd::vector<TestImpact::TestRunSuite>& suites);
size_t CalculateNumRunTests(const AZStd::vector<TestImpact::TestRunSuite>& suites);
size_t CalculateNumNotRunTests(const AZStd::vector<TestImpact::TestRunSuite>& suites);
template<typename TestSuite>
size_t CalculateNumTestSuites(const AZStd::vector<TestSuite>& suites)
{
return suites.size();
}
template<typename TestSuite>
size_t CalculateNumTests(const AZStd::vector<TestSuite>& suites)
{
size_t numTests = 0;
for (const auto& suite : suites)
{
numTests += suite.m_tests.size();
}
return numTests;
}
template<typename TestSuite>
size_t CalculateNumEnabledTests(const AZStd::vector<TestSuite>& suites)
{
size_t numEnabledTests = 0;
for (const auto& suite : suites)
{
if (!suite.m_enabled)
{
continue;
}
for (const auto& test : suite.m_tests)
{
if (test.m_enabled)
{
numEnabledTests++;
}
}
}
return numEnabledTests;
}
template<typename TestSuite>
size_t CalculateNumDisabledTests(const AZStd::vector<TestSuite>& suites)
{
size_t numDisabledTests = 0;
for (const auto& suite : suites)
{
if (!suite.m_enabled)
{
numDisabledTests += suite.m_tests.size();
continue;
}
for (const auto& test : suite.m_tests)
{
if (!test.m_enabled)
{
numDisabledTests++;
}
}
}
return numDisabledTests;
}
// Test enumeration suite representation of the test targets used for testing
AZStd::vector<TestImpact::TestEnumerationSuite> GetTestTargetATestEnumerationSuites();
AZStd::vector<TestImpact::TestEnumerationSuite> GetTestTargetBTestEnumerationSuites();
AZStd::vector<TestImpact::TestEnumerationSuite> GetTestTargetCTestEnumerationSuites();
AZStd::vector<TestImpact::TestEnumerationSuite> GetTestTargetDTestEnumerationSuites();
// Test run suite representation of the test targets used for testing
AZStd::vector<TestImpact::TestRunSuite> GetTestTargetATestRunSuites();
AZStd::vector<TestImpact::TestRunSuite> GetTestTargetBTestRunSuites();
AZStd::vector<TestImpact::TestRunSuite> GetTestTargetCTestRunSuites();
AZStd::vector<TestImpact::TestRunSuite> GetTestTargetDTestRunSuites();
// Line coverage representation of the test targets used for testing
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetALineModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetBLineModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetCLineModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetDLineModuleCoverages();
// Source coverage representation of the test targets used for testing
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetASourceModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetBSourceModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetCSourceModuleCoverages();
AZStd::vector<TestImpact::ModuleCoverage> GetTestTargetDSourceModuleCoverages();
// Helper comparisons for test validation (could potentially be moved to production source in the future)
bool operator==(const TestImpact::TestEnumerationCase& lhs, const TestImpact::TestEnumerationCase& rhs);
bool operator==(const TestImpact::TestEnumerationSuite& lhs, const TestImpact::TestEnumerationSuite& rhs);
bool operator==(const AZStd::vector<TestImpact::TestEnumerationSuite>& lhs, const AZStd::vector<TestImpact::TestEnumerationSuite>& rhs);
bool operator==(const TestImpact::TestEnumeration& lhs, const TestImpact::TestEnumeration& rhs);
bool operator==(const TestImpact::TestRunCase& lhs, const TestImpact::TestRunCase& rhs);
bool operator==(const TestImpact::TestRunSuite& lhs, const TestImpact::TestRunSuite& rhs);
bool operator==(const AZStd::vector<TestImpact::TestRunSuite>& lhs, const AZStd::vector<TestImpact::TestRunSuite>& rhs);
bool operator==(const TestImpact::TestRun& lhs, const TestImpact::TestRun& rhs);
bool CheckTestRunsAreEqualIgnoreDurations(const TestImpact::TestRun& lhs, const TestImpact::TestRun& rhs);
bool operator==(const TestImpact::BuildMetaData& lhs, const TestImpact::BuildMetaData& rhs);
bool operator==(const TestImpact::TargetSources& lhs, const TestImpact::TargetSources& rhs);
bool operator==(const TestImpact::BuildTargetDescriptor& lhs, const TestImpact::BuildTargetDescriptor& rhs);
bool operator==(const TestImpact::TestTargetMeta& lhs, const TestImpact::TestTargetMeta& rhs);
bool operator==(const TestImpact::ProductionTargetDescriptor& lhs, const TestImpact::ProductionTargetDescriptor& rhs);
bool operator==(const TestImpact::TestTargetDescriptor& lhs, const TestImpact::TestTargetDescriptor& rhs);
bool operator==(const TestImpact::LineCoverage& lhs, const TestImpact::LineCoverage& rhs);
bool operator==(const TestImpact::SourceCoverage& lhs, const TestImpact::SourceCoverage& rhs);
bool operator==(const TestImpact::ModuleCoverage& lhs, const TestImpact::ModuleCoverage& rhs);
bool operator==(const AZStd::vector<TestImpact::ModuleCoverage>& lhs, const AZStd::vector<TestImpact::ModuleCoverage>& rhs);
bool operator==(const TestImpact::TestCoverage& lhs, const TestImpact::TestCoverage& rhs);
} // namespace UnitTest
@@ -1,12 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
@@ -1,24 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
ly_add_target(
NAME TestImpact.TestProcess.Console EXECUTABLE
NAMESPACE AZ
FILES_CMAKE
testimpactframework_testprocess_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Source
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzFramework
)
@@ -1,93 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "TestImpactTestProcess.h"
#include "TestImpactTestProcessLargeText.h"
#include <AzCore/Memory/OSAllocator.h>
#include <AzCore/Settings/CommandLine.h>
#include <AzCore/std/chrono/chrono.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/parallel/thread.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzCore/std/string/conversions.h>
#include <AzCore/std/string/string.h>
#include <iostream>
namespace TestImpact
{
TestProcess::TestProcess(int argc, char* argv[])
{
StartupEnvironment();
ParseArgs(argc, argv);
}
TestProcess::~TestProcess()
{
TeardownEnvironment();
}
void TestProcess::StartupEnvironment()
{
AZ::AllocatorInstance<AZ::SystemAllocator>::Create();
}
void TestProcess::TeardownEnvironment()
{
AZ::AllocatorInstance<AZ::SystemAllocator>::Destroy();
}
void TestProcess::ParseArgs(int argc, char* argv[])
{
const AZStd::string idArg = "id";
const AZStd::string sleepArg = "sleep";
const AZStd::string largeArg = "large";
AZ::CommandLine commandLine;
commandLine.Parse(argc, argv);
m_id = AZStd::stoi(commandLine.GetSwitchValue(idArg, 0));
m_sleep = AZStd::stoi(commandLine.GetSwitchValue(sleepArg, 0));
m_dumpLargeText = false;
for (auto i = 0; i < commandLine.GetNumMiscValues(); i++)
{
const auto& miscValue = commandLine.GetMiscValue(i);
if (miscValue == largeArg)
{
m_dumpLargeText = true;
break;
}
}
}
int TestProcess::MainFunc()
{
if (m_dumpLargeText)
{
// Dump the large text blob to stdout and stderr
std::cout << LongText;
std::cerr << LongText;
}
else
{
// Dump the short known output string with id appended to stdout and stderr
std::cout << "TestProcessMainStdOut" << m_id;
std::cerr << "TestProcessMainStdErr" << m_id;
}
AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(m_sleep));
return m_id;
}
} // namespace TestImpact
@@ -1,38 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzFramework/Application/Application.h>
namespace TestImpact
{
class TestProcess
{
public:
TestProcess(int argc, char* argv[]);
~TestProcess();
int MainFunc();
private:
void StartupEnvironment();
void TeardownEnvironment();
void ParseArgs(int argc, char* argv[]);
int m_id;
int m_sleep;
bool m_dumpLargeText = false;
};
} // namespace TestImpact
@@ -1,531 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "TestImpactTestProcessLargeText.h"
namespace TestImpact
{
// Long text blob measuring 65,535 in length (inc. null terminator)
const char* const LongText =
"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";
} // namespace TestImpact
@@ -1,19 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
namespace TestImpact
{
// Large text blob in the form of a string literal so the app does not require the Az FileIO and Application environment
extern const char* const LongText;
} // namespace TestImpact
@@ -1,19 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "TestImpactTestProcess.h"
int main(int argc, char* argv[])
{
TestImpact::TestProcess process(argc, argv);
return process.MainFunc();
}
@@ -1,18 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Source/TestImpactTestProcessMain.cpp
Source/TestImpactTestProcess.cpp
Source/TestImpactTestProcess.h
Source/TestImpactTestProcessLargeText.cpp
Source/TestImpactTestProcessLargeText.h
)
@@ -1,12 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
@@ -1,28 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
################################################################################
# Tests
################################################################################
ly_add_target(
NAME TestImpact.TestTargetA.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
NAMESPACE AZ
FILES_CMAKE
testimpactframework_testtargeta_tests_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Tests
BUILD_DEPENDENCIES
PRIVATE
AZ::AzTestShared
AZ::AzTest
)
@@ -1,73 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/UnitTest/TestTypes.h>
namespace UnitTest
{
class TestFixture
: public AllocatorsTestFixture
{
};
TEST(TestCase, Test1_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test2_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test3_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test4_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test5_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test6_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test7_WillFail)
{
FAIL();
}
TEST_F(TestFixture, Test1_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture, Test2_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture, Test3_WillPass)
{
SUCCEED();
}
} // namespace UnitTest
AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);
@@ -1,14 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Tests/TestImpactTestTargetA.cpp
)
@@ -1,12 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
@@ -1,29 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
################################################################################
# Tests
################################################################################
ly_add_target(
NAME TestImpact.TestTargetB.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
NAMESPACE AZ
FILES_CMAKE
testimpactframework_testtargetb_tests_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Tests
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzTestShared
AZ::AzTest
)
@@ -1,78 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/tuple.h>
namespace UnitTest
{
class TestFixture
: public AllocatorsTestFixture
{
};
class TestFixtureWithParams
: public AllocatorsTestFixture
, public ::testing::WithParamInterface<AZStd::tuple<int, char, float>>
{
};
TEST(TestCase, Test1_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test2_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test3_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture, Test1_WillPass)
{
SUCCEED();
}
TEST_P(TestFixtureWithParams, Test1_WillPass)
{
SUCCEED();
}
TEST_P(TestFixtureWithParams, Test2_WillPass)
{
SUCCEED();
}
INSTANTIATE_TEST_CASE_P(
PermutationA,
TestFixtureWithParams,
::testing::Combine(
::testing::Values(1, 2, 4),
::testing::Values(3, 5, 7),
::testing::Values(-0.0f, 0.0f, 1.0f)
));
INSTANTIATE_TEST_CASE_P(
,
TestFixtureWithParams,
::testing::Combine(
::testing::Values(8, 16, 32),
::testing::Values(9, 13, 17),
::testing::Values(-10.0f, 0.05f, 10.0f)
));
} // namespace UnitTest
AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);
@@ -1,14 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Tests/TestImpactTestTargetB.cpp
)
@@ -1,12 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
@@ -1,29 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
################################################################################
# Tests
################################################################################
ly_add_target(
NAME TestImpact.TestTargetC.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
NAMESPACE AZ
FILES_CMAKE
testimpactframework_testtargetc_tests_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Tests
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzTestShared
AZ::AzTest
)
@@ -1,63 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/tuple.h>
namespace UnitTest
{
class TestFixture
: public AllocatorsTestFixture
{
};
template<typename T>
class TestFixtureWithTypes
: public AllocatorsTestFixture
{
};
using TestTypes = testing::Types<int, float, double, char>;
TYPED_TEST_CASE(TestFixtureWithTypes, TestTypes);
TEST_F(TestFixture, Test1_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture, Test2_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes, Test1_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes, Test2_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes, Test3_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes, Test4_WillPass)
{
SUCCEED();
}
} // namespace UnitTest
AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);
@@ -1,14 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Tests/TestImpactTestTargetC.cpp
)
@@ -1,12 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
add_subdirectory(Code)
@@ -1,29 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
################################################################################
# Tests
################################################################################
ly_add_target(
NAME TestImpact.TestTargetD.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
NAMESPACE AZ
FILES_CMAKE
testimpactframework_testtargetd_tests_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Tests
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzTestShared
AZ::AzTest
)
@@ -1,188 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/std/tuple.h>
namespace UnitTest
{
class TestFixture1
: public AllocatorsTestFixture
{
};
class DISABLED_TestFixture2
: public AllocatorsTestFixture
{
};
template<typename T>
class TestFixtureWithTypes1
: public AllocatorsTestFixture
{
};
template<typename T>
class DISABLED_TestFixtureWithTypes2
: public AllocatorsTestFixture
{
};
class TestFixtureWithParams1
: public AllocatorsTestFixture
, public ::testing::WithParamInterface<AZStd::tuple<int, char, float>>
{
};
class DISABLED_TestFixtureWithParams2
: public AllocatorsTestFixture
, public ::testing::WithParamInterface<AZStd::tuple<int, char, float>>
{
};
using TestTypes = testing::Types<int, float, double, char>;
TYPED_TEST_CASE(TestFixtureWithTypes1, TestTypes);
TYPED_TEST_CASE(DISABLED_TestFixtureWithTypes2, TestTypes);
TEST(TestCase, Test1_WillPass)
{
SUCCEED();
}
TEST(TestCase, DISABLED_Test2_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test3_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test4_WillPass)
{
SUCCEED();
}
TEST(TestCase, Test5_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture1, Test1_WillPass)
{
SUCCEED();
}
TEST_F(TestFixture1, Test2_WillPass)
{
SUCCEED();
}
TEST_F(DISABLED_TestFixture2, Test1_WillPass)
{
SUCCEED();
}
TEST_F(DISABLED_TestFixture2, Test2_WillPass)
{
SUCCEED();
}
TEST_P(TestFixtureWithParams1, Test1_WillPass)
{
SUCCEED();
}
TEST_P(TestFixtureWithParams1, DISABLED_Test2_WillPass)
{
SUCCEED();
}
TEST_P(DISABLED_TestFixtureWithParams2, Test1_WillPass)
{
SUCCEED();
}
TEST_P(DISABLED_TestFixtureWithParams2, DISABLED_Test2_WillPass)
{
SUCCEED();
}
INSTANTIATE_TEST_CASE_P(
PermutationA,
TestFixtureWithParams1,
::testing::Combine(
::testing::Values(1, 2, 4),
::testing::Values(3, 5, 7),
::testing::Values(-0.0f, 0.0f, 1.0f)
));
INSTANTIATE_TEST_CASE_P(
,
TestFixtureWithParams1,
::testing::Combine(
::testing::Values(8, 16, 32),
::testing::Values(9, 13, 17),
::testing::Values(-10.0f, 0.05f, 10.0f)
));
INSTANTIATE_TEST_CASE_P(
PermutationA,
DISABLED_TestFixtureWithParams2,
::testing::Combine(
::testing::Values(1, 2, 4),
::testing::Values(3, 5, 7),
::testing::Values(-0.0f, 0.0f, 1.0f)
));
INSTANTIATE_TEST_CASE_P(
,
DISABLED_TestFixtureWithParams2,
::testing::Combine(
::testing::Values(8, 16, 32),
::testing::Values(9, 13, 17),
::testing::Values(-10.0f, 0.05f, 10.0f)
));
TYPED_TEST(TestFixtureWithTypes1, Test1_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes1, DISABLED_Test2_WillPass)
{
SUCCEED();
}
TYPED_TEST(TestFixtureWithTypes1, Test3_WillPass)
{
SUCCEED();
}
TYPED_TEST(DISABLED_TestFixtureWithTypes2, Test1_WillPass)
{
SUCCEED();
}
TYPED_TEST(DISABLED_TestFixtureWithTypes2, DISABLED_Test2_WillPass)
{
SUCCEED();
}
TYPED_TEST(DISABLED_TestFixtureWithTypes2, Test3_WillPass)
{
SUCCEED();
}
} // namespace UnitTest
AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);
@@ -1,14 +0,0 @@
#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set(FILES
Tests/TestImpactTestTargetD.cpp
)