diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index cb0ac00..d20ec3b 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,12 +6,14 @@ on:
paths:
- 'src/**'
- 'samples/**'
+ - 'tests/**'
- '.github/workflows/build.yml'
pull_request:
branches: [main]
paths:
- 'src/**'
- 'samples/**'
+ - 'tests/**'
- '.github/workflows/build.yml'
jobs:
@@ -39,6 +41,81 @@ jobs:
- name: Build Sample Extension
run: dotnet build samples/SampleExtension/SampleExtension.csproj -c Release
+ # E2E Tests - Build all test projects
+ - name: Build E2E.Minimal
+ run: dotnet build tests/e2e/E2E.Minimal/E2E.Minimal.csproj -c Release
+
+ - name: Build E2E.AutoIncludes
+ run: dotnet build tests/e2e/E2E.AutoIncludes/E2E.AutoIncludes.csproj -c Release
+
+ - name: Build E2E.SourceGenerators
+ run: dotnet build tests/e2e/E2E.SourceGenerators/E2E.SourceGenerators.csproj -c Release
+
+ - name: Build E2E.VersionOverride
+ run: dotnet build tests/e2e/E2E.VersionOverride/E2E.VersionOverride.csproj -c Release
+
+ - name: Build E2E.VersionOverride with SetVsixVersion
+ run: dotnet build tests/e2e/E2E.VersionOverride/E2E.VersionOverride.csproj -c Release -p:SetVsixVersion=2.0.0
+
+ - name: Build E2E.CustomPkgDef
+ run: dotnet build tests/e2e/E2E.CustomPkgDef/E2E.CustomPkgDef.csproj -c Release
+
+ - name: Build E2E.ManualPkgDef
+ run: dotnet build tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.csproj -c Release
+
+ - name: Build E2E.ImageAndContentManifest
+ run: dotnet build tests/e2e/E2E.ImageAndContentManifest/E2E.ImageAndContentManifest.csproj -c Release
+
+ - name: Build E2E.Validation (expect warnings)
+ run: dotnet build tests/e2e/E2E.Validation/E2E.Validation.csproj -c Release
+
+ - name: Build E2E.ValidationNoManifest (expect warnings)
+ run: dotnet build tests/e2e/E2E.ValidationNoManifest/E2E.ValidationNoManifest.csproj -c Release
+
+ - name: Build E2E.Templates.AutoDiscovery
+ run: dotnet build tests/e2e/E2E.Templates.AutoDiscovery/E2E.Templates.AutoDiscovery.csproj -c Release
+
+ - name: Build E2E.Templates.PreBuiltZip
+ run: dotnet build tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj -c Release
+
+ - name: Build E2E.Templates.ManualWithSubPath
+ run: dotnet build tests/e2e/E2E.Templates.ManualWithSubPath/E2E.Templates.ManualWithSubPath.csproj -c Release
+
+ - name: Build E2E.AllFeatures
+ run: dotnet build tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj -c Release
+
+ # VSIX Verification - Check that VSIX files contain expected content
+ - name: Verify E2E.Minimal VSIX
+ run: |
+ $vsix = "tests/e2e/E2E.Minimal/bin/Release/net472/E2E.Minimal.vsix"
+ if (!(Test-Path $vsix)) { throw "VSIX not found: $vsix" }
+ Expand-Archive -Path $vsix -DestinationPath "tests/e2e/E2E.Minimal/vsix-contents" -Force
+ $files = Get-ChildItem -Path "tests/e2e/E2E.Minimal/vsix-contents" -Recurse -File | Select-Object -ExpandProperty Name
+ if ($files -notcontains "extension.vsixmanifest") { throw "Missing extension.vsixmanifest" }
+ if ($files -notcontains "E2E.Minimal.dll") { throw "Missing E2E.Minimal.dll" }
+ Write-Host "E2E.Minimal VSIX verified successfully"
+
+ - name: Verify E2E.Templates.AutoDiscovery VSIX
+ run: |
+ $vsix = "tests/e2e/E2E.Templates.AutoDiscovery/bin/Release/net472/E2E.Templates.AutoDiscovery.vsix"
+ if (!(Test-Path $vsix)) { throw "VSIX not found: $vsix" }
+ Expand-Archive -Path $vsix -DestinationPath "tests/e2e/E2E.Templates.AutoDiscovery/vsix-contents" -Force
+ $files = Get-ChildItem -Path "tests/e2e/E2E.Templates.AutoDiscovery/vsix-contents" -Recurse | Select-Object -ExpandProperty Name
+ # VSSDK default behavior includes templates as folders with .vstemplate files
+ if ($files -notcontains "ConsoleApp.vstemplate") { throw "Missing ProjectTemplates/ConsoleApp/ConsoleApp.vstemplate" }
+ if ($files -notcontains "NewClass.vstemplate") { throw "Missing ItemTemplates/NewClass/NewClass.vstemplate" }
+ Write-Host "E2E.Templates.AutoDiscovery VSIX verified successfully"
+
+ - name: Verify E2E.AllFeatures VSIX
+ run: |
+ $vsix = "tests/e2e/E2E.AllFeatures/bin/Release/net472/E2E.AllFeatures.vsix"
+ if (!(Test-Path $vsix)) { throw "VSIX not found: $vsix" }
+ Expand-Archive -Path $vsix -DestinationPath "tests/e2e/E2E.AllFeatures/vsix-contents" -Force
+ $files = Get-ChildItem -Path "tests/e2e/E2E.AllFeatures/vsix-contents" -Recurse | Select-Object -ExpandProperty Name
+ if ($files -notcontains "extension.vsixmanifest") { throw "Missing extension.vsixmanifest" }
+ if ($files -notcontains "E2E.AllFeatures.dll") { throw "Missing E2E.AllFeatures.dll" }
+ Write-Host "E2E.AllFeatures VSIX verified successfully"
+
- name: Test Template - Install
run: dotnet new install artifacts/packages/CodingWithCalvin.VsixSdk.Templates.1.0.0.nupkg
diff --git a/.gitignore b/.gitignore
index 469802b..f0240cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,3 +51,6 @@ CLAUDE.local.md
Generated/
VsixInfo.g.cs
*Vsct.g.cs
+
+# Pre-built template zips (generated during build)
+tests/e2e/*/PreBuilt/
diff --git a/tests/e2e/Directory.Build.props b/tests/e2e/Directory.Build.props
new file mode 100644
index 0000000..bf0286a
--- /dev/null
+++ b/tests/e2e/Directory.Build.props
@@ -0,0 +1,18 @@
+
+
+
+
+
+ $(MSBuildThisFileDirectory)..\..\src\CodingWithCalvin.VsixSdk\
+
+
+ true
+
+
+
+
+
+
diff --git a/tests/e2e/Directory.Build.targets b/tests/e2e/Directory.Build.targets
new file mode 100644
index 0000000..f327c48
--- /dev/null
+++ b/tests/e2e/Directory.Build.targets
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/Commands/AllCommands.vsct b/tests/e2e/E2E.AllFeatures/Commands/AllCommands.vsct
new file mode 100644
index 0000000..e462e9d
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/Commands/AllCommands.vsct
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/CustomSettings.pkgdef b/tests/e2e/E2E.AllFeatures/CustomSettings.pkgdef
new file mode 100644
index 0000000..32fd4fc
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/CustomSettings.pkgdef
@@ -0,0 +1,5 @@
+; Custom pkgdef settings for AllFeatures test
+
+[$RootKey$\E2E\AllFeatures]
+"AllFeaturesEnabled"=dword:00000001
+"CustomSetting"="AllFeaturesValue"
diff --git a/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj b/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj
new file mode 100644
index 0000000..9956861
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj
@@ -0,0 +1,45 @@
+
+
+
+
+ 1.0.0
+
+ $(DefaultItemExcludes);PreBuiltSource\**;ManualTemplates\**
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/E2EAllFeaturesPackage.cs b/tests/e2e/E2E.AllFeatures/E2EAllFeaturesPackage.cs
new file mode 100644
index 0000000..41509f5
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/E2EAllFeaturesPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.AllFeatures
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-00000000000D")]
+ public sealed class E2EAllFeaturesPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.AllFeatures/FeatureConsumer.cs b/tests/e2e/E2E.AllFeatures/FeatureConsumer.cs
new file mode 100644
index 0000000..6e66d7b
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/FeatureConsumer.cs
@@ -0,0 +1,35 @@
+// This file uses generated constants to verify all generators work together.
+
+using System;
+
+namespace E2E.AllFeatures
+{
+ ///
+ /// Consumes generated constants to verify all features work together.
+ ///
+ public static class FeatureConsumer
+ {
+ // VsixInfo constants
+ public static string ExtensionId => VsixInfo.Id;
+ public static string ExtensionDisplayName => VsixInfo.DisplayName;
+
+ // VSCT constants
+ public static Guid PackageGuid => AllCommandsVsct.guidAllFeaturesPackage;
+ public static int CommandId => AllCommandsVsct.guidAllFeaturesCommandSet.AllFeaturesCommand;
+
+ ///
+ /// Validates that all generated constants are available.
+ ///
+ public static void ValidateAllFeatures()
+ {
+ if (string.IsNullOrEmpty(ExtensionId))
+ throw new InvalidOperationException("VsixInfo.Id is empty");
+
+ if (PackageGuid == Guid.Empty)
+ throw new InvalidOperationException("Package GUID is empty");
+
+ if (CommandId != 0x0100)
+ throw new InvalidOperationException("Command ID has wrong value");
+ }
+ }
+}
diff --git a/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/AutoItem.vstemplate b/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/AutoItem.vstemplate
new file mode 100644
index 0000000..d44202d
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/AutoItem.vstemplate
@@ -0,0 +1,12 @@
+
+
+
+ Auto-Discovered Item
+ Auto-discovered item template in AllFeatures
+ CSharp
+ AutoItem.cs
+
+
+ Item.cs
+
+
diff --git a/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/Item.cs b/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/Item.cs
new file mode 100644
index 0000000..37340b2
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ItemTemplates/AutoItem/Item.cs
@@ -0,0 +1,4 @@
+namespace $rootnamespace$
+{
+ public class $safeitemname$ { }
+}
diff --git a/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Class1.cs b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Class1.cs
new file mode 100644
index 0000000..4fc708c
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Class1.cs
@@ -0,0 +1,4 @@
+namespace $safeprojectname$
+{
+ public class Class1 { }
+}
diff --git a/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/ManualProject.vstemplate b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/ManualProject.vstemplate
new file mode 100644
index 0000000..08f637d
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/ManualProject.vstemplate
@@ -0,0 +1,15 @@
+
+
+
+ Manual Project (SubPath)
+ Manual project template with TargetSubPath in AllFeatures
+ CSharp
+ ManualProject
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Project.csproj b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Project.csproj
new file mode 100644
index 0000000..ec2cce1
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ManualTemplates/ManualProject/Project.csproj
@@ -0,0 +1,5 @@
+
+
+ net8.0
+
+
diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs
new file mode 100644
index 0000000..4fc708c
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs
@@ -0,0 +1,4 @@
+namespace $safeprojectname$
+{
+ public class Class1 { }
+}
diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate
new file mode 100644
index 0000000..8b424ad
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate
@@ -0,0 +1,15 @@
+
+
+
+ Pre-Built Project
+ Pre-built zip template in AllFeatures
+ CSharp
+ PreBuiltProject
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj
new file mode 100644
index 0000000..ec2cce1
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj
@@ -0,0 +1,5 @@
+
+
+ net8.0
+
+
diff --git a/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/AutoProject.vstemplate b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/AutoProject.vstemplate
new file mode 100644
index 0000000..d86939d
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/AutoProject.vstemplate
@@ -0,0 +1,15 @@
+
+
+
+ Auto-Discovered Project
+ Auto-discovered project template in AllFeatures
+ CSharp
+ AutoProject
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Class1.cs b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Class1.cs
new file mode 100644
index 0000000..4fc708c
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Class1.cs
@@ -0,0 +1,4 @@
+namespace $safeprojectname$
+{
+ public class Class1 { }
+}
diff --git a/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Project.csproj b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Project.csproj
new file mode 100644
index 0000000..ec2cce1
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/ProjectTemplates/AutoProject/Project.csproj
@@ -0,0 +1,5 @@
+
+
+ net8.0
+
+
diff --git a/tests/e2e/E2E.AllFeatures/VSPackage.resx b/tests/e2e/E2E.AllFeatures/VSPackage.resx
new file mode 100644
index 0000000..b304a2f
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/VSPackage.resx
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ E2E AllFeatures Package
+
+
+ Comprehensive E2E test package
+
+
diff --git a/tests/e2e/E2E.AllFeatures/source.extension.vsixmanifest b/tests/e2e/E2E.AllFeatures/source.extension.vsixmanifest
new file mode 100644
index 0000000..4441a4f
--- /dev/null
+++ b/tests/e2e/E2E.AllFeatures/source.extension.vsixmanifest
@@ -0,0 +1,29 @@
+
+
+
+
+
+ E2E AllFeatures Test
+ Comprehensive E2E test combining ALL SDK features
+ https://example.com/all-features
+ e2e, comprehensive, all-features
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AutoIncludes/Commands/SampleCommands.vsct b/tests/e2e/E2E.AutoIncludes/Commands/SampleCommands.vsct
new file mode 100644
index 0000000..0e73b3a
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/Commands/SampleCommands.vsct
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AutoIncludes/E2E.AutoIncludes.csproj b/tests/e2e/E2E.AutoIncludes/E2E.AutoIncludes.csproj
new file mode 100644
index 0000000..fdb9932
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/E2E.AutoIncludes.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.AutoIncludes/E2EAutoIncludesPackage.cs b/tests/e2e/E2E.AutoIncludes/E2EAutoIncludesPackage.cs
new file mode 100644
index 0000000..8d811e7
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/E2EAutoIncludesPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.AutoIncludes
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000002")]
+ public sealed class E2EAutoIncludesPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.AutoIncludes/VSPackage.es.resx b/tests/e2e/E2E.AutoIncludes/VSPackage.es.resx
new file mode 100644
index 0000000..18ee9b7
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/VSPackage.es.resx
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Paquete E2E AutoIncludes
+
+
+ Paquete de prueba E2E para auto-inclusiones
+
+
diff --git a/tests/e2e/E2E.AutoIncludes/VSPackage.resx b/tests/e2e/E2E.AutoIncludes/VSPackage.resx
new file mode 100644
index 0000000..d777f47
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/VSPackage.resx
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ E2E AutoIncludes Package
+
+
+ E2E test package for auto-includes
+
+
diff --git a/tests/e2e/E2E.AutoIncludes/source.extension.vsixmanifest b/tests/e2e/E2E.AutoIncludes/source.extension.vsixmanifest
new file mode 100644
index 0000000..1cfa66e
--- /dev/null
+++ b/tests/e2e/E2E.AutoIncludes/source.extension.vsixmanifest
@@ -0,0 +1,22 @@
+
+
+
+
+ E2E AutoIncludes Test
+ E2E test for VSCT and VSPackage.resx auto-inclusion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.CustomPkgDef/AdditionalRegistrations.pkgdef b/tests/e2e/E2E.CustomPkgDef/AdditionalRegistrations.pkgdef
new file mode 100644
index 0000000..75ff122
--- /dev/null
+++ b/tests/e2e/E2E.CustomPkgDef/AdditionalRegistrations.pkgdef
@@ -0,0 +1,5 @@
+; Additional pkgdef file to test multiple file merging
+
+[$RootKey$\E2E\CustomPkgDef\Additional]
+"ExtraSetting"="ExtraValue"
+"BoolSetting"=dword:00000000
diff --git a/tests/e2e/E2E.CustomPkgDef/CustomSettings.pkgdef b/tests/e2e/E2E.CustomPkgDef/CustomSettings.pkgdef
new file mode 100644
index 0000000..007ed39
--- /dev/null
+++ b/tests/e2e/E2E.CustomPkgDef/CustomSettings.pkgdef
@@ -0,0 +1,9 @@
+; Custom pkgdef file with additional VS settings
+; This file is merged with the auto-generated pkgdef
+
+[$RootKey$\E2E\CustomPkgDef]
+"CustomSetting1"="Value1"
+"CustomSetting2"=dword:00000001
+
+[$RootKey$\E2E\CustomPkgDef\SubKey]
+"NestedSetting"="NestedValue"
diff --git a/tests/e2e/E2E.CustomPkgDef/E2E.CustomPkgDef.csproj b/tests/e2e/E2E.CustomPkgDef/E2E.CustomPkgDef.csproj
new file mode 100644
index 0000000..44a805c
--- /dev/null
+++ b/tests/e2e/E2E.CustomPkgDef/E2E.CustomPkgDef.csproj
@@ -0,0 +1,25 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.CustomPkgDef/E2ECustomPkgDefPackage.cs b/tests/e2e/E2E.CustomPkgDef/E2ECustomPkgDefPackage.cs
new file mode 100644
index 0000000..93ce341
--- /dev/null
+++ b/tests/e2e/E2E.CustomPkgDef/E2ECustomPkgDefPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.CustomPkgDef
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000005")]
+ public sealed class E2ECustomPkgDefPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.CustomPkgDef/source.extension.vsixmanifest b/tests/e2e/E2E.CustomPkgDef/source.extension.vsixmanifest
new file mode 100644
index 0000000..4fbd00e
--- /dev/null
+++ b/tests/e2e/E2E.CustomPkgDef/source.extension.vsixmanifest
@@ -0,0 +1,22 @@
+
+
+
+
+ E2E CustomPkgDef Test
+ E2E test for custom pkgdef file handling
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.ImageAndContentManifest/ContentManifest.json b/tests/e2e/E2E.ImageAndContentManifest/ContentManifest.json
new file mode 100644
index 0000000..eb9a158
--- /dev/null
+++ b/tests/e2e/E2E.ImageAndContentManifest/ContentManifest.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/vsix-content-manifest",
+ "contentType": "vsix-content-manifest",
+ "files": [
+ {
+ "path": "Content/readme.txt",
+ "type": "text"
+ },
+ {
+ "path": "Content/config.json",
+ "type": "json"
+ }
+ ]
+}
diff --git a/tests/e2e/E2E.ImageAndContentManifest/E2E.ImageAndContentManifest.csproj b/tests/e2e/E2E.ImageAndContentManifest/E2E.ImageAndContentManifest.csproj
new file mode 100644
index 0000000..7261e70
--- /dev/null
+++ b/tests/e2e/E2E.ImageAndContentManifest/E2E.ImageAndContentManifest.csproj
@@ -0,0 +1,19 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.ImageAndContentManifest/E2EImageAndContentManifestPackage.cs b/tests/e2e/E2E.ImageAndContentManifest/E2EImageAndContentManifestPackage.cs
new file mode 100644
index 0000000..1793327
--- /dev/null
+++ b/tests/e2e/E2E.ImageAndContentManifest/E2EImageAndContentManifestPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.ImageAndContentManifest
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000008")]
+ public sealed class E2EImageAndContentManifestPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.ImageAndContentManifest/Images/E2EImages.imagemanifest b/tests/e2e/E2E.ImageAndContentManifest/Images/E2EImages.imagemanifest
new file mode 100644
index 0000000..85c7616
--- /dev/null
+++ b/tests/e2e/E2E.ImageAndContentManifest/Images/E2EImages.imagemanifest
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.ImageAndContentManifest/source.extension.vsixmanifest b/tests/e2e/E2E.ImageAndContentManifest/source.extension.vsixmanifest
new file mode 100644
index 0000000..55c9fc4
--- /dev/null
+++ b/tests/e2e/E2E.ImageAndContentManifest/source.extension.vsixmanifest
@@ -0,0 +1,23 @@
+
+
+
+
+ E2E ImageAndContentManifest Test
+ E2E test for imagemanifest and ContentManifest.json auto-includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.csproj b/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.csproj
new file mode 100644
index 0000000..49aa027
--- /dev/null
+++ b/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.csproj
@@ -0,0 +1,29 @@
+
+
+
+
+ 1.0.0
+
+ false
+
+
+
+
+
+
+
+
+
+ true
+ PreserveNewest
+
+
+
+
diff --git a/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.pkgdef b/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.pkgdef
new file mode 100644
index 0000000..16f0f39
--- /dev/null
+++ b/tests/e2e/E2E.ManualPkgDef/E2E.ManualPkgDef.pkgdef
@@ -0,0 +1,14 @@
+; Manual pkgdef file - used when GeneratePkgDefFile=false
+; This file contains all VS registrations for the extension
+
+; Package registration
+[$RootKey$\Packages\{00000000-0000-0000-0000-000000000006}]
+@="E2E ManualPkgDef Package"
+"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL"
+"Class"="E2E.ManualPkgDef.ManualPkgDefPackage"
+"CodeBase"="$PackageFolder$\E2E.ManualPkgDef.dll"
+
+; Custom settings
+[$RootKey$\E2E\ManualPkgDef]
+"ManualSetting"="ManualValue"
+"IsManualOnly"=dword:00000001
diff --git a/tests/e2e/E2E.ManualPkgDef/source.extension.vsixmanifest b/tests/e2e/E2E.ManualPkgDef/source.extension.vsixmanifest
new file mode 100644
index 0000000..bf8748c
--- /dev/null
+++ b/tests/e2e/E2E.ManualPkgDef/source.extension.vsixmanifest
@@ -0,0 +1,22 @@
+
+
+
+
+ E2E ManualPkgDef Test
+ E2E test for manual-only pkgdef (no auto-generation)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Minimal/E2E.Minimal.csproj b/tests/e2e/E2E.Minimal/E2E.Minimal.csproj
new file mode 100644
index 0000000..58de8dc
--- /dev/null
+++ b/tests/e2e/E2E.Minimal/E2E.Minimal.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Minimal/E2EMinimalPackage.cs b/tests/e2e/E2E.Minimal/E2EMinimalPackage.cs
new file mode 100644
index 0000000..4632b45
--- /dev/null
+++ b/tests/e2e/E2E.Minimal/E2EMinimalPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.Minimal
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000001")]
+ public sealed class E2EMinimalPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.Minimal/source.extension.vsixmanifest b/tests/e2e/E2E.Minimal/source.extension.vsixmanifest
new file mode 100644
index 0000000..ba577e6
--- /dev/null
+++ b/tests/e2e/E2E.Minimal/source.extension.vsixmanifest
@@ -0,0 +1,19 @@
+
+
+
+
+ E2E Minimal Test
+ Minimal E2E test for VsixSdk core defaults
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.SourceGenerators/Commands/Commands.vsct b/tests/e2e/E2E.SourceGenerators/Commands/Commands.vsct
new file mode 100644
index 0000000..e98defe
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/Commands/Commands.vsct
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.SourceGenerators/E2E.SourceGenerators.csproj b/tests/e2e/E2E.SourceGenerators/E2E.SourceGenerators.csproj
new file mode 100644
index 0000000..21f0bd8
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/E2E.SourceGenerators.csproj
@@ -0,0 +1,34 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+
diff --git a/tests/e2e/E2E.SourceGenerators/E2ESourceGeneratorsPackage.cs b/tests/e2e/E2E.SourceGenerators/E2ESourceGeneratorsPackage.cs
new file mode 100644
index 0000000..0e08de0
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/E2ESourceGeneratorsPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.SourceGenerators
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000003")]
+ public sealed class E2ESourceGeneratorsPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.SourceGenerators/GeneratorConsumer.cs b/tests/e2e/E2E.SourceGenerators/GeneratorConsumer.cs
new file mode 100644
index 0000000..faac130
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/GeneratorConsumer.cs
@@ -0,0 +1,82 @@
+// This file uses generated constants to verify compilation works correctly.
+// If source generators fail, this file will not compile.
+
+using System;
+
+namespace E2E.SourceGenerators
+{
+ ///
+ /// Consumes generated constants to verify source generators work.
+ ///
+ public static class GeneratorConsumer
+ {
+ // VsixInfo constants from manifest
+ public static string ExtensionId => VsixInfo.Id;
+ public static string ExtensionVersion => VsixInfo.Version;
+ public static string ExtensionLanguage => VsixInfo.Language;
+ public static string ExtensionPublisher => VsixInfo.Publisher;
+ public static string ExtensionDisplayName => VsixInfo.DisplayName;
+ public static string ExtensionDescription => VsixInfo.Description;
+ public static string ExtensionMoreInfo => VsixInfo.MoreInfo;
+ public static string ExtensionLicense => VsixInfo.License;
+ public static string ExtensionGettingStartedGuide => VsixInfo.GettingStartedGuide;
+ public static string ExtensionReleaseNotes => VsixInfo.ReleaseNotes;
+ public static string ExtensionIcon => VsixInfo.Icon;
+ public static string ExtensionPreviewImage => VsixInfo.PreviewImage;
+ public static string ExtensionTags => VsixInfo.Tags;
+ public static bool ExtensionIsPreview => VsixInfo.IsPreview;
+
+ // VSCT constants - Package GUID
+ public static string PackageGuidString => CommandsVsct.guidSourceGenPackageString;
+ public static Guid PackageGuid => CommandsVsct.guidSourceGenPackage;
+
+ // VSCT constants - Command Set 1
+ public static string CommandSet1GuidString => CommandsVsct.guidCommandSet1.GuidString;
+ public static Guid CommandSet1Guid => CommandsVsct.guidCommandSet1.Guid;
+ public static int MenuGroup1 => CommandsVsct.guidCommandSet1.MenuGroup1;
+ public static int Command1Id => CommandsVsct.guidCommandSet1.Command1Id;
+ public static int Command2Id => CommandsVsct.guidCommandSet1.Command2Id;
+
+ // VSCT constants - Command Set 2
+ public static string CommandSet2GuidString => CommandsVsct.guidCommandSet2.GuidString;
+ public static Guid CommandSet2Guid => CommandsVsct.guidCommandSet2.Guid;
+ public static int MenuGroup2 => CommandsVsct.guidCommandSet2.MenuGroup2;
+ public static int Command3Id => CommandsVsct.guidCommandSet2.Command3Id;
+
+ ///
+ /// Validates that all expected values are correctly generated.
+ ///
+ public static void ValidateGeneratedConstants()
+ {
+ // Validate VsixInfo values
+ if (string.IsNullOrEmpty(ExtensionId))
+ throw new InvalidOperationException("VsixInfo.Id is empty");
+ if (string.IsNullOrEmpty(ExtensionDisplayName))
+ throw new InvalidOperationException("VsixInfo.DisplayName is empty");
+ if (!ExtensionIsPreview)
+ throw new InvalidOperationException("VsixInfo.IsPreview should be true");
+
+ // Validate description contains escaped content
+ if (!ExtensionDescription.Contains("\""))
+ throw new InvalidOperationException("VsixInfo.Description should contain escaped quotes");
+ if (!ExtensionDescription.Contains("\\"))
+ throw new InvalidOperationException("VsixInfo.Description should contain backslashes");
+
+ // Validate VSCT GUIDs
+ if (PackageGuid == Guid.Empty)
+ throw new InvalidOperationException("Package GUID is empty");
+ if (CommandSet1Guid == Guid.Empty)
+ throw new InvalidOperationException("CommandSet1 GUID is empty");
+ if (CommandSet2Guid == Guid.Empty)
+ throw new InvalidOperationException("CommandSet2 GUID is empty");
+
+ // Validate command IDs
+ if (Command1Id != 0x0100)
+ throw new InvalidOperationException("Command1Id has wrong value");
+ if (Command2Id != 0x0101)
+ throw new InvalidOperationException("Command2Id has wrong value");
+ if (Command3Id != 0x0200)
+ throw new InvalidOperationException("Command3Id has wrong value");
+ }
+ }
+}
diff --git a/tests/e2e/E2E.SourceGenerators/LICENSE.txt b/tests/e2e/E2E.SourceGenerators/LICENSE.txt
new file mode 100644
index 0000000..f516486
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/LICENSE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) E2E Tests
+
+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.
diff --git a/tests/e2e/E2E.SourceGenerators/icon.png b/tests/e2e/E2E.SourceGenerators/icon.png
new file mode 100644
index 0000000..08cd6f2
Binary files /dev/null and b/tests/e2e/E2E.SourceGenerators/icon.png differ
diff --git a/tests/e2e/E2E.SourceGenerators/preview.png b/tests/e2e/E2E.SourceGenerators/preview.png
new file mode 100644
index 0000000..08cd6f2
Binary files /dev/null and b/tests/e2e/E2E.SourceGenerators/preview.png differ
diff --git a/tests/e2e/E2E.SourceGenerators/source.extension.vsixmanifest b/tests/e2e/E2E.SourceGenerators/source.extension.vsixmanifest
new file mode 100644
index 0000000..401430d
--- /dev/null
+++ b/tests/e2e/E2E.SourceGenerators/source.extension.vsixmanifest
@@ -0,0 +1,31 @@
+
+
+
+
+
+ E2E SourceGenerators Test
+ E2E test for source generators with "quotes" and C:\paths\with\backslashes
+ https://example.com/more-info
+ LICENSE.txt
+ https://example.com/getting-started
+ https://example.com/release-notes
+ icon.png
+ preview.png
+ e2e, test, source-generators
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/E2E.Templates.AutoDiscovery.csproj b/tests/e2e/E2E.Templates.AutoDiscovery/E2E.Templates.AutoDiscovery.csproj
new file mode 100644
index 0000000..fbb79ea
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/E2E.Templates.AutoDiscovery.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/E2ETemplatesAutoDiscoveryPackage.cs b/tests/e2e/E2E.Templates.AutoDiscovery/E2ETemplatesAutoDiscoveryPackage.cs
new file mode 100644
index 0000000..a29ee72
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/E2ETemplatesAutoDiscoveryPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.Templates.AutoDiscovery
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000009")]
+ public sealed class E2ETemplatesAutoDiscoveryPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/Class.cs b/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/Class.cs
new file mode 100644
index 0000000..2adf76c
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/Class.cs
@@ -0,0 +1,6 @@
+namespace $rootnamespace$
+{
+ public class $safeitemname$
+ {
+ }
+}
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/NewClass.vstemplate b/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/NewClass.vstemplate
new file mode 100644
index 0000000..b27882a
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/ItemTemplates/NewClass/NewClass.vstemplate
@@ -0,0 +1,13 @@
+
+
+
+ E2E Class
+ A class item template for E2E testing
+ CSharp
+ 10
+ Class.cs
+
+
+ Class.cs
+
+
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/ConsoleApp.vstemplate b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/ConsoleApp.vstemplate
new file mode 100644
index 0000000..4af14fd
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/ConsoleApp.vstemplate
@@ -0,0 +1,17 @@
+
+
+
+ E2E Console App
+ A console application for E2E testing
+ CSharp
+ 1000
+ ConsoleApp
+ true
+ true
+
+
+
+ Program.cs
+
+
+
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Program.cs b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Program.cs
new file mode 100644
index 0000000..fc915a1
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Program.cs
@@ -0,0 +1,9 @@
+namespace $safeprojectname$;
+
+class Program
+{
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello from $safeprojectname$!");
+ }
+}
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Project.csproj b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Project.csproj
new file mode 100644
index 0000000..64e34a8
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/ProjectTemplates/ConsoleApp/Project.csproj
@@ -0,0 +1,8 @@
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
diff --git a/tests/e2e/E2E.Templates.AutoDiscovery/source.extension.vsixmanifest b/tests/e2e/E2E.Templates.AutoDiscovery/source.extension.vsixmanifest
new file mode 100644
index 0000000..73bd275
--- /dev/null
+++ b/tests/e2e/E2E.Templates.AutoDiscovery/source.extension.vsixmanifest
@@ -0,0 +1,23 @@
+
+
+
+
+ E2E Templates AutoDiscovery Test
+ E2E test for template auto-discovery in default folders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/CSharpItem.vstemplate b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/CSharpItem.vstemplate
new file mode 100644
index 0000000..db881d3
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/CSharpItem.vstemplate
@@ -0,0 +1,13 @@
+
+
+
+ C# Item (SubPath)
+ A C# item template in a custom subfolder
+ CSharp
+ 10
+ CSharpItem.cs
+
+
+ Item.cs
+
+
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/Item.cs b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/Item.cs
new file mode 100644
index 0000000..b53df31
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpItem/Item.cs
@@ -0,0 +1,7 @@
+namespace $rootnamespace$
+{
+ public class $safeitemname$
+ {
+ // Created from manual item template with subpath
+ }
+}
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/CSharpProject.vstemplate b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/CSharpProject.vstemplate
new file mode 100644
index 0000000..c00fd53
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/CSharpProject.vstemplate
@@ -0,0 +1,17 @@
+
+
+
+ C# Project (SubPath)
+ A C# project template in a custom subfolder
+ CSharp
+ 1000
+ CSharpProject
+ true
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Class1.cs b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Class1.cs
new file mode 100644
index 0000000..a589b9a
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Class1.cs
@@ -0,0 +1,7 @@
+namespace $safeprojectname$
+{
+ public class Class1
+ {
+ // Created from manual project template with subpath
+ }
+}
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Project.csproj b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Project.csproj
new file mode 100644
index 0000000..e8cd599
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/CustomTemplates/CSharpProject/Project.csproj
@@ -0,0 +1,7 @@
+
+
+ net8.0
+ enable
+ enable
+
+
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/E2E.Templates.ManualWithSubPath.csproj b/tests/e2e/E2E.Templates.ManualWithSubPath/E2E.Templates.ManualWithSubPath.csproj
new file mode 100644
index 0000000..0c9566c
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/E2E.Templates.ManualWithSubPath.csproj
@@ -0,0 +1,28 @@
+
+
+
+
+ 1.0.0
+
+ false
+
+ $(DefaultItemExcludes);CustomTemplates\**
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/E2ETemplatesManualWithSubPathPackage.cs b/tests/e2e/E2E.Templates.ManualWithSubPath/E2ETemplatesManualWithSubPathPackage.cs
new file mode 100644
index 0000000..fb532f1
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/E2ETemplatesManualWithSubPathPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.Templates.ManualWithSubPath
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-00000000000C")]
+ public sealed class E2ETemplatesManualWithSubPathPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.Templates.ManualWithSubPath/source.extension.vsixmanifest b/tests/e2e/E2E.Templates.ManualWithSubPath/source.extension.vsixmanifest
new file mode 100644
index 0000000..d09b16a
--- /dev/null
+++ b/tests/e2e/E2E.Templates.ManualWithSubPath/source.extension.vsixmanifest
@@ -0,0 +1,23 @@
+
+
+
+
+ E2E Templates ManualWithSubPath Test
+ E2E test for explicit template items with TargetSubPath
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj b/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj
new file mode 100644
index 0000000..a77135c
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj
@@ -0,0 +1,46 @@
+
+
+
+
+ 1.0.0
+
+ false
+
+ $(DefaultItemExcludes);TemplateSource\**
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs b/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs
new file mode 100644
index 0000000..2df0cb9
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.Templates.PreBuiltZip
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-00000000000A")]
+ public sealed class E2ETemplatesPreBuiltZipPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs
new file mode 100644
index 0000000..3889610
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs
@@ -0,0 +1,7 @@
+namespace $rootnamespace$
+{
+ public class $safeitemname$
+ {
+ // Created from pre-built item template
+ }
+}
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate
new file mode 100644
index 0000000..055f055
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate
@@ -0,0 +1,13 @@
+
+
+
+ Pre-Built Item
+ An item template from a pre-built zip
+ CSharp
+ 10
+ PreBuiltItem.cs
+
+
+ Item.cs
+
+
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Class1.cs b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Class1.cs
new file mode 100644
index 0000000..468679e
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Class1.cs
@@ -0,0 +1,6 @@
+namespace $safeprojectname$
+{
+ public class Class1
+ {
+ }
+}
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate
new file mode 100644
index 0000000..6c17dd0
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate
@@ -0,0 +1,17 @@
+
+
+
+ Pre-Built Project Template
+ A project template from a pre-built zip
+ CSharp
+ 1000
+ PreBuiltProject
+ true
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj
new file mode 100644
index 0000000..e8cd599
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj
@@ -0,0 +1,7 @@
+
+
+ net8.0
+ enable
+ enable
+
+
diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest b/tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest
new file mode 100644
index 0000000..302eb62
--- /dev/null
+++ b/tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest
@@ -0,0 +1,23 @@
+
+
+
+
+ E2E Templates PreBuiltZip Test
+ E2E test for VsixTemplateZip with pre-built zip files
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Validation/E2E.Validation.csproj b/tests/e2e/E2E.Validation/E2E.Validation.csproj
new file mode 100644
index 0000000..ea67b92
--- /dev/null
+++ b/tests/e2e/E2E.Validation/E2E.Validation.csproj
@@ -0,0 +1,23 @@
+
+
+
+
+ 1.0.0
+
+ x86
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.Validation/E2EValidationPackage.cs b/tests/e2e/E2E.Validation/E2EValidationPackage.cs
new file mode 100644
index 0000000..1eb7b13
--- /dev/null
+++ b/tests/e2e/E2E.Validation/E2EValidationPackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.Validation
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000007")]
+ public sealed class E2EValidationPackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Class1.cs b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Class1.cs
new file mode 100644
index 0000000..468679e
--- /dev/null
+++ b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Class1.cs
@@ -0,0 +1,6 @@
+namespace $safeprojectname$
+{
+ public class Class1
+ {
+ }
+}
diff --git a/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Project.csproj b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Project.csproj
new file mode 100644
index 0000000..e8cd599
--- /dev/null
+++ b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/Project.csproj
@@ -0,0 +1,7 @@
+
+
+ net8.0
+ enable
+ enable
+
+
diff --git a/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/TestTemplate.vstemplate b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/TestTemplate.vstemplate
new file mode 100644
index 0000000..1647306
--- /dev/null
+++ b/tests/e2e/E2E.Validation/ProjectTemplates/TestTemplate/TestTemplate.vstemplate
@@ -0,0 +1,15 @@
+
+
+
+ Test Template
+ Template to trigger VSIXSDK011 warning
+ CSharp
+ TestProject
+ true
+
+
+
+ Class1.cs
+
+
+
diff --git a/tests/e2e/E2E.Validation/source.extension.vsixmanifest b/tests/e2e/E2E.Validation/source.extension.vsixmanifest
new file mode 100644
index 0000000..e48b89d
--- /dev/null
+++ b/tests/e2e/E2E.Validation/source.extension.vsixmanifest
@@ -0,0 +1,20 @@
+
+
+
+
+ E2E Validation Test
+ E2E test for validation warnings - intentionally triggers warnings
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.ValidationNoManifest/E2E.ValidationNoManifest.csproj b/tests/e2e/E2E.ValidationNoManifest/E2E.ValidationNoManifest.csproj
new file mode 100644
index 0000000..f411c3a
--- /dev/null
+++ b/tests/e2e/E2E.ValidationNoManifest/E2E.ValidationNoManifest.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+ 1.0.0
+
+ false
+
+ false
+
+
+
diff --git a/tests/e2e/E2E.VersionOverride/E2E.VersionOverride.csproj b/tests/e2e/E2E.VersionOverride/E2E.VersionOverride.csproj
new file mode 100644
index 0000000..22551be
--- /dev/null
+++ b/tests/e2e/E2E.VersionOverride/E2E.VersionOverride.csproj
@@ -0,0 +1,19 @@
+
+
+
+
+ 1.0.0
+
+
+
+
+
+
+
diff --git a/tests/e2e/E2E.VersionOverride/E2EVersionOverridePackage.cs b/tests/e2e/E2E.VersionOverride/E2EVersionOverridePackage.cs
new file mode 100644
index 0000000..97a566b
--- /dev/null
+++ b/tests/e2e/E2E.VersionOverride/E2EVersionOverridePackage.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Microsoft.VisualStudio.Shell;
+using Task = System.Threading.Tasks.Task;
+
+namespace E2E.VersionOverride
+{
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [Guid("00000000-0000-0000-0000-000000000004")]
+ public sealed class E2EVersionOverridePackage : AsyncPackage
+ {
+ protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+ await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
+ }
+ }
+}
diff --git a/tests/e2e/E2E.VersionOverride/source.extension.vsixmanifest b/tests/e2e/E2E.VersionOverride/source.extension.vsixmanifest
new file mode 100644
index 0000000..0d8f158
--- /dev/null
+++ b/tests/e2e/E2E.VersionOverride/source.extension.vsixmanifest
@@ -0,0 +1,19 @@
+
+
+
+
+ E2E VersionOverride Test
+ E2E test for version handling and SetVsixVersion override
+
+
+
+
+
+
+
+
+
+
+