diff options
author | Miguel Costa <miguel.costa@qt.io> | 2022-03-14 15:19:54 +0100 |
---|---|---|
committer | Miguel Costa <miguel.costa@qt.io> | 2022-03-22 10:06:54 +0000 |
commit | e9670fa2c5d625825b50b34f5df5dfd07fe7561b (patch) | |
tree | 644e0612a569881def3fd3e2242a6042363ea5ce | |
parent | fee7de104e466b2b3fd6285316bd0bf636b980e5 (diff) |
tests: Add auto-test for the Qt versions page
Change-Id: Ie7c2fa1aa635c5426e4fee3a2fef4f6e9e04d777
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r-- | Tests/Test_QtVsTools.Package/Properties/AssemblyInfo.cs | 20 | ||||
-rw-r--r-- | Tests/Test_QtVsTools.Package/QtVsTestClient.cs | 144 | ||||
-rw-r--r-- | Tests/Test_QtVsTools.Package/Test_QtVersionsPage.cs | 247 | ||||
-rw-r--r-- | Tests/Test_QtVsTools.Package/Test_QtVsTools.Package.csproj | 120 | ||||
-rw-r--r-- | vstools.sln | 18 |
5 files changed, 549 insertions, 0 deletions
diff --git a/Tests/Test_QtVsTools.Package/Properties/AssemblyInfo.cs b/Tests/Test_QtVsTools.Package/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2d8725ce --- /dev/null +++ b/Tests/Test_QtVsTools.Package/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Test_QtVsTools.Package")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Test_QtVsTools.Package")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("afd33401-2f15-4e72-ab35-42c3ee12e897")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/Test_QtVsTools.Package/QtVsTestClient.cs b/Tests/Test_QtVsTools.Package/QtVsTestClient.cs new file mode 100644 index 00000000..2372314e --- /dev/null +++ b/Tests/Test_QtVsTools.Package/QtVsTestClient.cs @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt VS Tools. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +using System; +using System.Diagnostics; +using System.IO; +using System.IO.Pipes; +using System.Linq; +using System.Text; + +namespace QtVsTools.Test +{ + public class QtVsTestClient : IDisposable + { + public NamedPipeClientStream Stream { get; } + + public QtVsTestClient(int vsProcId) + { + Stream = new NamedPipeClientStream(".", $"QtVSTest_{vsProcId}", PipeDirection.InOut); + } + + public static QtVsTestClient Attach(int? vsProcId = null) + { + if (vsProcId == null) { + var procs = Process.GetProcessesByName("devenv"); + var vsProc = procs + .Where(p => p.Id != Process.GetCurrentProcess().Id + && !p.MainWindowTitle.StartsWith("vstools")) + .FirstOrDefault(); + if (vsProc == null) + throw new InvalidOperationException("VS process not found"); + vsProcId = vsProc.Id; + } + var client = new QtVsTestClient(vsProcId.Value); + client.Connect(); + return client; + } + + public void Connect() => Stream.Connect(); + + public void Dispose() => Stream?.Dispose(); + + public string RunMacro(string macroCode) + { + if (!Stream.IsConnected) + Connect(); + + var macroData = Encoding.UTF8.GetBytes(macroCode); + int macroDataSize = macroData.Length; + byte[] sizeData = BitConverter.GetBytes(macroDataSize); + + Stream.Write(sizeData, 0, sizeof(int)); + Stream.Write(macroData, 0, macroData.Length); + Stream.Flush(); + if (!Stream.IsConnected) + return Error("Disconnected"); + + Stream.WaitForPipeDrain(); + if (!Stream.IsConnected) + return Error("Disconnected"); + + for (int i = 0; i < sizeof(int); i++) { + int c = Stream.ReadByte(); + if (c == -1) + return Error("Disconnected"); + if (c < Byte.MinValue || c > Byte.MaxValue) + return Error("Pipe error"); + sizeData[i] = (byte)c; + } + + int replyDataSize = BitConverter.ToInt32(sizeData, 0); + byte[] replyData = new byte[replyDataSize]; + int bytesRead = 0; + while (bytesRead < replyDataSize) { + if (!Stream.IsConnected) + return Error("Disconnected"); + bytesRead += Stream.Read(replyData, bytesRead, replyDataSize - bytesRead); + } + + return Encoding.UTF8.GetString(replyData); + } + + public string RunMacroFile(string macroPath) + { + return LoadAndRunMacro(macroPath); + } + + public string StoreMacro(string macroName, string macroCode) + { + if (string.IsNullOrEmpty(macroName)) + return Error("Invalid macro name"); + return RunMacro($"//# macro {macroName}\r\n{macroCode}"); + } + + public string StoreMacroFile(string macroName, string macroPath) + { + if (string.IsNullOrEmpty(macroName)) + return Error("Invalid macro name"); + return LoadAndRunMacro(macroPath, $"//# macro {macroName}"); + } + + string LoadAndRunMacro(string macroPath, string macroHeader = null) + { + var macroCode = File.ReadAllText(macroPath, Encoding.UTF8); + if (string.IsNullOrEmpty(macroCode)) + return Error("Macro load failed"); + if (!string.IsNullOrEmpty(macroHeader)) + return RunMacro($"{macroHeader}\r\n{macroCode}"); + else + return RunMacro(macroCode); + } + + public const string MacroOk = "(ok)"; + public const string MacroWarn = "(warn)"; + public const string MacroError = "(error)"; + + static string Error(string msg) => $"{MacroError}\r\n{msg}"; + } +} diff --git a/Tests/Test_QtVsTools.Package/Test_QtVersionsPage.cs b/Tests/Test_QtVsTools.Package/Test_QtVersionsPage.cs new file mode 100644 index 00000000..d2623da8 --- /dev/null +++ b/Tests/Test_QtVsTools.Package/Test_QtVersionsPage.cs @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt VS Tools. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.Win32; + +namespace QtVsTools.Test.Package +{ + [TestClass] + public class Test_QtVersionsPage + { + // UI automation property conditions + string SetGlobals => @" +//# using System.IO +var elementSubtree = (TreeScope.Element | TreeScope.Subtree); +var isButton = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button); +var isDataGrid = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataGrid); +var isEdit = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit); +var isText = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Text); +var isWindow = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);"; + + // Open menu: Tools > Options... + string OpenVsOptions => @" +//# ui context VSROOT => ""MenuBar"", ""Tools"" +//# ui pattern Invoke +//# ui context => ""Options..."" +//# ui pattern Invoke"; + + // Select options: page Qt > Versions + string SelectQtVersionsPage => @" +//# ui context VSROOT => ""Options"", ""Qt"" +//# ui pattern ExpandCollapse qtOptions +qtOptions.Expand(); +//# ui context => ""Versions"" +//# ui pattern SelectionItem qtVersions +qtVersions.Select();"; + + // Get reference to data grid with Qt versions + string GetQtVersionsTable => @" +//# ui context VSROOT => ""Options"" +//# ui find => elementSubtree, isDataGrid +//# ui pattern Grid qtVersionsTable"; + + // Add new row to versions table + string AddNewRow => @" +var lastRow = qtVersionsTable.Current.RowCount - 1; +UiContext = qtVersionsTable.GetItem(lastRow, 1); +//# ui find => elementSubtree, isButton +//# ui pattern Invoke +{ + //# ui context VSROOT => ""Options"" + //# ui find => elementSubtree, isDataGrid + //# ui pattern Grid qtVersionsTableAux + qtVersionsTable = qtVersionsTableAux; +} +UiContext = qtVersionsTable.GetItem(lastRow, 1); +//# ui find => elementSubtree, isEdit +//# ui pattern Value newVersionName +newVersionName.SetValue(""TEST_"" + Path.GetRandomFileName());"; + + // Set UI context to the path field of the new row + string SelectNewRowPath => @" +UiContext = qtVersionsTable.GetItem(lastRow, 3); +//# ui find => elementSubtree, isEdit"; + + // Save changes to the versions table and close the VS options dialog + // * Any error message will be copied to 'Result' + string SaveChanges => @" +//# ui context VSROOT => ""Options"", ""OK"" +//# ui pattern Invoke +//# thread ui +try { + //# ui context VSROOT 100 => ""Options"" + //# ui find => elementSubtree, isWindow +} catch (TimeoutException) { + return; +} +if (UiContext == null) + return; +//# ui find => elementSubtree, isText +Result = UiContext.Current.Name; +//# ui context VSROOT => ""Options"" +//# ui find => elementSubtree, isWindow +//# ui context => ""OK"" +//# ui pattern Invoke +//# ui context VSROOT => ""Options"", ""Cancel"" +//# ui pattern Invoke"; + + // Add new variable 'qtPath' with the path to the Qt version in the top row + // * This is assumed to be a valid path to an existing Qt version + string GetFirstRowPath => @" +if (qtVersionsTable.Current.RowCount <= 1) { + Result = MACRO_ERROR_MSG(""No Qt version registered.""); + return; +} +UiContext = qtVersionsTable.GetItem(0, 3); +//# ui find => elementSubtree, isEdit +//# ui pattern Value path +string qtPath = path.Current.Value; +if (Path.GetFileName(qtPath).Equals(""qmake.exe"", StringComparison.InvariantCultureIgnoreCase)) + qtPath = Path.GetDirectoryName(qtPath); +if (Path.GetFileName(qtPath).Equals(""bin"", StringComparison.InvariantCultureIgnoreCase)) + qtPath = Path.GetDirectoryName(qtPath);"; + + [TestMethod] + // Add new (empty) row => error + public void Test_EmptyVersion() + { + string result; + using (var vs = QtVsTestClient.Attach()) { + result = vs.RunMacro($@" + {SetGlobals} + {OpenVsOptions} + {SelectQtVersionsPage} + {GetQtVersionsTable} + {AddNewRow} + {SaveChanges}"); + } + Assert.IsTrue(result.Contains("Invalid Qt versions"), result); + } + + [TestMethod] + // Add new row and copy the path from the top row => OK + public void Test_AddNewVersion() + { + string result; + using (var vs = QtVsTestClient.Attach()) { + result = vs.RunMacro($@" + {SetGlobals} + {OpenVsOptions} + {SelectQtVersionsPage} + {GetQtVersionsTable} + {GetFirstRowPath} + {AddNewRow} + {SelectNewRowPath} + //# ui pattern Value newVersionPath + newVersionPath.SetValue(qtPath); + {SaveChanges}"); + } + Assert.IsTrue(result.StartsWith(QtVsTestClient.MacroOk), result); + } + + [TestMethod] + // Add new row, copy the path from the top row, and append "qmake.exe" => OK + public void Test_AddBinToPath() + { + string result; + using (var vs = QtVsTestClient.Attach()) { + result = vs.RunMacro($@" + {SetGlobals} + {OpenVsOptions} + {SelectQtVersionsPage} + {GetQtVersionsTable} + {GetFirstRowPath} + {AddNewRow} + {SelectNewRowPath} + //# ui pattern Value newVersionPath + newVersionPath.SetValue(Path.Combine(qtPath, ""bin"")); + {SaveChanges}"); + } + Assert.IsTrue(result.StartsWith(QtVsTestClient.MacroOk), result); + } + + [TestMethod] + // Add new row, copy the path from the top row, and append "bin\qmake.exe" => OK + public void Test_AddBinQMakeToPath() + { + string result; + using (var vs = QtVsTestClient.Attach()) { + result = vs.RunMacro($@" + {SetGlobals} + {OpenVsOptions} + {SelectQtVersionsPage} + {GetQtVersionsTable} + {GetFirstRowPath} + {AddNewRow} + {SelectNewRowPath} + //# ui pattern Value newVersionPath + newVersionPath.SetValue(Path.Combine(qtPath, ""bin"", ""qmake.exe"")); + {SaveChanges}"); + } + Assert.IsTrue(result.StartsWith(QtVsTestClient.MacroOk), result); + } + + [TestMethod] + // Add new row, copy the path from the top row, and append "include" => ERROR + public void Test_AddIncludeToPath() + { + string result; + using (var vs = QtVsTestClient.Attach()) { + result = vs.RunMacro($@" + {SetGlobals} + {OpenVsOptions} + {SelectQtVersionsPage} + {GetQtVersionsTable} + {GetFirstRowPath} + {AddNewRow} + {SelectNewRowPath} + //# ui pattern Value newVersionPath + newVersionPath.SetValue(Path.Combine(qtPath, ""include"")); + {SaveChanges}"); + } + Assert.IsTrue(result.Contains("Invalid Qt versions"), result); + } + + [ClassCleanup] + // Remove registry keys created during tests + public static void RemoveTestKeys() + { + var qtVersions = Registry.CurrentUser + .OpenSubKey(@"Software\Digia\Versions", writable: true); + using (qtVersions) { + var allVersions = qtVersions.GetSubKeyNames(); + var testVersions = allVersions.Where(k => k.StartsWith("TEST")); + foreach (var testVersion in testVersions) + qtVersions.DeleteSubKey(testVersion); + qtVersions.Close(); + } + } + } +} diff --git a/Tests/Test_QtVsTools.Package/Test_QtVsTools.Package.csproj b/Tests/Test_QtVsTools.Package/Test_QtVsTools.Package.csproj new file mode 100644 index 00000000..baf98074 --- /dev/null +++ b/Tests/Test_QtVsTools.Package/Test_QtVsTools.Package.csproj @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="$(VisualStudioVersion)" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <!-- + ***************************************************************************** + ** + ** Copyright (C) 2022 The Qt Company Ltd. + ** Contact: https://www.qt.io/licensing/ + ** + ** This file is part of the Qt VS Tools. + ** + ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and The Qt Company. For licensing terms + ** and conditions see https://www.qt.io/terms-conditions. For further + ** information use the contact form at https://www.qt.io/contact-us. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3 as published by the Free Software + ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT + ** included in the packaging of this file. Please review the following + ** information to ensure the GNU General Public License requirements will + ** be met: https://www.gnu.org/licenses/gpl-3.0.html. + ** + ** $QT_END_LICENSE$ + ** + ***************************************************************************** +--> + <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>{AFD33401-2F15-4E72-AB35-42C3EE12E897}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Test_QtVsTools.Package</RootNamespace> + <AssemblyName>Test_QtVsTools.Package</AssemblyName> + <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion> + <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> + <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath> + <IsCodedUITest>False</IsCodedUITest> + <TestProjectType>UnitTest</TestProjectType> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> + </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> + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// + // Global references + // --> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Core" /> + </ItemGroup> + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// + // General package references + // --> + <Import Project="$(SolutionDir)\references.props" /> + <ItemGroup> + <PackageReference Include="$(Name_Microsoft_VSSDK_BuildTools)" Version="$(Version_Microsoft_VSSDK_BuildTools)" /> + <PackageReference Include="$(Name_Microsoft_VisualStudio_SDK)" Version="$(Version_Microsoft_VisualStudio_SDK)" ExcludeAssets="runtime" /> + <PackageReference Include="$(Name_Microsoft_Build)" Version="$(Version_Microsoft_Build)" /> + <PackageReference Include="$(Name_Microsoft_Build_Tasks_Core)" Version="$(Version_Microsoft_Build_Tasks_Core)" /> + <PackageReference Include="$(Name_MSTest_TestAdapter)" Version="$(Version_MSTest_TestAdapter)" /> + <PackageReference Include="$(Name_MSTest_TestFramework)" Version="$(Version_MSTest_TestFramework)" /> + </ItemGroup> + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// + // Version specific package references + // --> + <Choose> + <When Condition="'$(VisualStudioVersion)'=='17.0'"> + <ItemGroup> + </ItemGroup> + </When> + <When Condition="'$(VisualStudioVersion)'=='16.0'"> + <ItemGroup> + </ItemGroup> + </When> + <When Condition="'$(VisualStudioVersion)'=='15.0'"> + <ItemGroup> + </ItemGroup> + </When> + </Choose> + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// + // Project items + // --> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Test_QtVersionsPage.cs" /> + <Compile Include="QtVsTestClient.cs" /> + </ItemGroup> + <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" /> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Import Project="$(SolutionDir)\transform.targets" /> +</Project>
\ No newline at end of file diff --git a/vstools.sln b/vstools.sln index 58581088..167ca066 100644 --- a/vstools.sln +++ b/vstools.sln @@ -101,6 +101,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_QtMsBuild.Tasks", "Tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_QtVsTools.Core", "Tests\Test_QtVsTools.Core\Test_QtVsTools.Core.csproj", "{4B8FC08C-4901-45D4-BC00-C0C461292FF2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_QtVsTools.Package", "tests\Test_QtVsTools.Package\Test_QtVsTools.Package.csproj", "{AFD33401-2F15-4E72-AB35-42C3EE12E897}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -648,6 +650,21 @@ Global {4B8FC08C-4901-45D4-BC00-C0C461292FF2}.Tests|x64.Build.0 = Debug|Any CPU {4B8FC08C-4901-45D4-BC00-C0C461292FF2}.Tests|x86.ActiveCfg = Debug|Any CPU {4B8FC08C-4901-45D4-BC00-C0C461292FF2}.Tests|x86.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|x64.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|x64.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|x86.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Debug|x86.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Release|x64.ActiveCfg = Release|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Release|x86.ActiveCfg = Release|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|Any CPU.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|Any CPU.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|x64.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|x64.Build.0 = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|x86.ActiveCfg = Debug|Any CPU + {AFD33401-2F15-4E72-AB35-42C3EE12E897}.Tests|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -683,6 +700,7 @@ Global {E809DDE3-AE76-4F7A-8DC5-775AC4900138} = {D6FB29A4-8921-46F5-B170-B15538AB4D69} {202F4A6D-77CD-4992-AA53-01B585463287} = {A7918293-56E9-465A-AE1C-0724576ADD66} {4B8FC08C-4901-45D4-BC00-C0C461292FF2} = {D6FB29A4-8921-46F5-B170-B15538AB4D69} + {AFD33401-2F15-4E72-AB35-42C3EE12E897} = {D6FB29A4-8921-46F5-B170-B15538AB4D69} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {17FF4AFE-273C-47CD-8D84-F0D023B10BE5} |