PlayNicely.Projects 1.0.4-prerelease-20240226-104112

This is a prerelease version of PlayNicely.Projects.
There is a newer version of this package available.
See the version list below for details.
dotnet add package PlayNicely.Projects --version 1.0.4-prerelease-20240226-104112                
NuGet\Install-Package PlayNicely.Projects -Version 1.0.4-prerelease-20240226-104112                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PlayNicely.Projects" Version="1.0.4-prerelease-20240226-104112">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add PlayNicely.Projects --version 1.0.4-prerelease-20240226-104112                
#r "nuget: PlayNicely.Projects, 1.0.4-prerelease-20240226-104112"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install PlayNicely.Projects as a Cake Addin
#addin nuget:?package=PlayNicely.Projects&version=1.0.4-prerelease-20240226-104112&prerelease

// Install PlayNicely.Projects as a Cake Tool
#tool nuget:?package=PlayNicely.Projects&version=1.0.4-prerelease-20240226-104112&prerelease                

Play Nicely Case Packer

The Play Nicely Case Packer project supports the definition and packaging (for reading or writing) of MSBuild Projects for use in release test cases. While this NuGet package can be used independently its development is a result of the Play Nicely MSBuild tools packages, e.g. NpmNpx or Sass.

Getting Started

This base package supports the definition of a TestCaseProject via a generic FileSystem interface. This interface allows for the definition of directories and files, and also the contents of those files.

The other artefacts support reading or writing of a TestCaseProject to media. At time of writing, the project supports reading from .NET assembly resources and writing to the physical file system. Implement concrete versions of IProjectPackageReader and IProjectPackageWriter if you have a specific media that you wish to support.

Defining Projects

The TestCaseProject class represents a virtual project, you can create a FileSystem by adding directories and files via the FileSystem object using it's fluent interface. You can also specify the ProjectFile from the same file system. Once defined the TestCaseProject doesn't do much on its own, but it is used by the PlayNicely.Executor package to run test cases.

var testCaseProject = new TestCaseProject("my-project");
var projectFile = testCaseProject.AddDirectory("project1")
                                 .AddFile("proj.csproj");

testCaseProject.ProjectFile = projectFile;

using(var writer = new StreamWriter(projectFile.OpenWriteStream()))
{
    writer.WriteLine("<Project Sdk=\"Microsoft.NET.Sdk\">");
    writer.WriteLine("  <PropertyGroup>");
    writer.WriteLine("    <TargetFramework>netstandard2.0</TargetFramework>");
    writer.WriteLine("  </PropertyGroup>");
    writer.WriteLine("</Project>");
}

Using Resource (resx) files

Building test case projects in code is fine, but there is already a tool to easily define and edit MSBuild projects, the IDE. To support this, Case Packer provides a IProjectPackageReader implementation for .NET resources. The basic idea is to add file resources to the resx file with names equivalent to the project file structure. The ResourceSetPackageReader can then be used to read a package into a test case project, including the file contents.

Example

If you have the following project structure...

solution-dir
|-- my-project.Specs           # BDD Specifications for your project
|   |-- TestCases.Projects     # Define your test case 'packages' in resx files
|       |-- Project1.resx
|-- TestCase.Projects          # Define your test case projects in here using familiar tools.
|   |-- Project1
|       |-- Project1.csproj
|       |-- Program.cs
|-- my-solution.sln

The .resx file should have the following resources defined

<?xml version="1.0" encoding="utf-8"?>
<root>
  <data name="Project1/Project1.csproj" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Project1/Project1.csproj;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
  </data>
  <data name="Project1/Program.cs" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Project1/Program.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
  </data>
</root>

And then to load these resources into a TestCaseProject you can...

internal static class TestCases
{
    // Where projectName is the same as the resx file name without the extension
    public static async Task<TestCaseProject> LoadAsync(string projectName, CancellationToken cancel)
    {
        ArgumentException.ThrowIfNullOrEmpty(projectName);
        cancel.ThrowIfCancellationRequested();

        var resourceManager = new ResourceManager($"{ResourceNamespace}.{projectName}", ResourceAssembly);

        using var resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true)
            ?? throw new TestCaseException(string.Format(ContentRes.Error_ProjectNameDoesNotExist, projectName));
        using var reader = new ResourceSetBlobReader(resourceSet);

        var result = new TestCaseProject(projectName);

        await result.LoadFromAsync(reader, cancel);
        cancel.ThrowIfCancellationRequested();

        return result;
    }

    public static Assembly ResourceAssembly => _resourceAssembly.Value;
    public static string ResourceNamespace => _resourceNamespace.Value;

    private static readonly Lazy<Assembly> _resourceAssembly = new(() => typeof(TestCases).Assembly);
    private static readonly Lazy<string> _resourceNamespace = new(() => typeof(TestCases).Namespace ?? string.Empty);
}
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

  • net8.0

    • No dependencies.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on PlayNicely.Projects:

Package Downloads
PlayNicely.Executor

A framework that facilitates testing of Play Nicely functionality. Provides capability to execute programs, in a controlled environment, against test case projects.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.3-beta-550 101 10/4/2024
1.1.3-beta-543 115 9/28/2024
1.1.3-beta-535 109 9/28/2024
1.1.3-beta-529 100 9/23/2024
1.1.3-beta-518 114 9/21/2024
1.1.3-beta-511 100 9/20/2024
1.1.3-beta-509 101 9/20/2024
1.1.3-beta-507 101 9/20/2024
1.1.3-beta-505 102 9/19/2024
1.1.3-beta-501 128 9/18/2024
1.1.3-beta-499 110 9/18/2024
1.1.3-beta-496 117 9/18/2024
1.1.2 173 9/17/2024
1.1.2-beta-494 110 9/18/2024
1.1.2-beta-492 120 9/18/2024
1.1.2-beta-487 116 9/17/2024
1.1.1 223 6/1/2024
1.1.1-beta-479 123 9/14/2024
1.1.1-beta-472 119 9/14/2024
1.1.1-beta-465 135 9/7/2024
1.1.1-beta-450 110 7/14/2024
1.1.1-beta-442 107 7/12/2024
1.1.1-beta-432 110 7/11/2024
1.1.1-beta-418 107 6/1/2024
1.1.1-beta-398 113 6/1/2024
1.1.0 127 5/6/2024
1.1.0-beta-393 123 5/31/2024
1.1.0-beta-382 138 5/21/2024
1.1.0-beta-370 135 5/8/2024
1.1.0-beta-355 136 5/7/2024
1.1.0-beta-349 130 5/7/2024
1.1.0-beta-346 132 5/7/2024
1.1.0-beta-340 134 5/7/2024
1.1.0-beta-323 126 5/6/2024
1.0.7 343 4/11/2024
1.0.7-beta-312 131 4/26/2024
1.0.7-beta-299 146 4/14/2024
1.0.7-beta-296 130 4/14/2024
1.0.7-beta-287 126 4/11/2024
1.0.7-beta-282 130 4/11/2024
1.0.7-beta-280 136 4/10/2024
1.0.7-beta-278 127 4/10/2024
1.0.7-beta-276 123 4/10/2024
1.0.7-beta-274 147 4/9/2024
1.0.7-beta-272 137 4/9/2024
1.0.6 173 3/21/2024
1.0.6-beta-266 130 3/21/2024
1.0.6-beta-260 131 3/21/2024
1.0.5 217 3/10/2024
1.0.5-prerelease-20240301-0... 115 3/1/2024
1.0.5-beta-227 135 3/10/2024
1.0.5-beta-221 143 3/9/2024
1.0.5-beta-214 141 3/9/2024
1.0.5-beta-208 137 3/1/2024
1.0.5-beta-206 133 3/1/2024
1.0.4 137 2/29/2024
1.0.4-prerelease-20240229-1... 92 2/29/2024
1.0.4-prerelease-20240228-0... 91 2/28/2024
1.0.4-prerelease-20240226-1... 112 2/26/2024