diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b12a8feb..224a1d31 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,3 +26,6 @@ If applicable, add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. + +--- +Please upvote :+1: this issue if you are interested in it. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index dc6ee2fc..dd40949e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -18,3 +18,6 @@ A clear and concise description of any alternative solutions or features you've **Additional context** Add any other context or screenshots about the feature request here. + +--- +Please upvote :+1: this issue if you are interested in it. \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e93dabf5..8604355d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -17,3 +17,6 @@ fixes # ## Changes + +--- +Please upvote :+1: this pull request if you are interested in it. \ No newline at end of file diff --git a/.github/workflows/top-issues-dashboard.yml b/.github/workflows/top-issues-dashboard.yml new file mode 100644 index 00000000..7f08d629 --- /dev/null +++ b/.github/workflows/top-issues-dashboard.yml @@ -0,0 +1,24 @@ +name: Top issues action. +on: + schedule: + - cron: '0 0 */1 * *' + +jobs: + ShowAndLabelTopIssues: + name: Display and label top issues. + runs-on: ubuntu-latest + steps: + - name: Top Issues action + uses: rickstaa/top-issues-action@v1.3.101 + env: + github_token: ${{ secrets.GITHUB_TOKEN }} + with: + top_list_size: 10 + label: true + dashboard: true + dashboard_show_total_reactions: true + top_issues: true + top_bugs: true + top_features: true + feature_label: feature + top_pull_requests: true \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2316734d..4c95b297 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,7 +39,7 @@ What is generally considered trivial: ### Code style Normal .NET coding guidelines apply. -See the [Framework Design Guidelines](https://msdn.microsoft.com/en-us/library/ms229042%28v=vs.110%29.aspx) for more information. +See the [Framework Design Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/) for more information. ### Dependencies @@ -59,7 +59,7 @@ Any new code should also have reasonable unit test coverage. information and a link back to the discussion. * Once you get a nod from someone in the Spectre.Console Team, you can start on the feature. * Alternatively, if a feature is on the issues list with the - [Up For Grabs](https://github.com/spectreconsole/spectre.console/labels/up-for-grabs) label, + [good first issue](https://github.com/spectreconsole/spectre.console/labels/good%20first%20issue) label, it is open for a community member (contributor) to patch. You should comment that you are signing up for it on the issue so someone else doesn't also sign up for the work. @@ -158,4 +158,4 @@ Harder for us roughly translates to a longer SLA for your pull request. ## Acknowledgement This contribution guide was taken from the [Chocolatey project](https://chocolatey.org/) -with permission and was edited to follow Spectre.Console's conventions and processes. \ No newline at end of file +with permission and was edited to follow Spectre.Console's conventions and processes. diff --git a/README.fa.md b/README.fa.md index 9eec6edb..3ebcd935 100644 --- a/README.fa.md +++ b/README.fa.md @@ -44,30 +44,13 @@ https://spectreconsole.net/

مثال‌ها

-برای بررسی `Spectre.Console` در عمل، ابزار سراسری -[dotnet-example](https://github.com/patriksvensson/dotnet-example) -را نصب کنید. - -
-> dotnet tool restore
-
- -حالا شما می‌توانید مثال‌های موجود در این مخزن را لیست کنید: - -
-> dotnet example
-
- -و برای اجرای مثال: - -
-> dotnet example tables
-
+To see `Spectre.Console` in action, please see the +[examples repository](https://github.com/spectreconsole/examples).

مجوز

-Copyright © Patrik Svensson, Phil Scott +Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید. diff --git a/README.md b/README.md index fd01732a..9724aaa5 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_ _[![Spectre.Console CLI NuGet Version](https://img.shields.io/nuget/v/spectre.console.cli.svg?style=flat&label=NuGet%3A%20Spectre.Console.Cli)](https://www.nuget.org/packages/spectre.console.cli)_ [![Netlify Status](https://api.netlify.com/api/v1/badges/1eaf215a-eb9c-45e4-8c64-c90b62963149/deploy-status)](https://app.netlify.com/sites/spectreconsole/deploys) A .NET library that makes it easier to create beautiful, cross platform, console applications. -It is heavily inspired by the excellent [Rich library](https://github.com/willmcgugan/rich) -for Python. For detailed usage instructions, [please refer to the documentation at https://spectreconsole.net/.](https://spectreconsole.net/) +It is heavily inspired by the excellent Python library, [Rich](https://github.com/willmcgugan/rich). Detailed instructions for using `Spectre.Console` are located on the project website, https://spectreconsole.net ## Table of Contents @@ -19,18 +18,22 @@ for Python. For detailed usage instructions, [please refer to the documentation ## Features -* Written with unit testing in mind. -* Supports tables, grids, panels, and a [rich](https://github.com/willmcgugan/rich) inspired markup language. +* Supports tables, grids, panels, and a [Rich](https://github.com/willmcgugan/rich) inspired markup language. * Supports the most common SRG parameters when it comes to text styling such as bold, dim, italic, underline, strikethrough, and blinking text. * Supports 3/4/8/24-bit colors in the terminal. The library will detect the capabilities of the current terminal - and downgrade colors as needed. - + and downgrade colors as needed. +* Written with unit testing in mind. ![Example](docs/input/assets/images/example.png) +## Important Notices + +> [!IMPORTANT]\ +> We use the [Top Issues Dashboard](https://github.com/spectreconsole/spectre.console/issues/1517) for tracking community demand. Please upvote :+1: the issues and pull requests you are interested in. + ## Installing The fastest way of getting started using `Spectre.Console` is to install the NuGet package. @@ -42,34 +45,17 @@ dotnet add package Spectre.Console ## Documentation The documentation for `Spectre.Console` can be found at -https://spectreconsole.net/ +https://spectreconsole.net ## Examples -To see `Spectre.Console` in action, install the -[dotnet-example](https://github.com/patriksvensson/dotnet-example) -global tool. - -``` -> dotnet tool restore -``` - -Now you can list available examples in this repository: - -``` -> dotnet example -``` - -And to run an example: - -``` -> dotnet example tables -``` +To see `Spectre.Console` in action, please see the +[examples repository](https://github.com/spectreconsole/examples). ## Sponsors The following people are [sponsoring](https://github.com/sponsors/patriksvensson) -Spectre.Console to show their support and to ensure the longevity of the project. +`Spectre.Console` to show their support and to ensure the longevity of the project. * [Rodney Littles II](https://github.com/RLittlesII) * [Martin Björkström](https://github.com/bjorkstromm) @@ -97,8 +83,8 @@ This project is supported by the [.NET Foundation](https://dotnetfoundation.org) ## License -Copyright © Patrik Svensson, Phil Scott, Nils Andresen +Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray -Spectre.Console is provided as-is under the MIT license. For more information see LICENSE. +`Spectre.Console` is provided as-is under the MIT license. For more information see LICENSE. -* SixLabors.ImageSharp, a library which Spectre.Console relies upon, is licensed under Apache 2.0 when distributed as part of Spectre.Console. The Six Labors Split License covers all other usage, see: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE +* SixLabors.ImageSharp, a library which `Spectre.Console` relies upon, is licensed under Apache 2.0 when distributed as part of `Spectre.Console`. The Six Labors Split License covers all other usage, see: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE diff --git a/README.pt-BR.md b/README.pt-BR.md index f88a3e7d..267dab19 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -43,24 +43,8 @@ https://spectreconsole.net/ ## Exemplos -Para ver o `Spectre.Console` em ação, instale a ferramenta global -[dotnet-example](https://github.com/patriksvensson/dotnet-example). - -``` -> dotnet tool restore -``` - -Agora você pode listar os exemplos disponíveis neste repositório: - -``` -> dotnet example -``` - -E para executar um exemplo: - -``` -> dotnet example tables -``` +To see `Spectre.Console` in action, please see the +[examples repository](https://github.com/spectreconsole/examples). ## Patrocinadores @@ -83,7 +67,7 @@ Eu estou muito agradecido. ## Licença -Copyright © Patrik Svensson, Phil Scott, Nils Andresen +Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Spectre.Console é fornecido no estado em que se encontra sob a licença do MIT. Para obter mais informações, consulte o arquivo [LICENSE](LICENSE.md). diff --git a/README.zh.md b/README.zh.md index 981bb5bb..f6298737 100644 --- a/README.zh.md +++ b/README.zh.md @@ -39,23 +39,8 @@ https://spectreconsole.net/ ## 例子 -如果想直接运行`Spectre.Console`的例子,则需要安装[dotnet-example](https://github.com/patriksvensson/dotnet-example)工具。 - -``` -> dotnet tool restore -``` - -然后你可以列出仓库里的所有例子: - -``` -> dotnet example -``` - -跑一个看看效果: - -``` -> dotnet example tables -``` +To see `Spectre.Console` in action, please see the +[examples repository](https://github.com/spectreconsole/examples). ## Sponsors @@ -77,7 +62,7 @@ https://spectreconsole.net/ ## 开源许可 -版权所有 © Patrik Svensson, Phil Scott, Nils Andresen +版权所有 © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Spectre.Console 基于 MIT 协议提供。查看 LICENSE 文件了解更多信息。 diff --git a/build.cake b/build.cake index a51f9850..a79bcc41 100644 --- a/build.cake +++ b/build.cake @@ -35,41 +35,11 @@ Task("Build") }); }); -Task("Build-Analyzer") - .IsDependentOn("Build") - .Does(context => -{ - DotNetBuild("./src/Spectre.Console.Analyzer.sln", new DotNetBuildSettings { - Configuration = configuration, - Verbosity = DotNetVerbosity.Minimal, - NoLogo = true, - NoIncremental = context.HasArgument("rebuild"), - MSBuildSettings = new DotNetMSBuildSettings() - .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) - }); -}); - -Task("Build-Examples") - .IsDependentOn("Build") - .Does(context => -{ - DotNetBuild("./examples/Examples.sln", new DotNetBuildSettings { - Configuration = configuration, - Verbosity = DotNetVerbosity.Minimal, - NoLogo = true, - NoIncremental = context.HasArgument("rebuild"), - MSBuildSettings = new DotNetMSBuildSettings() - .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) - }); -}); - Task("Test") .IsDependentOn("Build") - .IsDependentOn("Build-Analyzer") - .IsDependentOn("Build-Examples") .Does(context => { - DotNetTest("./test/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings { + DotNetTest("./src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings { Configuration = configuration, Verbosity = DotNetVerbosity.Minimal, NoLogo = true, @@ -77,15 +47,7 @@ Task("Test") NoBuild = true, }); - DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings { - Configuration = configuration, - Verbosity = DotNetVerbosity.Minimal, - NoLogo = true, - NoRestore = true, - NoBuild = true, - }); - - DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj", new DotNetTestSettings { + DotNetTest("./src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings { Configuration = configuration, Verbosity = DotNetVerbosity.Minimal, NoLogo = true, @@ -108,17 +70,6 @@ Task("Package") MSBuildSettings = new DotNetMSBuildSettings() .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) }); - - context.DotNetPack($"./src/Spectre.Console.Analyzer.sln", new DotNetPackSettings { - Configuration = configuration, - Verbosity = DotNetVerbosity.Minimal, - NoLogo = true, - NoRestore = true, - NoBuild = true, - OutputDirectory = "./.artifacts", - MSBuildSettings = new DotNetMSBuildSettings() - .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) - }); }); Task("Publish-NuGet") diff --git a/docs/input/best-practices.md b/docs/input/best-practices.md index 7d7c13c7..20dc867d 100644 --- a/docs/input/best-practices.md +++ b/docs/input/best-practices.md @@ -60,7 +60,7 @@ Spectre.Console will tell your terminal to use the color that is configured in t If you are using an 8 or 24-bit color for the foreground text, it is recommended that you also set an appropriate background color to match. -**Do** escape data when outputting any user input or any external data via Markup using the [`EscapeMarkup`](xref:M:Spectre.Console.Markup.Escape(System.String)) method on the data. Any user input containing `[` or `]` will likely cause a runtime error while rendering otherwise. +**Do** escape data when outputting any user input or any external data via Markup using the [`Markup.Escape`](xref:M:Spectre.Console.Markup.Escape(System.String)) method on the data. Any user input containing `[` or `]` will likely cause a runtime error while rendering otherwise. **Consider** replacing `Markup` and `MarkupLine` with [`MarkupInterpolated`](xref:M:Spectre.Console.AnsiConsole.MarkupInterpolated(System.FormattableString)) and [`MarkupLineInterpolated`](xref:M:Spectre.Console.AnsiConsole.MarkupLineInterpolated(System.FormattableString)). Both these methods will automatically escape all data in the interpolated string holes. When working with widgets such as the Table and Tree, consider using [`Markup.FromInterpolated`](xref:M:Spectre.Console.Markup.FromInterpolated(System.FormattableString,Spectre.Console.Style)) to generate an `IRenderable` from an interpolated string. @@ -119,4 +119,4 @@ For cmd.exe, the following steps are required to enable Unicode and Emoji suppor 5. Reboot. You will also need to ensure that your Console application is configured to use a font that supports Unicode and Emoji, -such as Cascadia Code. \ No newline at end of file +such as Cascadia Code. diff --git a/docs/input/blog/posts/2024-04-23-spectre-console-0.49-released.md b/docs/input/blog/posts/2024-04-23-spectre-console-0.49-released.md new file mode 100644 index 00000000..f6b856e9 --- /dev/null +++ b/docs/input/blog/posts/2024-04-23-spectre-console-0.49-released.md @@ -0,0 +1,55 @@ +Title: Spectre.Console 0.49 released! +Description: Bug fixes, bug fixes, bug fixes +Published: 2024-04-23 +Category: Release Notes +Excluded: false +--- + +Version 0.49 of Spectre.Console has been released! + +## New Contributors +* @baronfel made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1425 +* @DarqueWarrior made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1431 +* @tonycknight made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1435 +* @caesay made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1439 +* @jsheely made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1414 +* @danielcweber made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1456 +* @martincostello made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1477 +* @slang25 made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1289 +* @thomhurst made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1250 +* @gerardog made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1489 +* @yenneferofvengerberg made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1503 +* @BlazeFace made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1509 + +## Changes + +* Cleanup line endings by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1381 +* Added Spectre.Console.Cli to quick-start. by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1413 +* Fix rendering of ListPrompt for odd pageSizes by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1365 +* Remove mandelbrot example due to conflicting license by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1426 +* Allow specifying a property to ignore the use of build-time packages for versioning and analysis by @baronfel in https://github.com/spectreconsole/spectre.console/pull/1425 +* Add the possibility to register multiple interceptors by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1412 +* Added the ITypeResolver to the ExceptionHandler by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1411 +* Updated typo in commandApp.md by @DarqueWarrior in https://github.com/spectreconsole/spectre.console/pull/1431 +* Command with -v displays app version instead of executing the command by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1427 +* HelpProvider colors should be configurable by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1408 +* Direct contributors to the current CONTRIBUTING.md by @tonycknight in https://github.com/spectreconsole/spectre.console/pull/1435 +* Fix deadlock when cancelling prompts by @caesay in https://github.com/spectreconsole/spectre.console/pull/1439 +* Add progress bar value formatter by @jsheely in https://github.com/spectreconsole/spectre.console/pull/1414 +* Update dependencies and do some clean-up by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1440 +* Delete [UsesVerify], which has become obsolete through the latest update. by @danielcweber in https://github.com/spectreconsole/spectre.console/pull/1456 +* Don't erase secret prompt text upon backspace when mask is null by @danielcweber in https://github.com/spectreconsole/spectre.console/pull/1458 +* Update dependencies to the latest version by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1459 +* Automatically register command settings by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1463 +* Remove [DebuggerDisplay] from Paragraph by @martincostello in https://github.com/spectreconsole/spectre.console/pull/1477 +* Selection Prompt Search by @slang25 in https://github.com/spectreconsole/spectre.console/pull/1289 +* Update dependency SixLabors.ImageSharp to v3.1.3 by @renovate in https://github.com/spectreconsole/spectre.console/pull/1486 +* Positioned Progress Tasks - Before or After Other Tasks by @thomhurst in https://github.com/spectreconsole/spectre.console/pull/1250 +* Added NoStackTrace to ExceptionFormats by @gerardog in https://github.com/spectreconsole/spectre.console/pull/1489 +* Pipe character for listing options (issue 1434) by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1498 +* Improve XmlDoc output by @yenneferofvengerberg in https://github.com/spectreconsole/spectre.console/pull/1503 +* Revert 71a5d830 to undo flickering regression by @phil-scott-78 in https://github.com/spectreconsole/spectre.console/pull/1504 +* AddDelegate uses an abstract type when used in a branch by @BlazeFace in https://github.com/spectreconsole/spectre.console/pull/1509 +* Missing Separator When Headers are Hidden by @BlazeFace in https://github.com/spectreconsole/spectre.console/pull/1513 +* Expose raw arguments on the command context by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1523 +* Add token representation to remaining arguments by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1525 \ No newline at end of file diff --git a/docs/input/blog/posts/_ViewStart.cshtml b/docs/input/blog/posts/_ViewStart.cshtml index 451a0547..7ecd2893 100644 --- a/docs/input/blog/posts/_ViewStart.cshtml +++ b/docs/input/blog/posts/_ViewStart.cshtml @@ -1,3 +1,3 @@ @{ - Layout = @$"_layout.cshtml"; + Layout = "_layout.cshtml"; } \ No newline at end of file diff --git a/docs/input/cli/command-help.md b/docs/input/cli/command-help.md index f83eca6c..0e4a6e92 100644 --- a/docs/input/cli/command-help.md +++ b/docs/input/cli/command-help.md @@ -71,5 +71,5 @@ public static class Program } ``` -There is a working [example of a custom help provider](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Help) demonstrating this. +There is a working [example of a custom help provider](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Help) demonstrating this. diff --git a/docs/input/cli/commandApp.md b/docs/input/cli/commandApp.md index 182cb37d..ff479b6b 100644 --- a/docs/input/cli/commandApp.md +++ b/docs/input/cli/commandApp.md @@ -75,7 +75,7 @@ var app = new CommandApp(registrar); return app.Run(args); ``` -`TypeRegistrar` is a custom class that must be created by the user. This [example using `Microsoft.Extensions.DependencyInjection` as the container](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Injection) provides an example `TypeRegistrar` and `TypeResolver` that can be added to your application with small adjustments for your DI container. +`TypeRegistrar` is a custom class that must be created by the user. This [example using `Microsoft.Extensions.DependencyInjection` as the container](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Injection) provides an example `TypeRegistrar` and `TypeResolver` that can be added to your application with small adjustments for your DI container. Hint: If you do write your own implementation of `TypeRegistrar` and `TypeResolver` and you have some form of unit tests in place for your project, there is a utility `TypeRegistrarBaseTests` available that can be used to ensure your implementations adhere to the required implementation. Simply call `TypeRegistrarBaseTests.RunAllTests()` and expect no `TypeRegistrarBaseTests.TestFailedException` to be thrown. @@ -89,4 +89,4 @@ This provides an opportunity to modify the result and also to tear down any infr The `Intercept`-Method of each interceptor is run before the command is executed and the `InterceptResult`-Method is run after it. These are typically used for configuring logging or other infrastructure concerns. -For an example of using the interceptor to configure logging, see the [Serilog demo](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Logging). +For an example of using the interceptor to configure logging, see the [Serilog demo](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Logging). \ No newline at end of file diff --git a/docs/input/cli/settings.md b/docs/input/cli/settings.md index b063831c..ba44d707 100644 --- a/docs/input/cli/settings.md +++ b/docs/input/cli/settings.md @@ -105,7 +105,7 @@ A `CommandOption` can be defined as an array like the following: ```csharp [CommandOption("-n|--name ")] -public string[] Names { get; set; }, +public string[] Names { get; set; } ``` This would allow the user to run `app.exe --name Dwayne --name Elizondo --name "Mountain Dew" --name Herbert --name Camacho` and would result in a 5 element array consisting of Dwayne, Elizondo, Mountain Dew, Herbert and Camacho. diff --git a/docs/input/prompts/text.md b/docs/input/prompts/text.md index 953fd547..1c75b551 100644 --- a/docs/input/prompts/text.md +++ b/docs/input/prompts/text.md @@ -27,6 +27,32 @@ you can use the `Prompt`. Run prompt example? [y/n] (y): _ ``` +### Usage + +```csharp +// Ask the user to confirm +var confirmation = AnsiConsole.Prompt( + new TextPrompt("Run prompt example?") + .AddChoice(true) + .AddChoice(false) + .DefaultValue(true) + .WithConverter(choice => choice ? "y" : "n")); + +// Echo the confirmation back to the terminal +Console.WriteLine(confirmation ? "Confirmed" : "Declined"); +``` + +Otherwise it is possible to use the `ConfirmationPrompt` + +```csharp +// Ask the user to confirm +var confirmation = AnsiConsole.Prompt( + new ConfirmationPrompt("Run prompt example?")); + +// Echo the confirmation back to the terminal +Console.WriteLine(confirmation ? "Confirmed" : "Declined"); +``` + ## Simple @@ -36,6 +62,30 @@ What's your name? Patrik What's your age? 37 ``` +### Usage + +```csharp +// Ask the user a couple of simple questions +var name = AnsiConsole.Prompt( + new TextPrompt("What's your name?")); +var age = AnsiConsole.Prompt( + new TextPrompt("What's your age?")); + +// Echo the name and age back to the terminal +AnsiConsole.WriteLine($"So you're {name} and you're {age} years old"); +``` + +Otherwise it is possible to use the `Ask` method + +```csharp +// Ask the user a couple of simple questions +var name = AnsiConsole.Ask("What's your name?"); +var age = AnsiConsole.Ask("What's your age?"); + +// Echo the name and age back to the terminal +AnsiConsole.WriteLine($"So you're {name} and you're {age} years old"); +``` + ## Choices @@ -44,6 +94,19 @@ What's your age? 37 What's your favorite fruit? [Apple/Banana/Orange] (Orange): _ ``` +### Usage + +```csharp +// Ask for the user's favorite fruit +var fruit = AnsiConsole.Prompt( + new TextPrompt("What's your favorite fruit?") + .AddChoices(["Apple", "Banana", "Orange"]) + .DefaultValue("Orange")); + +// Echo the fruit back to the terminal +Console.WriteLine($"I agree. {fruit} is tasty!"); +``` + ## Validation @@ -56,6 +119,23 @@ Too high What's the secret number? _ ``` +### Usage + +```csharp +// Ask the user to guess the secret number +var number = AnsiConsole.Prompt( + new TextPrompt("What's the secret number?") + .Validate((n) => n switch + { + < 50 => ValidationResult.Error("Too low"), + 50 => ValidationResult.Success(), + > 50 => ValidationResult.Error("Too high"), + })); + +// Echo the user's success back to the terminal +Console.WriteLine($"Correct! The secret number is {number}."); +``` + ## Secrets @@ -65,6 +145,18 @@ What's the secret number? _ Enter password: ************_ ``` +### Usage + +```csharp +// Ask the user to enter the password +var password = AnsiConsole.Prompt( + new TextPrompt("Enter password:") + .Secret()); + +// Echo the password back to the terminal +Console.WriteLine($"Your password is {password}"); +``` + ## Masks @@ -82,10 +174,36 @@ You can utilize a null character to completely hide input. Enter password: _ ``` +### Usage + +```csharp +// Ask the user to enter the password +var password = AnsiConsole.Prompt( + new TextPrompt("Enter password:") + .Secret('-')); + +// Echo the password back to the terminal +Console.WriteLine($"Your password is {password}"); +``` + ## Optional ```text [Optional] Favorite color? _ +``` + +### Usage + +```csharp +// Ask the user to enter the password +var color = AnsiConsole.Prompt( + new TextPrompt("[[Optional]] Favorite color?") + .AllowEmpty()); + +// Echo the color back to the terminal +Console.WriteLine(string.IsNullOrWhiteSpace(color) + ? "You're right, all colors are beautiful" + : $"I agree. {color} is a very beautiful color"); ``` \ No newline at end of file diff --git a/docs/src/SocialCards/index.cshtml b/docs/src/SocialCards/index.cshtml index 749052fd..15f66ab4 100644 --- a/docs/src/SocialCards/index.cshtml +++ b/docs/src/SocialCards/index.cshtml @@ -15,7 +15,7 @@
-
╭─ ~/spectre.console .NET 7.0  main
+
╭─ ~/spectre.console .NET 8.0  main
╰─ dotnet run
╭────────────────────────────────────────────────────────╮
diff --git a/dotnet-tools.json b/dotnet-tools.json index b0036d85..a7f9d036 100644 --- a/dotnet-tools.json +++ b/dotnet-tools.json @@ -13,6 +13,12 @@ "commands": [ "dotnet-example" ] + }, + "verify.tool": { + "version": "0.6.0", + "commands": [ + "dotnet-verify" + ] } } } \ No newline at end of file diff --git a/examples/Cli/Delegates/BarSettings.cs b/examples/Cli/Delegates/BarSettings.cs deleted file mode 100644 index 3c894843..00000000 --- a/examples/Cli/Delegates/BarSettings.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel; -using Spectre.Console.Cli; - -namespace Delegates; - -public static partial class Program -{ - public sealed class BarSettings : CommandSettings - { - [CommandOption("--count")] - [Description("The number of bars to print")] - [DefaultValue(3)] - public int Count { get; set; } - } -} diff --git a/examples/Cli/Delegates/Delegates.csproj b/examples/Cli/Delegates/Delegates.csproj deleted file mode 100644 index 233fbdff..00000000 --- a/examples/Cli/Delegates/Delegates.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - Exe - net8.0 - false - Delegates - Demonstrates how to specify commands as delegates. - Cli - false - - - - - - - diff --git a/examples/Cli/Delegates/Program.cs b/examples/Cli/Delegates/Program.cs deleted file mode 100644 index a91df345..00000000 --- a/examples/Cli/Delegates/Program.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Threading.Tasks; -using Spectre.Console; -using Spectre.Console.Cli; - -namespace Delegates; - -public static partial class Program -{ - public static int Main(string[] args) - { - var app = new CommandApp(); - app.Configure(config => - { - config.AddDelegate("foo", Foo) - .WithDescription("Foos the bars"); - - config.AddDelegate("bar", Bar) - .WithDescription("Bars the foos"); - - config.AddAsyncDelegate("fooAsync", FooAsync) - .WithDescription("Foos the bars asynchronously"); - - config.AddAsyncDelegate("barAsync", BarAsync) - .WithDescription("Bars the foos asynchronously"); - }); - - return app.Run(args); - } - - private static int Foo(CommandContext context) - { - AnsiConsole.WriteLine("Foo"); - return 0; - } - - private static int Bar(CommandContext context, BarSettings settings) - { - for (var index = 0; index < settings.Count; index++) - { - AnsiConsole.WriteLine("Bar"); - } - - return 0; - } - - private static Task FooAsync(CommandContext context) - { - AnsiConsole.WriteLine("Foo"); - return Task.FromResult(0); - } - - private static Task BarAsync(CommandContext context, BarSettings settings) - { - for (var index = 0; index < settings.Count; index++) - { - AnsiConsole.WriteLine("Bar"); - } - - return Task.FromResult(0); - } -} diff --git a/examples/Cli/Demo/Commands/Add/AddPackageCommand.cs b/examples/Cli/Demo/Commands/Add/AddPackageCommand.cs deleted file mode 100644 index 1166d08c..00000000 --- a/examples/Cli/Demo/Commands/Add/AddPackageCommand.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.ComponentModel; -using Demo.Utilities; -using Spectre.Console.Cli; - -namespace Demo.Commands.Add; - -[Description("Add a NuGet package reference to the project.")] -public sealed class AddPackageCommand : Command -{ - public sealed class Settings : AddSettings - { - [CommandArgument(0, "")] - [Description("The package reference to add.")] - public string PackageName { get; set; } - - [CommandOption("-v|--version ")] - [Description("The version of the package to add.")] - public string Version { get; set; } - - [CommandOption("-f|--framework ")] - [Description("Add the reference only when targeting a specific framework.")] - public string Framework { get; set; } - - [CommandOption("--no-restore")] - [Description("Add the reference without performing restore preview and compatibility check.")] - public bool NoRestore { get; set; } - - [CommandOption("--source ")] - [Description("The NuGet package source to use during the restore.")] - public string Source { get; set; } - - [CommandOption("--package-directory ")] - [Description("The directory to restore packages to.")] - public string PackageDirectory { get; set; } - - [CommandOption("--interactive")] - [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] - public bool Interactive { get; set; } - } - - public override int Execute(CommandContext context, Settings settings) - { - SettingsDumper.Dump(settings); - return 0; - } -} diff --git a/examples/Cli/Demo/Commands/Add/AddReferenceCommand.cs b/examples/Cli/Demo/Commands/Add/AddReferenceCommand.cs deleted file mode 100644 index 33e2b8a8..00000000 --- a/examples/Cli/Demo/Commands/Add/AddReferenceCommand.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.ComponentModel; -using Demo.Utilities; -using Spectre.Console.Cli; - -namespace Demo.Commands.Add; - -public sealed class AddReferenceCommand : Command -{ - public sealed class Settings : AddSettings - { - [CommandArgument(0, "")] - [Description("The package reference to add.")] - public string ProjectPath { get; set; } - - [CommandOption("-f|--framework ")] - [Description("Add the reference only when targeting a specific framework.")] - public string Framework { get; set; } - - [CommandOption("--interactive")] - [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] - public bool Interactive { get; set; } - } - - public override int Execute(CommandContext context, Settings settings) - { - SettingsDumper.Dump(settings); - return 0; - } -} diff --git a/examples/Cli/Demo/Commands/Add/AddSettings.cs b/examples/Cli/Demo/Commands/Add/AddSettings.cs deleted file mode 100644 index c8f02ec9..00000000 --- a/examples/Cli/Demo/Commands/Add/AddSettings.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel; -using Spectre.Console.Cli; - -namespace Demo.Commands.Add; - -public abstract class AddSettings : CommandSettings -{ - [CommandArgument(0, "")] - [Description("The project file to operate on. If a file is not specified, the command will search the current directory for one.")] - public string Project { get; set; } -} diff --git a/examples/Cli/Demo/Commands/Run/RunCommand.cs b/examples/Cli/Demo/Commands/Run/RunCommand.cs deleted file mode 100644 index a1aa675e..00000000 --- a/examples/Cli/Demo/Commands/Run/RunCommand.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.ComponentModel; -using Demo.Utilities; -using Spectre.Console.Cli; - -namespace Demo.Commands.Run; - -[Description("Build and run a .NET project output.")] -public sealed class RunCommand : Command -{ - public sealed class Settings : CommandSettings - { - [CommandOption("-c|--configuration ")] - [Description("The configuration to run for. The default for most projects is '[grey]Debug[/]'.")] - [DefaultValue("Debug")] - public string Configuration { get; set; } - - [CommandOption("-f|--framework ")] - [Description("The target framework to run for. The target framework must also be specified in the project file.")] - public string Framework { get; set; } - - [CommandOption("-r|--runtime ")] - [Description("The target runtime to run for.")] - public string RuntimeIdentifier { get; set; } - - [CommandOption("-p|--project ")] - [Description("The path to the project file to run (defaults to the current directory if there is only one project).")] - public string ProjectPath { get; set; } - - [CommandOption("--launch-profile ")] - [Description("The name of the launch profile (if any) to use when launching the application.")] - public string LaunchProfile { get; set; } - - [CommandOption("--no-launch-profile")] - [Description("Do not attempt to use [grey]launchSettings.json[/] to configure the application.")] - public bool NoLaunchProfile { get; set; } - - [CommandOption("--no-build")] - [Description("Do not build the project before running. Implies [grey]--no-restore[/].")] - public bool NoBuild { get; set; } - - [CommandOption("--interactive")] - [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] - public string Interactive { get; set; } - - [CommandOption("--no-restore")] - [Description("Do not restore the project before building.")] - public bool NoRestore { get; set; } - - [CommandOption("--verbosity ")] - [Description("Set the MSBuild verbosity level. Allowed values are q[grey]uiet[/], m[grey]inimal[/], n[grey]ormal[/], d[grey]etailed[/], and diag[grey]nostic[/].")] - [TypeConverter(typeof(VerbosityConverter))] - [DefaultValue(Verbosity.Normal)] - public Verbosity Verbosity { get; set; } - - [CommandOption("--no-dependencies")] - [Description("Do not restore project-to-project references and only restore the specified project.")] - public bool NoDependencies { get; set; } - - [CommandOption("--force")] - [Description("Force all dependencies to be resolved even if the last restore was successful. This is equivalent to deleting [grey]project.assets.json[/].")] - public bool Force { get; set; } - } - - public override int Execute(CommandContext context, Settings settings) - { - SettingsDumper.Dump(settings); - return 0; - } -} diff --git a/examples/Cli/Demo/Commands/Serve/ServeCommand.cs b/examples/Cli/Demo/Commands/Serve/ServeCommand.cs deleted file mode 100644 index 58d12710..00000000 --- a/examples/Cli/Demo/Commands/Serve/ServeCommand.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.ComponentModel; -using Demo.Utilities; -using Spectre.Console.Cli; - -namespace Demo.Commands.Serve; - -[Description("Launches a web server in the current working directory and serves all files in it.")] -public sealed class ServeCommand : Command -{ - public sealed class Settings : CommandSettings - { - [CommandOption("-p|--port ")] - [Description("Port to use. Defaults to [grey]8080[/]. Use [grey]0[/] for a dynamic port.")] - public int Port { get; set; } - - [CommandOption("-o|--open-browser [BROWSER]")] - [Description("Open a web browser when the server starts. You can also specify which browser to use. If none is specified, the default one will be used.")] - public FlagValue OpenBrowser { get; set; } - } - - public override int Execute(CommandContext context, Settings settings) - { - if (settings.OpenBrowser.IsSet) - { - var browser = settings.OpenBrowser.Value; - if (browser != null) - { - Console.WriteLine($"Open in {browser}"); - } - else - { - Console.WriteLine($"Open in default browser."); - } - } - - SettingsDumper.Dump(settings); - return 0; - } -} diff --git a/examples/Cli/Demo/Demo.csproj b/examples/Cli/Demo/Demo.csproj deleted file mode 100644 index 8e4f05c7..00000000 --- a/examples/Cli/Demo/Demo.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - Exe - net8.0 - false - Demo - Demonstrates the most common use cases of Spectre.Cli. - Cli - false - - - - - - - diff --git a/examples/Cli/Demo/Program.cs b/examples/Cli/Demo/Program.cs deleted file mode 100644 index f6c34032..00000000 --- a/examples/Cli/Demo/Program.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Demo.Commands; -using Demo.Commands.Add; -using Demo.Commands.Run; -using Demo.Commands.Serve; -using Spectre.Console.Cli; - -namespace Demo; - -public static class Program -{ - public static int Main(string[] args) - { - var app = new CommandApp(); - app.Configure(config => - { - config.SetApplicationName("fake-dotnet"); - config.ValidateExamples(); - config.AddExample("run", "--no-build"); - - // Run - config.AddCommand("run"); - - // Add - config.AddBranch("add", add => - { - add.SetDescription("Add a package or reference to a .NET project"); - add.AddCommand("package"); - add.AddCommand("reference"); - }); - - // Serve - config.AddCommand("serve") - .WithExample("serve", "-o", "firefox") - .WithExample("serve", "--port", "80", "-o", "firefox"); - }); - - return app.Run(args); - } -} diff --git a/examples/Cli/Demo/Utilities/SettingsDumper.cs b/examples/Cli/Demo/Utilities/SettingsDumper.cs deleted file mode 100644 index 4445927b..00000000 --- a/examples/Cli/Demo/Utilities/SettingsDumper.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Cli; - -namespace Demo.Utilities; - -public static class SettingsDumper -{ - public static void Dump(CommandSettings settings) - { - var table = new Table().RoundedBorder(); - table.AddColumn("[grey]Name[/]"); - table.AddColumn("[grey]Value[/]"); - - var properties = settings.GetType().GetProperties(); - foreach (var property in properties) - { - var value = property.GetValue(settings) - ?.ToString() - ?.Replace("[", "[["); - - table.AddRow( - property.Name, - value ?? "[grey]null[/]"); - } - - AnsiConsole.Write(table); - } -} diff --git a/examples/Cli/Demo/Verbosity.cs b/examples/Cli/Demo/Verbosity.cs deleted file mode 100644 index 84fc3b47..00000000 --- a/examples/Cli/Demo/Verbosity.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; - -namespace Demo; - -public enum Verbosity -{ - Quiet, - Minimal, - Normal, - Detailed, - Diagnostic -} - -public sealed class VerbosityConverter : TypeConverter -{ - private readonly Dictionary _lookup; - - public VerbosityConverter() - { - _lookup = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - { "q", Verbosity.Quiet }, - { "quiet", Verbosity.Quiet }, - { "m", Verbosity.Minimal }, - { "minimal", Verbosity.Minimal }, - { "n", Verbosity.Normal }, - { "normal", Verbosity.Normal }, - { "d", Verbosity.Detailed }, - { "detailed", Verbosity.Detailed }, - { "diag", Verbosity.Diagnostic }, - { "diagnostic", Verbosity.Diagnostic } - }; - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - if (value is string stringValue) - { - var result = _lookup.TryGetValue(stringValue, out var verbosity); - if (!result) - { - const string format = "The value '{0}' is not a valid verbosity."; - var message = string.Format(CultureInfo.InvariantCulture, format, value); - throw new InvalidOperationException(message); - } - return verbosity; - } - throw new NotSupportedException("Can't convert value to verbosity."); - } -} diff --git a/examples/Cli/Dynamic/Dynamic.csproj b/examples/Cli/Dynamic/Dynamic.csproj deleted file mode 100644 index 739192f2..00000000 --- a/examples/Cli/Dynamic/Dynamic.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - Exe - net8.0 - false - Dynamic - Demonstrates how to define dynamic commands. - Cli - false - - - - - - - diff --git a/examples/Cli/Dynamic/MyCommand.cs b/examples/Cli/Dynamic/MyCommand.cs deleted file mode 100644 index 60128cbb..00000000 --- a/examples/Cli/Dynamic/MyCommand.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Spectre.Console; -using Spectre.Console.Cli; - -namespace Dynamic; - -public sealed class MyCommand : Command -{ - public override int Execute(CommandContext context) - { - if (!(context.Data is int data)) - { - throw new InvalidOperationException("Command has no associated data."); - - } - - AnsiConsole.WriteLine("Value = {0}", data); - return 0; - } -} diff --git a/examples/Cli/Dynamic/Program.cs b/examples/Cli/Dynamic/Program.cs deleted file mode 100644 index 9dc916f0..00000000 --- a/examples/Cli/Dynamic/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Linq; -using Spectre.Console.Cli; - -namespace Dynamic; - -public static class Program -{ - public static int Main(string[] args) - { - var app = new CommandApp(); - app.Configure(config => - { - foreach (var index in Enumerable.Range(1, 10)) - { - config.AddCommand($"c{index}") - .WithDescription($"Prints the number {index}") - .WithData(index); - } - }); - - return app.Run(args); - } -} diff --git a/examples/Cli/Help/CustomHelpProvider.cs b/examples/Cli/Help/CustomHelpProvider.cs deleted file mode 100644 index fd9c01fb..00000000 --- a/examples/Cli/Help/CustomHelpProvider.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Linq; -using Spectre.Console; -using Spectre.Console.Cli; -using Spectre.Console.Cli.Help; -using Spectre.Console.Rendering; - -namespace Help; - -/// -/// Example showing how to extend the built-in Spectre.Console help provider -/// by rendering a custom banner at the top of the help information -/// -internal class CustomHelpProvider : HelpProvider -{ - public CustomHelpProvider(ICommandAppSettings settings) - : base(settings) - { - } - - public override IEnumerable GetHeader(ICommandModel model, ICommandInfo? command) - { - return new[] - { - new Text("--------------------------------------"), Text.NewLine, - new Text("--- CUSTOM HELP PROVIDER ---"), Text.NewLine, - new Text("--------------------------------------"), Text.NewLine, - Text.NewLine, - }; - } -} \ No newline at end of file diff --git a/examples/Cli/Help/DefaultCommand.cs b/examples/Cli/Help/DefaultCommand.cs deleted file mode 100644 index 71613d0a..00000000 --- a/examples/Cli/Help/DefaultCommand.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Cli; - -namespace Help; - -public sealed class DefaultCommand : Command -{ - private IAnsiConsole _console; - - public DefaultCommand(IAnsiConsole console) - { - _console = console; - } - - public override int Execute(CommandContext context) - { - _console.WriteLine("Hello world"); - return 0; - } -} \ No newline at end of file diff --git a/examples/Cli/Help/Help.csproj b/examples/Cli/Help/Help.csproj deleted file mode 100644 index d93c525d..00000000 --- a/examples/Cli/Help/Help.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - Exe - net8.0 - enable - enable - Help - Demonstrates how to extend the built-in Spectre.Console help provider to render a custom banner at the top of the help information. - Cli - false - - - - - - - diff --git a/examples/Cli/Help/Program.cs b/examples/Cli/Help/Program.cs deleted file mode 100644 index aba42b03..00000000 --- a/examples/Cli/Help/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Spectre.Console.Cli; -using Spectre.Console.Cli.Help; - -namespace Help; - -public static class Program -{ - public static int Main(string[] args) - { - var app = new CommandApp(); - - app.Configure(config => - { - // Register the custom help provider - config.SetHelpProvider(new CustomHelpProvider(config.Settings)); - - // Render an unstyled help text for maximum accessibility - config.Settings.HelpProviderStyles = null; - }); - - return app.Run(args); - } -} diff --git a/examples/Cli/Injection/Commands/DefaultCommand.cs b/examples/Cli/Injection/Commands/DefaultCommand.cs deleted file mode 100644 index b31cc8a2..00000000 --- a/examples/Cli/Injection/Commands/DefaultCommand.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.ComponentModel; -using Spectre.Console.Cli; - -namespace Injection.Commands; - -public sealed class DefaultCommand : Command -{ - private readonly IGreeter _greeter; - - public sealed class Settings : CommandSettings - { - [CommandOption("-n|--name ")] - [Description("The person or thing to greet.")] - [DefaultValue("World")] - public string Name { get; set; } - } - - public DefaultCommand(IGreeter greeter) - { - _greeter = greeter ?? throw new ArgumentNullException(nameof(greeter)); - } - - public override int Execute(CommandContext context, Settings settings) - { - _greeter.Greet(settings.Name); - return 0; - } -} diff --git a/examples/Cli/Injection/IGreeter.cs b/examples/Cli/Injection/IGreeter.cs deleted file mode 100644 index 1ff49fb7..00000000 --- a/examples/Cli/Injection/IGreeter.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Spectre.Console; - -namespace Injection; - -public interface IGreeter -{ - void Greet(string name); -} - -public sealed class HelloWorldGreeter : IGreeter -{ - public void Greet(string name) - { - AnsiConsole.WriteLine($"Hello {name}!"); - } -} diff --git a/examples/Cli/Injection/Infrastructure/TypeRegistrar.cs b/examples/Cli/Injection/Infrastructure/TypeRegistrar.cs deleted file mode 100644 index 6651e679..00000000 --- a/examples/Cli/Injection/Infrastructure/TypeRegistrar.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Spectre.Console.Cli; - -namespace Injection.Infrastructure; - -public sealed class TypeRegistrar : ITypeRegistrar -{ - private readonly IServiceCollection _builder; - - public TypeRegistrar(IServiceCollection builder) - { - _builder = builder; - } - - public ITypeResolver Build() - { - return new TypeResolver(_builder.BuildServiceProvider()); - } - - public void Register(Type service, Type implementation) - { - _builder.AddSingleton(service, implementation); - } - - public void RegisterInstance(Type service, object implementation) - { - _builder.AddSingleton(service, implementation); - } - - public void RegisterLazy(Type service, Func func) - { - if (func is null) - { - throw new ArgumentNullException(nameof(func)); - } - - _builder.AddSingleton(service, (provider) => func()); - } -} diff --git a/examples/Cli/Injection/Infrastructure/TypeResolver.cs b/examples/Cli/Injection/Infrastructure/TypeResolver.cs deleted file mode 100644 index f3cf618d..00000000 --- a/examples/Cli/Injection/Infrastructure/TypeResolver.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using Spectre.Console.Cli; - -namespace Injection.Infrastructure; - -public sealed class TypeResolver : ITypeResolver, IDisposable -{ - private readonly IServiceProvider _provider; - - public TypeResolver(IServiceProvider provider) - { - _provider = provider ?? throw new ArgumentNullException(nameof(provider)); - } - - public object Resolve(Type type) - { - if (type == null) - { - return null; - } - - return _provider.GetService(type); - } - - public void Dispose() - { - if (_provider is IDisposable disposable) - { - disposable.Dispose(); - } - } -} diff --git a/examples/Cli/Injection/Injection.csproj b/examples/Cli/Injection/Injection.csproj deleted file mode 100644 index a07bc9fe..00000000 --- a/examples/Cli/Injection/Injection.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - Exe - net8.0 - false - Injection - Demonstrates how to use dependency injection with Spectre.Cli. - Cli - false - - - - - - - - - - - diff --git a/examples/Cli/Injection/Program.cs b/examples/Cli/Injection/Program.cs deleted file mode 100644 index 813560db..00000000 --- a/examples/Cli/Injection/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Injection.Commands; -using Injection.Infrastructure; -using Microsoft.Extensions.DependencyInjection; -using Spectre.Console.Cli; - -namespace Injection; - -public class Program -{ - public static int Main(string[] args) - { - // Create a type registrar and register any dependencies. - // A type registrar is an adapter for a DI framework. - var registrations = new ServiceCollection(); - registrations.AddSingleton(); - var registrar = new TypeRegistrar(registrations); - - // Create a new command app with the registrar - // and run it with the provided arguments. - var app = new CommandApp(registrar); - return app.Run(args); - } -} diff --git a/examples/Cli/Logging/Commands/HelloCommand.cs b/examples/Cli/Logging/Commands/HelloCommand.cs deleted file mode 100644 index 21e82444..00000000 --- a/examples/Cli/Logging/Commands/HelloCommand.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.Extensions.Logging; -using Spectre.Console; -using Spectre.Console.Cli; - -namespace Logging.Commands; - -public class HelloCommand : Command -{ - private ILogger _logger; - private IAnsiConsole _console; - - public HelloCommand(IAnsiConsole console, ILogger logger) - { - _console = console; - _logger = logger; - _logger.LogDebug("{0} initialized", nameof(HelloCommand)); - } - - public class Settings : LogCommandSettings - { - [CommandArgument(0, "[Name]")] - public string Name { get; set; } - } - - - public override int Execute(CommandContext context, Settings settings) - { - _logger.LogInformation("Starting my command"); - AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]"); - _logger.LogInformation("Completed my command"); - - return 0; - } -} diff --git a/examples/Cli/Logging/Commands/LogCommandSettings.cs b/examples/Cli/Logging/Commands/LogCommandSettings.cs deleted file mode 100644 index 890953de..00000000 --- a/examples/Cli/Logging/Commands/LogCommandSettings.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using Serilog.Events; -using Spectre.Console.Cli; - -namespace Logging.Commands; - -public class LogCommandSettings : CommandSettings -{ - [CommandOption("--logFile")] - [Description("Path and file name for logging")] - public string LogFile { get; set; } - - [CommandOption("--logLevel")] - [Description("Minimum level for logging")] - [TypeConverter(typeof(VerbosityConverter))] - [DefaultValue(LogEventLevel.Information)] - public LogEventLevel LogLevel { get; set; } -} - -public sealed class VerbosityConverter : TypeConverter -{ - private readonly Dictionary _lookup; - - public VerbosityConverter() - { - _lookup = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - {"d", LogEventLevel.Debug}, - {"v", LogEventLevel.Verbose}, - {"i", LogEventLevel.Information}, - {"w", LogEventLevel.Warning}, - {"e", LogEventLevel.Error}, - {"f", LogEventLevel.Fatal} - }; - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - if (value is string stringValue) - { - var result = _lookup.TryGetValue(stringValue, out var verbosity); - if (!result) - { - const string format = "The value '{0}' is not a valid verbosity."; - var message = string.Format(CultureInfo.InvariantCulture, format, value); - throw new InvalidOperationException(message); - } - return verbosity; - } - throw new NotSupportedException("Can't convert value to verbosity."); - } -} diff --git a/examples/Cli/Logging/Infrastructure/LogInterceptor.cs b/examples/Cli/Logging/Infrastructure/LogInterceptor.cs deleted file mode 100644 index 54e2653c..00000000 --- a/examples/Cli/Logging/Infrastructure/LogInterceptor.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Logging.Commands; -using Serilog.Core; -using Spectre.Console.Cli; - -namespace Logging.Infrastructure; - -public class LogInterceptor : ICommandInterceptor -{ - public static readonly LoggingLevelSwitch LogLevel = new(); - - public void Intercept(CommandContext context, CommandSettings settings) - { - if (settings is LogCommandSettings logSettings) - { - LoggingEnricher.Path = logSettings.LogFile ?? "application.log"; - LogLevel.MinimumLevel = logSettings.LogLevel; - } - } -} diff --git a/examples/Cli/Logging/Infrastructure/LoggingEnricher.cs b/examples/Cli/Logging/Infrastructure/LoggingEnricher.cs deleted file mode 100644 index 266260dd..00000000 --- a/examples/Cli/Logging/Infrastructure/LoggingEnricher.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Serilog.Core; -using Serilog.Events; - -namespace Logging.Infrastructure; - -internal class LoggingEnricher : ILogEventEnricher -{ - private string _cachedLogFilePath; - private LogEventProperty _cachedLogFilePathProperty; - - // this path and level will be set by the LogInterceptor.cs after parsing the settings - public static string Path = string.Empty; - - public const string LogFilePathPropertyName = "LogFilePath"; - - public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) - { - // the settings might not have a path or we might not be within a command in which case - // we won't have the setting so a default value for the log file will be required - LogEventProperty logFilePathProperty; - - if (_cachedLogFilePathProperty != null && Path.Equals(_cachedLogFilePath)) - { - // Path hasn't changed, so let's use the cached property - logFilePathProperty = _cachedLogFilePathProperty; - } - else - { - // We've got a new path for the log. Let's create a new property - // and cache it for future log events to use - _cachedLogFilePath = Path; - _cachedLogFilePathProperty = logFilePathProperty = propertyFactory.CreateProperty(LogFilePathPropertyName, Path); - } - - logEvent.AddPropertyIfAbsent(logFilePathProperty); - } -} diff --git a/examples/Cli/Logging/Infrastructure/TypeRegistrar.cs b/examples/Cli/Logging/Infrastructure/TypeRegistrar.cs deleted file mode 100644 index f1169fc3..00000000 --- a/examples/Cli/Logging/Infrastructure/TypeRegistrar.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Spectre.Console.Cli; - -namespace Logging.Infrastructure; - -public sealed class TypeRegistrar : ITypeRegistrar -{ - private readonly IServiceCollection _builder; - - public TypeRegistrar(IServiceCollection builder) - { - _builder = builder; - } - - public ITypeResolver Build() - { - return new TypeResolver(_builder.BuildServiceProvider()); - } - - public void Register(Type service, Type implementation) - { - _builder.AddSingleton(service, implementation); - } - - public void RegisterInstance(Type service, object implementation) - { - _builder.AddSingleton(service, implementation); - } - - public void RegisterLazy(Type service, Func func) - { - if (func is null) - { - throw new ArgumentNullException(nameof(func)); - } - - _builder.AddSingleton(service, _ => func()); - } -} diff --git a/examples/Cli/Logging/Infrastructure/TypeResolver.cs b/examples/Cli/Logging/Infrastructure/TypeResolver.cs deleted file mode 100644 index bd2b5f7d..00000000 --- a/examples/Cli/Logging/Infrastructure/TypeResolver.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using Spectre.Console.Cli; - -namespace Logging.Infrastructure; - -public sealed class TypeResolver : ITypeResolver -{ - private readonly IServiceProvider _provider; - - public TypeResolver(IServiceProvider provider) - { - _provider = provider ?? throw new ArgumentNullException(nameof(provider)); - } - - public object Resolve(Type type) - { - if (type == null) - { - return null; - } - - return _provider.GetService(type); - } -} diff --git a/examples/Cli/Logging/Logging.csproj b/examples/Cli/Logging/Logging.csproj deleted file mode 100644 index 72fe265d..00000000 --- a/examples/Cli/Logging/Logging.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - Exe - net8.0 - false - Logging - Demonstrates how to dynamically configure Serilog for logging using parameters from a command. - Cli - false - disable - - - - - - - - - - - - - - - diff --git a/examples/Cli/Logging/Program.cs b/examples/Cli/Logging/Program.cs deleted file mode 100644 index bfab659d..00000000 --- a/examples/Cli/Logging/Program.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Logging.Commands; -using Logging.Infrastructure; -using Microsoft.Extensions.DependencyInjection; -using Serilog; -using Spectre.Console.Cli; - -/* - * Dynamically control serilog configuration via command line parameters - * - * This works around the chicken and egg situation with configuring serilog via the command line. - * The logger needs to be configured prior to executing the parser, but the logger needs the parsed values - * to be configured. By using serilog.sinks.map we can defer configuration. We use a LogLevelSwitch to control the - * logging levels dynamically, and then we use a serilog enricher that has its state populated via a - * Spectre.Console CommandInterceptor - */ - -namespace Logging; - -public class Program -{ - static int Main(string[] args) - { - // to retrieve the log file name, we must first parse the command settings - // this will require us to delay setting the file path for the file writer. - // With serilog we can use an enricher and Serilog.Sinks.Map to dynamically - // pull this setting. - var serviceCollection = new ServiceCollection() - .AddLogging(configure => - configure.AddSerilog(new LoggerConfiguration() - // log level will be dynamically be controlled by our log interceptor upon running - .MinimumLevel.ControlledBy(LogInterceptor.LogLevel) - // the log enricher will add a new property with the log file path from the settings - // that we can use to set the path dynamically - .Enrich.With() - // serilog.sinks.map will defer the configuration of the sink to be ondemand - // allowing us to look at the properties set by the enricher to set the path appropriately - .WriteTo.Map(LoggingEnricher.LogFilePathPropertyName, - (logFilePath, wt) => wt.File($"{logFilePath}"), 1) - .CreateLogger() - ) - ); - - var registrar = new TypeRegistrar(serviceCollection); - var app = new CommandApp(registrar); - - app.Configure(config => - { - config.SetInterceptor(new LogInterceptor()); // add the interceptor - config.AddCommand("hello"); - }); - - return app.Run(args); - } -} diff --git a/examples/Console/AlternateScreen/AlternateScreen.csproj b/examples/Console/AlternateScreen/AlternateScreen.csproj deleted file mode 100644 index e048827b..00000000 --- a/examples/Console/AlternateScreen/AlternateScreen.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Screens - Demonstrates how to use alternate screens. - Widgets - - - - - - - diff --git a/examples/Console/AlternateScreen/Program.cs b/examples/Console/AlternateScreen/Program.cs deleted file mode 100644 index 4415ab0d..00000000 --- a/examples/Console/AlternateScreen/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Check if we can use alternate screen buffers -using Spectre.Console; - -if (!AnsiConsole.Profile.Capabilities.AlternateBuffer) -{ - AnsiConsole.MarkupLine( - "[red]Alternate screen buffers are not supported " + - "by your terminal[/] [yellow]:([/]"); - - return; -} - -// Write to the terminal -AnsiConsole.Write(new Rule("[yellow]Normal universe[/]")); -AnsiConsole.Write(new Panel("Hello World!")); -AnsiConsole.MarkupLine("[grey]Press a key to continue[/]"); -AnsiConsole.Console.Input.ReadKey(true); - -AnsiConsole.AlternateScreen(() => -{ - // Now we're in another terminal screen buffer - AnsiConsole.Write(new Rule("[red]Mirror universe[/]")); - AnsiConsole.Write(new Panel("[red]Welcome to the upside down![/]")); - AnsiConsole.MarkupLine("[grey]Press a key to return[/]"); - AnsiConsole.Console.Input.ReadKey(true); -}); \ No newline at end of file diff --git a/examples/Console/Borders/Borders.csproj b/examples/Console/Borders/Borders.csproj deleted file mode 100644 index 40307152..00000000 --- a/examples/Console/Borders/Borders.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Borders - Demonstrates the different kind of borders. - Widgets - - - - - - - diff --git a/examples/Console/Borders/Program.cs b/examples/Console/Borders/Program.cs deleted file mode 100644 index 2b755ae8..00000000 --- a/examples/Console/Borders/Program.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Rendering; - -namespace Borders; - -public static class Program -{ - public static void Main() - { - // Render panel borders - HorizontalRule("PANEL BORDERS"); - PanelBorders(); - - // Render table borders - HorizontalRule("TABLE BORDERS"); - TableBorders(); - } - - private static void PanelBorders() - { - static IRenderable CreatePanel(string name, BoxBorder border) - { - return - new Panel($"This is a panel with\nthe [yellow]{name}[/] border.") - .Header($" [blue]{name}[/] ", Justify.Center) - .Border(border) - .BorderStyle(Style.Parse("grey")); - } - - var items = new[] - { - CreatePanel("Ascii", BoxBorder.Ascii), - CreatePanel("Square", BoxBorder.Square), - CreatePanel("Rounded", BoxBorder.Rounded), - CreatePanel("Heavy", BoxBorder.Heavy), - CreatePanel("Double", BoxBorder.Double), - CreatePanel("None", BoxBorder.None), - }; - - AnsiConsole.Write( - new Padder( - new Columns(items).PadRight(2), - new Padding(2, 0, 0, 0))); - } - - private static void TableBorders() - { - static IRenderable CreateTable(string name, TableBorder border) - { - var table = new Table().Border(border); - table.ShowRowSeparators(); - table.AddColumn("[yellow]Header 1[/]", c => c.Footer("[grey]Footer 1[/]")); - table.AddColumn("[yellow]Header 2[/]", col => col.Footer("[grey]Footer 2[/]").RightAligned()); - table.AddRow("Cell", "Cell"); - table.AddRow("Cell", "Cell"); - - return new Panel(table) - .Header($" [blue]{name}[/] ", Justify.Center) - .PadBottom(1) - .NoBorder(); - } - - var items = new[] - { - CreateTable("Ascii", TableBorder.Ascii), CreateTable("Ascii2", TableBorder.Ascii2), - CreateTable("AsciiDoubleHead", TableBorder.AsciiDoubleHead), - CreateTable("Horizontal", TableBorder.Horizontal), CreateTable("Simple", TableBorder.Simple), - CreateTable("SimpleHeavy", TableBorder.SimpleHeavy), CreateTable("Minimal", TableBorder.Minimal), - CreateTable("MinimalHeavyHead", TableBorder.MinimalHeavyHead), - CreateTable("MinimalDoubleHead", TableBorder.MinimalDoubleHead), - CreateTable("Square", TableBorder.Square), CreateTable("Rounded", TableBorder.Rounded), - CreateTable("Heavy", TableBorder.Heavy), CreateTable("HeavyEdge", TableBorder.HeavyEdge), - CreateTable("HeavyHead", TableBorder.HeavyHead), CreateTable("Double", TableBorder.Double), - CreateTable("DoubleEdge", TableBorder.DoubleEdge), CreateTable("Markdown", TableBorder.Markdown), - }; - - AnsiConsole.Write(new Columns(items).Collapse()); - } - - private static void HorizontalRule(string title) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule($"[white bold]{title}[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.WriteLine(); - } -} \ No newline at end of file diff --git a/examples/Console/Calendars/Calendars.csproj b/examples/Console/Calendars/Calendars.csproj deleted file mode 100644 index c888117e..00000000 --- a/examples/Console/Calendars/Calendars.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Calendars - Demonstrates how to render calendars. - Widgets - - - - - - - diff --git a/examples/Console/Calendars/Program.cs b/examples/Console/Calendars/Program.cs deleted file mode 100644 index d2701158..00000000 --- a/examples/Console/Calendars/Program.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Spectre.Console; - -namespace Calendars; - -public static class Program -{ - public static void Main(string[] args) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Calendar(2020, 10) - .RoundedBorder() - .HighlightStyle(Style.Parse("red")) - .HeaderStyle(Style.Parse("yellow")) - .AddCalendarEvent("An event", 2020, 9, 22) - .AddCalendarEvent("Another event", 2020, 10, 2) - .AddCalendarEvent("A third event", 2020, 10, 13)); - } -} diff --git a/examples/Console/Canvas/Canvas.csproj b/examples/Console/Canvas/Canvas.csproj deleted file mode 100644 index ddd0d8a8..00000000 --- a/examples/Console/Canvas/Canvas.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - Exe - net8.0 - Canvas - Demonstrates how to render pixels and images. - Widgets - - - - - - - - - - PreserveNewest - - - - diff --git a/examples/Console/Canvas/Program.cs b/examples/Console/Canvas/Program.cs deleted file mode 100644 index 3e537ddf..00000000 --- a/examples/Console/Canvas/Program.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Diagnostics; -using System.Reflection; -using SixLabors.ImageSharp.Processing; -using Spectre.Console; -using Spectre.Console.Rendering; - -namespace Canvas; - -public static class Program -{ - public static void Main() - { - // Draw an image using CanvasImage powered by ImageSharp. - // This requires the "Spectre.Console.ImageSharp" NuGet package. - var image = new CanvasImage("cake.png"); - image.BilinearResampler(); - image.MaxWidth(16); - Render(image, "Image from file (16 wide)"); - - // Draw image again, but without max width - image.NoMaxWidth(); - image.Mutate(ctx => ctx.Grayscale().Rotate(-45).EntropyCrop()); - Render(image, "Image from file (fit, greyscale, rotated)"); - - // Draw image again, but load from embedded resource rather than file - using (var fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Canvas.cake.png")) - { - Debug.Assert(fileStream != null); - var embeddedImage = new CanvasImage(fileStream); - embeddedImage.BilinearResampler(); - embeddedImage.MaxWidth(16); - Render(embeddedImage, "Image from embedded resource (16 wide)"); - } - } - - private static void Render(IRenderable canvas, string title) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule($"[yellow]{title}[/]").LeftJustified().RuleStyle("grey")); - AnsiConsole.WriteLine(); - AnsiConsole.Write(canvas); - } -} diff --git a/examples/Console/Canvas/cake.png b/examples/Console/Canvas/cake.png deleted file mode 100644 index f11d285c..00000000 Binary files a/examples/Console/Canvas/cake.png and /dev/null differ diff --git a/examples/Console/Charts/Charts.csproj b/examples/Console/Charts/Charts.csproj deleted file mode 100644 index f08d5b95..00000000 --- a/examples/Console/Charts/Charts.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Charts - Demonstrates how to render charts in a console. - Widgets - - - - - - - diff --git a/examples/Console/Charts/Program.cs b/examples/Console/Charts/Program.cs deleted file mode 100644 index 5aadfa8a..00000000 --- a/examples/Console/Charts/Program.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Rendering; - -namespace Charts; - -public static class Program -{ - public static void Main() - { - // Render a bar chart - AnsiConsole.WriteLine(); - Render("Fruits per month", new BarChart() - .Width(60) - .Label("[green bold underline]Number of fruits[/]") - .CenterLabel() - .AddItem("Apple", 12, Color.Yellow) - .AddItem("Orange", 54, Color.Green) - .AddItem("Banana", 33, Color.Red)); - - // Render a breakdown chart - AnsiConsole.WriteLine(); - Render("Languages used", new BreakdownChart() - .FullSize() - .Width(60) - .ShowPercentage() - .WithValueColor(Color.Orange1) - .AddItem("SCSS", 37, Color.Red) - .AddItem("HTML", 28.3, Color.Blue) - .AddItem("C#", 22.6, Color.Green) - .AddItem("JavaScript", 6, Color.Yellow) - .AddItem("Ruby", 6, Color.LightGreen) - .AddItem("Shell", 0.1, Color.Aqua)); - } - - private static void Render(string title, IRenderable chart) - { - AnsiConsole.Write( - new Panel(chart) - .Padding(1, 1) - .Header(title)); - } -} diff --git a/examples/Console/Colors/Colors.csproj b/examples/Console/Colors/Colors.csproj deleted file mode 100644 index 0258570a..00000000 --- a/examples/Console/Colors/Colors.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Colors - Demonstrates how to use [yellow]c[/][red]o[/][green]l[/][blue]o[/][aqua]r[/][lime]s[/] in the console. - Misc - - - - - - - diff --git a/examples/Console/Colors/Program.cs b/examples/Console/Colors/Program.cs deleted file mode 100644 index 946cb3de..00000000 --- a/examples/Console/Colors/Program.cs +++ /dev/null @@ -1,105 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Examples; - -namespace Colors; - -public static class Program -{ - public static void Main() - { - ///////////////////////////////////////////////////////////////// - // No colors - ///////////////////////////////////////////////////////////////// - if (AnsiConsole.Profile.Capabilities.ColorSystem == ColorSystem.NoColors) - { - AnsiConsole.WriteLine("No colors are supported."); - return; - } - - ///////////////////////////////////////////////////////////////// - // 3-BIT - ///////////////////////////////////////////////////////////////// - if (AnsiConsole.Profile.Supports(ColorSystem.Legacy)) - { - AnsiConsole.ResetColors(); - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("[yellow bold underline]3-bit Colors[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.WriteLine(); - - for (var i = 0; i < 8; i++) - { - AnsiConsole.Background = Color.FromInt32(i); - AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor(); - AnsiConsole.Write(string.Format(" {0,-9}", AnsiConsole.Background.ToString())); - AnsiConsole.ResetColors(); - if ((i + 1) % 8 == 0) - { - AnsiConsole.WriteLine(); - } - } - } - - ///////////////////////////////////////////////////////////////// - // 4-BIT - ///////////////////////////////////////////////////////////////// - if (AnsiConsole.Profile.Supports(ColorSystem.Standard)) - { - AnsiConsole.ResetColors(); - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("[yellow bold underline]4-bit Colors[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.WriteLine(); - - for (var i = 0; i < 16; i++) - { - AnsiConsole.Background = Color.FromInt32(i); - AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor(); - AnsiConsole.Write(string.Format(" {0,-9}", AnsiConsole.Background.ToString())); - AnsiConsole.ResetColors(); - if ((i + 1) % 8 == 0) - { - AnsiConsole.WriteLine(); - } - } - } - - ///////////////////////////////////////////////////////////////// - // 8-BIT - ///////////////////////////////////////////////////////////////// - if (AnsiConsole.Profile.Supports(ColorSystem.EightBit)) - { - AnsiConsole.ResetColors(); - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("[yellow bold underline]8-bit Colors[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.WriteLine(); - - for (var i = 0; i < 16; i++) - { - for (var j = 0; j < 16; j++) - { - var number = i * 16 + j; - AnsiConsole.Background = Color.FromInt32(number); - AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor(); - AnsiConsole.Write(string.Format(" {0,-4}", number)); - AnsiConsole.ResetColors(); - if ((number + 1) % 16 == 0) - { - AnsiConsole.WriteLine(); - } - } - } - } - - ///////////////////////////////////////////////////////////////// - // 24-BIT - ///////////////////////////////////////////////////////////////// - if (AnsiConsole.Profile.Supports(ColorSystem.TrueColor)) - { - AnsiConsole.ResetColors(); - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("[yellow bold underline]24-bit Colors[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.WriteLine(); - - AnsiConsole.Write(new ColorBox(width: 80, height: 15)); - } - } -} diff --git a/examples/Console/Columns/Columns.csproj b/examples/Console/Columns/Columns.csproj deleted file mode 100644 index 471c83b2..00000000 --- a/examples/Console/Columns/Columns.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Exe - net8.0 - Columns - Demonstrates how to render data into columns. - Widgets - - - - - - - - - - - diff --git a/examples/Console/Columns/Program.cs b/examples/Console/Columns/Program.cs deleted file mode 100644 index 3a93ef45..00000000 --- a/examples/Console/Columns/Program.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; -using Spectre.Console; - -namespace Columns; - -public static class Program -{ - public static void Main() - { - var cards = new List(); - foreach (var user in User.LoadUsers()) - { - cards.Add( - new Panel(GetCardContent(user)) - .Header($"{user.Country}") - .RoundedBorder().Expand()); - } - - // Render all cards in columns - AnsiConsole.Write(new Spectre.Console.Columns(cards)); - } - - private static string GetCardContent(User user) - { - var name = $"{user.FirstName} {user.LastName}"; - var city = $"{user.City}"; - - return $"[b]{name}[/]\n[yellow]{city}[/]"; - } -} diff --git a/examples/Console/Columns/User.cs b/examples/Console/Columns/User.cs deleted file mode 100644 index f2e76810..00000000 --- a/examples/Console/Columns/User.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Collections.Generic; - -namespace Columns; - -public sealed class User -{ - public string FirstName { get; set; } - public string LastName { get; set; } - public string City { get; set; } - public string Country { get; set; } - - public static List LoadUsers() - { - return new List - { - new User - { - FirstName = "Andrea", - LastName = "Johansen", - City = "Hornbæk", - Country = "Denmark", - }, - new User - { - FirstName = "Phil", - LastName = "Scott", - City = "Dayton", - Country = "United States", - }, - new User - { - FirstName = "Patrik", - LastName = "Svensson", - City = "Stockholm", - Country = "Sweden", - }, - new User - { - FirstName = "Freya", - LastName = "Thompson", - City = "Rotorua", - Country = "New Zealand", - }, - new User - { - FirstName = "طاها", - LastName = "رضایی", - City = "اهواز", - Country = "Iran", - }, - new User - { - FirstName = "Yara", - LastName = "Simon", - City = "Develier", - Country = "Switzerland", - }, - new User - { - FirstName = "Giray", - LastName = "Erbay", - City = "Karabük", - Country = "Turkey", - }, - new User - { - FirstName = "Miodrag", - LastName = "Schaffer", - City = "Möckern", - Country = "Germany", - }, - new User - { - FirstName = "Carmela", - LastName = "Lo Castro", - City = "Firenze", - Country = "Italy", - }, - new User - { - FirstName = "Roberto", - LastName = "Sims", - City = "Mallow", - Country = "Ireland", - }, - }; - } -} diff --git a/examples/Console/Cursor/Cursor.csproj b/examples/Console/Cursor/Cursor.csproj deleted file mode 100644 index 0f3a3ea6..00000000 --- a/examples/Console/Cursor/Cursor.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Cursor - Demonstrates how to move the cursor. - Misc - - - - - - - diff --git a/examples/Console/Cursor/Program.cs b/examples/Console/Cursor/Program.cs deleted file mode 100644 index 3ea7785a..00000000 --- a/examples/Console/Cursor/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Spectre.Console; - -namespace Cursor; - -public static class Program -{ - public static void Main(string[] args) - { - AnsiConsole.Write("Hello"); - - // Move the cursor 3 cells to the right - AnsiConsole.Cursor.Move(CursorDirection.Right, 3); - AnsiConsole.Write("World"); - - // Move the cursor 5 cells to the left. - AnsiConsole.Cursor.Move(CursorDirection.Left, 5); - AnsiConsole.WriteLine("Universe"); - } -} diff --git a/examples/Console/Decorations/Decorations.csproj b/examples/Console/Decorations/Decorations.csproj deleted file mode 100644 index 8541965c..00000000 --- a/examples/Console/Decorations/Decorations.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Decorations - Demonstrates how to [italic]use[/] [bold]decorations[/] [dim]in[/] the console. - Misc - - - - - - - diff --git a/examples/Console/Decorations/Program.cs b/examples/Console/Decorations/Program.cs deleted file mode 100644 index e689df51..00000000 --- a/examples/Console/Decorations/Program.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Spectre.Console; - -namespace Colors; - -public static class Program -{ - public static void Main() - { - AnsiConsole.ResetDecoration(); - AnsiConsole.WriteLine(); - - if (AnsiConsole.Profile.Capabilities.Ansi) - { - AnsiConsole.Write(new Rule("[bold green]ANSI Decorations[/]")); - } - else - { - AnsiConsole.Write(new Rule("[bold red]Legacy Decorations (unsupported)[/]")); - } - - var decorations = System.Enum.GetValues(typeof(Decoration)); - foreach (var decoration in decorations) - { - var name = System.Enum.GetName(typeof(Decoration),decoration); - AnsiConsole.Write(name + ": "); - AnsiConsole.Write(new Markup(name+"\n", new Style(decoration: (Decoration)decoration))); - } - } -} diff --git a/examples/Console/Emojis/Emojis.csproj b/examples/Console/Emojis/Emojis.csproj deleted file mode 100644 index f4def1bb..00000000 --- a/examples/Console/Emojis/Emojis.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Emojis - Demonstrates how to render emojis. - Misc - - - - - - - diff --git a/examples/Console/Emojis/Program.cs b/examples/Console/Emojis/Program.cs deleted file mode 100644 index 3fe6e0fb..00000000 --- a/examples/Console/Emojis/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Spectre.Console; - -namespace Emojis; - -public static class Program -{ - public static void Main(string[] args) - { - // Show a known emoji - RenderEmoji(); - - // Show a remapped emoji - Emoji.Remap("globe_showing_europe_africa", Emoji.Known.GrinningFaceWithSmilingEyes); - RenderEmoji(); - } - - private static void RenderEmoji() - { - AnsiConsole.Write( - new Panel("[yellow]Hello :globe_showing_europe_africa:![/]") - .RoundedBorder()); - } -} diff --git a/examples/Console/Exceptions/Exceptions.csproj b/examples/Console/Exceptions/Exceptions.csproj deleted file mode 100644 index 7ce802e0..00000000 --- a/examples/Console/Exceptions/Exceptions.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Exceptions - Demonstrates how to render formatted exceptions. - Misc - - - - - - - diff --git a/examples/Console/Exceptions/Program.cs b/examples/Console/Exceptions/Program.cs deleted file mode 100644 index 032908a9..00000000 --- a/examples/Console/Exceptions/Program.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Authentication; -using System.Threading.Tasks; -using Spectre.Console; - -namespace Exceptions; - -public static class Program -{ - public static async Task Main(string[] args) - { - try - { - var foo = new List(); - DoMagic(42, null, ref foo); - } - catch (Exception ex) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("Default").LeftJustified()); - AnsiConsole.WriteLine(); - AnsiConsole.WriteException(ex); - - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("Compact").LeftJustified()); - AnsiConsole.WriteLine(); - AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks); - - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("Compact + Custom colors").LeftJustified()); - AnsiConsole.WriteLine(); - AnsiConsole.WriteException(ex, new ExceptionSettings - { - Format = ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks, - Style = new ExceptionStyle - { - Exception = new Style().Foreground(Color.Grey), - Message = new Style().Foreground(Color.White), - NonEmphasized = new Style().Foreground(Color.Cornsilk1), - Parenthesis = new Style().Foreground(Color.Cornsilk1), - Method = new Style().Foreground(Color.Red), - ParameterName = new Style().Foreground(Color.Cornsilk1), - ParameterType = new Style().Foreground(Color.Red), - Path = new Style().Foreground(Color.Red), - LineNumber = new Style().Foreground(Color.Cornsilk1), - } - }); - } - - try - { - await DoMagicAsync(42, null); - } - catch (Exception ex) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("Async").LeftJustified()); - AnsiConsole.WriteLine(); - AnsiConsole.WriteException(ex, ExceptionFormats.ShortenPaths); - } - } - - private static void DoMagic(int foo, string[,] bar, ref List result) - { - try - { - CheckCredentials(foo, bar); - result = new List(); - } - catch (Exception ex) - { - throw new InvalidOperationException("Whaaat?", ex); - } - } - - private static bool CheckCredentials(int? qux, string[,] corgi) - { - throw new InvalidCredentialException("The credentials are invalid."); - } - - private static async Task DoMagicAsync(T foo, string[,] bar) - { - try - { - await CheckCredentialsAsync(new[] { foo }.ToList(), new []{ foo }, bar); - } - catch (Exception ex) - { - throw new InvalidOperationException("Whaaat?", ex); - } - } - - private static async Task CheckCredentialsAsync(List qux, T[] otherArray, string[,] corgi) - { - await Task.Delay(0); - throw new InvalidCredentialException("The credentials are invalid."); - } -} - diff --git a/examples/Console/Figlet/Figlet.csproj b/examples/Console/Figlet/Figlet.csproj deleted file mode 100644 index c44b0089..00000000 --- a/examples/Console/Figlet/Figlet.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Figlet - Demonstrates how to render FIGlet text. - Widgets - - - - - - - diff --git a/examples/Console/Figlet/Program.cs b/examples/Console/Figlet/Program.cs deleted file mode 100644 index a8310145..00000000 --- a/examples/Console/Figlet/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Spectre.Console; - -namespace Figlet; - -public static class Program -{ - public static void Main(string[] args) - { - AnsiConsole.Write(new FigletText("Left aligned").LeftJustified().Color(Color.Red)); - AnsiConsole.Write(new FigletText("Centered").Centered().Color(Color.Green)); - AnsiConsole.Write(new FigletText("Right aligned").RightJustified().Color(Color.Blue)); - } -} diff --git a/examples/Console/Grids/Grids.csproj b/examples/Console/Grids/Grids.csproj deleted file mode 100644 index f7c55272..00000000 --- a/examples/Console/Grids/Grids.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Grids - Demonstrates how to render grids in a console. - Widgets - - - - - - - diff --git a/examples/Console/Grids/Program.cs b/examples/Console/Grids/Program.cs deleted file mode 100644 index ee9d0e9a..00000000 --- a/examples/Console/Grids/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Spectre.Console; - -namespace Grids; - -public static class Program -{ - public static void Main() - { - AnsiConsole.WriteLine(); - AnsiConsole.MarkupLine("Usage: [grey]dotnet [blue]run[/] [[options]] [[[[--]] ...]]]][/]"); - AnsiConsole.WriteLine(); - - var grid = new Grid(); - grid.AddColumn(new GridColumn().NoWrap()); - grid.AddColumn(new GridColumn().PadLeft(2)); - grid.AddRow("Options:"); - grid.AddRow(" [blue]-h[/], [blue]--help[/]", "Show command line help."); - grid.AddRow(" [blue]-c[/], [blue]--configuration[/] ", "The configuration to run for."); - grid.AddRow(" [blue]-v[/], [blue]--verbosity[/] ", "Set the [grey]MSBuild[/] verbosity level."); - - AnsiConsole.Write(grid); - } -} diff --git a/examples/Console/Info/Info.csproj b/examples/Console/Info/Info.csproj deleted file mode 100644 index c06d19a8..00000000 --- a/examples/Console/Info/Info.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Info - Displays the capabilities of the current console. - Misc - - - - - - - diff --git a/examples/Console/Info/Program.cs b/examples/Console/Info/Program.cs deleted file mode 100644 index 8bd5177b..00000000 --- a/examples/Console/Info/Program.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Spectre.Console; - -namespace Info; - -public static class Program -{ - public static void Main() - { - var grid = new Grid() - .AddColumn(new GridColumn().NoWrap().PadRight(4)) - .AddColumn() - .AddRow("[b]Enrichers[/]", string.Join(", ", AnsiConsole.Profile.Enrichers)) - .AddRow("[b]Color system[/]", $"{AnsiConsole.Profile.Capabilities.ColorSystem}") - .AddRow("[b]Unicode?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Unicode)}") - .AddRow("[b]Supports ansi?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Ansi)}") - .AddRow("[b]Supports links?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Links)}") - .AddRow("[b]Legacy console?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Legacy)}") - .AddRow("[b]Interactive?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Interactive)}") - .AddRow("[b]Terminal?[/]", $"{YesNo(AnsiConsole.Profile.Out.IsTerminal)}") - .AddRow("[b]Buffer width[/]", $"{AnsiConsole.Console.Profile.Width}") - .AddRow("[b]Buffer height[/]", $"{AnsiConsole.Console.Profile.Height}") - .AddRow("[b]Encoding[/]", $"{AnsiConsole.Console.Profile.Encoding.EncodingName}"); - - AnsiConsole.Write( - new Panel(grid) - .Header("Information")); - } - - private static string YesNo(bool value) - { - return value ? "Yes" : "No"; - } -} diff --git a/examples/Console/Json/Json.csproj b/examples/Console/Json/Json.csproj deleted file mode 100644 index 7e31ed3b..00000000 --- a/examples/Console/Json/Json.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Exe - net8.0 - Json - Demonstrates how to print syntax highlighted JSON. - Widgets - - - - - - - - diff --git a/examples/Console/Json/Program.cs b/examples/Console/Json/Program.cs deleted file mode 100644 index 2dc4df69..00000000 --- a/examples/Console/Json/Program.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Json; - -namespace Json; - -public static class Program -{ - public static void Main() - { - var json = new JsonText( - """ - { - "hello": 32, - "world": { - "foo": 21, - "bar": 255, - "baz": [ - 0.32, 0.33e-32, - 0.42e32, 0.55e+32, - { - "hello": "world", - "lol": null - } - ] - } - } - """); - - AnsiConsole.Write( - new Panel(json) - .Header("Some JSON in a panel") - .Collapse() - .RoundedBorder() - .BorderColor(Color.Yellow)); - } -} diff --git a/examples/Console/Layout/Layout.csproj b/examples/Console/Layout/Layout.csproj deleted file mode 100644 index 344ec91b..00000000 --- a/examples/Console/Layout/Layout.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Layout - Demonstrates how to use layouts. - Widgets - - - - - - - diff --git a/examples/Console/Layout/Program.cs b/examples/Console/Layout/Program.cs deleted file mode 100644 index 835b6147..00000000 --- a/examples/Console/Layout/Program.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Spectre.Console; - -namespace Layouts; - -public static class Program -{ - public static void Main() - { - var layout = CreateLayout(); - AnsiConsole.Write(layout); - - Console.ReadKey(true); - } - - private static Layout CreateLayout() - { - var layout = new Layout(); - - layout.SplitRows( - new Layout("Top") - .SplitColumns( - new Layout("Left") - .SplitRows( - new Layout("LeftTop"), - new Layout("LeftBottom")), - new Layout("Right").Ratio(2), - new Layout("RightRight").Size(3)), - new Layout("Bottom")); - - layout["LeftBottom"].Update( - new Panel("[blink]PRESS ANY KEY TO QUIT[/]") - .Expand() - .BorderColor(Color.Yellow) - .Padding(0, 0)); - - layout["Right"].Update( - new Panel( - new Table() - .AddColumns("[blue]Qux[/]", "[green]Corgi[/]") - .AddRow("9", "8") - .AddRow("7", "6") - .Expand()) - .Header("A [yellow]Table[/] in a [blue]Panel[/] (Ratio=2)") - .Expand()); - - layout["RightRight"].Update( - new Panel("Explicit-size-is-[yellow]3[/]") - .BorderColor(Color.Yellow) - .Padding(0, 0)); - - layout["Bottom"].Update( - new Panel( - new FigletText("Hello World")) - .Header("Some [green]Figlet[/] text") - .Expand()); - - return layout; - } -} diff --git a/examples/Console/Links/Links.csproj b/examples/Console/Links/Links.csproj deleted file mode 100644 index 21653003..00000000 --- a/examples/Console/Links/Links.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Links - Demonstrates how to render links in a console. - Misc - - - - - - - diff --git a/examples/Console/Links/Program.cs b/examples/Console/Links/Program.cs deleted file mode 100644 index 6b1a4598..00000000 --- a/examples/Console/Links/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Spectre.Console; - -namespace Links; - -public static class Program -{ - public static void Main() - { - if (AnsiConsole.Profile.Capabilities.Links) - { - AnsiConsole.MarkupLine("[link=https://patriksvensson.se]Click to visit my blog[/]!"); - } - else - { - AnsiConsole.MarkupLine("[red]It looks like your terminal doesn't support links[/]"); - AnsiConsole.WriteLine(); - AnsiConsole.MarkupLine("[yellow](╯°□°)╯[/]︵ [blue]┻━┻[/]"); - } - } -} diff --git a/examples/Console/Live/Live.csproj b/examples/Console/Live/Live.csproj deleted file mode 100644 index c69b546d..00000000 --- a/examples/Console/Live/Live.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Live - Demonstrates how to do live updates. - Live - - - - - - - diff --git a/examples/Console/Live/Program.cs b/examples/Console/Live/Program.cs deleted file mode 100644 index 4d5bdbc3..00000000 --- a/examples/Console/Live/Program.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Threading; -using Spectre.Console; - -namespace Live; - -public static class Program -{ - public static void Main() - { - var table = new Table().Centered(); - - // Animate - AnsiConsole.Live(table) - .AutoClear(false) - .Overflow(VerticalOverflow.Ellipsis) - .Cropping(VerticalOverflowCropping.Top) - .Start(ctx => - { - void Update(int delay, Action action) - { - action(); - ctx.Refresh(); - Thread.Sleep(delay); - } - - // Columns - Update(230, () => table.AddColumn("Release date")); - Update(230, () => table.AddColumn("Title")); - Update(230, () => table.AddColumn("Budget")); - Update(230, () => table.AddColumn("Opening Weekend")); - Update(230, () => table.AddColumn("Box office")); - - // Rows - Update(70, () => table.AddRow("May 25, 1977", "[yellow]Star Wars[/] [grey]Ep.[/] [u]IV[/]", "$11,000,000", "$1,554,475", "$775,398,007")); - Update(70, () => table.AddRow("May 21, 1980", "[yellow]Star Wars[/] [grey]Ep.[/] [u]V[/]", "$18,000,000", "$4,910,483", "$547,969,004")); - Update(70, () => table.AddRow("May 25, 1983", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VI[/]", "$32,500,000", "$23,019,618", "$475,106,177")); - Update(70, () => table.AddRow("May 19, 1999", "[yellow]Star Wars[/] [grey]Ep.[/] [u]I[/]", "$115,000,000", "$64,810,870", "$1,027,044,677")); - Update(70, () => table.AddRow("May 16, 2002", "[yellow]Star Wars[/] [grey]Ep.[/] [u]II[/]", "$115,000,000", "$80,027,814", "$649,436,358")); - Update(70, () => table.AddRow("May 19, 2005", "[yellow]Star Wars[/] [grey]Ep.[/] [u]III[/]", "$113,000,000", "$108,435,841", "$850,035,635")); - Update(70, () => table.AddRow("Dec 18, 2015", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VII[/]", "$245,000,000", "$247,966,675", "$2,068,223,624")); - Update(70, () => table.AddRow("Dec 15, 2017", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VIII[/]", "$317,000,000", "$220,009,584", "$1,333,539,889")); - Update(70, () => table.AddRow("Dec 20, 2019", "[yellow]Star Wars[/] [grey]Ep.[/] [u]IX[/]", "$245,000,000", "$177,383,864", "$1,074,114,248")); - - // Column footer - Update(230, () => table.Columns[2].Footer("$1,633,000,000")); - Update(230, () => table.Columns[3].Footer("$928,119,224")); - Update(400, () => table.Columns[4].Footer("$10,318,030,576")); - - // Column alignment - Update(230, () => table.Columns[2].RightAligned()); - Update(230, () => table.Columns[3].RightAligned()); - Update(400, () => table.Columns[4].RightAligned()); - - // Column titles - Update(70, () => table.Columns[0].Header("[bold]Release date[/]")); - Update(70, () => table.Columns[1].Header("[bold]Title[/]")); - Update(70, () => table.Columns[2].Header("[red bold]Budget[/]")); - Update(70, () => table.Columns[3].Header("[green bold]Opening Weekend[/]")); - Update(400, () => table.Columns[4].Header("[blue bold]Box office[/]")); - - // Footers - Update(70, () => table.Columns[2].Footer("[red bold]$1,633,000,000[/]")); - Update(70, () => table.Columns[3].Footer("[green bold]$928,119,224[/]")); - Update(400, () => table.Columns[4].Footer("[blue bold]$10,318,030,576[/]")); - - // Title - Update(500, () => table.Title("Star Wars Movies")); - Update(400, () => table.Title("[[ [yellow]Star Wars Movies[/] ]]")); - - // Borders - Update(230, () => table.BorderColor(Color.Yellow)); - Update(230, () => table.MinimalBorder()); - Update(230, () => table.SimpleBorder()); - Update(230, () => table.SimpleHeavyBorder()); - - // Caption - Update(400, () => table.Caption("[[ [blue]THE END[/] ]]")); - }); - } -} diff --git a/examples/Console/LiveTable/LiveTable.csproj b/examples/Console/LiveTable/LiveTable.csproj deleted file mode 100644 index 56272a42..00000000 --- a/examples/Console/LiveTable/LiveTable.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - LiveTable - Demonstrates how to do live updates in a table. - Live - - - - - - - diff --git a/examples/Console/LiveTable/Program.cs b/examples/Console/LiveTable/Program.cs deleted file mode 100644 index b3fc2539..00000000 --- a/examples/Console/LiveTable/Program.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Spectre.Console; - -namespace LiveTable; - -public static class Program -{ - private const int NumberOfRows = 10; - - private static readonly Random _random = new(); - private static readonly string[] _exchanges = new string[] - { - "SGD", "SEK", "PLN", - "MYR", "EUR", "USD", - "AUD", "JPY", "CNH", - "HKD", "CAD", "INR", - "DKK", "GBP", "RUB", - "NZD", "MXN", "IDR", - "TWD", "THB", "VND", - }; - - public static async Task Main(string[] args) - { - var table = new Table().Expand().BorderColor(Color.Grey); - table.AddColumn("[yellow]Source currency[/]"); - table.AddColumn("[yellow]Destination currency[/]"); - table.AddColumn("[yellow]Exchange rate[/]"); - - AnsiConsole.MarkupLine("Press [yellow]CTRL+C[/] to exit"); - - await AnsiConsole.Live(table) - .AutoClear(false) - .Overflow(VerticalOverflow.Ellipsis) - .Cropping(VerticalOverflowCropping.Bottom) - .StartAsync(async ctx => - { - // Add some initial rows - foreach (var _ in Enumerable.Range(0, NumberOfRows)) - { - AddExchangeRateRow(table); - } - - // Continously update the table - while (true) - { - // More rows than we want? - if (table.Rows.Count > NumberOfRows) - { - // Remove the first one - table.Rows.RemoveAt(0); - } - - // Add a new row - AddExchangeRateRow(table); - - // Refresh and wait for a while - ctx.Refresh(); - await Task.Delay(400); - } - }); - } - - private static void AddExchangeRateRow(Table table) - { - var (source, destination, rate) = GetExchangeRate(); - table.AddRow( - source, destination, - _random.NextDouble() > 0.35D ? $"[green]{rate}[/]" : $"[red]{rate}[/]"); - } - - private static (string Source, string Destination, double Rate) GetExchangeRate() - { - var source = _exchanges[_random.Next(0, _exchanges.Length)]; - var dest = _exchanges[_random.Next(0, _exchanges.Length)]; - var rate = 200 / ((_random.NextDouble() * 320) + 1); - - while (source == dest) - { - dest = _exchanges[_random.Next(0, _exchanges.Length)]; - } - - return (source, dest, rate); - } -} diff --git a/examples/Console/Minimal/GlobalUsings.cs b/examples/Console/Minimal/GlobalUsings.cs deleted file mode 100644 index 6c76d1fd..00000000 --- a/examples/Console/Minimal/GlobalUsings.cs +++ /dev/null @@ -1,2 +0,0 @@ -global using Spectre.Console; -global using static Spectre.Console.AnsiConsole; \ No newline at end of file diff --git a/examples/Console/Minimal/Minimal.csproj b/examples/Console/Minimal/Minimal.csproj deleted file mode 100644 index b0f2cfe9..00000000 --- a/examples/Console/Minimal/Minimal.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Exe - net8.0 - enable - Minimal - Demonstrates a minimal console application. - Live - - - - - - - diff --git a/examples/Console/Minimal/Program.cs b/examples/Console/Minimal/Program.cs deleted file mode 100644 index 6de47a34..00000000 --- a/examples/Console/Minimal/Program.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Write a markup line to the console -MarkupLine("[yellow]Hello[/], [blue]World[/]!"); - -// Write text to the console -WriteLine("Hello, World!"); - -// Write a table to the console -Write(new Table() - .RoundedBorder() - .AddColumns("[red]Greeting[/]", "[red]Subject[/]") - .AddRow("[yellow]Hello[/]", "World") - .AddRow("[green]Oh hi[/]", "[blue u]Mark[/]")); \ No newline at end of file diff --git a/examples/Console/Panels/Panels.csproj b/examples/Console/Panels/Panels.csproj deleted file mode 100644 index ceab0e60..00000000 --- a/examples/Console/Panels/Panels.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Panels - Demonstrates how to render items in panels. - Widgets - - - - - - - diff --git a/examples/Console/Panels/Program.cs b/examples/Console/Panels/Program.cs deleted file mode 100644 index dc9ecb84..00000000 --- a/examples/Console/Panels/Program.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Spectre.Console; - -namespace Panels; - -public static class Program -{ - public static void Main() - { - var content = new Markup( - "[underline]I[/] heard [underline on blue]you[/] like panels\n\n\n\n" + - "So I put a panel in a panel").Centered(); - - AnsiConsole.Write( - new Panel( - new Panel(content) - .Border(BoxBorder.Rounded))); - - // Left adjusted panel with text - AnsiConsole.Write( - new Panel(new Text("Left adjusted\nLeft").LeftJustified()) - .Expand() - .SquareBorder() - .Header("[red]Left[/]")); - - // Centered ASCII panel with text - AnsiConsole.Write( - new Panel(new Text("Centered\nCenter").Centered()) - .Expand() - .AsciiBorder() - .Header("[green]Center[/]") - .HeaderAlignment(Justify.Center)); - - // Right adjusted, rounded panel with text - AnsiConsole.Write( - new Panel(new Text("Right adjusted\nRight").RightJustified()) - .Expand() - .RoundedBorder() - .Header("[blue]Right[/]") - .HeaderAlignment(Justify.Right)); - } -} diff --git a/examples/Console/Paths/Paths.csproj b/examples/Console/Paths/Paths.csproj deleted file mode 100644 index cad7fccf..00000000 --- a/examples/Console/Paths/Paths.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Paths - Demonstrates how to render paths. - Widgets - - - - - - - diff --git a/examples/Console/Paths/Program.cs b/examples/Console/Paths/Program.cs deleted file mode 100644 index ff88429c..00000000 --- a/examples/Console/Paths/Program.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Threading; -using Spectre.Console; - -namespace Paths; - -public static class Program -{ - public static void Main() - { - var windowsPath = @"C:\This is\A\Super Long\Windows\Path\That\Goes\On And On\And\Never\Seems\To\Stop\But\At\Some\Point\It\Must\I\Guess.txt"; - var unixPath = @"//This is/A/Super Long/Unix/Path/That/Goes/On And On/And/Never/Seems/To/Stop/But/At/Some/Point/It/Must/I/Guess.txt"; - - AnsiConsole.WriteLine(); - WritePlain(windowsPath, unixPath); - - AnsiConsole.WriteLine(); - WriteColorized(windowsPath, unixPath); - - AnsiConsole.WriteLine(); - WriteAligned(windowsPath); - } - - private static void WritePlain(string windowsPath, string unixPath) - { - var table = new Table().BorderColor(Color.Grey).Title("Plain").RoundedBorder(); - table.AddColumns("[grey]OS[/]", "[grey]Path[/]"); - table.AddRow(new Text("Windows"), new TextPath(windowsPath)); - table.AddRow(new Text("Unix"), new TextPath(unixPath)); - - AnsiConsole.Write(table); - } - - private static void WriteColorized(string windowsPath, string unixPath) - { - var table = new Table().BorderColor(Color.Grey).Title("Colorized").RoundedBorder(); - table.AddColumns("[grey]OS[/]", "[grey]Path[/]"); - - table.AddRow(new Text("Windows"), - new TextPath(windowsPath) - .RootColor(Color.Blue) - .SeparatorColor(Color.Yellow) - .StemColor(Color.Red) - .LeafColor(Color.Green)); - - table.AddRow(new Text("Unix"), - new TextPath(unixPath) - .RootColor(Color.Blue) - .SeparatorColor(Color.Yellow) - .StemColor(Color.Red) - .LeafColor(Color.Green)); - - AnsiConsole.Write(table); - } - - private static void WriteAligned(string path) - { - var table = new Table().BorderColor(Color.Grey).Title("Aligned").RoundedBorder(); - table.AddColumns("[grey]Alignment[/]", "[grey]Path[/]"); - - table.AddRow(new Text("Left"), new TextPath(path).LeftJustified()); - table.AddRow(new Text("Center"), new TextPath(path).Centered()); - table.AddRow(new Text("Right"), new TextPath(path).RightJustified()); - - AnsiConsole.Write(table); - } -} diff --git a/examples/Console/Progress/DescriptionGenerator.cs b/examples/Console/Progress/DescriptionGenerator.cs deleted file mode 100644 index 0bdb0643..00000000 --- a/examples/Console/Progress/DescriptionGenerator.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Progress; - -public static class DescriptionGenerator -{ - private static readonly string[] _verbs = new[] { "Downloading", "Rerouting", "Retriculating", "Collapsing", "Folding", "Solving", "Colliding", "Measuring" }; - private static readonly string[] _nouns = new[] { "internet", "splines", "space", "capacitators", "quarks", "algorithms", "data structures", "spacetime" }; - - private static readonly Random _random; - private static readonly HashSet _used; - - static DescriptionGenerator() - { - _random = new Random(DateTime.Now.Millisecond); - _used = new HashSet(); - } - - public static bool TryGenerate(out string name) - { - var iterations = 0; - while (iterations < 25) - { - name = Generate(); - if (!_used.Contains(name)) - { - _used.Add(name); - return true; - } - - iterations++; - } - - name = Generate(); - return false; - } - - public static string Generate() - { - return _verbs[_random.Next(0, _verbs.Length)] - + " " + _nouns[_random.Next(0, _nouns.Length)]; - } -} diff --git a/examples/Console/Progress/Program.cs b/examples/Console/Progress/Program.cs deleted file mode 100644 index 268c826e..00000000 --- a/examples/Console/Progress/Program.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using Spectre.Console; -using Spectre.Console.Rendering; - -namespace Progress; - -public static class Program -{ - public static void Main() - { - AnsiConsole.MarkupLine("[yellow]Initializing warp drive[/]..."); - - // Show progress - AnsiConsole.Progress() - .AutoClear(false) - .Columns(new ProgressColumn[] - { - new TaskDescriptionColumn(), // Task description - new ProgressBarColumn(), // Progress bar - new PercentageColumn(), // Percentage - new RemainingTimeColumn(), // Remaining time - new SpinnerColumn(), // Spinner - }) - .UseRenderHook((renderable, tasks) => RenderHook(tasks, renderable)) - .Start(ctx => - { - var random = new Random(DateTime.Now.Millisecond); - - // Create some tasks - var tasks = CreateTasks(ctx, random); - var warpTask = ctx.AddTask("Going to warp", autoStart: false).IsIndeterminate(); - - // Wait for all tasks (except the indeterminate one) to complete - while (!ctx.IsFinished) - { - // Increment progress - foreach (var (task, increment) in tasks) - { - task.Increment(random.NextDouble() * increment); - } - - // Write some random things to the terminal - if (random.NextDouble() < 0.1) - { - WriteLogMessage(); - } - - // Simulate some delay - Thread.Sleep(100); - } - - // Now start the "warp" task - warpTask.StartTask(); - warpTask.IsIndeterminate(false); - while (!ctx.IsFinished) - { - warpTask.Increment(12 * random.NextDouble()); - - // Simulate some delay - Thread.Sleep(100); - } - }); - - // Done - AnsiConsole.MarkupLine("[green]Done![/]"); - } - - private static IRenderable RenderHook(IReadOnlyList tasks, IRenderable renderable) - { - var header = new Panel("Going on a :rocket:, we're going to the :crescent_moon:").Expand().RoundedBorder(); - var footer = new Rows( - new Rule(), - new Markup( - $"[blue]{tasks.Count}[/] total tasks. [green]{tasks.Count(i => i.IsFinished)}[/] complete.") - ); - - const string ESC = "\u001b"; - string escapeSequence; - if (tasks.All(i => i.IsFinished)) - { - escapeSequence = $"{ESC}]]9;4;0;100{ESC}\\"; - } - else - { - var total = tasks.Sum(i => i.MaxValue); - var done = tasks.Sum(i => i.Value); - var percent = (int)(done / total * 100); - escapeSequence = $"{ESC}]]9;4;1;{percent}{ESC}\\"; - } - - var middleContent = new Grid().AddColumns(new GridColumn(), new GridColumn().Width(20)); - middleContent.AddRow(renderable, new FigletText(tasks.Count(i => i.IsFinished == false).ToString())); - - return new Rows(header, middleContent, footer, new ControlCode(escapeSequence)); - } - - private static List<(ProgressTask Task, int Delay)> CreateTasks(ProgressContext progress, Random random) - { - var tasks = new List<(ProgressTask, int)>(); - while (tasks.Count < 5) - { - if (DescriptionGenerator.TryGenerate(out var name)) - { - tasks.Add((progress.AddTask(name), random.Next(2, 10))); - } - } - - return tasks; - } - - private static void WriteLogMessage() - { - AnsiConsole.MarkupLine( - "[grey]LOG:[/] " + - DescriptionGenerator.Generate() + - "[grey]...[/]"); - } -} diff --git a/examples/Console/Progress/Progress.csproj b/examples/Console/Progress/Progress.csproj deleted file mode 100644 index d231a4bb..00000000 --- a/examples/Console/Progress/Progress.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Exe - net8.0 - Progress - Demonstrates how to show progress bars. - Status - - - - - - - - - - - diff --git a/examples/Console/Prompt/Program.cs b/examples/Console/Prompt/Program.cs deleted file mode 100644 index 216d029f..00000000 --- a/examples/Console/Prompt/Program.cs +++ /dev/null @@ -1,182 +0,0 @@ -using Spectre.Console; - -namespace Prompt -{ - public static class Program - { - public static void Main(string[] args) - { - // Check if we can accept key strokes - if (!AnsiConsole.Profile.Capabilities.Interactive) - { - AnsiConsole.MarkupLine("[red]Environment does not support interaction.[/]"); - return; - } - - // Confirmation - if (!AskConfirmation()) - { - return; - } - - // Ask the user for some different things - WriteDivider("Strings"); - var name = AskName(); - - WriteDivider("Lists"); - var fruit = AskFruit(); - - WriteDivider("Choices"); - var sport = AskSport(); - - WriteDivider("Integers"); - var age = AskAge(); - - WriteDivider("Secrets"); - var password = AskPassword(); - - WriteDivider("Mask"); - var mask = AskPasswordWithCustomMask(); - - WriteDivider("Null Mask"); - var nullMask = AskPasswordWithNullMask(); - - WriteDivider("Optional"); - var color = AskColor(); - - // Summary - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule("[yellow]Results[/]").RuleStyle("grey").LeftJustified()); - AnsiConsole.Write(new Table().AddColumns("[grey]Question[/]", "[grey]Answer[/]") - .RoundedBorder() - .BorderColor(Color.Grey) - .AddRow("[grey]Name[/]", name) - .AddRow("[grey]Favorite fruit[/]", fruit) - .AddRow("[grey]Favorite sport[/]", sport) - .AddRow("[grey]Age[/]", age.ToString()) - .AddRow("[grey]Password[/]", password) - .AddRow("[grey]Mask[/]", mask) - .AddRow("[grey]Null Mask[/]", nullMask) - .AddRow("[grey]Favorite color[/]", string.IsNullOrEmpty(color) ? "Unknown" : color)); - } - - private static void WriteDivider(string text) - { - AnsiConsole.WriteLine(); - AnsiConsole.Write(new Rule($"[yellow]{text}[/]").RuleStyle("grey").LeftJustified()); - } - - public static bool AskConfirmation() - { - if (!AnsiConsole.Confirm("Run prompt example?")) - { - AnsiConsole.MarkupLine("Ok... :("); - return false; - } - - return true; - } - - public static string AskName() - { - var name = AnsiConsole.Ask("What's your [green]name[/]?"); - return name; - } - - public static string AskFruit() - { - var favorites = AnsiConsole.Prompt( - new MultiSelectionPrompt() - .PageSize(10) - .Title("What are your [green]favorite fruits[/]?") - .MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]") - .InstructionsText("[grey](Press [blue][/] to toggle a fruit, [green][/] to accept)[/]") - .AddChoiceGroup("Berries", new[] - { - "Blackcurrant", "Blueberry", "Cloudberry", - "Elderberry", "Honeyberry", "Mulberry" - }) - .AddChoices(new[] - { - "Apple", "Apricot", "Avocado", "Banana", - "Cherry", "Cocunut", "Date", "Dragonfruit", "Durian", - "Egg plant", "Fig", "Grape", "Guava", - "Jackfruit", "Jambul", "Kiwano", "Kiwifruit", "Lime", "Lylo", - "Lychee", "Melon", "Nectarine", "Orange", "Olive" - })); - - var fruit = favorites.Count == 1 ? favorites[0] : null; - if (string.IsNullOrWhiteSpace(fruit)) - { - fruit = AnsiConsole.Prompt( - new SelectionPrompt() - .EnableSearch() - .Title("Ok, but if you could only choose [green]one[/]?") - .MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]") - .AddChoices(favorites)); - } - - AnsiConsole.MarkupLine("You selected: [yellow]{0}[/]", fruit); - return fruit; - } - - public static string AskSport() - { - return AnsiConsole.Prompt( - new TextPrompt("What's your [green]favorite sport[/]?") - .InvalidChoiceMessage("[red]That's not a sport![/]") - .DefaultValue("Sport?") - .AddChoice("Soccer") - .AddChoice("Hockey") - .AddChoice("Basketball")); - } - - public static int AskAge() - { - return AnsiConsole.Prompt( - new TextPrompt("How [green]old[/] are you?") - .PromptStyle("green") - .ValidationErrorMessage("[red]That's not a valid age[/]") - .Validate(age => - { - return age switch - { - <= 0 => ValidationResult.Error("[red]You must at least be 1 years old[/]"), - >= 123 => ValidationResult.Error("[red]You must be younger than the oldest person alive[/]"), - _ => ValidationResult.Success(), - }; - })); - } - - public static string AskPassword() - { - return AnsiConsole.Prompt( - new TextPrompt("Enter [green]password[/]?") - .PromptStyle("red") - .Secret()); - } - - public static string AskPasswordWithCustomMask() - { - return AnsiConsole.Prompt( - new TextPrompt("Enter [green]password[/]?") - .PromptStyle("red") - .Secret('-')); - } - - public static string AskPasswordWithNullMask() - { - return AnsiConsole.Prompt( - new TextPrompt("Enter [green]password[/]?") - .PromptStyle("red") - .Secret(null)); - } - - public static string AskColor() - { - return AnsiConsole.Prompt( - new TextPrompt("[grey][[Optional]][/] What is your [green]favorite color[/]?") - .AllowEmpty()); - } - } -} \ No newline at end of file diff --git a/examples/Console/Prompt/Prompt.csproj b/examples/Console/Prompt/Prompt.csproj deleted file mode 100644 index 137ee610..00000000 --- a/examples/Console/Prompt/Prompt.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Exe - net8.0 - 9 - Prompt - Demonstrates how to get input from a user. - Misc - - - - - - - diff --git a/examples/Console/Rules/Program.cs b/examples/Console/Rules/Program.cs deleted file mode 100644 index 442ed3fa..00000000 --- a/examples/Console/Rules/Program.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Spectre.Console; - -namespace Rules; - -public static class Program -{ - public static void Main(string[] args) - { - // No title - Render( - new Rule() - .RuleStyle(Style.Parse("yellow")) - .AsciiBorder() - .LeftJustified()); - - // Left aligned title - Render( - new Rule("[blue]Left aligned[/]") - .RuleStyle(Style.Parse("red")) - .DoubleBorder() - .LeftJustified()); - - // Centered title - Render( - new Rule("[green]Centered[/]") - .RuleStyle(Style.Parse("green")) - .HeavyBorder() - .Centered()); - - // Right aligned title - Render( - new Rule("[red]Right aligned[/]") - .RuleStyle(Style.Parse("blue")) - .RightJustified()); - } - - private static void Render(Rule rule) - { - AnsiConsole.Write(rule); - AnsiConsole.WriteLine(); - } -} diff --git a/examples/Console/Rules/Rules.csproj b/examples/Console/Rules/Rules.csproj deleted file mode 100644 index 8d0660f3..00000000 --- a/examples/Console/Rules/Rules.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Rules - Demonstrates how to render horizontal rules (lines). - Widgets - - - - - - - diff --git a/examples/Console/Showcase/ExceptionGenerator.cs b/examples/Console/Showcase/ExceptionGenerator.cs deleted file mode 100644 index f3ddd991..00000000 --- a/examples/Console/Showcase/ExceptionGenerator.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace Showcase; - -public static class ExceptionGenerator -{ - public static Exception GenerateException() - { - try - { - SomeOperation(); - throw new InvalidOperationException(); - } - catch (Exception ex) - { - return ex; - } - } - - private static void SomeOperation() - { - SomeOperationGoingWrong(); - } - - private static void SomeOperationGoingWrong() - { - throw new InvalidOperationException("Something went very wrong!"); - } -} diff --git a/examples/Console/Showcase/Program.cs b/examples/Console/Showcase/Program.cs deleted file mode 100644 index abb1e239..00000000 --- a/examples/Console/Showcase/Program.cs +++ /dev/null @@ -1,154 +0,0 @@ -using Spectre.Console; -using Spectre.Console.Examples; -using Spectre.Console.Rendering; - -namespace Showcase; - -public static partial class Program -{ - public static void Main() - { - var table = new Table().HideHeaders().NoBorder(); - table.Title("[u][yellow]Spectre.Console[/] [b]Features[/][/]"); - table.AddColumn("Feature", c => c.NoWrap().RightAligned().Width(10).PadRight(3)); - table.AddColumn("Demonstration", c => c.PadRight(0)); - table.AddEmptyRow(); - - // Colors - table.AddRow( - new Markup("[red]Colors[/]"), - GetColorTable()); - - // Styles - table.AddEmptyRow(); - table.AddRow( - new Markup("[red]OS[/]"), - new Grid().Expand().AddColumns(3) - .AddRow( - "[bold green]Windows[/]", - "[bold blue]macOS[/]", - "[bold yellow]Linux[/]")); - - // Styles - table.AddEmptyRow(); - table.AddRow( - "[red]Styles[/]", - "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/], [underline]underline[/], " - + "[strikethrough]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/]."); - - // Text - table.AddEmptyRow(); - table.AddRow( - new Markup("[red]Text[/]"), - new Markup("Word wrap text. Justify [green]left[/], [yellow]center[/] or [blue]right[/].")); - - table.AddEmptyRow(); - table.AddRow( - Text.Empty, - GetTextGrid()); - - // Markup - table.AddEmptyRow(); - table.AddRow( - "[red]Markup[/]", - "[bold purple]Spectre.Console[/] supports a simple [i]bbcode[/] like " - + "[b]markup[/] for [yellow]color[/], [underline]style[/], and emoji! " - + ":thumbs_up: :red_apple: :ant: :bear: :baguette_bread: :bus:"); - - // Trees and tables - table.AddEmptyRow(); - table.AddRow( - new Markup("[red]Tables and Trees[/]"), - GetTreeTable()); - - // Charts - table.AddRow( - new Markup("[red]Charts[/]"), - new Grid().Collapse().AddColumns(2).AddRow( - new Panel(GetBreakdownChart()).BorderColor(Color.Grey), - new Panel(GetBarChart()).BorderColor(Color.Grey))); - - - // Exceptions - table.AddEmptyRow(); - table.AddRow( - new Markup("[red]Exceptions[/]"), - ExceptionGenerator.GenerateException().GetRenderable()); - - // Much more - table.AddEmptyRow(); - table.AddRow( - "[red]+ Much more![/]", - "Tables, Grids, Trees, Progress bars, Status, Bar charts, Calendars, Figlet, Images, Text prompts, " - + "List boxes, Separators, Pretty exceptions, Canvas, CLI parsing"); - table.AddEmptyRow(); - - // Render the table - AnsiConsole.WriteLine(); - AnsiConsole.Write(table); - } - - private static IRenderable GetColorTable() - { - var colorTable = new Table().Collapse().HideHeaders().NoBorder(); - colorTable.AddColumn("Desc", c => c.PadRight(3)).AddColumn("Colors", c => c.PadRight(0)); - colorTable.AddRow( - new Markup( - "✓ [bold grey]NO_COLOR support[/]\n" + - "✓ [bold green]3-bit color[/]\n" + - "✓ [bold blue]4-bit color[/]\n" + - "✓ [bold purple]8-bit color[/]\n" + - "✓ [bold yellow]Truecolor (16.7 million)[/]\n" + - "✓ [bold aqua]Automatic color conversion[/]"), - new ColorBox(height: 6)); - - return colorTable; - } - - private static IRenderable GetTextGrid() - { - var loremTable = new Grid(); - var lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus."; - loremTable.AddColumn(new GridColumn().LeftAligned()); - loremTable.AddColumn(new GridColumn().Centered()); - loremTable.AddColumn(new GridColumn().RightAligned()); - loremTable.AddRow($"[green]{lorem}[/]", $"[yellow]{lorem}[/]", $"[blue]{lorem}[/]"); - return loremTable; - } - - private static IRenderable GetTreeTable() - { - var tree = new Tree("📁 src"); - tree.AddNode("📁 foo").AddNode("📄 bar.cs"); - tree.AddNode("📁 baz").AddNode("📁 qux").AddNode("📄 corgi.txt"); - tree.AddNode("📄 waldo.xml"); - - var table = new Table().SimpleBorder().BorderColor(Color.Grey); - table.AddColumn(new TableColumn("Overview")); - table.AddColumn(new TableColumn("").Footer("[grey]3 Files, 225 KiB[/]")); - table.AddRow(new Markup("[yellow]Files[/]"), tree); - - return new Table().RoundedBorder().Collapse().BorderColor(Color.Yellow) - .AddColumn("Foo").AddColumn("Bar") - .AddRow(new Text("Baz"), table) - .AddRow("Qux", "Corgi"); - } - - private static IRenderable GetBarChart() - { - return new BarChart() - .AddItem("Apple", 32, Color.Green) - .AddItem("Oranges", 13, Color.Orange1) - .AddItem("Bananas", 22, Color.Yellow); - } - - private static IRenderable GetBreakdownChart() - { - return new BreakdownChart() - .ShowPercentage() - .FullSize() - .AddItem("C#", 82, Color.Green) - .AddItem("PowerShell", 13, Color.Red) - .AddItem("Bash", 5, Color.Blue); - } -} diff --git a/examples/Console/Showcase/Showcase.csproj b/examples/Console/Showcase/Showcase.csproj deleted file mode 100644 index f624fbee..00000000 --- a/examples/Console/Showcase/Showcase.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Showcase - Demonstration of Spectre.Console. - Misc - - - - - - - diff --git a/examples/Console/Status/Program.cs b/examples/Console/Status/Program.cs deleted file mode 100644 index ee28916f..00000000 --- a/examples/Console/Status/Program.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Threading; -using Spectre.Console; - -namespace Status; - -public static class Program -{ - public static void Main() - { - AnsiConsole.Status() - .AutoRefresh(true) - .Spinner(Spinner.Known.Default) - .Start("[yellow]Initializing warp drive[/]", ctx => - { - // Initialize - Thread.Sleep(3000); - WriteLogMessage("Starting gravimetric field displacement manifold"); - Thread.Sleep(1000); - WriteLogMessage("Warming up deuterium chamber"); - Thread.Sleep(2000); - WriteLogMessage("Generating antideuterium"); - - // Warp nacelles - Thread.Sleep(3000); - ctx.Spinner(Spinner.Known.BouncingBar); - ctx.Status("[bold blue]Unfolding warp nacelles[/]"); - WriteLogMessage("Unfolding left warp nacelle"); - Thread.Sleep(2000); - WriteLogMessage("Left warp nacelle [green]online[/]"); - WriteLogMessage("Unfolding right warp nacelle"); - Thread.Sleep(1000); - WriteLogMessage("Right warp nacelle [green]online[/]"); - - // Warp bubble - Thread.Sleep(3000); - ctx.Spinner(Spinner.Known.Star2); - ctx.Status("[bold blue]Generating warp bubble[/]"); - Thread.Sleep(3000); - ctx.Spinner(Spinner.Known.Star); - ctx.Status("[bold blue]Stabilizing warp bubble[/]"); - - // Safety - ctx.Spinner(Spinner.Known.Monkey); - ctx.Status("[bold blue]Performing safety checks[/]"); - WriteLogMessage("Enabling interior dampening"); - Thread.Sleep(2000); - WriteLogMessage("Interior dampening [green]enabled[/]"); - - // Warp! - Thread.Sleep(3000); - ctx.Spinner(Spinner.Known.Moon); - WriteLogMessage("Preparing for warp"); - Thread.Sleep(1000); - for (var warp = 1; warp < 10; warp++) - { - ctx.Status($"[bold blue]Warp {warp}[/]"); - Thread.Sleep(500); - } - }); - - // Done - AnsiConsole.MarkupLine("[bold green]Crusing at Warp 9.8[/]"); - } - - private static void WriteLogMessage(string message) - { - AnsiConsole.MarkupLine($"[grey]LOG:[/] {message}[grey]...[/]"); - } -} diff --git a/examples/Console/Status/Status.csproj b/examples/Console/Status/Status.csproj deleted file mode 100644 index df43d6ca..00000000 --- a/examples/Console/Status/Status.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Exe - net8.0 - Status - Demonstrates how to show status updates. - Status - - - - - - - - - - - diff --git a/examples/Console/Tables/Program.cs b/examples/Console/Tables/Program.cs deleted file mode 100644 index 751477cc..00000000 --- a/examples/Console/Tables/Program.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Spectre.Console; - -namespace Tables; - -public static class Program -{ - public static void Main() - { - AnsiConsole.Write(CreateTable()); - } - - private static Table CreateTable() - { - var simple = new Table() - .Border(TableBorder.Square) - .BorderColor(Color.Red) - .AddColumn(new TableColumn("[u]CDE[/]").Footer("EDC").Centered()) - .AddColumn(new TableColumn("[u]FED[/]").Footer("DEF")) - .AddColumn(new TableColumn("[u]IHG[/]").Footer("GHI")) - .AddRow("Hello", "[red]World![/]", "") - .AddRow("[blue]Bonjour[/]", "[white]le[/]", "[red]monde![/]") - .AddRow("[blue]Hej[/]", "[yellow]Världen![/]", ""); - - var second = new Table() - .Border(TableBorder.Rounded) - .BorderColor(Color.Green) - .AddColumn(new TableColumn("[u]Foo[/]")) - .AddColumn(new TableColumn("[u]Bar[/]")) - .AddColumn(new TableColumn("[u]Baz[/]")) - .AddRow("Hello", "[red]World![/]", "") - .AddRow(simple, new Text("Whaaat"), new Text("Lolz")) - .AddRow("[blue]Hej[/]", "[yellow]Världen![/]", ""); - - return new Table() - .Centered() - .Border(TableBorder.DoubleEdge) - .Title("TABLE [yellow]TITLE[/]") - .Caption("TABLE [yellow]CAPTION[/]") - .AddColumn(new TableColumn(new Panel("[u]ABC[/]").BorderColor(Color.Red)).Footer("[u]FOOTER 1[/]")) - .AddColumn(new TableColumn(new Panel("[u]DEF[/]").BorderColor(Color.Green)).Footer("[u]FOOTER 2[/]")) - .AddColumn(new TableColumn(new Panel("[u]GHI[/]").BorderColor(Color.Blue)).Footer("[u]FOOTER 3[/]")) - .AddRow(new Text("Hello").Centered(), new Markup("[red]World![/]"), Text.Empty) - .AddRow(second, new Text("Whaaat"), new Text("Lol")) - .AddRow(new Markup("[blue]Hej[/]").Centered(), new Markup("[yellow]Världen![/]"), Text.Empty); - } -} diff --git a/examples/Console/Tables/Tables.csproj b/examples/Console/Tables/Tables.csproj deleted file mode 100644 index 9dd65f37..00000000 --- a/examples/Console/Tables/Tables.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Tables - Demonstrates how to render tables in a console. - Widgets - - - - - - - diff --git a/examples/Console/Trees/Program.cs b/examples/Console/Trees/Program.cs deleted file mode 100644 index 7e550664..00000000 --- a/examples/Console/Trees/Program.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Spectre.Console; - -namespace Trees; - -public static class Program -{ - public static void Main() - { - AnsiConsole.WriteLine(); - - // Render the tree - var tree = BuildTree(); - AnsiConsole.Write(tree); - } - - private static Tree BuildTree() - { - // Create the tree - var tree = new Tree("Root") - .Style(Style.Parse("red")) - .Guide(TreeGuide.Line); - - // Add some nodes - var foo = tree.AddNode("[yellow]Foo[/]"); - var table = foo.AddNode(new Table() - .RoundedBorder() - .AddColumn("First") - .AddColumn("Second") - .AddRow("1", "2") - .AddRow("3", "4") - .AddRow("5", "6")); - - table.AddNode("[blue]Baz[/]"); - foo.AddNode("Qux"); - - var bar = tree.AddNode("[yellow]Bar[/]"); - bar.AddNode(new Calendar(2020, 12) - .AddCalendarEvent(2020, 12, 12) - .HideHeader()); - - // Return the tree - return tree; - } -} diff --git a/examples/Console/Trees/Trees.csproj b/examples/Console/Trees/Trees.csproj deleted file mode 100644 index 90114114..00000000 --- a/examples/Console/Trees/Trees.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - Trees - Demonstrates how to render trees in a console. - Widgets - - - - - - - diff --git a/examples/Directory.Build.props b/examples/Directory.Build.props deleted file mode 100644 index 3080093e..00000000 --- a/examples/Directory.Build.props +++ /dev/null @@ -1,5 +0,0 @@ - - - false - - \ No newline at end of file diff --git a/examples/Examples.sln b/examples/Examples.sln deleted file mode 100644 index 31664663..00000000 --- a/examples/Examples.sln +++ /dev/null @@ -1,600 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{2571F1BD-6556-4F96-B27B-B6190E1BF13A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cli", "Cli", "{4682E9B7-B54C-419D-B92F-470DA4E5674C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Delegates", "Cli\Delegates\Delegates.csproj", "{E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo", "Cli\Demo\Demo.csproj", "{7FC2594D-55D6-4688-AB7D-C9C903414448}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dynamic", "Cli\Dynamic\Dynamic.csproj", "{6EA8F935-A230-4171-8618-FDFABA553292}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Injection", "Cli\Injection\Injection.csproj", "{DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Logging", "Cli\Logging\Logging.csproj", "{37024E79-A857-4EB2-9B50-F724ED34E5EB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{DD8EC1B0-F50C-44E4-8399-2D560F95E572}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Borders", "Console\Borders\Borders.csproj", "{036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Calendars", "Console\Calendars\Calendars.csproj", "{C64ADBA3-AED2-4938-8E26-8D6679C395CB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Canvas", "Console\Canvas\Canvas.csproj", "{B3393919-26F1-4200-88CD-B71EEAF0EA51}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Charts", "Console\Charts\Charts.csproj", "{0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Colors", "Console\Colors\Colors.csproj", "{18562660-BF70-4EF3-A765-22713BDE2EB1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Columns", "Console\Columns\Columns.csproj", "{264EBC5A-B897-4DA8-9C9E-9A445B1E368C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cursor", "Console\Cursor\Cursor.csproj", "{95BE948B-6102-4453-982D-C7B21E51B582}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emojis", "Console\Emojis\Emojis.csproj", "{6272C7ED-432E-4286-914C-898304A1880E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Exceptions", "Console\Exceptions\Exceptions.csproj", "{20766F18-AEC7-4382-BDE2-0C846F2857AA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Figlet", "Console\Figlet\Figlet.csproj", "{1C374C51-6C82-4E71-9701-5F378BC0356C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grids", "Console\Grids\Grids.csproj", "{6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Info", "Console\Info\Info.csproj", "{FBCCBA12-9DBF-403C-9FA4-222CBB080955}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Links", "Console\Links\Links.csproj", "{B9414195-69A2-40E6-B071-751DCCE95AF0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Live", "Console\Live\Live.csproj", "{4AE3AC67-A927-42CC-B286-E0A0735DC7A2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Panels", "Console\Panels\Panels.csproj", "{12E7F2CE-E91B-446F-A269-F88FB546B6A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Progress", "Console\Progress\Progress.csproj", "{4554BDF3-0723-4076-B054-616D830942D4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Prompt", "Console\Prompt\Prompt.csproj", "{85A37D38-54D9-4FA2-B311-CA48BD7AF916}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rules", "Console\Rules\Rules.csproj", "{305E2CE7-9D64-43D7-A26C-11036ACE2A89}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Showcase", "Console\Showcase\Showcase.csproj", "{5BEE8076-59A0-47BB-9CC6-222EC978AE16}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Status", "Console\Status\Status.csproj", "{FCE2405B-A215-434B-A47C-32053E27A907}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tables", "Console\Tables\Tables.csproj", "{3D16490A-9EBA-488C-9B3E-6A11FC1E0300}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Trees", "Console\Trees\Trees.csproj", "{2BD88288-E05D-4978-B045-17937078E63C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LiveTable", "Console\LiveTable\LiveTable.csproj", "{E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Minimal", "Console\Minimal\Minimal.csproj", "{1780A30A-397A-4CC3-B2A0-A385D9081FA2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AlternateScreen", "Console\AlternateScreen\AlternateScreen.csproj", "{8A3B636E-5828-438B-A8F4-83811D2704CD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console", "..\src\Spectre.Console\Spectre.Console.csproj", "{0C58FB17-F60A-47AB-84BF-961EC8C06AE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "..\src\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Paths", "Console\Paths\Paths.csproj", "{65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Cli", "..\src\Spectre.Console.Cli\Spectre.Console.Cli.csproj", "{EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Layout", "Console\Layout\Layout.csproj", "{A9FDE73A-8452-4CA3-B366-3F900597E132}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Json", "Console\Json\Json.csproj", "{ABE3E734-0756-4D5A-B28A-E6E526D9927D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Json", "..\src\Spectre.Console.Json\Spectre.Console.Json.csproj", "{91A5637F-1F89-48B3-A0BA-6CC629807393}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Help", "Cli\Help\Help.csproj", "{BAB490D6-FF8D-462B-B2B0-933384D629DB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decorations", "Console\Decorations\Decorations.csproj", "{FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|x64.ActiveCfg = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|x64.Build.0 = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|x86.ActiveCfg = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Debug|x86.Build.0 = Debug|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|Any CPU.Build.0 = Release|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|x64.ActiveCfg = Release|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|x64.Build.0 = Release|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|x86.ActiveCfg = Release|Any CPU - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF}.Release|x86.Build.0 = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|x64.ActiveCfg = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|x64.Build.0 = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|x86.ActiveCfg = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Debug|x86.Build.0 = Debug|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|Any CPU.Build.0 = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|x64.ActiveCfg = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|x64.Build.0 = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|x86.ActiveCfg = Release|Any CPU - {7FC2594D-55D6-4688-AB7D-C9C903414448}.Release|x86.Build.0 = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|x64.ActiveCfg = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|x64.Build.0 = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|x86.ActiveCfg = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Debug|x86.Build.0 = Debug|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|Any CPU.Build.0 = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|x64.ActiveCfg = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|x64.Build.0 = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|x86.ActiveCfg = Release|Any CPU - {6EA8F935-A230-4171-8618-FDFABA553292}.Release|x86.Build.0 = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|x64.ActiveCfg = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|x64.Build.0 = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|x86.ActiveCfg = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Debug|x86.Build.0 = Debug|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|Any CPU.Build.0 = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|x64.ActiveCfg = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|x64.Build.0 = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|x86.ActiveCfg = Release|Any CPU - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58}.Release|x86.Build.0 = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|x64.ActiveCfg = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|x64.Build.0 = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|x86.ActiveCfg = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Debug|x86.Build.0 = Debug|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|Any CPU.Build.0 = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|x64.ActiveCfg = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|x64.Build.0 = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|x86.ActiveCfg = Release|Any CPU - {37024E79-A857-4EB2-9B50-F724ED34E5EB}.Release|x86.Build.0 = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|x64.Build.0 = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Debug|x86.Build.0 = Debug|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|Any CPU.Build.0 = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|x64.ActiveCfg = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|x64.Build.0 = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|x86.ActiveCfg = Release|Any CPU - {DD8EC1B0-F50C-44E4-8399-2D560F95E572}.Release|x86.Build.0 = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|x64.ActiveCfg = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|x64.Build.0 = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|x86.ActiveCfg = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Debug|x86.Build.0 = Debug|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|Any CPU.Build.0 = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|x64.ActiveCfg = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|x64.Build.0 = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|x86.ActiveCfg = Release|Any CPU - {036D547D-1C9B-4E6F-B7E6-2E375E4CAF01}.Release|x86.Build.0 = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|x64.ActiveCfg = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|x64.Build.0 = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|x86.ActiveCfg = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Debug|x86.Build.0 = Debug|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|Any CPU.Build.0 = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|x64.ActiveCfg = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|x64.Build.0 = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|x86.ActiveCfg = Release|Any CPU - {C64ADBA3-AED2-4938-8E26-8D6679C395CB}.Release|x86.Build.0 = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|x64.ActiveCfg = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|x64.Build.0 = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|x86.ActiveCfg = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Debug|x86.Build.0 = Debug|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|Any CPU.Build.0 = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|x64.ActiveCfg = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|x64.Build.0 = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|x86.ActiveCfg = Release|Any CPU - {B3393919-26F1-4200-88CD-B71EEAF0EA51}.Release|x86.Build.0 = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|x64.ActiveCfg = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|x64.Build.0 = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|x86.ActiveCfg = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Debug|x86.Build.0 = Debug|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|Any CPU.Build.0 = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|x64.ActiveCfg = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|x64.Build.0 = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|x86.ActiveCfg = Release|Any CPU - {0CF6EE4B-4015-4DE0-9D48-1EADCDE296E6}.Release|x86.Build.0 = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|x64.ActiveCfg = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|x64.Build.0 = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|x86.ActiveCfg = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Debug|x86.Build.0 = Debug|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|Any CPU.Build.0 = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|x64.ActiveCfg = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|x64.Build.0 = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|x86.ActiveCfg = Release|Any CPU - {18562660-BF70-4EF3-A765-22713BDE2EB1}.Release|x86.Build.0 = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|x64.ActiveCfg = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|x64.Build.0 = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|x86.ActiveCfg = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Debug|x86.Build.0 = Debug|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|Any CPU.Build.0 = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|x64.ActiveCfg = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|x64.Build.0 = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|x86.ActiveCfg = Release|Any CPU - {264EBC5A-B897-4DA8-9C9E-9A445B1E368C}.Release|x86.Build.0 = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|x64.ActiveCfg = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|x64.Build.0 = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|x86.ActiveCfg = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Debug|x86.Build.0 = Debug|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|Any CPU.Build.0 = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|x64.ActiveCfg = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|x64.Build.0 = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|x86.ActiveCfg = Release|Any CPU - {95BE948B-6102-4453-982D-C7B21E51B582}.Release|x86.Build.0 = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|x64.ActiveCfg = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|x64.Build.0 = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|x86.ActiveCfg = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Debug|x86.Build.0 = Debug|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|Any CPU.Build.0 = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|x64.ActiveCfg = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|x64.Build.0 = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|x86.ActiveCfg = Release|Any CPU - {6272C7ED-432E-4286-914C-898304A1880E}.Release|x86.Build.0 = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|x64.ActiveCfg = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|x64.Build.0 = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|x86.ActiveCfg = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Debug|x86.Build.0 = Debug|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|Any CPU.Build.0 = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|x64.ActiveCfg = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|x64.Build.0 = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|x86.ActiveCfg = Release|Any CPU - {20766F18-AEC7-4382-BDE2-0C846F2857AA}.Release|x86.Build.0 = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|x64.ActiveCfg = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|x64.Build.0 = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|x86.ActiveCfg = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Debug|x86.Build.0 = Debug|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|Any CPU.Build.0 = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|x64.ActiveCfg = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|x64.Build.0 = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|x86.ActiveCfg = Release|Any CPU - {1C374C51-6C82-4E71-9701-5F378BC0356C}.Release|x86.Build.0 = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|x64.ActiveCfg = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|x64.Build.0 = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|x86.ActiveCfg = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Debug|x86.Build.0 = Debug|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|Any CPU.Build.0 = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|x64.ActiveCfg = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|x64.Build.0 = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|x86.ActiveCfg = Release|Any CPU - {6F7AB11D-D2AE-4D1C-AFEE-7FBA922D6C26}.Release|x86.Build.0 = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|x64.ActiveCfg = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|x64.Build.0 = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|x86.ActiveCfg = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Debug|x86.Build.0 = Debug|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|Any CPU.Build.0 = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|x64.ActiveCfg = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|x64.Build.0 = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|x86.ActiveCfg = Release|Any CPU - {FBCCBA12-9DBF-403C-9FA4-222CBB080955}.Release|x86.Build.0 = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|x64.Build.0 = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Debug|x86.Build.0 = Debug|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|Any CPU.Build.0 = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|x64.ActiveCfg = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|x64.Build.0 = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|x86.ActiveCfg = Release|Any CPU - {B9414195-69A2-40E6-B071-751DCCE95AF0}.Release|x86.Build.0 = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|x64.ActiveCfg = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|x64.Build.0 = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|x86.ActiveCfg = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Debug|x86.Build.0 = Debug|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|Any CPU.Build.0 = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|x64.ActiveCfg = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|x64.Build.0 = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|x86.ActiveCfg = Release|Any CPU - {4AE3AC67-A927-42CC-B286-E0A0735DC7A2}.Release|x86.Build.0 = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|x64.ActiveCfg = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|x64.Build.0 = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|x86.ActiveCfg = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Debug|x86.Build.0 = Debug|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|Any CPU.Build.0 = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|x64.ActiveCfg = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|x64.Build.0 = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|x86.ActiveCfg = Release|Any CPU - {12E7F2CE-E91B-446F-A269-F88FB546B6A8}.Release|x86.Build.0 = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|x64.ActiveCfg = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|x64.Build.0 = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|x86.ActiveCfg = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Debug|x86.Build.0 = Debug|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|Any CPU.Build.0 = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|x64.ActiveCfg = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|x64.Build.0 = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|x86.ActiveCfg = Release|Any CPU - {4554BDF3-0723-4076-B054-616D830942D4}.Release|x86.Build.0 = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|x64.ActiveCfg = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|x64.Build.0 = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|x86.ActiveCfg = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Debug|x86.Build.0 = Debug|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|Any CPU.Build.0 = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|x64.ActiveCfg = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|x64.Build.0 = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|x86.ActiveCfg = Release|Any CPU - {85A37D38-54D9-4FA2-B311-CA48BD7AF916}.Release|x86.Build.0 = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|x64.ActiveCfg = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|x64.Build.0 = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|x86.ActiveCfg = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Debug|x86.Build.0 = Debug|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|Any CPU.Build.0 = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|x64.ActiveCfg = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|x64.Build.0 = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|x86.ActiveCfg = Release|Any CPU - {305E2CE7-9D64-43D7-A26C-11036ACE2A89}.Release|x86.Build.0 = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|x64.ActiveCfg = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|x64.Build.0 = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|x86.ActiveCfg = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Debug|x86.Build.0 = Debug|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|Any CPU.Build.0 = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|x64.ActiveCfg = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|x64.Build.0 = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|x86.ActiveCfg = Release|Any CPU - {5BEE8076-59A0-47BB-9CC6-222EC978AE16}.Release|x86.Build.0 = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|x64.ActiveCfg = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|x64.Build.0 = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|x86.ActiveCfg = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Debug|x86.Build.0 = Debug|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|Any CPU.Build.0 = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|x64.ActiveCfg = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|x64.Build.0 = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|x86.ActiveCfg = Release|Any CPU - {FCE2405B-A215-434B-A47C-32053E27A907}.Release|x86.Build.0 = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|x64.ActiveCfg = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|x64.Build.0 = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|x86.ActiveCfg = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Debug|x86.Build.0 = Debug|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|Any CPU.Build.0 = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|x64.ActiveCfg = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|x64.Build.0 = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|x86.ActiveCfg = Release|Any CPU - {3D16490A-9EBA-488C-9B3E-6A11FC1E0300}.Release|x86.Build.0 = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|x64.ActiveCfg = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|x64.Build.0 = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|x86.ActiveCfg = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Debug|x86.Build.0 = Debug|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|Any CPU.Build.0 = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|x64.ActiveCfg = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|x64.Build.0 = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|x86.ActiveCfg = Release|Any CPU - {2BD88288-E05D-4978-B045-17937078E63C}.Release|x86.Build.0 = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|x64.ActiveCfg = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|x64.Build.0 = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|x86.ActiveCfg = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Debug|x86.Build.0 = Debug|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|Any CPU.Build.0 = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|x64.ActiveCfg = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|x64.Build.0 = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|x86.ActiveCfg = Release|Any CPU - {E5FAAFB4-1D0F-4E29-A94F-A647D64AE64E}.Release|x86.Build.0 = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|x64.ActiveCfg = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|x64.Build.0 = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|x86.ActiveCfg = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Debug|x86.Build.0 = Debug|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|Any CPU.Build.0 = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|x64.ActiveCfg = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|x64.Build.0 = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|x86.ActiveCfg = Release|Any CPU - {1780A30A-397A-4CC3-B2A0-A385D9081FA2}.Release|x86.Build.0 = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|x64.ActiveCfg = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|x64.Build.0 = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|x86.ActiveCfg = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Debug|x86.Build.0 = Debug|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|Any CPU.Build.0 = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|x64.ActiveCfg = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|x64.Build.0 = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|x86.ActiveCfg = Release|Any CPU - {8A3B636E-5828-438B-A8F4-83811D2704CD}.Release|x86.Build.0 = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|x64.ActiveCfg = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|x64.Build.0 = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|x86.ActiveCfg = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Debug|x86.Build.0 = Debug|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|Any CPU.Build.0 = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|x64.ActiveCfg = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|x64.Build.0 = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|x86.ActiveCfg = Release|Any CPU - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6}.Release|x86.Build.0 = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|x64.ActiveCfg = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|x64.Build.0 = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|x86.ActiveCfg = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Debug|x86.Build.0 = Debug|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|Any CPU.Build.0 = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|x64.ActiveCfg = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|x64.Build.0 = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|x86.ActiveCfg = Release|Any CPU - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7}.Release|x86.Build.0 = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|x64.ActiveCfg = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|x64.Build.0 = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Debug|x86.Build.0 = Debug|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|Any CPU.Build.0 = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|x64.ActiveCfg = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|x64.Build.0 = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|x86.ActiveCfg = Release|Any CPU - {65CB00B0-A3AE-4E8F-A990-4C8C1A232FE2}.Release|x86.Build.0 = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|x64.ActiveCfg = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|x64.Build.0 = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|x86.ActiveCfg = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Debug|x86.Build.0 = Debug|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|Any CPU.Build.0 = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|x64.ActiveCfg = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|x64.Build.0 = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|x86.ActiveCfg = Release|Any CPU - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7}.Release|x86.Build.0 = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|x64.ActiveCfg = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|x64.Build.0 = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|x86.ActiveCfg = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Debug|x86.Build.0 = Debug|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|Any CPU.Build.0 = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|x64.ActiveCfg = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|x64.Build.0 = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|x86.ActiveCfg = Release|Any CPU - {A9FDE73A-8452-4CA3-B366-3F900597E132}.Release|x86.Build.0 = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|x64.ActiveCfg = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|x64.Build.0 = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|x86.ActiveCfg = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Debug|x86.Build.0 = Debug|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|Any CPU.Build.0 = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|x64.ActiveCfg = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|x64.Build.0 = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|x86.ActiveCfg = Release|Any CPU - {ABE3E734-0756-4D5A-B28A-E6E526D9927D}.Release|x86.Build.0 = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|x64.ActiveCfg = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|x64.Build.0 = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|x86.ActiveCfg = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Debug|x86.Build.0 = Debug|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|Any CPU.Build.0 = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|x64.ActiveCfg = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|x64.Build.0 = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|x86.ActiveCfg = Release|Any CPU - {91A5637F-1F89-48B3-A0BA-6CC629807393}.Release|x86.Build.0 = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|x64.ActiveCfg = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|x64.Build.0 = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|x86.ActiveCfg = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Debug|x86.Build.0 = Debug|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|Any CPU.Build.0 = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|x64.ActiveCfg = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|x64.Build.0 = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|x86.ActiveCfg = Release|Any CPU - {BAB490D6-FF8D-462B-B2B0-933384D629DB}.Release|x86.Build.0 = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|x64.ActiveCfg = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|x64.Build.0 = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Debug|x86.Build.0 = Debug|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|Any CPU.Build.0 = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|x64.ActiveCfg = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|x64.Build.0 = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|x86.ActiveCfg = Release|Any CPU - {FC5852F1-E01F-4DF7-9B49-CA19A9EE670F}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {E2C9023A-D24F-4F5D-8411-5E2FEA642FEF} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - {7FC2594D-55D6-4688-AB7D-C9C903414448} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - {6EA8F935-A230-4171-8618-FDFABA553292} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - {DEB88B47-658E-4FCB-BD1D-05C99E7EFA58} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - {37024E79-A857-4EB2-9B50-F724ED34E5EB} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - {DD8EC1B0-F50C-44E4-8399-2D560F95E572} = {2571F1BD-6556-4F96-B27B-B6190E1BF13A} - {0C58FB17-F60A-47AB-84BF-961EC8C06AE6} = {2571F1BD-6556-4F96-B27B-B6190E1BF13A} - {A127CE7D-A5A7-4745-9809-EBD7CB12CEE7} = {2571F1BD-6556-4F96-B27B-B6190E1BF13A} - {EFAADF6A-C77D-41EC-83F5-BBB4FFC5A6D7} = {2571F1BD-6556-4F96-B27B-B6190E1BF13A} - {91A5637F-1F89-48B3-A0BA-6CC629807393} = {2571F1BD-6556-4F96-B27B-B6190E1BF13A} - {BAB490D6-FF8D-462B-B2B0-933384D629DB} = {4682E9B7-B54C-419D-B92F-470DA4E5674C} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3EE724C5-CAB4-410D-AC63-8D4260EF83ED} - EndGlobalSection -EndGlobal diff --git a/examples/Shared/ColorBox.cs b/examples/Shared/ColorBox.cs deleted file mode 100644 index 7438c9dc..00000000 --- a/examples/Shared/ColorBox.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using Spectre.Console.Rendering; - -namespace Spectre.Console.Examples; - -public sealed class ColorBox : Renderable -{ - private readonly int _height; - private int? _width; - - public ColorBox(int height) - { - _height = height; - } - - public ColorBox(int width, int height) - : this(height) - { - _width = width; - } - - protected override Measurement Measure(RenderOptions options, int maxWidth) - { - return new Measurement(1, GetWidth(maxWidth)); - } - - protected override IEnumerable Render(RenderOptions options, int maxWidth) - { - maxWidth = GetWidth(maxWidth); - - for (var y = 0; y < _height; y++) - { - for (var x = 0; x < maxWidth; x++) - { - var h = x / (float)maxWidth; - var l = 0.1f + ((y / (float)_height) * 0.7f); - var (r1, g1, b1) = ColorFromHSL(h, l, 1.0f); - var (r2, g2, b2) = ColorFromHSL(h, l + (0.7f / 10), 1.0f); - - var background = new Color((byte)(r1 * 255), (byte)(g1 * 255), (byte)(b1 * 255)); - var foreground = new Color((byte)(r2 * 255), (byte)(g2 * 255), (byte)(b2 * 255)); - - yield return new Segment("▄", new Style(foreground, background)); - } - - yield return Segment.LineBreak; - } - } - - private int GetWidth(int maxWidth) - { - var width = maxWidth; - if (_width != null) - { - width = Math.Min(_width.Value, width); - } - - return width; - } - - private static (float, float, float) ColorFromHSL(double h, double l, double s) - { - double r = 0, g = 0, b = 0; - if (l != 0) - { - if (s == 0) - { - r = g = b = l; - } - else - { - double temp2; - if (l < 0.5) - { - temp2 = l * (1.0 + s); - } - else - { - temp2 = l + s - (l * s); - } - - var temp1 = 2.0 * l - temp2; - - r = GetColorComponent(temp1, temp2, h + 1.0 / 3.0); - g = GetColorComponent(temp1, temp2, h); - b = GetColorComponent(temp1, temp2, h - 1.0 / 3.0); - } - } - - return ((float)r, (float)g, (float)b); - - } - - private static double GetColorComponent(double temp1, double temp2, double temp3) - { - if (temp3 < 0.0) - { - temp3 += 1.0; - } - else if (temp3 > 1.0) - { - temp3 -= 1.0; - } - - if (temp3 < 1.0 / 6.0) - { - return temp1 + (temp2 - temp1) * 6.0 * temp3; - } - else if (temp3 < 0.5) - { - return temp2; - } - else if (temp3 < 2.0 / 3.0) - { - return temp1 + ((temp2 - temp1) * ((2.0 / 3.0) - temp3) * 6.0); - } - else - { - return temp1; - } - } -} diff --git a/examples/Shared/Extensions/ColorExtensions.cs b/examples/Shared/Extensions/ColorExtensions.cs deleted file mode 100644 index cdc6657a..00000000 --- a/examples/Shared/Extensions/ColorExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Spectre.Console.Examples; - -public static class ColorExtensions -{ - public static Color GetInvertedColor(this Color color) - { - return GetLuminance(color) < 140 ? Color.White : Color.Black; - } - - private static float GetLuminance(this Color color) - { - return (float)((0.2126 * color.R) + (0.7152 * color.G) + (0.0722 * color.B)); - } -} diff --git a/examples/Shared/Shared.csproj b/examples/Shared/Shared.csproj deleted file mode 100644 index 811bcd78..00000000 --- a/examples/Shared/Shared.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net8.0 - false - enable - - - - - - - - diff --git a/global.json b/global.json index c2d29dec..7c3a1a19 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { "$schema": "http://json.schemastore.org/global", "sdk": { - "version": "8.0.200", + "version": "8.0.401", "rollForward": "latestFeature" } } diff --git a/resources/nuget/Spectre.Console.Cli.md b/resources/nuget/Spectre.Console.Cli.md new file mode 100644 index 00000000..898df57f --- /dev/null +++ b/resources/nuget/Spectre.Console.Cli.md @@ -0,0 +1,5 @@ +# `Spectre.Console.Cli` + +`Spectre.Console.Cli` is a modern library for parsing command line arguments. While it's extremely opinionated in what it does, it tries to follow established industry conventions, and draws its inspiration from applications you use everyday. + +Detailed instructions for using this library is located on the project website, https://spectreconsole.net \ No newline at end of file diff --git a/resources/nuget/Spectre.Console.ImageSharp.md b/resources/nuget/Spectre.Console.ImageSharp.md new file mode 100644 index 00000000..2203159d --- /dev/null +++ b/resources/nuget/Spectre.Console.ImageSharp.md @@ -0,0 +1,5 @@ +# `Spectre.Console.ImageSharp` + +A .NET library that extends [Spectre.Console](https://github.com/spectreconsole/spectre.console) with ImageSharp superpowers. + +Detailed instructions for using `Spectre.Console.ImageSharp` are located on the project website, https://spectreconsole.net/widgets/canvas-image \ No newline at end of file diff --git a/resources/nuget/Spectre.Console.Json.md b/resources/nuget/Spectre.Console.Json.md new file mode 100644 index 00000000..e03bf9fe --- /dev/null +++ b/resources/nuget/Spectre.Console.Json.md @@ -0,0 +1,5 @@ +# `Spectre.Console.Json` + +A .NET library that extends [Spectre.Console](https://github.com/spectreconsole/spectre.console) with JSON superpowers. + +Detailed instructions for using this library is located on the project website, https://spectreconsole.net/widgets/json \ No newline at end of file diff --git a/resources/nuget/Spectre.Console.Testing.md b/resources/nuget/Spectre.Console.Testing.md new file mode 100644 index 00000000..7dc3537d --- /dev/null +++ b/resources/nuget/Spectre.Console.Testing.md @@ -0,0 +1,5 @@ +# `Spectre.Console.Testing` + +A .NET library that makes it easier to write unit tests for [Spectre.Console](https://github.com/spectreconsole/spectre.console) applications. + +Detailed instructions for using this library is located on the project website, https://spectreconsole.net \ No newline at end of file diff --git a/resources/nuget/Spectre.Console.md b/resources/nuget/Spectre.Console.md new file mode 100644 index 00000000..a46f26cb --- /dev/null +++ b/resources/nuget/Spectre.Console.md @@ -0,0 +1,5 @@ +# `Spectre.Console` + +A .NET library that makes it easier to create beautiful, cross platform, console applications. It is heavily inspired by the excellent Python library, [Rich](https://github.com/willmcgugan/rich). + +Detailed instructions for using this library is located on the project website, https://spectreconsole.net \ No newline at end of file diff --git a/resources/nuget/logo.png b/resources/nuget/logo.png new file mode 100644 index 00000000..eebe8db6 Binary files /dev/null and b/resources/nuget/logo.png differ diff --git a/resources/scripts/Generator/Generator.csproj b/resources/scripts/Generator/Generator.csproj index 64be45be..d2c43aa4 100644 --- a/resources/scripts/Generator/Generator.csproj +++ b/resources/scripts/Generator/Generator.csproj @@ -43,17 +43,17 @@ - - + + - - + + - - + + diff --git a/resources/scripts/Generator/Generator.sln b/resources/scripts/Generator/Generator.sln index daea4307..894e1307 100644 --- a/resources/scripts/Generator/Generator.sln +++ b/resources/scripts/Generator/Generator.sln @@ -7,13 +7,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Generator", "Generator.cspr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console", "..\..\..\src\Spectre.Console\Spectre.Console.csproj", "{F75B882A-06DB-426B-9580-A7302D32E684}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "..\..\..\src\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{112A37CB-1EFE-4A90-BD5B-5437038BE276}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "..\..\..\src\Extensions\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{112A37CB-1EFE-4A90-BD5B-5437038BE276}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{CFE7445D-F971-429D-B6E6-9E68456AE00F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Cli", "..\..\..\src\Spectre.Console.Cli\Spectre.Console.Cli.csproj", "{18A3F32D-FECD-463B-A194-6EE74EA9E5EC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spectre.Console.Json", "..\..\..\src\Spectre.Console.Json\Spectre.Console.Json.csproj", "{6C96C268-CEEE-478A-A36F-E1450AC33B73}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spectre.Console.Json", "..\..\..\src\Extensions\Spectre.Console.Json\Spectre.Console.Json.csproj", "{6C96C268-CEEE-478A-A36F-E1450AC33B73}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/resources/spectre.snk b/resources/spectre.snk new file mode 100644 index 00000000..16a16ed4 Binary files /dev/null and b/resources/spectre.snk differ diff --git a/src/.editorconfig b/src/.editorconfig index a28cf1d1..e01b77d5 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -98,4 +98,7 @@ dotnet_diagnostic.IDE0044.severity = warning dotnet_diagnostic.RCS1047.severity = none # RCS1090: Call 'ConfigureAwait(false)'. -dotnet_diagnostic.RCS1090.severity = warning \ No newline at end of file +dotnet_diagnostic.RCS1090.severity = warning + +# The file header is missing or not located at the top of the file +dotnet_diagnostic.SA1633.severity = none \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 02a39478..f5089dad 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,4 +1,4 @@ - + true 12 @@ -7,19 +7,38 @@ true true false + enable + $(NoWarn);SA1633 + true + $(MSBuildThisFileDirectory)\..\resources\spectre.snk + 00240000048000009400000006020000002400005253413100040000010001006146d3789d31477cf4a3b508dcf772ff9ccad8613f6bd6b17b9c4a960a7a7b551ecd22e4f4119ced70ee8bbdf3ca0a117c99fd6248c16255ea9033110c2233d42e74e81bf4f3f7eb09bfe8b53ad399d957514f427171a86f5fe9fe0014be121d571c80c4a0cfc3531bdbf5a2900d936d93f2c94171b9134f7644a1ac3612a0d0 true + + + true + \ + Properties/Package/Logo.png + + + true + \README.md + Properties/Package/README.md + + + A library that makes it easier to create beautiful console applications. Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray git https://github.com/spectreconsole/spectre.console - small-logo.png + logo.png + README.md True https://github.com/spectreconsole/spectre.console MIT @@ -31,14 +50,18 @@ true + + + + - - - + + + All - + All diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props new file mode 100644 index 00000000..0c9ab6ef --- /dev/null +++ b/src/Directory.Packages.props @@ -0,0 +1,30 @@ + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Spectre.Console.ImageSharp/CanvasImage.cs b/src/Extensions/Spectre.Console.ImageSharp/CanvasImage.cs similarity index 100% rename from src/Spectre.Console.ImageSharp/CanvasImage.cs rename to src/Extensions/Spectre.Console.ImageSharp/CanvasImage.cs diff --git a/src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs b/src/Extensions/Spectre.Console.ImageSharp/CanvasImageExtensions.cs similarity index 100% rename from src/Spectre.Console.ImageSharp/CanvasImageExtensions.cs rename to src/Extensions/Spectre.Console.ImageSharp/CanvasImageExtensions.cs diff --git a/src/Extensions/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj b/src/Extensions/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj new file mode 100644 index 00000000..02412277 --- /dev/null +++ b/src/Extensions/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj @@ -0,0 +1,17 @@ + + + + net8.0;net7.0;net6.0 + true + A library that extends Spectre.Console with ImageSharp superpowers. + + + + + + + + + + + diff --git a/src/Spectre.Console.Json/IJsonParser.cs b/src/Extensions/Spectre.Console.Json/IJsonParser.cs similarity index 100% rename from src/Spectre.Console.Json/IJsonParser.cs rename to src/Extensions/Spectre.Console.Json/IJsonParser.cs diff --git a/src/Spectre.Console.Json/JsonBuilder.cs b/src/Extensions/Spectre.Console.Json/JsonBuilder.cs similarity index 100% rename from src/Spectre.Console.Json/JsonBuilder.cs rename to src/Extensions/Spectre.Console.Json/JsonBuilder.cs diff --git a/src/Spectre.Console.Json/JsonParser.cs b/src/Extensions/Spectre.Console.Json/JsonParser.cs similarity index 100% rename from src/Spectre.Console.Json/JsonParser.cs rename to src/Extensions/Spectre.Console.Json/JsonParser.cs diff --git a/src/Spectre.Console.Json/JsonText.cs b/src/Extensions/Spectre.Console.Json/JsonText.cs similarity index 100% rename from src/Spectre.Console.Json/JsonText.cs rename to src/Extensions/Spectre.Console.Json/JsonText.cs diff --git a/src/Spectre.Console.Json/JsonTextExtensions.cs b/src/Extensions/Spectre.Console.Json/JsonTextExtensions.cs similarity index 100% rename from src/Spectre.Console.Json/JsonTextExtensions.cs rename to src/Extensions/Spectre.Console.Json/JsonTextExtensions.cs diff --git a/src/Spectre.Console.Json/JsonTextStyles.cs b/src/Extensions/Spectre.Console.Json/JsonTextStyles.cs similarity index 100% rename from src/Spectre.Console.Json/JsonTextStyles.cs rename to src/Extensions/Spectre.Console.Json/JsonTextStyles.cs diff --git a/src/Spectre.Console.Json/JsonToken.cs b/src/Extensions/Spectre.Console.Json/JsonToken.cs similarity index 100% rename from src/Spectre.Console.Json/JsonToken.cs rename to src/Extensions/Spectre.Console.Json/JsonToken.cs diff --git a/src/Spectre.Console.Json/JsonTokenReader.cs b/src/Extensions/Spectre.Console.Json/JsonTokenReader.cs similarity index 100% rename from src/Spectre.Console.Json/JsonTokenReader.cs rename to src/Extensions/Spectre.Console.Json/JsonTokenReader.cs diff --git a/src/Spectre.Console.Json/JsonTokenType.cs b/src/Extensions/Spectre.Console.Json/JsonTokenType.cs similarity index 100% rename from src/Spectre.Console.Json/JsonTokenType.cs rename to src/Extensions/Spectre.Console.Json/JsonTokenType.cs diff --git a/src/Spectre.Console.Json/JsonTokenizer.cs b/src/Extensions/Spectre.Console.Json/JsonTokenizer.cs similarity index 100% rename from src/Spectre.Console.Json/JsonTokenizer.cs rename to src/Extensions/Spectre.Console.Json/JsonTokenizer.cs diff --git a/src/Spectre.Console.Json/Properties/Usings.cs b/src/Extensions/Spectre.Console.Json/Properties/Usings.cs similarity index 100% rename from src/Spectre.Console.Json/Properties/Usings.cs rename to src/Extensions/Spectre.Console.Json/Properties/Usings.cs diff --git a/src/Extensions/Spectre.Console.Json/Spectre.Console.Json.csproj b/src/Extensions/Spectre.Console.Json/Spectre.Console.Json.csproj new file mode 100644 index 00000000..1c75fef8 --- /dev/null +++ b/src/Extensions/Spectre.Console.Json/Spectre.Console.Json.csproj @@ -0,0 +1,20 @@ + + + + net8.0;net7.0;net6.0;netstandard2.0 + true + true + A library that extends Spectre.Console with JSON superpowers. + + + + + + + + + + + + + diff --git a/src/Spectre.Console.Json/Syntax/JsonArray.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonArray.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonArray.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonArray.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonBoolean.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonBoolean.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonBoolean.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonBoolean.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonMember.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonMember.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonMember.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonMember.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonNull.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonNull.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonNull.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonNull.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonNumber.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonNumber.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonNumber.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonNumber.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonObject.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonObject.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonObject.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonObject.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonString.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonString.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonString.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonString.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonSyntax.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonSyntax.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonSyntax.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonSyntax.cs diff --git a/src/Spectre.Console.Json/Syntax/JsonSyntaxVisitor.cs b/src/Extensions/Spectre.Console.Json/Syntax/JsonSyntaxVisitor.cs similarity index 100% rename from src/Spectre.Console.Json/Syntax/JsonSyntaxVisitor.cs rename to src/Extensions/Spectre.Console.Json/Syntax/JsonSyntaxVisitor.cs diff --git a/src/Spectre.Console.Analyzer.Sandbox/Program.cs b/src/Spectre.Console.Analyzer.Sandbox/Program.cs deleted file mode 100644 index 65463c46..00000000 --- a/src/Spectre.Console.Analyzer.Sandbox/Program.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Spectre.Console.Analyzer.Sandbox; - -/// -/// Sample sandbox for testing out analyzers. -/// -public static class Program -{ - /// - /// The program's entry point. - /// - public static void Main() - { - AnsiConsole.WriteLine("Project is set up with a reference to Spectre.Console.Analyzer"); - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer.Sandbox/Spectre.Console.Analyzer.Sandbox.csproj b/src/Spectre.Console.Analyzer.Sandbox/Spectre.Console.Analyzer.Sandbox.csproj deleted file mode 100644 index fe852743..00000000 --- a/src/Spectre.Console.Analyzer.Sandbox/Spectre.Console.Analyzer.Sandbox.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net8.0 - - - - - - - - - - diff --git a/src/Spectre.Console.Analyzer.sln b/src/Spectre.Console.Analyzer.sln deleted file mode 100644 index 0d2c821e..00000000 --- a/src/Spectre.Console.Analyzer.sln +++ /dev/null @@ -1,79 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30114.105 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Analyzer", "Spectre.Console.Analyzer\Spectre.Console.Analyzer.csproj", "{18178142-A80D-424F-882D-DB0F787210BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Analyzer.Sandbox", "Spectre.Console.Analyzer.Sandbox\Spectre.Console.Analyzer.Sandbox.csproj", "{44D2E280-8FCD-4FC1-9133-F61E344FD6A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Analyzer.Tests", "..\test\Spectre.Console.Analyzer.Tests\Spectre.Console.Analyzer.Tests.csproj", "{609D5D1B-D904-4A31-B237-A04B49910166}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console", "Spectre.Console\Spectre.Console.csproj", "{6BFF310F-9601-4E5D-BC80-118AC708D72A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|x64.ActiveCfg = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|x64.Build.0 = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|x86.ActiveCfg = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Debug|x86.Build.0 = Debug|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|Any CPU.Build.0 = Release|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|x64.ActiveCfg = Release|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|x64.Build.0 = Release|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|x86.ActiveCfg = Release|Any CPU - {18178142-A80D-424F-882D-DB0F787210BD}.Release|x86.Build.0 = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|x64.ActiveCfg = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|x64.Build.0 = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|x86.ActiveCfg = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Debug|x86.Build.0 = Debug|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|Any CPU.Build.0 = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|x64.ActiveCfg = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|x64.Build.0 = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|x86.ActiveCfg = Release|Any CPU - {44D2E280-8FCD-4FC1-9133-F61E344FD6A6}.Release|x86.Build.0 = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|Any CPU.Build.0 = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|x64.ActiveCfg = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|x64.Build.0 = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|x86.ActiveCfg = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Debug|x86.Build.0 = Debug|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|Any CPU.ActiveCfg = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|Any CPU.Build.0 = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|x64.ActiveCfg = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|x64.Build.0 = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|x86.ActiveCfg = Release|Any CPU - {609D5D1B-D904-4A31-B237-A04B49910166}.Release|x86.Build.0 = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|x64.ActiveCfg = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|x64.Build.0 = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|x86.ActiveCfg = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Debug|x86.Build.0 = Debug|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|Any CPU.Build.0 = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|x64.ActiveCfg = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|x64.Build.0 = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|x86.ActiveCfg = Release|Any CPU - {6BFF310F-9601-4E5D-BC80-118AC708D72A}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3BABBA82-B60D-45CE-9C56-8B833474DD3C} - EndGlobalSection -EndGlobal diff --git a/src/Spectre.Console.Analyzer.v3.ncrunchsolution b/src/Spectre.Console.Analyzer.v3.ncrunchsolution deleted file mode 100644 index 10420ac9..00000000 --- a/src/Spectre.Console.Analyzer.v3.ncrunchsolution +++ /dev/null @@ -1,6 +0,0 @@ - - - True - True - - \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs deleted file mode 100644 index 379103b0..00000000 --- a/src/Spectre.Console.Analyzer/Analyzers/FavorInstanceAnsiConsoleOverStaticAnalyzer.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace Spectre.Console.Analyzer; - -/// -/// Analyzer to suggest using available instances of AnsiConsole over the static methods. -/// -[DiagnosticAnalyzer(LanguageNames.CSharp)] -public class FavorInstanceAnsiConsoleOverStaticAnalyzer : SpectreAnalyzer -{ - private static readonly DiagnosticDescriptor _diagnosticDescriptor = - Descriptors.S1010_FavorInstanceAnsiConsoleOverStatic; - - /// - public override ImmutableArray SupportedDiagnostics => - ImmutableArray.Create(_diagnosticDescriptor); - - /// - protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext) - { - var ansiConsoleType = compilationStartContext.Compilation.GetTypeByMetadataName("Spectre.Console.AnsiConsole"); - if (ansiConsoleType == null) - { - return; - } - - compilationStartContext.RegisterOperationAction( - context => - { - // if this operation isn't an invocation against one of the System.Console methods - // defined in _methods then we can safely stop analyzing and return; - var invocationOperation = (IInvocationOperation)context.Operation; - if (!SymbolEqualityComparer.Default.Equals(invocationOperation.TargetMethod.ContainingType, ansiConsoleType)) - { - return; - } - - // if we aren't in a method then it might be too complex for us to handle. - if (!invocationOperation.Syntax.Ancestors().OfType().Any()) - { - return; - } - - if (!HasFieldAnsiConsole(invocationOperation.Syntax) && - !HasParameterAnsiConsole(invocationOperation.Syntax)) - { - return; - } - - var methodSymbol = invocationOperation.TargetMethod; - - var displayString = SymbolDisplay.ToDisplayString( - methodSymbol, - SymbolDisplayFormat.CSharpShortErrorMessageFormat - .WithParameterOptions(SymbolDisplayParameterOptions.None) - .WithGenericsOptions(SymbolDisplayGenericsOptions.None)); - - context.ReportDiagnostic( - Diagnostic.Create( - _diagnosticDescriptor, - invocationOperation.Syntax.GetLocation(), - displayString)); - }, OperationKind.Invocation); - } - - private static bool HasParameterAnsiConsole(SyntaxNode syntaxNode) - { - return syntaxNode - .Ancestors().OfType() - .First() - .ParameterList.Parameters - .Any(i => i.Type?.NormalizeWhitespace()?.ToString() == "IAnsiConsole"); - } - - private static bool HasFieldAnsiConsole(SyntaxNode syntaxNode) - { - var isStatic = syntaxNode - .Ancestors() - .OfType() - .First() - .Modifiers.Any(i => i.IsKind(SyntaxKind.StaticKeyword)); - - return syntaxNode - .Ancestors().OfType() - .First() - .Members - .OfType() - .Any(i => - i.Declaration.Type.NormalizeWhitespace().ToString() == "IAnsiConsole" && - (!isStatic ^ i.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.StaticKeyword)))); - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Analyzers/NoConcurrentLiveRenderablesAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/NoConcurrentLiveRenderablesAnalyzer.cs deleted file mode 100644 index bae73637..00000000 --- a/src/Spectre.Console.Analyzer/Analyzers/NoConcurrentLiveRenderablesAnalyzer.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace Spectre.Console.Analyzer; - -/// -/// Analyzer to detect calls to live renderables within a live renderable context. -/// -[DiagnosticAnalyzer(LanguageNames.CSharp)] -[Shared] -public class NoConcurrentLiveRenderablesAnalyzer : SpectreAnalyzer -{ - private static readonly DiagnosticDescriptor _diagnosticDescriptor = - Descriptors.S1020_AvoidConcurrentCallsToMultipleLiveRenderables; - - /// - public override ImmutableArray SupportedDiagnostics => - ImmutableArray.Create(_diagnosticDescriptor); - - /// - protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext) - { - var liveTypes = Constants.LiveRenderables - .Select(i => compilationStartContext.Compilation.GetTypeByMetadataName(i)) - .Where(i => i != null) - .ToImmutableArray(); - - if (liveTypes.Length == 0) - { - return; - } - - compilationStartContext.RegisterOperationAction( - context => - { - var invocationOperation = (IInvocationOperation)context.Operation; - var methodSymbol = invocationOperation.TargetMethod; - - const string StartMethod = "Start"; - if (methodSymbol.Name != StartMethod) - { - return; - } - - if (liveTypes.All(i => !SymbolEqualityComparer.Default.Equals(i, methodSymbol.ContainingType))) - { - return; - } - - var model = context.Operation.SemanticModel!; - var parentInvocations = invocationOperation - .Syntax.Ancestors() - .OfType() - .Select(i => model.GetOperation(i, context.CancellationToken)) - .OfType() - .ToList(); - - if (parentInvocations.All(parent => - parent.TargetMethod.Name != StartMethod || !liveTypes.Contains(parent.TargetMethod.ContainingType, SymbolEqualityComparer.Default))) - { - return; - } - - var displayString = SymbolDisplay.ToDisplayString( - methodSymbol, - SymbolDisplayFormat.CSharpShortErrorMessageFormat - .WithParameterOptions(SymbolDisplayParameterOptions.None) - .WithGenericsOptions(SymbolDisplayGenericsOptions.None)); - - context.ReportDiagnostic( - Diagnostic.Create( - _diagnosticDescriptor, - invocationOperation.Syntax.GetLocation(), - displayString)); - }, OperationKind.Invocation); - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Analyzers/NoPromptsDuringLiveRenderablesAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/NoPromptsDuringLiveRenderablesAnalyzer.cs deleted file mode 100644 index 749716ea..00000000 --- a/src/Spectre.Console.Analyzer/Analyzers/NoPromptsDuringLiveRenderablesAnalyzer.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace Spectre.Console.Analyzer; - -/// -/// Analyzer to detect calls to live renderables within a live renderable context. -/// -[DiagnosticAnalyzer(LanguageNames.CSharp)] -[Shared] -public class NoPromptsDuringLiveRenderablesAnalyzer : SpectreAnalyzer -{ - private static readonly DiagnosticDescriptor _diagnosticDescriptor = - Descriptors.S1021_AvoidPromptCallsDuringLiveRenderables; - - /// - public override ImmutableArray SupportedDiagnostics => - ImmutableArray.Create(_diagnosticDescriptor); - - /// - protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext) - { - var ansiConsoleType = compilationStartContext.Compilation.GetTypeByMetadataName("Spectre.Console.AnsiConsole"); - var ansiConsoleExtensionsType = compilationStartContext.Compilation.GetTypeByMetadataName("Spectre.Console.AnsiConsoleExtensions"); - - if (ansiConsoleType is null && ansiConsoleExtensionsType is null) - { - return; - } - - compilationStartContext.RegisterOperationAction( - context => - { - // if this operation isn't an invocation against one of the System.Console methods - // defined in _methods then we can safely stop analyzing and return; - var invocationOperation = (IInvocationOperation)context.Operation; - var methodSymbol = invocationOperation.TargetMethod; - - var promptMethods = ImmutableArray.Create("Ask", "Confirm", "Prompt"); - if (!promptMethods.Contains(methodSymbol.Name)) - { - return; - } - - if (!SymbolEqualityComparer.Default.Equals(methodSymbol.ContainingType, ansiConsoleType) && - !SymbolEqualityComparer.Default.Equals(methodSymbol.ContainingType, ansiConsoleExtensionsType)) - { - return; - } - - var model = context.Operation.SemanticModel!; - var parentInvocations = invocationOperation - .Syntax.Ancestors() - .OfType() - .Select(i => model.GetOperation(i, context.CancellationToken)) - .OfType() - .ToList(); - - var liveTypes = Constants.LiveRenderables - .Select(i => context.Compilation.GetTypeByMetadataName(i)) - .ToImmutableArray(); - - if (parentInvocations.All(parent => - parent.TargetMethod.Name != "Start" || - !liveTypes.Contains(parent.TargetMethod.ContainingType, SymbolEqualityComparer.Default))) - { - return; - } - - var displayString = SymbolDisplay.ToDisplayString( - methodSymbol, - SymbolDisplayFormat.CSharpShortErrorMessageFormat - .WithParameterOptions(SymbolDisplayParameterOptions.None) - .WithGenericsOptions(SymbolDisplayGenericsOptions.None)); - - context.ReportDiagnostic( - Diagnostic.Create( - _diagnosticDescriptor, - invocationOperation.Syntax.GetLocation(), - displayString)); - }, OperationKind.Invocation); - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Analyzers/SpectreAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/SpectreAnalyzer.cs deleted file mode 100644 index 54436c8a..00000000 --- a/src/Spectre.Console.Analyzer/Analyzers/SpectreAnalyzer.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace Spectre.Console.Analyzer; - -/// -/// Base class for Spectre analyzers. -/// -public abstract class SpectreAnalyzer : DiagnosticAnalyzer -{ - /// - public override void Initialize(AnalysisContext context) - { - context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics); - context.EnableConcurrentExecution(); - - context.RegisterCompilationStartAction(AnalyzeCompilation); - } - - /// - /// Analyze compilation. - /// - /// Compilation Start Analysis Context. - protected abstract void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext); -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzer.cs b/src/Spectre.Console.Analyzer/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzer.cs deleted file mode 100644 index 9f027393..00000000 --- a/src/Spectre.Console.Analyzer/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzer.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace Spectre.Console.Analyzer; - -/// -/// Analyzer to enforce the use of AnsiConsole over System.Console for known methods. -/// -[DiagnosticAnalyzer(LanguageNames.CSharp)] -public class UseSpectreInsteadOfSystemConsoleAnalyzer : SpectreAnalyzer -{ - private static readonly DiagnosticDescriptor _diagnosticDescriptor = - Descriptors.S1000_UseAnsiConsoleOverSystemConsole; - - private static readonly string[] _methods = { "WriteLine", "Write" }; - - /// - public override ImmutableArray SupportedDiagnostics => - ImmutableArray.Create(_diagnosticDescriptor); - - /// - protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext) - { - var systemConsoleType = compilationStartContext.Compilation.GetTypeByMetadataName("System.Console"); - var spectreConsoleType = compilationStartContext.Compilation.GetTypeByMetadataName("Spectre.Console.AnsiConsole"); - if (systemConsoleType == null || spectreConsoleType == null) - { - return; - } - - compilationStartContext.RegisterOperationAction( - context => - { - // if this operation isn't an invocation against one of the System.Console methods - // defined in _methods then we can safely stop analyzing and return; - var invocationOperation = (IInvocationOperation)context.Operation; - - var methodName = System.Array.Find(_methods, i => i.Equals(invocationOperation.TargetMethod.Name)); - if (methodName == null) - { - return; - } - - if (!SymbolEqualityComparer.Default.Equals(invocationOperation.TargetMethod.ContainingType, systemConsoleType)) - { - return; - } - - var methodSymbol = invocationOperation.TargetMethod; - - var displayString = SymbolDisplay.ToDisplayString( - methodSymbol, - SymbolDisplayFormat.CSharpShortErrorMessageFormat - .WithParameterOptions(SymbolDisplayParameterOptions.None) - .WithGenericsOptions(SymbolDisplayGenericsOptions.None)); - - context.ReportDiagnostic( - Diagnostic.Create( - _diagnosticDescriptor, - invocationOperation.Syntax.GetLocation(), - displayString)); - }, OperationKind.Invocation); - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Constants.cs b/src/Spectre.Console.Analyzer/Constants.cs deleted file mode 100644 index e6170716..00000000 --- a/src/Spectre.Console.Analyzer/Constants.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Spectre.Console.Analyzer; - -internal static class Constants -{ - internal const string StaticInstance = "AnsiConsole"; - internal const string SpectreConsole = "Spectre.Console"; - - internal static readonly string[] LiveRenderables = - { - "Spectre.Console.LiveDisplay", - "Spectre.Console.Progress", - "Spectre.Console.Status", - }; -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Descriptors.cs b/src/Spectre.Console.Analyzer/Descriptors.cs deleted file mode 100644 index 592a6df5..00000000 --- a/src/Spectre.Console.Analyzer/Descriptors.cs +++ /dev/null @@ -1,76 +0,0 @@ -using static Microsoft.CodeAnalysis.DiagnosticSeverity; -using static Spectre.Console.Analyzer.Descriptors.Category; - -namespace Spectre.Console.Analyzer; - -/// -/// Code analysis descriptors. -/// -public static class Descriptors -{ - internal enum Category - { - Usage, // 1xxx - } - - private static readonly ConcurrentDictionary _categoryMapping = new(); - - private static DiagnosticDescriptor Rule(string id, string title, Category category, DiagnosticSeverity defaultSeverity, string messageFormat, string? description = null) - { - var helpLink = $"https://spectreconsole.net/analyzer/rules/{id.ToLowerInvariant()}"; - const bool IsEnabledByDefault = true; - return new DiagnosticDescriptor( - id, - title, - messageFormat, - _categoryMapping.GetOrAdd(category, c => c.ToString()), - defaultSeverity, - IsEnabledByDefault, - description, - helpLink); - } - - /// - /// Gets definitions of diagnostics Spectre1000. - /// - public static DiagnosticDescriptor S1000_UseAnsiConsoleOverSystemConsole { get; } = - Rule( - "Spectre1000", - "Use AnsiConsole instead of System.Console", - Usage, - Warning, - "Use AnsiConsole instead of System.Console"); - - /// - /// Gets definitions of diagnostics Spectre1010. - /// - public static DiagnosticDescriptor S1010_FavorInstanceAnsiConsoleOverStatic { get; } = - Rule( - "Spectre1010", - "Favor the use of the instance of AnsiConsole over the static helper.", - Usage, - Info, - "Favor the use of the instance of AnsiConsole over the static helper."); - - /// - /// Gets definitions of diagnostics Spectre1020. - /// - public static DiagnosticDescriptor S1020_AvoidConcurrentCallsToMultipleLiveRenderables { get; } = - Rule( - "Spectre1020", - "Avoid calling other live renderables while a current renderable is running.", - Usage, - Warning, - "Avoid calling other live renderables while a current renderable is running."); - - /// - /// Gets definitions of diagnostics Spectre1020. - /// - public static DiagnosticDescriptor S1021_AvoidPromptCallsDuringLiveRenderables { get; } = - Rule( - "Spectre1021", - "Avoid prompting for input while a current renderable is running.", - Usage, - Warning, - "Avoid prompting for input while a current renderable is running."); -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Fixes/CodeActions/SwitchToAnsiConsoleAction.cs b/src/Spectre.Console.Analyzer/Fixes/CodeActions/SwitchToAnsiConsoleAction.cs deleted file mode 100644 index 922524fa..00000000 --- a/src/Spectre.Console.Analyzer/Fixes/CodeActions/SwitchToAnsiConsoleAction.cs +++ /dev/null @@ -1,202 +0,0 @@ -using Microsoft.CodeAnalysis.Editing; -using Microsoft.CodeAnalysis.Simplification; - -namespace Spectre.Console.Analyzer.CodeActions; - -/// -/// Code action to change calls to System.Console to AnsiConsole. -/// -public class SwitchToAnsiConsoleAction : CodeAction -{ - private readonly Document _document; - private readonly InvocationExpressionSyntax _originalInvocation; - - /// - /// Initializes a new instance of the class. - /// - /// Document to change. - /// The method to change. - /// Title of the fix. - public SwitchToAnsiConsoleAction(Document document, InvocationExpressionSyntax originalInvocation, string title) - { - _document = document; - _originalInvocation = originalInvocation; - Title = title; - } - - /// - public override string Title { get; } - - /// - public override string EquivalenceKey => Title; - - /// - protected override async Task GetChangedDocumentAsync(CancellationToken cancellationToken) - { - var editor = await DocumentEditor.CreateAsync(_document, cancellationToken).ConfigureAwait(false); - var compilation = editor.SemanticModel.Compilation; - - var operation = editor.SemanticModel.GetOperation(_originalInvocation, cancellationToken) as IInvocationOperation; - if (operation == null) - { - return _document; - } - - // If there is an IAnsiConsole passed into the method then we'll use it. - // otherwise we'll check for a field level instance. - // if neither of those exist we'll fall back to the static param. - var spectreConsoleSymbol = compilation.GetTypeByMetadataName("Spectre.Console.AnsiConsole"); - var iansiConsoleSymbol = compilation.GetTypeByMetadataName("Spectre.Console.IAnsiConsole"); - - ISymbol? accessibleConsoleSymbol = spectreConsoleSymbol; - if (iansiConsoleSymbol != null) - { - var isInStaticContext = IsInStaticContext(operation, cancellationToken, out var parentStaticMemberStartPosition); - - foreach (var symbol in editor.SemanticModel.LookupSymbols(operation.Syntax.GetLocation().SourceSpan.Start)) - { - // LookupSymbols check the accessibility of the symbol, but it can - // suggest instance members when the current context is static. - var symbolType = symbol switch - { - IParameterSymbol parameter => parameter.Type, - IFieldSymbol field when !isInStaticContext || field.IsStatic => field.Type, - IPropertySymbol { GetMethod: not null } property when !isInStaticContext || property.IsStatic => property.Type, - ILocalSymbol local => local.Type, - _ => null, - }; - - // Locals can be returned even if there are not valid in the current context. For instance, - // it can return locals declared after the current location. Or it can return locals that - // should not be accessible in a static local function. - // - // void Sample() - // { - // int local = 0; - // static void LocalFunction() => local; <-- local is invalid here but LookupSymbols suggests it - // } - // - // Parameters from the ancestor methods or local functions are also returned even if the operation is in a static local function. - if (symbol.Kind is SymbolKind.Local or SymbolKind.Parameter) - { - var localPosition = symbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax(cancellationToken).GetLocation().SourceSpan.Start; - - // The local is not part of the source tree - if (localPosition == null) - { - break; - } - - // The local is declared after the current expression - if (localPosition > _originalInvocation.Span.Start) - { - break; - } - - // The local is declared outside the static local function - if (isInStaticContext && localPosition < parentStaticMemberStartPosition) - { - break; - } - } - - if (IsOrImplementSymbol(symbolType, iansiConsoleSymbol)) - { - accessibleConsoleSymbol = symbol; - break; - } - } - } - - if (accessibleConsoleSymbol == null) - { - return _document; - } - - // Replace the original invocation - var generator = editor.Generator; - var consoleExpression = accessibleConsoleSymbol switch - { - ITypeSymbol typeSymbol => generator.TypeExpression(typeSymbol, addImport: true).WithAdditionalAnnotations(Simplifier.AddImportsAnnotation), - _ => generator.IdentifierName(accessibleConsoleSymbol.Name), - }; - - var newExpression = generator.InvocationExpression(generator.MemberAccessExpression(consoleExpression, operation.TargetMethod.Name), _originalInvocation.ArgumentList.Arguments) - .WithLeadingTrivia(_originalInvocation.GetLeadingTrivia()) - .WithTrailingTrivia(_originalInvocation.GetTrailingTrivia()); - - editor.ReplaceNode(_originalInvocation, newExpression); - - return editor.GetChangedDocument(); - } - - private static bool IsOrImplementSymbol(ITypeSymbol? symbol, ITypeSymbol interfaceSymbol) - { - if (symbol == null) - { - return false; - } - - if (SymbolEqualityComparer.Default.Equals(symbol, interfaceSymbol)) - { - return true; - } - - foreach (var iface in symbol.AllInterfaces) - { - if (SymbolEqualityComparer.Default.Equals(iface, interfaceSymbol)) - { - return true; - } - } - - return false; - } - - private static bool IsInStaticContext(IOperation operation, CancellationToken cancellationToken, out int parentStaticMemberStartPosition) - { - // Local functions can be nested, and an instance local function can be declared - // in a static local function. So, you need to continue to check ancestors when a - // local function is not static. - foreach (var member in operation.Syntax.Ancestors()) - { - if (member is LocalFunctionStatementSyntax localFunction) - { - var symbol = operation.SemanticModel!.GetDeclaredSymbol(localFunction, cancellationToken); - if (symbol != null && symbol.IsStatic) - { - parentStaticMemberStartPosition = localFunction.GetLocation().SourceSpan.Start; - return true; - } - } - else if (member is LambdaExpressionSyntax lambdaExpression) - { - var symbol = operation.SemanticModel!.GetSymbolInfo(lambdaExpression, cancellationToken).Symbol; - if (symbol != null && symbol.IsStatic) - { - parentStaticMemberStartPosition = lambdaExpression.GetLocation().SourceSpan.Start; - return true; - } - } - else if (member is AnonymousMethodExpressionSyntax anonymousMethod) - { - var symbol = operation.SemanticModel!.GetSymbolInfo(anonymousMethod, cancellationToken).Symbol; - if (symbol != null && symbol.IsStatic) - { - parentStaticMemberStartPosition = anonymousMethod.GetLocation().SourceSpan.Start; - return true; - } - } - else if (member is MethodDeclarationSyntax methodDeclaration) - { - parentStaticMemberStartPosition = methodDeclaration.GetLocation().SourceSpan.Start; - - var symbol = operation.SemanticModel!.GetDeclaredSymbol(methodDeclaration, cancellationToken); - return symbol != null && symbol.IsStatic; - } - } - - parentStaticMemberStartPosition = -1; - return false; - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Fixes/FixProviders/StaticAnsiConsoleToInstanceFix.cs b/src/Spectre.Console.Analyzer/Fixes/FixProviders/StaticAnsiConsoleToInstanceFix.cs deleted file mode 100644 index d930d5cc..00000000 --- a/src/Spectre.Console.Analyzer/Fixes/FixProviders/StaticAnsiConsoleToInstanceFix.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Spectre.Console.Analyzer.FixProviders; - -/// -/// Fix provider to change System.Console calls to AnsiConsole calls. -/// -[ExportCodeFixProvider(LanguageNames.CSharp)] -[Shared] -public class StaticAnsiConsoleToInstanceFix : CodeFixProvider -{ - /// - public sealed override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create( - Descriptors.S1010_FavorInstanceAnsiConsoleOverStatic.Id); - - /// - public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; - - /// - public override async Task RegisterCodeFixesAsync(CodeFixContext context) - { - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - if (root != null) - { - var methodDeclaration = root.FindNode(context.Span, getInnermostNodeForTie: true).FirstAncestorOrSelf(); - if (methodDeclaration != null) - { - context.RegisterCodeFix( - new SwitchToAnsiConsoleAction( - context.Document, - methodDeclaration, - "Convert static AnsiConsole calls to local instance."), - context.Diagnostics); - } - } - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Fixes/FixProviders/SystemConsoleToAnsiConsoleFix.cs b/src/Spectre.Console.Analyzer/Fixes/FixProviders/SystemConsoleToAnsiConsoleFix.cs deleted file mode 100644 index a90d99da..00000000 --- a/src/Spectre.Console.Analyzer/Fixes/FixProviders/SystemConsoleToAnsiConsoleFix.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Spectre.Console.Analyzer.FixProviders; - -/// -/// Fix provider to change System.Console calls to AnsiConsole calls. -/// -[ExportCodeFixProvider(LanguageNames.CSharp)] -[Shared] -public class SystemConsoleToAnsiConsoleFix : CodeFixProvider -{ - /// - public sealed override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create( - Descriptors.S1000_UseAnsiConsoleOverSystemConsole.Id); - - /// - public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; - - /// - public override async Task RegisterCodeFixesAsync(CodeFixContext context) - { - var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); - if (root != null) - { - var methodDeclaration = root.FindNode(context.Span).FirstAncestorOrSelf(); - if (methodDeclaration != null) - { - context.RegisterCodeFix( - new SwitchToAnsiConsoleAction( - context.Document, - methodDeclaration, - "Convert static call to AnsiConsole to Spectre.Console.AnsiConsole"), - context.Diagnostics); - } - } - } -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Fixes/Syntax.cs b/src/Spectre.Console.Analyzer/Fixes/Syntax.cs deleted file mode 100644 index 6cedc688..00000000 --- a/src/Spectre.Console.Analyzer/Fixes/Syntax.cs +++ /dev/null @@ -1,8 +0,0 @@ -using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; - -namespace Spectre.Console.Analyzer; - -internal static class Syntax -{ - public static readonly UsingDirectiveSyntax SpectreUsing = UsingDirective(QualifiedName(IdentifierName("Spectre"), IdentifierName("Console"))); -} \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Properties/Usings.cs b/src/Spectre.Console.Analyzer/Properties/Usings.cs deleted file mode 100644 index b48e0f2d..00000000 --- a/src/Spectre.Console.Analyzer/Properties/Usings.cs +++ /dev/null @@ -1,14 +0,0 @@ -global using System.Collections.Concurrent; -global using System.Collections.Immutable; -global using System.Composition; -global using System.Linq; -global using System.Threading; -global using System.Threading.Tasks; -global using Microsoft.CodeAnalysis; -global using Microsoft.CodeAnalysis.CodeActions; -global using Microsoft.CodeAnalysis.CodeFixes; -global using Microsoft.CodeAnalysis.CSharp; -global using Microsoft.CodeAnalysis.CSharp.Syntax; -global using Microsoft.CodeAnalysis.Diagnostics; -global using Microsoft.CodeAnalysis.Operations; -global using Spectre.Console.Analyzer.CodeActions; \ No newline at end of file diff --git a/src/Spectre.Console.Analyzer/Spectre.Console.Analyzer.csproj b/src/Spectre.Console.Analyzer/Spectre.Console.Analyzer.csproj deleted file mode 100644 index c25a8e1f..00000000 --- a/src/Spectre.Console.Analyzer/Spectre.Console.Analyzer.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - Best practice analyzers for Spectre.Console. - netstandard2.0 - true - true - false - enable - true - true - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Spectre.Console.Cli/CommandContext.cs b/src/Spectre.Console.Cli/CommandContext.cs index c175ec4b..89a2876b 100644 --- a/src/Spectre.Console.Cli/CommandContext.cs +++ b/src/Spectre.Console.Cli/CommandContext.cs @@ -13,6 +13,11 @@ public sealed class CommandContext /// public IRemainingArguments Remaining { get; } + /// + /// Gets all the arguments that were passed to the applicaton. + /// + public IReadOnlyList Arguments { get; } + /// /// Gets the name of the command. /// @@ -32,11 +37,17 @@ public sealed class CommandContext /// /// Initializes a new instance of the class. /// + /// All arguments that were passed to the application. /// The remaining arguments. /// The command name. /// The command data. - public CommandContext(IRemainingArguments remaining, string name, object? data) + public CommandContext( + IEnumerable arguments, + IRemainingArguments remaining, + string name, + object? data) { + Arguments = arguments.ToSafeReadOnlyList(); Remaining = remaining ?? throw new System.ArgumentNullException(nameof(remaining)); Name = name ?? throw new System.ArgumentNullException(nameof(name)); Data = data; diff --git a/src/Spectre.Console.Cli/ConfiguratorExtensions.cs b/src/Spectre.Console.Cli/ConfiguratorExtensions.cs index c0f1cd81..80895e30 100644 --- a/src/Spectre.Console.Cli/ConfiguratorExtensions.cs +++ b/src/Spectre.Console.Cli/ConfiguratorExtensions.cs @@ -82,7 +82,7 @@ public static class ConfiguratorExtensions } /// - /// Overrides the auto-detected version of the application. + /// Sets the version of the application. /// /// The configurator. /// The version of application. @@ -98,6 +98,25 @@ public static class ConfiguratorExtensions return configurator; } + /// + /// Uses the version retrieved from the + /// as the application's version. + /// + /// The configurator. + /// A configurator that can be used to configure the application further. + public static IConfigurator UseAssemblyInformationalVersion(this IConfigurator configurator) + { + if (configurator == null) + { + throw new ArgumentNullException(nameof(configurator)); + } + + configurator.Settings.ApplicationVersion = + VersionHelper.GetVersion(Assembly.GetEntryAssembly()); + + return configurator; + } + /// /// Hides the DEFAULT column that lists default values coming from the /// in the options help text. @@ -324,11 +343,16 @@ public static class ConfiguratorExtensions /// The delegate to execute as part of command execution. /// A command configurator that can be used to configure the command further. public static ICommandConfigurator AddDelegate( - this IConfigurator configurator, + this IConfigurator? configurator, string name, Func func) - where TSettings : CommandSettings + where TSettings : CommandSettings { + if (typeof(TSettings).IsAbstract) + { + AddDelegate(configurator as IConfigurator, name, func); + } + if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); diff --git a/src/Spectre.Console.Cli/Help/HelpProvider.cs b/src/Spectre.Console.Cli/Help/HelpProvider.cs index 222b3d4a..ca18f0fb 100644 --- a/src/Spectre.Console.Cli/Help/HelpProvider.cs +++ b/src/Spectre.Console.Cli/Help/HelpProvider.cs @@ -41,7 +41,7 @@ public class HelpProvider : IHelpProvider public bool Required { get; } public string? Description { get; } - public HelpArgument(string name, int position, bool required, string? description) + private HelpArgument(string name, int position, bool required, string? description) { Name = name; Position = position; @@ -68,7 +68,7 @@ public class HelpProvider : IHelpProvider public string? Description { get; } public object? DefaultValue { get; } - public HelpOption(string? @short, string? @long, string? @value, bool? valueIsOptional, string? description, object? defaultValue) + private HelpOption(string? @short, string? @long, string? @value, bool? valueIsOptional, string? description, object? defaultValue) { Short = @short; Long = @long; @@ -78,17 +78,27 @@ public class HelpProvider : IHelpProvider DefaultValue = defaultValue; } - public static IReadOnlyList Get(ICommandInfo? command, HelpProviderResources resources) + public static IReadOnlyList Get( + ICommandModel model, + ICommandInfo? command, + HelpProviderResources resources) { - var parameters = new List(); - parameters.Add(new HelpOption("h", "help", null, null, resources.PrintHelpDescription, null)); + var parameters = new List + { + new HelpOption("h", "help", null, null, resources.PrintHelpDescription, null), + }; // Version information applies to the entire application // Include the "-v" option in the help when at the root of the command line application // Don't allow the "-v" option if users have specified one or more sub-commands - if ((command == null || command?.Parent == null) && !(command?.IsBranch ?? false)) + if ((command?.Parent == null) && !(command?.IsBranch ?? false)) { - parameters.Add(new HelpOption("v", "version", null, null, resources.PrintVersionDescription, null)); + // Only show the version command if there is an + // application version set. + if (model.ApplicationVersion != null) + { + parameters.Add(new HelpOption("v", "version", null, null, resources.PrintVersionDescription, null)); + } } parameters.AddRange(command?.Parameters.OfType().Where(o => !o.IsHidden).Select(o => @@ -101,11 +111,6 @@ public class HelpProvider : IHelpProvider } } - internal Composer NewComposer() - { - return new Composer(RenderMarkupInline); - } - /// /// Initializes a new instance of the class. /// @@ -383,7 +388,7 @@ public class HelpProvider : IHelpProvider public virtual IEnumerable GetOptions(ICommandModel model, ICommandInfo? command) { // Collect all options into a single structure. - var parameters = HelpOption.Get(command, resources); + var parameters = HelpOption.Get(model, command, resources); if (parameters.Count == 0) { return Array.Empty(); @@ -420,7 +425,7 @@ public class HelpProvider : IHelpProvider if (defaultValueColumn) { - columns.Add(GetOptionDefaultValue(option.DefaultValue)); + columns.Add(GetDefaultValueForOption(option.DefaultValue)); } columns.Add(NewComposer().Text(option.Description?.TrimEnd('.') ?? " ")); @@ -433,60 +438,6 @@ public class HelpProvider : IHelpProvider return result; } - private IRenderable GetOptionParts(HelpOption option) - { - var composer = NewComposer(); - - if (option.Short != null) - { - composer.Text("-").Text(option.Short); - if (option.Long != null) - { - composer.Text(", "); - } - } - else - { - composer.Text(" "); - if (option.Long != null) - { - composer.Text(" "); - } - } - - if (option.Long != null) - { - composer.Text("--").Text(option.Long); - } - - if (option.Value != null) - { - composer.Text(" "); - if (option.ValueIsOptional ?? false) - { - composer.Style(helpStyles?.Options?.OptionalOption ?? Style.Plain, $"[{option.Value}]"); - } - else - { - composer.Style(helpStyles?.Options?.RequiredOption ?? Style.Plain, $"<{option.Value}>"); - } - } - - return composer; - } - - private IRenderable GetOptionDefaultValue(object? defaultValue) - { - return defaultValue switch - { - null => NewComposer().Text(" "), - "" => NewComposer().Text(" "), - Array { Length: 0 } => NewComposer().Text(" "), - Array array => NewComposer().Join(", ", array.Cast().Select(o => NewComposer().Style(helpStyles?.Options?.DefaultValue ?? Style.Plain, o.ToString() ?? string.Empty))), - _ => NewComposer().Style(helpStyles?.Options?.DefaultValue ?? Style.Plain, defaultValue?.ToString() ?? string.Empty), - }; - } - /// /// Gets the commands section of the help information. /// @@ -556,4 +507,63 @@ public class HelpProvider : IHelpProvider { yield break; } + + private Composer NewComposer() + { + return new Composer(RenderMarkupInline); + } + + private IRenderable GetOptionParts(HelpOption option) + { + var composer = NewComposer(); + + if (option.Short != null) + { + composer.Text("-").Text(option.Short); + if (option.Long != null) + { + composer.Text(", "); + } + } + else + { + composer.Text(" "); + if (option.Long != null) + { + composer.Text(" "); + } + } + + if (option.Long != null) + { + composer.Text("--").Text(option.Long); + } + + if (option.Value != null) + { + composer.Text(" "); + if (option.ValueIsOptional ?? false) + { + composer.Style(helpStyles?.Options?.OptionalOption ?? Style.Plain, $"[{option.Value}]"); + } + else + { + composer.Style(helpStyles?.Options?.RequiredOption ?? Style.Plain, $"<{option.Value}>"); + } + } + + return composer; + } + + private Composer GetDefaultValueForOption(object? defaultValue) + { + return defaultValue switch + { + null => NewComposer().Text(" "), + "" => NewComposer().Text(" "), + Array { Length: 0 } => NewComposer().Text(" "), + Array array => NewComposer().Join(", ", array.Cast().Select(o => NewComposer().Style(helpStyles?.Options?.DefaultValue ?? Style.Plain, o.ToString() ?? string.Empty))), + _ => NewComposer().Style(helpStyles?.Options?.DefaultValue ?? Style.Plain, defaultValue?.ToString() ?? string.Empty), + }; + } } \ No newline at end of file diff --git a/src/Spectre.Console.Cli/Help/ICommandModel.cs b/src/Spectre.Console.Cli/Help/ICommandModel.cs index e7fe5f72..2872bf88 100644 --- a/src/Spectre.Console.Cli/Help/ICommandModel.cs +++ b/src/Spectre.Console.Cli/Help/ICommandModel.cs @@ -9,4 +9,9 @@ public interface ICommandModel : ICommandContainer /// Gets the name of the application. /// string ApplicationName { get; } + + /// + /// Gets the version of the application. + /// + string? ApplicationVersion { get; } } diff --git a/src/Spectre.Console.Cli/IRemainingArguments.cs b/src/Spectre.Console.Cli/IRemainingArguments.cs index 8127416f..acd3b605 100644 --- a/src/Spectre.Console.Cli/IRemainingArguments.cs +++ b/src/Spectre.Console.Cli/IRemainingArguments.cs @@ -12,6 +12,7 @@ public interface IRemainingArguments /// /// Gets the raw, non-parsed remaining arguments. + /// This is normally everything after the `--` delimiter. /// IReadOnlyList Raw { get; } } \ No newline at end of file diff --git a/src/Spectre.Console.Cli/Internal/CommandExecutor.cs b/src/Spectre.Console.Cli/Internal/CommandExecutor.cs index 0c34da5b..22eeb208 100644 --- a/src/Spectre.Console.Cli/Internal/CommandExecutor.cs +++ b/src/Spectre.Console.Cli/Internal/CommandExecutor.cs @@ -17,7 +17,7 @@ internal sealed class CommandExecutor throw new ArgumentNullException(nameof(configuration)); } - args ??= new List(); + var arguments = args.ToSafeReadOnlyList(); _registrar.RegisterInstance(typeof(IConfiguration), configuration); _registrar.RegisterLazy(typeof(IAnsiConsole), () => configuration.Settings.Console.GetConsole()); @@ -31,7 +31,7 @@ internal sealed class CommandExecutor if (model.DefaultCommand == null) { // Got at least one argument? - var firstArgument = args.FirstOrDefault(); + var firstArgument = arguments.FirstOrDefault(); if (firstArgument != null) { // Asking for version? Kind of a hack, but it's alright. @@ -39,15 +39,18 @@ internal sealed class CommandExecutor if (firstArgument.Equals("--version", StringComparison.OrdinalIgnoreCase) || firstArgument.Equals("-v", StringComparison.OrdinalIgnoreCase)) { - var console = configuration.Settings.Console.GetConsole(); - console.WriteLine(ResolveApplicationVersion(configuration)); - return 0; + if (configuration.Settings.ApplicationVersion != null) + { + var console = configuration.Settings.Console.GetConsole(); + console.MarkupLine(configuration.Settings.ApplicationVersion); + return 0; + } } } } // Parse and map the model against the arguments. - var parsedResult = ParseCommandLineArguments(model, configuration.Settings, args); + var parsedResult = ParseCommandLineArguments(model, configuration.Settings, arguments); // Register the arguments with the container. _registrar.RegisterInstance(typeof(CommandTreeParserResult), parsedResult); @@ -79,7 +82,7 @@ internal sealed class CommandExecutor } // Is this the default and is it called without arguments when there are required arguments? - if (leaf.Command.IsDefaultCommand && args.Count() == 0 && leaf.Command.Parameters.Any(p => p.Required)) + if (leaf.Command.IsDefaultCommand && arguments.Count == 0 && leaf.Command.Parameters.Any(p => p.Required)) { // Display help for default command. configuration.Settings.Console.SafeRender(helpProvider.Write(model, leaf.Command)); @@ -87,15 +90,18 @@ internal sealed class CommandExecutor } // Create the content. - var context = new CommandContext(parsedResult.Remaining, leaf.Command.Name, leaf.Command.Data); + var context = new CommandContext( + arguments, + parsedResult.Remaining, + leaf.Command.Name, + leaf.Command.Data); // Execute the command tree. return await Execute(leaf, parsedResult.Tree, context, resolver, configuration).ConfigureAwait(false); } } -#pragma warning disable CS8603 // Possible null reference return. - private CommandTreeParserResult ParseCommandLineArguments(CommandModel model, CommandAppSettings settings, IEnumerable args) + private CommandTreeParserResult ParseCommandLineArguments(CommandModel model, CommandAppSettings settings, IReadOnlyList args) { var parser = new CommandTreeParser(model, settings.CaseSensitivity, settings.ParsingMode, settings.ConvertFlagsToRemainingArguments); @@ -103,7 +109,7 @@ internal sealed class CommandExecutor var tokenizerResult = CommandTreeTokenizer.Tokenize(args); var parsedResult = parser.Parse(parserContext, tokenizerResult); - var lastParsedLeaf = parsedResult?.Tree?.GetLeafCommand(); + var lastParsedLeaf = parsedResult.Tree?.GetLeafCommand(); var lastParsedCommand = lastParsedLeaf?.Command; if (lastParsedLeaf != null && lastParsedCommand != null && lastParsedCommand.IsBranch && !lastParsedLeaf.ShowHelp && @@ -122,14 +128,6 @@ internal sealed class CommandExecutor return parsedResult; } -#pragma warning restore CS8603 // Possible null reference return. - - private static string ResolveApplicationVersion(IConfiguration configuration) - { - return - configuration.Settings.ApplicationVersion ?? // potential override - VersionHelper.GetVersion(Assembly.GetEntryAssembly()); - } private static async Task Execute( CommandTree leaf, diff --git a/src/Spectre.Console.Cli/Internal/Commands/ExplainCommand.cs b/src/Spectre.Console.Cli/Internal/Commands/ExplainCommand.cs index 832872d0..c2b1e594 100644 --- a/src/Spectre.Console.Cli/Internal/Commands/ExplainCommand.cs +++ b/src/Spectre.Console.Cli/Internal/Commands/ExplainCommand.cs @@ -15,23 +15,16 @@ internal sealed class ExplainCommand : Command public sealed class Settings : CommandSettings { - public Settings(string[]? commands, bool? detailed, bool includeHidden) - { - Commands = commands; - Detailed = detailed; - IncludeHidden = includeHidden; - } - [CommandArgument(0, "[command]")] - public string[]? Commands { get; } + public string[]? Commands { get; set; } [Description("Include detailed information about the commands.")] [CommandOption("-d|--detailed")] - public bool? Detailed { get; } + public bool? Detailed { get; set; } [Description("Include hidden commands and options.")] [CommandOption("--hidden")] - public bool IncludeHidden { get; } + public bool IncludeHidden { get; set; } } public override int Execute(CommandContext context, Settings settings) diff --git a/src/Spectre.Console.Cli/Internal/Configuration/TemplateParser.cs b/src/Spectre.Console.Cli/Internal/Configuration/TemplateParser.cs index d7eef9b0..12594728 100644 --- a/src/Spectre.Console.Cli/Internal/Configuration/TemplateParser.cs +++ b/src/Spectre.Console.Cli/Internal/Configuration/TemplateParser.cs @@ -86,7 +86,7 @@ internal static class TemplateParser foreach (var character in token.Value) { - if (!char.IsLetterOrDigit(character) && character != '-' && character != '_') + if (!char.IsLetterOrDigit(character) && character != '-' && character != '_' && character != '?') { throw CommandTemplateException.InvalidCharacterInOptionName(template, token, character); } diff --git a/src/Spectre.Console.Cli/Internal/Extensions/EnumerableExtensions.cs b/src/Spectre.Console.Cli/Internal/Extensions/EnumerableExtensions.cs new file mode 100644 index 00000000..ea775cff --- /dev/null +++ b/src/Spectre.Console.Cli/Internal/Extensions/EnumerableExtensions.cs @@ -0,0 +1,14 @@ +namespace Spectre.Console.Cli; + +internal static class EnumerableExtensions +{ + public static IReadOnlyList ToSafeReadOnlyList(this IEnumerable source) + { + return source switch + { + null => new List(), + IReadOnlyList list => list, + _ => source.ToList(), + }; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Cli/Internal/Modelling/CommandModel.cs b/src/Spectre.Console.Cli/Internal/Modelling/CommandModel.cs index 3da02da4..721960bd 100644 --- a/src/Spectre.Console.Cli/Internal/Modelling/CommandModel.cs +++ b/src/Spectre.Console.Cli/Internal/Modelling/CommandModel.cs @@ -3,6 +3,7 @@ namespace Spectre.Console.Cli; internal sealed class CommandModel : ICommandContainer, ICommandModel { public string? ApplicationName { get; } + public string? ApplicationVersion { get; } public ParsingMode ParsingMode { get; } public IList Commands { get; } public IList Examples { get; } @@ -20,9 +21,10 @@ internal sealed class CommandModel : ICommandContainer, ICommandModel IEnumerable examples) { ApplicationName = settings.ApplicationName; + ApplicationVersion = settings.ApplicationVersion; ParsingMode = settings.ParsingMode; - Commands = new List(commands ?? Array.Empty()); - Examples = new List(examples ?? Array.Empty()); + Commands = new List(commands); + Examples = new List(examples); } /// diff --git a/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeParser.cs b/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeParser.cs index 54152a0e..d985dcbd 100644 --- a/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeParser.cs +++ b/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeParser.cs @@ -21,7 +21,7 @@ internal class CommandTreeParser { _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _parsingMode = parsingMode ?? _configuration.ParsingMode; - _help = new CommandOptionAttribute("-h|--help"); + _help = new CommandOptionAttribute("-?|-h|--help"); _convertFlagsToRemainingArguments = convertFlagsToRemainingArguments ?? false; CaseSensitivity = caseSensitivity; @@ -302,11 +302,7 @@ internal class CommandTreeParser var valueToken = stream.Peek(); if (valueToken?.TokenKind == CommandTreeToken.Kind.String) { - var parseValue = true; - if (token.TokenKind == CommandTreeToken.Kind.ShortOption && token.IsGrouped) - { - parseValue = false; - } + bool parseValue = token is not { TokenKind: CommandTreeToken.Kind.ShortOption, IsGrouped: true }; if (context.State == State.Normal && parseValue) { @@ -333,7 +329,7 @@ internal class CommandTreeParser { value = stream.Consume(CommandTreeToken.Kind.String)?.Value; - context.AddRemainingArgument(token.Value, value); + context.AddRemainingArgument(token.Representation, value); // Prevent the option and it's non-boolean value from being added to // mapped parameters (otherwise an exception will be thrown later @@ -364,14 +360,14 @@ internal class CommandTreeParser // In relaxed parsing mode? if (context.ParsingMode == ParsingMode.Relaxed) { - context.AddRemainingArgument(token.Value, value); + context.AddRemainingArgument(token.Representation, value); } } } } else { - context.AddRemainingArgument(token.Value, parseValue ? valueToken.Value : null); + context.AddRemainingArgument(token.Representation, parseValue ? valueToken.Value : null); } } else @@ -379,7 +375,7 @@ internal class CommandTreeParser if (parameter == null && // Only add tokens which have not been matched to a command parameter (context.State == State.Remaining || context.ParsingMode == ParsingMode.Relaxed)) { - context.AddRemainingArgument(token.Value, null); + context.AddRemainingArgument(token.Representation, null); } } diff --git a/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeTokenizer.cs b/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeTokenizer.cs index 78f01ebb..840b072c 100644 --- a/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeTokenizer.cs +++ b/src/Spectre.Console.Cli/Internal/Parsing/CommandTreeTokenizer.cs @@ -171,12 +171,12 @@ internal static class CommandTreeTokenizer } // Encountered a separator? - if (current == '=' || current == ':') + if (current is '=' or ':') { break; } - if (char.IsLetter(current)) + if (char.IsLetter(current) || current is '?') { context.AddRemaining(current); reader.Read(); // Consume @@ -184,7 +184,7 @@ internal static class CommandTreeTokenizer var value = current.ToString(CultureInfo.InvariantCulture); result.Add(result.Count == 0 ? new CommandTreeToken(CommandTreeToken.Kind.ShortOption, position, value, $"-{value}") - : new CommandTreeToken(CommandTreeToken.Kind.ShortOption, position + result.Count, value, value)); + : new CommandTreeToken(CommandTreeToken.Kind.ShortOption, position + result.Count, value, $"-{value}")); } else if (result.Count == 0 && char.IsDigit(current)) { diff --git a/src/Spectre.Console.Cli/Resources/HelpProvider.es.resx b/src/Spectre.Console.Cli/Resources/HelpProvider.es.resx new file mode 100644 index 00000000..0f710f5f --- /dev/null +++ b/src/Spectre.Console.Cli/Resources/HelpProvider.es.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + ARGUMENTOS + + + COMANDO + + + COMMANDOS + + + POR DEFECTO + + + DESCRIPCION + + + EJEMPLOS + + + OPCIONES + + + Imprime información de ayuda + + + Imprime información de versión + + + USO + + \ No newline at end of file diff --git a/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj b/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj index 9d857317..4eab3855 100644 --- a/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj +++ b/src/Spectre.Console.Cli/Spectre.Console.Cli.csproj @@ -2,19 +2,15 @@ net8.0;net7.0;net6.0;netstandard2.0 - enable true - SA1633 - - + + - - - + @@ -23,9 +19,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj b/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj deleted file mode 100644 index e74335a6..00000000 --- a/src/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net8.0;net7.0;net6.0 - enable - true - A library that extends Spectre.Console with ImageSharp superpowers. - - - - - - - - - - - - - - - - diff --git a/src/Spectre.Console.Json/Spectre.Console.Json.csproj b/src/Spectre.Console.Json/Spectre.Console.Json.csproj deleted file mode 100644 index 03e23d98..00000000 --- a/src/Spectre.Console.Json/Spectre.Console.Json.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net8.0;net7.0;net6.0;netstandard2.0 - enable - true - true - A library that extends Spectre.Console with JSON superpowers. - - - - - - - - - - - - - - - - - - diff --git a/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj b/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj index 3dd0bacd..4b65da97 100644 --- a/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj +++ b/src/Spectre.Console.Testing/Spectre.Console.Testing.csproj @@ -3,21 +3,15 @@ net8.0;net7.0;net6.0 false - enable true Contains testing utilities for Spectre.Console. - + - - - - - diff --git a/src/Spectre.Console.sln b/src/Spectre.Console.sln index 5b772532..756d7c13 100644 --- a/src/Spectre.Console.sln +++ b/src/Spectre.Console.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 17.1.32414.318 MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console", "Spectre.Console\Spectre.Console.csproj", "{80DCBEF3-99D6-46C0-9C5B-42B4534D9113}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{20595AD4-8D75-4AF8-B6BC-9C38C160423F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{20595AD4-8D75-4AF8-B6BC-9C38C160423F}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig Directory.Build.props = Directory.Build.props @@ -13,28 +13,34 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{20595AD4-8 ..\dotnet-tools.json = ..\dotnet-tools.json ..\global.json = ..\global.json stylecop.json = stylecop.json + Directory.Packages.props = Directory.Packages.props EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub", "GitHub", "{C3E2CB5C-1517-4C75-B59A-93D4E22BEC8D}" ProjectSection(SolutionItems) = preProject ..\.github\workflows\ci.yaml = ..\.github\workflows\ci.yaml - ..\.github\workflows\docs.yaml = ..\.github\workflows\docs.yaml ..\.github\workflows\publish.yaml = ..\.github\workflows\publish.yaml EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{0EFE694D-0770-4E71-BF4E-EC2B41362F79}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.ImageSharp", "Extensions\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj", "{0EFE694D-0770-4E71-BF4E-EC2B41362F79}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Testing", "Spectre.Console.Testing\Spectre.Console.Testing.csproj", "{7D5F6704-8249-46DD-906C-9E66419F215F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{E0E45070-123C-4A4D-AA98-2A780308876C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{E0E45070-123C-4A4D-AA98-2A780308876C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Tests", "..\test\Spectre.Console.Tests\Spectre.Console.Tests.csproj", "{60A4CADD-2B3D-48ED-89C0-1637A1F111AE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Tests", "Tests\Spectre.Console.Tests\Spectre.Console.Tests.csproj", "{60A4CADD-2B3D-48ED-89C0-1637A1F111AE}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Cli", "Spectre.Console.Cli\Spectre.Console.Cli.csproj", "{1B67B74F-1243-4381-9A2B-86EA66D135C5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Cli.Tests", "..\test\Spectre.Console.Cli.Tests\Spectre.Console.Cli.Tests.csproj", "{E07C46D2-714F-4116-BADD-FEE09617A9C4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Cli.Tests", "Tests\Spectre.Console.Cli.Tests\Spectre.Console.Cli.Tests.csproj", "{E07C46D2-714F-4116-BADD-FEE09617A9C4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Json", "Spectre.Console.Json\Spectre.Console.Json.csproj", "{579E6E31-1E2F-4FE1-8F8C-9770878993E9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Json", "Extensions\Spectre.Console.Json\Spectre.Console.Json.csproj", "{579E6E31-1E2F-4FE1-8F8C-9770878993E9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F34EFD87-6CEA-453F-858B-094EA413578C}" + ProjectSection(SolutionItems) = preProject + Tests\Directory.Build.props = Tests\Directory.Build.props + Tests\.editorconfig = Tests\.editorconfig + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -138,6 +144,8 @@ Global {C3E2CB5C-1517-4C75-B59A-93D4E22BEC8D} = {20595AD4-8D75-4AF8-B6BC-9C38C160423F} {0EFE694D-0770-4E71-BF4E-EC2B41362F79} = {E0E45070-123C-4A4D-AA98-2A780308876C} {579E6E31-1E2F-4FE1-8F8C-9770878993E9} = {E0E45070-123C-4A4D-AA98-2A780308876C} + {60A4CADD-2B3D-48ED-89C0-1637A1F111AE} = {F34EFD87-6CEA-453F-858B-094EA413578C} + {E07C46D2-714F-4116-BADD-FEE09617A9C4} = {F34EFD87-6CEA-453F-858B-094EA413578C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {5729B071-67A0-48FB-8B1B-275E6822086C} diff --git a/src/Spectre.Console.sln.DotSettings b/src/Spectre.Console.sln.DotSettings deleted file mode 100644 index 5b882221..00000000 --- a/src/Spectre.Console.sln.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - DO_NOT_SHOW \ No newline at end of file diff --git a/src/Spectre.Console.v3.ncrunchsolution b/src/Spectre.Console.v3.ncrunchsolution deleted file mode 100644 index 10420ac9..00000000 --- a/src/Spectre.Console.v3.ncrunchsolution +++ /dev/null @@ -1,6 +0,0 @@ - - - True - True - - \ No newline at end of file diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs index 7769e33a..2d6a4cb0 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs @@ -52,11 +52,19 @@ public static partial class AnsiConsoleExtensions { if (text.Length > 0) { + var lastChar = text.Last(); text = text.Substring(0, text.Length - 1); if (mask != null) { - console.Write("\b \b"); + if (UnicodeCalculator.GetWidth(lastChar) == 1) + { + console.Write("\b \b"); + } + else if (UnicodeCalculator.GetWidth(lastChar) == 2) + { + console.Write("\b \b\b \b"); + } } } diff --git a/src/Spectre.Console/Extensions/CalendarExtensions.cs b/src/Spectre.Console/Extensions/CalendarExtensions.cs index 86626266..7ea93583 100644 --- a/src/Spectre.Console/Extensions/CalendarExtensions.cs +++ b/src/Spectre.Console/Extensions/CalendarExtensions.cs @@ -10,10 +10,11 @@ public static class CalendarExtensions /// /// The calendar to add the calendar event to. /// The calendar event date. + /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. - public static Calendar AddCalendarEvent(this Calendar calendar, DateTime date) + public static Calendar AddCalendarEvent(this Calendar calendar, DateTime date, Style? customEventHighlightStyle = null) { - return AddCalendarEvent(calendar, string.Empty, date.Year, date.Month, date.Day); + return AddCalendarEvent(calendar, string.Empty, date.Year, date.Month, date.Day, customEventHighlightStyle); } /// @@ -22,10 +23,11 @@ public static class CalendarExtensions /// The calendar to add the calendar event to. /// The calendar event description. /// The calendar event date. + /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. - public static Calendar AddCalendarEvent(this Calendar calendar, string description, DateTime date) + public static Calendar AddCalendarEvent(this Calendar calendar, string description, DateTime date, Style? customEventHighlightStyle = null) { - return AddCalendarEvent(calendar, description, date.Year, date.Month, date.Day); + return AddCalendarEvent(calendar, description, date.Year, date.Month, date.Day, customEventHighlightStyle); } /// @@ -35,10 +37,11 @@ public static class CalendarExtensions /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. + /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. - public static Calendar AddCalendarEvent(this Calendar calendar, int year, int month, int day) + public static Calendar AddCalendarEvent(this Calendar calendar, int year, int month, int day, Style? customEventHighlightStyle = null) { - return AddCalendarEvent(calendar, string.Empty, year, month, day); + return AddCalendarEvent(calendar, string.Empty, year, month, day, customEventHighlightStyle); } /// @@ -49,15 +52,16 @@ public static class CalendarExtensions /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. + /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. - public static Calendar AddCalendarEvent(this Calendar calendar, string description, int year, int month, int day) + public static Calendar AddCalendarEvent(this Calendar calendar, string description, int year, int month, int day, Style? customEventHighlightStyle = null) { if (calendar is null) { throw new ArgumentNullException(nameof(calendar)); } - calendar.CalendarEvents.Add(new CalendarEvent(description, year, month, day)); + calendar.CalendarEvents.Add(new CalendarEvent(description, year, month, day, customEventHighlightStyle)); return calendar; } @@ -65,7 +69,7 @@ public static class CalendarExtensions /// Sets the calendar's highlight . /// /// The calendar. - /// The highlight style. + /// The default highlight style. /// The same instance so that multiple calls can be chained. public static Calendar HighlightStyle(this Calendar calendar, Style? style) { diff --git a/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs b/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs index 31f36a07..0343f39e 100644 --- a/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs +++ b/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs @@ -98,7 +98,7 @@ internal sealed class HtmlEncoder : IAnsiConsoleEncoder css.Add("font-weight: bold"); } - if ((style.Decoration & Decoration.Bold) != 0) + if ((style.Decoration & Decoration.Italic) != 0) { css.Add("font-style: italic"); } diff --git a/src/Spectre.Console/Prompts/List/ListPrompt.cs b/src/Spectre.Console/Prompts/List/ListPrompt.cs index 7f6948c1..ca0fa3fe 100644 --- a/src/Spectre.Console/Prompts/List/ListPrompt.cs +++ b/src/Spectre.Console/Prompts/List/ListPrompt.cs @@ -14,6 +14,7 @@ internal sealed class ListPrompt public async Task> Show( ListPromptTree tree, + Func converter, SelectionMode selectionMode, bool skipUnselectableItems, bool searchEnabled, @@ -41,7 +42,12 @@ internal sealed class ListPrompt } var nodes = tree.Traverse().ToList(); - var state = new ListPromptState(nodes, _strategy.CalculatePageSize(_console, nodes.Count, requestedPageSize), wrapAround, selectionMode, skipUnselectableItems, searchEnabled); + if (nodes.Count == 0) + { + throw new InvalidOperationException("Cannot show an empty selection prompt. Please call the AddChoice() method to configure the prompt."); + } + + var state = new ListPromptState(nodes, converter, _strategy.CalculatePageSize(_console, nodes.Count, requestedPageSize), wrapAround, selectionMode, skipUnselectableItems, searchEnabled); var hook = new ListPromptRenderHook(_console, () => BuildRenderable(state)); using (new RenderHookScope(_console, hook)) diff --git a/src/Spectre.Console/Prompts/List/ListPromptConstants.cs b/src/Spectre.Console/Prompts/List/ListPromptConstants.cs index 4c0e2b08..ea1f32ec 100644 --- a/src/Spectre.Console/Prompts/List/ListPromptConstants.cs +++ b/src/Spectre.Console/Prompts/List/ListPromptConstants.cs @@ -9,4 +9,15 @@ internal sealed class ListPromptConstants public const string InstructionsMarkup = "[grey](Press to select, to accept)[/]"; public const string MoreChoicesMarkup = "[grey](Move up and down to reveal more choices)[/]"; public const string SearchPlaceholderMarkup = "[grey](Type to search)[/]"; + + public static string GetSelectedCheckbox(bool isGroup, SelectionMode mode, Style? style = null) + { + if (style != null) + { + return "[[" + $"[{style.ToMarkup()}]X[/]" + "]]"; + } + + return isGroup && mode == SelectionMode.Leaf + ? GroupSelectedCheckbox : SelectedCheckbox; + } } \ No newline at end of file diff --git a/src/Spectre.Console/Prompts/List/ListPromptState.cs b/src/Spectre.Console/Prompts/List/ListPromptState.cs index 177b97ed..fdbe3c80 100644 --- a/src/Spectre.Console/Prompts/List/ListPromptState.cs +++ b/src/Spectre.Console/Prompts/List/ListPromptState.cs @@ -3,6 +3,8 @@ namespace Spectre.Console; internal sealed class ListPromptState where T : notnull { + private readonly Func _converter; + public int Index { get; private set; } public int ItemCount => Items.Count; public int PageSize { get; } @@ -16,8 +18,15 @@ internal sealed class ListPromptState public ListPromptItem Current => Items[Index]; public string SearchText { get; private set; } - public ListPromptState(IReadOnlyList> items, int pageSize, bool wrapAround, SelectionMode mode, bool skipUnselectableItems, bool searchEnabled) + public ListPromptState( + IReadOnlyList> items, + Func converter, + int pageSize, bool wrapAround, + SelectionMode mode, + bool skipUnselectableItems, + bool searchEnabled) { + _converter = converter ?? throw new ArgumentNullException(nameof(converter)); Items = items; PageSize = pageSize; WrapAround = wrapAround; @@ -126,7 +135,11 @@ internal sealed class ListPromptState if (!char.IsControl(keyInfo.KeyChar)) { search = SearchText + keyInfo.KeyChar; - var item = Items.FirstOrDefault(x => x.Data.ToString()?.Contains(search, StringComparison.OrdinalIgnoreCase) == true && (!x.IsGroup || Mode != SelectionMode.Leaf)); + + var item = Items.FirstOrDefault(x => + _converter.Invoke(x.Data).Contains(search, StringComparison.OrdinalIgnoreCase) + && (!x.IsGroup || Mode != SelectionMode.Leaf)); + if (item != null) { index = Items.IndexOf(item); @@ -140,7 +153,10 @@ internal sealed class ListPromptState search = search.Substring(0, search.Length - 1); } - var item = Items.FirstOrDefault(x => x.Data.ToString()?.Contains(search, StringComparison.OrdinalIgnoreCase) == true && (!x.IsGroup || Mode != SelectionMode.Leaf)); + var item = Items.FirstOrDefault(x => + _converter.Invoke(x.Data).Contains(search, StringComparison.OrdinalIgnoreCase) && + (!x.IsGroup || Mode != SelectionMode.Leaf)); + if (item != null) { index = Items.IndexOf(item); diff --git a/src/Spectre.Console/Prompts/MultiSelectionPrompt.cs b/src/Spectre.Console/Prompts/MultiSelectionPrompt.cs index 0a023773..ffc3f4e5 100644 --- a/src/Spectre.Console/Prompts/MultiSelectionPrompt.cs +++ b/src/Spectre.Console/Prompts/MultiSelectionPrompt.cs @@ -94,7 +94,8 @@ public sealed class MultiSelectionPrompt : IPrompt>, IListPromptStrat { // Create the list prompt var prompt = new ListPrompt(console, this); - var result = await prompt.Show(Tree, Mode, false, false, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); + var converter = Converter ?? TypeConverterHelper.ConvertToString; + var result = await prompt.Show(Tree, converter, Mode, false, false, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); if (Mode == SelectionMode.Leaf) { @@ -256,8 +257,7 @@ public sealed class MultiSelectionPrompt : IPrompt>, IListPromptStrat } var checkbox = item.Node.IsSelected - ? (item.Node.IsGroup && Mode == SelectionMode.Leaf - ? ListPromptConstants.GroupSelectedCheckbox : ListPromptConstants.SelectedCheckbox) + ? ListPromptConstants.GetSelectedCheckbox(item.Node.IsGroup, Mode, HighlightStyle) : ListPromptConstants.Checkbox; grid.AddRow(new Markup(indent + prompt + " " + checkbox + " " + text, style)); diff --git a/src/Spectre.Console/Prompts/SelectionPrompt.cs b/src/Spectre.Console/Prompts/SelectionPrompt.cs index e6ed46b8..c9f55690 100644 --- a/src/Spectre.Console/Prompts/SelectionPrompt.cs +++ b/src/Spectre.Console/Prompts/SelectionPrompt.cs @@ -99,7 +99,8 @@ public sealed class SelectionPrompt : IPrompt, IListPromptStrategy { // Create the list prompt var prompt = new ListPrompt(console, this); - var result = await prompt.Show(_tree, Mode, true, SearchEnabled, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); + var converter = Converter ?? TypeConverterHelper.ConvertToString; + var result = await prompt.Show(_tree, converter, Mode, true, SearchEnabled, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); // Return the selected item return result.Items[result.Index].Data; diff --git a/src/Spectre.Console/Spectre.Console.csproj b/src/Spectre.Console/Spectre.Console.csproj index 4805f895..49a55049 100644 --- a/src/Spectre.Console/Spectre.Console.csproj +++ b/src/Spectre.Console/Spectre.Console.csproj @@ -2,22 +2,22 @@ net8.0;net7.0;net6.0;netstandard2.0 - enable true - SA1633 + $(DefineConstants)TRACE;WCWIDTH_VISIBILITY_INTERNAL - - - - - - + + - - - + + + + + + + + all @@ -28,17 +28,12 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - $(DefineConstants)TRACE;WCWIDTH_VISIBILITY_INTERNAL - - diff --git a/src/Spectre.Console/Widgets/Calendar.cs b/src/Spectre.Console/Widgets/Calendar.cs index 18f15892..124b62c1 100644 --- a/src/Spectre.Console/Widgets/Calendar.cs +++ b/src/Spectre.Console/Widgets/Calendar.cs @@ -196,9 +196,10 @@ public sealed class Calendar : JustInTimeRenderable, IHasCulture, IHasTableBorde { if (weekdays[currentDay - 1] == weekday) { - if (_calendarEvents.Any(e => e.Month == Month && e.Day == currentDay)) + var todayEvent = _calendarEvents.LastOrDefault(e => e.Month == Month && e.Day == currentDay); + if (todayEvent != null) { - row.Add(new Markup(currentDay.ToString(CultureInfo.InvariantCulture) + "*", _highlightStyle)); + row.Add(new Markup(currentDay.ToString(CultureInfo.InvariantCulture) + "*", todayEvent.CustomHighlightStyle ?? _highlightStyle)); } else { diff --git a/src/Spectre.Console/Widgets/CalendarEvent.cs b/src/Spectre.Console/Widgets/CalendarEvent.cs index 68f3dc76..32318234 100644 --- a/src/Spectre.Console/Widgets/CalendarEvent.cs +++ b/src/Spectre.Console/Widgets/CalendarEvent.cs @@ -25,14 +25,20 @@ public sealed class CalendarEvent /// public int Day { get; } + /// + /// Gets the custom highlight style of the calendar event. + /// + public Style? CustomHighlightStyle { get; } + /// /// Initializes a new instance of the class. /// /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. - public CalendarEvent(int year, int month, int day) - : this(string.Empty, year, month, day) + /// The custom highlight style of the calendar event. + public CalendarEvent(int year, int month, int day, Style? customHighlightStyle = null) + : this(string.Empty, year, month, day, customHighlightStyle) { } @@ -43,11 +49,13 @@ public sealed class CalendarEvent /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. - public CalendarEvent(string description, int year, int month, int day) + /// The custom highlight style of the calendar event. + public CalendarEvent(string description, int year, int month, int day, Style? customHighlightStyle = null) { Description = description ?? string.Empty; Year = year; Month = month; Day = day; + CustomHighlightStyle = customHighlightStyle; } } \ No newline at end of file diff --git a/src/Spectre.Console/Widgets/Table/TableRenderer.cs b/src/Spectre.Console/Widgets/Table/TableRenderer.cs index 23bff61c..0d171668 100644 --- a/src/Spectre.Console/Widgets/Table/TableRenderer.cs +++ b/src/Spectre.Console/Widgets/Table/TableRenderer.cs @@ -150,9 +150,9 @@ internal static class TableRenderer result.Add(Segment.LineBreak); } - // Show row separator? + // Show row separator, if headers are hidden show separator after the first row if (context.Border.SupportsRowSeparator && context.ShowRowSeparators - && !isFirstRow && !isLastRow) + && (!isFirstRow || (isFirstRow && !context.ShowHeaders)) && !isLastRow) { var hasVisibleFootes = context is { ShowFooters: true, HasFooters: true }; var isNextLastLine = index == context.Rows.Count - 2; diff --git a/src/Spectre.Console/Widgets/Tree.cs b/src/Spectre.Console/Widgets/Tree.cs index 289884ed..91f1540b 100644 --- a/src/Spectre.Console/Widgets/Tree.cs +++ b/src/Spectre.Console/Widgets/Tree.cs @@ -7,6 +7,7 @@ namespace Spectre.Console; public sealed class Tree : Renderable, IHasTreeNodes { private readonly TreeNode _root; + private bool _expanded = true; /// /// Gets or sets the tree style. @@ -26,7 +27,15 @@ public sealed class Tree : Renderable, IHasTreeNodes /// /// Gets or sets a value indicating whether or not the tree is expanded or not. /// - public bool Expanded { get; set; } = true; + public bool Expanded + { + get => _expanded; + set + { + _expanded = value; + _root.Expand(value); + } + } /// /// Initializes a new instance of the class. diff --git a/test/.editorconfig b/src/Tests/.editorconfig similarity index 100% rename from test/.editorconfig rename to src/Tests/.editorconfig diff --git a/src/Tests/Directory.Build.props b/src/Tests/Directory.Build.props new file mode 100644 index 00000000..9932e25e --- /dev/null +++ b/src/Tests/Directory.Build.props @@ -0,0 +1,13 @@ + + + 12 + false + true + true + $(MSBuildThisFileDirectory)\..\..\resources\spectre.snk + + + + + + \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Constants.cs b/src/Tests/Spectre.Console.Cli.Tests/Constants.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Constants.cs rename to src/Tests/Spectre.Console.Cli.Tests/Constants.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/AnimalCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/AnimalCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/AnimalCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/AnimalCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/AsynchronousCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/AsynchronousCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/AsynchronousCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/AsynchronousCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/DumpRemainingCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/DumpRemainingCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/DumpRemainingCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/DumpRemainingCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/EmptyCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/EmptyCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/EmptyCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/EmptyCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/GenericCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GenericCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/GenericCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GenericCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/GiraffeCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GiraffeCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/GiraffeCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GiraffeCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/GreeterCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GreeterCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/GreeterCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/GreeterCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/HiddenOptionsCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/HiddenOptionsCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/HiddenOptionsCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/HiddenOptionsCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/InvalidCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/InvalidCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/InvalidCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/InvalidCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/NoDescriptionCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/NoDescriptionCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/NoDescriptionCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/NoDescriptionCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/OptionVectorCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/OptionVectorCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/OptionVectorCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/OptionVectorCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/ThrowingCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/ThrowingCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/ThrowingCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/ThrowingCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/TurtleCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/TurtleCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/TurtleCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/TurtleCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Commands/VersionCommand.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Commands/VersionCommand.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Commands/VersionCommand.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Commands/VersionCommand.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Converters/CatAgilityConverter.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Converters/CatAgilityConverter.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Converters/CatAgilityConverter.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Converters/CatAgilityConverter.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Converters/StringToIntegerConverter.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Converters/StringToIntegerConverter.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Converters/StringToIntegerConverter.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Converters/StringToIntegerConverter.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Help/CustomHelpProvider.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Help/CustomHelpProvider.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Help/CustomHelpProvider.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Help/CustomHelpProvider.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Help/RedirectHelpProvider.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Help/RedirectHelpProvider.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Help/RedirectHelpProvider.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Help/RedirectHelpProvider.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Help/RenderMarkupHelpProvider.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Help/RenderMarkupHelpProvider.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Help/RenderMarkupHelpProvider.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Help/RenderMarkupHelpProvider.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/AnimalSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/AnimalSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/AnimalSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/AnimalSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/ArgumentOrderSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ArgumentOrderSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/ArgumentOrderSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ArgumentOrderSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/ArgumentVectorSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ArgumentVectorSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/ArgumentVectorSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ArgumentVectorSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/AsynchronousCommandSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/AsynchronousCommandSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/AsynchronousCommandSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/AsynchronousCommandSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/BarCommandSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/BarCommandSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/BarCommandSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/BarCommandSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/FooSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/FooSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/FooSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/FooSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/GiraffeSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/GiraffeSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/GiraffeSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/GiraffeSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/HiddenOptionSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/HiddenOptionSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/HiddenOptionSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/HiddenOptionSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/HorseSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/HorseSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/HorseSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/HorseSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/InvalidSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/InvalidSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/InvalidSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/InvalidSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/MammalSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/MammalSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/MammalSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/MammalSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/MultipleArgumentVectorSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/MultipleArgumentVectorSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/MultipleArgumentVectorSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/MultipleArgumentVectorSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/OptionVectorSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/OptionVectorSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/OptionVectorSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/OptionVectorSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/OptionalArgumentWithDefaultValueSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/OptionalArgumentWithDefaultValueSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/OptionalArgumentWithDefaultValueSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/OptionalArgumentWithDefaultValueSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/ReptileSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ReptileSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/ReptileSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ReptileSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/StringOptionSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/StringOptionSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/StringOptionSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/StringOptionSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/ThrowingCommandSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ThrowingCommandSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/ThrowingCommandSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/ThrowingCommandSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/TurtleSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/TurtleSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/TurtleSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/TurtleSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Settings/VersionSettings.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Settings/VersionSettings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Settings/VersionSettings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Settings/VersionSettings.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Validators/EvenNumberValidatorAttribute.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Validators/EvenNumberValidatorAttribute.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Validators/EvenNumberValidatorAttribute.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Validators/EvenNumberValidatorAttribute.cs diff --git a/test/Spectre.Console.Cli.Tests/Data/Validators/PositiveNumberValidatorAttribute.cs b/src/Tests/Spectre.Console.Cli.Tests/Data/Validators/PositiveNumberValidatorAttribute.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Data/Validators/PositiveNumberValidatorAttribute.cs rename to src/Tests/Spectre.Console.Cli.Tests/Data/Validators/PositiveNumberValidatorAttribute.cs diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/ArgumentCannotContainOptions.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ArgumentCannotContainOptions.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/ArgumentCannotContainOptions.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ArgumentCannotContainOptions.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInOptionName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInOptionName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInOptionName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInOptionName.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInValueName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInValueName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInValueName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/InvalidCharacterInValueName.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/MissingLongAndShortName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MissingLongAndShortName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/MissingLongAndShortName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MissingLongAndShortName.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleValuesAreNotSupported.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleValuesAreNotSupported.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleValuesAreNotSupported.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/MultipleValuesAreNotSupported.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionsMustHaveName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionsMustHaveName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionsMustHaveName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/OptionsMustHaveName.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/UnexpectedCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/UnexpectedCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/UnexpectedCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/UnexpectedCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/UnterminatedValueName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/UnterminatedValueName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/UnterminatedValueName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/UnterminatedValueName.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Arguments/ValuesMustHaveName.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ValuesMustHaveName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Arguments/ValuesMustHaveName.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Arguments/ValuesMustHaveName.Output.verified.txt diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt new file mode 100644 index 00000000..9a82776d --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt @@ -0,0 +1,12 @@ +USAGE: + myapp [QUX] [OPTIONS] + +ARGUMENTS: + + + + + [QUX] + +OPTIONS: + -h, --help Prints help information \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Branch.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Branch.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Called_Without_Help.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Called_Without_Help.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Called_Without_Help.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Called_Without_Help.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Default_Greeter.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Default_Greeter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Default_Greeter.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Default_Greeter.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Examples.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Examples.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Examples.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Branch_Examples.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Command_Hide_Default.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Command_Hide_Default.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Command_Hide_Default.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Command_Hide_Default.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt similarity index 55% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt index e4a56cd5..f2bd5397 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Instance.Output.verified.txt @@ -1,15 +1,14 @@ --------------------------------------- ---- CUSTOM HELP PROVIDER --- --------------------------------------- - -USAGE: - myapp [OPTIONS] - -OPTIONS: - -h, --help Prints help information - -v, --version Prints version information - -COMMANDS: - dog The dog command - +-------------------------------------- +--- CUSTOM HELP PROVIDER --- +-------------------------------------- + +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command + Version 1.0 \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Type.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Type.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Type.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Configured_By_Type.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Custom_Help_Provider.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Instance.Output.verified.txt similarity index 55% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Custom_Help_Provider.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Instance.Output.verified.txt index e4a56cd5..f2bd5397 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Custom_Help_Provider.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Instance.Output.verified.txt @@ -1,15 +1,14 @@ --------------------------------------- ---- CUSTOM HELP PROVIDER --- --------------------------------------- - -USAGE: - myapp [OPTIONS] - -OPTIONS: - -h, --help Prints help information - -v, --version Prints version information - -COMMANDS: - dog The dog command - +-------------------------------------- +--- CUSTOM HELP PROVIDER --- +-------------------------------------- + +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command + Version 1.0 \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Type.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Type.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Type.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Type.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt similarity index 88% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt index aa1978d8..b53a06eb 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default.Output.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The lion command. USAGE: @@ -10,8 +10,7 @@ ARGUMENTS: OPTIONS: DEFAULT - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Instance.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Custom_Help_Provider.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Custom_Help_Registered_By_Instance.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Custom_Help_Provider.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt similarity index 87% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt index cd5b1e4f..58c2ec53 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Examples.Output.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The dog command. USAGE: @@ -18,7 +18,6 @@ ARGUMENTS: OPTIONS: -h, --help Prints help information - -v, --version Prints version information -a, --alive Indicates whether or not the animal is alive -n, --name -g, --good-boy \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Greeter.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Greeter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Greeter.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Greeter.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt similarity index 88% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt index aa1978d8..b53a06eb 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args.Output.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The lion command. USAGE: @@ -10,8 +10,7 @@ ARGUMENTS: OPTIONS: DEFAULT - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt similarity index 89% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt index ba0602d8..8f21e005 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_DE.verified.txt @@ -1,4 +1,4 @@ -BESCHREIBUNG: +BESCHREIBUNG: The lion command. VERWENDUNG: @@ -14,7 +14,6 @@ ARGUMENTE: OPTIONEN: STANDARDWERT -h, --help Zeigt Hilfe an - -v, --version Zeigt Versionsinformationen an -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt similarity index 90% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt index d4a59337..905156f8 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_EN.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The lion command. USAGE: @@ -13,8 +13,7 @@ ARGUMENTS: OPTIONS: DEFAULT - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt similarity index 90% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt index 126de22d..a555c1c1 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_FR.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The lion command. UTILISATION: @@ -13,8 +13,7 @@ ARGUMENTS: OPTIONS: DÉFAUT - -h, --help Affiche l'aide - -v, --version Affiche la version + -h, --help Affiche l'aide -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt similarity index 90% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt index 2292492b..45fd6c0c 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional.Output_SV.verified.txt @@ -1,4 +1,4 @@ -BESKRIVNING: +BESKRIVNING: The lion command. ANVÄNDING: @@ -14,7 +14,6 @@ ARGUMENT: VAL: STANDARD -h, --help Skriver ut hjälpinformation - -v, --version Skriver ut versionsnummer -a, --alive Indicates whether or not the animal is alive -n, --name --agility 10 The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt similarity index 89% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt index 4bea738d..5b0f4264 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_BoldHeadings.Output.verified.txt @@ -1,4 +1,4 @@ -[bold]DESCRIPTION:[/] +[bold]DESCRIPTION:[/] The lion command. [bold]USAGE:[/] @@ -14,7 +14,6 @@ The lion command. []OPTIONS:[/] []DEFAULT[/] -h, --help Prints help information - -v, --version Prints version information -a, --alive Indicates whether or not the animal is alive -n, --name [][/] --agility [][/] []10[/] The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt similarity index 90% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt index 30421ace..82570d3a 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_Default.Output.verified.txt @@ -1,4 +1,4 @@ -[yellow]DESCRIPTION:[/] +[yellow]DESCRIPTION:[/] The lion command. [yellow]USAGE:[/] @@ -14,7 +14,6 @@ The lion command. [yellow]OPTIONS:[/] [lime]DEFAULT[/] -h, --help Prints help information - -v, --version Prints version information -a, --alive Indicates whether or not the animal is alive -n, --name [silver][/] --agility [silver][/] [bold]10[/] The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt similarity index 90% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt index a0bb7b25..2b92a199 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Default_Without_Args_Additional_Style_None.Output.verified.txt @@ -1,4 +1,4 @@ -[]DESCRIPTION:[/] +[]DESCRIPTION:[/] The lion command. []USAGE:[/] @@ -14,7 +14,6 @@ The lion command. []OPTIONS:[/] []DEFAULT[/] -h, --help Prints help information - -v, --version Prints version information -a, --alive Indicates whether or not the animal is alive -n, --name [][/] --agility [][/] []10[/] The agility between 0 and 100 diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt similarity index 54% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt index b53e7717..9662e05f 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Description_No_Trailing_Period.Output.verified.txt @@ -1,9 +1,8 @@ -USAGE: +USAGE: myapp [OPTIONS] OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: dog The dog command. diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt new file mode 100644 index 00000000..b96464bf --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt @@ -0,0 +1,9 @@ +USAGE: + myapp [OPTIONS] + +ARGUMENTS: + Dummy argument FOO + +OPTIONS: + -h, --help Prints help information + --baz Dummy option BAZ \ No newline at end of file diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Commands.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Commands.Output.verified.txt similarity index 54% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Commands.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Commands.Output.verified.txt index 6a792dad..21227697 100644 --- a/test/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Commands.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Commands.Output.verified.txt @@ -1,9 +1,8 @@ -USAGE: +USAGE: myapp [OPTIONS] OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: dog The dog command diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Leaf.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Leaf.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Leaf.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Leaf.Output.verified.txt diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoDescription.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoDescription.Output.verified.txt new file mode 100644 index 00000000..7e3e079c --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoDescription.Output.verified.txt @@ -0,0 +1,8 @@ +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + bar \ No newline at end of file diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoVersion.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoVersion.Output.verified.txt new file mode 100644 index 00000000..9a82776d --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/NoVersion.Output.verified.txt @@ -0,0 +1,12 @@ +USAGE: + myapp [QUX] [OPTIONS] + +ARGUMENTS: + + + + + [QUX] + +OPTIONS: + -h, --help Prints help information \ No newline at end of file diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.Output.verified.txt new file mode 100644 index 00000000..aa3dcc3b --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.Output.verified.txt @@ -0,0 +1,10 @@ +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command + horse The horse command + giraffe The giraffe command \ No newline at end of file diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Root.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.QuestionMark.verified.txt similarity index 66% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Root.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.QuestionMark.verified.txt index 366b6b38..0432fe41 100644 --- a/test/Spectre.Console.Tests/Expectations/Cli/Help/Root.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root.QuestionMark.verified.txt @@ -2,8 +2,7 @@ USAGE: myapp [OPTIONS] OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: dog The dog command diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt similarity index 83% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt index c660618c..2c6e498b 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.Output.verified.txt @@ -1,4 +1,4 @@ -DESCRIPTION: +DESCRIPTION: The horse command. USAGE: @@ -10,7 +10,6 @@ ARGUMENTS: OPTIONS: DEFAULT -h, --help Prints help information - -v, --version Prints version information -a, --alive Indicates whether or not the animal is alive -n, --name -d, --day diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.QuestionMark.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.QuestionMark.verified.txt new file mode 100644 index 00000000..03c68750 --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Command.QuestionMark.verified.txt @@ -0,0 +1,17 @@ +DESCRIPTION: +The horse command. + +USAGE: + myapp horse [LEGS] [OPTIONS] + +ARGUMENTS: + [LEGS] The number of legs + +OPTIONS: + DEFAULT + -h, --help Prints help information + -a, --alive Indicates whether or not the animal is alive + -n, --name + -d, --day + --file food.txt + --directory \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt similarity index 83% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt index 3488e38c..82ba4675 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples.Output.verified.txt @@ -1,4 +1,4 @@ -USAGE: +USAGE: myapp [OPTIONS] EXAMPLES: @@ -16,8 +16,7 @@ EXAMPLES: myapp horse --name Spirit OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: dog The dog command diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt similarity index 74% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt index 47e373aa..e2b67c8a 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children.Output.verified.txt @@ -1,4 +1,4 @@ -USAGE: +USAGE: myapp [OPTIONS] EXAMPLES: @@ -9,8 +9,7 @@ EXAMPLES: myapp dog --name Daisy OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: dog The dog command diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt similarity index 76% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt index 3e5a6d93..7b486e1f 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Eight.Output.verified.txt @@ -1,20 +1,19 @@ -USAGE: - myapp [OPTIONS] - -EXAMPLES: - myapp dog --name Rufus --age 12 --good-boy - myapp dog --name Luna - myapp dog --name Charlie - myapp dog --name Bella - myapp dog --name Daisy - myapp dog --name Milo - myapp horse --name Brutus - myapp horse --name Sugar --IsAlive false - -OPTIONS: - -h, --help Prints help information - -v, --version Prints version information - -COMMANDS: - dog The dog command +USAGE: + myapp [OPTIONS] + +EXAMPLES: + myapp dog --name Rufus --age 12 --good-boy + myapp dog --name Luna + myapp dog --name Charlie + myapp dog --name Bella + myapp dog --name Daisy + myapp dog --name Milo + myapp horse --name Brutus + myapp horse --name Sugar --IsAlive false + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command horse The horse command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt similarity index 51% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt index 3377d2a9..21227697 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_None.Output.verified.txt @@ -1,10 +1,9 @@ -USAGE: - myapp [OPTIONS] - -OPTIONS: - -h, --help Prints help information - -v, --version Prints version information - -COMMANDS: - dog The dog command +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command horse The horse command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt similarity index 80% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt index 8924b555..82ba4675 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Children_Twelve.Output.verified.txt @@ -1,24 +1,23 @@ -USAGE: - myapp [OPTIONS] - -EXAMPLES: - myapp dog --name Rufus --age 12 --good-boy - myapp dog --name Luna - myapp dog --name Charlie - myapp dog --name Bella - myapp dog --name Daisy - myapp dog --name Milo - myapp horse --name Brutus - myapp horse --name Sugar --IsAlive false - myapp horse --name Cash - myapp horse --name Dakota - myapp horse --name Cisco - myapp horse --name Spirit - -OPTIONS: - -h, --help Prints help information - -v, --version Prints version information - -COMMANDS: - dog The dog command +USAGE: + myapp [OPTIONS] + +EXAMPLES: + myapp dog --name Rufus --age 12 --good-boy + myapp dog --name Luna + myapp dog --name Charlie + myapp dog --name Bella + myapp dog --name Daisy + myapp dog --name Milo + myapp horse --name Brutus + myapp horse --name Sugar --IsAlive false + myapp horse --name Cash + myapp horse --name Dakota + myapp horse --name Cisco + myapp horse --name Spirit + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + dog The dog command horse The horse command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt similarity index 74% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt index 8b753619..088dd1b8 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs.Output.verified.txt @@ -1,4 +1,4 @@ -USAGE: +USAGE: myapp [OPTIONS] EXAMPLES: @@ -9,8 +9,7 @@ EXAMPLES: myapp animal dog --name Daisy OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: animal The animal command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt similarity index 81% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt index 63bded9a..e236c9b5 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Eight.Output.verified.txt @@ -12,8 +12,7 @@ EXAMPLES: myapp animal horse --name Sugar --IsAlive false OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: animal The animal command \ No newline at end of file diff --git a/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt new file mode 100644 index 00000000..75de3a14 --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt @@ -0,0 +1,8 @@ +USAGE: + myapp [OPTIONS] + +OPTIONS: + -h, --help Prints help information + +COMMANDS: + animal The animal command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt similarity index 85% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt index 07178cbc..b6b89b68 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_Twelve.Output.verified.txt @@ -16,8 +16,7 @@ EXAMPLES: myapp animal horse --name Spirit OPTIONS: - -h, --help Prints help information - -v, --version Prints version information + -h, --help Prints help information COMMANDS: animal The animal command \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Version.Output.verified.txt similarity index 95% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Version.Output.verified.txt index 6e29ed29..a07a2666 100644 --- a/test/Spectre.Console.Cli.Tests/Expectations/Help/ArgumentOrder.Output.verified.txt +++ b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Help/Version.Output.verified.txt @@ -1,4 +1,4 @@ -USAGE: +USAGE: myapp [QUX] [OPTIONS] ARGUMENTS: diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoMatchingArgument/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoMatchingArgument/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoMatchingArgument/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoMatchingArgument/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/NoValueForOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/OptionWithoutName/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnexpectedOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_6.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_6.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_6.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_6.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_7.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_7.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_7.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_7.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_8.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_8.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_8.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownCommand/Test_8.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Parsing/UnknownOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Hidden_Command_Options.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Hidden_Command_Options.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Hidden_Command_Options.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Hidden_Command_Options.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_10.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_10.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_10.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_10.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_6.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_6.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_6.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_6.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_7.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_7.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_7.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_7.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_8.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_8.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_8.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_8.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_9.Output.verified.txt b/src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_9.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Xml/Test_9.Output.verified.txt rename to src/Tests/Spectre.Console.Cli.Tests/Expectations/Xml/Test_9.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Properties/Usings.cs b/src/Tests/Spectre.Console.Cli.Tests/Properties/Usings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Properties/Usings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Properties/Usings.cs diff --git a/src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj b/src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj new file mode 100644 index 00000000..10e189c7 --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj @@ -0,0 +1,27 @@ + + + + net8.0;net7.0;net6.0 + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + diff --git a/test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.Rendering.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.Rendering.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.Rendering.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.Rendering.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandArgumentAttributeTests.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.Rendering.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.Rendering.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.Rendering.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.Rendering.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Annotations/CommandOptionAttributeTests.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs similarity index 90% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs index 8fe90202..8ce3ee14 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Async.cs @@ -5,7 +5,7 @@ public sealed partial class CommandAppTests public sealed class Async { [Fact] - public async void Should_Execute_Command_Asynchronously() + public async Task Should_Execute_Command_Asynchronously() { // Given var app = new CommandAppTester(); @@ -24,7 +24,7 @@ public sealed partial class CommandAppTests } [Fact] - public async void Should_Handle_Exception_Asynchronously() + public async Task Should_Handle_Exception_Asynchronously() { // Given var app = new CommandAppTester(); @@ -42,7 +42,7 @@ public sealed partial class CommandAppTests } [Fact] - public async void Should_Throw_Exception_Asynchronously() + public async Task Should_Throw_Exception_Asynchronously() { // Given var app = new CommandAppTester(); diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs similarity index 99% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs index 716bd310..4080c6e2 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Branches.cs @@ -89,7 +89,7 @@ public sealed partial class CommandAppTests //cat.Name.ShouldBe("Kitty"); //<-- Should normally be correct, but instead name will be added to the remaining arguments (see below). }); result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("name", values: new[] { "Kitty", }); + result.Context.ShouldHaveRemainingArgument("--name", values: new[] { "Kitty", }); } [Fact] diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Constructor.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Constructor.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Constructor.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Constructor.cs diff --git a/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Context.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Context.cs new file mode 100644 index 00000000..ec88fd13 --- /dev/null +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Context.cs @@ -0,0 +1,23 @@ +namespace Spectre.Console.Tests.Unit.Cli; + +public sealed partial class CommandAppTests +{ + [Fact] + [Expectation("Should_Expose_Raw_Arguments")] + public void Should_Return_Correct_Text_When_Command_Is_Unknown() + { + // Given + var app = new CommandAppTester(); + app.Configure(config => + { + config.AddCommand("test"); + }); + + // When + var result = app.Run("test", "--foo", "32", "--lol"); + + // Then + result.Context.ShouldNotBeNull(); + result.Context.Arguments.ShouldBe(new[] { "test", "--foo", "32", "--lol" }); + } +} \ No newline at end of file diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Exceptions.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Exceptions.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Exceptions.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Exceptions.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.FlagValues.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.FlagValues.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.FlagValues.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.FlagValues.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs similarity index 93% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs index 3c2b8ca8..8d3af800 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Help.cs @@ -28,6 +28,27 @@ public sealed partial class CommandAppTests return Verifier.Verify(result.Output); } + [Fact] + [Expectation("Root", "QuestionMark")] + public Task Should_Output_Root_Correctly_QuestionMark() + { + // Given + var fixture = new CommandAppTester(); + fixture.Configure(configurator => + { + configurator.SetApplicationName("myapp"); + configurator.AddCommand("dog"); + configurator.AddCommand("horse"); + configurator.AddCommand("giraffe"); + }); + + // When + var result = fixture.Run("-?"); + + // Then + return Verifier.Verify(result.Output); + } + [Fact] [Expectation("Root_Command")] public Task Should_Output_Root_Command_Correctly() @@ -49,6 +70,27 @@ public sealed partial class CommandAppTests return Verifier.Verify(result.Output); } + [Fact] + [Expectation("Root_Command", "QuestionMark")] + public Task Should_Output_Root_Command_Correctly_QuestionMark() + { + // Given + var fixture = new CommandAppTester(); + fixture.Configure(configurator => + { + configurator.SetApplicationName("myapp"); + configurator.AddCommand("dog"); + configurator.AddCommand("horse"); + configurator.AddCommand("giraffe"); + }); + + // When + var result = fixture.Run("horse", "-?"); + + // Then + return Verifier.Verify(result.Output); + } + [Fact] [Expectation("Hidden_Commands")] public Task Should_Skip_Hidden_Commands() @@ -950,6 +992,45 @@ public sealed partial class CommandAppTests return Verifier.Verify(result.Output); } + [Fact] + [Expectation("NoVersion")] + public Task Should_Not_Include_Application_Version_If_Not_Set() + { + // Given + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand>(); + fixture.Configure(config => + { + config.SetApplicationName("myapp"); + }); + + // When + var result = fixture.Run("--help"); + + // Then + return Verifier.Verify(result.Output); + } + + [Fact] + [Expectation("Version")] + public Task Should_Include_Application_Version_If_Set() + { + // Given + var fixture = new CommandAppTester(); + fixture.SetDefaultCommand>(); + fixture.Configure(config => + { + config.SetApplicationName("myapp"); + config.SetApplicationVersion("0.49.1"); + }); + + // When + var result = fixture.Run("--help"); + + // Then + return Verifier.Verify(result.Output); + } + [Fact] [Expectation("Hidden_Command_Options")] public Task Should_Not_Show_Hidden_Command_Options() diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.Settings.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.Settings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.Settings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.Settings.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Injection.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Interceptor.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Interceptor.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Interceptor.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Interceptor.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Pairs.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Pairs.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Pairs.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Pairs.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Parsing.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Parsing.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Parsing.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Parsing.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs similarity index 93% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs index 92febae3..378ec16c 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Remaining.cs @@ -56,7 +56,7 @@ public sealed partial class CommandAppTests // Then result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument(unknownFlag.TrimStart('-'), values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument(unknownFlag, values: new[] { (string)null }); result.Context.Remaining.Raw.Count.ShouldBe(0); } @@ -80,7 +80,7 @@ public sealed partial class CommandAppTests // Then result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("-r", values: new[] { (string)null }); result.Context.Remaining.Raw.Count.ShouldBe(0); } @@ -189,10 +189,10 @@ public sealed partial class CommandAppTests // Then result.Context.Remaining.Parsed.Count.ShouldBe(4); - result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar", "baz" }); - result.Context.ShouldHaveRemainingArgument("b", values: new[] { (string)null }); - result.Context.ShouldHaveRemainingArgument("a", values: new[] { (string)null }); - result.Context.ShouldHaveRemainingArgument("r", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("--foo", values: new[] { "bar", "baz" }); + result.Context.ShouldHaveRemainingArgument("-b", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("-a", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("-r", values: new[] { (string)null }); } [Fact] @@ -280,7 +280,7 @@ public sealed partial class CommandAppTests // Then result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("good-boy", values: new[] { "Please be good Rufus!" }); + result.Context.ShouldHaveRemainingArgument("--good-boy", values: new[] { "Please be good Rufus!" }); result.Context.Remaining.Raw.Count.ShouldBe(0); // nb. there are no "raw" remaining arguments on the command line } diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Sensitivity.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Sensitivity.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Sensitivity.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Sensitivity.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Settings.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Settings.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Settings.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Settings.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.TypeConverters.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.TypeConverters.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.TypeConverters.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.TypeConverters.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Unsafe.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Unsafe.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Unsafe.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Unsafe.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Validation.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Validation.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Validation.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Validation.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.ValueProviders.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.ValueProviders.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.ValueProviders.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.ValueProviders.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Vectors.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Vectors.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Vectors.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Vectors.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs similarity index 79% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs index 6064bb5f..e0a48ee2 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Version.cs @@ -34,6 +34,24 @@ public sealed partial class CommandAppTests result.Output.ShouldBe("1.0"); } + [Fact] + public void Should_Not_Display_Version_If_Not_Specified() + { + // Given + var fixture = new CommandAppTester(); + fixture.Configure(configurator => + { + configurator.AddCommand("empty"); + }); + + // When + var result = fixture.Run("--version"); + + // Then + result.ExitCode.ShouldNotBe(0); + result.Output.ShouldStartWith("Error: Unexpected option 'version'"); + } + [Fact] public void Should_Execute_Command_Not_Output_Application_Version_To_The_Console() { @@ -42,7 +60,6 @@ public sealed partial class CommandAppTests fixture.Configure(configurator => { configurator.SetApplicationVersion("1.0"); - configurator.AddCommand("empty"); }); @@ -51,7 +68,7 @@ public sealed partial class CommandAppTests // Then result.Output.ShouldBe(string.Empty); - result.Context.ShouldHaveRemainingArgument("version", new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("--version", new[] { (string)null }); } [Fact] @@ -70,7 +87,7 @@ public sealed partial class CommandAppTests // Then result.Output.ShouldBe(string.Empty); - result.Context.ShouldHaveRemainingArgument("version", new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("--version", new[] { (string)null }); } [Fact] @@ -81,7 +98,6 @@ public sealed partial class CommandAppTests fixture.Configure(configurator => { configurator.SetApplicationVersion("1.0"); - configurator.AddBranch("branch", branch => { branch.SetDefaultCommand(); diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Xml.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Xml.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Xml.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.Xml.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs similarity index 96% rename from test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs index 76b7581d..34d85200 100644 --- a/test/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs +++ b/src/Tests/Spectre.Console.Cli.Tests/Unit/CommandAppTests.cs @@ -215,7 +215,7 @@ public sealed partial class CommandAppTests dog.Name.ShouldBe("\" -Rufus --' "); }); result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("order-by", values: new[] { "\"-size\"", " ", string.Empty }); + result.Context.ShouldHaveRemainingArgument("--order-by", values: new[] { "\"-size\"", " ", string.Empty }); } [Fact] @@ -844,7 +844,7 @@ public sealed partial class CommandAppTests // Then result.Context.ShouldNotBeNull(); result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar" }); + result.Context.ShouldHaveRemainingArgument("--foo", values: new[] { "bar" }); } [Fact] @@ -875,8 +875,8 @@ public sealed partial class CommandAppTests // Then result.Context.ShouldNotBeNull(); result.Context.Remaining.Parsed.Count.ShouldBe(2); - result.Context.ShouldHaveRemainingArgument("foo", values: new[] { "bar" }); - result.Context.ShouldHaveRemainingArgument("f", values: new[] { "baz" }); + result.Context.ShouldHaveRemainingArgument("--foo", values: new[] { "bar" }); + result.Context.ShouldHaveRemainingArgument("-f", values: new[] { "baz" }); result.Context.Remaining.Raw.Count.ShouldBe(5); result.Context.Remaining.Raw.ShouldBe(new[] { @@ -909,7 +909,7 @@ public sealed partial class CommandAppTests // Then result.Context.ShouldNotBeNull(); result.Context.Remaining.Parsed.Count.ShouldBe(1); - result.Context.ShouldHaveRemainingArgument("foo", values: new[] { (string)null }); + result.Context.ShouldHaveRemainingArgument("--foo", values: new[] { (string)null }); } [Fact] @@ -1137,7 +1137,48 @@ public sealed partial class CommandAppTests } [Fact] - public async void Should_Execute_Async_Delegate_Command_At_Root_Level() + public void Should_Execute_Nested_Delegate_Empty_Command() + { + // Given + var app = new CommandAppTester(); + app.Configure(cfg => + { + cfg.AddBranch("a", d => + { + d.AddDelegate("b", _ => 0); + }); + }); + + // When + var result = app.Run([ + "a", "b" + ]); + + // Then + result.ExitCode.ShouldBe(0); + } + + [Fact] + public void Should_Execute_Delegate_Empty_Command_At_Root_Level() + { + // Given + var app = new CommandAppTester(); + app.Configure(cfg => + { + cfg.AddDelegate("a", _ => 0); + }); + + // When + var result = app.Run([ + "a" + ]); + + // Then + result.ExitCode.ShouldBe(0); + } + + [Fact] + public async Task Should_Execute_Async_Delegate_Command_At_Root_Level() { // Given var dog = default(DogSettings); @@ -1202,7 +1243,7 @@ public sealed partial class CommandAppTests } [Fact] - public async void Should_Execute_Nested_Async_Delegate_Command() + public async Task Should_Execute_Nested_Async_Delegate_Command() { // Given var dog = default(DogSettings); diff --git a/test/Spectre.Console.Cli.Tests/Unit/DefaultTypeRegistrarTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/DefaultTypeRegistrarTests.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/DefaultTypeRegistrarTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/DefaultTypeRegistrarTests.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/Parsing/CommandTreeTokenizerTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Parsing/CommandTreeTokenizerTests.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Parsing/CommandTreeTokenizerTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Parsing/CommandTreeTokenizerTests.cs diff --git a/test/Spectre.Console.Cli.Tests/Unit/Testing/FakeTypeRegistrarTests.cs b/src/Tests/Spectre.Console.Cli.Tests/Unit/Testing/FakeTypeRegistrarTests.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Unit/Testing/FakeTypeRegistrarTests.cs rename to src/Tests/Spectre.Console.Cli.Tests/Unit/Testing/FakeTypeRegistrarTests.cs diff --git a/test/Spectre.Console.Cli.Tests/Utilities/CommandContextExtensions.cs b/src/Tests/Spectre.Console.Cli.Tests/Utilities/CommandContextExtensions.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Utilities/CommandContextExtensions.cs rename to src/Tests/Spectre.Console.Cli.Tests/Utilities/CommandContextExtensions.cs diff --git a/test/Spectre.Console.Cli.Tests/Utilities/ModuleInitializerAttribute.cs b/src/Tests/Spectre.Console.Cli.Tests/Utilities/ModuleInitializerAttribute.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/Utilities/ModuleInitializerAttribute.cs rename to src/Tests/Spectre.Console.Cli.Tests/Utilities/ModuleInitializerAttribute.cs diff --git a/test/Spectre.Console.Cli.Tests/VerifyConfiguration.cs b/src/Tests/Spectre.Console.Cli.Tests/VerifyConfiguration.cs similarity index 100% rename from test/Spectre.Console.Cli.Tests/VerifyConfiguration.cs rename to src/Tests/Spectre.Console.Cli.Tests/VerifyConfiguration.cs diff --git a/test/Spectre.Console.Tests/Data/Exceptions.cs b/src/Tests/Spectre.Console.Tests/Data/Exceptions.cs similarity index 100% rename from test/Spectre.Console.Tests/Data/Exceptions.cs rename to src/Tests/Spectre.Console.Tests/Data/Exceptions.cs diff --git a/test/Spectre.Console.Tests/Data/example.json b/src/Tests/Spectre.Console.Tests/Data/example.json similarity index 100% rename from test/Spectre.Console.Tests/Data/example.json rename to src/Tests/Spectre.Console.Tests/Data/example.json diff --git a/test/Spectre.Console.Tests/Data/poison.flf b/src/Tests/Spectre.Console.Tests/Data/poison.flf similarity index 100% rename from test/Spectre.Console.Tests/Data/poison.flf rename to src/Tests/Spectre.Console.Tests/Data/poison.flf diff --git a/test/Spectre.Console.Tests/Data/starwars.flf b/src/Tests/Spectre.Console.Tests/Data/starwars.flf similarity index 100% rename from test/Spectre.Console.Tests/Data/starwars.flf rename to src/Tests/Spectre.Console.Tests/Data/starwars.flf diff --git a/test/Spectre.Console.Tests/Expectations/AlternateScreen/Show.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/AlternateScreen/Show.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/AlternateScreen/Show.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/AlternateScreen/Show.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/ArgumentCannotContainOptions.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ArgumentCannotContainOptions.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/ArgumentCannotContainOptions.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ArgumentCannotContainOptions.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInOptionName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInOptionName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInOptionName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInOptionName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInValueName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInValueName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInValueName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/InvalidCharacterInValueName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/MissingLongAndShortName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MissingLongAndShortName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/MissingLongAndShortName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MissingLongAndShortName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleOptionValuesAreNotSupported.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleValuesAreNotSupported.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleValuesAreNotSupported.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleValuesAreNotSupported.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/MultipleValuesAreNotSupported.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionNamesCannotStartWithDigit.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionsMustHaveName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionsMustHaveName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionsMustHaveName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/OptionsMustHaveName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ShortOptionMustOnlyBeOneCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/UnexpectedCharacter.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/UnexpectedCharacter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/UnexpectedCharacter.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/UnexpectedCharacter.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/UnterminatedValueName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/UnterminatedValueName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/UnterminatedValueName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/UnterminatedValueName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Arguments/ValuesMustHaveName.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ValuesMustHaveName.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Arguments/ValuesMustHaveName.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Arguments/ValuesMustHaveName.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/ArgumentOrder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/ArgumentOrder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/ArgumentOrder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/ArgumentOrder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Command.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Command.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Command.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Command.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/CommandExamples.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/CommandExamples.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/CommandExamples.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/CommandExamples.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Default.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Default.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Default.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Default.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/DefaultExamples.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/DefaultExamples.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/DefaultExamples.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/DefaultExamples.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Command_Options.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Command_Options.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Command_Options.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Command_Options.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Commands.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Commands.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Commands.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Hidden_Commands.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/Leaf.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Leaf.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/Leaf.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Leaf.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/NoDescription.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/NoDescription.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/NoDescription.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/NoDescription.Output.verified.txt diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Root.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Cli.Tests/Expectations/Help/Root.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/Root.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Children.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Children.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Children.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Children.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Leafs.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Leafs.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Leafs.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Help/RootExamples_Leafs.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/CannotAssignValueToFlag/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/InvalidShortOptionName/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameContainSymbol/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsMissing/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameIsOneCharacter/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/LongOptionNameStartWithDigit/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoMatchingArgument/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoMatchingArgument/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoMatchingArgument/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoMatchingArgument/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/NoValueForOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/OptionWithoutName/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnexpectedOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_6.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_6.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_6.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_6.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_7.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_7.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_7.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_7.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_8.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_8.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_8.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownCommand/Test_8.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Parsing/UnknownOption/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Hidden_Command_Options.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Hidden_Command_Options.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Hidden_Command_Options.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Hidden_Command_Options.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_1.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_1.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_1.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_1.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_3.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_3.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_3.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_3.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_4.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_4.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_4.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_4.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_5.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_5.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_5.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_5.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_6.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_6.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Cli/Xml/Test_6.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Cli/Xml/Test_6.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/CallSite.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/CallSite.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/CallSite.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/CallSite.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/Default.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/Default.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/Default.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/Default.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/InnerException.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/InnerException.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/InnerException.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/InnerException.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/NoStackTrace.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/NoStackTrace.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/NoStackTrace.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/NoStackTrace.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/OutParam.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/OutParam.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/OutParam.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/OutParam.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/ShortenedMethods.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/ShortenedMethods.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/ShortenedMethods.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/ShortenedMethods.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/ShortenedTypes.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/ShortenedTypes.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/ShortenedTypes.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/ShortenedTypes.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Exception/Tuple.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Exception/Tuple.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Exception/Tuple.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Exception/Tuple.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Live/Progress/Render_ReduceWidth.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Live/Progress/Render_ReduceWidth.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Live/Progress/Render_ReduceWidth.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Live/Progress/Render_ReduceWidth.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Live/Status/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Live/Status/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Live/Status/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Live/Status/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/AcceptChoice.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AcceptChoice.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/AcceptChoice.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AcceptChoice.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_BestMatch.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_BestMatch.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_BestMatch.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_BestMatch.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_Empty.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_Empty.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_Empty.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_Empty.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_NextChoice.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_NextChoice.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_NextChoice.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_NextChoice.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_PreviousChoice.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_PreviousChoice.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_PreviousChoice.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/AutoComplete_PreviousChoice.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleNotSet.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleNotSet.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleNotSet.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleNotSet.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleSet.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleSet.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleSet.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ChoicesStyleSet.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/ConversionError.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ConversionError.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/ConversionError.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/ConversionError.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/CustomConverter.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/CustomConverter.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/CustomConverter.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/CustomConverter.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/CustomValidation.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/CustomValidation.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/CustomValidation.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/CustomValidation.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValue.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValue.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValue.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValue.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleNotSet.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleNotSet.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleNotSet.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleNotSet.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleSet.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleSet.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleSet.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/DefaultValueStyleSet.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/InvalidChoice.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/InvalidChoice.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/InvalidChoice.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/InvalidChoice.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/NoSuffix.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/NoSuffix.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/NoSuffix.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/NoSuffix.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValue.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValue.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValue.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValue.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueCustomMask.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueCustomMask.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueCustomMask.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueCustomMask.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueNullMask.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueNullMask.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueNullMask.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretDefaultValueNullMask.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretValueBackspaceNullMask.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretValueBackspaceNullMask.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Prompts/Text/SecretValueBackspaceNullMask.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Prompts/Text/SecretValueBackspaceNullMask.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/AsciiBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/AsciiBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/AsciiBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/AsciiBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/DoubleBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/DoubleBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/DoubleBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/DoubleBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/HeavyBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/HeavyBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/HeavyBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/HeavyBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder_With_Header.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder_With_Header.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder_With_Header.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/NoBorder_With_Header.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/RoundedBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/RoundedBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/RoundedBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/RoundedBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/SquareBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/SquareBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/SquareBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Box/SquareBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/Ascii2Border.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/Ascii2Border.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/Ascii2Border.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/Ascii2Border.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiDoubleHeadBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiDoubleHeadBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiDoubleHeadBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/AsciiDoubleHeadBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleEdgeBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleEdgeBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleEdgeBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/DoubleEdgeBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyEdgeBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyEdgeBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyEdgeBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyEdgeBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyHeadBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyHeadBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyHeadBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HeavyHeadBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HorizontalBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HorizontalBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HorizontalBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/HorizontalBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_Centered.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_Centered.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_Centered.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_LeftAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_LeftAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_LeftAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_RightAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_RightAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MarkdownBorder_RightAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalDoubleHeadBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalDoubleHeadBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalDoubleHeadBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalDoubleHeadBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalHeavyHeadBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalHeavyHeadBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalHeavyHeadBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/MinimalHeavyHeadBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/NoBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/NoBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/NoBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/NoBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/RoundedBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/RoundedBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/RoundedBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/RoundedBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleHeavyBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleHeavyBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleHeavyBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SimpleHeavyBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SquareBorder.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SquareBorder.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SquareBorder.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Rendering/Borders/Table/SquareBorder.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_Renderable.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_Renderable.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_Renderable.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_Renderable.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_String.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_String.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_String.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_String.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Bottom.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Bottom.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Bottom.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Bottom.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Middle.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Middle.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Middle.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Middle.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Top.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Top.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Top.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Center_Top.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Bottom.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Bottom.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Bottom.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Bottom.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Middle.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Middle.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Middle.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Middle.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Top.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Top.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Top.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Left_Top.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Bottom.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Bottom.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Bottom.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Bottom.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Middle.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Middle.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Middle.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Middle.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Top.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Top.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Top.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Align/Right_Top.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Fixed_Max_Value.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Fixed_Max_Value.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Fixed_Max_Value.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Fixed_Max_Value.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Zero_Value.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Zero_Value.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BarChart/Zero_Value.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BarChart/Zero_Value.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Ansi.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Ansi.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Ansi.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Ansi.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Culture.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Culture.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Culture.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Culture.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Default.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Default.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Default.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Default.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/FullSize.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/FullSize.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/FullSize.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/FullSize.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTagValues.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTagValues.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTagValues.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTagValues.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTags.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTags.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTags.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/HideTags.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/TagFormat.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/TagFormat.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/TagFormat.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/TagFormat.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/ValueColor.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/ValueColor.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/ValueColor.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/ValueColor.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Width.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Width.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Width.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/BreakdownChart/Width.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Centered.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Centered.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Centered.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Culture.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Culture.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Culture.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Culture.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Calendar/LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/LeftAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Calendar/LeftAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/LeftAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Calendar/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Calendar/RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/RightAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Calendar/RightAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Calendar/RightAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_MaxWidth.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_MaxWidth.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_MaxWidth.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_MaxWidth.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_NarrowTerminal.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_NarrowTerminal.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_NarrowTerminal.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_NarrowTerminal.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_Nested.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_Nested.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_Nested.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Canvas/Render_Nested.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Columns/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Columns/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Columns/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Columns/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=poison.flf.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=poison.flf.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=poison.flf.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=poison.flf.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=starwars.flf.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=starwars.flf.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=starwars.flf.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Load_Stream.Output_fontfile=starwars.flf.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Centered.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Centered.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Centered.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_LeftAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_LeftAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_LeftAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_RightAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_RightAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_RightAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Wrapped.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Wrapped.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Wrapped.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Figlet/Render_Wrapped.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/AddEmptyRow/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/AddEmptyRow/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/AddEmptyRow/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/AddEmptyRow/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_2.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_2.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_2.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_2.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Alignment.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Alignment.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Alignment.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Alignment.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_ExplicitPadding.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_ExplicitPadding.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_ExplicitPadding.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_ExplicitPadding.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Padding.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Padding.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Padding.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Grid/Render_Padding.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Json/Render_Json.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Json/Render_Json.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Json/Render_Json.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Json/Render_Json.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Empty_Layout.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Empty_Layout.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Empty_Layout.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Empty_Layout.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Fallback_Layout.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Fallback_Layout.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Fallback_Layout.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Fallback_Layout.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Columns.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Columns.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Columns.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Columns.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Columns.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Columns.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Columns.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Columns.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows_And_Columns.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows_And_Columns.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows_And_Columns.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Nested_Rows_And_Columns.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Minimum_Size.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Minimum_Size.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Minimum_Size.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Minimum_Size.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Ratio.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Ratio.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Ratio.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Ratio.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Size.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Size.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Size.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Respect_To_Size.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Rows.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Rows.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Rows.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Rows.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_Without_Invisible_Children.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_Without_Invisible_Children.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_Without_Invisible_Children.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_Without_Invisible_Children.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Expanded.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Expanded.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Expanded.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Expanded.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Nested.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Nested.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Nested.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Padder/Render_Nested.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_CJK.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_CJK.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_CJK.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_CJK.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Centered.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Centered.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Centered.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Panel.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Panel.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Panel.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_Panel.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_RightAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_RightAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Child_RightAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Expand.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Expand.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Expand.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Expand.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Centered.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Centered.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Centered.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Collapse.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Collapse.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Collapse.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_Collapse.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_LeftAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_LeftAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_LeftAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_RightAligned.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_RightAligned.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Header_RightAligned.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Height.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Height.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Height.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Height.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_LineEndings.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_LineEndings.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_LineEndings.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_LineEndings.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Multiline.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Multiline.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Multiline.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Multiline.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Padding.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Padding.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Padding.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Padding.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Unicode.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Unicode.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Unicode.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Unicode.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_Height.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_Height.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_Height.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_Height.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_MaxWidth.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_MaxWidth.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_MaxWidth.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Width_MaxWidth.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Wrap.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Wrap.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Wrap.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_Wrap.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_ZeroPadding.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_ZeroPadding.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_ZeroPadding.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Panel/Render_ZeroPadding.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Formatted.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Formatted.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Formatted.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Formatted.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Render.Output.verified.txt similarity index 100% rename from test/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Render.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/ProgressBar/Render.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt similarity index 81% rename from test/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt index 84a882e1..ee7fd0ce 100644 --- a/test/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt +++ b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt @@ -1,8 +1,8 @@
 ┌─────────────────┬───────┬─────┐
- Foo              Bar    Qux 
+ Foo              Bar    Qux 
 ├─────────────────┼───────┼─────┤
- Corgi            Waldo  Zap 
+ Corgi            Waldo  Zap 
  ─────────────             
   Hello World              
  ─────────────             
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Recorder/Text.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Recorder/Text.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Recorder/Text.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Recorder/Text.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rows/GH-1188-Rows.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/GH-1188-Rows.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rows/GH-1188-Rows.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/GH-1188-Rows.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Empty.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Empty.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Empty.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Empty.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Expanded_And_Nested.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Expanded_And_Nested.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Expanded_And_Nested.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Expanded_And_Nested.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Nested.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Nested.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Nested.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rows/Render_Nested.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_Header.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_Header.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_Header.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_Header.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_NoHeader.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_NoHeader.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_NoHeader.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Border_NoHeader.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_DefaultAlignment.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_DefaultAlignment.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_DefaultAlignment.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_DefaultAlignment.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_LeftAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_LeftAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_LeftAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_RightAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_RightAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Header_RightAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Linebreaks.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Linebreaks.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Linebreaks.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Linebreaks.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Truncate.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Truncate.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Truncate.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Rule/Render_Truncate.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/AddEmptyRow.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/AddEmptyRow.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/AddEmptyRow.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/AddEmptyRow.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_CellPadding.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_CellPadding.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_CellPadding.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_CellPadding.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Align_Widget.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Align_Widget.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Align_Widget.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Align_Widget.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Centered.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_ColumnJustification.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_ColumnJustification.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_ColumnJustification.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_ColumnJustification.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_EA_Character.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_EA_Character.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_EA_Character.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_EA_Character.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Expand.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Expand.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Expand.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Expand.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Fold.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Fold.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Fold.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Fold.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Footers.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Footers.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Footers.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Footers.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Impossible.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Impossible.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Impossible.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Impossible.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Align_Widget.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Align_Widget.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Align_Widget.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Align_Widget.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_LeftAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Multiline.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Multiline.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Multiline.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Multiline.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Nested.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Nested.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Nested.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Nested.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_NoRows.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_NoRows.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_NoRows.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_NoRows.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Align_Widget.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Align_Widget.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Align_Widget.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Align_Widget.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_RightAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators.Output.verified.txt
diff --git a/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators_No_Header.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators_No_Header.Output.verified.txt
new file mode 100644
index 00000000..e296413d
--- /dev/null
+++ b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Row_Separators_No_Header.Output.verified.txt
@@ -0,0 +1,7 @@
+┌────────┬────────┐
+│ Qux    │ Corgi  │
+├────────┼────────┤
+│ Waldo  │ Grault │
+├────────┼────────┤
+│ Garply │ Fred   │
+└────────┴────────┘
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_Centered.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_Centered.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_Centered.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_Centered.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LeftAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LeftAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LeftAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LeftAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LowerCase.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LowerCase.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LowerCase.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_LowerCase.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_RightAligned.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_RightAligned.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_RightAligned.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Title_Caption_RightAligned.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Add.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Add.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Add.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Add.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Renderables.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Renderables.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Renderables.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Renderables.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Strings.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Strings.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Strings.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Add.Strings.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Renderables.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Renderables.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Renderables.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Renderables.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Strings.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Strings.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Strings.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Insert.Strings.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Remove.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Remove.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Remove.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Extensions/Remove.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Insert.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Insert.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Insert.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Insert.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Remove.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Remove.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Remove.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Table/Rows/Remove.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/TextPath/GH-1307.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/TextPath/GH-1307.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/TextPath/GH-1307.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/TextPath/GH-1307.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Tree/Render.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Tree/Render.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Tree/Render.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Tree/Render.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Tree/Render_NoChildren.Output.verified.txt b/src/Tests/Spectre.Console.Tests/Expectations/Widgets/Tree/Render_NoChildren.Output.verified.txt
similarity index 100%
rename from test/Spectre.Console.Tests/Expectations/Widgets/Tree/Render_NoChildren.Output.verified.txt
rename to src/Tests/Spectre.Console.Tests/Expectations/Widgets/Tree/Render_NoChildren.Output.verified.txt
diff --git a/test/Spectre.Console.Tests/Extensions/ConsoleKeyExtensions.cs b/src/Tests/Spectre.Console.Tests/Extensions/ConsoleKeyExtensions.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Extensions/ConsoleKeyExtensions.cs
rename to src/Tests/Spectre.Console.Tests/Extensions/ConsoleKeyExtensions.cs
diff --git a/test/Spectre.Console.Tests/Extensions/StreamExtensions.cs b/src/Tests/Spectre.Console.Tests/Extensions/StreamExtensions.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Extensions/StreamExtensions.cs
rename to src/Tests/Spectre.Console.Tests/Extensions/StreamExtensions.cs
diff --git a/test/Spectre.Console.Tests/Properties/Usings.cs b/src/Tests/Spectre.Console.Tests/Properties/Usings.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Properties/Usings.cs
rename to src/Tests/Spectre.Console.Tests/Properties/Usings.cs
diff --git a/src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj b/src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj
new file mode 100644
index 00000000..97100e1f
--- /dev/null
+++ b/src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj
@@ -0,0 +1,35 @@
+
+
+  
+    net8.0;net7.0;net6.0
+  
+
+  
+    
+    
+    
+    
+    
+    
+  
+
+  
+    
+    
+    
+    
+    
+    
+      all
+      runtime; build; native; contentfiles; analyzers; buildtransitive
+    
+  
+
+  
+    
+    
+    
+    
+  
+
+
diff --git a/test/Spectre.Console.Tests/Unit/AlternateScreenTests.cs b/src/Tests/Spectre.Console.Tests/Unit/AlternateScreenTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AlternateScreenTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AlternateScreenTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Advanced.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Advanced.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Advanced.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Advanced.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Colors.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Cursor.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.MarkupInterpolated.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.MarkupInterpolated.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.MarkupInterpolated.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.MarkupInterpolated.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Prompt.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Prompt.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Prompt.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Prompt.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.Style.cs
diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs b/src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/AnsiConsoleTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/ColorSystemTests.cs b/src/Tests/Spectre.Console.Tests/Unit/ColorSystemTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/ColorSystemTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/ColorSystemTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/ColorTests.cs b/src/Tests/Spectre.Console.Tests/Unit/ColorTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/ColorTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/ColorTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/EmojiTests.cs b/src/Tests/Spectre.Console.Tests/Unit/EmojiTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/EmojiTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/EmojiTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/ExceptionTests.cs b/src/Tests/Spectre.Console.Tests/Unit/ExceptionTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/ExceptionTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/ExceptionTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/HighlightTests.cs b/src/Tests/Spectre.Console.Tests/Unit/HighlightTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/HighlightTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/HighlightTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Live/Progress/DownloadedColumnTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Live/Progress/DownloadedColumnTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Live/Progress/DownloadedColumnTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Live/Progress/DownloadedColumnTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Live/Progress/ProgressColumnFixture.cs b/src/Tests/Spectre.Console.Tests/Unit/Live/Progress/ProgressColumnFixture.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Live/Progress/ProgressColumnFixture.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Live/Progress/ProgressColumnFixture.cs
diff --git a/test/Spectre.Console.Tests/Unit/Live/Progress/ProgressTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Live/Progress/ProgressTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Live/Progress/ProgressTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Live/Progress/ProgressTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Live/StatusTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Live/StatusTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Live/StatusTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Live/StatusTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs
similarity index 93%
rename from test/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs
index cda4f375..2a45b66b 100644
--- a/test/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs
+++ b/src/Tests/Spectre.Console.Tests/Unit/Prompts/ListPromptStateTests.cs
@@ -3,7 +3,10 @@ namespace Spectre.Console.Tests.Unit;
 public sealed class ListPromptStateTests
 {
     private ListPromptState CreateListPromptState(int count, int pageSize, bool shouldWrap, bool searchEnabled)
-        => new(Enumerable.Range(0, count).Select(i => new ListPromptItem(i.ToString())).ToList(), pageSize, shouldWrap, SelectionMode.Independent, true, searchEnabled);
+        => new(
+            Enumerable.Range(0, count).Select(i => new ListPromptItem(i.ToString())).ToList(),
+            text => text,
+            pageSize, shouldWrap, SelectionMode.Independent, true, searchEnabled);
 
     [Fact]
     public void Should_Have_Start_Index_Zero()
diff --git a/test/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs
similarity index 77%
rename from test/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs
index 70a27ba1..43b1d5c3 100644
--- a/test/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs
+++ b/src/Tests/Spectre.Console.Tests/Unit/Prompts/MultiSelectionPromptTests.cs
@@ -2,25 +2,6 @@ namespace Spectre.Console.Tests.Unit;
 
 public sealed class MultiSelectionPromptTests
 {
-    private class CustomItem
-    {
-        public int X { get; set; }
-        public int Y { get; set; }
-
-        public class Comparer : IEqualityComparer
-        {
-            public bool Equals(CustomItem x, CustomItem y)
-            {
-                return x.X == y.X && x.Y == y.Y;
-            }
-
-            public int GetHashCode(CustomItem obj)
-            {
-                throw new NotSupportedException();
-            }
-        }
-    }
-
     [Fact]
     public void Should_Not_Mark_Item_As_Selected_By_Default()
     {
@@ -146,4 +127,40 @@ public sealed class MultiSelectionPromptTests
         // Then
         action.ShouldThrow();
     }
+
+    [Fact] public void Should_Throw_Meaningful_Exception_For_Empty_Prompt()
+    {
+        // Given
+        var console = new TestConsole();
+        console.Profile.Capabilities.Interactive = true;
+        console.Input.PushKey(ConsoleKey.Spacebar);
+
+        var prompt = new MultiSelectionPrompt();
+
+        // When
+        Action action = () => prompt.Show(console);
+
+        // Then
+        var exception = action.ShouldThrow();
+        exception.Message.ShouldBe("Cannot show an empty selection prompt. Please call the AddChoice() method to configure the prompt.");
+    }
+}
+
+file sealed class CustomItem
+{
+    public int X { get; set; }
+    public int Y { get; set; }
+
+    public class Comparer : IEqualityComparer
+    {
+        public bool Equals(CustomItem x, CustomItem y)
+        {
+            return x.X == y.X && x.Y == y.Y;
+        }
+
+        public int GetHashCode(CustomItem obj)
+        {
+            throw new NotSupportedException();
+        }
+    }
 }
diff --git a/test/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs
similarity index 62%
rename from test/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs
index 5878c9df..2e066c5f 100644
--- a/test/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs
+++ b/src/Tests/Spectre.Console.Tests/Unit/Prompts/SelectionPromptTests.cs
@@ -85,4 +85,61 @@ public sealed class SelectionPromptTests
         // Then
         console.Output.ShouldContain($"{ESC}[38;5;12m> Item {ESC}[0m{ESC}[1;38;5;12;48;5;11m1{ESC}[0m");
     }
+
+    [Fact]
+    public void Should_Search_In_Remapped_Result()
+    {
+        // Given
+        var console = new TestConsole();
+        console.Profile.Capabilities.Interactive = true;
+        console.EmitAnsiSequences();
+        console.Input.PushText("2");
+        console.Input.PushKey(ConsoleKey.Enter);
+
+        var choices = new List
+        {
+            new(33, "Item 1"),
+            new(34, "Item 2"),
+        };
+
+        var prompt = new SelectionPrompt()
+            .Title("Select one")
+            .EnableSearch()
+            .UseConverter(o => o.Name)
+            .AddChoices(choices);
+
+        // When
+        var selection = prompt.Show(console);
+
+        // Then
+        selection.ShouldBe(choices[1]);
+    }
+
+    [Fact] public void Should_Throw_Meaningful_Exception_For_Empty_Prompt()
+    {
+        // Given
+        var console = new TestConsole();
+        console.Profile.Capabilities.Interactive = true;
+
+        var prompt = new SelectionPrompt();
+
+        // When
+        Action action = () => prompt.Show(console);
+
+        // Then
+        var exception = action.ShouldThrow();
+        exception.Message.ShouldBe("Cannot show an empty selection prompt. Please call the AddChoice() method to configure the prompt.");
+    }
+}
+
+file sealed class CustomSelectionItem
+{
+    public int Value { get; }
+    public string Name { get; }
+
+    public CustomSelectionItem(int value, string name)
+    {
+        Value = value;
+        Name = name ?? throw new ArgumentNullException(nameof(name));
+    }
 }
diff --git a/test/Spectre.Console.Tests/Unit/Prompts/TextPromptTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Prompts/TextPromptTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Prompts/TextPromptTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Prompts/TextPromptTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/RecorderTests.cs b/src/Tests/Spectre.Console.Tests/Unit/RecorderTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/RecorderTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/RecorderTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Rendering/Borders/BoxBorderTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Rendering/Borders/BoxBorderTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Rendering/Borders/BoxBorderTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Rendering/Borders/BoxBorderTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Rendering/Borders/TableBorderTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Rendering/Borders/TableBorderTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Rendering/Borders/TableBorderTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Rendering/Borders/TableBorderTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Rendering/RenderHookTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Rendering/RenderHookTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Rendering/RenderHookTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Rendering/RenderHookTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Rendering/SegmentTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Rendering/SegmentTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Rendering/SegmentTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Rendering/SegmentTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/StyleTests.cs b/src/Tests/Spectre.Console.Tests/Unit/StyleTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/StyleTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/StyleTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/BarChartTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/BarChartTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/BarChartTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/BarChartTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/BreakdownChartTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/BreakdownChartTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/BreakdownChartTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/BreakdownChartTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/CalendarTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/CalendarTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/CalendarTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/CalendarTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/CanvasTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/CanvasTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/CanvasTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/CanvasTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/ColumnsTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/ColumnsTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/ColumnsTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/ColumnsTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/FigletTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/FigletTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/FigletTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/FigletTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/GridTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/GridTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/GridTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/GridTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/JsonTextTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/JsonTextTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/JsonTextTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/JsonTextTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/MarkupTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/MarkupTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/MarkupTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/MarkupTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/PadderTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/PadderTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/PadderTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/PadderTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/PanelTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/PanelTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/PanelTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/PanelTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/ProgressBarTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/ProgressBarTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/ProgressBarTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/ProgressBarTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/RowsTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/RowsTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/RowsTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/RowsTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/RuleTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/RuleTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/RuleTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/RuleTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionExtensionsTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionExtensionsTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionExtensionsTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionExtensionsTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableRowCollectionTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs
similarity index 96%
rename from test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs
index 9df30384..18379bdc 100644
--- a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs
+++ b/src/Tests/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs
@@ -159,6 +159,29 @@ public sealed class TableTests
         return Verifier.Verify(console.Output);
     }
 
+    [Fact]
+    [Expectation("Render_Row_Separators_No_Header")]
+    public Task Should_Render_Table_With_Row_Separators_No_Header_Correctly()
+    {
+        // Given
+        var console = new TestConsole();
+        var table = new Table();
+
+        table.ShowRowSeparators();
+        table.HideHeaders();
+
+        table.AddColumns("Foo", "Bar");
+        table.AddRow("Qux", "Corgi");
+        table.AddRow("Waldo", "Grault");
+        table.AddRow("Garply", "Fred");
+
+        // When
+        console.Write(table);
+
+        // Then
+        return Verifier.Verify(console.Output);
+    }
+
     [Fact]
     [Expectation("Render_EA_Character")]
     public Task Should_Render_Table_With_EA_Character_Correctly()
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/TextPathTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/TextPathTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/TextPathTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/TextPathTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/TextTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/TextTests.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Unit/Widgets/TextTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/TextTests.cs
diff --git a/test/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs b/src/Tests/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs
similarity index 59%
rename from test/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs
rename to src/Tests/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs
index c731af99..73912a03 100644
--- a/test/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs
+++ b/src/Tests/Spectre.Console.Tests/Unit/Widgets/TreeTests.cs
@@ -72,4 +72,57 @@ public class TreeTests
         // Then
         result.ShouldBeOfType();
     }
+
+    [Fact]
+    [Expectation("Render_NoChildren_OfCollapsed")]
+    public void Should_Render_Tree_With_No_Child_Of_Collapsed_Nodes_Correctly()
+    {
+        // Given
+        var console = new TestConsole();
+        var tree = new Tree(new Text("Root node"));
+        var node1 = new TreeNode(new Text("Node level 1"));
+        node1.AddNode(new TreeNode(new Text("Node level 2")));
+        tree.AddNode(node1);
+        node1.Expanded = false;
+
+        // When
+        console.Write(tree);
+
+        // Then
+        console.Output.SplitLines()
+            .Select(x => x.Trim())
+            .ToArray()
+            .ShouldBeEquivalentTo(new[]
+            {
+                "Root node",
+                "└── Node level 1",
+                string.Empty,
+            });
+    }
+
+    [Fact]
+    [Expectation("Render_NoChildren_IfRouteCollapsed")]
+    public void Should_Render_Tree_With_No_Child_If_Route_Collapsed_Correctly()
+    {
+        // Given
+        var console = new TestConsole();
+        var tree = new Tree(new Text("Root node"));
+        var node1 = new TreeNode(new Text("Node level 1"));
+        node1.AddNode(new TreeNode(new Text("Node level 2")));
+        tree.AddNode(node1);
+        tree.Expanded = false;
+
+        // When
+        console.Write(tree);
+
+        // Then
+        console.Output.SplitLines()
+            .Select(x => x.Trim())
+            .ToArray()
+            .ShouldBeEquivalentTo(new[]
+            {
+                "Root node",
+                string.Empty,
+            });
+    }
 }
diff --git a/test/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs b/src/Tests/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs
rename to src/Tests/Spectre.Console.Tests/Utilities/EmbeddedResourceReader.cs
diff --git a/test/Spectre.Console.Tests/Utilities/GitHubIssueAttribute.cs b/src/Tests/Spectre.Console.Tests/Utilities/GitHubIssueAttribute.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Utilities/GitHubIssueAttribute.cs
rename to src/Tests/Spectre.Console.Tests/Utilities/GitHubIssueAttribute.cs
diff --git a/test/Spectre.Console.Tests/Utilities/ModuleInitializerAttribute.cs b/src/Tests/Spectre.Console.Tests/Utilities/ModuleInitializerAttribute.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Utilities/ModuleInitializerAttribute.cs
rename to src/Tests/Spectre.Console.Tests/Utilities/ModuleInitializerAttribute.cs
diff --git a/test/Spectre.Console.Tests/Utilities/TestConsoleExtensions.cs b/src/Tests/Spectre.Console.Tests/Utilities/TestConsoleExtensions.cs
similarity index 100%
rename from test/Spectre.Console.Tests/Utilities/TestConsoleExtensions.cs
rename to src/Tests/Spectre.Console.Tests/Utilities/TestConsoleExtensions.cs
diff --git a/test/Spectre.Console.Tests/VerifyConfiguration.cs b/src/Tests/Spectre.Console.Tests/VerifyConfiguration.cs
similarity index 100%
rename from test/Spectre.Console.Tests/VerifyConfiguration.cs
rename to src/Tests/Spectre.Console.Tests/VerifyConfiguration.cs
diff --git a/test/Directory.Build.props b/test/Directory.Build.props
deleted file mode 100644
index f84f33a9..00000000
--- a/test/Directory.Build.props
+++ /dev/null
@@ -1,16 +0,0 @@
-
-  
-    12
-    false
-    true
-  
-
-  
-    
-      All
-    
-    
-      All
-    
-  
-
\ No newline at end of file
diff --git a/test/Spectre.Console.Analyzer.Tests/CodeAnalyzerHelper.cs b/test/Spectre.Console.Analyzer.Tests/CodeAnalyzerHelper.cs
deleted file mode 100644
index 860fcc88..00000000
--- a/test/Spectre.Console.Analyzer.Tests/CodeAnalyzerHelper.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests;
-
-internal static class CodeAnalyzerHelper
-{
-    internal static ReferenceAssemblies CurrentSpectre { get; }
-
-    static CodeAnalyzerHelper()
-    {
-        CurrentSpectre = ReferenceAssemblies.Net.Net60.AddAssemblies(
-            ImmutableArray.Create(typeof(AnsiConsole).Assembly.Location.Replace(".dll", string.Empty)));
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/CodeFixProviderDiscovery.cs b/test/Spectre.Console.Analyzer.Tests/CodeFixProviderDiscovery.cs
deleted file mode 100644
index 9cfb44d0..00000000
--- a/test/Spectre.Console.Analyzer.Tests/CodeFixProviderDiscovery.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests;
-
-internal static class CodeFixProviderDiscovery
-{
-    private static readonly Lazy _exportProviderFactory;
-
-    static CodeFixProviderDiscovery()
-    {
-        _exportProviderFactory = new Lazy(
-            () =>
-            {
-                var discovery = new AttributedPartDiscovery(Resolver.DefaultInstance, isNonPublicSupported: true);
-                var parts = Task.Run(() => discovery.CreatePartsAsync(typeof(SystemConsoleToAnsiConsoleFix).Assembly)).GetAwaiter().GetResult();
-                var catalog = ComposableCatalog.Create(Resolver.DefaultInstance).AddParts(parts);
-
-                var configuration = CompositionConfiguration.Create(catalog);
-                var runtimeComposition = RuntimeComposition.CreateRuntimeComposition(configuration);
-                return runtimeComposition.CreateExportProviderFactory();
-            },
-            LazyThreadSafetyMode.ExecutionAndPublication);
-    }
-
-    public static IEnumerable GetCodeFixProviders(string language)
-    {
-        var exportProvider = _exportProviderFactory.Value.CreateExportProvider();
-        var exports = exportProvider.GetExports();
-        return exports.Where(export => export.Metadata.Languages.Contains(language)).Select(export => export.Value);
-    }
-
-    private class LanguageMetadata
-    {
-        public LanguageMetadata(IDictionary data)
-        {
-            if (!data.TryGetValue(nameof(ExportCodeFixProviderAttribute.Languages), out var languages))
-            {
-                languages = Array.Empty();
-            }
-
-            Languages = ((string[])languages).ToImmutableArray();
-        }
-
-        public ImmutableArray Languages { get; }
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Properties/Usings.cs b/test/Spectre.Console.Analyzer.Tests/Properties/Usings.cs
deleted file mode 100644
index 394e6fe2..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Properties/Usings.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-global using System;
-global using System.Collections.Generic;
-global using System.Collections.Immutable;
-global using System.Linq;
-global using System.Threading;
-global using System.Threading.Tasks;
-global using Microsoft.CodeAnalysis;
-global using Microsoft.CodeAnalysis.CodeFixes;
-global using Microsoft.CodeAnalysis.CSharp.Testing;
-global using Microsoft.CodeAnalysis.Diagnostics;
-global using Microsoft.CodeAnalysis.Testing;
-global using Microsoft.CodeAnalysis.Testing.Verifiers;
-global using Microsoft.VisualStudio.Composition;
-global using Spectre.Console.Analyzer.FixProviders;
-global using Xunit;
\ No newline at end of file
diff --git a/test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj b/test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj
deleted file mode 100644
index b33f08a2..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-  
-    net6.0
-    false
-  
-
-  
-    
-  
-
-  
-    
-    
-    
-    
-    
-    
-      runtime; build; native; contentfiles; analyzers; buildtransitive
-      all
-    
-  
-
-  
-    
-    
-  
-
-
diff --git a/test/Spectre.Console.Analyzer.Tests/SpectreAnalyzerVerifier.cs b/test/Spectre.Console.Analyzer.Tests/SpectreAnalyzerVerifier.cs
deleted file mode 100644
index eb333f27..00000000
--- a/test/Spectre.Console.Analyzer.Tests/SpectreAnalyzerVerifier.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests;
-
-public static class SpectreAnalyzerVerifier
-    where TAnalyzer : DiagnosticAnalyzer, new()
-{
-    public static Task VerifyCodeFixAsync(string source, DiagnosticResult expected, string fixedSource)
-        => VerifyCodeFixAsync(source, OutputKind.DynamicallyLinkedLibrary, new[] { expected }, fixedSource);
-
-    public static Task VerifyCodeFixAsync(string source, OutputKind outputKind, DiagnosticResult expected, string fixedSource)
-        => VerifyCodeFixAsync(source, outputKind, new[] { expected }, fixedSource);
-
-    private static Task VerifyCodeFixAsync(string source, OutputKind outputKind, IEnumerable expected, string fixedSource)
-    {
-        var test = new Test
-        {
-            TestCode = source,
-            TestState =
-            {
-                OutputKind = outputKind,
-            },
-            FixedCode = fixedSource,
-        };
-
-        test.ExpectedDiagnostics.AddRange(expected);
-        return test.RunAsync();
-    }
-
-    public static Task VerifyAnalyzerAsync(string source, params DiagnosticResult[] expected)
-    {
-        var test = new Test
-        {
-            TestCode = source,
-            CompilerDiagnostics = CompilerDiagnostics.All,
-        };
-
-        test.ExpectedDiagnostics.AddRange(expected);
-        return test.RunAsync();
-    }
-
-    // Code fix tests support both analyzer and code fix testing. This test class is derived from the code fix test
-    // to avoid the need to maintain duplicate copies of the customization work.
-    private class Test : CSharpCodeFixTest
-    {
-        public Test()
-        {
-            ReferenceAssemblies = CodeAnalyzerHelper.CurrentSpectre;
-            TestBehaviors |= TestBehaviors.SkipGeneratedCodeCheck;
-        }
-
-        protected override IEnumerable GetCodeFixProviders()
-        {
-            var analyzer = new TAnalyzer();
-            foreach (var provider in CodeFixProviderDiscovery.GetCodeFixProviders(Language))
-            {
-                if (analyzer.SupportedDiagnostics.Any(diagnostic => provider.FixableDiagnosticIds.Contains(diagnostic.Id)))
-                {
-                    yield return provider;
-                }
-            }
-        }
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoConcurrentLiveRenderablesTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoConcurrentLiveRenderablesTests.cs
deleted file mode 100644
index 423ba05f..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoConcurrentLiveRenderablesTests.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Analyzers;
-
-public class NoCurrentLiveRenderablesTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostics = new(
-        Descriptors.S1020_AvoidConcurrentCallsToMultipleLiveRenderables.Id,
-        DiagnosticSeverity.Warning);
-
-    [Fact]
-    public async void Status_call_within_live_call_warns()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void Go()
-    {
-        AnsiConsole.Live(new Table()).Start(ctx =>
-        {
-            AnsiConsole.Status().Start(""go"", innerCtx => {});
-        });
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(10, 13));
-    }
-
-    [Fact]
-    public async void Status_call_within_live_call_warns_with_instance()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class Child
-{
-    public readonly IAnsiConsole _console = AnsiConsole.Console;
-
-    public void Go()
-    {
-        _console.Status().Start(""starting"", context =>
-        {
-            _console.Progress().Start(progressContext => { });
-        });
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(12, 13));
-    }
-
-    [Fact]
-    public async void Calling_start_on_non_live_renderable_has_no_warning()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class Program
-{
-    static void Main()
-    {
-        Start();
-    }
-
-    static void Start() =>  AnsiConsole.WriteLine(""Starting..."");
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoPromptsDuringLiveRenderablesTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoPromptsDuringLiveRenderablesTests.cs
deleted file mode 100644
index c08e79ee..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/NoPromptsDuringLiveRenderablesTests.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Analyzers;
-
-public class NoPromptsDuringLiveRenderablesTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostics = new(
-        Descriptors.S1021_AvoidPromptCallsDuringLiveRenderables.Id,
-        DiagnosticSeverity.Warning);
-
-    [Fact]
-    public async Task Prompt_out_of_progress_does_not_warn()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void Go()
-    {
-        var s = AnsiConsole.Ask(""How are you?"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-
-    [Fact]
-    public async Task Instance_variables_warn()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    public IAnsiConsole _console = AnsiConsole.Console;
-
-    public void Go()
-    {
-        _console.Status().Start(""starting"", context =>
-        {
-            var result = _console.Confirm(""we ok?"");
-        });
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(12, 26));
-    }
-
-    [Fact]
-    public async Task Prompt_in_progress_warns()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void Go()
-    {
-        AnsiConsole.Progress().Start(_ =>
-        {
-            AnsiConsole.Ask(""How are you?"");
-        });
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(10, 13));
-    }
-
-    [Fact]
-    public async Task Can_call_other_methods_from_within_renderables()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class Program
-{
-    static void Main()
-    {
-        AnsiConsole.Status().Start(""here we go"", context =>
-        {
-            var result = Confirm();
-
-        });
-    }
-
-    static string Confirm() => string.Empty;
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs
deleted file mode 100644
index 68450192..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseInstanceAnsiConsoleTests.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Analyzers;
-
-public class FavorInstanceAnsiConsoleOverStaticAnalyzerTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostics = new(
-        Descriptors.S1010_FavorInstanceAnsiConsoleOverStatic.Id,
-        DiagnosticSeverity.Info);
-
-    [Fact]
-    public async void Should_only_warn_within_methods()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-internal sealed class Foo
-{
-    private readonly IAnsiConsole _console;
-
-    public Foo(IAnsiConsole console = null)
-    {
-        _console = console ?? AnsiConsole.Create(new AnsiConsoleSettings());
-    }
-}
-";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-
-    [Fact]
-    public async void Instance_console_has_no_warnings()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        _ansiConsole.Write(""this is fine"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-
-    [Fact]
-    public async void Static_console_with_no_instance_variables_has_no_warnings()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        AnsiConsole.Write(""this is fine"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-
-    [Fact]
-    public async void Console_Write_Has_Warning()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        _ansiConsole.Write(""this is fine"");
-        AnsiConsole.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(11, 9));
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzerTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzerTests.cs
deleted file mode 100644
index 094315f0..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Analyzers/UseSpectreInsteadOfSystemConsoleAnalyzerTests.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Analyzers;
-
-public class UseSpectreInsteadOfSystemConsoleAnalyzerTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostics = new(
-        Descriptors.S1000_UseAnsiConsoleOverSystemConsole.Id,
-        DiagnosticSeverity.Warning);
-
-    [Fact]
-    public async void Non_configured_SystemConsole_methods_report_no_warnings()
-    {
-        const string Source = @"
-using System;
-
-class TestClass {
-    void TestMethod()
-    {
-        var s = Console.ReadLine();
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source);
-    }
-
-    [Fact]
-    public async void Console_Write_Has_Warning()
-    {
-        const string Source = @"
-using System;
-
-class TestClass {
-    void TestMethod()
-    {
-        Console.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(7, 9));
-    }
-
-    [Fact]
-    public async void Console_WriteLine_Has_Warning()
-    {
-        const string Source = @"
-using System;
-
-class TestClass
-{
-    void TestMethod() {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyAnalyzerAsync(Source, _expectedDiagnostics.WithLocation(7, 9));
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseInstanceOfStaticAnsiConsoleTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseInstanceOfStaticAnsiConsoleTests.cs
deleted file mode 100644
index 34fc7859..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseInstanceOfStaticAnsiConsoleTests.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Fixes;
-
-public class UseInstanceOfStaticAnsiConsoleTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostic = new(
-        Descriptors.S1010_FavorInstanceAnsiConsoleOverStatic.Id,
-        DiagnosticSeverity.Info);
-
-    [Fact]
-    public async Task Static_call_replaced_with_field_call()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        _ansiConsole.Write(""this is fine"");
-        AnsiConsole.Write(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        _ansiConsole.Write(""this is fine"");
-        _ansiConsole.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(11, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task Static_call_replaced_with_field_call_Should_Preserve_Trivia()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        var foo = 1;
-
-        AnsiConsole.Write(""this is fine"");
-        _ansiConsole.Write(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole = AnsiConsole.Console;
-
-    void TestMethod()
-    {
-        var foo = 1;
-
-        _ansiConsole.Write(""this is fine"");
-        _ansiConsole.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(12, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task Static_call_replaced_with_parameter_call()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod(IAnsiConsole ansiConsole)
-    {
-        AnsiConsole.Write(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod(IAnsiConsole ansiConsole)
-    {
-        ansiConsole.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(8, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task Static_call_replaced_with_static_field_if_valid()
-    {
-        const string Source = @"
-using Spectre.Console;
-
-class TestClass
-{
-    static IAnsiConsole staticConsole;
-    IAnsiConsole instanceConsole;
-
-    static void TestMethod()
-    {
-        AnsiConsole.Write(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using Spectre.Console;
-
-class TestClass
-{
-    static IAnsiConsole staticConsole;
-    IAnsiConsole instanceConsole;
-
-    static void TestMethod()
-    {
-        staticConsole.Write(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(11, 9), FixedSource);
-    }
-}
diff --git a/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseSpectreInsteadOfSystemConsoleFixTests.cs b/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseSpectreInsteadOfSystemConsoleFixTests.cs
deleted file mode 100644
index b0eadad6..00000000
--- a/test/Spectre.Console.Analyzer.Tests/Unit/Fixes/UseSpectreInsteadOfSystemConsoleFixTests.cs
+++ /dev/null
@@ -1,324 +0,0 @@
-namespace Spectre.Console.Analyzer.Tests.Unit.Fixes;
-
-public class UseSpectreInsteadOfSystemConsoleFixTests
-{
-    private static readonly DiagnosticResult _expectedDiagnostic = new(
-        Descriptors.S1000_UseAnsiConsoleOverSystemConsole.Id,
-        DiagnosticSeverity.Warning);
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_AnsiConsole()
-    {
-        const string Source = @"
-using System;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        AnsiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(8, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_imported_AnsiConsole()
-    {
-        const string Source = @"
-using System;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        AnsiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(8, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_field_AnsiConsole()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole;
-
-    void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole;
-
-    void TestMethod()
-    {
-        _ansiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(11, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_local_variable_AnsiConsole()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        IAnsiConsole ansiConsole = null;
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        IAnsiConsole ansiConsole = null;
-        ansiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(10, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_not_replaced_with_local_variable_declared_after_the_call()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-        IAnsiConsole ansiConsole;
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    void TestMethod()
-    {
-        AnsiConsole.WriteLine(""Hello, World"");
-        IAnsiConsole ansiConsole;
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(9, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_static_field_AnsiConsole()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static IAnsiConsole _ansiConsole;
-
-    static void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static IAnsiConsole _ansiConsole;
-
-    static void TestMethod()
-    {
-        _ansiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(11, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_AnsiConsole_when_field_is_not_static()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole;
-
-    static void TestMethod()
-    {
-        Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    IAnsiConsole _ansiConsole;
-
-    static void TestMethod()
-    {
-        AnsiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(11, 9), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_AnsiConsole_from_local_function_parameter()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static void TestMethod()
-    {
-        static void LocalFunction(IAnsiConsole ansiConsole) => Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static void TestMethod()
-    {
-        static void LocalFunction(IAnsiConsole ansiConsole) => ansiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(9, 64), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_do_not_use_variable_from_parent_method_in_static_local_function()
-    {
-        const string Source = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static void TestMethod()
-    {
-        IAnsiConsole ansiConsole = null;
-        static void LocalFunction() => Console.WriteLine(""Hello, World"");
-    }
-}";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-class TestClass
-{
-    static void TestMethod()
-    {
-        IAnsiConsole ansiConsole = null;
-        static void LocalFunction() => AnsiConsole.WriteLine(""Hello, World"");
-    }
-}";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, _expectedDiagnostic.WithLocation(10, 40), FixedSource);
-    }
-
-    [Fact]
-    public async Task SystemConsole_replaced_with_AnsiConsole_in_top_level_statements()
-    {
-        const string Source = @"
-using System;
-
-Console.WriteLine(""Hello, World"");
-";
-
-        const string FixedSource = @"
-using System;
-using Spectre.Console;
-
-AnsiConsole.WriteLine(""Hello, World"");
-";
-
-        await SpectreAnalyzerVerifier
-            .VerifyCodeFixAsync(Source, OutputKind.ConsoleApplication, _expectedDiagnostic.WithLocation(4, 1),
-                FixedSource);
-    }
-}
diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt b/test/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt
deleted file mode 100644
index 7288aefa..00000000
--- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Hidden_Command_Options.Output.verified.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-USAGE:
-    myapp  [OPTIONS]
-
-ARGUMENTS:
-        Dummy argument FOO
-
-OPTIONS:
-    -h, --help       Prints help information
-    -v, --version    Prints version information
-        --baz        Dummy option BAZ
\ No newline at end of file
diff --git a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt b/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt
deleted file mode 100644
index 53228a04..00000000
--- a/test/Spectre.Console.Cli.Tests/Expectations/Help/Root_Examples_Leafs_None.Output.verified.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-USAGE:
-    myapp [OPTIONS] 
-
-OPTIONS:
-    -h, --help       Prints help information
-    -v, --version    Prints version information
-
-COMMANDS:
-    animal    The animal command
\ No newline at end of file
diff --git a/test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj b/test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj
deleted file mode 100644
index db78e3a6..00000000
--- a/test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-  
-    net8.0;net7.0;net6.0
-  
-
-  
-    
-  
-
-  
-    
-    
-    
-    
-    
-    
-    
-    
-      all
-      runtime; build; native; contentfiles; analyzers; buildtransitive
-    
-  
-
-  
-    
-    
-    
-  
-
-
diff --git a/test/Spectre.Console.Tests/Expectations/Cli/Help/NoDescription.Output.verified.txt b/test/Spectre.Console.Tests/Expectations/Cli/Help/NoDescription.Output.verified.txt
deleted file mode 100644
index f214d32a..00000000
--- a/test/Spectre.Console.Tests/Expectations/Cli/Help/NoDescription.Output.verified.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-USAGE:
-    myapp [OPTIONS] 
-
-OPTIONS:
-    -h, --help       Prints help information
-    -v, --version    Prints version information
-
-COMMANDS:
-    bar
\ No newline at end of file
diff --git a/test/Spectre.Console.Tests/Spectre.Console.Tests.csproj b/test/Spectre.Console.Tests/Spectre.Console.Tests.csproj
deleted file mode 100644
index f36509d4..00000000
--- a/test/Spectre.Console.Tests/Spectre.Console.Tests.csproj
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-  
-    net8.0;net7.0;net6.0
-  
-
-  
-    
-    
-    
-    
-    
-    
-    
-    
-      Always
-    
-  
-
-  
-    
-    
-    
-    
-    
-    
-      all
-      runtime; build; native; contentfiles; analyzers; buildtransitive
-    
-  
-
-  
-    
-    
-    
-    
-  
-
-