aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2022-03-14 15:19:54 +0100
committerMiguel Costa <miguel.costa@qt.io>2022-03-22 10:06:54 +0000
commite9670fa2c5d625825b50b34f5df5dfd07fe7561b (patch)
tree644e0612a569881def3fd3e2242a6042363ea5ce
parentfee7de104e466b2b3fd6285316bd0bf636b980e5 (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.cs20
-rw-r--r--Tests/Test_QtVsTools.Package/QtVsTestClient.cs144
-rw-r--r--Tests/Test_QtVsTools.Package/Test_QtVersionsPage.cs247
-rw-r--r--Tests/Test_QtVsTools.Package/Test_QtVsTools.Package.csproj120
-rw-r--r--vstools.sln18
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}