diff --git a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasChangeType.Tests.cs b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasChangeType.Tests.cs index a6413d5..1d23538 100644 --- a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasChangeType.Tests.cs +++ b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasChangeType.Tests.cs @@ -52,6 +52,8 @@ async Task Act() await That(Act).Throws() .WithParamName("unexpected"); + await That(Act).Throws() + .WithMessage("The unexpected change type must include at least one flag.*").AsWildcard(); } [Fact] @@ -97,6 +99,45 @@ async Task Act() await That(Act).Throws() .WithParamName("expected"); + await That(Act).Throws() + .WithMessage("The expected change type must include at least one flag.*").AsWildcard(); + } + + [Fact] + public async Task WhenSubjectIsNull_ShouldFail() + { + ChangeDescription? change = null; + + async Task Act() + { + await That(change!).HasChangeType(WatcherChangeTypes.Created); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has change type Created, + but it was + """); + } + + [Fact] + public async Task WhenExpectedPartiallyOverlapsActual_ShouldFail() + { + ChangeDescription change = Capture(fs => fs.File.WriteAllText("foo.txt", "")); + + async Task Act() + { + await That(change) + .HasChangeType(WatcherChangeTypes.Created | WatcherChangeTypes.Deleted); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has change type Created, Deleted, + but it was Created + """); } } } diff --git a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasFileSystemType.Tests.cs b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasFileSystemType.Tests.cs index 30972fe..9826e71 100644 --- a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasFileSystemType.Tests.cs +++ b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasFileSystemType.Tests.cs @@ -52,6 +52,8 @@ async Task Act() await That(Act).Throws() .WithParamName("unexpected"); + await That(Act).Throws() + .WithMessage("The unexpected file system type must include at least one flag.*").AsWildcard(); } [Fact] @@ -66,6 +68,8 @@ async Task Act() await That(Act).Throws() .WithParamName("expected"); + await That(Act).Throws() + .WithMessage("The expected file system type must include at least one flag.*").AsWildcard(); } [Fact] @@ -98,6 +102,43 @@ async Task Act() await That(Act).DoesNotThrow(); } + + [Fact] + public async Task WhenSubjectIsNull_ShouldFail() + { + ChangeDescription? change = null; + + async Task Act() + { + await That(change!).HasFileSystemType(FileSystemTypes.File); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has file system type File, + but it was + """); + } + + [Fact] + public async Task WhenExpectedPartiallyOverlapsActual_ShouldFail() + { + ChangeDescription change = Capture(fs => fs.File.WriteAllText("foo.txt", "")); + + async Task Act() + { + await That(change) + .HasFileSystemType(FileSystemTypes.File | FileSystemTypes.Directory); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has file system type DirectoryOrFile, + but it was File + """); + } } } } diff --git a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasName.Tests.cs b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasName.Tests.cs index 46bdd25..883d243 100644 --- a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasName.Tests.cs +++ b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasName.Tests.cs @@ -19,7 +19,15 @@ async Task Act() } await That(Act).ThrowsException() - .WithMessage("*has name equal to \"bar.txt\"*").AsWildcard(); + .WithMessage(""" + Expected that change + has name equal to "bar.txt", + but it was "foo.txt" which differs at index 0: + ↓ (actual) + "foo.txt" + "bar.txt" + ↑ (expected) + """); } [Fact] @@ -34,6 +42,24 @@ async Task Act() await That(Act).DoesNotThrow(); } + + [Fact] + public async Task WhenSubjectIsNull_ShouldFail() + { + ChangeDescription? change = null; + + async Task Act() + { + await That(change!).HasName("foo.txt"); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has name equal to "foo.txt", + but it was + """); + } } } } diff --git a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasNotifyFilters.Tests.cs b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasNotifyFilters.Tests.cs index 798f8fa..9fbd212 100644 --- a/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasNotifyFilters.Tests.cs +++ b/Tests/aweXpect.Testably.Tests/ChangeDescriptionTests.HasNotifyFilters.Tests.cs @@ -34,7 +34,11 @@ async Task Act() } await That(Act).ThrowsException() - .WithMessage("*does not have notify filters*").AsWildcard(); + .WithMessage($""" + Expected that change + does not have notify filters {present}, + but it did + """); } [Fact] @@ -49,6 +53,8 @@ async Task Act() await That(Act).Throws() .WithParamName("unexpected"); + await That(Act).Throws() + .WithMessage("The unexpected notify filters must include at least one flag.*").AsWildcard(); } [Fact] @@ -77,6 +83,8 @@ async Task Act() await That(Act).Throws() .WithParamName("expected"); + await That(Act).Throws() + .WithMessage("The expected notify filters must include at least one flag.*").AsWildcard(); } [Fact] @@ -84,13 +92,52 @@ public async Task WhenMissingExpectedFlag_ShouldFail() { ChangeDescription change = Capture(fs => fs.File.WriteAllText("foo.txt", "")); + NotifyFilters actual = change.NotifyFilters; + async Task Act() { await That(change).HasNotifyFilters(NotifyFilters.Security); } await That(Act).ThrowsException() - .WithMessage("*has notify filters Security*").AsWildcard(); + .WithMessage($""" + Expected that change + has notify filters Security, + but it was {actual} + """); + } + + [Fact] + public async Task WhenSubjectIsNull_ShouldFail() + { + ChangeDescription? change = null; + + async Task Act() + { + await That(change!).HasNotifyFilters(NotifyFilters.FileName); + } + + await That(Act).ThrowsException() + .WithMessage(""" + Expected that change + has notify filters FileName, + but it was + """); + } + + [Fact] + public async Task WhenExpectedPartiallyOverlapsActual_ShouldFail() + { + ChangeDescription change = Capture(fs => fs.File.WriteAllText("foo.txt", "")); + NotifyFilters present = change.NotifyFilters; + + async Task Act() + { + await That(change).HasNotifyFilters(present | NotifyFilters.Security); + } + + await That(Act).ThrowsException() + .WithMessage("*has notify filters*Security*but it was*").AsWildcard(); } } } diff --git a/Tests/aweXpect.Testably.Tests/FileSystem.TriggeredNotification.Tests.cs b/Tests/aweXpect.Testably.Tests/FileSystem.TriggeredNotification.Tests.cs index 35c5b28..ed01f93 100644 --- a/Tests/aweXpect.Testably.Tests/FileSystem.TriggeredNotification.Tests.cs +++ b/Tests/aweXpect.Testably.Tests/FileSystem.TriggeredNotification.Tests.cs @@ -210,6 +210,24 @@ but it was not triggered """); } + [Fact] + public async Task WhichTwice_WhenChangeDoesNotMatch_ShouldJoinFiltersWithAnd() + { + MockFileSystem sut = new(); + sut.File.WriteAllText("foo.txt", "x"); + + async Task Act() + { + await That(sut).TriggeredNotification() + .Which(c => c.HasName("foo.txt")) + .Which(c => c.HasChangeType(WatcherChangeTypes.Deleted)) + .Within(TimeSpan.FromMilliseconds(100)); + } + + await That(Act).ThrowsException() + .WithMessage("*which has name equal to \"foo.txt\" and has change type Deleted*").AsWildcard(); + } + [Fact] public async Task WhichWithInnerExpectation_WhenChangeMatches_ShouldSucceed() {