using Amphora; using System; using UnitTestSharp; namespace Blacklight.Core.UnitTests { public class HostClipboardExtensionsTests : TestFixture { public class RecordingClipboard : IHostClipboard { public string Held { get; private set; } public bool Accepts { get; set; } = true; public StringHostClipboardText Opened { get; private set; } // Handed out in place of the held text when set. public IHostClipboardText Override { get; set; } public bool TryOpenText(out IHostClipboardText text) { text = Override; if (text != null) { return true; } if (Held == null) { return false; } Opened = new StringHostClipboardText(Held); text = Opened; return true; } public bool SetText(IChunkedText text) { if (Accepts) { Held = text.ToText(); } return Accepts; } } public class OutOfMemoryText : IHostClipboardText { public bool IsDisposed { get; private set; } public int Length => 1; public StringView GetChunk(int start) { throw new OutOfMemoryException(); } public void Dispose() { IsDisposed = true; } } public class TryGetTextTests : TestFixture { public void ReturnsTheTextTheHostHolds() { var clipboard = new RecordingClipboard(); clipboard.SetText("hello"); CheckTrue(clipboard.TryGetText(out string text)); CheckEqual("hello", text); } public void AnEmptyText_IsReturnedAsEmpty() { var clipboard = new RecordingClipboard(); clipboard.SetText(""); CheckTrue(clipboard.TryGetText(out string text)); CheckEqual("", text); } public void WithNothingOnTheHost_ReturnsFalseAndNull() { CheckFalse(new RecordingClipboard().TryGetText(out string text)); CheckNull(text); } public void DisposesTheTextItOpened() { var clipboard = new RecordingClipboard(); clipboard.SetText("hello"); clipboard.TryGetText(out string _); CheckTrue(clipboard.Opened.IsDisposed); } public void ATextTooBigToBuild_ReturnsFalseAndNull() { var clipboard = new RecordingClipboard { Override = new OutOfMemoryText() }; CheckFalse(clipboard.TryGetText(out string text)); CheckNull(text); } public void ATextTooBigToBuild_IsStillDisposed() { var big = new OutOfMemoryText(); var clipboard = new RecordingClipboard { Override = big }; clipboard.TryGetText(out string _); CheckTrue(big.IsDisposed); } } public class SetTextTests : TestFixture { public void AString_ReachesTheHostAsItsText() { var clipboard = new RecordingClipboard(); clipboard.SetText("hello"); CheckEqual("hello", clipboard.Held); } public void AnEmptyString_ReachesTheHostAsAnEmptyText() { var clipboard = new RecordingClipboard(); clipboard.SetText(""); CheckEqual("", clipboard.Held); } public void ReturnsWhatTheHostReturns() { var clipboard = new RecordingClipboard(); CheckTrue(clipboard.SetText("a")); clipboard.Accepts = false; CheckFalse(clipboard.SetText("b")); } public void ANullString_Throws() { CheckThrow(typeof(ArgumentNullException)); new RecordingClipboard().SetText((string)null); } } } }