Something already sitting where Documents/N1MM Logger+ should go — a file, or a link to somewhere that is not there — threw out of Directory.CreateDirectory before the program had a window, so the operator got a stack trace and nothing else. CreateFolders answers with what stopped it, and the program shows it in a window naming the path and stops there. NONEMM_HOME moves the whole lot somewhere else, for a station that keeps its files off the Documents folder. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD
94 lines
2.9 KiB
C#
94 lines
2.9 KiB
C#
using Nonemm.App.Configuration;
|
|
|
|
namespace Nonemm.App.Tests;
|
|
|
|
/// The folders under the user's own directory, which are N1MM's.
|
|
public class UserPathsTests : IDisposable
|
|
{
|
|
private readonly string root = Path.Combine(Path.GetTempPath(), $"nonemm-{Guid.NewGuid():N}");
|
|
|
|
public void Dispose()
|
|
{
|
|
if (Directory.Exists(root))
|
|
{
|
|
Directory.Delete(root, recursive: true);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void TheFoldersAreN1mmsOwnNames()
|
|
{
|
|
UserPaths paths = new(root);
|
|
|
|
Assert.Null(paths.CreateFolders());
|
|
|
|
string[] made = [.. Directory.GetDirectories(root).Select(Path.GetFileName).OfType<string>().Order()];
|
|
Assert.Equal(
|
|
[
|
|
"CallHistoryFiles", "Databases", "Diagnostics", "ExportFiles", "FunctionKeyMessages",
|
|
"GoalFiles", "LettersFiles", "Nonemm", "QsoRecording", "SkinsAndLayouts",
|
|
"SupportFiles", "SystemFiles", "TransactionLogFiles", "UserDefinedContests", "Wav",
|
|
],
|
|
made);
|
|
}
|
|
|
|
/// N1MM plays `Wav\<operator>\Cq.wav`, so that is where the recordings of
|
|
/// whoever is at the microphone are looked for here as well.
|
|
[Fact]
|
|
public void AnOperatorHasHisOwnFolderOfRecordings()
|
|
{
|
|
UserPaths paths = new(root);
|
|
|
|
Assert.Equal(Path.Combine(root, "Wav", "OM3KFF"), paths.WavFor("om3kff"));
|
|
Assert.Equal(Path.Combine(root, "Wav"), paths.WavFor(" "));
|
|
}
|
|
|
|
[Fact]
|
|
public void MakingTheFoldersTwiceIsNotAnError()
|
|
{
|
|
UserPaths paths = new(root);
|
|
|
|
paths.CreateFolders();
|
|
paths.CreateFolders();
|
|
|
|
Assert.True(Directory.Exists(paths.Wav));
|
|
}
|
|
|
|
/// What N1MM has no place for lives in a folder of this program's own.
|
|
[Fact]
|
|
public void TheSettingsFileIsInOurOwnFolder()
|
|
{
|
|
UserPaths paths = new(root);
|
|
|
|
Assert.Equal(Path.Combine(root, "Nonemm", "settings.json"), paths.SettingsFile);
|
|
}
|
|
|
|
/// A file where the folder should be stops the program starting, so it says
|
|
/// so rather than throwing at an operator who has no window to read it in.
|
|
[Fact]
|
|
public void AFileWhereTheFolderShouldBeIsReported()
|
|
{
|
|
Directory.CreateDirectory(root);
|
|
string inTheWay = Path.Combine(root, "N1MM Logger+");
|
|
File.WriteAllText(inTheWay, "not a folder");
|
|
UserPaths paths = new(inTheWay);
|
|
|
|
string? problem = paths.CreateFolders();
|
|
|
|
Assert.NotNull(problem);
|
|
Assert.Contains(inTheWay, problem);
|
|
Assert.Contains("is a file", problem);
|
|
}
|
|
|
|
[Fact]
|
|
public void FoldersThatAreAlreadyThereAreLeftAlone()
|
|
{
|
|
UserPaths paths = new(root);
|
|
paths.CreateFolders();
|
|
File.WriteAllText(Path.Combine(paths.Databases, "om5m.s3db"), "log");
|
|
|
|
Assert.Null(paths.CreateFolders());
|
|
Assert.Equal("log", File.ReadAllText(Path.Combine(paths.Databases, "om5m.s3db")));
|
|
}
|
|
}
|