diff --git a/.gitignore b/.gitignore
index 2fe225e..f34ab01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,4 @@ riderModule.iml
/_ReSharper.Caches/
# Don't care about IDE specific things
/.idea
-*.DotSettings.user
-# Don't care about files created from the build script
-output/
\ No newline at end of file
+*.DotSettings.user
\ No newline at end of file
diff --git a/Directory.Packages.props b/Directory.Packages.props
deleted file mode 100644
index 1e8aa77..0000000
--- a/Directory.Packages.props
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/PowershellModule.slnx b/PowershellModule.slnx
deleted file mode 100644
index 04cf69b..0000000
--- a/PowershellModule.slnx
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build.ps1 b/build.ps1
deleted file mode 100644
index a707719..0000000
--- a/build.ps1
+++ /dev/null
@@ -1,2 +0,0 @@
-dotnet run --project build/Build.csproj -- $args
-exit $LASTEXITCODE;
\ No newline at end of file
diff --git a/build.sh b/build.sh
deleted file mode 100644
index dfd6b85..0000000
--- a/build.sh
+++ /dev/null
@@ -1 +0,0 @@
-dotnet run --project ./build/Build.csproj -- "$@"
diff --git a/build/Build.csproj b/build/Build.csproj
deleted file mode 100644
index 0d0955f..0000000
--- a/build/Build.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- Exe
- net10.0
- $(MSBuildProjectDirectory)
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build/Program.cs b/build/Program.cs
deleted file mode 100644
index ffb3738..0000000
--- a/build/Program.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using Cake.Common;
-using Cake.Common.IO;
-using Cake.Common.IO.Paths;
-using Cake.Core;
-using Cake.Frosting;
-using Cake.Powershell;
-
-public static class Program
-{
- public static int Main(string[] args)
- {
- return new CakeHost()
- .UseContext()
- .Run(args);
- }
-}
-
-public class BuildContext : FrostingContext
-{
- ///
- /// Base source directory
- ///
- public ConvertableDirectoryPath BaseSourceLocation { get; set; }
-
- ///
- /// Powershell module project folder
- ///
- public ConvertableDirectoryPath PowershellModuleProjectDirectory { get; set; }
-
- ///
- /// Powershell module csproj location
- ///
- public ConvertableFilePath PowershellModuleCsproj { get; set; }
-
- ///
- /// Output directory for built DLLs and powershell module manifest files
- ///
- public ConvertableDirectoryPath PowershellModuleOutputDir { get; set; }
-
- ///
- /// Path to powershell script that creates the module manifest files
- ///
- public ConvertableFilePath CreateModuleManifestScript { get; set; }
-
- public BuildContext(ICakeContext context)
- : base(context)
- {
- BaseSourceLocation = context.Directory("../src");
- PowershellModuleProjectDirectory = BaseSourceLocation + context.Directory("PowershellModule");
- PowershellModuleCsproj = PowershellModuleProjectDirectory + context.File("PowershellModule.csproj");
- PowershellModuleOutputDir = context.Directory("../") + context.Directory("output") + context.Directory("PowershellModule");
- var buildScriptDirectory = context.Directory("./Scripts");
- CreateModuleManifestScript = buildScriptDirectory + context.File("CreateModuleManifest.ps1");
- }
-}
\ No newline at end of file
diff --git a/build/Scripts/CreateModuleManifest.ps1 b/build/Scripts/CreateModuleManifest.ps1
deleted file mode 100644
index 4e3d920..0000000
--- a/build/Scripts/CreateModuleManifest.ps1
+++ /dev/null
@@ -1,24 +0,0 @@
-param (
- [string]$path,
- [string]$guid,
- [string]$author,
- [string[]]$nestedModules,
- [string]$rootModule,
- [string[]]$cmdletsToExport,
- [string]$manifestFileLocation
-)
-
-$manifestSplat = @{
- Path = "$path"
- GUID = "$guid"
- Author = "$author"
- NestedModules = @($nestedModules)
- RootModule = "$rootModule"
- CmdletsToExport = @($cmdletsToExport)
- FunctionsToExport = @()
- VariablesToExport = @()
- AliasesToExport = @()
-}
-
-New-ModuleManifest @manifestSplat
-New-Item "$manifestFileLocation" -ItemType File
\ No newline at end of file
diff --git a/build/Tasks/BuildTask.cs b/build/Tasks/BuildTask.cs
deleted file mode 100644
index c731bcb..0000000
--- a/build/Tasks/BuildTask.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using Cake.Common.Tools.DotNet;
-using Cake.Common.Tools.DotNet.Build;
-using Cake.Common.Tools.DotNet.MSBuild;
-using Cake.Core.Diagnostics;
-using Cake.Frosting;
-
-namespace Build.Tasks;
-
-[TaskName("Build")]
-[IsDependentOn(typeof(CleanTask))]
-[IsDependeeOf(typeof(CopyOutputTask))]
-public class BuildTask : FrostingTask
-{
- public override void Run(BuildContext context)
- {
- context.Log.Information($"Building: {context.PowershellModuleCsproj}");
-
- var buildSettings = new DotNetBuildSettings()
- {
- MSBuildSettings = new DotNetMSBuildSettings()
- {
- VersionSuffix = "cake"
- },
- OutputDirectory = context.PowershellModuleOutputDir,
- DiagnosticOutput = true
- };
-
- // /p:DebugSymbols=false
- buildSettings.MSBuildSettings.Properties.Add("DebugSymbols", ["false"]);
- // /p:DebugType=None
- buildSettings.MSBuildSettings.Properties.Add("DebugType", ["None"]);
-
- context.DotNetBuild(context.PowershellModuleCsproj, buildSettings);
- base.Run(context);
- }
-}
\ No newline at end of file
diff --git a/build/Tasks/CleanTask.cs b/build/Tasks/CleanTask.cs
deleted file mode 100644
index 36ab859..0000000
--- a/build/Tasks/CleanTask.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Cake.Common;
-using Cake.Common.Tools.DotNet;
-using Cake.Core.Diagnostics;
-using Cake.Frosting;
-
-namespace Build.Tasks;
-
-[TaskName("Clean")]
-public class CleanTask : FrostingTask
-{
- public override void Run(BuildContext context)
- {
- context.DotNetClean(context.PowershellModuleProjectDirectory);
-
- var outDir = context.FileSystem.GetDirectory(context.PowershellModuleOutputDir);
- if (outDir.Exists)
- {
- outDir.Delete(true);
- }
-
- base.Run(context);
- }
-}
\ No newline at end of file
diff --git a/build/Tasks/CopyOutputTask.cs b/build/Tasks/CopyOutputTask.cs
deleted file mode 100644
index 175f82a..0000000
--- a/build/Tasks/CopyOutputTask.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-using System.Linq;
-using Cake.Core.Diagnostics;
-using Cake.Core.IO;
-using Cake.Frosting;
-using Cake.Powershell;
-
-namespace Build.Tasks;
-
-[TaskName("CopyOutput")]
-public class CopyOutputTask : FrostingTask
-{
- public override void Run(BuildContext context)
- {
- var powershellModuleName = "PowershellModule";
- var scriptParams = new
- {
- Path = $"{context.PowershellModuleOutputDir}/{powershellModuleName}.psd1",
- Guid = Guid.Parse("5cdf4635-edb0-428c-8d9b-92d0bcd47443"),
- Author = "Me",
- NestedModules = new[] { $"{powershellModuleName}.dll" },
- RootModule = $"{powershellModuleName}.psm1",
- CmdletsToExport = new[] { "Get-Calendar" },
- ManifestFileLocation = $"{context.PowershellModuleOutputDir}/{powershellModuleName}.psm1"
- };
-
- var psSettings = new PowershellSettings()
- {
- Arguments = new ProcessArgumentBuilder(),
- };
-
- // This feels a bit ugly/redundant seeing as I've defined the scriptParams above, but I'm leaving it as is
- // until I want to come back and clean this up properly
- psSettings.Arguments.Append("path", ToPowershellSafeString(scriptParams.Path));
- psSettings.Arguments.Append("guid", ToPowershellSafeString(scriptParams.Guid.ToString()));
- psSettings.Arguments.Append("author", ToPowershellSafeString(scriptParams.Author));
- psSettings.Arguments.Append("nestedModules", $"@({string.Join(",", scriptParams.NestedModules.Select(ToPowershellSafeString))})");
- psSettings.Arguments.Append("rootModule", ToPowershellSafeString(scriptParams.RootModule));
- psSettings.Arguments.Append("cmdletsToExport", $"@({string.Join(",", scriptParams.CmdletsToExport.Select(ToPowershellSafeString))})");
- psSettings.Arguments.Append("manifestFileLocation", ToPowershellSafeString(scriptParams.ManifestFileLocation));
-
- context.StartPowershellFile(context.CreateModuleManifestScript, psSettings);
- context.Log.Information($"Module output to: {context.PowershellModuleOutputDir.Path.MakeAbsolute(context.Environment)}");
-
- base.Run(context);
- }
-
- private static string ToPowershellSafeString(string unescapedString) => $"'{unescapedString}'";
-}
\ No newline at end of file
diff --git a/build/Tasks/DefaultTask.cs b/build/Tasks/DefaultTask.cs
deleted file mode 100644
index 200768c..0000000
--- a/build/Tasks/DefaultTask.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using Cake.Core;
-using Cake.Core.Diagnostics;
-using Cake.Frosting;
-
-namespace Build.Tasks;
-
-// Consider this the "entry" point for builds, task order is defined by a chain of IsDependentOn
-[TaskName("Default")]
-[IsDependentOn(typeof(CopyOutputTask))]
-public class DefaultTask : FrostingTask
-{
- public override void Run(ICakeContext context)
- {
- base.Run(context);
- }
-}
\ No newline at end of file
diff --git a/src/ModuleCore/Calendar/CalendarGenerator.cs b/src/ModuleCore/Calendar/CalendarGenerator.cs
deleted file mode 100644
index 8494fc9..0000000
--- a/src/ModuleCore/Calendar/CalendarGenerator.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-using System.Globalization;
-using System.Text;
-
-namespace ModuleCore.Calendar;
-
-public sealed class CalendarGenerator
-{
- public const string DefaultMarkedOffSymbol = "x";
- public const DayOfWeek DefaultStartOfWeek = DayOfWeek.Monday;
-
- private readonly string _markedOffSymbol;
- private readonly DayOfWeek _startOfWeek;
-
- ///
- /// Holds configured day abbreviations, based on .
- ///
- /// Using english as the culture: Sunday = Sun, Monday = Mon and so on. This lookup also starts with
- /// Sunday as the first day to match the enum starting with Sunday.
- ///
- ///
- private readonly List _daysOfWeekLookup;
-
- ///
- /// Used to work out how to pad columns for each day, based on the longest abbreviated day
- ///
- private readonly int _dayWidth;
-
- private readonly CultureInfo _cultureInfo;
-
- private readonly string _rolloverDaySymbol = "";
-
- public CalendarGenerator(string? markedDaySymbol = null, DayOfWeek? startOfWeek = null)
- {
- _markedOffSymbol = markedDaySymbol ?? DefaultMarkedOffSymbol;
- _startOfWeek = startOfWeek ?? DefaultStartOfWeek;
-
- // Generate localised day of week lookup table
- _daysOfWeekLookup = new List(7);
- _dayWidth = _markedOffSymbol.Length;
- _cultureInfo = CultureInfo.CurrentCulture;
- for (var i = 0; i < 7; i++)
- {
- var localisedDayAbbreviation = _cultureInfo.DateTimeFormat.GetAbbreviatedDayName((DayOfWeek)i);
-
- // For unicode languages (such as Japanese and Chinese), the length of a day will be reported as 1,
- // but will display in a way that makes them look short or offset.
- // eg:
- // ┌───────────────────────────┐
- // │ 7月 │
- // ├───┬───┬───┬───┬───┬───┬───┤
- // │ 月 │ 火 │ 水 │ 木 │ 金 │ 土 │ 日 │
- // ├───┴───┴───┴───┴───┴───┴───┤
- // There's not really an easy fix I know of (yet) to resolve this (and I'm not really too bothered by it yet)
- // so unfortunately it has to stay as a known bug as is currently
- if (localisedDayAbbreviation.Length > _dayWidth)
- {
- _dayWidth = localisedDayAbbreviation.Length;
- }
-
- _daysOfWeekLookup.Add(localisedDayAbbreviation);
- }
-
- // Increase the width by 2 to include a space on either side
- _dayWidth += 2;
- }
-
- ///
- /// Renders the configured calendar for the given datetime
- ///
- ///
- /// Defaults to , used to display elapsed days
- ///
- public string Render(DateTime month, DateTime? todayOverride = null)
- {
- var sb = new StringBuilder();
- // Generate the header for the month/days of week
- GenerateHeader(sb, month);
-
- var calendarForMonth = GenerateCalendarForMonth(month, _markedOffSymbol, _startOfWeek, _rolloverDaySymbol, todayOverride ?? DateTime.Now);
-
- for (var i = 0; i < calendarForMonth.WeeksInMonth; i++)
- {
- sb.Append("│");
- for (var j = 0; j < 7; j++)
- {
- var index = j + i * 7;
- // We align days to the right of their box, 1 off from the border.
- // Sure I could center them, but honestly this is better to read.
- sb.Append(calendarForMonth.Calendar[index].PadLeft(_dayWidth - 1));
- sb.Append(" │");
- }
-
- sb.AppendLine();
- }
-
- // Cap the calendar off
- GenerateSpacer(sb, "└", "─", "┴", "┘", true);
-
- return sb.ToString();
- }
-
- private void GenerateHeader(StringBuilder sb, DateTime month)
- {
- // Top border for the calendar, with padder and seperator the same as there's no columns immediately
- // under it
- GenerateSpacer(sb, "┌", "─", "─", "┐");
-
- var monthString = month.ToString("MMMM yyyy", _cultureInfo);
- // total width of the calendar is width of the localised day calculated in the constructor, plus 7 extra
- // to account for separators for each day.
- // It shouldn't need to be said that the 7 here stands for days in a week
- var calendarWidth = _dayWidth * 7 + 7;
- // Calculate the offsets for
- var offsets = (
- left: Math.Floor(calendarWidth / 2.0 + monthString.Length / 2.0),
- right: Math.Ceiling(calendarWidth / 2.0 - monthString.Length / 2.0)
- );
-
- sb.Append("│")
- .Append(monthString.PadLeft((int)offsets.left))
- .AppendLine("│".PadLeft((int)offsets.right));
-
- // Top border for the week
- GenerateSpacer(sb, "├", "─", "┬", "┤");
-
- // Work out the week display based on start of week
- var d = 0;
- do
- {
- // Index into the day of week, wrapping if needed from the configured start of the week.
- // The DayOfWeek enum starts with Sunday, so by default the start of the week is 0,
- // But most calendars visually start with Monday as the start of the week which is our default start
- // of week.
- // We also pad the string to the width of the day (minus 2 for spaces either side of the day), if
- // the marked day symbol is a long string.
- // Why did I decide to support arbitrary length marked days? Why not?
- sb.Append($"│ {_daysOfWeekLookup[(d + (int)_startOfWeek) % 7].PadLeft(_dayWidth - 2)} ");
- d++;
- } while (d < 7);
-
- // End the week block
- sb.AppendLine("│");
- // bottom border
- GenerateSpacer(sb, "├", "─", "┼", "┤");
- }
-
- private void GenerateSpacer(StringBuilder sb, string leftCap, string padder, string seperator, string rightCap, bool noNewLine = false)
- {
- sb.Append(leftCap);
- for (var i = 0; i < 7; i++)
- {
- for (var j = 0; j < _dayWidth; j++)
- {
- sb.Append(padder);
- }
-
- if (i < 6)
- {
- sb.Append(seperator);
- }
- }
-
- if (noNewLine)
- {
- sb.Append(rightCap);
- }
- else
- {
- sb.AppendLine(rightCap);
- }
- }
-
- private MonthCalendar GenerateCalendarForMonth(DateTime month, string markedOffSymbol, DayOfWeek calendarStartOfWeek, string rolloverDaySymbol, DateTime today)
- {
- // TODO: use startOfWeek to offset the start of the calendar later
- // TODO: I think I meant the calendar name header?
-
- // Reset the month to the start
- var startOfMonth = new DateTime(month.Year, month.Month, 1);
- // If the visual start of the month is before the actual start day of the month, we need to visually shift the
- // calendar "back" a week, and pad appropriately.
- // Eg, if the start of the month is Sunday, but our visual start of the week is a Monday, then we need to
- // make a new week to display Monday as the start, and then pad blank days to Sunday.
- // This could probably be calculated better to avoid annoying to read logic but I'm drunk at this moment so the
- // brain ain't there.
- // For what its worth, I wasn't drunk for the rest of the code in this file, as hard as that is to believe!
- var daysToPadToStartMonth = startOfMonth.DayOfWeek >= calendarStartOfWeek
- ? startOfMonth.DayOfWeek - calendarStartOfWeek
- : 7 - (calendarStartOfWeek - startOfMonth.DayOfWeek);
-
- var daysInMonth = DateTime.DaysInMonth(month.Year, month.Month);
- // TODO: a lot of this could probably be simplified by simply taking the start day of the week, and then
- // based on where it would be in the first week, work out if the month is 4, 5 or 6 weeks from that.
- // all this needs is a pre-calculated table and that's it.
- // Weeks have 7 days so there's only a fixed permutation of weeks based on the day of the week a month
- // starts on, and months have anywhere from 28 to 31 days
- // Increase the days by the previous months
- var paddedDaysInMonth = daysInMonth + daysToPadToStartMonth;
- // How many days to add to the end to make the absolute number of days (including any
- // days that would visually roll over on a calendar)
- // eg, if there are 2 "roll over" days from the previous month and this month has 31 days,
- // Work out how many days we have left from 7, then get the _final_ number of days to make it a multiple
- // _of_ 7.
- // So this results in (33%7) == 5 - 7 == 2 + 33 == 35 % 7 == 0 which means we have a "complete" month
- // including next month roll over.
- // Visually we won't be showing those roll over days but it makes things easier if I decide to later.
- // If the days in the month plus padded days is already a multiple of 7, we don't need to add any more days.
- var daysToPadToEndMonth = paddedDaysInMonth % 7 != 0
- ? 7 - paddedDaysInMonth % 7
- : 0;
- paddedDaysInMonth += daysToPadToEndMonth;
- // Round to the nearest week after padding for the previous months days.
- // Naively allowing a loss of precision via int division because the paddedDaysInMonth should always
- // be a multiple of 7.
- // "should always" is going to be found not as true later
- var weeksInMonth = paddedDaysInMonth / 7;
-
- var cal = new List();
- for (var i = 0; i < daysToPadToStartMonth; i++)
- {
- cal.Add(rolloverDaySymbol);
- }
-
- // If we're in the same year and month, any days already elapsed should be marked off,
- // otherwise we display all days.
- // If the DateTime we're rendering is in the past we render all days as marked off
- // TODO: maybe don't do that and display the calendar differently
- var hideElapsedDays = today.Year == month.Year && today.Month == month.Month;
-
- for (var i = 1; i < daysInMonth + 1; i++)
- {
- // if we're marking off elapsed days and we're not today or ahead, 'mark' it off
- if (hideElapsedDays && i < today.Day)
- {
- cal.Add(markedOffSymbol);
- }
- else
- {
- cal.Add($"{i}");
- }
- }
-
- // pad the rollover days at the end of the calendar
- for (var i = 0; i < daysToPadToEndMonth; i++)
- {
- cal.Add(rolloverDaySymbol);
- }
-
- return new MonthCalendar
- {
- Calendar = cal,
- WeeksInMonth = weeksInMonth
- };
- }
-}
-
-public class MonthCalendar
-{
- public List Calendar { get; set; } = [];
- public int WeeksInMonth { get; set; }
-}
\ No newline at end of file
diff --git a/src/ModuleCore/Directory.Build.props b/src/ModuleCore/Directory.Build.props
deleted file mode 100644
index afa6e9c..0000000
--- a/src/ModuleCore/Directory.Build.props
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- 0.0.0
- dev
-
-
\ No newline at end of file
diff --git a/src/ModuleCore/ModuleCore.csproj b/src/ModuleCore/ModuleCore.csproj
deleted file mode 100644
index 4ef1a45..0000000
--- a/src/ModuleCore/ModuleCore.csproj
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- net10.0
- enable
- enable
- latestmajor
-
-
-
diff --git a/src/ModuleHarness/ModuleHarness.csproj b/src/ModuleHarness/ModuleHarness.csproj
deleted file mode 100644
index 9fe2c2b..0000000
--- a/src/ModuleHarness/ModuleHarness.csproj
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- Exe
- net10.0
- enable
- enable
- latestmajor
-
-
-
-
-
-
-
diff --git a/src/ModuleHarness/Program.cs b/src/ModuleHarness/Program.cs
deleted file mode 100644
index d314f9d..0000000
--- a/src/ModuleHarness/Program.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System.Text;
-using ModuleCore.Calendar;
-
-namespace ModuleHarness;
-
-class Program
-{
- static void Main(string[] args)
- {
- Console.OutputEncoding = Encoding.Unicode;
- var a = new CalendarGenerator();
- var lastMonth = a.Render(DateTime.Now.AddMonths(-1));
- var now = a.Render(DateTime.Now);
- var august = a.Render(DateTime.Now.AddMonths(1));
-
- Console.Write(lastMonth);
- Console.Write(now);
- Console.Write(august);
- }
-}
\ No newline at end of file
diff --git a/src/PowershellHarness/CustomHost.cs b/src/PowershellHarness/CustomHost.cs
deleted file mode 100644
index 96ef22b..0000000
--- a/src/PowershellHarness/CustomHost.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System.Collections.ObjectModel;
-using System.Globalization;
-using System.Management.Automation;
-using System.Management.Automation.Host;
-using System.Security;
-using System.Text;
-
-namespace PowershellHarness;
-
-// A whole bunch of empty implementations just so cmdlets have access to anything within Host.Ui (and probably any cmdlets
-// that prompt for information later)
-// https://github.com/leechristensen/OffensivePowerShellTasking/blob/master/OffensivePowerShellTasking/CustomPSHost.cs#L13
-public class CustomHost : PSHost
-{
- public override string Name => "Custom Host";
- public override Version Version { get; } = new Version(0, 0, 0, 0);
- public override Guid InstanceId { get; } = Guid.NewGuid();
-
- private CustomUiHost _ui = new CustomUiHost();
- public override CustomUiHost UI => _ui;
-
- public override CultureInfo CurrentCulture { get; } = CultureInfo.CurrentCulture;
- public override CultureInfo CurrentUICulture { get; } = CultureInfo.CurrentUICulture;
-
- public CustomHost(int width, int height = 100)
- {
- _ui.RawUI.WindowSize = new() { Width = width, Height = height };
- }
-
- public override void EnterNestedPrompt()
- {
- throw new NotImplementedException("EnterNestedPrompt is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override void ExitNestedPrompt()
- {
- throw new NotImplementedException("ExitNestedPrompt is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override void NotifyBeginApplication()
- {
- }
-
- public override void NotifyEndApplication()
- {
- }
-
- public override void SetShouldExit(int exitCode)
- {
- }
-}
-
-// https://github.com/leechristensen/OffensivePowerShellTasking/blob/d1b498d874948f41e6dc053204c511fa6fc11c9c/OffensivePowerShellTasking/CustomPSHostUserInterface.cs#L8
-public class CustomUiHost : PSHostUserInterface
-{
- // The only stuff that really matters to expose a host for any cmdlets
- private readonly CustomRawUiHost _rawUI = new CustomRawUiHost();
- public override CustomRawUiHost RawUI => _rawUI;
-
- // Replace StringBuilder with whatever your preferred output method is (e.g. a socket or a named pipe)
- public StringBuilder output { get; set; }
-
- public CustomUiHost()
- {
- output = new StringBuilder();
- }
-
- public CustomUiHost(ref StringBuilder sb)
- {
- output = sb;
- }
-
- public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
- {
- //output.Append("!").Append(value);
- }
-
- public override void WriteLine()
- {
- //output.Append("!").Append("\n");
- }
-
- public override void WriteLine(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
- {
- //output.Append("!").Append(value + "\n");
- }
-
- public override void Write(string value)
- {
- //output.Append("!").Append(value);
- }
-
- public override void WriteDebugLine(string message)
- {
- //output.Append("!").AppendLine("DEBUG: " + message);
- }
-
- public override void WriteErrorLine(string value)
- {
- //output.Append("!").AppendLine("ERROR: " + value);
- }
-
- public override void WriteLine(string value)
- {
- //output.Append("!").AppendLine(value);
- }
-
- public override void WriteVerboseLine(string message)
- {
- //output.Append("!").AppendLine("VERBOSE: " + message);
- }
-
- public override void WriteWarningLine(string message)
- {
- //output.Append("!").AppendLine("WARNING: " + message);
- }
-
- public override void WriteProgress(long sourceId, ProgressRecord record)
- {
- }
-
- public string Output => output.ToString();
-
- public override Dictionary Prompt(string caption, string message, System.Collections.ObjectModel.Collection descriptions)
- {
- throw new NotImplementedException("Prompt is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override int PromptForChoice(string caption, string message, System.Collections.ObjectModel.Collection choices, int defaultChoice)
- {
- throw new NotImplementedException("PromptForChoice is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName, PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options)
- {
- throw new NotImplementedException("PromptForCredential1 is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName)
- {
- throw new NotImplementedException("PromptForCredential2 is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override string ReadLine()
- {
- throw new NotImplementedException("ReadLine is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override SecureString ReadLineAsSecureString()
- {
- throw new NotImplementedException("ReadLineAsSecureString is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-}
-
-// https://github.com/leechristensen/OffensivePowerShellTasking/blob/master/OffensivePowerShellTasking/CustomPSRHostRawUserInterface.cs#L8
-public class CustomRawUiHost : PSHostRawUserInterface
-{
- public override ConsoleColor BackgroundColor { get; set; } = ConsoleColor.Black;
-
- public override Size BufferSize { get; set; } = new Size { Width = 100, Height = 1000 };
-
- public override Coordinates CursorPosition { get; set; } = new Coordinates { X = 0, Y = 0 };
-
- public override int CursorSize { get; set; } = 1;
-
- public override void FlushInputBuffer()
- {
- throw new NotImplementedException("FlushInputBuffer is not implemented.");
- }
-
- public override ConsoleColor ForegroundColor { get; set; } = ConsoleColor.White;
-
- public override BufferCell[,] GetBufferContents(Rectangle rectangle)
- {
- throw new NotImplementedException("GetBufferContents is not implemented.");
- }
-
- public override bool KeyAvailable
- {
- get { throw new NotImplementedException("KeyAvailable is not implemented."); }
- }
-
- public override Size MaxPhysicalWindowSize { get; } = new Size
- {
- Width = int.MaxValue,
- Height = int.MaxValue
- };
-
- public override Size MaxWindowSize { get; } = new Size { Width = 100, Height = 100 };
-
- public override KeyInfo ReadKey(ReadKeyOptions options)
- {
- throw new NotImplementedException("ReadKey is not implemented. The script is asking for input, which is a problem since there's no console. Make sure the script can execute without prompting the user for input.");
- }
-
- public override void ScrollBufferContents(Rectangle source, Coordinates destination, Rectangle clip, BufferCell fill)
- {
- throw new NotImplementedException("ScrollBufferContents is not implemented");
- }
-
- public override void SetBufferContents(Rectangle rectangle, BufferCell fill)
- {
- throw new NotImplementedException("SetBufferContents is not implemented.");
- }
-
- public override void SetBufferContents(Coordinates origin, BufferCell[,] contents)
- {
- throw new NotImplementedException("SetBufferContents is not implemented");
- }
-
- public override Coordinates WindowPosition { get; set; } = new Coordinates { X = 0, Y = 0 };
-
- public override Size WindowSize { get; set; } = new Size { Width = 120, Height = 100 };
-
- public override string WindowTitle { get; set; } = "";
-}
\ No newline at end of file
diff --git a/src/PowershellHarness/PowershellHarness.csproj b/src/PowershellHarness/PowershellHarness.csproj
deleted file mode 100644
index 80cdb76..0000000
--- a/src/PowershellHarness/PowershellHarness.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- Exe
- net10.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/PowershellHarness/Program.cs b/src/PowershellHarness/Program.cs
deleted file mode 100644
index 077a9b7..0000000
--- a/src/PowershellHarness/Program.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System.Management.Automation;
-using System.Management.Automation.Runspaces;
-using System.Text;
-using PowershellModule.Calendar;
-
-namespace PowershellHarness;
-
-// https://github.com/FuseCP/FuseCP/blob/278a19dc06949600f25a1b4ed74d0419a8fa3fc2/FuseCP/Sources/FuseCP.Providers.HostedSolution.SfB2015/SfBBase.cs#L224
-// some useful code in here tbh
-class Program
-{
- static void Main(string[] args)
- {
- // I've gotta work out how to get the rider terminal to act closer to powershell because .PadLeft in powershell
- // will correctly output lines when output with WriteOutput, but the Jetbrains debug worker (or whatever
- // it is that rider spawns), has none of that and operates in its own world.
- // Which is fine if you never want new lines.
- // Ideally you'd just launch pwsh.exe and attach to that, but _that_ has its own issues as well.
- // The new line issue might be related to how I've set up the host seeing as I just did a bunch of copy paste shit
- // from something I found on github to get it across the line so I could debug it.
- // I'll eventually revisit those hosts and rewrite them properly once I start adding more commands, and if I care.
- // Threads & variables has all the visuals I need after all.
-#if DEBUG
- if (!System.Diagnostics.Debugger.IsAttached)
- {
- Console.BackgroundColor = ConsoleColor.Yellow;
- Console.WriteLine(CenterText("Running without a debugger attached may result in lines not being output correctly"));
- Console.ResetColor();
- }
-#endif
- Console.WriteLine(CenterText(" PowerShell Debug Harness "));
- Console.WriteLine($"Reported console window size: {Console.WindowWidth}x{Console.WindowHeight}");
- Console.WriteLine($"Reported console buffer size: {Console.BufferWidth}x{Console.BufferHeight}");
- Console.WriteLine(CenterText(" WIDTH ", '-'));
-
- var host = new CustomHost(Console.WindowWidth);
- var runspace = InitialisePowershellHost(host);
-
- // InvokeCommand(runspace, GetCalendarCommand.FullName);
-
- foreach (var day in Enum.GetValues())
- {
- InvokeCommand(runspace, GetCalendarCommand.FullName, [
- CreateCommand(nameof(GetCalendarCommand.MarkedDaySymbol), "faker"),
- CreateCommand(nameof(GetCalendarCommand.StartOfWeek), day.ToString()),
- CreateCommand(nameof(GetCalendarCommand.Date), "22/6/26"),
- // CreateCommand(nameof(GetCalendarCommand.AlignRight))
- ]);
- }
-
- // InvokeCommand(runspace, GetCalendarCommand.FullName, [
- // new CommandParameter(nameof(GetCalendarCommand.MarkedDaySymbol), "🤫"),
- // new CommandParameter(nameof(GetCalendarCommand.StartOfWeek), DayOfWeek.Saturday)
- // ]);
- // InvokeCommand(runspace, GetCalendarCommand.FullName, [new CommandParameter(nameof(GetCalendarCommand.StartOfWeek), "Sunday")]);
- }
-
- private static CommandParameter CreateCommand(string name, string? argument = null)
- {
- if (argument is not null)
- {
- return new CommandParameter(name, argument);
- }
-
- return new CommandParameter(name);
- }
-
- static string CenterText(string text, char paddingChar = ' ')
- {
- return text.PadLeft((Console.WindowWidth + text.Length) / 2, paddingChar).PadRight(Console.WindowWidth, paddingChar);
- }
-
- ///
- /// Initialises a PowerShell session and returns an open Runspace
- ///
- ///
- ///
- static Runspace InitialisePowershellHost(CustomHost host)
- {
- // Create the initial session state for the host. Yes, that 2 on the end does indicate that the underlying
- // implementation for this is C++
- // Welcome to the lands of fuck all documentation and figuring shit out from an increasingly shit internet
- // where finding non-slop answers gets harder by the day as people close sources of information to prevent
- // scraping. Fuck every single person involved modern AI.
- // It wasn't much better finding documentation about the System.Management.* namespace before that, but it's
- // definitely a lot worse because of it
- var initialSessionState = InitialSessionState.CreateDefault2();
-
-
- // No idea what the helpFileName should be. As is common with _a lot_ of the System.Management.* namespace,
- // fuck all is actually documented with comments, or documented at all!
- // From https://learn.microsoft.com/en-us/powershell/scripting/developer/hosting/creating-a-constrained-runspace?view=powershell-7.6
- // (which yes, this section _is_ under a legacy category!), it's perfectly fine to leave it as null.
- // We also don't really care as we're just doing this so we can test commands without having to deal with Rider
- // and it's quirks around runnning a powershell terminal and attaching to it. Yeah it technically works, but
- // it's way too common to end up with Rider refusing to build correctly or ensure the right dll is used for the module
- var getCalendarCommand = new SessionStateCmdletEntry(GetCalendarCommand.FullName, typeof(GetCalendarCommand), null);
- initialSessionState.Commands.Add(getCalendarCommand);
-
- // Create a runspace from the state, open and return it
- var runspace = RunspaceFactory.CreateRunspace(host, initialSessionState);
-
- // A runspace is technically disposable, but we're not reimplementing a full host and we won't be doing anything
- // that would require a fresh runspace multiple times over (yet), so we can just treat the lifetime of the
- // disposable as application lifetime
- runspace.Open();
-
- return runspace;
- }
-
- static void InvokeCommand(Runspace runspace, string command, IEnumerable? parameters = null)
- {
- // Not too sure on the difference of runspace vs PowerShell here. Doesn't seem to make a difference either way
- // and this is just a debug harness so it doesn't really matter for now
- using var pipeline = runspace.CreatePipeline();
- // using var powershell = PowerShell.Create(runspace);
-
- var cmd = new Command(command);
- if (parameters is not null)
- {
- foreach (var commandParameter in parameters)
- {
- cmd.Parameters.Add(commandParameter);
- }
- }
-
- pipeline.Commands.Add(cmd);
- // powershell.Commands.AddCommand(cmd);
-
- try
- {
- var results = pipeline.Invoke();
- // var results = powershell.Invoke();
- foreach (var result in results)
- {
- Console.Write(result);
- }
- }
- catch (Exception ex)
- {
- Console.Error.WriteLine($"Unable to execute command {command}");
- Console.Error.WriteLine(ex.GetBaseException().Message);
- }
- }
-}
\ No newline at end of file
diff --git a/src/PowershellModule/Calendar/GetCalendarCommand.cs b/src/PowershellModule/Calendar/GetCalendarCommand.cs
deleted file mode 100644
index f70d6e0..0000000
--- a/src/PowershellModule/Calendar/GetCalendarCommand.cs
+++ /dev/null
@@ -1,174 +0,0 @@
-using System;
-using System.Globalization;
-using System.Management.Automation;
-using ModuleCore.Calendar;
-
-namespace PowershellModule.Calendar
-{
- [Cmdlet(VerbsCommon.Get, Noun)]
- public class GetCalendarCommand : PSCmdlet
- {
-#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
- [Parameter(
- Mandatory = false,
- Position = 0)]
- public string Date { get; set; }
-
- [Parameter(
- Mandatory = false,
- Position = 1)]
- public string MarkedDaySymbol { get; set; }
-
- [Parameter(
- Mandatory = false,
- Position = 2)]
- [ValidateSet("Sunday",
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday")]
- // pass a type in to get dynamic types
- // NOTE: the generator gets called for _each_ character input, so ensure the values are idempotent for every
- // keydown (and fast), or cached
- // [ValidateSet(typeof(StartDayOfWeekGenerator))]
- public string StartOfWeek { get; set; }
-
- [Parameter(
- Mandatory = false,
- Position = 3)]
- public SwitchParameter AlignRight { get; set; }
-
-#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
-
- // Guaranteed to be initialised in BeginProcessing. If it's not, something is cooked in some other way
- private CalendarGenerator _calendar = null!;
- private const string Noun = "Calendar";
- public const string FullName = $"{VerbsCommon.Get}-{Noun}";
-
- private DateTime _dateToRender = DateTime.Now;
- private int _leftPadding;
-
- protected override void BeginProcessing()
- {
- // This is the first point in script execution where we'll have parameters populated
- _calendar = new(
- MarkedDaySymbol,
- DayOfWeekFromString(StartOfWeek)
- );
-
- if (!string.IsNullOrWhiteSpace(Date))
- {
- _dateToRender = DateTime.ParseExact(Date, CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(), null);
- }
-
- if (AlignRight)
- {
- _leftPadding = Host.UI.RawUI.WindowSize.Width;
- }
- }
-
- ///
- /// Returns a from a string.
- ///
- /// Defaults to the calendars default start of week on null or invalid values.
- ///
- ///
- ///
- ///
- private static DayOfWeek DayOfWeekFromString(string? dayOfWeek)
- {
- if (dayOfWeek is null)
- {
- return CalendarGenerator.DefaultStartOfWeek;
- }
-
- return dayOfWeek.ToLowerInvariant() switch
- {
- "sunday" => DayOfWeek.Sunday,
- "monday" => DayOfWeek.Monday,
- "tuesday" => DayOfWeek.Tuesday,
- "wednesday" => DayOfWeek.Wednesday,
- "thursday" => DayOfWeek.Thursday,
- "friday" => DayOfWeek.Friday,
- "saturday" => DayOfWeek.Saturday,
- _ => CalendarGenerator.DefaultStartOfWeek
- };
- }
-
- protected override void ProcessRecord()
- {
- var calendar = _calendar.Render(_dateToRender);
-
- // From _very_ basic testing, string split allocates the same as making a span and iterating over it.
- // I'm assuming this is because a lot of the span code is what string.Split() does internally and the rest
- // is trivially optimised out.
- // Not too fussed currently but it's most likely because Pad methods also allocate a string, so they end up
- // equivalent at the end
- // OutputCalendarStringSplit(calendar);
- OutputCalendar(calendar);
-
- base.ProcessRecord();
- }
-
- private void OutputCalendarStringSplit(string calendar)
- {
- var splitCalendarLines = calendar.Split(Environment.NewLine);
- foreach (var splitLines in splitCalendarLines)
- {
- // Have to output a newline character here
- WriteObject(splitLines.PadLeft(_leftPadding));
- }
- }
-
- private void OutputCalendar(string calendar)
- {
- // Work on a span - we avoid using string.Split() as this allocates on certain runtimes
- var calendarSpan = calendar.AsSpan();
- // Get the end of line for the calendar. We use Environment.NewLine as the calendar is built up using
- // StringBuilder which uses Environment.NewLine for new lines so this should be consistent across operating systems
- var firstNewlineIndex = calendarSpan.IndexOf(Environment.NewLine);
- // Calculate how many lines the calendar is from how many new lines we have.
- // Sure we could count the number of \r\n are present, but the last line might not end with
- // a new line.
- // Conveniently enough, int division works out in our favor here
- var lines = calendarSpan.Length / firstNewlineIndex;
-
- // We need to account for the size of the newline so we have an accurate length when outputting each line
- // of the calendar below
- var newLineLength = firstNewlineIndex + Environment.NewLine.Length;
-
- for (int i = 0; i < lines; i++)
- {
- // The start of each calendar line offset starts at a position including the length of the newline,
- // so in effect the start of the line is the length of the previous line output, plus however many
- // characters the newline was that weren't output as we're taking control there
- var startOfLine = i * newLineLength;
- // End of the line is exclusive of any newline characters
- var endOfLine = startOfLine + firstNewlineIndex;
- var calendarLine = calendarSpan[startOfLine .. endOfLine];
-
- WriteObject(calendarLine.ToString().PadLeft(_leftPadding));
- }
- }
- }
-
- // Was here to test dynamic day names but most people using the console will be using english command names
- // so there's at least some assumption that they understand days of the week in english.
- // It sucks but it remains at least consistent with the argument being in english as well.
- // public class StartDayOfWeekGenerator : IValidateSetValuesGenerator
- // {
- // private string[] _cached { get; set; } = new string[7];
- //
- // public string[] GetValidValues()
- // {
- // if (_cached is null)
- // {
- // // _cached = Enumerable.Range(0, r.Next(3, 63)).Select(x => x.ToString()).ToArray();
- // }
- //
- // return _cached;
- // }
- // }
-}
\ No newline at end of file
diff --git a/src/PowershellModule/Directory.Build.props b/src/PowershellModule/Directory.Build.props
deleted file mode 100644
index afa6e9c..0000000
--- a/src/PowershellModule/Directory.Build.props
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- 0.0.0
- dev
-
-
\ No newline at end of file
diff --git a/src/PowershellModule/PowershellModule.csproj b/src/PowershellModule/PowershellModule.csproj
deleted file mode 100644
index c7f5801..0000000
--- a/src/PowershellModule/PowershellModule.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- net10.0
- PowershellModule
- latestmajor
- enable
-
-
-
-
- All
-
-
-
-
-
-
-
-
diff --git a/src/PowershellModule/manifest.json b/src/PowershellModule/manifest.json
deleted file mode 100644
index 3039b76..0000000
--- a/src/PowershellModule/manifest.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "_TODO":[
- "add manifest details here maybe idk"
- ]
-}
\ No newline at end of file
diff --git a/src/PowershellModule/meta/PowershellModule.psd1 b/src/PowershellModule/meta/PowershellModule.psd1
deleted file mode 100644
index e69de29..0000000
diff --git a/src/PowershellModule/meta/PowershellModule.psm1 b/src/PowershellModule/meta/PowershellModule.psm1
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/ModuleTests/Calendar/BasicRenderTest.cs b/tests/ModuleTests/Calendar/BasicRenderTest.cs
deleted file mode 100644
index 3bc791f..0000000
--- a/tests/ModuleTests/Calendar/BasicRenderTest.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using ModuleCore.Calendar;
-using ModuleTests.Calendar.TestData;
-using System.Globalization;
-
-namespace ModuleTests.Calendar;
-
-public class BasicRenderTest
-{
- private static readonly VerifySettings Settings;
-
- static BasicRenderTest()
- {
- Settings = new VerifySettings();
- var testBaseDirectory = Path.Join(TestConstants.SnapshotFolderName, nameof(BasicRenderTest));
-
- Settings.UseDirectory(testBaseDirectory);
- Settings.DisableDiff();
- }
-
- [Theory]
- [ClassData(typeof(CalendarTestDates))]
- public Task BasicCalendarRender(DateTime month)
- {
- Settings.UseFileName($"{month:yyyy-MM-dd}");
-
- var calendar = new CalendarGenerator();
- // Render the calendar with the start of the month as the today date so no elapsed marks are shown
- var renderedMonth = calendar.Render(month, new DateTime(month.Year, month.Month, 1));
-
- return Verify(renderedMonth, Settings);
- }
-
- [Theory]
- [ClassData(typeof(CultureCodeTestData))]
- public Task CultureInfoCalendarRender(string cultureCode)
- {
- Settings.UseFileName($"{cultureCode}");
-
- Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureCode);
-
- var month = new DateTime(2026, 8, 1);
- var calendar = new CalendarGenerator();
- // Render the calendar with the start of the month as the today date so no elapsed marks are shown
- var renderedMonth = calendar.Render(month, new DateTime(month.Year, month.Month, 1));
-
- return Verify(renderedMonth, Settings);
- }
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/MarkedDayRenderTests.cs b/tests/ModuleTests/Calendar/MarkedDayRenderTests.cs
deleted file mode 100644
index 24af2ce..0000000
--- a/tests/ModuleTests/Calendar/MarkedDayRenderTests.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System.Text;
-using ModuleCore.Calendar;
-
-namespace ModuleTests.Calendar;
-
-public class MarkedDayRenderTests
-{
- private static readonly VerifySettings Settings;
-
- static MarkedDayRenderTests()
- {
- Settings = new VerifySettings();
- var testBaseDirectory = Path.Join(TestConstants.SnapshotFolderName, nameof(MarkedDayRenderTests));
-
- Settings.UseDirectory(testBaseDirectory);
- Settings.DisableDiff();
- }
-
- [Fact]
- public Task DefaultMarkedDayRender()
- {
- Settings.UseFileName(nameof(DefaultMarkedDayRender));
-
- var date = new DateTime(2026, 8, 1);
- var calendar = new CalendarGenerator();
- var renderedMonth = calendar.Render(date, date.AddDays(15));
-
- return Verify(renderedMonth, Settings);
- }
-
- [Fact]
- public Task SimpleMarkedDayRender()
- {
- Settings.UseFileName(nameof(SimpleMarkedDayRender));
-
- var date = new DateTime(2026, 8, 1);
- var calendar = new CalendarGenerator("|");
- var renderedMonth = calendar.Render(date, date.AddDays(15));
-
- return Verify(renderedMonth, Settings);
- }
-
- [Fact]
- public Task LongMarkedDayRender()
- {
- Settings.UseFileName(nameof(LongMarkedDayRender));
-
- var date = new DateTime(2026, 8, 1);
- var calendar = new CalendarGenerator("passed");
- var renderedMonth = calendar.Render(date, date.AddDays(15));
-
- return Verify(renderedMonth, Settings);
- }
-
- [Fact]
- public Task EmojiMarkedDayRender()
- {
- Settings.UseFileName(nameof(EmojiMarkedDayRender));
-
- var date = new DateTime(2026, 8, 1);
- var calendar = new CalendarGenerator("🤫");
- var sb = new StringBuilder();
- sb.AppendLine("Emojis will display incorrectly in text but output correctly in terminals with UTF-8 encoding.")
- .AppendLine(calendar.Render(date, date.AddDays(15)));
-
- return Verify(sb, Settings);
- }
-
- [Fact]
- public Task DoubleWideMarkedDayRender()
- {
- Settings.UseFileName(nameof(DoubleWideMarkedDayRender));
-
- var date = new DateTime(2026, 8, 1);
- // Using an asian-character to have a test covering the unfortunate reality of character rendering of
- // characters that are visually 1 character in width, but render as double width or some other cursed form.
- // Written language was a mistake but trying to render it on computers alongside a different one
- // is arguably worse.
- var calendar = new CalendarGenerator("火");
- var sb = new StringBuilder();
- sb.AppendLine("Double-wide characters will display incorrectly but still tested until rendering can be improved")
- .AppendLine(calendar.Render(date, date.AddDays(15)));
-
- return Verify(sb, Settings);
- }
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/StartDayOfWeekTests.cs b/tests/ModuleTests/Calendar/StartDayOfWeekTests.cs
deleted file mode 100644
index c6680c7..0000000
--- a/tests/ModuleTests/Calendar/StartDayOfWeekTests.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Text;
-using ModuleCore.Calendar;
-
-namespace ModuleTests.Calendar;
-
-public class StartDayOfWeekTests
-{
- private static readonly VerifySettings Settings;
-
- static StartDayOfWeekTests()
- {
- Settings = new VerifySettings();
- var testBaseDirectory = Path.Join(TestConstants.SnapshotFolderName, nameof(StartDayOfWeekTests));
-
- Settings.UseDirectory(testBaseDirectory);
- Settings.DisableDiff();
- }
-
- [Fact]
- public Task StartOfDayRender()
- {
- Settings.UseFileName(nameof(StartOfDayRender));
-
- var date = new DateTime(2026, 8, 1);
- var sb = new StringBuilder();
- foreach (var dayOfWeek in Enum.GetValues())
- {
- var calendar = new CalendarGenerator(startOfWeek: dayOfWeek);
- sb.AppendLine($"Start Day: {dayOfWeek}");
- sb.AppendLine(calendar.Render(date, date));
- }
-
- return Verify(sb, Settings);
- }
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/TestData/CalendarTestDates.cs b/tests/ModuleTests/Calendar/TestData/CalendarTestDates.cs
deleted file mode 100644
index 189b4a4..0000000
--- a/tests/ModuleTests/Calendar/TestData/CalendarTestDates.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace ModuleTests.Calendar.TestData;
-
-public class CalendarTestDates : TestDataEnumerator
-{
- public CalendarTestDates()
- {
- Data =
- [
- new DateTime(2026, 06, 01),
- new DateTime(2026, 07, 01),
- new DateTime(2026, 08, 01),
- ];
- }
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/TestData/CultureCodeTestData.cs b/tests/ModuleTests/Calendar/TestData/CultureCodeTestData.cs
deleted file mode 100644
index 9bdf1f0..0000000
--- a/tests/ModuleTests/Calendar/TestData/CultureCodeTestData.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace ModuleTests.Calendar.TestData;
-
-public class CultureCodeTestData : TestDataEnumerator
-{
- public CultureCodeTestData()
- {
- Data =
- [
- "da-DK",
- "en-AU",
- "cs-CZ",
- "es-PR",
- "fr-LU",
- "nl-NL",
- // Will render unaligned due to the character encoding, here to catch if I fix this later
- "te-IN"
- ];
- }
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-06-01.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-06-01.verified.txt
deleted file mode 100644
index de75dd0..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-06-01.verified.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-┌─────────────────────────────────────────┐
-│ June 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
-│ 8 │ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │
-│ 15 │ 16 │ 17 │ 18 │ 19 │ 20 │ 21 │
-│ 22 │ 23 │ 24 │ 25 │ 26 │ 27 │ 28 │
-│ 29 │ 30 │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-07-01.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-07-01.verified.txt
deleted file mode 100644
index a74744c..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-07-01.verified.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-┌─────────────────────────────────────────┐
-│ July 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ 1 │ 2 │ 3 │ 4 │ 5 │
-│ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ 12 │
-│ 13 │ 14 │ 15 │ 16 │ 17 │ 18 │ 19 │
-│ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │ 26 │
-│ 27 │ 28 │ 29 │ 30 │ 31 │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-08-01.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-08-01.verified.txt
deleted file mode 100644
index 9598b49..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/2026-08-01.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/cs-CZ.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/cs-CZ.verified.txt
deleted file mode 100644
index 797c58a..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/cs-CZ.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌──────────────────────────────────┐
-│ srpen 2026 │
-├────┬────┬────┬────┬────┬────┬────┤
-│ po │ út │ st │ čt │ pá │ so │ ne │
-├────┼────┼────┼────┼────┼────┼────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└────┴────┴────┴────┴────┴────┴────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/da-DK.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/da-DK.verified.txt
deleted file mode 100644
index 58618a1..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/da-DK.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌─────────────────────────────────────────┐
-│ august 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ man │ tir │ ons │ tor │ fre │ lør │ søn │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/en-AU.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/en-AU.verified.txt
deleted file mode 100644
index 9598b49..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/en-AU.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/es-PR.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/es-PR.verified.txt
deleted file mode 100644
index 9395157..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/es-PR.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌────────────────────────────────────────────────┐
-│ agosto 2026 │
-├──────┬──────┬──────┬──────┬──────┬──────┬──────┤
-│ lun. │ mar. │ mié. │ jue. │ vie. │ sáb. │ dom. │
-├──────┼──────┼──────┼──────┼──────┼──────┼──────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└──────┴──────┴──────┴──────┴──────┴──────┴──────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/fr-LU.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/fr-LU.verified.txt
deleted file mode 100644
index 101ef77..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/fr-LU.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌────────────────────────────────────────────────┐
-│ août 2026 │
-├──────┬──────┬──────┬──────┬──────┬──────┬──────┤
-│ lun. │ mar. │ mer. │ jeu. │ ven. │ sam. │ dim. │
-├──────┼──────┼──────┼──────┼──────┼──────┼──────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└──────┴──────┴──────┴──────┴──────┴──────┴──────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/nl-NL.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/nl-NL.verified.txt
deleted file mode 100644
index 1aac604..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/nl-NL.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌──────────────────────────────────┐
-│ augustus 2026 │
-├────┬────┬────┬────┬────┬────┬────┤
-│ ma │ di │ wo │ do │ vr │ za │ zo │
-├────┼────┼────┼────┼────┼────┼────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└────┴────┴────┴────┴────┴────┴────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/te-IN.verified.txt b/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/te-IN.verified.txt
deleted file mode 100644
index 5568a20..0000000
--- a/tests/ModuleTests/Calendar/snapshots/BasicRenderTest/te-IN.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌───────────────────────────────────────────────────────┐
-│ ఆగస్టు 2026 │
-├───────┬───────┬───────┬───────┬───────┬───────┬───────┤
-│ సోమ │ మంగళ │ బుధ │ గురు │ శుక్ర │ శని │ ఆది │
-├───────┼───────┼───────┼───────┼───────┼───────┼───────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└───────┴───────┴───────┴───────┴───────┴───────┴───────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DefaultMarkedDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DefaultMarkedDayRender.verified.txt
deleted file mode 100644
index 4181cc1..0000000
--- a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DefaultMarkedDayRender.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ x │ x │
-│ x │ x │ x │ x │ x │ x │ x │
-│ x │ x │ x │ x │ x │ x │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DoubleWideMarkedDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DoubleWideMarkedDayRender.verified.txt
deleted file mode 100644
index cc27f4f..0000000
--- a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/DoubleWideMarkedDayRender.verified.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Double-wide characters will display incorrectly but still tested until rendering can be improved
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 火 │ 火 │
-│ 火 │ 火 │ 火 │ 火 │ 火 │ 火 │ 火 │
-│ 火 │ 火 │ 火 │ 火 │ 火 │ 火 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
diff --git a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/EmojiMarkedDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/EmojiMarkedDayRender.verified.txt
deleted file mode 100644
index a02a725..0000000
--- a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/EmojiMarkedDayRender.verified.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Emojis will display incorrectly in text but output correctly in terminals with UTF-8 encoding.
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 🤫 │ 🤫 │
-│ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 🤫 │
-│ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 🤫 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
diff --git a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/LongMarkedDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/LongMarkedDayRender.verified.txt
deleted file mode 100644
index a8ebbf6..0000000
--- a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/LongMarkedDayRender.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌──────────────────────────────────────────────────────────────┐
-│ August 2026 │
-├────────┬────────┬────────┬────────┬────────┬────────┬────────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
-│ │ │ │ │ │ passed │ passed │
-│ passed │ passed │ passed │ passed │ passed │ passed │ passed │
-│ passed │ passed │ passed │ passed │ passed │ passed │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└────────┴────────┴────────┴────────┴────────┴────────┴────────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/SimpleMarkedDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/SimpleMarkedDayRender.verified.txt
deleted file mode 100644
index f546aac..0000000
--- a/tests/ModuleTests/Calendar/snapshots/MarkedDayRenderTests/SimpleMarkedDayRender.verified.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ | │ | │
-│ | │ | │ | │ | │ | │ | │ | │
-│ | │ | │ | │ | │ | │ | │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
\ No newline at end of file
diff --git a/tests/ModuleTests/Calendar/snapshots/StartDayOfWeekTests/StartOfDayRender.verified.txt b/tests/ModuleTests/Calendar/snapshots/StartDayOfWeekTests/StartOfDayRender.verified.txt
deleted file mode 100644
index 8393453..0000000
--- a/tests/ModuleTests/Calendar/snapshots/StartDayOfWeekTests/StartOfDayRender.verified.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-Start Day: Sunday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Sun │ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ │ 1 │
-│ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │
-│ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │
-│ 16 │ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │
-│ 23 │ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │
-│ 30 │ 31 │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Monday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Mon │ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ │ 1 │ 2 │
-│ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
-│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │
-│ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │
-│ 24 │ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │
-│ 31 │ │ │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Tuesday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Tue │ Wed │ Thu │ Fri │ Sat │ Sun │ Mon │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ │ 1 │ 2 │ 3 │
-│ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │
-│ 11 │ 12 │ 13 │ 14 │ 15 │ 16 │ 17 │
-│ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │ 24 │
-│ 25 │ 26 │ 27 │ 28 │ 29 │ 30 │ 31 │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Wednesday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Wed │ Thu │ Fri │ Sat │ Sun │ Mon │ Tue │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ │ 1 │ 2 │ 3 │ 4 │
-│ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
-│ 12 │ 13 │ 14 │ 15 │ 16 │ 17 │ 18 │
-│ 19 │ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │
-│ 26 │ 27 │ 28 │ 29 │ 30 │ 31 │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Thursday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Thu │ Fri │ Sat │ Sun │ Mon │ Tue │ Wed │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ │ 1 │ 2 │ 3 │ 4 │ 5 │
-│ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ 12 │
-│ 13 │ 14 │ 15 │ 16 │ 17 │ 18 │ 19 │
-│ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │ 26 │
-│ 27 │ 28 │ 29 │ 30 │ 31 │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Friday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Fri │ Sat │ Sun │ Mon │ Tue │ Wed │ Thu │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │
-│ 7 │ 8 │ 9 │ 10 │ 11 │ 12 │ 13 │
-│ 14 │ 15 │ 16 │ 17 │ 18 │ 19 │ 20 │
-│ 21 │ 22 │ 23 │ 24 │ 25 │ 26 │ 27 │
-│ 28 │ 29 │ 30 │ 31 │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
-Start Day: Saturday
-┌─────────────────────────────────────────┐
-│ August 2026 │
-├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
-│ Sat │ Sun │ Mon │ Tue │ Wed │ Thu │ Fri │
-├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
-│ 8 │ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │
-│ 15 │ 16 │ 17 │ 18 │ 19 │ 20 │ 21 │
-│ 22 │ 23 │ 24 │ 25 │ 26 │ 27 │ 28 │
-│ 29 │ 30 │ 31 │ │ │ │ │
-└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
diff --git a/tests/ModuleTests/ModuleTests.csproj b/tests/ModuleTests/ModuleTests.csproj
deleted file mode 100644
index 7343cfd..0000000
--- a/tests/ModuleTests/ModuleTests.csproj
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- net10.0
- enable
- enable
- false
- Exe
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/tests/ModuleTests/TestConstants.cs b/tests/ModuleTests/TestConstants.cs
deleted file mode 100644
index e32b3cd..0000000
--- a/tests/ModuleTests/TestConstants.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace ModuleTests;
-
-public class TestConstants
-{
- public const string SnapshotFolderName = "Snapshots";
-}
\ No newline at end of file
diff --git a/tests/ModuleTests/TestDataEnumerator.cs b/tests/ModuleTests/TestDataEnumerator.cs
deleted file mode 100644
index 92937f5..0000000
--- a/tests/ModuleTests/TestDataEnumerator.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Collections;
-
-namespace ModuleTests;
-
-public abstract class TestDataEnumerator : IEnumerable>
-{
- protected IEnumerable Data { get; init; } = [];
-
- public IEnumerator> GetEnumerator()
- {
- return Data.Select(data => new TheoryDataRow(data)).GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
-}
\ No newline at end of file