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 + + + + amd64 + + + + + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + + 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) + + + + amd64 + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + + + + 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 + + + + amd64 + + + + + + + + + + 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 + + + + amd64 + + + + + + + + +