PTF Initial commit
This commit is contained in:
Родитель
70aa7828bb
Коммит
813ce7e8a3
|
@ -0,0 +1,31 @@
|
|||
# Contributing to Protocol Test Framework
|
||||
There are many ways to contribute to PTF.
|
||||
|
||||
* Report bugs and help verify fixes when they are checked in.
|
||||
* Submit updates and improvements to the [documentation](https://github.com/Microsoft/ProtocolTestFramework/docs).
|
||||
* Contribute bug fixes.
|
||||
* Add new features. But firstly you should log an issue to notify the team before you spend a lot of time on it.
|
||||
|
||||
## CLA
|
||||
Contributors must sign a [Contribution License Agreement (CLA)](https://cla.microsoft.com/) before any pull requests will be considered.
|
||||
This is a one time job. Once you have signed a CLA for any project sponsored by Microsoft, you are good to go for all the repos sponsored by Microsoft.
|
||||
|
||||
## Coding Style
|
||||
The basic rule is following the coding style of the existing code.
|
||||
|
||||
## Test
|
||||
Every time you make changes to PTF, you should run the [unit test cases](https://github.com/Microsoft/ProtocolTestFramework/src/test) to avoid regression.
|
||||
If you add new features other than minor changes or bug fixing, you should add the relative test cases.
|
||||
|
||||
To build test project:
|
||||
```
|
||||
cd ProtocoTestFramework\src\test
|
||||
buildtest.cmd
|
||||
```
|
||||
|
||||
To run all the test cases:
|
||||
```
|
||||
runtest.cmd
|
||||
```
|
||||
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
Protocol Test Framework
|
||||
Copyright (c) Microsoft Corporation
|
||||
All rights reserved.
|
||||
MIT License
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
49
README.md
49
README.md
|
@ -1,2 +1,47 @@
|
|||
# ProtocolTestFramework
|
||||
The Protocol Test Framework (PTF) is designed to support Microsoft Protocol Test Suites for both Windows and Office Protocol Interoperability testing.
|
||||
# Protocol Test Framework
|
||||
|
||||
The Protocol Test Framework (PTF) is designed to support Microsoft Protocol Test Suites for both Windows and Office Protocol Interoperability testing.
|
||||
It implements the fundamentals to support Protocol Test Suite, including logging, checker, configuration and etc.
|
||||
|
||||
## Prerequisites
|
||||
PTF is based on Windows platform.
|
||||
You should install the following list of software in order to build PTF from source code.
|
||||
|
||||
* .Net framework 4.0 or higher
|
||||
* Wix toolset v3.7 or higher
|
||||
* Visual Studio or Visual Studio test agent, version 2012 or higher
|
||||
|
||||
## Build
|
||||
|
||||
After you clone a copy of this repo, change to the ProtocolTestFramework directory:
|
||||
|
||||
```
|
||||
cd ProtocolTestFramework
|
||||
```
|
||||
|
||||
Change to src directory and run build.cmd
|
||||
|
||||
```
|
||||
cd src
|
||||
build.cmd [formodel]
|
||||
```
|
||||
After the build succeeds, ProtocolTestFrameworkInstaller.msi should be generated in the folder ProtocolTestFramework\src\Bin\deploy\installer\.
|
||||
|
||||
If you need to develop a protocol test suite using Model Based Testing tool [Spec Explorer](https://visualstudiogallery.msdn.microsoft.com/271d0904-f178-4ce9-956b-d9bfa4902745/),
|
||||
you should install **Spec Explorer** first and then build PTF with the option **formodel**.
|
||||
|
||||
|
||||
## Examples
|
||||
You can find samples of how to develop a protocol test suite using PTF [here](https://github.com/Microsoft/ProtocolTestFramework/samples).
|
||||
|
||||
## Documentation
|
||||
|
||||
* [User Guide](https://github.com/Microsoft/ProtocolTestFramework/docs/) describes the features of PTF, and how to use them to develop a new protocol test suite.
|
||||
|
||||
## Contribute
|
||||
|
||||
You can find contributing guide [here](https://github.com/Microsoft/ProtocolTestFramework/CONTRIBUTING.md).
|
||||
|
||||
## License
|
||||
|
||||
PTF is under the [MIT license](https://github.com/Microsoft/ProtocolTestFramework/LICENSE.txt).
|
Двоичный файл не отображается.
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<TestSettings name="Local Test Run" id="736D2D79-53CA-4075-B37C-3E17651A9F7C" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
|
||||
<Description>This is a default test run configuration for a local test run.</Description>
|
||||
<Deployment>
|
||||
<DeploymentItem filename="ServerLocalTestRun.testrunconfig" />
|
||||
<DeploymentItem filename="XXXX_Adapter\XXXX_SUTControlAdapter\" />
|
||||
<DeploymentItem filename="XXXX_TestSuite\XXXX_TestSuite.deployment.ptfconfig" />
|
||||
<DeploymentItem filename="XXXX_TestSuite\XXXX_TestSuite.ptfconfig" />
|
||||
</Deployment>
|
||||
<Execution hostProcessPlatform="MSIL">
|
||||
<TestTypeSpecific>
|
||||
<UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
|
||||
<AssemblyResolution>
|
||||
<TestDirectory useLoadContext="true" />
|
||||
</AssemblyResolution>
|
||||
</UnitTestRunConfig>
|
||||
<WebTestRunConfiguration testTypeId="4e7599fa-5ecb-43e9-a887-cd63cf72d207">
|
||||
<Browser name="Internet Explorer 7.0">
|
||||
<Headers>
|
||||
<Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" />
|
||||
<Header name="Accept" value="*/*" />
|
||||
<Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
|
||||
<Header name="Accept-Encoding" value="GZIP" />
|
||||
</Headers>
|
||||
</Browser>
|
||||
</WebTestRunConfiguration>
|
||||
</TestTypeSpecific>
|
||||
<AgentRule name="LocalMachineDefaultRole">
|
||||
</AgentRule>
|
||||
</Execution>
|
||||
</TestSettings>
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using Microsoft.Protocols.TestTools;
|
||||
|
||||
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines the interface of the XXXX protocol adapter
|
||||
/// </summary>
|
||||
public interface IXXXX_Adapter: IAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Sends a request to SUT
|
||||
/// </summary>
|
||||
/// <param name="SUTIPAddress">Indicats IP address of SUT</param>
|
||||
/// <returns>Indicates if the request is sent succesfully</returns>
|
||||
bool SendRequest(string SUTIPAddress);
|
||||
|
||||
/// <summary>
|
||||
/// Waits for a resonse from SUT
|
||||
/// </summary>
|
||||
/// <param name="status">Indicates the status in the response</param>
|
||||
/// <param name="timeout">Indicates the timeout in seconds when waiting for the response</param>
|
||||
/// <returns>Indicates if the response is received successfully</returns>
|
||||
bool WaitForResponse(out int status, int timeout);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using Microsoft.Protocols.TestTools;
|
||||
|
||||
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines the SUT control adapter
|
||||
/// It's used to control the SUT
|
||||
/// </summary>
|
||||
public interface IXXXX_SUTControlAdapter: IAdapter
|
||||
{
|
||||
[MethodHelp("Reset SUT to initial state. Return true for success, false for failure")]
|
||||
bool ResetSUT();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestTools.ExtendedLogging;
|
||||
|
||||
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the XXXX protocol adapter
|
||||
/// </summary>
|
||||
public class XXXX_Adapter : ManagedAdapterBase, IXXXX_Adapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Resets all the states of the adapter
|
||||
/// </summary>
|
||||
public override void Reset()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a request to SUT
|
||||
/// </summary>
|
||||
/// <param name="SUTIPAddress">Indicats IP address of SUT</param>
|
||||
/// <returns>Indicates if the request is sent succesfully</returns>
|
||||
public bool SendRequest(string SUTIPAddress)
|
||||
{
|
||||
// Add code here to construct a requst message and then send it to SUT
|
||||
|
||||
// Dump request message to ETW provider: Protocol-Test-Suite
|
||||
// Then the message data could be captured using an ETW capture tool.
|
||||
// It's useful when the message is encrypted.
|
||||
ExtendedLogger.DumpMessage("XXXX: Request", System.Text.Encoding.Default.GetBytes("Here is the binary of the request"));
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Waits for a resonse from SUT
|
||||
/// </summary>
|
||||
/// <param name="status">Indicates the status in the response</param>
|
||||
/// <param name="timeout">Indicates the timeout in seconds when waiting for the response</param>
|
||||
/// <returns>Indicates if the response is received successfully</returns>
|
||||
public bool WaitForResponse(out int status, int timeout)
|
||||
{
|
||||
// Add code here to receive data from SUT, and parse the data to a message structure
|
||||
status = 0;
|
||||
|
||||
// Dump response message to ETW provider: Protocol-Test-Suite
|
||||
// Then the message data could be captured using an ETW capture tool.
|
||||
// It's useful when the message is encrypted.
|
||||
ExtendedLogger.DumpMessage("XXXX: Response", System.Text.Encoding.Default.GetBytes("Here is the binary of the response"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{EE588106-E147-45A2-A16F-732547DB0060}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestSuites.XXXX.Adapter</RootNamespace>
|
||||
<AssemblyName>XXXX_Adapter</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Protocols.TestTools" />
|
||||
<Reference Include="Microsoft.Protocols.TestTools.ExtendedLogging" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="IXXXX_Adapter.cs" />
|
||||
<Compile Include="IXXXX_SUTControlAdapter.cs" />
|
||||
<Compile Include="XXXX_Adapter.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="XXXX_SUTControlAdapter\ResetSUT.ps1" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,10 @@
|
|||
#############################################################################
|
||||
# Copyright (c) Microsoft. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#############################################################################
|
||||
|
||||
######################################
|
||||
# Add your own script here to reset SUT to initial state
|
||||
######################################
|
||||
|
||||
return $TRUE
|
|
@ -0,0 +1,31 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XXXX_TestSuite", "XXXX_TestSuite\XXXX_TestSuite.csproj", "{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XXXX_Adapter", "XXXX_Adapter\XXXX_Adapter.csproj", "{EE588106-E147-45A2-A16F-732547DB0060}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9F92954A-E424-4D9C-B1A4-5B4CA736F29A}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
ServerLocalTestRun.testrunconfig = ServerLocalTestRun.testrunconfig
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EE588106-E147-45A2-A16F-732547DB0060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EE588106-E147-45A2-A16F-732547DB0060}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EE588106-E147-45A2-A16F-732547DB0060}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EE588106-E147-45A2-A16F-732547DB0060}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,149 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestSuites.XXXX.Adapter;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Protocols.TestSuites.XXXX.TestSuite.Scenario1
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for the test cases of this scenario
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class XXXX_Scenario1 : TestClassBase
|
||||
{
|
||||
#region Variables
|
||||
// Put here fields representing adapters
|
||||
static IXXXX_SUTControlAdapter SUTAdapter = null;
|
||||
static IXXXX_Adapter protocolAdapter = null;
|
||||
|
||||
// Other static and instance properties
|
||||
// ...
|
||||
|
||||
#endregion
|
||||
|
||||
#region Test Suite Initialization and Cleanup
|
||||
|
||||
/// <summary>
|
||||
/// Use ClassInitialize to run code before running the first test in the class
|
||||
/// </summary>
|
||||
[ClassInitialize()]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext);
|
||||
|
||||
try
|
||||
{
|
||||
SUTAdapter = TestClassBase.BaseTestSite.GetAdapter<IXXXX_SUTControlAdapter>();
|
||||
protocolAdapter = TestClassBase.BaseTestSite.GetAdapter<IXXXX_Adapter>();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TestClassBase.BaseTestSite.Assume.Inconclusive("ClassInitialize: Unexpected Exception - " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Use ClassCleanup to run code after all tests in a class have run
|
||||
/// </summary>
|
||||
[ClassCleanup()]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Test Case Initialization and Cleanup
|
||||
|
||||
/// <summary>
|
||||
/// TestInitialize will be run before every case's execution
|
||||
/// </summary>
|
||||
protected override void TestInitialize()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Do some common initialization for every case.
|
||||
Site.Assume.AreEqual(true, SUTAdapter.ResetSUT(), "Reset SUT to initial states");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Site.Assume.Inconclusive("TestInitialize: Unexpected Exception - " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TestCleanup will be run after every case's execution
|
||||
/// </summary>
|
||||
protected override void TestCleanup()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Do some common cleanup for every case.
|
||||
protocolAdapter.Reset();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Site.Log.Add(LogEntryKind.Warning, "TestCleanup: Unexpected Exception:", ex);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Test cases
|
||||
[TestMethod] // Indicates it's a test case
|
||||
[TestCategory("BVT")] // It's used to categorize the test cases
|
||||
[Description("The case is designed to test if the SUT could be connected")] // Describe what the test case is testing
|
||||
public void BVT_ConnectToSUT()
|
||||
{
|
||||
#region Case specific setup
|
||||
|
||||
try
|
||||
{
|
||||
// Any test case specific setup logics
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Site.Assume.Inconclusive("Unexpected Exception raised in one of custom test case setup steps: {0}", ex);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region STEP1 Send a request to SUT
|
||||
Site.Log.Add(LogEntryKind.TestStep, "Step 1: Send a request to SUT");
|
||||
|
||||
bool ret = protocolAdapter.SendRequest(Site.Properties.Get("SUTIPAddress"));
|
||||
Site.Assert.IsTrue(ret, "Send request should succeed.");
|
||||
#endregion
|
||||
|
||||
#region STEP2 Waiting for a response from SUT
|
||||
int status = 0;
|
||||
Site.Log.Add(LogEntryKind.TestStep, "Step 2: Wait for a response from SUT");
|
||||
|
||||
int timeout = int.Parse(Site.Properties.Get("SUTResponseTimeout"));
|
||||
ret = protocolAdapter.WaitForResponse(out status, timeout);
|
||||
Site.Assert.IsTrue(ret, "SUT response should be received in {0} seconds", timeout);
|
||||
#endregion
|
||||
|
||||
#region Verify the status of the response
|
||||
// Status or other fields in the response can be checked here
|
||||
Site.Assert.AreEqual(0, status, "SUT should return success status in the response");
|
||||
#endregion
|
||||
|
||||
#region Case specific cleanup
|
||||
try
|
||||
{
|
||||
// Any test case specific clean up logics
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Site.Log.Add(LogEntryKind.Warning, "Unexpected Exception raised in one of custom test case cleanup steps: {0}", ex);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestSuites.XXXX.TestSuite</RootNamespace>
|
||||
<AssemblyName>XXXX_TestSuite</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Protocols.TestTools" />
|
||||
<Reference Include="Microsoft.Protocols.TestTools.VSTS" />
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="XXXX_Scenario1.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="XXXX_TestSuite.deployment.ptfconfig" />
|
||||
<Content Include="XXXX_TestSuite.ptfconfig">
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\XXXX_Adapter\XXXX_Adapter.csproj">
|
||||
<Project>{ee588106-e147-45a2-a16f-732547db0060}</Project>
|
||||
<Name>XXXX_Adapter</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
<!--Automatic Network Capturing-->
|
||||
<!--This feature is only available on Windows 8.1 or Windows Server 2012 R2.
|
||||
Protocol Test Framework provides a simple way to capture network traffic case-by-case automatically.
|
||||
Network traffic is captured using netsh.exe and logman.exe. The messages are save as ETL files.
|
||||
-->
|
||||
<Group name="PTF">
|
||||
<Group name="NetworkCapture">
|
||||
<Property name="Enabled" value="false">
|
||||
<Choice>true,false</Choice>
|
||||
<Description>
|
||||
If it is true, enable the auto-capture feature.
|
||||
</Description>
|
||||
</Property>
|
||||
<Property name="CaptureFileFolder" value="C:\XXXX_CaptureFileDirectory">
|
||||
<Description>
|
||||
The path to put the capture files. Old files will be overwritten.
|
||||
</Description>
|
||||
</Property>
|
||||
<Property name="StopRunningOnError" value="false">
|
||||
<Choice>true,false</Choice>
|
||||
<Description>
|
||||
If it is true, fail the test case when error happens in running network capture commands. Otherwise, ignore the error.
|
||||
</Description>
|
||||
</Property>
|
||||
</Group>
|
||||
</Group>
|
||||
|
||||
<!-- Properties related to test environment -->
|
||||
<Property name="SUTResponseTimeout" value="10">
|
||||
<Description>
|
||||
Timeout when waiting for the responses from SUT, in seconds
|
||||
</Description>
|
||||
</Property>
|
||||
|
||||
<Property name="SUTIPAddress" value="10.10.10.10">
|
||||
<Description>
|
||||
The IP address of SUT
|
||||
</Description>
|
||||
</Property>
|
||||
|
||||
</Properties>
|
||||
</TestSite>
|
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
<Properties>
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="TD-VERSION" value="#.#.#"/>
|
||||
</Properties>
|
||||
<Adapters>
|
||||
<!-- Type of IXXXX_Adapter is managed, it allows users to use managed code to implement the interface methods. -->
|
||||
<Adapter xsi:type="managed" name="IXXXX_Adapter" adaptertype="Microsoft.Protocols.TestSuites.XXXX.Adapter.XXXX_Adapter"/>
|
||||
|
||||
<!-- The type of IXXXX_SUTControlAdapter could be either powershell or interactive. -->
|
||||
<!-- If its type is powershell, the scripts will be called automatically when executing test cases. -->
|
||||
<Adapter xsi:type="powershell" name="IXXXX_SUTControlAdapter" scriptdir=".\" />
|
||||
<!-- If its type is interactive, then the user should do it manually following the help text. -->
|
||||
<!--<Adapter xsi:type="interactive" name="IXXXX_SUTControlAdapter"/>-->
|
||||
|
||||
</Adapters>
|
||||
|
||||
<TestLog defaultprofile="Verbose">
|
||||
<Sinks>
|
||||
<!-- File location should be relative path -->
|
||||
<Console id="Console" />
|
||||
</Sinks>
|
||||
<Profiles>
|
||||
<Profile name="Verbose" extends="Error">
|
||||
|
||||
<!-- Show on Console -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
|
||||
<!-- Show for ETW -->
|
||||
<!--The Event Tracing for Window (ETW) logging sink can log test suite logs to an ETW provider.
|
||||
A user can capture these ETW logs using captures tools, such as the Microsoft Message Analyzer.
|
||||
Details see PTFUserGuide.-->
|
||||
<Rule kind="TestStep" sink="Etw" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Etw" delete="false"/>
|
||||
<Rule kind="Comment" sink="Etw" delete="false"/>
|
||||
<Rule kind="Warning" sink="Etw" delete="false"/>
|
||||
<Rule kind="Debug" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Etw" delete="false"/>
|
||||
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,8 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyCompany("Microsoft")]
|
||||
[assembly: AssemblyProduct("Protocol Test Framework")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
Двоичный файл не отображается.
|
@ -0,0 +1,43 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
@echo off
|
||||
if not defined buildtool (
|
||||
for /f %%i in ('dir /b /ad /on "%windir%\Microsoft.NET\Framework\v4*"') do (@if exist "%windir%\Microsoft.NET\Framework\%%i\msbuild".exe set buildtool=%windir%\Microsoft.NET\Framework\%%i\msbuild.exe)
|
||||
)
|
||||
|
||||
if not defined buildtool (
|
||||
echo No msbuild.exe was found, install .Net Framework version 4.0 or higher
|
||||
goto :eof
|
||||
)
|
||||
|
||||
if not defined WIX (
|
||||
echo WiX Toolset version 3.7 or higher should be installed
|
||||
goto :eof
|
||||
)
|
||||
|
||||
:: Check if visual studio or test agent is installed, since HtmlTestLogger depends on that.
|
||||
if not defined vspath (
|
||||
if defined VS110COMNTOOLS (
|
||||
set vspath="%VS110COMNTOOLS%"
|
||||
) else if defined VS120COMNTOOLS (
|
||||
set vspath="%VS120COMNTOOLS%"
|
||||
) else if defined VS140COMNTOOLS (
|
||||
set vspath="%VS140COMNTOOLS%"
|
||||
) else (
|
||||
echo Visual Studio or Visual Studio test agent should be installed, version 2012 or higher
|
||||
goto :eof
|
||||
)
|
||||
)
|
||||
|
||||
if not defined ptfsnk (
|
||||
set ptfsnk=..\TestKey.snk
|
||||
)
|
||||
|
||||
%buildtool% ptf.sln /t:clean
|
||||
|
||||
if /i "%~1"=="formodel" (
|
||||
%buildtool% deploy\Installer\ProtocolTestFrameworkInstaller.wixproj /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=%ptfsnk% /p:FORMODEL="1" /t:Clean;Rebuild
|
||||
) else (
|
||||
%buildtool% deploy\Installer\ProtocolTestFrameworkInstaller.wixproj /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=%ptfsnk% /t:Clean;Rebuild
|
||||
)
|
|
@ -0,0 +1,521 @@
|
|||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff40\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
|
||||
{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
|
||||
{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}
|
||||
{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};}{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}
|
||||
{\f44\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}{\f45\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Trebuchet MS{\*\falt Univers};}
|
||||
{\f46\fbidi \fmodern\fcharset128\fprq1{\*\panose 00000000000000000000}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
|
||||
{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
|
||||
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
|
||||
{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
|
||||
{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f49\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\f50\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}
|
||||
{\f52\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\f53\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}
|
||||
{\f54\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\f55\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}
|
||||
{\f56\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\f57\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\f69\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}
|
||||
{\f70\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}{\f72\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f73\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}
|
||||
{\f74\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}{\f75\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f76\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}
|
||||
{\f77\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}{\f161\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f159\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}
|
||||
{\f160\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f162\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f163\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}
|
||||
{\f166\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f181\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\f389\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}
|
||||
{\f390\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f392\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f393\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}
|
||||
{\f396\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f397\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f449\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}
|
||||
{\f450\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f452\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f453\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}
|
||||
{\f454\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f455\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f456\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}
|
||||
{\f457\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f458\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f491\fbidi \fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}
|
||||
{\f499\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f500\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f502\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}
|
||||
{\f503\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f506\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\f511\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}
|
||||
{\f509\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f510\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f512\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f513\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}
|
||||
{\f516\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}
|
||||
{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}
|
||||
{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}
|
||||
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}
|
||||
{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
|
||||
{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
|
||||
{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}
|
||||
{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}
|
||||
{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}
|
||||
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}
|
||||
{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}
|
||||
{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}
|
||||
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}
|
||||
{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}
|
||||
{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}
|
||||
{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
|
||||
{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}
|
||||
{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
|
||||
{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
|
||||
\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
|
||||
\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0
|
||||
\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
|
||||
\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
|
||||
\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\*
|
||||
\cs15 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive
|
||||
\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af40\afs19
|
||||
\ltrch\fcs0 \f40\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19
|
||||
\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink9 \slocked
|
||||
Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1
|
||||
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{
|
||||
\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1
|
||||
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{
|
||||
\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1
|
||||
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{
|
||||
\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li714\ri0\sb120\sa120\widctlpar\jclisttab\tx717\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin714\itap0
|
||||
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{
|
||||
\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0
|
||||
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{
|
||||
\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0
|
||||
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{
|
||||
\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0
|
||||
\b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
|
||||
\ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20
|
||||
\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{
|
||||
\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0
|
||||
\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50
|
||||
Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1
|
||||
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{
|
||||
\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink54 \slocked \ssemihidden
|
||||
Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af40\afs19\alang1025 \ltrch\fcs0
|
||||
\i\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\*
|
||||
\cs58 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60
|
||||
\additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
|
||||
\rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{
|
||||
\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super
|
||||
\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink65 \slocked \ssemihidden
|
||||
Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
|
||||
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20
|
||||
\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{
|
||||
\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
|
||||
\af40\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16
|
||||
\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af45 \ltrch\fcs0 \b\f45\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10
|
||||
page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025
|
||||
\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
|
||||
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
|
||||
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink81 \slocked
|
||||
Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{
|
||||
\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
|
||||
\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af40\afs19
|
||||
\ltrch\fcs0 \f40\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li714\ri0\sb120\sa120\widctlpar\jclisttab\tx717\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin714\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0
|
||||
\fs18\lang1033\langfe1033\loch\f45\hich\af45\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af40\afs24\alang1025 \ltrch\fcs0 \b\f45\fs24\lang1033\langfe1033\langnp1033\langfenp1033
|
||||
\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar
|
||||
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0
|
||||
Heading French Warranty;}{\*\cs94 \additive \f40\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive
|
||||
\f2\cf15\lang1024\langfe1024\noproof tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f40 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive
|
||||
\f2\cf11\lang1024\langfe1024\noproof tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof
|
||||
DO_NOT_TRANSLATE;}{\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{
|
||||
\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19
|
||||
\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af40\afs19 \ltrch\fcs0 \b0\f40\fs19 \sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1
|
||||
\ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0
|
||||
\b\fs20\lang1026\langfe2052\super\loch\f40\hich\af40\dbch\af11\cgrid\langnp1026\langfenp2052 \sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0
|
||||
\b\f40\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}{\s112\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
|
||||
\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext112 \sunhideused \styrsid9850802 Normal (Web);}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
|
||||
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
|
||||
{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
|
||||
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\leveltemplateid692200086\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
|
||||
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
|
||||
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
|
||||
\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320
|
||||
\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040
|
||||
}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}
|
||||
{\list\listtemplateid-1793664660{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360
|
||||
\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720
|
||||
\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }
|
||||
{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4
|
||||
\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}
|
||||
{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720
|
||||
\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
|
||||
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
|
||||
\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers
|
||||
\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}
|
||||
\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
|
||||
\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}
|
||||
\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0
|
||||
\fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160
|
||||
\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel
|
||||
\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0
|
||||
\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4
|
||||
\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2
|
||||
\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3
|
||||
\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }
|
||||
{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \s5\fi-357\li1792
|
||||
\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \s6
|
||||
\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
|
||||
\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
|
||||
\s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
|
||||
\s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}
|
||||
\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}
|
||||
\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}
|
||||
\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}
|
||||
\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1
|
||||
\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0
|
||||
\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23
|
||||
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
|
||||
\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1
|
||||
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
|
||||
\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel
|
||||
\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel
|
||||
\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel
|
||||
\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel
|
||||
\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname
|
||||
;}\listid974869818}{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0
|
||||
\fi-360\li1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
|
||||
\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
|
||||
{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
|
||||
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname ;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
|
||||
\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }
|
||||
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}
|
||||
\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}
|
||||
{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }
|
||||
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
|
||||
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
|
||||
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
|
||||
\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0
|
||||
\fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812
|
||||
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
|
||||
\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }
|
||||
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}
|
||||
\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}
|
||||
{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li714
|
||||
\jclisttab\tx717\lin714 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1077\jclisttab\tx1077\lin1077 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li1797\jclisttab\tx1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2517\jclisttab\tx2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3237\jclisttab\tx3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3957\jclisttab\tx3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4677\jclisttab\tx4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
|
||||
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5397\jclisttab\tx5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
|
||||
\f10\fbias0 \fi-360\li6117\jclisttab\tx6117\lin6117 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
|
||||
{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
|
||||
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
|
||||
\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
|
||||
\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271}
|
||||
{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149
|
||||
\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
|
||||
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
|
||||
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
|
||||
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
|
||||
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
|
||||
\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid1637229796\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
|
||||
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
|
||||
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
|
||||
\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320
|
||||
\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040
|
||||
}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23
|
||||
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}
|
||||
{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }
|
||||
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
|
||||
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
|
||||
\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
|
||||
\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
|
||||
\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703
|
||||
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}
|
||||
\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0
|
||||
\fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1}{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}
|
||||
{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713
|
||||
\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10}{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}
|
||||
{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271
|
||||
\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19}{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}
|
||||
{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271
|
||||
\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28}{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}
|
||||
{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929
|
||||
\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37}{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
|
||||
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat
|
||||
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat
|
||||
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
|
||||
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40}{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat
|
||||
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
|
||||
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}
|
||||
{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46}{\listoverride\listid1567649130\listoverridecount0\ls47}{\listoverride\listid477573462\listoverridecount9{\lfolevel}{\lfolevel}{\lfolevel}
|
||||
{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}\ls48}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}
|
||||
{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid618632\rsid2562953\rsid3022381\rsid4159317\rsid4729382\rsid5208738\rsid5526630\rsid6780114\rsid7681067\rsid7740058\rsid8593201\rsid9850802\rsid10094665\rsid11228413
|
||||
\rsid11864370\rsid12452641\rsid13267563\rsid13391369\rsid13633672\rsid13637886\rsid13716023\rsid13983006\rsid14164635\rsid14951131\rsid16397495}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440
|
||||
\mintLim0\mnaryLim1}{\info{\creatim\yr2014\mo2\dy25\hr13\min40}{\revtim\yr2015\mo7\dy16\hr16\min4}{\version1}{\edmins0}{\nofpages1}{\nofwords166}{\nofchars952}{\nofcharsws1116}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/200
|
||||
3/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect
|
||||
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
|
||||
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1
|
||||
\jexpand\viewkind1\viewscale150\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel
|
||||
\wrppunct\asianbrkrule\rsidroot14164635\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal
|
||||
\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
|
||||
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsep
|
||||
\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsepc
|
||||
\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsep
|
||||
\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsepc
|
||||
\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl3
|
||||
\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \hich )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar\s112\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9850802 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0
|
||||
\fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802\charrsid13391369 \hich\af40\dbch\af31505\loch\f40 Protocol Test Framework}{\rtlch\fcs1 \af0 \ltrch\fcs0
|
||||
\insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 Copyright (c) Microsoft Corporation}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 All rights reserved.\~}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 MIT License}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
|
||||
\hich\af40\dbch\af31505\loch\f40 \hich\af40\dbch\af31505\loch\f40 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:}{
|
||||
\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 The above copyright notice and this permission notice shall be included in al\hich\af40\dbch\af31505\loch\f40 l copies or substantial portions of the Software.
|
||||
}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40
|
||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN N\hich\af40\dbch\af31505\loch\f40
|
||||
O EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}
|
||||
{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
|
||||
\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9850802 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
|
||||
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid10094665\charrsid9850802
|
||||
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
|
||||
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
|
||||
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
|
||||
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
|
||||
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
|
||||
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
|
||||
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
|
||||
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
|
||||
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
|
||||
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
|
||||
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
|
||||
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f
|
||||
7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
|
||||
615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
|
||||
79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
|
||||
5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
|
||||
999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
|
||||
699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
|
||||
8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
|
||||
0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
|
||||
9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
|
||||
15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
|
||||
3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
|
||||
32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
|
||||
f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
|
||||
e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb
|
||||
44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a
|
||||
6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c
|
||||
3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256
|
||||
5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276
|
||||
b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8
|
||||
c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e
|
||||
51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95
|
||||
b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff
|
||||
6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6
|
||||
9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239
|
||||
b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449
|
||||
59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8
|
||||
2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468
|
||||
656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4
|
||||
350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624
|
||||
52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141
|
||||
73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000
|
||||
0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000
|
||||
000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019
|
||||
0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000
|
||||
000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027
|
||||
00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}
|
||||
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
|
||||
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
|
||||
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
|
||||
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
|
||||
{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;
|
||||
\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;
|
||||
\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;
|
||||
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
|
||||
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
|
||||
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
|
||||
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
|
||||
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
|
||||
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
|
||||
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
|
||||
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
|
||||
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
|
||||
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
|
||||
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
|
||||
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
|
||||
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
|
||||
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
|
||||
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
|
||||
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
|
||||
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
|
||||
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
|
||||
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
|
||||
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
|
||||
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
|
||||
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
|
||||
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
|
||||
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
|
||||
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
|
||||
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
|
||||
4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
|
||||
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000f07f
|
||||
ebfb9dbfd001feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000105000000000000}}
|
|
@ -0,0 +1,216 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?define BLDVER=1.0.0.0?>
|
||||
<?define EXTERNAL_DIR=..\..\external\?>
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
|
||||
|
||||
<Product Id="*"
|
||||
Name="Microsoft Protocol Test Framework"
|
||||
Language="1033"
|
||||
Version="$(var.BLDVER)"
|
||||
Manufacturer="Microsoft Corporation"
|
||||
UpgradeCode="3ED15020-EFB8-40D8-BCC0-818A0628D54D">
|
||||
|
||||
|
||||
<!-- Set InstallerVersion to 300 or greater to merge VC90Redist -->
|
||||
<Package Id="*"
|
||||
InstallScope="perMachine"
|
||||
InstallPrivileges="elevated"
|
||||
Description="Microsoft Protocol Test Framework"
|
||||
Comments="Microsoft Protocol Test Framework v$(var.BLDVER)"
|
||||
Manufacturer="Microsoft Corporation"
|
||||
InstallerVersion="300"
|
||||
Compressed="yes" />
|
||||
|
||||
<Media Id="1" Cabinet="ProtocolTestFramework.cab" EmbedCab="yes" />
|
||||
|
||||
<!-- Upgrade info -->
|
||||
<Upgrade Id="3ED15020-EFB8-40D8-BCC0-818A0628D54D">
|
||||
<UpgradeVersion Property="OLDER_VERSION_BEING_UPGRADED"
|
||||
IncludeMaximum="no"
|
||||
Maximum="$(var.BLDVER)"
|
||||
OnlyDetect="no"
|
||||
RemoveFeatures="ALL" />
|
||||
<UpgradeVersion Property="NEWER_VERSION_DETECTED"
|
||||
IncludeMinimum="no"
|
||||
Minimum="$(var.BLDVER)"
|
||||
OnlyDetect="yes" />
|
||||
</Upgrade>
|
||||
|
||||
<!-- Conditions for product installation -->
|
||||
<PropertyRef Id="NETFRAMEWORK40FULL"/>
|
||||
<Condition Message="This application requires .NET Framework 4.0. Please install the .NET Framework then run this installer again.">
|
||||
Installed OR NETFRAMEWORK40FULL
|
||||
</Condition>
|
||||
<Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
|
||||
NOT NEWER_VERSION_DETECTED OR Installed
|
||||
</Condition>
|
||||
|
||||
<Property Id="VS2012_ROOTPATH">
|
||||
<RegistrySearch Id='VS2012_ROOTPATH' Type='raw'
|
||||
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='11.0' />
|
||||
</Property>
|
||||
|
||||
<Property Id="VS2013_ROOTPATH">
|
||||
<RegistrySearch Id='VS2013_ROOTPATH' Type='raw'
|
||||
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='12.0' />
|
||||
</Property>
|
||||
|
||||
<!-- Directory Structure -->
|
||||
<Directory Id="TARGETDIR" Name="SourceDir">
|
||||
<Directory Id="VS2012_ROOTPATH">
|
||||
<Directory Id="VS2012_Common7" Name="Common7">
|
||||
<Directory Id="VS2012_IDE" Name="IDE">
|
||||
<Directory Id="VS2012_CommonExtensions" Name="CommonExtensions">
|
||||
<Directory Id="VS2012_Microsoft" Name="Microsoft">
|
||||
<Directory Id="VS2012_TestWindow" Name="TestWindow">
|
||||
<Directory Id="VS2012_HtmlTestLogger_InstallLocation" Name="Extensions"/>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Directory Id="VS2013_ROOTPATH">
|
||||
<Directory Id="VS2013_Common7" Name="Common7">
|
||||
<Directory Id="VS2013_IDE" Name="IDE">
|
||||
<Directory Id="VS2013_CommonExtensions" Name="CommonExtensions">
|
||||
<Directory Id="VS2013_Microsoft" Name="Microsoft">
|
||||
<Directory Id="VS2013_TestWindow" Name="TestWindow">
|
||||
<Directory Id="VS2013_HtmlTestLogger_InstallLocation" Name="Extensions"/>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Directory Id="ProgramMenuFolder" >
|
||||
<Directory Id="ApplicationProgramsMenuFolder" Name="Protocol Test Framework" />
|
||||
</Directory>
|
||||
<Directory Id="ProgramFilesFolder">
|
||||
<Directory Id="ROOT_DIR" Name="Protocol Test Framework">
|
||||
<Directory Id="DOCS_DIR" Name="docs" />
|
||||
<Directory Id="Bin_DIR" Name="bin">
|
||||
</Directory>
|
||||
<Directory Id="PTF_GAC_VS10" Name="GAC_VS10" />
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
|
||||
<!-- Application Shortcut -->
|
||||
<DirectoryRef Id="ApplicationProgramsMenuFolder">
|
||||
<Component Id="ApplicationShortcut" Guid="{FCDDAE66-9D7A-47F2-8D97-427A3C90A18F}">
|
||||
|
||||
<!-- Step installer Uninstall Microsoft Protocol Test Framework -->
|
||||
<Shortcut Id="UninstallProduct"
|
||||
Name="Uninstall Microsoft Protocol Test Framework"
|
||||
Description="Uninstall Microsoft Protocol Test Framework"
|
||||
Target="[System64Folder]msiexec.exe"
|
||||
Arguments="/x [ProductCode]"/>
|
||||
|
||||
<RemoveFolder Id="ROOT_DIR" On="uninstall"/>
|
||||
|
||||
<RegistryValue Root="HKCU"
|
||||
Key="Software\Microsoft\ProtocolTestFramework"
|
||||
Name="installed"
|
||||
Type="integer"
|
||||
Value="1"
|
||||
KeyPath="yes"/>
|
||||
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- Microsoft Protocol Test Framework End User License Agreement -->
|
||||
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
|
||||
|
||||
<!-- Candidate Features -->
|
||||
<Feature Id="Feature_All"
|
||||
Title="Microsoft Protocol Test Framework"
|
||||
Description="Microsoft Protocol Test Framework"
|
||||
Level="1"
|
||||
Display="expand"
|
||||
ConfigurableDirectory="ROOT_DIR">
|
||||
|
||||
<ComponentRef Id="ApplicationShortcut"/>
|
||||
<!-- Protocol Test Framework -->
|
||||
<Feature Id="Feature_ProtocolTestFramework"
|
||||
Title="Protocol Test Framework"
|
||||
Description="Protocol Test Framework"
|
||||
Level="1" >
|
||||
<FeatureRef Id="PTF_All" />
|
||||
</Feature>
|
||||
</Feature>
|
||||
|
||||
<!-- Default sequence -->
|
||||
<InstallExecuteSequence>
|
||||
<RemoveExistingProducts After="InstallInitialize"/>
|
||||
</InstallExecuteSequence>
|
||||
|
||||
<!-- Custom sequence -->
|
||||
<InstallExecuteSequence>
|
||||
<!--
|
||||
Wix grammar reference:
|
||||
"!" means "Installed state of the feature".
|
||||
"&" means "Action state of the feature".
|
||||
INSTALLSTATE_UNKNOWN(-1) - No action to be taken on the feature or component.
|
||||
INSTALLSTATE_ABSENT(2) - Feature or component is not present.
|
||||
INSTALLSTATE_LOCAL(3) - Feature or component on the local computer.
|
||||
MSDN: http://msdn.microsoft.com/en-us/library/aa368012(VS.85).aspx
|
||||
-->
|
||||
</InstallExecuteSequence>
|
||||
|
||||
<!-- Progress Texts for UI -->
|
||||
<UIRef Id="WixUI_ErrorProgressText" />
|
||||
|
||||
<UI Id="WixUI_FeatureTree">
|
||||
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
|
||||
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
|
||||
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
|
||||
|
||||
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
|
||||
<Property Id="WixUI_Mode" Value="FeatureTree" />
|
||||
|
||||
<DialogRef Id="ErrorDlg" />
|
||||
<DialogRef Id="FatalError" />
|
||||
<DialogRef Id="FilesInUse" />
|
||||
<DialogRef Id="MsiRMFilesInUse" />
|
||||
<DialogRef Id="PrepareDlg" />
|
||||
<DialogRef Id="ProgressDlg" />
|
||||
<DialogRef Id="ResumeDlg" />
|
||||
<DialogRef Id="UserExit" />
|
||||
|
||||
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
|
||||
|
||||
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
|
||||
|
||||
<Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
|
||||
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="PrivacyDlg">LicenseAccepted = "1"</Publish>
|
||||
|
||||
<Publish Dialog="PrivacyDlg" Control="Cancel" Event="EndDialog" Value="Return">1</Publish>
|
||||
<Publish Dialog="PrivacyDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">1</Publish>
|
||||
<Publish Dialog="PrivacyDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
|
||||
|
||||
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
|
||||
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="PrivacyDlg" Order="2">NOT Installed</Publish>
|
||||
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
||||
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed </Publish>
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="2">WixUI_InstallMode = "Change"</Publish>
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="3"><![CDATA[Installed AND (WixUI_InstallMode <> "Change")]]></Publish>
|
||||
|
||||
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
|
||||
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
|
||||
|
||||
</UI>
|
||||
|
||||
<!-- Properties for "Add or Reomve Program Entries" -->
|
||||
<Property Id="ARPCOMMENTS">Microsoft Protocol Test Framework</Property>
|
||||
<Property Id="ARPCONTACT">Microsoft Winterop Engineering Team</Property>
|
||||
</Product>
|
||||
</Wix>
|
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Fragment>
|
||||
<UI>
|
||||
<Dialog Id="PrivacyDlg" Width="370" Height="270" Title="Install the [ProductName]" TrackDiskSpace="yes">
|
||||
<Control Id="Back" Type="PushButton" X="128" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)"/>
|
||||
<Control Id="Next" Type="PushButton" X="194" Y="243" Width="100" Height="17" Default="yes" Text="Install the Software" />
|
||||
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
|
||||
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
|
||||
</Control>
|
||||
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
|
||||
<Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
|
||||
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
|
||||
<Control Id="Title" Type="Text" X="15" Y="6" Width="210" Height="15" Transparent="yes" NoPrefix="yes" Text="Install the [ProductName]" />
|
||||
<Control Id="PrivacyStatement" Type="Hyperlink" X="15" Y="50" Width="305" Height="150">
|
||||
<Text><![CDATA[This software will collect and store personal information from users computers, including user names and passwords. For more information, see the <a href="http://www.microsoft.com/privacystatement/en-us/core/default.aspx">Privacy Statement</a>.]]>
|
||||
</Text>
|
||||
</Control>
|
||||
</Dialog>
|
||||
|
||||
</UI>
|
||||
</Fragment>
|
||||
</Wix>
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
|
||||
<String Id="WelcomeDlgDescription">The Setup Wizard will install [ProductName] (version [ProductVersion]) on your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
|
||||
<String Id="MaintenanceWelcomeDlgDescription">The Setup Wizard allows you to change the way [ProductName] (version [ProductVersion]) features are installed on your computer or to remove it from your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
|
||||
</WixLocalization>
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
|
||||
<!-- A stub to make build happy -->
|
||||
</Wix>
|
|
@ -0,0 +1,125 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>3.0</ProductVersion>
|
||||
<ProjectGuid>{79e77309-615d-4e6e-b0aa-5e9656c5a25d}</ProjectGuid>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<OutputName>ProtocolTestFramework</OutputName>
|
||||
<OutputType>Package</OutputType>
|
||||
<DefineSolutionProperties>False</DefineSolutionProperties>
|
||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>Debug</DefineConstants>
|
||||
<SuppressSpecificWarnings>1055</SuppressSpecificWarnings>
|
||||
<SuppressIces>ICE03;ICE80;ICE82;ICE83;ICE30</SuppressIces>
|
||||
<!--Ignore error LGHT0204: ICE30: The same target file by two different components on an LFN system which breaks component reference counting-->
|
||||
<WixVariables>
|
||||
</WixVariables>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
|
||||
<SuppressSpecificWarnings>1055</SuppressSpecificWarnings>
|
||||
<SuppressIces>ICE03;ICE80;ICE82;ICE83;ICE30</SuppressIces>
|
||||
<!--Ignore error LGHT0204: ICE30: The same target file by two different components on an LFN system which breaks component reference counting-->
|
||||
</PropertyGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
|
||||
<Import Project="$(WixTargetsPath)" />
|
||||
<ItemGroup>
|
||||
<Compile Include="ProtocolTestFrameworkSDK.wxs" />
|
||||
<Compile Include="PTFProduct.wxs" />
|
||||
<Compile Include="PrivacyDlg.wxs" />
|
||||
<Compile Include="ProtocolTestFramework.wxs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<WixExtension Include="WixVSExtension">
|
||||
<HintPath>$(WIX)\bin\WixVSExtension.dll</HintPath>
|
||||
<Name>WixVSExtension</Name>
|
||||
</WixExtension>
|
||||
<WixExtension Include="WixUtilExtension">
|
||||
<HintPath>$(WIX)\bin\WixUtilExtension.dll</HintPath>
|
||||
<Name>WixUtilExtension</Name>
|
||||
</WixExtension>
|
||||
<WixExtension Include="WixNetFxExtension">
|
||||
<HintPath>$(WIX)\bin\WixNetFxExtension.dll</HintPath>
|
||||
<Name>WixNetFxExtension</Name>
|
||||
</WixExtension>
|
||||
<WixExtension Include="WixUIExtension">
|
||||
<HintPath>$(WIX)\bin\WixUIExtension.dll</HintPath>
|
||||
<Name>WixUIExtension</Name>
|
||||
</WixExtension>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="License.rtf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="ProtocolTestFramework.wxl" />
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Name>testtools</Name>
|
||||
<Project>{1CA2B935-3224-40F1-84BC-47FA1A9B242E}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools.extension\TestTools.Extension.csproj">
|
||||
<Name>TestTools.Extension</Name>
|
||||
<Project>{E41414B3-95F3-430F-823B-55B82F0BA198}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools.messages.runtime\TestTools.Messages.Runtime.csproj">
|
||||
<Name>TestTools.Messages.Runtime</Name>
|
||||
<Project>{5D50C8BD-F26A-4A45-9D4A-025163B894BD}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Name>TestTools.VSTS</Name>
|
||||
<Project>{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\TestTools.ExtendedLogging\TestTools.ExtendedLogging.csproj">
|
||||
<Name>TestTools.ExtendedLogging</Name>
|
||||
<Project>{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\reportingtool\ReportingTool.csproj">
|
||||
<Name>ReportingTool</Name>
|
||||
<Project>{FABD7966-6611-4556-92CB-B13D7425AE82}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\HtmlTestLogger\HtmlTestLogger.csproj">
|
||||
<Name>HtmlTestLogger</Name>
|
||||
<Project>{8A100541-699B-4011-B184-01B70D534B5E}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>True</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Target Name="AfterBuild">
|
||||
<Copy SourceFiles="$(TargetDir)en-us\$(TargetFileName).msi" DestinationFolder="..\..\Bin\deploy\Installer\" />
|
||||
</Target>
|
||||
</Project>
|
|
@ -0,0 +1,312 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?define SRCDIR=..\..\Bin\ptf?>
|
||||
<?define PTF_SRC_ROOT=..\..\?>
|
||||
<?define BLDVER=1.0.0.0?>
|
||||
<?define SRCDIR_VS10=$(var.SRCDIR)\vs10?>
|
||||
|
||||
<?if $(var.Platform) = "x86"?>
|
||||
<?define BUILDTARGET=i386?>
|
||||
<?else?>
|
||||
<?define BUILDTARGET=amd64?>
|
||||
<?endif?>
|
||||
|
||||
<?ifdef Debug?>
|
||||
<?define BUILDTYPE=debug?>
|
||||
<?else?>
|
||||
<?define BUILDTYPE=release?>
|
||||
<?endif?>
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
|
||||
<Fragment Id="PTF">
|
||||
|
||||
<!-- WixVSExtension properties for visual studio directories -->
|
||||
<PropertyRef Id="VS2010_ROOT_FOLDER" />
|
||||
<PropertyRef Id="VS2010_SCHEMAS_DIR" />
|
||||
<PropertyRef Id="VS2012_ROOT_FOLDER" />
|
||||
<PropertyRef Id="VS2012_SCHEMAS_DIR" />
|
||||
|
||||
<!-- Program Menu -->
|
||||
<DirectoryRef Id="ProgramMenuFolder">
|
||||
<Directory Id="PTF_ProgramsMenuFolder" Name="Protocol Test Framework" />
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id="TARGETDIR">
|
||||
<!-- visual studio schemas -->
|
||||
<Directory Id="VS2010_SCHEMAS_DIR" />
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id="TARGETDIR">
|
||||
<!-- visual studio schemas -->
|
||||
<Directory Id="VS2012_SCHEMAS_DIR" />
|
||||
</DirectoryRef>
|
||||
|
||||
<Property Id="VS2012">
|
||||
<RegistrySearch Id='VS2012' Type='raw'
|
||||
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='11.0' />
|
||||
</Property>
|
||||
|
||||
<Property Id="VS2013">
|
||||
<RegistrySearch Id='VS2013' Type='raw'
|
||||
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='12.0' />
|
||||
</Property>
|
||||
|
||||
<!-- If Visual Studio is not installed, then do not install HtmlLogger. -->
|
||||
<DirectoryRef Id ="VS2012_HtmlTestLogger_InstallLocation">
|
||||
<Component Id="VS2012_HtmlTestLogger.dll" Guid="817DF6E7-6169-4A10-AF67-A064CDBB38E5" Feature="PTF_All">
|
||||
<Condition>VS2012</Condition>
|
||||
<File Id="VS2012_HtmlTestLogger.dll"
|
||||
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.dll" />
|
||||
</Component>
|
||||
<Component Id="VS2012_HtmlTestLogger.pdb" Guid="D2869602-1C51-48D5-A81C-91B0332F00C7" Feature="PTF_All">
|
||||
<Condition>VS2012</Condition>
|
||||
<File Id="VS2012_HtmlTestLogger.pdb"
|
||||
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.pdb" />
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id ="VS2013_HtmlTestLogger_InstallLocation">
|
||||
<Component Id="VS2013_HtmlTestLogger.dll" Guid="710273DA-D320-4D95-A7E2-849EDD9A9C4C" Feature="PTF_All">
|
||||
<Condition>VS2013</Condition>
|
||||
<File Id="VS2013_HtmlTestLogger.dll"
|
||||
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.dll" />
|
||||
</Component>
|
||||
<Component Id="VS2013_HtmlTestLogger.pdb" Guid="A2A350D9-F1CA-4033-9801-31E2A0120364" Feature="PTF_All">
|
||||
<Condition>VS2013</Condition>
|
||||
<File Id="VS2013_HtmlTestLogger.pdb"
|
||||
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.pdb" />
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- PTF Bin -->
|
||||
<DirectoryRef Id="Bin_DIR">
|
||||
|
||||
<!-- Registry infromation -->
|
||||
<Component Id="PTF_REG" Guid="1775CE86-4A52-42FC-AEC6-EEE8D38E6EC5" Feature="PTF_All">
|
||||
<RegistryKey Id="PTF_REG_INSTALLDIR"
|
||||
ForceCreateOnInstall="yes"
|
||||
Root="HKLM"
|
||||
Key="SOFTWARE\Microsoft\ProtocolTestFramework">
|
||||
<RegistryValue Value="[Bin_DIR]" Type="string" Name="InstallDir"/>
|
||||
<RegistryValue Value="$(var.BLDVER)" Type="string" Name="PTFVersion"/>
|
||||
</RegistryKey>
|
||||
|
||||
|
||||
<Environment Id="PTF_ENV_PATH"
|
||||
Name="PATH"
|
||||
Action="set"
|
||||
System="yes"
|
||||
Part="last"
|
||||
Value="[Bin_DIR]" />
|
||||
</Component>
|
||||
|
||||
<!-- Registry information for VS2010 reference (.Net 4.0) -->
|
||||
<Component Id="PTF_REG_DOTNET_FX4" Guid="314F4564-5F1D-4298-80C5-D936D6FA4A61" Feature="PTF_All">
|
||||
<RegistryKey Id="PTF_REG_FOR_VS_REFERENCE_NET_40"
|
||||
ForceCreateOnInstall="yes"
|
||||
Root="HKLM"
|
||||
Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\ProtocolTestFramework">
|
||||
<RegistryValue Value="[Bin_DIR]" Type="string"/>
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
|
||||
<!-- ReportingTool -->
|
||||
<Component Id="ReportingTool.exe" Guid="746DF2EC-8430-4D31-95A3-DAF1FA9C993D" Feature="PTF_All">
|
||||
<File Id="ReportingTool.exe"
|
||||
Source="$(var.SRCDIR)\reportingtool\ReportingTool.exe" />
|
||||
</Component>
|
||||
<Component Id="ReportingTool.pdb" Guid="89F72D63-E3D8-4980-86D1-CC35E499E7B3" Feature="PTF_All">
|
||||
<File Id="ReportingTool.pdb"
|
||||
Source="$(var.SRCDIR)\reportingtool\ReportingTool.pdb" />
|
||||
</Component>
|
||||
|
||||
<!-- Config -->
|
||||
<Component Id="site.ptfconfig" Guid="B4416400-8541-4E96-A62C-5AECBDF14045" Feature="PTF_All">
|
||||
<File Id="site.ptfconfig"
|
||||
Source="$(var.PTF_SRC_ROOT)\testtools\config\site.ptfconfig" />
|
||||
</Component>
|
||||
<Component Id="TestConfig.xsd" Guid="3F2E7994-7EA4-4843-B07A-5A6BA421360D" Feature="PTF_All">
|
||||
<File Id="TestConfig.xsd"
|
||||
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
|
||||
</Component>
|
||||
|
||||
<!-- ETW Manifest -->
|
||||
<Component Id="TestSuiteProvider.man" Guid="0D1C33F2-F997-44AF-BCE0-77782A187CD8" Feature="PTF_All">
|
||||
<File Id="TestSuiteProvider.man" Source="$(var.PTF_SRC_ROOT)\TestTools.ExtendedLogging\TestSuiteProvider.man" >
|
||||
<util:EventManifest MessageFile="[#Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10]" ResourceFile="[#Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10]"></util:EventManifest>
|
||||
</File>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id="Bin_DIR">
|
||||
|
||||
<!-- Microsoft.Protocols.TestTools -->
|
||||
<Component Id="Microsoft.Protocols.TestTools.dll_VS10" Guid="3F75FE1F-9951-4666-BF77-C4BF46E49692" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.dll" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.pdb_VS10" Guid="9141B891-0F7C-4E8E-B0D5-1B97204B9AD0" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.pdb_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.pdb" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.xml_VS10" Guid="39BBC2DC-A820-493F-A3DB-B5A1362C2ADE" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.xml_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.xml" />
|
||||
</Component>
|
||||
|
||||
<!-- Microsoft.Protocols.TestTools.Extension -->
|
||||
<Component Id="Microsoft.Protocols.TestTools.Extension.dll_VS10" Guid="47A67D84-7CE2-4923-ABCA-7914D9B3547C" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Extension.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.dll" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.Extension.pdb_VS10" Guid="358DAD50-C664-4FF0-818C-8D3DA67F3220" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Extension.pdb_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.pdb" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.Extension.xml_VS10" Guid="AF1700CF-4848-478E-A34B-6B05CE3F11C7" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Extension.xml_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.Extension.xml" />
|
||||
</Component>
|
||||
|
||||
<!-- Microsoft.Protocols.TestTools.Messages.Runtime -->
|
||||
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10" Guid="2692D1E3-C990-4835-B475-58F6F96CDC3C" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.dll" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.pdb_VS10" Guid="23BE7343-4826-4C81-81B0-A6C457DE0D3C" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.pdb_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.pdb" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.xml_VS10" Guid="EDF11E41-442B-4903-BD01-0A97CDD0B5F5" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.xml_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.Messages.Runtime.xml" />
|
||||
</Component>
|
||||
|
||||
<!-- Microsoft.Protocols.TestTools.VSTS -->
|
||||
<Component Id="Microsoft.Protocols.TestTools.VSTS.dll_VS10" Guid="30FD728A-C75C-463C-8C1C-EDBA807451DE" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.VSTS.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.dll" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.VSTS.pdb_VS10" Guid="EFE4FDC7-9BA9-46BA-AC55-C3D842CEFBFF" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.VSTS.pdb_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.pdb" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.VSTS.xml_VS10" Guid="D16B9E89-6340-4453-B9DA-9EBEF538DAD6" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.VSTS.xml_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.VSTS.xml" />
|
||||
</Component>
|
||||
|
||||
<!-- Microsoft.Protocols.TestTools.ExtendedLogging -->
|
||||
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10" Guid="7385F618-DCC8-4341-9ACF-4BE715B86F78" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.dll" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.pdb_VS10" Guid="3099B4A4-2940-40AF-B800-B516C792A4D5" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.pdb_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.pdb" />
|
||||
</Component>
|
||||
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.xml_VS10" Guid="7BF280B0-C7A9-4D42-AFE5-FE4511A9DA34" Feature="PTF_All">
|
||||
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.xml_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.ExtendedLogging.xml" />
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- PTF GAC -->
|
||||
|
||||
<DirectoryRef Id="PTF_GAC_VS10">
|
||||
<Component Id="GAC_Microsoft.Protocols.TestTools.dll_VS10" Guid="656C7CF2-4781-4855-B45E-5C8251FFF2D3" Feature="PTF_All">
|
||||
<File Id="GAC_Microsoft.Protocols.TestTools.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.dll"
|
||||
KeyPath="yes"
|
||||
Assembly=".net" />
|
||||
</Component>
|
||||
<Component Id="GAC_Microsoft.Protocols.TestTools.VSTS.dll_VS10" Guid="5D870B35-8003-494C-87E2-F95B15D88B0E" Feature="PTF_All">
|
||||
<File Id="GAC_Microsoft.Protocols.TestTools.VSTS.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.dll"
|
||||
KeyPath="yes"
|
||||
Assembly=".net" />
|
||||
</Component>
|
||||
<Component Id="GAC_Microsoft.Protocols.TestTools.Extension.dll_VS10" Guid="C58B0F42-4CCD-46A4-892B-D367938D70EC" Feature="PTF_All">
|
||||
<File Id="GAC_Microsoft.Protocols.TestTools.Extension.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.dll"
|
||||
KeyPath="yes"
|
||||
Assembly=".net" />
|
||||
</Component>
|
||||
<Component Id="GAC_Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10" Guid="1DC260A1-0907-4367-BFA0-6A7A5C255D7E" Feature="PTF_All">
|
||||
<File Id="GAC_Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.dll"
|
||||
KeyPath="yes"
|
||||
Assembly=".net" />
|
||||
</Component>
|
||||
<Component Id="GAC_Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10" Guid="538D5842-F65A-47BA-818F-71F8C611D019" Feature="PTF_All">
|
||||
<File Id="GAC_Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10"
|
||||
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.dll"
|
||||
KeyPath="yes"
|
||||
Assembly=".net" />
|
||||
</Component>
|
||||
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- PTF Docs -->
|
||||
<DirectoryRef Id="DOCS_DIR">
|
||||
<!-- PTF User Guide -->
|
||||
<Component Id="PTF_User_Guide" Guid="B3F7E4AF-8751-4FEC-83C0-239918499DA3" Feature="PTF_All">
|
||||
<File Id="PTFUserGuide.docx" Source="$(var.PTF_SRC_ROOT)..\docs\PTFUserGuide.docx" />
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- PTF License -->
|
||||
<DirectoryRef Id="ROOT_DIR">
|
||||
<!-- PTF License -->
|
||||
<Component Id="PTF_LICENSE" Guid="9AB77E77-A595-4CF0-935F-2F967886FC9B" Feature="PTF_All">
|
||||
<File Id="LICENSE.txt" Source="$(var.PTF_SRC_ROOT)\LICENSE.txt" />
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- PTF Shortcut -->
|
||||
<DirectoryRef Id="PTF_ProgramsMenuFolder">
|
||||
<!-- for PTF User Guide -->
|
||||
<Component Id="PTF_User_Guide_Shortcut" Guid="E360B475-A8F0-4FA6-96A1-A410DA9BAF73" Feature="PTF_All">
|
||||
<Shortcut Id="PTF_User_Guide_Shortcut"
|
||||
Name="PTF User Guide"
|
||||
Target="[DOCS_DIR]PTFUserGuide.docx" />
|
||||
|
||||
<RemoveFolder Id="PTF_User_Guide_Shortcut" On="uninstall" />
|
||||
<RegistryValue Id="PTF_User_Guide_Shortcut"
|
||||
Root="HKCU"
|
||||
Key="Software\Microsoft\ProtocolTestFramework"
|
||||
Name="userguide_installed"
|
||||
Type="integer"
|
||||
Value="1"
|
||||
KeyPath="yes"/>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- ptf testconfig schema for VS 2010 -->
|
||||
<DirectoryRef Id="VS2010_SCHEMAS_DIR">
|
||||
<Component Id="VS2010_TestConfig.xsd" Guid="F372BD7E-2D83-49A6-9473-9421FCB8ABEF" Feature="PTF_All">
|
||||
<File Id="VS2010_TestConfig.xsd" Vital="yes"
|
||||
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
|
||||
<Condition>VS2010_ROOT_FOLDER</Condition>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<!-- ptf testconfig schema for VS 2012 -->
|
||||
<DirectoryRef Id="VS2012_SCHEMAS_DIR">
|
||||
<Component Id="VS2012_TestConfig.xsd" Guid="{008B5502-CB06-4F42-9D52-B4600094C61F}" Feature="PTF_All">
|
||||
<File Id="VS2012_TestConfig.xsd" Vital="yes"
|
||||
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
|
||||
<Condition>VS2012_ROOT_FOLDER</Condition>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<Feature Id="PTF_All"
|
||||
Title="Protocol Test Framework"
|
||||
Description="Protocol Test Framework"
|
||||
Level="1"
|
||||
Display="hidden" />
|
||||
|
||||
</Fragment>
|
||||
|
||||
</Wix>
|
|
@ -0,0 +1,197 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents all data type used in TxtToJSON.cs
|
||||
/// </summary>
|
||||
public class DataType
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents summary for all test cases
|
||||
/// </summary>
|
||||
public class TestCasesSummary
|
||||
{
|
||||
/// <summary>
|
||||
/// Test cases information
|
||||
/// </summary>
|
||||
public List<TestCase> TestCases;
|
||||
|
||||
/// <summary>
|
||||
/// Test cases categories
|
||||
/// </summary>
|
||||
public List<string> TestCasesCategories;
|
||||
|
||||
/// <summary>
|
||||
/// Test cases classes
|
||||
/// </summary>
|
||||
public List<string> TestCasesClasses;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a test case
|
||||
/// </summary>
|
||||
public class TestCase
|
||||
{
|
||||
/// <summary>
|
||||
/// The name of the test case
|
||||
/// </summary>
|
||||
public string Name;
|
||||
|
||||
/// <summary>
|
||||
/// The result of test case
|
||||
/// </summary>
|
||||
public string Result;
|
||||
|
||||
/// <summary>
|
||||
/// The test class of the test case
|
||||
/// </summary>
|
||||
public string ClassType;
|
||||
|
||||
/// <summary>
|
||||
/// The categories of the test case
|
||||
/// </summary>
|
||||
public List<string> Category;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a detailed StandardOut log
|
||||
/// </summary>
|
||||
public class StandardOutDetail
|
||||
{
|
||||
/// <summary>
|
||||
/// The type of the StandardOut log
|
||||
/// </summary>
|
||||
public string Type;
|
||||
|
||||
/// <summary>
|
||||
/// The content of the StandardOut log
|
||||
/// </summary>
|
||||
public string Content;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents detailed test case information
|
||||
/// </summary>
|
||||
public class TestCaseDetail
|
||||
{
|
||||
/// <summary>
|
||||
/// The name of the test case
|
||||
/// </summary>
|
||||
public string Name;
|
||||
|
||||
/// <summary>
|
||||
/// The start time of the test case
|
||||
/// </summary>
|
||||
public string StartTime;
|
||||
|
||||
/// <summary>
|
||||
/// The end time of the test case
|
||||
/// </summary>
|
||||
public string EndTime;
|
||||
|
||||
/// <summary>
|
||||
/// The result of the test case
|
||||
/// </summary>
|
||||
public string Result;
|
||||
|
||||
/// <summary>
|
||||
/// The ErrorStackTrace log of the test case
|
||||
/// </summary>
|
||||
public List<string> ErrorStackTrace;
|
||||
|
||||
/// <summary>
|
||||
/// The ErrorMessage log of the test case
|
||||
/// </summary>
|
||||
public List<string> ErrorMessage;
|
||||
|
||||
/// <summary>
|
||||
/// The StandardOut log of the test case
|
||||
/// </summary>
|
||||
public List<StandardOutDetail> StandardOut;
|
||||
|
||||
/// <summary>
|
||||
/// The Types in StandardOut log
|
||||
/// </summary>
|
||||
public List<string> StandardOutTypes;
|
||||
|
||||
/// <summary>
|
||||
/// The path of the capture file if any
|
||||
/// </summary>
|
||||
public string CapturePath;
|
||||
|
||||
/// <summary>
|
||||
/// Set default value
|
||||
/// </summary>
|
||||
/// <param name="name">Test case name</param>
|
||||
/// <param name="startTime">The start time to run test case</param>
|
||||
/// <param name="endTime">The end time to run test case</param>
|
||||
/// <param name="result">The result to run the test case</param>
|
||||
public TestCaseDetail(string name, string startTime, string endTime, string result)
|
||||
{
|
||||
this.Name = name;
|
||||
this.StartTime = startTime;
|
||||
this.EndTime = endTime;
|
||||
this.Result = result;
|
||||
this.ErrorStackTrace = new List<string>();
|
||||
this.ErrorMessage = new List<string>();
|
||||
this.StandardOut = new List<StandardOutDetail>();
|
||||
this.StandardOutTypes = new List<string>();
|
||||
this.CapturePath = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents the summary for all test cases
|
||||
/// </summary>
|
||||
public class RunSummary
|
||||
{
|
||||
/// <summary>
|
||||
/// The number of total test cases
|
||||
/// </summary>
|
||||
public long TotalCount;
|
||||
|
||||
/// <summary>
|
||||
/// The number of passed test cases
|
||||
/// </summary>
|
||||
public long PassedCount;
|
||||
|
||||
/// <summary>
|
||||
/// The number of failed test cases
|
||||
/// </summary>
|
||||
public long FailedCount;
|
||||
|
||||
/// <summary>
|
||||
/// The number of inconclusive test cases
|
||||
/// </summary>
|
||||
public long InconclusiveCount;
|
||||
|
||||
/// <summary>
|
||||
/// The pass rate of this run
|
||||
/// </summary>
|
||||
public float PassRate;
|
||||
|
||||
/// <summary>
|
||||
/// The start time of this run
|
||||
/// </summary>
|
||||
public string StartTime;
|
||||
|
||||
/// <summary>
|
||||
/// The end time to of this run
|
||||
/// </summary>
|
||||
public string EndTime;
|
||||
|
||||
/// <summary>
|
||||
/// The duration of this run
|
||||
/// </summary>
|
||||
public string Duration;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,244 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Win32;
|
||||
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
|
||||
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
|
||||
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools
|
||||
{
|
||||
[ExtensionUri("logger://HtmlTestLogger")]
|
||||
[FriendlyName("Html")]
|
||||
public class HtmlTestLogger : ITestLogger
|
||||
{
|
||||
private string reportFolderPath; //The path to the report folder
|
||||
private string txtResultFolderPath; //The path to the result folder which stores all the txt files
|
||||
private string htmlResultFolderPath; //The path to the result folder which stores all the html files
|
||||
private string jsFolderPath; //The path to the result folder which stores all the js files
|
||||
private string captureFolderPath; //The path to the result folder which stores all the capture files
|
||||
|
||||
private DateTimeOffset testRunStartTime = DateTimeOffset.MaxValue.ToLocalTime(); //The start time of the test run
|
||||
private DateTimeOffset testRunEndTime = DateTimeOffset.MinValue.ToLocalTime(); //The end time of the test run
|
||||
private TxtToJSON txtToJSON = new TxtToJSON();
|
||||
|
||||
private const string scriptNode = "<script language=\"javascript\" type=\"text/javascript\">";
|
||||
private const string jsFileName_Functions = "functions.js";
|
||||
private const string jsFileName_Jquery = "jquery-1.11.0.min.js";
|
||||
private const string indexHtmlName = "index.html";
|
||||
private const string rootFolderName = "HtmlTestResults";
|
||||
private const string txtResultFolderName = "Txt";
|
||||
private const string htmlResultFolderName = "Html";
|
||||
private const string jsFolderName = "js";
|
||||
private const string captureFolderName = "Captures";
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the Test Logger.
|
||||
/// </summary>
|
||||
/// <param name="events">Events which can be registered for.</param>
|
||||
/// <param name="testRunDirectory">Test Run Directory</param>
|
||||
public void Initialize(TestLoggerEvents events, string testRunDirectory)
|
||||
{
|
||||
// Register for the events.
|
||||
events.TestRunMessage += TestMessageHandler;
|
||||
events.TestResult += TestResultHandler;
|
||||
events.TestRunComplete += TestRunCompleteHandler;
|
||||
CreateReportFolder();
|
||||
}
|
||||
|
||||
#region Implement three events
|
||||
/// <summary>
|
||||
/// Called when a test message is received.
|
||||
/// </summary>
|
||||
private void TestMessageHandler(object sender, TestRunMessageEventArgs e)
|
||||
{
|
||||
switch (e.Level)
|
||||
{
|
||||
case TestMessageLevel.Informational:
|
||||
break;
|
||||
|
||||
case TestMessageLevel.Warning:
|
||||
break;
|
||||
|
||||
case TestMessageLevel.Error:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a test result is received.
|
||||
/// </summary>
|
||||
private void TestResultHandler(object sender, TestResultEventArgs e)
|
||||
{
|
||||
if (e.Result.Outcome.ToString() == "NotFound")
|
||||
{
|
||||
return;
|
||||
}
|
||||
string caseName = !string.IsNullOrEmpty(e.Result.DisplayName) ? e.Result.DisplayName : e.Result.TestCase.FullyQualifiedName;
|
||||
int dot = caseName.LastIndexOf('.');
|
||||
|
||||
if (-1 != dot)
|
||||
caseName = caseName.Substring(dot + 1);
|
||||
|
||||
string txtFileName = Path.Combine(txtResultFolderPath, e.Result.StartTime.ToLocalTime().ToString("yyyy-MM-dd-HH-mm-ss") + "_"
|
||||
+ (e.Result.Outcome == TestOutcome.Skipped ? "Inconclusive" : e.Result.Outcome.ToString()) + "_" + caseName + ".txt");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
if (DateTimeOffset.Compare(testRunStartTime, e.Result.StartTime.ToLocalTime()) > 0)
|
||||
testRunStartTime = e.Result.StartTime.ToLocalTime();
|
||||
if (DateTimeOffset.Compare(testRunEndTime, e.Result.EndTime.ToLocalTime()) < 0)
|
||||
testRunEndTime = e.Result.EndTime.ToLocalTime();
|
||||
try
|
||||
{
|
||||
sb.AppendLine(caseName);
|
||||
sb.AppendLine("Start Time: " + e.Result.StartTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"));
|
||||
sb.AppendLine("End Time: " + e.Result.EndTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"));
|
||||
sb.AppendLine("Result: " + (e.Result.Outcome == TestOutcome.Skipped ? "Inconclusive" : e.Result.Outcome.ToString()));
|
||||
sb.AppendLine(e.Result.TestCase.Source);
|
||||
if (!String.IsNullOrEmpty(e.Result.ErrorStackTrace))
|
||||
{
|
||||
sb.AppendLine("===========ErrorStackTrace===========");
|
||||
sb.AppendLine(e.Result.ErrorStackTrace);
|
||||
}
|
||||
if (!String.IsNullOrEmpty(e.Result.ErrorMessage))
|
||||
{
|
||||
sb.AppendLine("===========ErrorMessage==============");
|
||||
sb.AppendLine(e.Result.ErrorMessage);
|
||||
}
|
||||
|
||||
foreach (TestResultMessage m in e.Result.Messages)
|
||||
{
|
||||
if (m.Category == TestResultMessage.StandardOutCategory && !String.IsNullOrEmpty(m.Text))
|
||||
{
|
||||
sb.AppendLine("===========StandardOut===============");
|
||||
sb.AppendLine(m.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
sb.AppendLine("Exception: " + ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Generate txt log file
|
||||
File.WriteAllText(txtFileName, sb.ToString());
|
||||
|
||||
// Generate html log file
|
||||
string htmlFileName = Path.Combine(htmlResultFolderPath, caseName + ".html");
|
||||
File.WriteAllText(htmlFileName, ConstructCaseHtml(txtFileName, caseName));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a test run is completed.
|
||||
/// </summary>
|
||||
private void TestRunCompleteHandler(object sender, TestRunCompleteEventArgs e)
|
||||
{
|
||||
// Insert the necessary info used in index.html and copy it to report folder.
|
||||
File.WriteAllText(Path.Combine(reportFolderPath, indexHtmlName), ConstructIndexHtml(e));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Creates the report folders
|
||||
/// </summary>
|
||||
private void CreateReportFolder()
|
||||
{
|
||||
reportFolderPath = Path.Combine(
|
||||
Path.Combine(Directory.GetCurrentDirectory(), rootFolderName),
|
||||
DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"));
|
||||
|
||||
Directory.CreateDirectory(reportFolderPath);
|
||||
|
||||
txtResultFolderPath = Path.Combine(reportFolderPath, txtResultFolderName);
|
||||
Directory.CreateDirectory(txtResultFolderPath);
|
||||
|
||||
htmlResultFolderPath = Path.Combine(reportFolderPath, htmlResultFolderName);
|
||||
Directory.CreateDirectory(htmlResultFolderPath);
|
||||
|
||||
jsFolderPath = Path.Combine(reportFolderPath, jsFolderName);
|
||||
Directory.CreateDirectory(jsFolderPath);
|
||||
|
||||
captureFolderPath = Path.Combine(reportFolderPath, captureFolderName);
|
||||
Directory.CreateDirectory(captureFolderPath);
|
||||
|
||||
// Copy the two .js files to report folder, the two files don't need to be changed.
|
||||
File.WriteAllText(Path.Combine(jsFolderPath, jsFileName_Functions), Properties.Resources.functions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs detailObj used in each [caseName].html
|
||||
/// </summary>
|
||||
private string ConstructDetailObj(string txtFileName)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine();
|
||||
sb.Append("var detailObj=");
|
||||
sb.Append(txtToJSON.ConstructCaseDetail(txtFileName, captureFolderPath));
|
||||
sb.AppendLine(";");
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs listObj and summaryObj used in functions.js
|
||||
/// </summary>
|
||||
private string ConstructListAndSummaryObj(TestRunCompleteEventArgs e)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine();
|
||||
sb.AppendLine("var listObj = " + txtToJSON.TestCasesString(txtResultFolderPath, captureFolderPath) + ";");
|
||||
sb.Append("var summaryObj = "
|
||||
+ txtToJSON.SummaryTable(e.TestRunStatistics.ExecutedTests,
|
||||
e.TestRunStatistics[TestOutcome.Passed],
|
||||
e.TestRunStatistics[TestOutcome.Failed],
|
||||
testRunStartTime,
|
||||
testRunEndTime) + ";");
|
||||
|
||||
// Clean the temp file
|
||||
File.Delete(txtToJSON.CaseCategoryFile);
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts the corresponding script to the template html and generates the [testcase].html
|
||||
/// </summary>
|
||||
private string ConstructCaseHtml(string txtFileName, string caseName)
|
||||
{
|
||||
// Insert script to the template html (testcase.html)
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.Append(ConstructDetailObj(txtFileName));
|
||||
sb.AppendLine("var titleObj = document.getElementById(\"right_sidebar_case_title\");");
|
||||
sb.Append(string.Format("CreateText(titleObj, \"{0}\");", caseName));
|
||||
|
||||
return InsertScriptToTemplate(Properties.Resources.testcase, sb.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts the corresponding script to the template html and generates the index.html
|
||||
/// </summary>
|
||||
private string ConstructIndexHtml(TestRunCompleteEventArgs e)
|
||||
{
|
||||
return InsertScriptToTemplate(Properties.Resources.index, ConstructListAndSummaryObj(e));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts scripts to the template html files and returns the updated content
|
||||
/// </summary>
|
||||
private string InsertScriptToTemplate(string templateHtml, string scriptToInsert)
|
||||
{
|
||||
int posInsert = templateHtml.IndexOf(scriptNode);
|
||||
return templateHtml.Insert(posInsert + scriptNode.Length, scriptToInsert);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{8A100541-699B-4011-B184-01B70D534B5E}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft</RootNamespace>
|
||||
<AssemblyName>Microsoft.Protocols.TestTools.HtmlTestLogger</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.TestPlatform.ObjectModel">
|
||||
<HintPath Condition="Exists('$(VS110COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS110COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
|
||||
<HintPath Condition="Exists('$(VS120COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS120COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
|
||||
<HintPath Condition="Exists('$(VS140COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS140COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SharedAssemblyInfo.cs">
|
||||
<Link>SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="DataType.cs" />
|
||||
<Compile Include="HtmlTestLogger.cs" />
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="TxtToJSON.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\testcase.html" />
|
||||
<Content Include="Resources\functions.js" />
|
||||
<Content Include="Resources\index.html" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="AfterBuild">
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\HtmlTestLogger\" />
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\HtmlTestLogger\" />
|
||||
</Target>
|
||||
</Project>
|
|
@ -0,0 +1,131 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.34014
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Microsoft.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to var filter = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAXCAYAAAAiGpAkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADjSURBVGhD7doxCoQwEAXQiYm5lhbiXsLDeBf7tJZeSGzcTjHLhCwry8KmnvkPJHEsPx9RYvb9GQlUqvIKCpl1XeOyLHRdVx6BZMYY6rqO6tqTmaYpDsOQH4EGIQTq+wdV3vs8Ai3O80wr3vmKIXzFEL5iCF8xhC9A27bpE+5+8ewfhC/AOI559/Fr9g3hC8Atb5om31Hao/mK3Jte0nqG8IV4t7+09QzhC8KNL209Q/iCcONLW88QvmIIXzGErxjCV6ziX4Ggy3EcaTXbtsV5nsk5lwYgm7U2HeOy1hFO76pF9AK1pjdhWLkJdwAAAABJRU5ErkJggg==";
|
||||
///var spread = "data:image [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string functions {
|
||||
get {
|
||||
return ResourceManager.GetString("functions", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <!DOCTYPE html>
|
||||
///<html>
|
||||
///<head>
|
||||
///
|
||||
///<style type="text/css">
|
||||
///div#header {background-color:#99bbbb;}
|
||||
///div#left_sidebar {width:29%;float:left;overflow:auto;}
|
||||
///div#back_to_summary {width:68%;float:left;overflow:auto;}
|
||||
///div#right_sidebar_summary {width:68%;float:left;overflow:auto;margin-left:-2px}
|
||||
///div#right_sidebar_case {width:68%;float:left;overflow:auto;margin-left:-2px}
|
||||
///div#footer {background-color:#99bbbb;clear:both;text-align:center;}
|
||||
///h1 {margin-bottom:0;}
|
||||
///h2 {margin-bottom:0;font-size:18px;}
|
||||
///ul {marg [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string index {
|
||||
get {
|
||||
return ResourceManager.GetString("index", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <!DOCTYPE html>
|
||||
///
|
||||
///<html>
|
||||
///<head>
|
||||
/// <meta charset="utf-8" />
|
||||
/// <title></title>
|
||||
/// <style type="text/css">
|
||||
///h1 {margin-bottom:0;}
|
||||
///ul {margin:0;}
|
||||
///
|
||||
///body{
|
||||
/// font-family:Arial,Verdana,Sans-serif;
|
||||
/// background-color: rgb(243,243,244);
|
||||
///}
|
||||
///h1.title{
|
||||
/// color: #1382CE;
|
||||
/// font-family:Arial,Verdana,Sans-serif;
|
||||
/// font-weight: bolder;
|
||||
///}
|
||||
///
|
||||
///div.frame {
|
||||
/// color:white;
|
||||
/// border-style: groove;
|
||||
/// font-weight: bold;
|
||||
/// font-size: 110%;
|
||||
/// filter: alpha(opacity=30);
|
||||
/// border:none;
|
||||
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string testcase {
|
||||
get {
|
||||
return ResourceManager.GetString("testcase", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="functions" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\functions.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
|
||||
</data>
|
||||
<data name="index" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\index.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="testcase" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\testcase.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,638 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
var filter = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAXCAYAAAAiGpAkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADjSURBVGhD7doxCoQwEAXQiYm5lhbiXsLDeBf7tJZeSGzcTjHLhCwry8KmnvkPJHEsPx9RYvb9GQlUqvIKCpl1XeOyLHRdVx6BZMYY6rqO6tqTmaYpDsOQH4EGIQTq+wdV3vs8Ai3O80wr3vmKIXzFEL5iCF8xhC9A27bpE+5+8ewfhC/AOI559/Fr9g3hC8Atb5om31Hao/mK3Jte0nqG8IV4t7+09QzhC8KNL209Q/iCcONLW88QvmIIXzGErxjCV6ziX4Ggy3EcaTXbtsV5nsk5lwYgm7U2HeOy1hFO76pF9AK1pjdhWLkJdwAAAABJRU5ErkJggg==";
|
||||
var spread = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAIAAABv85FHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAfSURBVBhXY1iKG4Dk/mMDlMuFogIUOUxAoRx2sHQpAKV9xlhCkKRRAAAAAElFTkSuQmCC";
|
||||
var fold = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAIAAABv85FHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAtSURBVBhXY1iKG4DkHmED6HKhoaFQFrFyQFFkgCIHARBRCCBFDhlA5bCDpUsBCAewyPpzLswAAAAASUVORK5CYII=";
|
||||
var Inconclusive = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAYCAMAAAG3jG2VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAG5UExURQAAAOviOPPmGPHjEe7fIvTnEO/fKvLlMfHiAO7hC+vXJ+nNAOvfLPPmQOXZBvXsS+rOAPLjHPPrWPPsPevhLPDdAPHkNfbvSezQAPLqQO3tT+XYX+fKAO3RAO3tV/XmGezdJfLYAOfbJu7SAPTvLfDUAO/kL/HVAPbtOO7jMvDhK+7uM/buGfPvdezgKfDhMuXfeeDGB+vUAOXfaOvlOfHoO+vlP/LqOubgaO7fGOzdGPXwSvTvMenPBPXwUuziKunPAPTuuPHjIubfPuzaC+/YAObUAPDvfvPrNf7xNevSAPHqNe7rZvTqOe7gJf///+zsP+jMAfPzN+jMBOvaEO3dAO3UAOjOAPLmIO/nR/fwVPDwefXvQ/TyeurPAObdQu/nT+nfL+3fMe7hNti/AO/hE/TuO+zRAPHYAPXtJebbIujfS+fLAOvXBOveKOnMAO7TAPPyzvjujO/lIPbuROrfHubbX+nSBPfvR+jopPLgGvTrIuvVAObZUPXjDO3jKfTuI/XjFvPZAevaDO7mOff3avPubu7mQebLAu/ZAOrRAObVAOraGPLqOenlbuHGCOrXAPDjGuvYALOow70AAACTdFJOUwDj/4H//zD//94N/8T//xv//0LrNMETyP8/HSj4/x3/Nv///5H/MP87eSMP/0G+Iyj4/7IoiSh6sr1x9Zay9TaM/8H/zP////ET/8T/Mf//HLIXss3///jOIEVFh4z//yAwOT346ev//4f///g0xP////+EyP//siD///f////lx/+szB8kLh+y/4z/ce3/+Ln/ubwTSvMAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEISURBVBhXYwADRSCuhDADGLi5gVQriC3qzwkkTaTNQBw4aEgDEsoFYgyTuLknMLQYGLRDxGEgqjoawpBkKuLQBTGSJkr4S4QmA1l5MjIpMjI8IEECQEoOymAQL4EyhOQbYyEsb3beCDBDQ9C5r8ocxNJL786SCAEy2Fi4S7O5/dQYGETCc/oNZWRygYImBtLSBqjeIAUkxDRlRkLZEMCvYldnbdMG5YFAkKlHhqq6jpMvlM/A4Mnc2+nj7+4qXFwBFdHWTA2T5fOPl01ntUwEi3BZ1dfExbkVKsXFGTH2cIGE7F288vO5ax3LuLm5BZoVQEJaXYGB5cHGFsbBth0dDvogIcKAgQEADMkwnizPP+8AAAAASUVORK5CYII=";
|
||||
var Passed = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAMAAAHJpQ2UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHLUExURQAAAKzVrD+ePzaaNu327SOSIzKZMjCXMDOZM5HIkSyWLDWaNff7953OnT6ePpTKlDGXMT+fP6TRpDOaMz+fPzScNHa6djecN0GgQSSRJKfWpzGbMbjbuDKZMiWSJTOZM/D38DKYMi6WLjOYM5TJlDScNEGfQTCYMCqUKjKYMjWhNTSWNDGZMTWaNXq8ejKYMjWaNdfr1zKZMjKZMjKYMjSZNE2mTS2WLTeXNzKYMjGYMer06jSdNDOaMzOZM/T59CqVKjSWNDKZMjOZMzKZMlupWzGZMTSaNP///zOZM0aiRtHo0TGVMdrs2jKYMqzVrDCRMH6+fkKgQjKaMn+/f5fHl0CgQFupWzSWNDKZMjadNiSSJO/375bFliWTJTKYMjKZMvj7+DCXMDebN5zNnDOZM5fOlzKYMi+YL8vlyzOaMzCZMDOaM3i7eHC4cKfTp0KgQp7OnpPJkzKYMkOhQyaSJrHYsSeTJzCXMDOZMzebNyiUKDKZMjGYMZnMmTKaMimVKTqcOpfLlzKZMjKaMiqWKjOZMzOaM6nTqUShRDKYMiybLHO5czSbNEWiRTaXNkOgQ6vVqzKaMjKYMuLw4rTZtDKYMiqUKkGiQUQZxeYAAACZdFJOUwAlfKr//7D5+P////8V/4S0ff93/yf//4T/Jin/tf+p/7EW+f8sff8Y+hMi/yv/Ga3/ebrctf8nJbav/yKB5P//J7f/+CqK//+z//8p//z/Ff9/f/8l4CcsvCr//xb/I4P/+in/+SV///+x/9/////gJSbj4P////8oLv/k/yiv/////4n/4P////sX////KuH/rK///93/hPqyR5EAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFBSURBVBhXYwADBxcGBlMIU9kaSMgCcUu7Az+Q6kqUUwaJg0G7ewMDQ9R0sXJzBmnJGGcLBgZBTyOwTEKkcWQQmCWt6excah/IXghkRymnGE7Rc3ZxBElIiFc3uDung5g4Qb+ssbGAFJiZbNferhM3oQjEZmt3du5RaGUGsS3do6NZ9Nwng9kNHh0spe31ILaVO6dHrnOvPIjNGJbNqtM7zQbEZigy8PScFA9mYgB91SoQiOiG8sHAx63GTxME/NpmpEHFGDRsi9uBrnCu6GvybeIqYOKFCOs6pYJE1UUmeshwN7tkhUOEoyyVuULy87z8PaY21ra71IMDAKy6tjPTg8ejjE/duZ1DURQirKSWo5NhJuSt4lXh3O5sIqwFEWZgCOUvSVLm4OBQ1pwWrA0VA4PYOlfp5OT+ygAoHytgYAAAQF5KkPS9yX0AAAAASUVORK5CYII=";
|
||||
var Failed = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAMAAAHJpQ2UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADzUExURQAAAOtFNetFNu1GNOlENeYVA+9PP+lCNOo9MepBNOYUAektG+YVAfBGOOcpF+YWAew9L+gqGOg+MfKLgec0I+YUAOYdCuURAPJKPudGOOc/L/739uURAPWpoucTAOg8MeUWAve0rvBBMus+MPi+uew+MfKHff////nIw/ORiOtBMucjEeckEuYdCulCNO5CN+UXBOUUAOYVAeUYBeUWA+QQAOUUAOksGuYeC/3u7eQQAPGAdec2Jf749+USAOpIPuUUAeUTAOcmFOs1JOQPAPi/uukoFutDNeYRAPnJxOopF+QUAOcoFeUbCOckEeszIegTACouQoAAAABOdFJOUwD//x2ZjyCkPrqT/7ok/7M2/zn/w///ySk2IP////8u+v8zNf8p/////zP/yu6zLvjJm/H09v/////z/8T//zGV+P//////nv////rL8cFJdy4AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEWSURBVBhXdY/XcsIwEEWX3gwGg3EAU4wNSw9V9GaKDaH9/9dEks3kIcmZ0erslbQzAk6dAPQcVQq0iHTlprZFtwxqL5ZzxnKM1g1mdQDvA1sAkrjjJ+GIIAy5wcqDpoGlKnNFbeJ6Ruh1gO3oLNtXP9P/GQpCJOyoFbPl6TjHtFpCw0TPirlOsgWsbxTHZ2tsqtxbL9Qe6M0wB//Vls+jLXfYiWJPcvQX8fInpRx3WwcpNKl8USqT0M+7fPR+uDQSqppoXA73aN6N9Q5pLxE1DXHZJh3+UxYPCDmm5ojz1JGQwTtO3oiZRiwWEdMmuSXd2BfoPk+GqaqmcXp2Az43pmOsRX9P6S+s9wiHYO2DUgu67Z8AfAMkISUJElTKAgAAAABJRU5ErkJggg==";
|
||||
var selectedCaseDiv = 0; // The variable is used to save the object of the selected case in the left side.
|
||||
var filterDisplayed = false; // The boolean is used to indicate if the "Log filter" is displayed or not.
|
||||
|
||||
// Used by Main.html
|
||||
// Set height of iframe, the bottoms of left_sidebar and iframe are in the same line
|
||||
function SetIFrameHeight(frame)
|
||||
{
|
||||
if (frame)
|
||||
{
|
||||
frame.height = document.getElementById("left_sidebar").clientHeight - document.getElementById("summary").clientHeight;
|
||||
}
|
||||
}
|
||||
|
||||
// Generate case list in left_sidebar
|
||||
function CreateCaseList()
|
||||
{
|
||||
var caseListOjb = document.getElementById("list");
|
||||
caseListOjb.style.marginLeft = "15px";
|
||||
var len = listObj['TestCases'].length;
|
||||
|
||||
for (var i = 0; i < len; i++)
|
||||
caseListOjb.appendChild(CreateOneCase(i));
|
||||
|
||||
// Set height of left side.
|
||||
document.getElementById("left_sidebar").style.height = (window.screen.height - 150) + 'px';
|
||||
}
|
||||
|
||||
// Generate one case for case list in left_sidebar
|
||||
function CreateOneCase(id)
|
||||
{
|
||||
var casediv = document.createElement("div");
|
||||
var caseTextDiv = document.createElement("div");
|
||||
var casetext = document.createElement("a");
|
||||
var result = listObj['TestCases'][id]['Result'];
|
||||
var backgroundImg;
|
||||
switch (result) {
|
||||
case "Failed":
|
||||
backgroundImg = Failed;
|
||||
break;
|
||||
case "Passed":
|
||||
backgroundImg = Passed;
|
||||
break;
|
||||
case "Inconclusive":
|
||||
backgroundImg = Inconclusive;
|
||||
break;
|
||||
case "NotFound":
|
||||
backgroundImg = NotFound;
|
||||
break;
|
||||
}
|
||||
|
||||
var index = document.getElementById("list").children.length;
|
||||
casediv.onclick = function () { ClickChange(this, listObj['TestCases'][id]['Name']); }
|
||||
|
||||
var casename = listObj['TestCases'][id]['Name'];
|
||||
CreateText(casetext, casename);
|
||||
|
||||
// Set the img as background, then the text (case name) will not drop to next line if it's too long.
|
||||
caseTextDiv.style.background = "url(" + backgroundImg + ") no-repeat left";
|
||||
caseTextDiv.appendChild(casetext);
|
||||
casetext.style.paddingLeft = '20px';
|
||||
caseTextDiv.style.padding = "6px 0px 3px 5px";
|
||||
|
||||
casediv.appendChild(caseTextDiv);
|
||||
return casediv;
|
||||
}
|
||||
|
||||
function ClickChange(caseDiv, casename)
|
||||
{
|
||||
// Change src dynamically
|
||||
document.getElementById("testcase").src = 'Html\\' + casename + '.html';
|
||||
|
||||
document.getElementById('back_to_summary').style.display = '';
|
||||
document.getElementById('summary').style.display = '';
|
||||
document.getElementById('right_sidebar_case').style.display = '';
|
||||
document.getElementById("right_sidebar_summary").style.display = 'none';
|
||||
|
||||
// Hightlight the selected case
|
||||
caseDiv.className = 'highLight';
|
||||
|
||||
// Recover the old selected case
|
||||
if (selectedCaseDiv)
|
||||
{
|
||||
selectedCaseDiv.className = 'normal';
|
||||
}
|
||||
selectedCaseDiv = caseDiv;
|
||||
}
|
||||
|
||||
// Group test cases
|
||||
// Change style depends on group in left_sidebar
|
||||
function ChangeSelect(value)
|
||||
{
|
||||
var showlist = document.getElementById("list");
|
||||
var keyword = document.getElementById("keyword").value;
|
||||
var html = "";
|
||||
var len = listObj['TestCases'].length;
|
||||
showlist.innerHTML = "";
|
||||
if (value == 1)
|
||||
{
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
|
||||
showlist.appendChild(CreateOneCase(i));
|
||||
}
|
||||
}
|
||||
if (value == 2)
|
||||
{
|
||||
var failedNum = 0;
|
||||
var inconclusiveNum = 0;
|
||||
var passedNum = 0;
|
||||
var fhtml = document.createElement("div");
|
||||
var ihtml = document.createElement("div");
|
||||
var phtml = document.createElement("div");
|
||||
var nhtml = document.createElement("div");
|
||||
fhtml.id = "f";
|
||||
ihtml.id = "i";
|
||||
phtml.id = "p";
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (listObj['TestCases'][i]['Result'] == "Failed"
|
||||
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
|
||||
{
|
||||
failedNum = failedNum + 1;
|
||||
fhtml.appendChild(CreateOneCase(i));
|
||||
}
|
||||
if (listObj['TestCases'][i]['Result'] == "Inconclusive"
|
||||
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
|
||||
{
|
||||
inconclusiveNum = inconclusiveNum + 1;
|
||||
ihtml.appendChild(CreateOneCase(i));
|
||||
}
|
||||
if (listObj['TestCases'][i]['Result'] == "Passed"
|
||||
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
|
||||
{
|
||||
passedNum = passedNum + 1;
|
||||
phtml.appendChild(CreateOneCase(i));
|
||||
}
|
||||
}
|
||||
if (failedNum != 0) {
|
||||
var fframe = document.createElement("div");
|
||||
var fimg = document.createElement("img");
|
||||
fframe.className = "frame";
|
||||
fimg.onclick = function () { ChangeStyle("f") };
|
||||
fimg.className = "small";
|
||||
fimg.src = fold;
|
||||
fimg.id = "imgf";
|
||||
fframe.appendChild(fimg);
|
||||
showlist.appendChild(fframe);
|
||||
fframe.appendChild(document.createTextNode("Failed (" + failedNum + ")"));
|
||||
showlist.appendChild(fhtml);
|
||||
showlist.appendChild(document.createElement("br"));
|
||||
fhtml.style.display = 'none';
|
||||
}
|
||||
if (inconclusiveNum != 0) {
|
||||
var iframe = document.createElement("div");
|
||||
var iimg = document.createElement("img");
|
||||
iframe.className = "frame";
|
||||
iimg.onclick = function () { ChangeStyle("i") };
|
||||
iimg.className = "small";
|
||||
iimg.src = fold;
|
||||
iimg.id = "imgi";
|
||||
iframe.appendChild(iimg);
|
||||
showlist.appendChild(iframe);
|
||||
iframe.appendChild(document.createTextNode("Inconlusive (" + inconclusiveNum + ")"));
|
||||
showlist.appendChild(ihtml);
|
||||
showlist.appendChild(document.createElement("br"));
|
||||
ihtml.style.display = 'none';
|
||||
}
|
||||
if (passedNum != 0) {
|
||||
var pframe = document.createElement("div");
|
||||
var pimg = document.createElement("img");
|
||||
pframe.className = "frame";
|
||||
pimg.className = "small";
|
||||
pimg.src = fold;
|
||||
pimg.id = "imgp";
|
||||
pimg.onclick = function () { ChangeStyle("p") };
|
||||
pframe.appendChild(pimg);
|
||||
pframe.appendChild(document.createTextNode("Passed (" + passedNum + ")"));
|
||||
showlist.appendChild(pframe);
|
||||
showlist.appendChild(phtml);
|
||||
phtml.style.display = 'none';
|
||||
}
|
||||
}
|
||||
if (value == 3 || value == 4)
|
||||
{
|
||||
GroupBySelect(value, len, keyword, showlist);
|
||||
}
|
||||
}
|
||||
|
||||
// for group by class and category
|
||||
function GroupBySelect(value, len, keyword, showlist)
|
||||
{
|
||||
var name;
|
||||
if (value == 3) name = "TestCasesCategories";
|
||||
if (value == 4) name = "TestCasesClasses";
|
||||
var ctglen = listObj[name].length;
|
||||
var ctgs = new Array();
|
||||
var ctgfrms = new Array();
|
||||
|
||||
for (var i = 0; i < ctglen; i++)
|
||||
{
|
||||
ctgfrms[i] = document.createElement("div");
|
||||
ctgfrms[i].className = "frame";
|
||||
var ctgimg = document.createElement("img");
|
||||
ctgimg.className = "small";
|
||||
ctgimg.src = fold;
|
||||
ctgimg.id = "img" + i;
|
||||
ctgimg.onclick = function () { ChangeStyle(this.id.substring(3)) };
|
||||
ctgfrms[i].appendChild(ctgimg);
|
||||
ctgfrms[i].appendChild(document.createTextNode(listObj[name][i]));
|
||||
ctgs[i] = document.createElement("div");
|
||||
ctgs[i].id = i;
|
||||
}
|
||||
if (value == 3) name = "Category";
|
||||
if (value == 4) name = "ClassType";
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) == -1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (value == 3)
|
||||
{
|
||||
for (var j = 0; j < listObj['TestCases'][i][name].length; j++)
|
||||
{
|
||||
var id = FindIndexofCategory(listObj['TestCases'][i][name][j]);
|
||||
ctgs[id].appendChild(CreateOneCase(i));
|
||||
}
|
||||
}
|
||||
if (value == 4)
|
||||
{
|
||||
var id = FindIndexofClass(listObj['TestCases'][i][name]);
|
||||
ctgs[id].appendChild(CreateOneCase(i));
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < ctglen; i++)
|
||||
{
|
||||
showlist.appendChild(ctgfrms[i]);
|
||||
showlist.appendChild(ctgs[i]);
|
||||
showlist.appendChild(document.createElement("br"));
|
||||
ctgs[i].style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// Find index of ctg in listObj['testCasesCategories']
|
||||
function FindIndexofCategory(category)
|
||||
{
|
||||
for (var i = 0; i < listObj['TestCasesCategories'].length; i++)
|
||||
{
|
||||
if (category == listObj['TestCasesCategories'][i])
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
// Filter by keyword,get "enter" by code id,value is the keyword
|
||||
function KeyShow(code, value)
|
||||
{
|
||||
if (code == 13)
|
||||
{
|
||||
var g = document.getElementById("groupbyid");
|
||||
var id = g.options[g.selectedIndex].value;
|
||||
ChangeSelect(id);
|
||||
}
|
||||
}
|
||||
|
||||
// Call keyword filter by press button "Go"
|
||||
function KeywordGo()
|
||||
{
|
||||
var g = document.getElementById("keyword").value;
|
||||
KeyShow(13, g);
|
||||
}
|
||||
|
||||
// Find index of cls in listObj['testCasesClassses']
|
||||
function FindIndexofClass(cls)
|
||||
{
|
||||
for (var i = 0; i < listObj['TestCasesClasses'].length; i++)
|
||||
{
|
||||
if (cls == listObj['TestCasesClasses'][i])
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
// Show summary of the test run
|
||||
function ShowSummary()
|
||||
{
|
||||
var tbody = document.getElementById("tableid");
|
||||
var newrow = tbody.insertRow(-1);
|
||||
CreateText(newrow.insertCell(0), summaryObj.TotalCount);
|
||||
CreateText(newrow.insertCell(1), summaryObj.PassedCount);
|
||||
CreateText(newrow.insertCell(2), summaryObj.FailedCount);
|
||||
CreateText(newrow.insertCell(3), summaryObj.InconclusiveCount);
|
||||
CreateText(newrow.insertCell(4), summaryObj.PassRate + "%");
|
||||
var pt = document.getElementById("time");
|
||||
pt.innerHTML = "Start Time: " + summaryObj.StartTime + "<br />End Time:  " + summaryObj.EndTime
|
||||
+ "<br />Duration:   " + summaryObj.Duration;
|
||||
pt.style.fontFamily = "Tahoma";
|
||||
}
|
||||
|
||||
// Used by [casename].html
|
||||
function MulselShow()
|
||||
{
|
||||
var typesdiv = document.getElementById("mulsel");
|
||||
typesdiv.innerHTML = "";
|
||||
if (filterDisplayed) {
|
||||
typesdiv.style.display = 'none';
|
||||
filterDisplayed = false;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
typesdiv.style.display = '';
|
||||
filterDisplayed = true;
|
||||
}
|
||||
|
||||
var title = GetText(document.getElementById("right_sidebar_case_title"));
|
||||
var html = '';
|
||||
var sltAlllab = document.createElement("label");
|
||||
var sltAllinput = document.createElement("input");
|
||||
sltAllinput.type = "checkbox";
|
||||
sltAllinput.value = "(Select All)";
|
||||
sltAllinput.onclick = function () { SelectALL(this.checked); }
|
||||
CreateText(sltAlllab, "(Select All)");
|
||||
typesdiv.appendChild(sltAllinput);
|
||||
typesdiv.appendChild(sltAlllab);
|
||||
sltAllinput.checked = true;
|
||||
typesdiv.appendChild(document.createElement("br"));
|
||||
var confirmdiv = document.createElement("div");
|
||||
var confirminput = document.createElement("input");
|
||||
len = detailObj['StandardOutTypes'].length;
|
||||
for (var j = 0; j < len; j++)
|
||||
{
|
||||
var typelab = document.createElement("label");
|
||||
var typeinput = document.createElement("input");
|
||||
typeinput.name = "box";
|
||||
typeinput.type = "checkbox"
|
||||
typeinput.value = detailObj['StandardOutTypes'][j];
|
||||
CreateText(typelab, detailObj['StandardOutTypes'][j]);
|
||||
typesdiv.appendChild(typeinput);
|
||||
typesdiv.appendChild(typelab);
|
||||
typesdiv.appendChild(document.createElement("br"));
|
||||
typeinput.checked = true;
|
||||
}
|
||||
confirmdiv.align = "right";
|
||||
confirminput.type = "button"
|
||||
confirminput.style.width = "auto";
|
||||
confirminput.style.height = "18px";
|
||||
confirminput.value = "OK";
|
||||
confirminput.style.fontSize = '12px';
|
||||
confirminput.onclick = function () { FilterLog(this); }
|
||||
confirmdiv.appendChild(confirminput);
|
||||
typesdiv.appendChild(confirmdiv);
|
||||
|
||||
}
|
||||
|
||||
// back to summary
|
||||
function ClickSummary(obj)
|
||||
{
|
||||
obj.style.display = 'none';
|
||||
document.getElementById("right_sidebar_case").style.display = 'none';
|
||||
document.getElementById("right_sidebar_summary").style.display = '';
|
||||
}
|
||||
|
||||
|
||||
// Select ALL in log filter
|
||||
function SelectALL(checked)
|
||||
{
|
||||
var mulsel = document.getElementById('mulsel');
|
||||
for (var i = 1; i < mulsel.children.length; i++)
|
||||
{
|
||||
if (mulsel.children[i].type == "checkbox")
|
||||
mulsel.children[i].checked = checked;
|
||||
}
|
||||
}
|
||||
|
||||
// Get text content compatible with browser
|
||||
function GetText(elem)
|
||||
{
|
||||
if (elem.textContent && typeof (elem.textContent) != "undefined")
|
||||
return elem.textContent;
|
||||
else
|
||||
return elem.innerText;
|
||||
}
|
||||
|
||||
// show detail in right_sidebar_case
|
||||
function ShowDetail(caseDetail, logTypes)
|
||||
{
|
||||
var html = '';
|
||||
var len = 0;
|
||||
var title = GetText(document.getElementById("right_sidebar_case_title"));
|
||||
switch (caseDetail)
|
||||
{
|
||||
case "time":
|
||||
var caseTime = document.getElementById("casetime");
|
||||
caseTime.innerHTML = "";
|
||||
var pStartTime = document.createElement("p");
|
||||
var pEndTime = document.createElement("p");
|
||||
var pResult = document.createElement("p");
|
||||
pStartTime.innerHTML = detailObj['StartTime'];
|
||||
pEndTime.innerHTML = detailObj['EndTime'];
|
||||
pResult.innerHTML = detailObj['Result'];
|
||||
caseTime.appendChild(pStartTime);
|
||||
caseTime.appendChild(pEndTime);
|
||||
caseTime.appendChild(pResult);
|
||||
|
||||
var pCapture = document.createElement("u");
|
||||
pCapture.style.color = "#1382CE"; //highlight capture file link
|
||||
pCapture.onclick = function ()
|
||||
{
|
||||
if (detailObj['CapturePath'] == null)
|
||||
{
|
||||
alert("Sorry for no capture.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (navigator.userAgent.indexOf(".NET") > 0)
|
||||
{
|
||||
var activeObj = new ActiveXObject('WScript.shell');
|
||||
try
|
||||
{
|
||||
activeObj.run(detailObj['CapturePath'], 1);
|
||||
}
|
||||
catch (err)
|
||||
{
|
||||
alert("Please install Microsoft Message Analyzer firstly to open this capture.\r\n"
|
||||
+ "The capture file can be found at \"" + detailObj['CapturePath'] + "\".");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
alert("Incompatibility Problem! \r\nPlease use IE to open this index.html");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (detailObj['CapturePath'] != null)
|
||||
{
|
||||
caseTime.appendChild(document.createTextNode("Capture: "));
|
||||
caseTime.appendChild(pCapture);
|
||||
CreateText(pCapture, title + '.etl');
|
||||
}
|
||||
|
||||
caseTime.style.fontFamily = "Tahoma";
|
||||
|
||||
break;
|
||||
case "StandardOut":
|
||||
var html = '';
|
||||
len = detailObj[caseDetail].length;
|
||||
for (var j = 0; j < len; j++)
|
||||
{
|
||||
if (logTypes == '0' || (logTypes != '0' && logTypes.indexOf(detailObj[caseDetail][j]['Type']) != -1))
|
||||
{
|
||||
if (detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('succee') != -1
|
||||
|| detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('passed') != -1)
|
||||
html += "<p style=\"background-color:rgb(0,255,0)\">" + detailObj[caseDetail][j]['Content'];
|
||||
else if (detailObj[caseDetail][j]['Type'] == 'TestStep')
|
||||
html += "<p style=\"background-color:rgb(0,255,255)\">" + detailObj[caseDetail][j]['Content'];
|
||||
else if (detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('failed') != -1)
|
||||
html += "<p style=\"background-color:red;color:white\">" + detailObj[caseDetail][j]['Content'];
|
||||
else html += "<p>" + detailObj[caseDetail][j]['Content'];
|
||||
}
|
||||
}
|
||||
html += html == "" ? "" : "</p>";
|
||||
len = detailObj['StandardOutTypes'].length;
|
||||
document.getElementById("tout").style.display = len == 0 ? 'none' : '';
|
||||
document.getElementById("out").style.display = len == 0 ? 'none' : '';
|
||||
document.getElementById("standardout").innerHTML = html;
|
||||
break;
|
||||
case "ErrorStackTrace":
|
||||
var html = '';
|
||||
len = detailObj[caseDetail].length;
|
||||
for (var j = 0; j < len; j++)
|
||||
html += "<p>" + detailObj[caseDetail][j];
|
||||
html += html == "" ? "" : "</p>";
|
||||
document.getElementById("ttrace").style.display = html == "" ? 'none' : '';
|
||||
document.getElementById("AfterErrorStackTrace").style.display = html == "" ? 'none' : '';
|
||||
document.getElementById("trace").innerHTML = html;
|
||||
break;
|
||||
case "ErrorMessage":
|
||||
var html = '';
|
||||
len = detailObj[caseDetail].length;
|
||||
for (var j = 0; j < len; j++)
|
||||
html += "<p>" + detailObj[caseDetail][j];
|
||||
html += html == "" ? "" : "</p>";
|
||||
document.getElementById("tmsg").style.display = html == "" ? 'none' : '';
|
||||
document.getElementById("AfterErrorMessage").style.display = html == "" ? 'none' : '';
|
||||
document.getElementById("msg").innerHTML = html;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Change fold/spread image
|
||||
function ChangeStyle(id)
|
||||
{
|
||||
var showdiv = document.getElementById(id);
|
||||
var showimg = document.getElementById("img" + id);
|
||||
if (showdiv.style.display == '')
|
||||
{
|
||||
showdiv.style.display = 'none';
|
||||
showimg.src = fold;
|
||||
}
|
||||
else
|
||||
{
|
||||
showdiv.style.display = '';
|
||||
showimg.src = spread;
|
||||
}
|
||||
}
|
||||
|
||||
// Set one frame in right_sidebar_case
|
||||
function SetOneFrame(value)
|
||||
{
|
||||
var frame = document.createElement("div");
|
||||
var img = document.createElement("img");
|
||||
switch (value)
|
||||
{
|
||||
case "ErrorStackTrace":
|
||||
frame.id = "ttrace";
|
||||
img.id = "imgtrace";
|
||||
img.onclick = function () { ChangeStyle('trace') };
|
||||
break;
|
||||
case "ErrorMessage":
|
||||
frame.id = "tmsg";
|
||||
img.id = "imgmsg";
|
||||
img.onclick = function () { ChangeStyle('msg') };
|
||||
break;
|
||||
case "StandardOut":
|
||||
frame.id = "tout";
|
||||
img.id = "imgout";
|
||||
img.onclick = function () { ChangeStyle('out') };
|
||||
break;
|
||||
}
|
||||
frame.className = "frame";
|
||||
img.className = "small";
|
||||
img.src = spread;
|
||||
frame.appendChild(img);
|
||||
frame.appendChild(document.createTextNode(value));
|
||||
return frame;
|
||||
}
|
||||
|
||||
// Set frames in right_sidebar_case
|
||||
function SetFrames()
|
||||
{
|
||||
var log = document.getElementById("log");
|
||||
log.appendChild(SetOneFrame("ErrorStackTrace"));
|
||||
log.appendChild(SetContentDiv("ErrorStackTrace"));
|
||||
var newLineAfterErrorStackTrace = document.createElement("br");
|
||||
newLineAfterErrorStackTrace.id = "AfterErrorStackTrace";
|
||||
log.appendChild(newLineAfterErrorStackTrace);
|
||||
|
||||
log.appendChild(SetOneFrame("ErrorMessage"));
|
||||
log.appendChild(SetContentDiv("ErrorMessage"));
|
||||
var newLineAfterErrorMessage = document.createElement("br");
|
||||
newLineAfterErrorMessage.id = "AfterErrorMessage";
|
||||
log.appendChild(newLineAfterErrorMessage);
|
||||
|
||||
log.appendChild(SetOneFrame("StandardOut"));
|
||||
log.appendChild(SetContentDiv("StandardOut"));
|
||||
}
|
||||
|
||||
// Set frame content div in right_sidebar_case
|
||||
function SetContentDiv(value)
|
||||
{
|
||||
var contentObj = document.createElement("div");
|
||||
switch (value)
|
||||
{
|
||||
case "ErrorStackTrace":
|
||||
contentObj.id = "trace";
|
||||
contentObj.className = "sub";
|
||||
break;
|
||||
case "ErrorMessage":
|
||||
contentObj.id = "msg";
|
||||
contentObj.className = "sub";
|
||||
break;
|
||||
case "StandardOut":
|
||||
contentObj.id = "out";
|
||||
var filterObj = document.createElement("div");
|
||||
filterObj.className = "filterframe";
|
||||
filterObj.appendChild(document.createTextNode('Log Filter '));
|
||||
var img = document.createElement("img");
|
||||
img.src = filter;
|
||||
img.height = 20;
|
||||
img.style.verticalAlign = "text-bottom";
|
||||
img.onclick = function () { MulselShow() };
|
||||
filterObj.appendChild(img);
|
||||
var filterConentObj = document.createElement("div");
|
||||
filterConentObj.id = "mulsel";
|
||||
filterConentObj.className = "filter";
|
||||
filterConentObj.style.display = 'none';
|
||||
var outcontentObj = document.createElement("div");
|
||||
outcontentObj.id = "standardout";
|
||||
outcontentObj.className = "sub";
|
||||
contentObj.appendChild(document.createElement("p"));
|
||||
contentObj.appendChild(filterObj);
|
||||
contentObj.appendChild(filterConentObj);
|
||||
contentObj.appendChild(outcontentObj);
|
||||
break;
|
||||
}
|
||||
return contentObj;
|
||||
}
|
||||
|
||||
// Set text content compatible with browser
|
||||
function CreateText(elem, textContent)
|
||||
{
|
||||
elem.appendChild(document.createTextNode(textContent));
|
||||
}
|
||||
|
||||
// Get user's choice about log filer
|
||||
function FilterLog(obj)
|
||||
{
|
||||
document.getElementById("mulsel").style.display = 'none';
|
||||
|
||||
if (obj.value == 'OK')
|
||||
{
|
||||
var mulsel = document.getElementById('mulsel');
|
||||
var logTypes = '';
|
||||
for (var i = 0; i < mulsel.children.length; i++)
|
||||
{
|
||||
if (mulsel.children[i].type == "checkbox" && mulsel.children[i].checked == true)
|
||||
logTypes += mulsel.children[i].value + ',';
|
||||
}
|
||||
}
|
||||
ShowDetail('StandardOut', logTypes);
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<style type="text/css">
|
||||
div#left_sidebar {width:29%;float:left;overflow:auto;overflow:scroll;overflow-x:hidden}
|
||||
div#back_to_summary {width:68%;float:left;overflow:auto;}
|
||||
div#right_sidebar_summary {width:68%;float:left;overflow:auto;margin-left:-2px}
|
||||
div#right_sidebar_case {width:68%;float:left;overflow:auto;margin-left:-2px}
|
||||
h1 {margin-bottom:0;}
|
||||
ul {margin:0;}
|
||||
li {list-style:none;}
|
||||
|
||||
body{
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
background-color: rgb(243,243,244);
|
||||
}
|
||||
h1.title{
|
||||
color: #1382CE;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
h1.caselist {
|
||||
color: #1382CE;
|
||||
font-weight: bolder;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
}
|
||||
|
||||
div.frame {
|
||||
color:white;
|
||||
border-style: groove;
|
||||
font-weight: bold;
|
||||
font-size: 110%;
|
||||
filter: alpha(opacity=30);
|
||||
border:none;
|
||||
padding:5px 5px 5px 5px;
|
||||
background-color:#1382CE;
|
||||
}
|
||||
|
||||
div {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.sub {
|
||||
margin-left:20px;
|
||||
}
|
||||
|
||||
a.hyper {
|
||||
font-size: 80%;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
font-weight:normal;
|
||||
color: #1382CE;
|
||||
background-color: #E2E2E2;
|
||||
padding: 5px 0px 5px 10px;
|
||||
display: block;
|
||||
-webkit-margin-before: 0.67em;
|
||||
-webkit-margin-start: 0px;
|
||||
-webkit-margin-end: 0px;
|
||||
}
|
||||
|
||||
a {
|
||||
font-size: 90%;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color:#E7E7E8;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
padding: 3px 6px 3px 6px;
|
||||
}
|
||||
|
||||
td {
|
||||
vertical-align: inherit;
|
||||
border-color: inherit;
|
||||
background-color:rgb(247,247,248);
|
||||
}
|
||||
|
||||
table {
|
||||
text-align: center;
|
||||
font-weight:700;
|
||||
font-size: 10pt;
|
||||
border-spacing: 2px;
|
||||
border-color: gray;
|
||||
border-spacing: 0 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
img.small{
|
||||
vertical-align:1px;
|
||||
margin-right:6px;
|
||||
}
|
||||
|
||||
img.result{
|
||||
vertical-align:middle;
|
||||
}
|
||||
|
||||
.normal{
|
||||
color:black;
|
||||
background-color:rgb(243,243,244);
|
||||
}
|
||||
|
||||
.highLight{
|
||||
color:white;
|
||||
background-color:rgb(91,155,213)
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- left side, show case list -->
|
||||
<div id="left_sidebar" style="padding-right:10px;border-right:2px solid">
|
||||
<br/>
|
||||
<h1 align="center"class="caselist">Case List</h1>
|
||||
<h5>     Group By
|
||||
<select onchange="ChangeSelect(this.value)" id="groupbyid" style="width:126px">
|
||||
<option value="1"selected="selected" >None</option>
|
||||
<option value="2">Test Result</option>
|
||||
<option value="3">Category</option>
|
||||
<option value="4">Class</option>
|
||||
</select>
|
||||
<br/>
|
||||
<p style="line-height:3px"/>
|
||||
     Keyword
|
||||
<input id="keyword" type="text" size=8 onkeyup="KeyShow(event.keyCode,this.value)" style="margin-left:3px"/>
|
||||
<input id="kwbtn" type="button" style="width:auto; height: 20px" onclick="KeywordGo()" value="Go"/>
|
||||
</h5>
|
||||
<hr style="border:1px dashed rgb(128, 128, 128); height:1px"/>
|
||||
<!--list side -->
|
||||
<div id="list">
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="js\functions.js"></script>
|
||||
|
||||
<script language="javascript" type="text/javascript">
|
||||
// listObj and summaryObj will be inserted above when cases are running.
|
||||
|
||||
CreateCaseList();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<!-- right side, show summary -->
|
||||
<div id="right_sidebar_summary" style="padding-left:10px;border-left:2px solid;">
|
||||
<h1 align="center" class="title">Summary</h1>
|
||||
<p id="time"align="left"/>
|
||||
<table id="tableid" width="600" height="60" border="1">
|
||||
<tr>
|
||||
<th scope="col">Total</th>
|
||||
<th scope="col">Passed</th>
|
||||
<th scope="col">Failed</th>
|
||||
<th scope="col">Inconclusive</th>
|
||||
<th scope="col">Pass Rate </th>
|
||||
</tr>
|
||||
</table>
|
||||
<br />
|
||||
<script language="javascript" type="text/javascript">
|
||||
ShowSummary();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<div id ="back_to_summary" style="padding-left:10px;display:none">
|
||||
<a class="hyper" onclick="ClickSummary(this)" id="summary" >
|
||||
<u>Back to Summary</u>
|
||||
</a>
|
||||
</div>
|
||||
<!-- right side, show case detail -->
|
||||
<div id="right_sidebar_case" style="display:none;padding-left:10px;border-left:2px solid;">
|
||||
<iframe id ="testcase" width="100%" onload="SetIFrameHeight(this)" frameborder="0"></iframe>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,86 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title></title>
|
||||
<style type="text/css">
|
||||
h1 {margin-bottom:0;}
|
||||
ul {margin:0;}
|
||||
|
||||
body{
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
background-color: rgb(243,243,244);
|
||||
}
|
||||
h1.title{
|
||||
color: #1382CE;
|
||||
font-family:Arial,Verdana,Sans-serif;
|
||||
font-weight: bold;
|
||||
font-size:20px;
|
||||
}
|
||||
|
||||
div.frame {
|
||||
color:white;
|
||||
border-style: groove;
|
||||
font-weight: bold;
|
||||
font-size: 110%;
|
||||
filter: alpha(opacity=30);
|
||||
border:none;
|
||||
padding:5px 5px 5px 5px;
|
||||
background-color:#1382CE;
|
||||
}
|
||||
|
||||
|
||||
div.filter {
|
||||
background-color:White;
|
||||
border:1px solid;
|
||||
border-color:grey;
|
||||
font-size:10px;
|
||||
position:absolute;left:20px;
|
||||
margin-left:65px;
|
||||
padding-right:5px;
|
||||
padding-bottom:5px;
|
||||
}
|
||||
|
||||
div.filterframe {
|
||||
font-size:12px;
|
||||
font-weight: bold;
|
||||
margin-left:20px;
|
||||
}
|
||||
|
||||
div {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.sub {
|
||||
margin-left:20px;
|
||||
}
|
||||
|
||||
img.small{
|
||||
vertical-align:1px;
|
||||
margin-right:6px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1 align="center" class="title" id="right_sidebar_case_title"></h1>
|
||||
<p align="left" id="casetime" style="font-size:12px"></p>
|
||||
<div id="log">
|
||||
</div>
|
||||
</body>
|
||||
<script type="text/javascript" src="..\js\functions.js"></script>
|
||||
|
||||
<script language="javascript" type="text/javascript">
|
||||
// detailObj will be inserted above when cases are running
|
||||
|
||||
SetFrames();
|
||||
ShowDetail('time', '0');
|
||||
ShowDetail('StandardOut', '0');
|
||||
ShowDetail('ErrorStackTrace', '0');
|
||||
ShowDetail('ErrorMessage', '0');
|
||||
|
||||
</script>
|
||||
</html>
|
|
@ -0,0 +1,426 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web.Script.Serialization;
|
||||
using System.Xml;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools
|
||||
{
|
||||
/// <summary>
|
||||
/// Translates the data from txt to js as json, adds category to the test cases
|
||||
/// </summary>
|
||||
public class TxtToJSON
|
||||
{
|
||||
// The path to category.js which stores the map between case name and category
|
||||
public string CaseCategoryFile = Path.Combine(Directory.GetCurrentDirectory(), "category.js");
|
||||
// Path list to Binary files of the test cases
|
||||
private static List<string> dllFiles = new List<string>();
|
||||
// Stores the map between case name and class
|
||||
private Dictionary<string, string> caseClass = new Dictionary<string, string>();
|
||||
// Auxiliary variable to save information as JSON
|
||||
private JavaScriptSerializer serializer = new JavaScriptSerializer();
|
||||
|
||||
private enum LogType
|
||||
{
|
||||
None = -1,
|
||||
ErrorStackTrace = 1,
|
||||
ErrorMessage = 2,
|
||||
StandardOut = 3
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Translates List<DataType.TestCase> to DataType.TestCasesSummary string
|
||||
/// </summary>
|
||||
/// <param name="resultFolder">Test result folder, in which log is stored as txt</param>
|
||||
/// <param name="captureFolder">The path to the capture files need to be placed</param>
|
||||
/// <returns>Returns detailed test cases information</returns>
|
||||
public string TestCasesString(string resultFolder, string captureFolder)
|
||||
{
|
||||
List<DataType.TestCase> testCaseList = GetTestCaseList(resultFolder, captureFolder);
|
||||
DataType.TestCasesSummary rs = new DataType.TestCasesSummary()
|
||||
{
|
||||
TestCases = testCaseList,
|
||||
TestCasesCategories = GetTestCaseCategortyList(testCaseList),
|
||||
TestCasesClasses = GetTestCaseClassList(testCaseList)
|
||||
};
|
||||
return (serializer.Serialize(rs));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs details of test case.
|
||||
/// 1. Gets log from the txt file
|
||||
/// 2. Copies capture to the log folder, and saves the path.
|
||||
/// </summary>
|
||||
/// <param name="txtfile">The path to the log txt file which contains the detail log</param>
|
||||
/// <returns>Returns the log information</returns>
|
||||
public string ConstructCaseDetail(string txtfile, string captureFolder)
|
||||
{
|
||||
FileStream fs = new FileStream(txtfile, FileMode.Open);
|
||||
string type = ""; // Help judge whether the line is the end of the file, help distinguish file content
|
||||
StreamReader sr = new StreamReader(fs);
|
||||
string line;
|
||||
string content = "";
|
||||
string standardOutType = "";
|
||||
DataType.TestCaseDetail caseDetail = new DataType.TestCaseDetail(sr.ReadLine(), sr.ReadLine(), sr.ReadLine(), sr.ReadLine());
|
||||
DataType.StandardOutDetail stdDetail;
|
||||
string dllFile = sr.ReadLine();
|
||||
if (!dllFiles.Contains(dllFile))
|
||||
{
|
||||
dllFiles.Add(dllFile);
|
||||
}
|
||||
while ((line = sr.ReadLine()) != null)
|
||||
{
|
||||
if (line == "") //Rule out blank line
|
||||
continue;
|
||||
|
||||
if (line.StartsWith("==========="))
|
||||
{
|
||||
type = line.Replace("=", "");
|
||||
continue;
|
||||
}
|
||||
|
||||
LogType eType = (LogType)Enum.Parse(typeof(LogType), type);
|
||||
switch (eType)
|
||||
{
|
||||
case LogType.ErrorStackTrace:
|
||||
caseDetail.ErrorStackTrace.Add(line);
|
||||
break;
|
||||
case LogType.ErrorMessage:
|
||||
caseDetail.ErrorMessage.Add(line);
|
||||
break;
|
||||
case LogType.StandardOut:
|
||||
int begin = line.IndexOf('[');
|
||||
int end = line.IndexOf(']');
|
||||
|
||||
if (begin != -1 && end != -1)
|
||||
{
|
||||
if (standardOutType != "")
|
||||
{
|
||||
stdDetail = new DataType.StandardOutDetail()
|
||||
{
|
||||
Content = content,
|
||||
Type = standardOutType
|
||||
};
|
||||
caseDetail.StandardOut.Add(stdDetail);
|
||||
}
|
||||
if (end > begin && end < line.Length)
|
||||
{
|
||||
standardOutType = line.Substring(begin + 1, end - begin - 1);
|
||||
if (!caseDetail.StandardOutTypes.Contains(standardOutType))
|
||||
caseDetail.StandardOutTypes.Add(standardOutType);
|
||||
}
|
||||
content = line;
|
||||
}
|
||||
else
|
||||
content += line;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
stdDetail = new DataType.StandardOutDetail()
|
||||
{
|
||||
Content = content,
|
||||
Type = standardOutType
|
||||
};
|
||||
fs.Close();
|
||||
caseDetail.StandardOut.Add(stdDetail);
|
||||
|
||||
caseDetail.CapturePath = CopyCaptureAndReturnPath(caseDetail.Name, captureFolder);
|
||||
|
||||
return (serializer.Serialize(caseDetail));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the statistical information
|
||||
/// </summary>
|
||||
/// <param name="totalCasesNum">The number of total cases</param>
|
||||
/// <param name="passedNum">The number of passed cases</param>
|
||||
/// <param name="failedNum">The number of failed cases</param>
|
||||
/// <param name="testRunStartTime">The start time of the run</param>
|
||||
/// <param name="testRunEndTime">The end time of the run</param>
|
||||
/// <returns>Return statistical information about this test</returns>
|
||||
public string SummaryTable(long totalCasesNum,
|
||||
long passedNum,
|
||||
long failedNum,
|
||||
DateTimeOffset testRunStartTime,
|
||||
DateTimeOffset testRunEndTime)
|
||||
{
|
||||
DataType.RunSummary sry = new DataType.RunSummary()
|
||||
{
|
||||
TotalCount = totalCasesNum,
|
||||
FailedCount = failedNum,
|
||||
PassedCount = passedNum,
|
||||
InconclusiveCount = totalCasesNum - passedNum - failedNum,
|
||||
PassRate = totalCasesNum == 0 ? 0 : (float)passedNum * 100 / totalCasesNum,
|
||||
StartTime = testRunStartTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"),
|
||||
EndTime = testRunEndTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"),
|
||||
Duration = testRunEndTime.Subtract(testRunStartTime).ToString(@"hh\:mm\:ss")
|
||||
};
|
||||
return (serializer.Serialize(sry));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates all test cases categories js file
|
||||
/// </summary>
|
||||
private void GenerateCaseCategoryFile()
|
||||
{
|
||||
Dictionary<string, List<string>> testCases = GetTestCaseCategories();
|
||||
string sTestCases = serializer.Serialize(testCases);
|
||||
File.WriteAllText(CaseCategoryFile, sTestCases);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets test case categories by analyzing the test dll files
|
||||
/// </summary>
|
||||
/// <returns>Returns case name(key) and categories(value)</returns>
|
||||
private Dictionary<string, List<string>> GetTestCaseCategories()
|
||||
{
|
||||
Dictionary<string, List<string>> testCases = new Dictionary<string, List<string>>();
|
||||
DirectoryInfo info = new DirectoryInfo(Directory.GetCurrentDirectory());
|
||||
bool existBatch = false;
|
||||
if (info.FullName.EndsWith("Batch"))
|
||||
existBatch = true;
|
||||
|
||||
string fullPath = existBatch ? info.Parent.FullName : info.FullName;
|
||||
foreach (string dllPath in dllFiles)
|
||||
{
|
||||
string dllFile = dllPath;
|
||||
if (string.IsNullOrEmpty(dllFile))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (dllPath.StartsWith(".."))
|
||||
{
|
||||
dllFile = dllPath.Substring(3);
|
||||
dllFile = Path.Combine(fullPath, dllFile);
|
||||
}
|
||||
try
|
||||
{
|
||||
Assembly assembly = Assembly.LoadFrom(dllFile);
|
||||
Type[] types = assembly.GetTypes();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
//search for class, out interfaces and other type
|
||||
if (!type.IsClass)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
MethodInfo[] methods = type.GetMethods();
|
||||
|
||||
foreach (MethodInfo method in methods)
|
||||
{
|
||||
//methods loop, search for methods with TestMethodAttribute
|
||||
object[] objs = method.GetCustomAttributes(false);
|
||||
foreach (object obj in objs)
|
||||
{
|
||||
//TestMethods
|
||||
if (obj.GetType().Name != "TestMethodAttribute" || testCases.ContainsKey(method.Name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
//GetCategory
|
||||
List<string> categories = new List<string>();
|
||||
foreach (object attribute in objs)
|
||||
{
|
||||
//record TestCategories
|
||||
if (attribute.GetType().Name == "TestCategoryAttribute")
|
||||
{
|
||||
PropertyInfo property = attribute.GetType().GetProperty("TestCategories");
|
||||
object category = property.GetValue(attribute, null);
|
||||
foreach (string str in (System.Collections.ObjectModel.ReadOnlyCollection<string>)category)
|
||||
{
|
||||
categories.Add(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
testCases.Add(method.Name, categories);
|
||||
caseClass.Add(method.Name, type.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
System.Console.WriteLine("skip {0}", dllFile);
|
||||
}
|
||||
}
|
||||
return testCases;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the test case list with basic information
|
||||
/// </summary>
|
||||
/// <param name="resultFolder">The path to the result folder</param>
|
||||
/// <param name="captureFolder">The path to the capture folder</param>
|
||||
/// <returns>Returns the test case list with basic information</returns>
|
||||
private List<DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder)
|
||||
{
|
||||
List<DataType.TestCase> testCaseList = new List<DataType.TestCase>();
|
||||
|
||||
if (!File.Exists(CaseCategoryFile))
|
||||
{
|
||||
GenerateCaseCategoryFile();
|
||||
}
|
||||
|
||||
string sJSON = File.ReadAllText(CaseCategoryFile);
|
||||
Dictionary<string, List<string>> testCases = serializer.Deserialize<Dictionary<string, List<string>>>(sJSON);
|
||||
string[] txtfiles = Directory.GetFiles(resultFolder);
|
||||
foreach (var file in txtfiles)
|
||||
{
|
||||
string caseName = Path.GetFileNameWithoutExtension(file);
|
||||
int i = caseName.IndexOf('_');
|
||||
caseName = caseName.Substring(i + 1); // out the sort id
|
||||
i = caseName.IndexOf('_');
|
||||
string caseStatus = caseName.Substring(0, i);
|
||||
caseName = caseName.Substring(i + 1);
|
||||
DataType.TestCase tc = new DataType.TestCase()
|
||||
{
|
||||
Name = caseName,
|
||||
Result = caseStatus,
|
||||
ClassType = caseClass.ContainsKey(caseName) ? caseClass[caseName] : null,
|
||||
Category = testCases.ContainsKey(caseName) ? testCases[caseName] : null,
|
||||
};
|
||||
testCaseList.Add(tc);
|
||||
}
|
||||
return testCaseList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the test case category list
|
||||
/// </summary>
|
||||
/// <param name="testCaseList">The test cases</param>
|
||||
/// <returns>Returns test cases categories</returns>
|
||||
private List<string> GetTestCaseCategortyList(List<DataType.TestCase> testCaseList)
|
||||
{
|
||||
List<string> listCaseCategory = new List<string>();
|
||||
foreach (DataType.TestCase testCase in testCaseList)
|
||||
{
|
||||
listCaseCategory.AddRange(testCase.Category);
|
||||
}
|
||||
listCaseCategory = listCaseCategory.Distinct().ToList();
|
||||
listCaseCategory.Sort();
|
||||
return listCaseCategory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the test case class list
|
||||
/// </summary>
|
||||
/// <param name="testCaseList">The test cases</param>
|
||||
/// <returns>Returns the test cases class list</returns>
|
||||
private List<string> GetTestCaseClassList(List<DataType.TestCase> testCaseList)
|
||||
{
|
||||
List<string> listCaseClass = new List<string>();
|
||||
foreach (DataType.TestCase testCase in testCaseList)
|
||||
{
|
||||
listCaseClass.Add(testCase.ClassType);
|
||||
}
|
||||
listCaseClass = listCaseClass.Distinct().ToList();
|
||||
listCaseClass.Sort();
|
||||
return listCaseClass;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the path to the capture file folder from .ptfconfig file
|
||||
/// </summary>
|
||||
/// <returns>Returns a list of capture file path when the NetworkCapture is enabled. Returns null when the NetworkCapture is not enabled.</returns>
|
||||
private List<string> GetCaptureFilesPath()
|
||||
{
|
||||
List<string> captureFolders = new List<string>();
|
||||
DirectoryInfo info = new DirectoryInfo(Directory.GetCurrentDirectory());
|
||||
bool existBatch = false;
|
||||
if (info.FullName.EndsWith("Batch"))
|
||||
existBatch = true;
|
||||
string fullPath = existBatch ? info.Parent.FullName : info.FullName;
|
||||
string cfgFolder = Path.Combine(fullPath, "bin");
|
||||
string[] ptfconfigFiles = Directory.GetFiles(cfgFolder, "*.ptfconfig", SearchOption.TopDirectoryOnly);
|
||||
try
|
||||
{
|
||||
foreach (string configFile in ptfconfigFiles)
|
||||
{
|
||||
XmlDocument configXml = new XmlDocument();
|
||||
configXml.Load(configFile);
|
||||
|
||||
XmlNodeList groupNodes = configXml.GetElementsByTagName("Group");
|
||||
if (groupNodes == null || groupNodes.Count <= 0) { continue; }
|
||||
|
||||
bool isNetworkCaptureEnabled = false;
|
||||
string captureFileFolder = null;
|
||||
foreach (XmlNode gNode in groupNodes)
|
||||
{
|
||||
if (gNode.Attributes["name"].Value == "NetworkCapture")
|
||||
{
|
||||
foreach (XmlNode pNode in gNode.ChildNodes)
|
||||
{
|
||||
if (pNode.Attributes["name"].Value == "Enabled")
|
||||
{
|
||||
isNetworkCaptureEnabled = bool.Parse(pNode.Attributes["value"].Value);
|
||||
}
|
||||
if (pNode.Attributes["name"].Value == "CaptureFileFolder")
|
||||
{
|
||||
captureFileFolder = pNode.Attributes["value"].Value;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isNetworkCaptureEnabled) { continue; }
|
||||
|
||||
if (!string.IsNullOrEmpty(captureFileFolder))
|
||||
{
|
||||
captureFolders.Add(captureFileFolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return captureFolders;
|
||||
}
|
||||
return captureFolders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies a specified capture file to the log folder and returns the destination path.
|
||||
/// </summary>
|
||||
/// <param name="caseName">The specified case name</param>
|
||||
/// <param name="captureFolder">The path of the destination capture folder</param>
|
||||
/// <returns>Returns the destination path of the specified case name</returns>
|
||||
private string CopyCaptureAndReturnPath(string caseName, string captureFolder)
|
||||
{
|
||||
List<string> srcCaptureFolders = GetCaptureFilesPath();
|
||||
|
||||
foreach (string srcCapturePath in srcCaptureFolders)
|
||||
{
|
||||
if (string.IsNullOrEmpty(srcCapturePath) || !Directory.Exists(srcCapturePath))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string[] files = Directory.GetFiles(srcCapturePath, string.Format("*{0}.etl", caseName));
|
||||
foreach (var file in files)
|
||||
{
|
||||
string captureName = Path.GetFileNameWithoutExtension(file); // Get file name
|
||||
captureName = captureName.Substring(captureName.IndexOf('#') + 1);
|
||||
if (String.Compare(captureName, caseName, true) != 0)
|
||||
continue;
|
||||
string desCapturePath = Path.Combine(captureFolder, Path.GetFileName(file));
|
||||
if (File.Exists(desCapturePath))
|
||||
{
|
||||
File.Delete(desCapturePath);
|
||||
}
|
||||
File.Copy(file, desCapturePath);
|
||||
return desCapturePath;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReportingTool", "reportingtool\ReportingTool.csproj", "{FABD7966-6611-4556-92CB-B13D7425AE82}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools", "testtools\TestTools.csproj", "{1CA2B935-3224-40F1-84BC-47FA1A9B242E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.VSTS", "testtools.vsts\TestTools.VSTS.csproj", "{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Extension", "TestTools.Extension\TestTools.Extension.csproj", "{E41414B3-95F3-430F-823B-55B82F0BA198}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Messages.Runtime", "testtools.messages.runtime\TestTools.Messages.Runtime.csproj", "{5D50C8BD-F26A-4A45-9D4A-025163B894BD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.ExtendedLogging", "TestTools.ExtendedLogging\TestTools.ExtendedLogging.csproj", "{EEB7AC20-C23F-447A-A2E7-E92519592DB0}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{63D7F908-6684-4FCB-9FF3-4A0A02CBFD1E}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
SharedAssemblyInfo.cs = SharedAssemblyInfo.cs
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlTestLogger", "htmltestlogger\HtmlTestLogger.csproj", "{8A100541-699B-4011-B184-01B70D534B5E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{FABD7966-6611-4556-92CB-B13D7425AE82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FABD7966-6611-4556-92CB-B13D7425AE82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FABD7966-6611-4556-92CB-B13D7425AE82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FABD7966-6611-4556-92CB-B13D7425AE82}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8A100541-699B-4011-B184-01B70D534B5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8A100541-699B-4011-B184-01B70D534B5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8A100541-699B-4011-B184-01B70D534B5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8A100541-699B-4011-B184-01B70D534B5E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,208 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Microsoft.Protocols.ReportingTool
|
||||
{
|
||||
internal enum DerivedType
|
||||
{
|
||||
Unknown = 0,
|
||||
Inferred,
|
||||
Partial,
|
||||
Cases
|
||||
}
|
||||
|
||||
internal enum CoveredStatus
|
||||
{
|
||||
Unverified = 0,
|
||||
Partial,
|
||||
Verified
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A structure represent the current derived requirement.
|
||||
/// use this structure to build a graph of derived requirements.
|
||||
/// </summary>
|
||||
internal struct DerivedRequirement
|
||||
{
|
||||
private string id;
|
||||
private List<string> originalReqs;
|
||||
private Dictionary<string, DerivedType> derivedReqs;
|
||||
private CoveredStatus status;
|
||||
private string timeStamp;
|
||||
|
||||
/// <summary>
|
||||
/// The constructor.
|
||||
/// </summary>
|
||||
/// <param name="id">The requirement ID.</param>
|
||||
/// <param name="status">The requirement covered status.</param>
|
||||
public DerivedRequirement(string id, CoveredStatus status)
|
||||
{
|
||||
this.id = id;
|
||||
this.status = status;
|
||||
this.timeStamp = string.Empty;
|
||||
originalReqs = new List<string>();
|
||||
derivedReqs = new Dictionary<string, DerivedType>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add parent requirement.
|
||||
/// </summary>
|
||||
/// <param name="reqID">The requirement ID.</param>
|
||||
public void AddOriginalRequirement(string reqID)
|
||||
{
|
||||
if (!originalReqs.Contains(reqID))
|
||||
{
|
||||
originalReqs.Add(reqID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ReportingLog.Log != null)
|
||||
{
|
||||
ReportingLog.Log.TraceWarning(
|
||||
string.Format("Found duplicate original requirement {0} in requirement {1}.", reqID, id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove the relationship of the requirements
|
||||
/// </summary>
|
||||
/// <param name="reqId">The target requirment ID</param>
|
||||
public void RemoveOriginalRequirement(string reqId)
|
||||
{
|
||||
if (originalReqs.Contains(reqId))
|
||||
{
|
||||
originalReqs.Remove(reqId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add child requirement.
|
||||
/// </summary>
|
||||
/// <param name="reqID">The requirement ID.</param>
|
||||
/// <param name="type">The derived requirement type.</param>
|
||||
public void AddDerivedRequirement(string reqID, DerivedType type)
|
||||
{
|
||||
//self loop
|
||||
if (reqID == this.id)
|
||||
{
|
||||
throw new InvalidOperationException("Found loop in the derived requirements: " + reqID + " is derived from itself.");
|
||||
}
|
||||
if (!derivedReqs.ContainsKey(reqID))
|
||||
{
|
||||
derivedReqs.Add(reqID, type);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ReportingLog.Log != null)
|
||||
{
|
||||
ReportingLog.Log.TraceWarning(
|
||||
string.Format("Found duplicate derived requirement {0} in requirement {1}.", reqID, id));
|
||||
}
|
||||
derivedReqs[reqID] = type;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// remove relationship of the requirements
|
||||
/// </summary>
|
||||
/// <param name="reqID">The target requirement ID</param>
|
||||
public void RemoveDerivedRequirement(string reqID)
|
||||
{
|
||||
if (derivedReqs.ContainsKey(reqID))
|
||||
{
|
||||
derivedReqs.Remove(reqID);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ID of current derived requirement.
|
||||
/// </summary>
|
||||
public string ReqID
|
||||
{
|
||||
get
|
||||
{
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or Sets the covered status of current derived requirement.
|
||||
/// </summary>
|
||||
public CoveredStatus CoveredStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return status;
|
||||
}
|
||||
set
|
||||
{
|
||||
status = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parent requirements.
|
||||
/// </summary>
|
||||
public List<string> OriginalReqs
|
||||
{
|
||||
get
|
||||
{
|
||||
return originalReqs;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the direct or undirect derived requirements.
|
||||
/// </summary>
|
||||
public Dictionary<string, DerivedType> DerivedReqs
|
||||
{
|
||||
get
|
||||
{
|
||||
return derivedReqs;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the count of case type requirements derived from the current requirement.
|
||||
/// </summary>
|
||||
public uint CaseCount
|
||||
{
|
||||
get
|
||||
{
|
||||
uint count = 0;
|
||||
foreach (KeyValuePair<string, DerivedType> kvp in derivedReqs)
|
||||
{
|
||||
if (kvp.Value == DerivedType.Cases)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the time stamp string for the current requirement.
|
||||
/// </summary>
|
||||
public string TimeStamp
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrEmpty(timeStamp))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return timeStamp;
|
||||
}
|
||||
set
|
||||
{
|
||||
timeStamp = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,670 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Xml.Schema;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Microsoft.Protocols.ReportingTool
|
||||
{
|
||||
internal class ReportingParameters
|
||||
{
|
||||
private StringCollection xmlLogs;
|
||||
private StringCollection requirementTables;
|
||||
private string rsPrefix;
|
||||
private bool inScopeOverrided;
|
||||
private bool outScopeOverrided;
|
||||
public ReportingParameters()
|
||||
{
|
||||
}
|
||||
public StringCollection XmlLogs
|
||||
{
|
||||
get
|
||||
{
|
||||
if (xmlLogs == null)
|
||||
{
|
||||
xmlLogs = new StringCollection();
|
||||
}
|
||||
return xmlLogs;
|
||||
}
|
||||
}
|
||||
public StringCollection RequirementTables
|
||||
{
|
||||
get
|
||||
{
|
||||
if (requirementTables == null)
|
||||
{
|
||||
requirementTables = new StringCollection();
|
||||
}
|
||||
return requirementTables;
|
||||
}
|
||||
}
|
||||
|
||||
private string outputFile;
|
||||
|
||||
public String OutputFile
|
||||
{
|
||||
set
|
||||
{
|
||||
if (String.IsNullOrEmpty(outputFile))
|
||||
{
|
||||
outputFile = value;
|
||||
if (!value.EndsWith(".html") && !value.EndsWith(".htm"))
|
||||
{
|
||||
outputFile += ".html";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException("[ERROR] Duplicate output filename parameter specified.");
|
||||
}
|
||||
}
|
||||
get
|
||||
{
|
||||
if (String.IsNullOrEmpty(outputFile))
|
||||
{
|
||||
// default reporting filename
|
||||
return String.Format("report{0}.html",
|
||||
DateTime.Now.ToString("yyyyMMddhhmmss"));
|
||||
}
|
||||
else
|
||||
{
|
||||
return outputFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A string prefix from the TD name, the format is "prefix_R".
|
||||
/// </summary>
|
||||
public string RSPrefix
|
||||
{
|
||||
get
|
||||
{
|
||||
return rsPrefix;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
rsPrefix = value;
|
||||
if (rsPrefix.Contains(" "))
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Prefix cannot contain spaces.");
|
||||
}
|
||||
|
||||
//remove end "_"
|
||||
Regex regex = new Regex(@"_+\b");
|
||||
rsPrefix = regex.Replace(rsPrefix, "");
|
||||
|
||||
if (!rsPrefix.EndsWith("_R"))
|
||||
{
|
||||
rsPrefix += "_R";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rsPrefix = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if all required arguments are meet.
|
||||
/// There must at least one reabable test log file and at least one reabable requirement table file.
|
||||
/// Check if files specified by parameters are available to read.
|
||||
/// Check if output file has already exists, if it is writable.
|
||||
/// </summary>
|
||||
public void Validate(bool scopeMode)
|
||||
{
|
||||
bool logflag = XmlLogs.Count > 0;
|
||||
bool tableflag = RequirementTables.Count > 0;
|
||||
if (!logflag)
|
||||
{
|
||||
throw new InvalidOperationException("[ERROR] Test log file name is not specified.");
|
||||
}
|
||||
if (!tableflag)
|
||||
{
|
||||
throw new InvalidOperationException("[ERROR] Requirement Specification file name is not specified.");
|
||||
}
|
||||
StringCollection invalidfiles = ValidateExistence();
|
||||
|
||||
// warning user the invalid files.
|
||||
if (invalidfiles.Count > 0)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (string filename in invalidfiles)
|
||||
{
|
||||
sb.AppendLine(filename);
|
||||
}
|
||||
throw new InvalidOperationException(
|
||||
String.Format("[ERROR] Unable to find the files: {0}", sb.ToString()));
|
||||
}
|
||||
|
||||
ParseScopeRules(scopeMode);
|
||||
|
||||
// check req table files against internal schema
|
||||
using (TextReader tr = new StringReader(Resource.requirementTable))
|
||||
{
|
||||
XmlSchemaSet schemaSet = new XmlSchemaSet();
|
||||
schemaSet.Add(null, XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null }));
|
||||
foreach (string filename in RequirementTables)
|
||||
{
|
||||
// Create XML settings.
|
||||
XmlReaderSettings settings = new XmlReaderSettings();
|
||||
settings.ValidationType = ValidationType.Schema;
|
||||
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
|
||||
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessIdentityConstraints;
|
||||
settings.Schemas = schemaSet;
|
||||
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
|
||||
settings.XmlResolver = null;
|
||||
validateResult = true;
|
||||
using (XmlReader reader = XmlReader.Create(filename, settings))
|
||||
{
|
||||
//Read and validate the XML data.
|
||||
while (reader.Read()) { }
|
||||
}
|
||||
if (!validateResult)
|
||||
{
|
||||
// Validation failed return false;
|
||||
throw new InvalidOperationException(
|
||||
String.Format("[ERROR] Error occured while validating requirement table file {0}.\r\nTechnical details:\r\n{1}", filename, validateErrorMessages));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check output file
|
||||
if (File.Exists(OutputFile))
|
||||
{
|
||||
FileStream fs = null;
|
||||
try
|
||||
{
|
||||
fs = File.OpenWrite(OutputFile);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("[ERROR] Unable to open file {0} for reporting result output. Details:\r\n{1}",
|
||||
OutputFile, e.Message));
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (fs != null)
|
||||
{
|
||||
fs.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private StringCollection ValidateExistence()
|
||||
{
|
||||
StringCollection validfiles = new StringCollection();
|
||||
StringCollection invalidfiles = new StringCollection();
|
||||
|
||||
// remove all invalid log files
|
||||
foreach (string filename in XmlLogs)
|
||||
{
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
FileInfo fi = new FileInfo(filename);
|
||||
validfiles.Add(fi.FullName.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
invalidfiles.Add(filename);
|
||||
}
|
||||
}
|
||||
xmlLogs.Clear();
|
||||
foreach (string filename in validfiles)
|
||||
{
|
||||
if (!xmlLogs.Contains(filename))
|
||||
{
|
||||
xmlLogs.Add(filename);
|
||||
}
|
||||
}
|
||||
validfiles.Clear();
|
||||
|
||||
// remove all invalid req table files
|
||||
foreach (string filename in RequirementTables)
|
||||
{
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
FileInfo fi = new FileInfo(filename);
|
||||
validfiles.Add(fi.FullName.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
invalidfiles.Add(filename);
|
||||
}
|
||||
}
|
||||
requirementTables.Clear();
|
||||
foreach (string filename in validfiles)
|
||||
{
|
||||
if (!requirementTables.Contains(filename))
|
||||
{
|
||||
requirementTables.Add(filename);
|
||||
}
|
||||
}
|
||||
return invalidfiles;
|
||||
}
|
||||
|
||||
public static string inScopeRule = "inScopeRule";
|
||||
public static string outScopeRule = "outScopeRule";
|
||||
|
||||
Dictionary<string, List<string>> scopeRules = new Dictionary<string, List<string>>();
|
||||
/// <summary>
|
||||
/// Gets the in/out scope rules for the scope value.
|
||||
/// </summary>
|
||||
public Dictionary<string, List<string>> ScopeRules
|
||||
{
|
||||
get
|
||||
{
|
||||
return scopeRules;
|
||||
}
|
||||
}
|
||||
|
||||
private void ParseScopeRules(bool isScopeMode)
|
||||
{
|
||||
if (isScopeMode)
|
||||
{
|
||||
// error handling for in/out scope parameters.
|
||||
if (!inScopeOverrided && !outScopeOverrided)
|
||||
{
|
||||
throw new InvalidOperationException("Please explicitly specify in/out scope parameters.");
|
||||
}
|
||||
else if (inScopeOverrided && !outScopeOverrided)
|
||||
{
|
||||
throw new InvalidOperationException("Please explicitly specify out-of-scope parameter.");
|
||||
}
|
||||
else if (!inScopeOverrided && outScopeOverrided)
|
||||
{
|
||||
throw new InvalidOperationException("Please explicitly specify in-scope parameter.");
|
||||
}
|
||||
}
|
||||
|
||||
string[] inscopes = this.inScopeString.Split('+');
|
||||
foreach (string inscope in inscopes)
|
||||
{
|
||||
if (!scopeRules.ContainsKey(inScopeRule))
|
||||
{
|
||||
scopeRules[inScopeRule] = new List<string>();
|
||||
if (string.Compare(inscope, noneValue, true) != 0)
|
||||
{
|
||||
scopeRules[inScopeRule].Add(inscope.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (inscopes.Length > 1)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"None keyword is not allowed as the in scope value. If no value specified to in-scope, please use 'None' only.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!scopeRules[inScopeRule].Contains(inscope.ToLower()))
|
||||
{
|
||||
if (string.Compare(inscope, noneValue, true) != 0)
|
||||
{
|
||||
scopeRules[inScopeRule].Add(inscope.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"None keyword is not allowed as the in scope value. If no value specified to in-scope, please use 'None' only.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string[] outscopes = this.outScopeString.Split('+');
|
||||
foreach (string outscope in outscopes)
|
||||
{
|
||||
if (!scopeRules.ContainsKey(outScopeRule))
|
||||
{
|
||||
scopeRules[outScopeRule] = new List<string>();
|
||||
if (string.Compare(outscope, noneValue, true) != 0)
|
||||
{
|
||||
scopeRules[outScopeRule].Add(outscope.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (outscopes.Length > 1)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"None keyword is not allowed as the in-scope value. If no value specified to in scope, please use 'None' only.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!scopeRules[outScopeRule].Contains(outscope.ToLower()))
|
||||
{
|
||||
if (string.Compare(outscope, noneValue, true) != 0)
|
||||
{
|
||||
scopeRules[outScopeRule].Add(outscope.ToLower());
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"None keyword is not allowed as the out-of-scope value. If no value specified to out scope, please use 'None' only.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool validateResult;
|
||||
private static string validateErrorMessages;
|
||||
static private void ValidationCallBack(object sender, ValidationEventArgs args)
|
||||
{
|
||||
// Validation failed. Treat warning as failure
|
||||
validateResult = false;
|
||||
validateErrorMessages = args.Message;
|
||||
}
|
||||
|
||||
private bool prefix;
|
||||
|
||||
public bool Prefix
|
||||
{
|
||||
get { return prefix; }
|
||||
set
|
||||
{
|
||||
prefix = value;
|
||||
if (prefix)
|
||||
{
|
||||
log = false;
|
||||
table = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool log;
|
||||
|
||||
public bool Log
|
||||
{
|
||||
get { return log; }
|
||||
set
|
||||
{
|
||||
log = value;
|
||||
if (log)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool table;
|
||||
|
||||
public bool Table
|
||||
{
|
||||
get { return table; }
|
||||
set
|
||||
{
|
||||
table = value;
|
||||
if (table)
|
||||
{
|
||||
prefix = false;
|
||||
log = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool output;
|
||||
|
||||
public bool Output
|
||||
{
|
||||
get { return output; }
|
||||
set
|
||||
{
|
||||
output = value;
|
||||
if (output)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
log = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//reporting tool will not replace the old report file by default
|
||||
//user can set /r or /replace switch to replace the old report file
|
||||
private bool replace;
|
||||
|
||||
public bool Replace
|
||||
{
|
||||
get { return replace; }
|
||||
set
|
||||
{
|
||||
replace = value;
|
||||
if (replace)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
log = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool inScope;
|
||||
public bool InScope
|
||||
{
|
||||
get { return inScope; }
|
||||
set
|
||||
{
|
||||
inScope = value;
|
||||
if (inScope)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
log = false;
|
||||
output = false;
|
||||
outScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool outScope;
|
||||
public bool OutScope
|
||||
{
|
||||
get { return outScope; }
|
||||
set
|
||||
{
|
||||
outScope = value;
|
||||
if (outScope)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
log = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
deltaScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//the scope parameter should match the format like XXX[+XXX]*, spaces are not allowed.
|
||||
Regex regex = new Regex("^\\w+(\\+\\w+)*$", RegexOptions.Compiled);
|
||||
readonly string noneValue = "none";
|
||||
|
||||
//default value of inscope is Server+Both
|
||||
private string inScopeString = "Server+Both";
|
||||
public string InScopeString
|
||||
{
|
||||
get
|
||||
{
|
||||
return inScopeString;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (regex.IsMatch(value) || string.Compare(noneValue, value, true) == 0)
|
||||
{
|
||||
inScopeString = value;
|
||||
inScopeOverrided = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("Invalid inscope string fomat \"{0}\", please use the correct format e.g. Server+Both. "
|
||||
+ "Don't allow spaces in the inscope argument string.", value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//default value of outscope is client
|
||||
private string outScopeString = "client";
|
||||
public string OutScopeString
|
||||
{
|
||||
get
|
||||
{
|
||||
return outScopeString;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (regex.IsMatch(value) || string.Compare(noneValue, value, true) == 0)
|
||||
{
|
||||
outScopeString = value;
|
||||
outScopeOverrided = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("Invalid outscope string fomat \"{0}\", please use the correct format e.g. Server+Both. "
|
||||
+ "Don't allow spaces in the out-of-scope argument string.", value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether inscope parameter is explicitly specified.
|
||||
/// </summary>
|
||||
public bool InScopeOverrided
|
||||
{
|
||||
get { return inScopeOverrided; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether outscope parameter is explicitly specified.
|
||||
/// </summary>
|
||||
public bool OutScopeOverided
|
||||
{
|
||||
get { return outScopeOverrided; }
|
||||
}
|
||||
|
||||
//specify the current parameter is delta scope value.
|
||||
private bool deltaScope;
|
||||
public bool DeltaScope
|
||||
{
|
||||
get { return deltaScope; }
|
||||
set
|
||||
{
|
||||
deltaScope = value;
|
||||
if (deltaScope)
|
||||
{
|
||||
prefix = false;
|
||||
table = false;
|
||||
log = false;
|
||||
output = false;
|
||||
inScope = false;
|
||||
outScope = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string deltaScopeString;
|
||||
public string DeltaScopeString
|
||||
{
|
||||
get { return deltaScopeString; }
|
||||
set
|
||||
{
|
||||
if (regex.IsMatch(value))
|
||||
{
|
||||
deltaScopeString = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("Invalid delta string fomat \"{0}\", please use the correct format e.g. Changed+New. "
|
||||
+ "Don't allow spaces in the delta scope argument string.", value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<string> deltaScopeValues = new List<string>();
|
||||
public List<string> DeltaScopeValues
|
||||
{
|
||||
get
|
||||
{
|
||||
if (deltaScopeValues.Count == 0)
|
||||
{
|
||||
GetDeltaScopeValues();
|
||||
}
|
||||
return deltaScopeValues;
|
||||
}
|
||||
}
|
||||
|
||||
private void GetDeltaScopeValues()
|
||||
{
|
||||
if (string.IsNullOrEmpty(deltaScopeString))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
string[] deltaScopes = deltaScopeString.Split(new char[] { '+' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (string delta in deltaScopes)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(delta.Trim()))
|
||||
{
|
||||
switch(delta.Trim().ToLower())
|
||||
{
|
||||
case "new":
|
||||
deltaScopeValues.Add("new");
|
||||
break;
|
||||
case "changed":
|
||||
deltaScopeValues.Add("changed");
|
||||
break;
|
||||
case "unchanged":
|
||||
deltaScopeValues.Add("unchanged");
|
||||
deltaScopeValues.Add("editorial");
|
||||
deltaScopeValues.Add("sectionmoved");
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException(
|
||||
string.Format("Unsupported delta scope value {0}", delta));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{FABD7966-6611-4556-92CB-B13D7425AE82}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>Microsoft.Protocols.ReportingTool</RootNamespace>
|
||||
<AssemblyName>ReportingTool</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SharedAssemblyInfo.cs">
|
||||
<Link>SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="DerivedRequirement.cs" />
|
||||
<Compile Include="ReportingParameters.cs" />
|
||||
<Compile Include="Reporting.cs" />
|
||||
<Compile Include="requirementTable.cs">
|
||||
<DependentUpon>requirementTable.xsd</DependentUpon>
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Resource.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resource.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="SerializableRequirements.cs">
|
||||
</Compile>
|
||||
<Compile Include="TableAnalyzer.cs" />
|
||||
<Compile Include="TestLog.cs">
|
||||
<SubType>Component</SubType>
|
||||
<DependentUpon>TestLog.xsd</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="XmlLogAnalyzer.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="..\testtools\Logging\TestLog.xsd">
|
||||
<Link>TestLog.xsd</Link>
|
||||
<SubType>
|
||||
</SubType>
|
||||
</Content>
|
||||
<Content Include="requirementTable.xsd">
|
||||
<SubType>
|
||||
</SubType>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resource.resx">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resource.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="AfterBuild">
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\reportingtool\" />
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\reportingtool\" />
|
||||
</Target>
|
||||
</Project>
|
|
@ -0,0 +1,305 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.239
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Microsoft.Protocols.ReportingTool {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resource {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resource() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Protocols.ReportingTool.Resource", typeof(Resource).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <table cellpadding="2" cellspacing="2">
|
||||
/// <caption><h3>Requirements Excluded From Failed Cases</h3></caption>
|
||||
/// <col />
|
||||
/// <thead>
|
||||
/// <tr>
|
||||
/// <td style="width: 12%;" class="TableCellHighlighted">
|
||||
/// Req ID
|
||||
/// </td>
|
||||
/// <td class="TableCellHighlighted">
|
||||
/// Description
|
||||
/// </td>
|
||||
/// <td style="width: 10%;" class="TableCellHighlighted">
|
||||
/// TestCase
|
||||
/// </td>
|
||||
/// <td style="width: 10%;" class="TableCellHighlighted [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string ExcludReqTable {
|
||||
get {
|
||||
return ResourceManager.GetString("ExcludReqTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <table cellpadding="2" cellspacing="2">
|
||||
/// <caption><h3>$GLOBALTABLETITLE$<br/>
|
||||
/// <font color="#FF0000">$ErrorMessage$</font></h3>
|
||||
/// <h4>$GLOBALTABLEDISCRIPTION$</h4></caption>
|
||||
/// <col />
|
||||
/// <thead><tr><th colspan="2">Requirement Type</th><th colspan="5">Count/Percent</th></tr></thead>
|
||||
/// <col />
|
||||
/// <tbody>
|
||||
/// <tr>
|
||||
/// <td colspan="7">
|
||||
/// <h3>
|
||||
/// Checked Requirements: %totalChecked%
|
||||
/// </h3>
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string GlobalTable {
|
||||
get {
|
||||
return ResourceManager.GetString("GlobalTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to {0} -
|
||||
/// A utility which generates reports from PTF test logs and requirement table files.
|
||||
///
|
||||
///{0} /log:<xml log> /table:<requirements table>[/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
|
||||
///{0} /log:<xml log>[<xml log>....] /table:<requirements table>[<requirements table>...] [/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
|
||||
///
|
||||
/// - OPTIONS -
|
||||
///
|
||||
////help
|
||||
/// Prints this help message. Short form is '/?'.
|
||||
///
|
||||
////out [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string HelpText {
|
||||
get {
|
||||
return ResourceManager.GetString("HelpText", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to $GLOBALSTAT$
|
||||
/// <br/>
|
||||
/// $GLOBALRSINCONSISTENCY$
|
||||
/// <br/>
|
||||
/// $GLOBALINCONSISTENCY$
|
||||
/// <br/>
|
||||
/// $EXCLUDEDREQUIREMENTS$
|
||||
/// </body>
|
||||
/// </html>.
|
||||
/// </summary>
|
||||
internal static string HtmlTemplateFooter {
|
||||
get {
|
||||
return ResourceManager.GetString("HtmlTemplateFooter", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
///<html xmlns="http://www.w3.org/1999/xhtml" >
|
||||
///<head>
|
||||
/// <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
/// <title>Reporting</title>
|
||||
/// <style type="text/css">
|
||||
/// table
|
||||
/// {
|
||||
/// width: 100%;
|
||||
/// background-color: #f8f8f8;
|
||||
/// border: 1px solid #505050;
|
||||
/// border-collapse: collapse;
|
||||
/// }
|
||||
/// tbody tr td
|
||||
/// {
|
||||
/// border: 1px so [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string HtmlTemplateHeader {
|
||||
get {
|
||||
return ResourceManager.GetString("HtmlTemplateHeader", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <br />The following data might not be accurate due to inconsistencies found in the requirements, please see <a href='#jump-rsinconsistencyerrors'>Requirement Inconsistencies</a> for details..
|
||||
/// </summary>
|
||||
internal static string InconsistencyErrorMessage {
|
||||
get {
|
||||
return ResourceManager.GetString("InconsistencyErrorMessage", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <table cellpadding="2" cellspacing="2">
|
||||
/// <col/>
|
||||
/// <thead>
|
||||
/// <tr>
|
||||
/// <td align="center" class="TableCellHighlighted" colspan="5">
|
||||
/// <h4>Requirement Verification Inconsistencies</h4>
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// <th colspan="3">Inconsistency type</th>
|
||||
/// <th colspan="2">Count</th>
|
||||
/// </tr>
|
||||
/// </thead>
|
||||
/// <col/>
|
||||
/// <tbody>
|
||||
/// <tr>
|
||||
/// <td colspan="3">
|
||||
/// $InconsistentErrors$
|
||||
/// </td>
|
||||
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string InconsistencyTable {
|
||||
get {
|
||||
return ResourceManager.GetString("InconsistencyTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <table>
|
||||
/// <caption><h3>Report For Log $FILENAME$</h3></caption>
|
||||
/// <tr>
|
||||
/// <td>
|
||||
/// Target Protocol: $PROTOCOL$</td>
|
||||
/// <td>
|
||||
/// Log File: $FILENAME$
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// <td align="center" class="TableCellHighlighted" colspan="2">
|
||||
/// PTFConfigProperties
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// $CONFIG$
|
||||
/// <tr>
|
||||
/// <td align="center" class="TableCellHighlighted" colspan="2">
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string LogTable {
|
||||
get {
|
||||
return ResourceManager.GetString("LogTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <table>
|
||||
/// <tr>
|
||||
/// <td align="center" class="TableCellHighlighted" colspan="2">
|
||||
/// Requirement Coverage
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// <td>Total requirements</td>
|
||||
/// <td>$Total$</td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// <td>Normative, in-scope and testable requirements</td>
|
||||
/// <td>$Verifiable$</td>
|
||||
/// </tr>
|
||||
/// <tr>
|
||||
/// <td>Verified requirements</td>
|
||||
/// <td>$Verified$
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string ReqTable {
|
||||
get {
|
||||
return ResourceManager.GetString("ReqTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<xs:schema targetNamespace="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
|
||||
/// xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
/// xmlns:rt="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
|
||||
/// elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||
///
|
||||
/// <xs:simpleType name="isExtension_type">
|
||||
/// <xs:restriction base="xs:string">
|
||||
/// <!-- Non-extension or Extension -->
|
||||
/// [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string requirementTable {
|
||||
get {
|
||||
return ResourceManager.GetString("requirementTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to
|
||||
/// <table cellpadding="2" cellspacing="2">
|
||||
/// <col />
|
||||
/// <thead>
|
||||
/// <tr>
|
||||
/// <td align="center" class="TableCellHighlighted" colspan="3">
|
||||
/// <h4>Requirement Inconsistencies</h4>
|
||||
/// </td>
|
||||
/// </tr>
|
||||
/// </thead>
|
||||
/// <col />
|
||||
/// <tbody>
|
||||
/// <tr>
|
||||
/// <td colspan="2" style="width: 87%;">
|
||||
/// $RSERRORS$
|
||||
/// </td>
|
||||
/// <td colspan="1" style="width: 13%;" title="click to see detail [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string RSInconsistencyTable {
|
||||
get {
|
||||
return ResourceManager.GetString("RSInconsistencyTable", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,645 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="GlobalTable" xml:space="preserve">
|
||||
<value><table cellpadding="2" cellspacing="2">
|
||||
<caption><h3>$GLOBALTABLETITLE$<br/>
|
||||
<font color="#FF0000">$ErrorMessage$</font></h3>
|
||||
<h4>$GLOBALTABLEDISCRIPTION$</h4></caption>
|
||||
<col />
|
||||
<thead><tr><th colspan="2">Requirement Type</th><th colspan="5">Count/Percent</th></tr></thead>
|
||||
<col />
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<h3>
|
||||
Checked Requirements: %totalChecked%
|
||||
</h3>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" align="center">
|
||||
Coverage of normative, in-scope requirements
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
Checkable requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Show);ToggleAll('FinalPartialVerify', this.offsetParent, Show);ToggleAll('FinalUnverified', this.offsetParent, Show);">
|
||||
<a href="#jump-detail">
|
||||
$finalToVerified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
Completely checked requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Show);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);">
|
||||
<a href="#jump-detail">
|
||||
$finalVerified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
Partially checked requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Show);ToggleAll('FinalUnverified', this.offsetParent, Hide);">
|
||||
<a href="#jump-detail">
|
||||
$finalPVerified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
Unchecked requirements
|
||||
</td>
|
||||
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Show);">
|
||||
<a href="#jump-detail">
|
||||
$finalUVerified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="7" align="center">
|
||||
Coverage of derived requirements
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr >
|
||||
<td colspan="4">
|
||||
Derived requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Show);ToggleAll('DerivedPartialVerify', this.offsetParent, Show);ToggleAll('DerivedUnverified', this.offsetParent, Show);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);">
|
||||
<a href="#jump-detail">
|
||||
$derivedTotal$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr >
|
||||
<td colspan="4">
|
||||
Checked derived requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Show);ToggleAll('DerivedPartialVerify', this.offsetParent, Show);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);">
|
||||
<a href="#jump-detail">
|
||||
$derivedVerified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr >
|
||||
<td colspan="4">
|
||||
Unchecked derived requirements
|
||||
</td>
|
||||
<td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Show);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);">
|
||||
<a href="#jump-detail">
|
||||
$derivedUnverified$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="7">
|
||||
<a name="jump-detail">Details:</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="width: 12%;">
|
||||
Req ID
|
||||
</td>
|
||||
<td>
|
||||
Description
|
||||
</td>
|
||||
<td>
|
||||
Doc Sect
|
||||
</td>
|
||||
<td>
|
||||
Scope
|
||||
</td>
|
||||
<td style="width: 10%;">
|
||||
Status
|
||||
</td>
|
||||
<td style="width: 13%;">
|
||||
Time Stamp
|
||||
</td>
|
||||
<td style="width: 10%;">
|
||||
Log Files
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
$DETAIL$
|
||||
</tbody>
|
||||
</table><br /></value>
|
||||
</data>
|
||||
<data name="HelpText" xml:space="preserve">
|
||||
<value>{0} -
|
||||
A utility which generates reports from PTF test logs and requirement table files.
|
||||
|
||||
{0} /log:<xml log> /table:<requirements table>[/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
|
||||
{0} /log:<xml log>[<xml log>....] /table:<requirements table>[<requirements table>...] [/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
|
||||
|
||||
- OPTIONS -
|
||||
|
||||
/help
|
||||
Prints this help message. Short form is '/?'.
|
||||
|
||||
/out:<report.html>
|
||||
Specifies the report filename. Short form is '/o:'.
|
||||
|
||||
/log:<xml log>
|
||||
Specifies the test log filename. Short form is '/l:'.
|
||||
|
||||
/table:<requirement table>
|
||||
Specifies the requirement table filename. Short form is '/t:'.
|
||||
|
||||
/replace
|
||||
Specifies the new output report file which will replace the old one.
|
||||
Short form is '/r'. Optional.
|
||||
|
||||
/inscope:<scope value>
|
||||
Specifies the in scope values which will be used to create in-scope rules.
|
||||
This parameter must be used binding with '/outofscope' parameter.
|
||||
Short form is '/ins:'. Optional, default values are 'Server+Both'.
|
||||
|
||||
/outofscope:<scope values>
|
||||
Specifies the out scope values which will be used to create out-of-scope rules.
|
||||
This parameter must be used binding with '/inscope' parameter.
|
||||
Short form is '/oos:'. Optional, default values are 'Client'.
|
||||
|
||||
/delta:<delta type of test report>
|
||||
Specifies the delta type of requirement coverage report, it can be a combination of the following options.
|
||||
-New: all newly added(delta property is empty) requirements are calculated in the report.
|
||||
-Changed: all changed requirements are calculated in the report.
|
||||
-Unchanged: all requirements whose delta property are unchanged, section moved or editorial are calculated in the report.
|
||||
Short form is '/d'. Optional.
|
||||
|
||||
/prefix:<the prefix to build requirement id>
|
||||
Specifies the prefix which is used to generate requirement id, like MS-XXXX_R.
|
||||
Short form is "/p:".
|
||||
|
||||
/verbose
|
||||
Trigger the verbose mode. The verbose mode will dump the inconsistency table for requirement capturing.
|
||||
Short form is "/v". Optional, ReportingTool will not dump that messages by default.
|
||||
|
||||
- ARGUMENTS -
|
||||
|
||||
<xml log> Filename of PTF test log in XML format.
|
||||
<requirement table> Filename of requirement table, XML format document of protocols.
|
||||
<scope values> String values of in-scope or out-of-scope.
|
||||
The arguments should be based on the following syntax:
|
||||
<scope values>::=<word>[<separator><scope values>]
|
||||
<separator>::="+"
|
||||
<word>:: =string of numbers and letters (no special characters and spaces)
|
||||
|
||||
Multiple file arguments of the same type may be provided.</value>
|
||||
</data>
|
||||
<data name="HtmlTemplateFooter" xml:space="preserve">
|
||||
<value>$GLOBALSTAT$
|
||||
<br/>
|
||||
$GLOBALRSINCONSISTENCY$
|
||||
<br/>
|
||||
$GLOBALINCONSISTENCY$
|
||||
<br/>
|
||||
$EXCLUDEDREQUIREMENTS$
|
||||
</body>
|
||||
</html></value>
|
||||
</data>
|
||||
<data name="HtmlTemplateHeader" xml:space="preserve">
|
||||
<value><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" >
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>Reporting</title>
|
||||
<style type="text/css">
|
||||
table
|
||||
{
|
||||
width: 100%;
|
||||
background-color: #f8f8f8;
|
||||
border: 1px solid #505050;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
tbody tr td
|
||||
{
|
||||
border: 1px solid #505050;
|
||||
}
|
||||
.TableCellHighlighted
|
||||
{
|
||||
font-size: 1.1em;
|
||||
background-color: #e0e0e0;
|
||||
border: 1px solid #909090;
|
||||
}
|
||||
.Unverified
|
||||
{
|
||||
background-color: silver;
|
||||
display: none;
|
||||
}
|
||||
.Verified
|
||||
{
|
||||
background-color: green;
|
||||
display: none;
|
||||
}
|
||||
.NotToVerify
|
||||
{
|
||||
background-color: yellow;
|
||||
display: none;
|
||||
}
|
||||
.DerivedUnverified
|
||||
{
|
||||
background-color: silver;
|
||||
display: none;
|
||||
}
|
||||
.DerivedVerified
|
||||
{
|
||||
background-color: green;
|
||||
display: none;
|
||||
}
|
||||
.DerivedPartialVerify
|
||||
{
|
||||
background-color: yellow;
|
||||
display: none;
|
||||
}
|
||||
.FinalUnverified
|
||||
{
|
||||
background-color: silver;
|
||||
display: none;
|
||||
}
|
||||
.FinalVerified
|
||||
{
|
||||
background-color: green;
|
||||
display: none;
|
||||
}
|
||||
.FinalPartialVerify
|
||||
{
|
||||
background-color: yellow;
|
||||
display: none;
|
||||
}
|
||||
.InconsistencyWarning
|
||||
{
|
||||
background-color: yellow;
|
||||
display: none;
|
||||
}
|
||||
.InconsistencyError
|
||||
{
|
||||
background-color: red;
|
||||
display: none;
|
||||
}
|
||||
.RSInconsistencyError
|
||||
{
|
||||
background-color: red;
|
||||
display: none;
|
||||
}
|
||||
.RSInconsistencyWarning
|
||||
{
|
||||
background-color: yellow;
|
||||
display: none;
|
||||
}
|
||||
.RSExcluded
|
||||
{
|
||||
background-color: red;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
function ToggleAll(className, parent, func)
|
||||
{
|
||||
var children = (parent !=null ? parent : document.body).getElementsByTagName('*');
|
||||
var pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");
|
||||
for (var i = 0, length = children.length; i < length; i++)
|
||||
{
|
||||
var child = children[i];
|
||||
var elementClassName = child.className;
|
||||
if (elementClassName.length == 0)
|
||||
continue;
|
||||
if (elementClassName == className || elementClassName.match(pattern))
|
||||
func(child);
|
||||
}
|
||||
}
|
||||
function Toggle(item)
|
||||
{
|
||||
var visible = (item.style.display != "none");
|
||||
if (visible)
|
||||
item.style.display = "none";
|
||||
else
|
||||
item.style.display = "table-row";
|
||||
}
|
||||
function Show(item)
|
||||
{
|
||||
item.style.display = "table-row";
|
||||
}
|
||||
function Hide(item)
|
||||
{
|
||||
item.style.display = "none";
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>Please enable Javascript to view the details</noscript>
|
||||
</value>
|
||||
</data>
|
||||
|
||||
<data name="RSInconsistencyTable" xml:space="preserve">
|
||||
<value>
|
||||
<table cellpadding="2" cellspacing="2">
|
||||
<col />
|
||||
<thead>
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="3">
|
||||
<h4>Requirement Inconsistencies</h4>
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<col />
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2" style="width: 87%;">
|
||||
$RSERRORS$
|
||||
</td>
|
||||
<td colspan="1" style="width: 13%;" title="click to see details" onclick="ToggleAll('RSInconsistencyError', this.offsetParent, Show);">
|
||||
<a href="#jump-rsinconsistencyerrors">
|
||||
$RSInconsistentErrorsCount$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="width: 87%;">
|
||||
$RSWARNINGS$
|
||||
</td>
|
||||
<td colspan="1" style="width: 13%;" title="click to see details" onclick="ToggleAll('RSInconsistencyWarning', this.offsetParent, Show);">
|
||||
<a href="#jump-rsinconsistencywarnings">
|
||||
$RSInconsistentWarningsCount$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
$RSINCONSISTENCYERRORS$
|
||||
$RSINCONSISTENCYWARNINGS$
|
||||
</tbody>
|
||||
</table>
|
||||
</value>
|
||||
</data>
|
||||
|
||||
<data name="InconsistencyTable" xml:space="preserve">
|
||||
<value><table cellpadding="2" cellspacing="2">
|
||||
<col/>
|
||||
<thead>
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="7">
|
||||
<h4>Requirement Verification Inconsistencies</h4>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="3">Inconsistency type</th>
|
||||
<th colspan="4">Count</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<col/>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
$InconsistentErrors$
|
||||
</td>
|
||||
<td colspan="4" title="click to see details" onclick="ToggleAll('InconsistencyError', this.offsetParent, Show);">
|
||||
<a href="#jump-inconsistencyerrors">
|
||||
$InconsistentErrorsCount$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
$InconsistentWarnings$
|
||||
</td>
|
||||
<td colspan="4" title="click to see details" onclick="ToggleAll('InconsistencyWarning', this.offsetParent, Show);">
|
||||
<a href="#jump-inconsistencywarnings">
|
||||
$InconsistentWarningsCount$
|
||||
</a >
|
||||
</td>
|
||||
</tr>
|
||||
$InconsistentErrorsDETAIL$
|
||||
$InconsistentWarningsDETAIL$
|
||||
</tbody>
|
||||
</table><br /></value>
|
||||
</data>
|
||||
|
||||
<data name="LogTable" xml:space="preserve">
|
||||
<value> <table>
|
||||
<caption><h3>Report For Log $FILENAME$</h3></caption>
|
||||
<tr>
|
||||
<td>
|
||||
Target Protocol: $PROTOCOL$</td>
|
||||
<td>
|
||||
Log File: $FILENAME$
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="2">
|
||||
PTFConfigProperties
|
||||
</td>
|
||||
</tr>
|
||||
$CONFIG$
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="2">
|
||||
PTFTestResult
|
||||
</td>
|
||||
</tr>
|
||||
$TESTRESULT$
|
||||
<tr>
|
||||
<td>
|
||||
CoveredRequirements
|
||||
</td>
|
||||
<td>
|
||||
$Verified$
|
||||
</td>
|
||||
</tr>
|
||||
</table></value>
|
||||
</data>
|
||||
|
||||
<data name="ReqTable" xml:space="preserve">
|
||||
<value> <table>
|
||||
<tr>
|
||||
<td align="center" class="TableCellHighlighted" colspan="2">
|
||||
Requirement Coverage
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Total requirements</td>
|
||||
<td>$Total$</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Normative, in-scope and testable requirements</td>
|
||||
<td>$Verifiable$</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Verified requirements</td>
|
||||
<td>$Verified$
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Unverified requirements</td>
|
||||
<td>$Unverified$
|
||||
</td>
|
||||
</tr>
|
||||
</table></value>
|
||||
</data>
|
||||
|
||||
<data name="ExcludReqTable" xml:space="preserve">
|
||||
<value><table cellpadding="2" cellspacing="2">
|
||||
<caption><h3>Requirements Excluded From Failed Cases</h3></caption>
|
||||
<col />
|
||||
<thead>
|
||||
<tr>
|
||||
<td style="width: 12%;" class="TableCellHighlighted">
|
||||
Req ID
|
||||
</td>
|
||||
<td class="TableCellHighlighted">
|
||||
Description
|
||||
</td>
|
||||
<td style="width: 10%;" class="TableCellHighlighted">
|
||||
TestCase
|
||||
</td>
|
||||
<td style="width: 10%;" class="TableCellHighlighted">
|
||||
TestResult
|
||||
</td>
|
||||
<td style="width: 13%;" class="TableCellHighlighted">
|
||||
TimeStamp
|
||||
</td>
|
||||
<td style="width: 10%;" class="TableCellHighlighted">
|
||||
Log Files
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
$ExcReqs$
|
||||
</tbody>
|
||||
</table><br /></value>
|
||||
</data>
|
||||
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="requirementTable" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>requirementTable.xsd;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="InconsistencyErrorMessage" xml:space="preserve">
|
||||
<value><br />The following data might not be accurate due to inconsistencies found in the requirements, please see <a href='#jump-rsinconsistencyerrors'>Requirement Inconsistencies</a> for details.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,704 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml.Serialization;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Microsoft.Protocols.ReportingTool
|
||||
{
|
||||
/// <summary>
|
||||
/// RT internal use only to dump the requirements.
|
||||
/// Collection of requirement which can be serialized.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
[XmlRootAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable", IsNullable = false, ElementName = "ReqTable")]
|
||||
public class RequirementCollection
|
||||
{
|
||||
private List<SerializableRequirement> requirements = new List<SerializableRequirement>();
|
||||
|
||||
/// <summary>
|
||||
/// Get all requirement objects.
|
||||
/// </summary>
|
||||
[XmlElementAttribute("Requirement")]
|
||||
public SerializableRequirement[] Requirements
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.requirements.ToArray();
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
throw new ArgumentNullException("value");
|
||||
}
|
||||
this.requirements.Clear();
|
||||
AddRequirements(value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add requirements to collection
|
||||
/// </summary>
|
||||
/// <param name="items">The requirement to be added</param>
|
||||
public void AddRequirements(SerializableRequirement[] items)
|
||||
{
|
||||
foreach (SerializableRequirement req in items)
|
||||
{
|
||||
if (!this.requirements.Contains(req))
|
||||
{
|
||||
this.requirements.Add(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sort the order of the requirements in collection.
|
||||
/// </summary>
|
||||
public void Sort()
|
||||
{
|
||||
this.requirements.Sort();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// RT internal use only to dump the requirements.
|
||||
/// A serializable object to represent a requirement.
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public class SerializableRequirement : IComparable<SerializableRequirement>
|
||||
{
|
||||
#region Fields
|
||||
//required
|
||||
private string req_IDField;
|
||||
|
||||
//optional
|
||||
private string doc_SectField;
|
||||
|
||||
private bool doc_SectFieldSpecified;
|
||||
|
||||
//required
|
||||
private string descriptionField;
|
||||
|
||||
//optional
|
||||
private string posField;
|
||||
|
||||
private bool posFieldSpecified;
|
||||
|
||||
//optional
|
||||
private string negField;
|
||||
|
||||
private bool negFieldSpecified;
|
||||
|
||||
//optional
|
||||
private string derivedField;
|
||||
|
||||
private bool derivedFieldSpecified;
|
||||
|
||||
//optional
|
||||
private string scenarioField;
|
||||
|
||||
private bool scenarioFieldSpecified;
|
||||
|
||||
//optional
|
||||
private IsExtensionType isExtensionField;
|
||||
|
||||
private bool isExtensionFieldSpecified;
|
||||
|
||||
//optional
|
||||
private BehaviorType behaviorField;
|
||||
|
||||
private bool behaviorFieldSpecified;
|
||||
|
||||
//optional
|
||||
private ActorType actorField;
|
||||
|
||||
private bool actorFieldSpecified;
|
||||
|
||||
//optional
|
||||
private string scopeField;
|
||||
|
||||
private bool scopeFieldSpecified;
|
||||
|
||||
//optional
|
||||
private PriorityType priorityField;
|
||||
|
||||
private bool priorityFieldSpecified;
|
||||
|
||||
//required
|
||||
private IsNormativeType isNormativeField;
|
||||
|
||||
//required
|
||||
private VerificationType verificationField;
|
||||
|
||||
//optional
|
||||
private string verificationCommentField;
|
||||
|
||||
private bool verificationCommentFieldSpecified;
|
||||
|
||||
//additional property
|
||||
private IsCoveredType coveredStatus;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
/// <remarks/>
|
||||
public string REQ_ID
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.req_IDField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.req_IDField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Doc_Sect
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.doc_SectField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.doc_SectField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool Doc_SectSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.doc_SectFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.doc_SectFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Description
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.descriptionField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.descriptionField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Pos
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.posField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.posField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool PosSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.posFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.posFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Neg
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.negField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.negField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool NegSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return negFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.negFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Derived
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.derivedField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.derivedField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool DerivedSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.derivedFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.derivedFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Scenario
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.scenarioField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.scenarioField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool ScenarioSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.scenarioFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.scenarioFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public IsExtensionType IsExtension
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.isExtensionField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.isExtensionField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool IsExtensionSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.isExtensionFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.isExtensionFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public BehaviorType Behavior
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.behaviorField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.behaviorField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool BehaviorSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.behaviorFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.behaviorFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public ActorType Actor
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.actorField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.actorField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool ActorSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.actorFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.actorFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string Scope
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.scopeField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.scopeField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool ScopeSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.scopeFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.scopeFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public PriorityType Priority
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.priorityField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.priorityField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool PrioritySpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.priorityFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.priorityFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public IsNormativeType IsNormative
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.isNormativeField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.isNormativeField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public VerificationType Verification
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.verificationField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.verificationField = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public string VerificationComment
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.verificationCommentField;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.verificationCommentField = value;
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnoreAttribute()]
|
||||
public bool VerificationCommentSpecified
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.verificationCommentFieldSpecified;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.verificationCommentFieldSpecified = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public IsCoveredType CoveredStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.coveredStatus;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.coveredStatus = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IComparable<SerializableRequirement> Members
|
||||
|
||||
public int CompareTo(SerializableRequirement other)
|
||||
{
|
||||
if (other == null)
|
||||
{
|
||||
throw new ArgumentNullException("other");
|
||||
}
|
||||
int ret = 0;
|
||||
//try get the number from Id to compare.
|
||||
Regex regex = new Regex(@"\d+");
|
||||
if (regex.IsMatch(this.req_IDField) &&
|
||||
regex.IsMatch(other.req_IDField))
|
||||
{
|
||||
Match thisMatch = regex.Match(this.req_IDField);
|
||||
Match otherMatch = regex.Match(other.req_IDField);
|
||||
ulong thisId = ulong.Parse(thisMatch.Value);
|
||||
ulong otherId = ulong.Parse(otherMatch.Value);
|
||||
ret = thisId.CompareTo(otherId);
|
||||
}
|
||||
|
||||
//if no number or the same numbers.
|
||||
if (ret == 0)
|
||||
{
|
||||
ret = this.req_IDField.CompareTo(other.req_IDField);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extension type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum IsExtensionType
|
||||
{
|
||||
/// <summary>
|
||||
/// Non-extension type
|
||||
/// </summary>
|
||||
[XmlEnumAttribute("Non-extension")]
|
||||
Nonextension,
|
||||
|
||||
/// <summary>
|
||||
/// Extension type
|
||||
/// </summary>
|
||||
Extension,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Behavior type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum BehaviorType
|
||||
{
|
||||
/// <summary>
|
||||
/// Protocol behavior
|
||||
/// </summary>
|
||||
Protocol,
|
||||
|
||||
/// <summary>
|
||||
/// Windows behavior
|
||||
/// </summary>
|
||||
Windows,
|
||||
|
||||
/// <summary>
|
||||
/// Product behavior
|
||||
/// </summary>
|
||||
Product,
|
||||
|
||||
/// <summary>
|
||||
/// Microsoft product specific
|
||||
/// </summary>
|
||||
Microsoft,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Actor Type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum ActorType
|
||||
{
|
||||
/// <summary>
|
||||
/// Act as client side
|
||||
/// </summary>
|
||||
Client,
|
||||
|
||||
/// <summary>
|
||||
/// Act as server side
|
||||
/// </summary>
|
||||
Server,
|
||||
|
||||
/// <summary>
|
||||
/// Act as both client and server sides
|
||||
/// </summary>
|
||||
Both,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Requirement priority type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum PriorityType
|
||||
{
|
||||
/// <summary>
|
||||
/// P0 level requirement
|
||||
/// </summary>
|
||||
p0,
|
||||
|
||||
/// <summary>
|
||||
/// P1 level requirement
|
||||
/// </summary>
|
||||
p1,
|
||||
|
||||
/// <summary>
|
||||
/// P2 level requirement
|
||||
/// </summary>
|
||||
p2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Normative/Informative type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum IsNormativeType
|
||||
{
|
||||
/// <summary>
|
||||
/// The normative type
|
||||
/// </summary>
|
||||
Normative,
|
||||
|
||||
/// <summary>
|
||||
/// The informative type
|
||||
/// </summary>
|
||||
Informative,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Requirement verification type
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum VerificationType
|
||||
{
|
||||
/// <summary>
|
||||
/// Non-testable requirement
|
||||
/// </summary>
|
||||
[XmlEnumAttribute("Non-testable")]
|
||||
Nontestable,
|
||||
|
||||
/// <summary>
|
||||
/// Adapter requirement
|
||||
/// </summary>
|
||||
Adapter,
|
||||
|
||||
/// <summary>
|
||||
/// Test Case requirement
|
||||
/// </summary>
|
||||
[XmlEnumAttribute("Test Case")]
|
||||
TestCase,
|
||||
|
||||
/// <summary>
|
||||
/// Unverified requirement
|
||||
/// </summary>
|
||||
Unverified,
|
||||
|
||||
/// <summary>
|
||||
/// Deleted requirement
|
||||
/// </summary>
|
||||
Deleted,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Requirement covered status
|
||||
/// </summary>
|
||||
[SerializableAttribute()]
|
||||
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
|
||||
public enum IsCoveredType
|
||||
{
|
||||
/// <summary>
|
||||
/// The requirement is not covered
|
||||
/// </summary>
|
||||
[XmlEnumAttribute("Not Covered")]
|
||||
NotCovered,
|
||||
|
||||
/// <summary>
|
||||
/// The requirement is covered
|
||||
/// </summary>
|
||||
Covered,
|
||||
}
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,380 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Microsoft.Protocols.ReportingTool
|
||||
{
|
||||
internal class XmlLogAnalyzer
|
||||
{
|
||||
const string CHECKPOINT = "Checkpoint";
|
||||
const string COMMENT = "Comment";
|
||||
const string TESTPASSED = "TestPassed";
|
||||
const string SETTINGS = "Settings";
|
||||
const string CHECKPOINTSTATEMENT = "kind <> '" + CHECKPOINT + "'";
|
||||
const string CONFPROP = "PTFConfigProperties.";
|
||||
const string TESTRESULT = "PTFTestResult.";
|
||||
const string COMMENTSTATEMENT = "kind = '" + COMMENT + "'";
|
||||
const string SETTINGSSTATEMENT = "kind = '" + SETTINGS + "'";
|
||||
//Test result
|
||||
private static string[][] testStatusName = new string[7][] {
|
||||
new string[2] {"TestPassed", "TestsPassed"},
|
||||
new string[2] {"TestFailed", "TestsFailed"},
|
||||
new string[2]{"TestInconclusive", "TestsInconclusive" },
|
||||
new string[2]{"TestError", "TestsError" },
|
||||
new string[2]{ "TestAborted", "TestsAborted"},
|
||||
new string[2]{"TestTimeout", "TestsTimeout" },
|
||||
new string[2] { "TestUnknown", "TestsUnknown"} };
|
||||
|
||||
const string TESTOUTCOMESTATEMENT = "kind = '{0}'";
|
||||
|
||||
// NOTICE: these two patterns are only used in TSD internally.
|
||||
static readonly Regex MSPATTERN = new Regex(@"^MS-[A-Za-z0-9]{2,8}_R\d{1,4}$", RegexOptions.Compiled);
|
||||
static readonly Regex RFCPATTERN = new Regex(@"^RFC\d{2,5}_R\d{1,4}$", RegexOptions.Compiled);
|
||||
|
||||
// Use Dictionay as a Set
|
||||
private Dictionary<string, string> checkpointEntries;
|
||||
// All key:value pair of PTF configurations.
|
||||
private Dictionary<string, string> ptfConfigurations;
|
||||
// All TestResultType:Counter pair of Test Results stored in test log.
|
||||
private Dictionary<string, string> testResult;
|
||||
// Protocols covered by the test.
|
||||
private List<string> protocols;
|
||||
// All test cases with test outcome, key: test case name, value: test outcome
|
||||
private Dictionary<string, string> testCases;
|
||||
// All excluded requirements, key: req_id, value: test case name
|
||||
private Dictionary<string, string> excludedRequirements;
|
||||
// Timestamps for all excluded requirements, key: req_id, value: timestamp
|
||||
private Dictionary<string, string> excludedRequirementsTimestamp;
|
||||
|
||||
protected XmlLogAnalyzer()
|
||||
{
|
||||
protocols = new List<string>();
|
||||
}
|
||||
public XmlLogAnalyzer(string logFilename)
|
||||
: this()
|
||||
{
|
||||
IList<string> filenames = new List<string>();
|
||||
filenames.Add(logFilename);
|
||||
Load(filenames);
|
||||
}
|
||||
public XmlLogAnalyzer(StringCollection logFilenames)
|
||||
: this()
|
||||
{
|
||||
IList<string> filenames = new List<string>();
|
||||
foreach (string filename in logFilenames)
|
||||
{
|
||||
filenames.Add(filename);
|
||||
}
|
||||
Load(filenames);
|
||||
}
|
||||
public XmlLogAnalyzer(IList<string> logFilenames)
|
||||
: this()
|
||||
{
|
||||
Load(logFilenames);
|
||||
}
|
||||
private void Load(IList<string> logFilenames)
|
||||
{
|
||||
string currentFile = string.Empty;
|
||||
try
|
||||
{
|
||||
TestLog logEntry = null;
|
||||
TestLog tempLogEntry = new TestLog();
|
||||
XmlReaderSettings settings = new XmlReaderSettings();
|
||||
settings.XmlResolver = null;
|
||||
foreach (string logfile in logFilenames)
|
||||
{
|
||||
currentFile = logfile;
|
||||
//allow log file contain zero entry.
|
||||
if (logEntry == null)
|
||||
{
|
||||
logEntry = new TestLog();
|
||||
logEntry.ReadXml(XmlReader.Create(logfile, settings));
|
||||
}
|
||||
else
|
||||
{
|
||||
tempLogEntry.ReadXml(XmlReader.Create(logfile, settings));
|
||||
logEntry.Merge(tempLogEntry);
|
||||
tempLogEntry.Clear();
|
||||
}
|
||||
}
|
||||
tempLogEntry.Dispose();
|
||||
|
||||
currentFile = string.Empty;
|
||||
|
||||
// get all ptf configurations
|
||||
GetStatsFromLogEntry(logEntry, ref ptfConfigurations, CONFPROP, SETTINGSSTATEMENT);
|
||||
|
||||
// get all test results
|
||||
GetStatsFromLogEntry(logEntry, ref testResult, TESTRESULT, COMMENTSTATEMENT);
|
||||
|
||||
//group all test cases by test outcome
|
||||
GetTestCasesWithOutcome(logEntry);
|
||||
|
||||
// remove all entries except Checkpoint kind log entries
|
||||
DataRow[] rows = logEntry.LogEntry.Select(CHECKPOINTSTATEMENT);
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
row.Delete();
|
||||
}
|
||||
logEntry.LogEntry.AcceptChanges();
|
||||
|
||||
// fill data for checkpoints
|
||||
FillCheckpointEntries(logEntry.LogEntry);
|
||||
|
||||
logEntry.Dispose();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("[ERROR] Unable to get test log data from specified xml log file(s) {0}. Details:\r\n{1}", currentFile, e.Message + e.StackTrace));
|
||||
}
|
||||
}
|
||||
|
||||
private void GetTestCasesWithOutcome(TestLog logEntry)
|
||||
{
|
||||
if (testCases == null)
|
||||
{
|
||||
testCases = new Dictionary<string, string>();
|
||||
}
|
||||
foreach (string[] valuePair in testStatusName)
|
||||
{
|
||||
DataRow[] rows = logEntry.LogEntry.Select(
|
||||
string.Format(TESTOUTCOMESTATEMENT, valuePair[0]));
|
||||
if (rows.Length == 0 && testResult.ContainsKey(valuePair[1]))
|
||||
{
|
||||
Warning("[Warning] The log entry kind '{0}' should be enabled.", valuePair[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
//get the test case name from the testfailed, testinconclusive, testpassed,
|
||||
//testerror, testtimeout, testaborted or testunknown log entries.
|
||||
string testCaseName = (row as TestLog.LogEntryRow).Message.Trim();
|
||||
testCases[testCaseName] = valuePair[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses key:value string pairs by specified match string from log entries.
|
||||
/// </summary>
|
||||
/// <param name="logEntry">The log entry dataset which contains all log entries.</param>
|
||||
/// <param name="dict">The dictionary which contains the matching key:value pairs.</param>
|
||||
/// <param name="matchString">The string to match. "matchString : value" is a valid log entry message.</param>
|
||||
/// <param name="filter">The filter expression to select log messages</param>
|
||||
private static void GetStatsFromLogEntry(TestLog logEntry, ref Dictionary<string, string> dict, string matchString, string filter)
|
||||
{
|
||||
if (dict == null)
|
||||
{
|
||||
dict = new Dictionary<string, string>();
|
||||
}
|
||||
DataRow[] rows = logEntry.LogEntry.Select(filter);
|
||||
if (rows.Length == 0)
|
||||
{
|
||||
Warning("[Warning] The log entry kind 'Comment' and 'Settings' should be enabled.");
|
||||
}
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
string tmp = (row as TestLog.LogEntryRow).Message;
|
||||
if (tmp.StartsWith(matchString))
|
||||
{
|
||||
tmp = tmp.Remove(0, matchString.Length);
|
||||
int index = tmp.IndexOf(":");
|
||||
|
||||
if (index != -1)
|
||||
{
|
||||
string key = tmp.Substring(0, index);
|
||||
string value = tmp.Substring(index + 1);
|
||||
if (!dict.ContainsKey(key))
|
||||
{
|
||||
dict.Add(key, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
dict[key] = value;
|
||||
}
|
||||
if (key == "TestsExecuted")
|
||||
{
|
||||
DateTime stamp = ((TestLog.LogEntryRow)row).timeStamp;
|
||||
dict.Add("TimeStamp", stamp.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores all checkpoint log entry messages to <c ref="checkpointEntries"></c>
|
||||
/// </summary>
|
||||
/// <param name="dt">The datatable contias all checkpoint log entries</param>
|
||||
private void FillCheckpointEntries(TestLog.LogEntryDataTable dt)
|
||||
{
|
||||
if (checkpointEntries == null)
|
||||
{
|
||||
checkpointEntries = new Dictionary<string, string>();
|
||||
}
|
||||
if (excludedRequirements == null)
|
||||
{
|
||||
excludedRequirements = new Dictionary<string, string>();
|
||||
}
|
||||
if (excludedRequirementsTimestamp == null)
|
||||
{
|
||||
excludedRequirementsTimestamp = new Dictionary<string, string>();
|
||||
}
|
||||
foreach (TestLog.LogEntryRow entry in dt)
|
||||
{
|
||||
//excluding captured requirements from failed test cases.
|
||||
if (!entry.IstestCaseNull() && !string.IsNullOrEmpty(entry.testCase))
|
||||
{
|
||||
//requirements covered in failed test case.
|
||||
if (testCases.ContainsKey(entry.testCase) &&
|
||||
string.Compare(testCases[entry.testCase], TESTPASSED, true) != 0)
|
||||
{
|
||||
if (!excludedRequirements.ContainsKey(entry.Message))
|
||||
{
|
||||
excludedRequirements.Add(entry.Message, entry.testCase);
|
||||
excludedRequirementsTimestamp.Add(
|
||||
entry.Message, entry.timeStamp.ToString());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!checkpointEntries.ContainsKey(entry.Message))
|
||||
{
|
||||
checkpointEntries.Add(entry.Message, entry.timeStamp.ToString());
|
||||
// parse protocol name from message string
|
||||
Match ms = MSPATTERN.Match(entry.Message);
|
||||
Match rfc = RFCPATTERN.Match(entry.Message);
|
||||
if (ms.Success || rfc.Success)
|
||||
{
|
||||
string protocol = entry.Message.Remove(entry.Message.IndexOf('_'));
|
||||
if (!protocols.Contains(protocol))
|
||||
{
|
||||
protocols.Add(protocol);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Remove the schema restriction to the reqirement id
|
||||
//The protocols will not be parse from message string.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void Warning(string format, params object[] args)
|
||||
{
|
||||
string message = string.Format(format, args);
|
||||
if (ReportingLog.Log != null)
|
||||
{
|
||||
ReportingLog.Log.TraceWarning(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains test case names and test outcomes.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> AllTestCases
|
||||
{
|
||||
get
|
||||
{
|
||||
return testCases;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains excluded requirements id and test case the req belong to.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> ExcludedRequirements
|
||||
{
|
||||
get
|
||||
{
|
||||
return excludedRequirements;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains excluded requirments id and timestamps.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> ExcludedRequirementsTimestamp
|
||||
{
|
||||
get
|
||||
{
|
||||
return excludedRequirementsTimestamp;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains the covered requirement ids and time stamp of checkpoint.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> CoveredRequirements
|
||||
{
|
||||
get
|
||||
{
|
||||
if (checkpointEntries == null)
|
||||
{
|
||||
checkpointEntries = new Dictionary<string, string>();
|
||||
}
|
||||
return checkpointEntries;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains all PTF configuration values.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> PTFConfigurations
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ptfConfigurations == null)
|
||||
{
|
||||
ptfConfigurations = new Dictionary<string, string>();
|
||||
}
|
||||
return ptfConfigurations;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The dictionary contains all PTF test result values.
|
||||
/// </summary>
|
||||
public Dictionary<string, string> TestResult
|
||||
{
|
||||
get
|
||||
{
|
||||
if (testResult == null)
|
||||
{
|
||||
testResult = new Dictionary<string, string>();
|
||||
}
|
||||
return testResult;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A list of covered protocols
|
||||
/// </summary>
|
||||
public List<string> Protocols
|
||||
{
|
||||
get
|
||||
{
|
||||
return protocols;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,130 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xs:schema targetNamespace="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:rt="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
|
||||
elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||
|
||||
<xs:simpleType name="isExtension_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Non-extension or Extension -->
|
||||
<xs:enumeration value="Non-extension"/>
|
||||
<xs:enumeration value="Extension"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
|
||||
<xs:simpleType name="behavior_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Protocol or Windows -->
|
||||
<xs:enumeration value="Protocol"/>
|
||||
<xs:enumeration value="Windows"/>
|
||||
<xs:enumeration value="Product"/>
|
||||
<xs:enumeration value="Microsoft"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="actor_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Client, Server or Both -->
|
||||
<xs:enumeration value="Client"/>
|
||||
<xs:enumeration value="Server"/>
|
||||
<xs:enumeration value="Both"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="scope_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Client, Server or Both -->
|
||||
<xs:pattern value ="^(\w|_)+$"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="priority_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- p0, p1 or p2 -->
|
||||
<xs:enumeration value="p0"/>
|
||||
<xs:enumeration value="p1"/>
|
||||
<xs:enumeration value="p2"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="isNormative_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Normative or Informative -->
|
||||
<xs:enumeration value="Normative"/>
|
||||
<xs:enumeration value="Informative"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="verification_type">
|
||||
<xs:restriction base="xs:string">
|
||||
<!-- Non-testable, Adapter, Test Case or Unverified -->
|
||||
<xs:enumeration value="Non-testable"/>
|
||||
<xs:enumeration value="Adapter"/>
|
||||
<xs:enumeration value="Test Case"/>
|
||||
<xs:enumeration value="Unverified"/>
|
||||
<xs:enumeration value ="Deleted"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name ="delta_type">
|
||||
<xs:restriction base ="xs:string">
|
||||
<xs:enumeration value ="Changed"/>
|
||||
<xs:enumeration value ="Deleted"/>
|
||||
<xs:enumeration value ="Editorial"/>
|
||||
<xs:enumeration value ="SectionDeleted"/>
|
||||
<xs:enumeration value ="SectionMoved"/>
|
||||
<xs:enumeration value ="Unchanged"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- Root element, attributes of this element should not be changed. -->
|
||||
<xs:element name="ReqTable">
|
||||
<xs:complexType>
|
||||
<xs:sequence maxOccurs="unbounded">
|
||||
<xs:element name="Requirement">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="REQ_ID" type="xs:string"/>
|
||||
<!-- <REQ_ID>MS-KILE_R1</REQ_ID> -->
|
||||
<xs:element name="Doc_Sect" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <Doc_Sect>3.2.2</Doc_Sect> -->
|
||||
<xs:element name="Description" type="xs:string"/>
|
||||
<!-- <Description>Verify Tickets are removed from the cache once they have expired.</Description> optional -->
|
||||
<xs:element name ="Pos" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!--<Pos>Requirement describing affect of this cause.</Pos>-->
|
||||
<xs:element name ="Neg" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!--<Neg>Requirement describing affect of this cause not occurring.</Neg> optional-->
|
||||
<xs:element name ="Derived" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!--<Derived>Requirement(s) this specific requirement is derived as a more specific case from.</Derived> optional-->
|
||||
<xs:element name="Scenario" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <Scenario>S1, S2</Scenario> -->
|
||||
<xs:element name="IsExtension" type="rt:isExtension_type" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <IsExtension>Extension</IsExtension> -->
|
||||
<xs:element name="Behavior" type="rt:behavior_type" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <Behavior>Protocol</Behavior> -->
|
||||
<xs:element name="Actor" type="rt:actor_type" maxOccurs ="1" minOccurs ="0"/>
|
||||
<xs:element name="Scope" type="rt:scope_type" maxOccurs ="1" minOccurs ="0"/>
|
||||
<!-- <Actor>Client</Actor> or <Scope>Server</Scope> -->
|
||||
<xs:element name="Priority" type="rt:priority_type" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <Priority>p1</Priority> -->
|
||||
<xs:element name="IsNormative" type="rt:isNormative_type"/>
|
||||
<!-- <IsNormative>TRUE</IsNormative> -->
|
||||
<xs:element name="Verification" type="rt:verification_type"/>
|
||||
<!-- <Verification>Adapter</Verification> -->
|
||||
<xs:element name="VerificationComment" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<!-- <VerificationComment>Why the requirement is non-verifiable or unverified</VerificationComment> -->
|
||||
<xs:element name="ReviewComment" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<xs:element name="InternalId" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
|
||||
<xs:element name ="TDTextDiff" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name ="Delta" type="rt:delta_type" minOccurs ="0" maxOccurs="1"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:unique name="Unique_REQ_ID">
|
||||
<xs:selector xpath="rt:Requirement"/>
|
||||
<xs:field xpath="rt:REQ_ID"/>
|
||||
</xs:unique>
|
||||
</xs:element>
|
||||
</xs:schema>
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<TestSettings name="Local" id="b3852d91-e8e8-46ef-a881-a0b4142b4961" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
|
||||
<Description>These are default test settings for a local test run.</Description>
|
||||
<Deployment>
|
||||
<DeploymentItem filename="..\testtools\config\site.ptfconfig" />
|
||||
<DeploymentItem filename="..\testtools\config\TestConfig.xsd" />
|
||||
<DeploymentItem filename="TestLogging\TestLogging.ptfconfig" />
|
||||
<DeploymentItem filename="TestRequirementCapture\TestRequirementCapture.ptfconfig" />
|
||||
<DeploymentItem filename="TestProperties\TestProperties.ptfconfig" />
|
||||
<DeploymentItem filename="TestProperties\TestProperties.deployment.ptfconfig" />
|
||||
<DeploymentItem filename="TestProperties\Base.ptfconfig" />
|
||||
<DeploymentItem filename="TestChecker\TestChecker.ptfconfig" />
|
||||
<DeploymentItem filename="TestAdapter\TestAdapter.ptfconfig" />
|
||||
<DeploymentItem filename="TestAdapter\Powershell\" />
|
||||
<DeploymentItem filename="TestAdapter\CommandLine\" />
|
||||
</Deployment>
|
||||
<Execution hostProcessPlatform="MSIL">
|
||||
<TestTypeSpecific>
|
||||
<UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
|
||||
<AssemblyResolution>
|
||||
<TestDirectory useLoadContext="true" />
|
||||
</AssemblyResolution>
|
||||
</UnitTestRunConfig>
|
||||
<WebTestRunConfiguration testTypeId="4e7599fa-5ecb-43e9-a887-cd63cf72d207">
|
||||
<Browser name="Internet Explorer 7.0">
|
||||
<Headers>
|
||||
<Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" />
|
||||
<Header name="Accept" value="*/*" />
|
||||
<Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
|
||||
<Header name="Accept-Encoding" value="GZIP" />
|
||||
</Headers>
|
||||
</Browser>
|
||||
</WebTestRunConfiguration>
|
||||
</TestTypeSpecific>
|
||||
<AgentRule name="LocalMachineDefaultRole">
|
||||
</AgentRule>
|
||||
</Execution>
|
||||
</TestSettings>
|
|
@ -0,0 +1,7 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM User can get the property value and use it directly in the script via the environment variables with “ptfprop” prefix.
|
||||
|
||||
echo PtfAdReturn="%ptfpropFeatureName%""
|
||||
exit 0
|
|
@ -0,0 +1,14 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM PTF invokes a cmd script using the following parameters:
|
||||
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
|
||||
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
|
||||
REM %3% Help text of the method.
|
||||
REM %4% First input parameter.
|
||||
REM %5% Second input parameter.
|
||||
|
||||
echo PtfAdReturn=%3
|
||||
exit 0
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM PTF invokes a cmd script using the following parameters:
|
||||
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
|
||||
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
|
||||
REM %3% Help text of the method.
|
||||
REM %4% First input parameter.
|
||||
REM %5% Second input parameter.
|
||||
|
||||
echo PtfAdReturn=%2
|
||||
exit 0
|
|
@ -0,0 +1,12 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM PTF invokes a cmd script using the following parameters:
|
||||
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
|
||||
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
|
||||
REM %3% Help text of the method.
|
||||
REM %4% First input parameter.
|
||||
REM %5% Second input parameter.
|
||||
|
||||
echo PtfAdReturn=%4
|
||||
exit 0
|
|
@ -0,0 +1,12 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM PTF invokes a cmd script using the following parameters:
|
||||
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
|
||||
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
|
||||
REM %3% Help text of the method.
|
||||
REM %4% First input parameter.
|
||||
REM %5% Second input parameter.
|
||||
|
||||
echo PtfAdReturn=%1
|
||||
exit 0
|
|
@ -0,0 +1,7 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM Pass a failure message back to PTF
|
||||
|
||||
echo PtfAdFailureMessage="PtfAdFailureMessage"
|
||||
exit -1
|
|
@ -0,0 +1,7 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
REM Command "set ptfprop" can be used in the script to display all properties in the PTFconfig.
|
||||
|
||||
set ptfprop
|
||||
exit 0
|
|
@ -0,0 +1,6 @@
|
|||
#############################################################################
|
||||
# Copyright (c) Microsoft. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#############################################################################
|
||||
|
||||
return $value
|
|
@ -0,0 +1,6 @@
|
|||
#############################################################################
|
||||
# Copyright (c) Microsoft. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#############################################################################
|
||||
|
||||
return $number
|
|
@ -0,0 +1,6 @@
|
|||
#############################################################################
|
||||
# Copyright (c) Microsoft. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#############################################################################
|
||||
|
||||
return $str
|
|
@ -0,0 +1,7 @@
|
|||
#############################################################################
|
||||
# Copyright (c) Microsoft. All rights reserved.
|
||||
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
#############################################################################
|
||||
|
||||
# Throw an exception
|
||||
throw $exceptionMessage
|
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestAdapter")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestAdapter")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("192855d0-6d37-4cc5-9f2e-1e0570a5e2e1")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,85 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>
|
||||
</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestAdapter</RootNamespace>
|
||||
<AssemblyName>TestAdapter</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestManagedAdapter.cs" />
|
||||
<Compile Include="TestInteractiveAdapter.cs" />
|
||||
<Compile Include="TestPowershellAdapter.cs" />
|
||||
<Compile Include="TestRpcAdapter.cs" />
|
||||
<Compile Include="TestScriptAdapter.cs" />
|
||||
<Compile Include="TestTcpAdapter.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="PowerShell\ThrowException.ps1" />
|
||||
<Content Include="CommandLine\SetFailureMessage.cmd" />
|
||||
<Content Include="CommandLine\GetPtfProp.cmd" />
|
||||
<Content Include="CommandLine\ReturnInputParameterValue.cmd" />
|
||||
<Content Include="PowerShell\ReturnInt.ps1" />
|
||||
<Content Include="PowerShell\ReturnString.ps1" />
|
||||
<Content Include="CommandLine\ReturnHelpText.cmd" />
|
||||
<Content Include="CommandLine\SetPtfProp.cmd" />
|
||||
<Content Include="TestAdapter.ptfconfig" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\testtools.extension\TestTools.Extension.csproj">
|
||||
<Project>{e41414b3-95f3-430f-823b-55b82f0ba198}</Project>
|
||||
<Name>TestTools.Extension</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
|
||||
<Name>TestTools.VSTS</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
|
||||
<Name>TestTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Utilities\Utilities.csproj">
|
||||
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
|
||||
<Name>Utilities</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CommandLine\ReturnInputParameterNameAndType.cmd" />
|
||||
<Content Include="CommandLine\ReturnTypeOfReturnValue.cmd" />
|
||||
<Content Include="PowerShell\ReturnBool.ps1" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="FeatureName" value="PTF:Adapter" />
|
||||
|
||||
<!-- Properties used in testing Tcp adapter -->
|
||||
<Property name="MyTcpAdapter.hostname" value="127.0.0.1" />
|
||||
<Property name="MyTcpAdapter.port" value="8000" />
|
||||
</Properties>
|
||||
<Adapters>
|
||||
<Adapter xsi:type="managed" name="IManagedAdapter" adaptertype="Microsoft.Protocols.TestTools.Test.TestAdapter.ManagedAdapter"/>
|
||||
<Adapter xsi:type="script" name="IScriptAdapter" scriptdir=".\"/>
|
||||
<Adapter xsi:type="powershell" name="IPowershellAdapter" scriptdir=".\"/>
|
||||
<Adapter xsi:type="interactive" name="IInteractiveAdapter"/>
|
||||
<Adapter xsi:type="rpc" name="IMyRpcAdapter"/>
|
||||
<Adapter xsi:type="managed" name="IMyTcpAdapter" adaptertype="Microsoft.Protocols.TestTools.Test.TestAdapter.MyTcpAdapter"/>
|
||||
</Adapters>
|
||||
<!-- The default profile name. Provide maximum logging. -->
|
||||
<TestLog defaultprofile="Verbose">
|
||||
|
||||
<Profiles>
|
||||
<!-- Name of the profile. extends indicates the profile will be included.-->
|
||||
<Profile name="Verbose" extends="Error">
|
||||
<!-- Show on Console -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,86 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface definition of an interactive adapter.
|
||||
/// </summary>
|
||||
public interface IInteractiveAdapter : IAdapter
|
||||
{
|
||||
[MethodHelp("Please enter the same value with \"Number\" and then press \"Continue\" button.")]
|
||||
int ReturnInt(int Number);
|
||||
|
||||
[MethodHelp("Please enter the same string with \"String\" (case sensitive) and then press \"Continue\" button.")]
|
||||
string ReturnString(string String);
|
||||
|
||||
[MethodHelp("Please press \"Abort\" button.")]
|
||||
void Abort();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Interactive adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestInteractiveAdapter : TestClassBase
|
||||
{
|
||||
IInteractiveAdapter interactiveAdapter;
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
protected override void TestInitialize()
|
||||
{
|
||||
interactiveAdapter = BaseTestSite.GetAdapter<IInteractiveAdapter>();
|
||||
}
|
||||
|
||||
protected override void TestCleanup()
|
||||
{
|
||||
interactiveAdapter.Reset();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void InteractiveAdapterReturnInt()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
0,
|
||||
interactiveAdapter.ReturnInt(0),
|
||||
"Returned value should be 0");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void InteractiveAdapterReturnString()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"PTF",
|
||||
interactiveAdapter.ReturnString("PTF"),
|
||||
"Returned value should be PTF");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(AssertInconclusiveException))]
|
||||
public void InteractiveAdapterAbort()
|
||||
{
|
||||
interactiveAdapter.Abort();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface definition of a managed adapter
|
||||
/// </summary>
|
||||
public interface IManagedAdapter : IAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds two addends together
|
||||
/// </summary>
|
||||
int Sum(int x, int y);
|
||||
}
|
||||
|
||||
public class ManagedAdapter : ManagedAdapterBase, IManagedAdapter
|
||||
{
|
||||
public int Sum(int x, int y)
|
||||
{
|
||||
return x + y;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface definition of a managed adapter, but no relevant implementation
|
||||
/// </summary>
|
||||
public interface IUnimplementedManagedAdapter : IAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds two addends together
|
||||
/// </summary>
|
||||
int Sum(int x, int y);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Managed adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestManagedAdapter : TestClassBase
|
||||
{
|
||||
IManagedAdapter managedAdapter;
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
protected override void TestInitialize()
|
||||
{
|
||||
managedAdapter = BaseTestSite.GetAdapter<IManagedAdapter>();
|
||||
}
|
||||
|
||||
protected override void TestCleanup()
|
||||
{
|
||||
managedAdapter.Reset();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ManagerAdapterCallSucceed()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
3 + 4,
|
||||
managedAdapter.Sum(3, 4),
|
||||
"Managed adapter should return 7");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(InvalidOperationException))]
|
||||
public void ManagerAdapterUnimplemented()
|
||||
{
|
||||
IUnimplementedManagedAdapter undefinedManagedAdapter = BaseTestSite.GetAdapter<IUnimplementedManagedAdapter>();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface definition of a powershell adapter
|
||||
/// </summary>
|
||||
public interface IPowershellAdapter : IAdapter
|
||||
{
|
||||
[MethodHelp("Powershell script will throw an exception.")]
|
||||
void ThrowException(string exceptionMessage);
|
||||
|
||||
[MethodHelp("Powershell script will return an integer.")]
|
||||
int ReturnInt(int number);
|
||||
|
||||
[MethodHelp("Powershell script will return a string.")]
|
||||
string ReturnString(string str);
|
||||
|
||||
[MethodHelp("Powershell script will return a boolean.")]
|
||||
bool ReturnBool(bool value);
|
||||
|
||||
[MethodHelp("The relevant Powershell script does not exist")]
|
||||
void ScriptNotExisted();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Powershell adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestPowershellAdapter : TestClassBase
|
||||
{
|
||||
IPowershellAdapter powershellAdapter;
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
protected override void TestInitialize()
|
||||
{
|
||||
powershellAdapter = BaseTestSite.GetAdapter<IPowershellAdapter>();
|
||||
}
|
||||
|
||||
protected override void TestCleanup()
|
||||
{
|
||||
powershellAdapter.Reset();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(InvalidOperationException))]
|
||||
public void PowershellAdapterThrowException()
|
||||
{
|
||||
powershellAdapter.ThrowException("exception");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void PowershellAdapterReturnInt()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
0,
|
||||
powershellAdapter.ReturnInt(0),
|
||||
"Powershell adapter should return 0");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void PowershellAdpaterReturnString()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"PTF",
|
||||
powershellAdapter.ReturnString("PTF"),
|
||||
"Powershell adapter should return PTF");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void PowershellAdapterReturnBool()
|
||||
{
|
||||
BaseTestSite.Assert.IsTrue(
|
||||
powershellAdapter.ReturnBool(true),
|
||||
"Powershell adapter should return true");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. PowerShell script file (ScriptNotExisted.ps1) can not be found.")]
|
||||
public void PowershellAdapterScriptNotExisted()
|
||||
{
|
||||
powershellAdapter.ScriptNotExisted();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestTools.Messages;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
public interface IMyRpcAdapter : IRpcAdapter
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Rpc adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestRpcAdapter : TestClassBase
|
||||
{
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void RpcAdapterGetAdapter()
|
||||
{
|
||||
IMyRpcAdapter myRpcAdapter = BaseTestSite.GetAdapter<IMyRpcAdapter>();
|
||||
BaseTestSite.Assert.IsNotNull(myRpcAdapter, "Get rpc adapter should succeed.");
|
||||
myRpcAdapter.Reset();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,147 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
public interface IScriptAdapter : IAdapter
|
||||
{
|
||||
[MethodHelp("The script does not exist.")]
|
||||
void ScriptNotExisted();
|
||||
|
||||
[MethodHelp("Return Help text")]
|
||||
string ReturnHelpText();
|
||||
|
||||
[MethodHelp("Display all properties in the PTFconfig.")]
|
||||
void SetPtfProp();
|
||||
|
||||
[MethodHelp("Return the value of the property \"FeatureName\".")]
|
||||
string GetPtfProp();
|
||||
|
||||
[MethodHelp("Set failure message.")]
|
||||
void SetFailureMessage();
|
||||
|
||||
[MethodHelp("Return the type of the return value.")]
|
||||
string ReturnTypeOfReturnValue();
|
||||
|
||||
[MethodHelp("Return the value of the first input parameter.")]
|
||||
string ReturnInputParameterValue(string inputParameter);
|
||||
|
||||
[MethodHelp("Return the name and the type of the first input parameter.")]
|
||||
string ReturnInputParameterNameAndType(string inputParameter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Script adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestScriptAdapter : TestClassBase
|
||||
{
|
||||
IScriptAdapter scriptAdapter;
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
protected override void TestInitialize()
|
||||
{
|
||||
scriptAdapter = BaseTestSite.GetAdapter<IScriptAdapter>();
|
||||
}
|
||||
|
||||
protected override void TestCleanup()
|
||||
{
|
||||
scriptAdapter.Reset();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. Script SetFailureMessage.cmd " +
|
||||
"exited with non-zero code. Error code: -1. Failure message: PtfAdFailureMessage")]
|
||||
public void ScriptAdapterCheckFailureMessage()
|
||||
{
|
||||
scriptAdapter.SetFailureMessage();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ScriptAdapterReturnTypeOfReturnValue()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"PtfAdReturn:System.String",
|
||||
scriptAdapter.ReturnTypeOfReturnValue(),
|
||||
"Script adapter should return [PtfAdReturn:<type of returnValue>]");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. The invoking script file (ScriptNotExisted.cmd) can not be found.")]
|
||||
public void ScriptAdapterScriptNotExisted()
|
||||
{
|
||||
scriptAdapter.ScriptNotExisted();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ScriptAdapterReturnInputParameterValue()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"parameter value",
|
||||
scriptAdapter.ReturnInputParameterValue("parameter value"),
|
||||
"Script adapter should return the value of the first input parameter");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ScriptAdapterReturnInputParameterNameAndType()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"inputParameter:System.String",
|
||||
scriptAdapter.ReturnInputParameterNameAndType("parameter value"),
|
||||
"Script adapter should return the name and type of the first input parameter");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ScriptAdapterReturnHelpText()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"Return Help text",
|
||||
scriptAdapter.ReturnHelpText(),
|
||||
"Script adapter should return help text");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
[Description("Command \"set ptfprop\" can be used in the script to display all properties in the PTFconfig. " +
|
||||
"It could be verified by checking the test case log.")]
|
||||
public void ScriptAdapterSetPtfProp()
|
||||
{
|
||||
scriptAdapter.SetPtfProp();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void ScriptAdapterGetPtfProp()
|
||||
{
|
||||
string propName = "FeatureName";
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
BaseTestSite.Properties[propName],
|
||||
scriptAdapter.GetPtfProp(),
|
||||
"Script adapter should return property value of {0}", propName);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestTools.Messages;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
|
||||
{
|
||||
public interface IMyTcpAdapter: IAdapter
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class MyTcpAdapter : TcpAdapterBase, IMyTcpAdapter
|
||||
{
|
||||
public MyTcpAdapter()
|
||||
: base("MyTcpAdapter")
|
||||
{
|
||||
}
|
||||
public override void Initialize(ITestSite testSite)
|
||||
{
|
||||
base.Initialize(testSite);
|
||||
|
||||
// Call TcpAdapterBase.Connect() to verify if it works.
|
||||
Connect();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF adapter: Rpc adapter
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestTcpAdapter : TestClassBase
|
||||
{
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestAdapter");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
#region Test cases
|
||||
[TestMethod]
|
||||
[TestCategory("TestAdapter")]
|
||||
public void TcpAdapterTryConnect()
|
||||
{
|
||||
// Set up a tcp listener, and wait for the tcp connect
|
||||
TcpListener tcpListener = new
|
||||
TcpListener(IPAddress.Parse(BaseTestSite.Properties["MyTcpAdapter.hostname"]), Int32.Parse(BaseTestSite.Properties["MyTcpAdapter.port"]));
|
||||
tcpListener.Start();
|
||||
|
||||
IMyTcpAdapter myTcpAdapter = BaseTestSite.GetAdapter<IMyTcpAdapter>();
|
||||
BaseTestSite.Assert.IsNotNull(myTcpAdapter, "Get tcp adapter should succeed.");
|
||||
myTcpAdapter.Reset();
|
||||
tcpListener.Stop();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestChecker")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestChecker")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("5f75baee-2487-4510-ac97-146c0fe23505")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,244 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestTools.Checking;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestChecker
|
||||
{
|
||||
/// <summary>
|
||||
/// A class used for testing.
|
||||
/// </summary>
|
||||
public class ClassForTest
|
||||
{
|
||||
public ClassForTest()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF checker: BaseTestSite.Assert
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestChecker : TestClassBase
|
||||
{
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestChecker");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckAreEqualPassed()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual<int>(2, 2, "The two values should be the same.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreEqual failed. Expected: <2 (0x00000002)>, Actual: <3 (0x00000003)>. The two values should be the same.")]
|
||||
public void CheckAreEqualFailed()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual<int>(2, 3, "The two values should be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckAreNotEqualPassed()
|
||||
{
|
||||
BaseTestSite.Assert.AreNotEqual<int>(2, 3, "The two values should be different.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotEqual failed. Expected: <2 (0x00000002)>, Actual: <2 (0x00000002)>. The two values should be different.")]
|
||||
public void CheckAreNotEqualFailed()
|
||||
{
|
||||
BaseTestSite.Assert.AreNotEqual<int>(2, 2, "The two values should be different.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckAreSamePassed()
|
||||
{
|
||||
ClassForTest object1 = new ClassForTest();
|
||||
ClassForTest object2 = object1;
|
||||
BaseTestSite.Assert.AreSame(object1, object2, "The two object references should be the same.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreSame failed. The two object references should be the same.")]
|
||||
public void CheckAreSameFailed()
|
||||
{
|
||||
ClassForTest object1 = new ClassForTest();
|
||||
ClassForTest object2 = new ClassForTest();
|
||||
BaseTestSite.Assert.AreSame(object1, object2, "The two object references should be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckAreNotSamePassed()
|
||||
{
|
||||
ClassForTest object1 = new ClassForTest();
|
||||
ClassForTest object2 = new ClassForTest();
|
||||
BaseTestSite.Assert.AreNotSame(object1, object2, "The two object references should be different.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotSame failed. The two object references should be different.")]
|
||||
public void CheckAreNotSameFailed()
|
||||
{
|
||||
ClassForTest object1 = new ClassForTest();
|
||||
ClassForTest object2 = object1;
|
||||
BaseTestSite.Assert.AreNotSame(object1, object2, "The two object references should be different.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.Fail failed. This case should raise a failure message.")]
|
||||
public void CheckAssertFailed()
|
||||
{
|
||||
BaseTestSite.Assert.Fail("This case should raise a failure message.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckAssertPassed()
|
||||
{
|
||||
BaseTestSite.Assert.Pass("This case should raise a success message.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertInconclusiveException), "Assert.Inconclusive is inconclusive. The case should raise an inconclusive message.")]
|
||||
public void CheckAssertInconclusive()
|
||||
{
|
||||
BaseTestSite.Assert.Inconclusive("The case should raise an inconclusive message.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsTruePassed()
|
||||
{
|
||||
BaseTestSite.Assert.IsTrue(true, "The value should be true.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsTrue failed. The value should be true.")]
|
||||
public void CheckIsTrueFailed()
|
||||
{
|
||||
BaseTestSite.Assert.IsTrue(false, "The value should be true.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsFalsePassed()
|
||||
{
|
||||
BaseTestSite.Assert.IsFalse(false, "The value should be false.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsFalse failed. The value should be false.")]
|
||||
public void CheckIsFalseFailed()
|
||||
{
|
||||
BaseTestSite.Assert.IsFalse(true, "The value should be false.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsInstanceOfTypePassed()
|
||||
{
|
||||
string a = "123";
|
||||
BaseTestSite.Assert.IsInstanceOfType(a, typeof(System.String), "The object should be an instance of type: System.String.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException),
|
||||
"Assert.IsInstanceOfType failed. Expected Type: <System.String>, Actual Type: <System.Int32>. The object should be an instance of type: System.String.")]
|
||||
public void CheckIsInstanceOfTypeFailed()
|
||||
{
|
||||
int a = 123;
|
||||
BaseTestSite.Assert.IsInstanceOfType(a, typeof(System.String), "The object should be an instance of type: System.String.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsNotInstanceOfTypePassed()
|
||||
{
|
||||
int a = 123;
|
||||
BaseTestSite.Assert.IsNotInstanceOfType(a, typeof(System.String), "The object should not be an instance of type: System.String.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException),
|
||||
"Assert.IsNotInstanceOfType failed. Wrong Type: <System.String>, Actual Type: <System.String>. The object should not be an instance of type: System.String.")]
|
||||
public void CheckIsNotInstanceOfTypeFailed()
|
||||
{
|
||||
string a = "123";
|
||||
BaseTestSite.Assert.IsNotInstanceOfType(a, typeof(System.String), "The object should not be an instance of type: System.String.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsNullPassed()
|
||||
{
|
||||
BaseTestSite.Assert.IsNull(null, "The object reference should be null.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNull failed. The object reference should be null.")]
|
||||
public void CheckIsNullFailed()
|
||||
{
|
||||
BaseTestSite.Assert.IsNull("notNull", "The object reference should be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsNotNullPassed()
|
||||
{
|
||||
BaseTestSite.Assert.IsNotNull("notNull", "The object reference should not be null.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException),
|
||||
"Assert.IsNotNull failed. The object reference should not be null.")]
|
||||
public void CheckIsNotNullFailed()
|
||||
{
|
||||
BaseTestSite.Assert.IsNotNull(null, "The object reference should not be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckIsSuccessPassed()
|
||||
{
|
||||
BaseTestSite.Assert.IsSuccess(1, "The given error code should be a successful result.");
|
||||
}
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsSuccess failed. The given error code should be a successful result.")]
|
||||
public void CheckIsSuccessFailed()
|
||||
{
|
||||
BaseTestSite.Assert.IsSuccess(-1, "The given error code should be a successful result.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckUnverified()
|
||||
{
|
||||
BaseTestSite.Assert.Unverified("This could not be verified currently.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestChecker")]
|
||||
public void CheckErrors()
|
||||
{
|
||||
BaseTestSite.Assert.CheckErrors();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>
|
||||
</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{483F6AF6-773A-441E-B38C-E3E222692D1C}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestChecker</RootNamespace>
|
||||
<AssemblyName>TestChecker</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestChecker.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="TestChecker.ptfconfig" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
|
||||
<Name>TestTools.VSTS</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
|
||||
<Name>TestTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Utilities\Utilities.csproj">
|
||||
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
|
||||
<Name>Utilities</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
<Properties>
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="FeatureName" value="PTF:Checker"/>
|
||||
</Properties>
|
||||
<TestLog defaultprofile="Verbose">
|
||||
<Sinks>
|
||||
<Console id="Console" />
|
||||
</Sinks>
|
||||
|
||||
<Profiles>
|
||||
<!-- Name of the profile. extends indicates the profile will be included.-->
|
||||
<Profile name="Verbose" extends="Error">
|
||||
<!-- Show on Console -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestLogging")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestLogging")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("9bdbcf67-d0f8-479d-a2fb-08a0d29b17a8")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,111 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.Protocols.TestTools.Logging;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestLogging
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines a custom log sink.
|
||||
/// </summary>
|
||||
public class MySink : TextSink
|
||||
{
|
||||
StreamWriter sw;
|
||||
public MySink(string name)
|
||||
: base(name)
|
||||
{
|
||||
sw = new StreamWriter(String.Format("..\\..\\[TestLogging_MySinkLog]{0} MySinkLog.txt", DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff")));
|
||||
}
|
||||
|
||||
protected override TextWriter Writer
|
||||
{
|
||||
get { return sw; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Test cases to test PTF logging
|
||||
/// The cases do not verify if the generated log is expected. It should be done manually.
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestLogging : TestClassBase
|
||||
{
|
||||
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestLogging");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
[TestCategory("TestLogging")]
|
||||
[TestMethod]
|
||||
public void AddGroupLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.BeginGroup, "BeginGroup message");
|
||||
BaseTestSite.Log.Add(LogEntryKind.EndGroup, "EndGroup message");
|
||||
}
|
||||
|
||||
[TestCategory("TestLogging")]
|
||||
[TestMethod]
|
||||
public void AddCheckpointLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.Checkpoint, "Checkpoint message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddTestStepLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.TestStep, "TestStep message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddCommentLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.Comment, "Comment message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddWarningLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.Warning, "Warning message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddDebugLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.Debug, "Debug message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddMethodLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.EnterMethod, "EnterMethod message");
|
||||
BaseTestSite.Log.Add(LogEntryKind.ExitMethod, "ExitMethod message");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestLogging")]
|
||||
public void AddAdapterLog()
|
||||
{
|
||||
BaseTestSite.Log.Add(LogEntryKind.EnterAdapter, "EnterAdapter message");
|
||||
BaseTestSite.Log.Add(LogEntryKind.ExitAdapter, "ExitAdapter message");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>
|
||||
</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TestLogging</RootNamespace>
|
||||
<AssemblyName>TestLogging</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestLogging.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="TestLogging.ptfconfig" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
|
||||
<Name>TestTools.VSTS</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
|
||||
<Name>TestTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Utilities\Utilities.csproj">
|
||||
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
|
||||
<Name>Utilities</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,164 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="FeatureName" value="PTF:Logging" />
|
||||
|
||||
<!-- Enable automatic network capturing -->
|
||||
<Group name="PTF">
|
||||
<Group name="NetworkCapture">
|
||||
<Property name="Enabled" value="true" />
|
||||
<Property name="CaptureFileFolder" value="C:\PTFCaptureFileFolder" />
|
||||
<Property name="StopRunningOnError" value="false" />
|
||||
</Group>
|
||||
</Group>
|
||||
|
||||
<!-- This feature enables a user to display expected/actual runtime of the test suite on the console. -->
|
||||
<Property name="ExpectedExecutionTime" value="5000" />
|
||||
|
||||
</Properties>
|
||||
|
||||
<!-- The default profile name. Provide maximum logging. -->
|
||||
<TestLog defaultprofile="Verbose">
|
||||
<Sinks>
|
||||
<!-- Custom log -->
|
||||
<Sink id="MySink" type="Microsoft.Protocols.TestTools.Test.TestLogging.MySink" />
|
||||
|
||||
<!-- Beacon Log sink-->
|
||||
<Sink id="Beacon" type="Microsoft.Protocols.TestTools.Logging.BeaconLogSink"/>
|
||||
|
||||
<!-- File log sink. Id is name, directory is the dir which log will stored in. file is the name of log. Format can be text or xml-->
|
||||
<File id="MyLog" directory="..\..\" file="MyLog.txt" format="text"/>
|
||||
<File id="MyXMLLog" directory="..\..\" file="MyXmlLog.xml" format="xml"/>
|
||||
|
||||
<!-- Color console log sink -->
|
||||
<Console id="RedConsole" />
|
||||
<Console id="GreenConsole" />
|
||||
<Console id="YellowConsole" />
|
||||
<Console id="WhiteConsole" />
|
||||
</Sinks>
|
||||
|
||||
<Profiles>
|
||||
<!-- Name of the profile. extends indicates the profile will be included.-->
|
||||
<Profile name="Verbose" extends="Error">
|
||||
<!-- Show log in Visual studio -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="Console" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="Console" delete="false"/>
|
||||
|
||||
<!-- Command line Console & Color console logging -->
|
||||
<!-- Console logging lets the user see the log of the test run as it proceeds. The user can terminate a running test case by looking at its progress. -->
|
||||
<!-- Color Console Logging makes Log message displayed in the Console can be colorized. -->
|
||||
<Rule kind="TestStep" sink="YellowConsole" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="GreenConsole" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="RedConsole" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="Comment" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="Warning" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="Debug" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="RedConsole" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="YellowConsole" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="GreenConsole" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="CommandLineConsole" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="CommandLineConsole" delete="false"/>
|
||||
|
||||
<!-- Etw logging -->
|
||||
<!-- The Event Tracing for Windows (ETW) logging sink can log test suite logs and test messages to an ETW provider.
|
||||
A user can capture these ETW logs using captures tools, such as the Microsoft Message Analyzer.-->
|
||||
<Rule kind="TestStep" sink="Etw" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Etw" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Etw" delete="false"/>
|
||||
<Rule kind="Comment" sink="Etw" delete="false"/>
|
||||
<Rule kind="Warning" sink="Etw" delete="false"/>
|
||||
<Rule kind="Debug" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Etw" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Etw" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="Etw" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="Etw" delete="false"/>
|
||||
|
||||
<!-- Beacon logging -->
|
||||
<!-- Beacon logging provides a way for PTF users to log necessary log messages as network packets.
|
||||
A user can define a beacon logging sink in the PTF Config file which is similar with other log sinks, and then the log messages are sent to the UDP broadcast address using port 58727. -->
|
||||
<Rule kind="TestStep" sink="Beacon" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Beacon" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Beacon" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Beacon" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Beacon" delete="false"/>
|
||||
<Rule kind="Comment" sink="Beacon" delete="false"/>
|
||||
<Rule kind="Warning" sink="Beacon" delete="false"/>
|
||||
<Rule kind="Debug" sink="Beacon" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Beacon" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Beacon" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Beacon" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="Beacon" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="Beacon" delete="false"/>
|
||||
|
||||
<!-- Custom logging: MySink -->
|
||||
<Rule kind="TestStep" sink="MySink" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="MySink" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="MySink" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="MySink" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="MySink" delete="false"/>
|
||||
<Rule kind="Comment" sink="MySink" delete="false"/>
|
||||
<Rule kind="Warning" sink="MySink" delete="false"/>
|
||||
<Rule kind="Debug" sink="MySink" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="MySink" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="MySink" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="MySink" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="MySink" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="MySink" delete="false"/>
|
||||
|
||||
<!-- File Logging: text -->
|
||||
<!-- File logging provides a way for PTF users to log necessary messages to files. PTF provides two logging file formats, plain text and XML. -->
|
||||
<!-- The plain text format is suitable for viewing the log file using text editors. -->
|
||||
<Rule kind="TestStep" sink="MyLog" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="MyLog" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="MyLog" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="MyLog" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="MyLog" delete="false"/>
|
||||
<Rule kind="Comment" sink="MyLog" delete="false"/>
|
||||
<Rule kind="Warning" sink="MyLog" delete="false"/>
|
||||
<Rule kind="Debug" sink="MyLog" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="MyLog" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="MyLog" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="MyLog" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="MyLog" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="MyLog" delete="false"/>
|
||||
|
||||
<!-- File Logging: XML -->
|
||||
<!-- File logging provides a way for PTF users to log necessary messages to files. PTF provides two logging file formats, plain text and XML. -->
|
||||
<!-- The XML format is for analysing the test log using tools, such as the Reporting Tool. -->
|
||||
<Rule kind="TestStep" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="Comment" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="Warning" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="Debug" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="BeginGroup" sink="MyXMLLog" delete="false"/>
|
||||
<Rule kind="EndGroup" sink="MyXMLLog" delete="false"/>
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,82 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A8E3F732-A7B1-4682-AFED-38FAEA818E12}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
Local.testsettings = Local.testsettings
|
||||
RunTest.cmd = RunTest.cmd
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLogging", "TestLogging\TestLogging.csproj", "{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAdapter", "TestAdapter\TestAdapter.csproj", "{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestChecker", "TestChecker\TestChecker.csproj", "{483F6AF6-773A-441E-B38C-E3E222692D1C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestRequirementCapture", "TestRequirementCapture\TestRequirementCapture.csproj", "{5944E70C-7885-4E3C-B28E-E870A358E64E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProperties", "TestProperties\TestProperties.csproj", "{3034A41C-79A3-4D18-8388-FD23F5594CAD}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PTF", "PTF", "{288E5E04-8A41-4255-8C3D-FE3516C33DAE}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools", "..\testtools\TestTools.csproj", "{1CA2B935-3224-40F1-84BC-47FA1A9B242E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.VSTS", "..\testtools.vsts\TestTools.VSTS.csproj", "{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utilities", "Utilities\Utilities.csproj", "{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Extension", "..\testtools.extension\TestTools.Extension.csproj", "{E41414B3-95F3-430F-823B-55B82F0BA198}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{1CA2B935-3224-40F1-84BC-47FA1A9B242E} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
|
||||
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
|
||||
{E41414B3-95F3-430F-823B-55B82F0BA198} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
<Property name="BasePropertyName" value="BasePropertyValue" />
|
||||
<Property name="DuplicatePropertyName" value="Base" />
|
||||
</Properties>
|
||||
</TestSite>
|
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestProperties")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestProperties")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("49766b6f-fd46-4a62-900b-823ef07e8220")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,108 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestProperties
|
||||
{
|
||||
/// <summary>
|
||||
/// Test cases to test reading properties defined in .ptfconfig file
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestProperties : TestClassBase
|
||||
{
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestProperties");
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadNormalProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"NormalPropertyValue",
|
||||
BaseTestSite.Properties["NormalPropertyName"],
|
||||
"Value of property \"NormalPropertyName\" should be \"NormalPropertyValue\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadDuplicateProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"TestProperties",
|
||||
BaseTestSite.Properties["DuplicatePropertyName"],
|
||||
"Value of property \"DuplicatePropertyName\" should be \"TestProperties\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadIncludedProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"BasePropertyValue",
|
||||
BaseTestSite.Properties["BasePropertyName"],
|
||||
"Value of property \"BasePropertyName\" should be \"BasePropertyValue\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadRootGroupProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"RootPropertyValue",
|
||||
BaseTestSite.Properties["Root.Name"],
|
||||
"Value of property \"Root.Name\" should be \"RootPropertyValue\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadLeafGroupProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"LeafPropertyValue",
|
||||
BaseTestSite.Properties["Root.Leaf.Name"],
|
||||
"Value of property \"Root.Leaf.Name\" should be \"LeafPropertyValue\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadEmptyProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"",
|
||||
BaseTestSite.Properties[""],
|
||||
"Value of property \"\" should be \"\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadDeploymentProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
"DeploymentPropertyValue",
|
||||
BaseTestSite.Properties["DeploymentPropertyName"],
|
||||
"Value of property \"DeploymentPropertyName\" should be \"DeploymentPropertyValue\"");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestProperties")]
|
||||
public void ReadNonExistedProperty()
|
||||
{
|
||||
BaseTestSite.Assert.AreEqual(
|
||||
null,
|
||||
BaseTestSite.Properties["NonExistedProperty"],
|
||||
"Read a non existed property should return null");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>
|
||||
</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{3034A41C-79A3-4D18-8388-FD23F5594CAD}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestProperties</RootNamespace>
|
||||
<AssemblyName>TestProperties</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Base.ptfconfig" />
|
||||
<Content Include="TestProperties.ptfconfig" />
|
||||
<Content Include="TestProperties.deployment.ptfconfig" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
|
||||
<Name>TestTools.VSTS</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
|
||||
<Name>TestTools</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestProperties.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
<Property name="DeploymentPropertyName" value="DeploymentPropertyValue" />
|
||||
</Properties>
|
||||
</TestSite>
|
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Include>
|
||||
<File name="Base.ptfconfig"/>
|
||||
</Include>
|
||||
|
||||
<Properties>
|
||||
<!-- Properties for testing -->
|
||||
<Group name="Root">
|
||||
<Property name="Name" value="RootPropertyValue" />
|
||||
<Group name="Leaf">
|
||||
<Property name="Name" value="LeafPropertyValue">
|
||||
</Property>
|
||||
</Group>
|
||||
</Group>
|
||||
|
||||
<Property name="NormalPropertyName" value="NormalPropertyValue" />
|
||||
<Property name="" value="" />
|
||||
<Property name="DuplicatePropertyName" value="TestProperties" />
|
||||
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="FeatureName" value="PTF:Properties" />
|
||||
</Properties>
|
||||
|
||||
<!-- The default profile name. Provide maximum logging. -->
|
||||
<TestLog defaultprofile="Verbose">
|
||||
<Profiles>
|
||||
<!-- Name of the profile. extends indicates the profile will be included.-->
|
||||
<Profile name="Verbose" extends="Error">
|
||||
<!-- Show on Console -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestRequirementCapture")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestRequirementCapture")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("3e68134d-4eac-42c2-8ee1-6ca784ac09b6")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,134 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<ns1:ReqTable xmlns:ns1="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable">
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R1</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>1.8</ns1:Doc_Sect>
|
||||
<ns1:Description>[In Vendor-Extensible Fields]This protocol[MS-LSAT] uses NTSTATUS values as specified in [MS-ERREF] section 2.3.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p2</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R2</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>1.8</ns1:Doc_Sect>
|
||||
<ns1:Description>[In Vendor-Extensible Fields]Vendors are free to choose their own values for this field, provided that the C bit (0x20000000) is set, which indicates that it is a customer code.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p2</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R3</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Scenario>S1,S2</ns1:Scenario>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R4</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R5</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R6</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R7</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.2</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R8</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.3</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R9</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.4</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R10</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.5</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R11</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.6</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R12</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.7</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
<ns1:Requirement>
|
||||
<ns1:REQ_ID>REPORTING_R13</ns1:REQ_ID>
|
||||
<ns1:Doc_Sect>2.8</ns1:Doc_Sect>
|
||||
<ns1:Description>TCP/IP<1>.</ns1:Description>
|
||||
<ns1:Behavior>Protocol</ns1:Behavior>
|
||||
<ns1:Scope>Both</ns1:Scope>
|
||||
<ns1:Priority>p0</ns1:Priority>
|
||||
<ns1:IsNormative>Normative</ns1:IsNormative>
|
||||
<ns1:Verification>Test Case</ns1:Verification>
|
||||
</ns1:Requirement>
|
||||
</ns1:ReqTable>
|
|
@ -0,0 +1,269 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Protocols.TestTools;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Protocols.TestTools.Test.Utilities;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.TestRequirementCapture
|
||||
{
|
||||
/// <summary>
|
||||
/// Test cases to test PTF RequirementCapture
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class TestRequirementCapture : TestClassBase
|
||||
{
|
||||
[ClassInitialize]
|
||||
public static void ClassInitialize(TestContext testContext)
|
||||
{
|
||||
TestClassBase.Initialize(testContext, "TestRequirementCapture");
|
||||
BaseTestSite.DefaultProtocolDocShortName = "TestRequirementCapture";
|
||||
}
|
||||
|
||||
[ClassCleanup]
|
||||
public static void ClassCleanup()
|
||||
{
|
||||
TestClassBase.Cleanup();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementAddRequirement()
|
||||
{
|
||||
BaseTestSite.Log.Add(
|
||||
LogEntryKind.Checkpoint,
|
||||
RequirementId.Make(BaseTestSite.DefaultProtocolDocShortName, 0, "Add a requirement."));
|
||||
BaseTestSite.CaptureRequirement(0, "Add a requirement.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementAreEqualPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreEqual(1, 1, 1, "The two values should be equal.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreEqual failed on requirement TestRequirementCapture_R2. " +
|
||||
"Expected: <1 (0x00000001)>, Actual: <2 (0x00000002)>. The two values should be equal.")]
|
||||
public void CaptureRequirementAreEqualFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreEqual(1, 2, 2, "The two values should be equal.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementAreSamePassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreSame("a", "a", 3, "The two strings should be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreSame failed on requirement TestRequirementCapture_R4. The two strings should be the same.")]
|
||||
public void CaptureRequirementAreSameFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreSame("a", "b", 4, "The two strings should be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementAreNotSamePassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreNotSame("a", "b", 5, "The two strings should not be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotSame failed on requirement TestRequirementCapture_R6. The two strings should not be the same.")]
|
||||
public void CaptureRequirementAreNotSameFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreNotSame("a", "a", 6, "The two strings should not be the same.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIfTruePassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(true, 7, "The value should be true.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsTrue failed on requirement TestRequirementCapture_R8. The value should be true.")]
|
||||
public void CaptureRequirementIfTrueFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 8, "The value should be true.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIfFalsePassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsFalse(false, 9, "The value should be false.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsFalse failed on requirement TestRequirementCapture_R10. The value should be false.")]
|
||||
public void CaptureRequirementIfFalseFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsFalse(true, 10, "The value should be false.");
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIsInstanceOfPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsInstanceOfType(
|
||||
2,
|
||||
typeof(System.Int32),
|
||||
11,
|
||||
"The type of the instance should be System.Int32.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsInstanceOfType failed on requirement TestRequirementCapture_R12. " +
|
||||
"Expected Type: <System.String>, Actual Type: <System.Int32>. The type of the instance should be System.String.")]
|
||||
public void CaptureRequirementIsInstanceOfFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsInstanceOfType(
|
||||
2,
|
||||
typeof(System.String),
|
||||
12,
|
||||
"The type of the instance should be System.String.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIsNotInstanceOfPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNotInstanceOfType(
|
||||
2,
|
||||
typeof(System.String),
|
||||
13,
|
||||
"The type of the instance should not be System.String.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNotInstanceOfType failed on requirement TestRequirementCapture_R14. " +
|
||||
"Wrong Type: <System.Int32>, Actual Type: <System.Int32>. The type of the instance should not be System.Int32.")]
|
||||
public void CaptureRequirementIsNotInstanceOfFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNotInstanceOfType(
|
||||
2,
|
||||
typeof(System.Int32),
|
||||
14,
|
||||
"The type of the instance should not be System.Int32.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIsNotNullPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNotNull("123", 15, "The value should not be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNotNull failed on requirement TestRequirementCapture_R16. The value should not be null.")]
|
||||
public void CaptureRequirementIsNotNullFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNotNull(null, 16, "The value should not be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIsNullPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNull(null, 17, "The value should be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNull failed on requirement TestRequirementCapture_R18. The value should be null.")]
|
||||
public void CaptureRequirementIsNullFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsNull("123", 18, "The value should be null.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
public void CaptureRequirementIsSuccessPassed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsSuccess(1, 19, "The HRESULT value should be success");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsSuccess failed on requirement TestRequirementCapture_R20. The HRESULT value should be success.")]
|
||||
public void CaptureRequirementIsSuccessFailed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsSuccess(-1, 20, "The HRESULT value should be success.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The test case will not fail because SkipMAYRequirements is set to true in PTFConfig")]
|
||||
public void CaptureRequirementSkipMayRequirement()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 21, "The value should be true.", RequirementType.May);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The test case will not fail because SkipMUSTRequirements is set to true in PTFConfig")]
|
||||
public void CaptureRequirementSkipMustRequirement()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 22, "The value should be true.", RequirementType.Must);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The test case will not fail because SkipSHOULDRequirements is set to true in PTFConfig")]
|
||||
public void CaptureRequirementSkipShouldRequirement()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 23, "The value should be true.", RequirementType.Should);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The test case will not fail because SkipPRODUCTRequirements is set to true in PTFConfig")]
|
||||
public void CaptureRequirementSkipProductRequirement()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 24, "The value should be true.", RequirementType.Product);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The expected value is reclaimed to 1 in PTFConfig")]
|
||||
public void CaptureRequirementExpectedValueReclaimed()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreEqual(2, 1, 25, "The two values should be equal.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("The case will not fail because the two requirements are set as ExceptionalRequirements in PTFConfig")]
|
||||
public void CaptureRequirementSkipExceptionalRequirements()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreEqual(2, 1, 26, "The two values should be equal.");
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(false, 27, "The value should be true.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[TestCategory("TestRequirementCapture")]
|
||||
[Description("An exception should be thrown if the same requirement id is used more than once but with different description.")]
|
||||
[PTFExpectedException(typeof(InvalidOperationException))]
|
||||
public void CaptureRequirementSameRequirementIdDifferentDescription()
|
||||
{
|
||||
BaseTestSite.CaptureRequirementIfAreEqual(1, 1, 28, "The two values should be equal.");
|
||||
BaseTestSite.CaptureRequirementIfIsTrue(true, 28, "The value should be true.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>
|
||||
</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{5944E70C-7885-4E3C-B28E-E870A358E64E}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestRequirementCapture</RootNamespace>
|
||||
<AssemblyName>TestRequirementCapture</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestRequirementCapture.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="TestRequirementCapture.ptfconfig" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
|
||||
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
|
||||
<Name>TestTools.VSTS</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\testtools\TestTools.csproj">
|
||||
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
|
||||
<Name>TestTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Utilities\Utilities.csproj">
|
||||
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
|
||||
<Name>Utilities</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
|
||||
|
||||
<Properties>
|
||||
|
||||
<!-- Test suite properties which value not changed when running in different test environments -->
|
||||
<Property name="FeatureName" value="PTF:RequirementCapture" />
|
||||
|
||||
<!--Requirements Section begins. All the property elements for the Requirements information should be in this section.-->
|
||||
|
||||
<!-- Skip the below requirement types from getting validated: -->
|
||||
<Property name="SkipMAYRequirements" value="true"/>
|
||||
<Property name="SkipMUSTRequirements" value="true"/>
|
||||
<Property name="SkipSHOULDRequirements" value="true"/>
|
||||
<Property name="SkipPRODUCTRequirements" value="true"/>
|
||||
|
||||
<!-- The real expected value of the requirement id 25 -->
|
||||
<Property name="RequirementTestRequirementCapture_R25" value="1" />
|
||||
|
||||
<!-- When an exceptional requirement fails, the test case continues running with the failure logged in entry CheckFailed and Exceptional Requirement. -->
|
||||
<!-- List the exceptional requirements as below -->
|
||||
<Property name="ExceptionalRequirements" value="TestRequirementCapture_R26,TestRequirementCapture_R27" />
|
||||
|
||||
<!--Requirements Section ends.-->
|
||||
|
||||
</Properties>
|
||||
<!-- The default profile name. Provide maximum logging. -->
|
||||
<TestLog defaultprofile="Verbose">
|
||||
<Profiles>
|
||||
<!-- Name of the profile. extends indicates the profile will be included.-->
|
||||
<Profile name="Verbose" extends="Error">
|
||||
<!-- Show on Console -->
|
||||
<Rule kind="TestStep" sink="Console" delete="false"/>
|
||||
<Rule kind="Checkpoint" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="Comment" sink="Console" delete="false"/>
|
||||
<Rule kind="Warning" sink="Console" delete="false"/>
|
||||
<Rule kind="Debug" sink="Console" delete="false"/>
|
||||
<Rule kind="TestFailed" sink="Console" delete="false"/>
|
||||
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
|
||||
<Rule kind="TestPassed" sink="Console" delete="false"/>
|
||||
</Profile>
|
||||
</Profiles>
|
||||
</TestLog>
|
||||
</TestSite>
|
|
@ -0,0 +1,49 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.Test.Utilities
|
||||
{
|
||||
/// <summary>
|
||||
/// An attrubite used for check if an expected exception is thrown in the case.
|
||||
/// It will check both exception type and message.
|
||||
/// </summary>
|
||||
public sealed class PTFExpectedException : ExpectedExceptionBaseAttribute
|
||||
{
|
||||
private Type ptfExpectedExceptionType;
|
||||
private string ptfExpectedExceptionMessage;
|
||||
|
||||
public PTFExpectedException(Type expectedExceptionType)
|
||||
{
|
||||
ptfExpectedExceptionType = expectedExceptionType;
|
||||
ptfExpectedExceptionMessage = string.Empty;
|
||||
}
|
||||
|
||||
public PTFExpectedException(Type expectedExceptionType, string expectedExceptionMessage)
|
||||
{
|
||||
ptfExpectedExceptionType = expectedExceptionType;
|
||||
ptfExpectedExceptionMessage = expectedExceptionMessage;
|
||||
}
|
||||
|
||||
protected override void Verify(Exception exception)
|
||||
{
|
||||
Assert.IsNotNull(exception);
|
||||
|
||||
Assert.IsInstanceOfType(
|
||||
exception,
|
||||
ptfExpectedExceptionType,
|
||||
"Wrong type of exception was thrown.");
|
||||
|
||||
if (!ptfExpectedExceptionMessage.Length.Equals(0))
|
||||
{
|
||||
int indexOfStackTrace = exception.Message.IndexOf("\r\n===== Stack Trace =====");
|
||||
string getActualExceptionMessage = exception.Message.Substring(0, indexOfStackTrace);
|
||||
Assert.AreEqual(
|
||||
ptfExpectedExceptionMessage, getActualExceptionMessage,
|
||||
"Wrong exception message was returned.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Utilities")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Utilities")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("e07e68ac-5f71-4c39-be91-f7bb66d30568")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.Test.Utilities</RootNamespace>
|
||||
<AssemblyName>Utilities</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="PTFExpectedException.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,14 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
@echo off
|
||||
if not defined buildtool (
|
||||
for /f %%i in ('dir /b /ad /on "%windir%\Microsoft.NET\Framework\v4*"') do (@if exist "%windir%\Microsoft.NET\Framework\%%i\msbuild".exe set buildtool=%windir%\Microsoft.NET\Framework\%%i\msbuild.exe)
|
||||
)
|
||||
|
||||
if not defined buildtool (
|
||||
echo No msbuild.exe was found, install .Net Framework version 4.0 or higher
|
||||
goto :eof
|
||||
)
|
||||
|
||||
%buildtool% TestPTF.sln /t:clean;rebuild
|
|
@ -0,0 +1,19 @@
|
|||
:: Copyright (c) Microsoft. All rights reserved.
|
||||
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
@echo off
|
||||
|
||||
if not defined vspath (
|
||||
if defined VS110COMNTOOLS (
|
||||
set vspath="%VS110COMNTOOLS%"
|
||||
) else if defined VS120COMNTOOLS (
|
||||
set vspath="%VS120COMNTOOLS%"
|
||||
) else if defined VS140COMNTOOLS (
|
||||
set vspath="%VS140COMNTOOLS%"
|
||||
) else (
|
||||
echo Visual Studio or Visual Studio test agent should be installed, version 2012 or higher
|
||||
goto :eof
|
||||
)
|
||||
)
|
||||
:: Does not run Interactive adapter cases in automation test
|
||||
%vspath%..\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe "TestProperties\bin\Debug\TestProperties.dll" "TestChecker\bin\Debug\TestChecker.dll" "TestLogging\bin\Debug\TestLogging.dll" "TestRequirementCapture\bin\Debug\TestRequirementCapture.dll" "TestAdapter\bin\Debug\TestAdapter.dll" /TestCaseFilter:"Name!=InteractiveAdapterAbort&Name!=InteractiveAdapterReturnInt&Name!=InteractiveAdapterReturnString" /Settings:Local.testsettings /Logger:trx
|
|
@ -0,0 +1,95 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools.ExtendedLogging
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides APIs for logging in Protocol Library and dumping message to ETW provider.
|
||||
/// </summary>
|
||||
public class ExtendedLogger
|
||||
{
|
||||
/// <summary>
|
||||
/// Dumps network message to ETW provider.
|
||||
/// </summary>
|
||||
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
|
||||
/// <param name="dumpLevel">An enum indicating whether this message is a complete message on the wire or only part of the encrypted structure.</param>
|
||||
/// <param name="comments">Some comments about the dumped message.</param>
|
||||
/// <param name="payload">The byte array to dump.</param>
|
||||
static public void DumpMessage(string messageName, DumpLevel dumpLevel, string comments, byte[] payload)
|
||||
{
|
||||
ExtendedLoggerConfig.TestSuiteEvents.EventWriteRawMessage(
|
||||
ExtendedLoggerConfig.TestSuiteName,
|
||||
ExtendedLoggerConfig.CaseName,
|
||||
messageName,
|
||||
(ushort)dumpLevel,
|
||||
comments,
|
||||
(ushort)payload.Length,
|
||||
payload
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dumps network message to ETW provider.
|
||||
/// </summary>
|
||||
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
|
||||
/// <param name="comments">Some comments about the dumped message.</param>
|
||||
/// <param name="payload">The byte array to dump.</param>
|
||||
static public void DumpMessage(string messageName, string comments, byte[] payload)
|
||||
{
|
||||
DumpMessage(messageName, DumpLevel.WholeMessage, comments, payload);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dumps network message to ETW provider.
|
||||
/// </summary>
|
||||
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
|
||||
/// <param name="payload">The byte array to dump.</param>
|
||||
static public void DumpMessage(string messageName, byte[] payload)
|
||||
{
|
||||
DumpMessage(messageName, "", payload);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dump level for the DumpMessage method
|
||||
/// </summary>
|
||||
public enum DumpLevel
|
||||
{
|
||||
/// <summary>
|
||||
/// The message is a message on the wire.
|
||||
/// </summary>
|
||||
WholeMessage = 0,
|
||||
/// <summary>
|
||||
/// The message is part of the message on the wire.
|
||||
/// </summary>
|
||||
PartialMessage = 1
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This class is for internal use only.
|
||||
/// </summary>
|
||||
public class ExtendedLoggerConfig
|
||||
{
|
||||
/// <summary>
|
||||
/// Events of the test suite
|
||||
/// </summary>
|
||||
static public TEST_SUITE_EVENTS TestSuiteEvents = new TEST_SUITE_EVENTS();
|
||||
|
||||
/// <summary>
|
||||
/// Name of the test case
|
||||
/// </summary>
|
||||
static public string CaseName = "N/A";
|
||||
|
||||
/// <summary>
|
||||
/// Name of the test suite
|
||||
/// </summary>
|
||||
static public string TestSuiteName = "N/A";
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,215 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// <autogenerated>
|
||||
//
|
||||
// Generated by Message Compiler (mc.exe)
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </autogenerated>
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#pragma warning disable 1591
|
||||
|
||||
namespace Microsoft.Protocols.TestTools
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.Eventing;
|
||||
using Microsoft.Win32;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Principal;
|
||||
|
||||
public class TEST_SUITE_EVENTS : IDisposable
|
||||
{
|
||||
//
|
||||
// Provider Protocol-Test-Suite Event Count 2
|
||||
//
|
||||
|
||||
internal EventProviderVersionTwo m_provider = new EventProviderVersionTwo(new Guid("acb7c4c9-a810-498e-887c-1c0e0372bb58"));
|
||||
//
|
||||
// Task : eventGUIDs
|
||||
//
|
||||
|
||||
//
|
||||
// Event Descriptors
|
||||
//
|
||||
protected EventDescriptor TestSuiteLog;
|
||||
protected EventDescriptor RawMessage;
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
m_provider.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
|
||||
public TEST_SUITE_EVENTS()
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
TestSuiteLog = new EventDescriptor(0x1, 0x0, 0x9, 0x4, 0x0, 0x0, (long)0x8000000000000000);
|
||||
RawMessage = new EventDescriptor(0x2, 0x0, 0x9, 0x4, 0x0, 0x0, (long)0x8000000000000000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Event method for TestSuiteLog
|
||||
//
|
||||
public bool EventWriteTestSuiteLog(string TestSuite, string CaseName, string EntryKind, string Message)
|
||||
{
|
||||
|
||||
if (!m_provider.IsEnabled())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return m_provider.TemplateTestSuiteLog(ref TestSuiteLog, TestSuite, CaseName, EntryKind, Message);
|
||||
}
|
||||
|
||||
//
|
||||
// Event method for RawMessage
|
||||
//
|
||||
public bool EventWriteRawMessage(string TestSuite, string CaseName, string MessageName, ushort DumpLevel, string Comments, ushort Length, byte[] Payload)
|
||||
{
|
||||
|
||||
if (!m_provider.IsEnabled())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return m_provider.TemplateRawMessage(ref RawMessage, TestSuite, CaseName, MessageName, DumpLevel, Comments, Length, Payload);
|
||||
}
|
||||
}
|
||||
|
||||
internal class EventProviderVersionTwo : EventProvider
|
||||
{
|
||||
internal EventProviderVersionTwo(Guid id)
|
||||
: base(id)
|
||||
{}
|
||||
|
||||
|
||||
[StructLayout(LayoutKind.Explicit, Size = 16)]
|
||||
private struct EventData
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
internal UInt64 DataPointer;
|
||||
[FieldOffset(8)]
|
||||
internal uint Size;
|
||||
[FieldOffset(12)]
|
||||
internal int Reserved;
|
||||
}
|
||||
|
||||
|
||||
|
||||
internal unsafe bool TemplateTestSuiteLog(
|
||||
ref EventDescriptor eventDescriptor,
|
||||
string TestSuite,
|
||||
string CaseName,
|
||||
string EntryKind,
|
||||
string Message
|
||||
)
|
||||
{
|
||||
int argumentCount = 4;
|
||||
bool status = true;
|
||||
|
||||
if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
|
||||
{
|
||||
byte* userData = stackalloc byte[sizeof(EventData) * argumentCount];
|
||||
EventData* userDataPtr = (EventData*)userData;
|
||||
|
||||
userDataPtr[0].Size = (uint)(TestSuite.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[1].Size = (uint)(CaseName.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[2].Size = (uint)(EntryKind.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[3].Size = (uint)(Message.Length + 1)*sizeof(char);
|
||||
|
||||
fixed (char* a0 = TestSuite, a1 = CaseName, a2 = EntryKind, a3 = Message)
|
||||
{
|
||||
userDataPtr[0].DataPointer = (ulong)a0;
|
||||
userDataPtr[1].DataPointer = (ulong)a1;
|
||||
userDataPtr[2].DataPointer = (ulong)a2;
|
||||
userDataPtr[3].DataPointer = (ulong)a3;
|
||||
status = WriteEvent(ref eventDescriptor, argumentCount, (IntPtr)(userData));
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
internal unsafe bool TemplateRawMessage(
|
||||
ref EventDescriptor eventDescriptor,
|
||||
string TestSuite,
|
||||
string CaseName,
|
||||
string MessageName,
|
||||
ushort DumpLevel,
|
||||
string Comments,
|
||||
ushort Length,
|
||||
byte[] Payload
|
||||
)
|
||||
{
|
||||
int argumentCount = 7;
|
||||
bool status = true;
|
||||
|
||||
if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
|
||||
{
|
||||
byte* userData = stackalloc byte[sizeof(EventData) * argumentCount];
|
||||
EventData* userDataPtr = (EventData*)userData;
|
||||
|
||||
userDataPtr[0].Size = (uint)(TestSuite.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[1].Size = (uint)(CaseName.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[2].Size = (uint)(MessageName.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[3].DataPointer = (UInt64)(&DumpLevel);
|
||||
userDataPtr[3].Size = (uint)(sizeof(short) );
|
||||
|
||||
userDataPtr[4].Size = (uint)(Comments.Length + 1)*sizeof(char);
|
||||
|
||||
userDataPtr[5].DataPointer = (UInt64)(&Length);
|
||||
userDataPtr[5].Size = (uint)(sizeof(short) );
|
||||
|
||||
userDataPtr[6].Size = (uint)(sizeof(byte)*Length);
|
||||
|
||||
fixed (char* a0 = TestSuite, a1 = CaseName, a2 = MessageName, a3 = Comments)
|
||||
{
|
||||
userDataPtr[0].DataPointer = (ulong)a0;
|
||||
userDataPtr[1].DataPointer = (ulong)a1;
|
||||
userDataPtr[2].DataPointer = (ulong)a2;
|
||||
userDataPtr[4].DataPointer = (ulong)a3;
|
||||
fixed (byte* b0 = Payload)
|
||||
{
|
||||
userDataPtr[6].DataPointer = (ulong)b0;
|
||||
status = WriteEvent(ref eventDescriptor, argumentCount, (IntPtr)(userData));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma warning restore 1591
|
Двоичный файл не отображается.
|
@ -0,0 +1,3 @@
|
|||
LANGUAGE 0x9,0x1
|
||||
1 11 "MSG00001.bin"
|
||||
1 WEVT_TEMPLATE "TestSuiteProviderTEMP.BIN"
|
Двоичный файл не отображается.
|
@ -0,0 +1,97 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{EEB7AC20-C23F-447A-A2E7-E92519592DB0}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>Microsoft.Protocols.TestTools.ExtendedLogging</RootNamespace>
|
||||
<AssemblyName>Microsoft.Protocols.TestTools.ExtendedLogging</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile />
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>Microsoft.Protocols.TestTools.ExtendedLogging.XML</DocumentationFile>
|
||||
<RunCodeAnalysis>false</RunCodeAnalysis>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>Microsoft.Protocols.TestTools.ExtendedLogging.XML</DocumentationFile>
|
||||
<RunCodeAnalysis>false</RunCodeAnalysis>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<Win32Resource>TestSuiteProvider.res</Win32Resource>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SharedAssemblyInfo.cs">
|
||||
<Link>SharedAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="ExtendedLogger.cs" />
|
||||
<Compile Include="TestSuiteProvider.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="TestSuiteProvider.man" />
|
||||
<Content Include="TestSuiteProvider.res" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="AfterBuild">
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\vs10\" />
|
||||
<Copy SourceFiles="$(TargetDir)$(DocumentationFile)" DestinationFolder="..\Bin\ptf\vs10\xmldocs\" />
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\vs10\" />
|
||||
</Target>
|
||||
</Project>
|
|
@ -0,0 +1,212 @@
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Microsoft.Protocols.TestTools.Messages.Runtime;
|
||||
|
||||
namespace Microsoft.Protocols.TestTools
|
||||
{
|
||||
/// <summary>
|
||||
/// The Identifier Binding Class
|
||||
/// </summary>
|
||||
/// <typeparam name="Target">The target type to which the identifier is bound.</typeparam>
|
||||
public class IdentifierBinding<Target> :
|
||||
Microsoft.Protocols.TestTools.Messages.Runtime.IdentifierBinding<Target>
|
||||
{
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
public IdentifierBinding()
|
||||
: base()
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="site">The test site</param>
|
||||
public IdentifierBinding(ITestSite site)
|
||||
: base(ExtensionHelper.GetRuntimeHost(site))
|
||||
{ }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Provides a series of helper methods in testtools extension
|
||||
/// </summary>
|
||||
public static class ExtensionHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Binding PTF logger checker to Message Runtime Host.
|
||||
/// </summary>
|
||||
static void RegisterRuntimeHost(ITestSite site, IRuntimeHost host)
|
||||
{
|
||||
host.AssertChecker += new EventHandler<MessageLogEventArgs>(
|
||||
delegate(object sender, MessageLogEventArgs e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("MessageLogEventArgs");
|
||||
}
|
||||
|
||||
if (e.Condition)
|
||||
{
|
||||
site.Assert.Pass(e.Message, e.Parameters);
|
||||
}
|
||||
else
|
||||
{
|
||||
site.Assert.Fail(e.Message, e.Parameters);
|
||||
}
|
||||
});
|
||||
|
||||
host.AssumeChecker += new EventHandler<MessageLogEventArgs>(
|
||||
delegate(object sender, MessageLogEventArgs e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("MessageLogEventArgs");
|
||||
}
|
||||
|
||||
if (e.Condition)
|
||||
{
|
||||
site.Assume.Pass(e.Message, e.Parameters);
|
||||
}
|
||||
else
|
||||
{
|
||||
site.Assume.Fail(e.Message, e.Parameters);
|
||||
}
|
||||
});
|
||||
|
||||
host.DebugChecker += new EventHandler<MessageLogEventArgs>(
|
||||
delegate(object sender, MessageLogEventArgs e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("MessageLogEventArgs");
|
||||
}
|
||||
|
||||
if (e.Condition)
|
||||
{
|
||||
site.Debug.Pass(e.Message, e.Parameters);
|
||||
}
|
||||
else
|
||||
{
|
||||
site.Debug.Fail(e.Message, e.Parameters);
|
||||
}
|
||||
});
|
||||
|
||||
host.MessageLogger += new EventHandler<MessageLogEventArgs>(
|
||||
delegate(object sender, MessageLogEventArgs e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("MessageLogEventArgs");
|
||||
}
|
||||
|
||||
site.Log.Add(
|
||||
LogKindToLogEntryKind(e.LogEntryKind),
|
||||
e.Message, e.Parameters);
|
||||
});
|
||||
|
||||
host.RequirementLogger += new EventHandler<RequirementCaptureEventArgs>(
|
||||
delegate(object sender, RequirementCaptureEventArgs e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("RequirementCaptureEventArgs");
|
||||
}
|
||||
|
||||
site.CaptureRequirement(
|
||||
e.ProtocolName, e.RequirementId, e.RequirementDescription);
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runtime log kind to PTF log entry.
|
||||
/// </summary>
|
||||
static LogEntryKind LogKindToLogEntryKind(LogKind kind)
|
||||
{
|
||||
LogEntryKind entryKind;
|
||||
switch (kind)
|
||||
{
|
||||
case LogKind.CheckSucceeded:
|
||||
entryKind = LogEntryKind.CheckSucceeded;
|
||||
break;
|
||||
case LogKind.CheckFailed:
|
||||
entryKind = LogEntryKind.CheckFailed;
|
||||
break;
|
||||
case LogKind.Checkpoint:
|
||||
entryKind = LogEntryKind.Checkpoint;
|
||||
break;
|
||||
case LogKind.Comment:
|
||||
entryKind = LogEntryKind.Comment;
|
||||
break;
|
||||
case LogKind.Debug:
|
||||
entryKind = LogEntryKind.Debug;
|
||||
break;
|
||||
case LogKind.Warning:
|
||||
entryKind = LogEntryKind.Warning;
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException("Unexpected LogKind.");
|
||||
}
|
||||
return entryKind;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the runtime host.
|
||||
/// </summary>
|
||||
/// <param name="site">The test site</param>
|
||||
/// <returns>Returns the instance of the runtime host</returns>
|
||||
public static IRuntimeHost GetRuntimeHost(ITestSite site)
|
||||
{
|
||||
if (site == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
bool marshallerTrace = site != null ? site.Properties["Marshaler.trace"] == "true" : false;
|
||||
bool disablevalidation = site != null ? site.Properties["disablevalidation"] == "true" : false;
|
||||
RuntimeHostProvider.Initialize(marshallerTrace, disablevalidation);
|
||||
IRuntimeHost host = RuntimeHostProvider.RuntimeHost;
|
||||
//only register once
|
||||
if (string.IsNullOrEmpty(site.Properties["IsRuntimeHostRegistered"]))
|
||||
{
|
||||
RegisterRuntimeHost(site, host);
|
||||
site.Properties["IsRuntimeHostRegistered"] = "true";
|
||||
}
|
||||
return host;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle VS UnitTest Framework exception
|
||||
/// </summary>
|
||||
/// <param name="e">The exception needs to be handled</param>
|
||||
/// <param name="site">The test site</param>
|
||||
public static void HandleVSException(Exception e, ITestSite site)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
throw new ArgumentNullException("e");
|
||||
}
|
||||
|
||||
if (site == null)
|
||||
{
|
||||
throw new ArgumentNullException("site");
|
||||
}
|
||||
//remove the dependency to the VS UnitTest Framework.
|
||||
Type exceptionType = e.GetType();
|
||||
string assertFailedException = "Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException";
|
||||
string assertInconclusiveException = "Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException";
|
||||
if (string.Compare(exceptionType.FullName, assertFailedException, true) == 0)
|
||||
{
|
||||
site.Assert.Fail("asynchronous assertion failed in receive loop and has been logged");
|
||||
}
|
||||
else if (string.Compare(exceptionType.FullName, assertInconclusiveException, true) == 0)
|
||||
{
|
||||
site.Assert.Fail("asynchronous assumption failed in receive loop and has been logged");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче