From b7c8b3d25988a3ad7f7cdf4c61f587c1c3d72d74 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Mon, 25 May 2020 22:58:00 +1000 Subject: [PATCH] add instance API (#197) --- readme.md | 31 ++++++++--- readme.source.md | 7 +++ src/AndroidApp/MainActivity.cs | 4 +- src/Directory.Build.props | 2 +- src/TestConsole/Program.cs | 4 +- src/Tests/ClipboardServiceTests.cs | 39 ++++++++++++++ src/Tests/ClipboardTests.cs | 8 +-- src/Tests/Snippets.cs | 17 ++++-- src/Tests/TestSettings.cs | 3 ++ src/TextCopy.sln | 1 + src/TextCopy/Clipboard.cs | 30 ++++------- src/TextCopy/ClipboardService.cs | 52 +++++++++++++++++++ ...roid.cs => ClipboardService_GetAndroid.cs} | 2 +- ...ard.cs => ClipboardService_GetStandard.cs} | 2 +- ...d_GetUap.cs => ClipboardService_GetUap.cs} | 2 +- ...d_GetiOS.cs => ClipboardService_GetiOS.cs} | 8 +-- ...roid.cs => ClipboardService_SetAndroid.cs} | 2 +- ...ard.cs => ClipboardService_SetStandard.cs} | 2 +- ...d_SetUap.cs => ClipboardService_SetUap.cs} | 2 +- ...d_SetiOS.cs => ClipboardService_SetiOS.cs} | 8 +-- src/TextCopy/IClipboard.cs | 31 +++++++++++ src/UapApp/MainPage.xaml.cs | 4 +- src/UapApp/UapApp.csproj | 10 ++-- src/iOSApp/ViewController.cs | 4 +- 24 files changed, 212 insertions(+), 63 deletions(-) create mode 100644 src/Tests/ClipboardServiceTests.cs create mode 100644 src/Tests/TestSettings.cs create mode 100644 src/TextCopy/ClipboardService.cs rename src/TextCopy/{Clipboard_GetAndroid.cs => ClipboardService_GetAndroid.cs} (93%) rename src/TextCopy/{Clipboard_GetStandard.cs => ClipboardService_GetStandard.cs} (96%) rename src/TextCopy/{Clipboard_GetUap.cs => ClipboardService_GetUap.cs} (96%) rename src/TextCopy/{Clipboard_GetiOS.cs => ClipboardService_GetiOS.cs} (67%) rename src/TextCopy/{Clipboard_SetAndroid.cs => ClipboardService_SetAndroid.cs} (95%) rename src/TextCopy/{Clipboard_SetStandard.cs => ClipboardService_SetStandard.cs} (96%) rename src/TextCopy/{Clipboard_SetUap.cs => ClipboardService_SetUap.cs} (95%) rename src/TextCopy/{Clipboard_SetiOS.cs => ClipboardService_SetiOS.cs} (74%) create mode 100644 src/TextCopy/IClipboard.cs diff --git a/readme.md b/readme.md index 35088b9f..3f1f7ac0 100644 --- a/readme.md +++ b/readme.md @@ -23,6 +23,7 @@ Support is available via a [Tidelift Subscription](https://tidelift.com/subscrip * [SetText](#settext) * [GetTextAsync](#gettextasync) * [GetText](#gettext) + * [Instance API](#instance-api) * [Supported on](#supported-on) * [Notes on Linux](#notes-on-linux) * [Security contact information](#security-contact-information) @@ -41,9 +42,9 @@ https://nuget.org/packages/TextCopy/ ```cs -await TextCopy.Clipboard.SetTextAsync("Text to place in clipboard"); +await ClipboardService.SetTextAsync("Text to place in clipboard"); ``` -snippet source | anchor +snippet source | anchor @@ -52,9 +53,9 @@ await TextCopy.Clipboard.SetTextAsync("Text to place in clipboard"); ```cs -TextCopy.Clipboard.SetText("Text to place in clipboard"); +ClipboardService.SetText("Text to place in clipboard"); ``` -snippet source | anchor +snippet source | anchor @@ -63,9 +64,9 @@ TextCopy.Clipboard.SetText("Text to place in clipboard"); ```cs -var text = await TextCopy.Clipboard.GetTextAsync(); +var text = await ClipboardService.GetTextAsync(); ``` -snippet source | anchor +snippet source | anchor @@ -74,9 +75,23 @@ var text = await TextCopy.Clipboard.GetTextAsync(); ```cs -var text = TextCopy.Clipboard.GetText(); +var text = ClipboardService.GetText(); ``` -snippet source | anchor +snippet source | anchor + + + +## Instance API + +In adition to the above static API, there is an instance API exposed: + + + +```cs +var clipboard = new Clipboard(); +clipboard.SetText("Text to place in clipboard"); +``` +snippet source | anchor diff --git a/readme.source.md b/readme.source.md index e03db506..a1f944e8 100644 --- a/readme.source.md +++ b/readme.source.md @@ -39,6 +39,13 @@ snippet: GetTextAsync snippet: GetText +## Instance API + +In adition to the above static API, there is an instance API exposed: + +snippet: SetTextInstance + + ## Supported on * Windows with .NET Framework 4.6.1 and up diff --git a/src/AndroidApp/MainActivity.cs b/src/AndroidApp/MainActivity.cs index ebff2de5..a9a244e2 100644 --- a/src/AndroidApp/MainActivity.cs +++ b/src/AndroidApp/MainActivity.cs @@ -36,8 +36,8 @@ protected override void OnResume() void Input_TextChanged(object sender, TextChangedEventArgs e) { - TextCopy.Clipboard.SetText(e.Text.ToString()); + TextCopy.ClipboardService.SetText(e.Text.ToString()); - clipboardContent.Text = TextCopy.Clipboard.GetText(); + clipboardContent.Text = TextCopy.ClipboardService.GetText(); } } \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 223bc293..5986c927 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 3.3.0 + 4.0.0 1.0.0 Clipboard, Copy A cross platform package to copy text to the clipboard. diff --git a/src/TestConsole/Program.cs b/src/TestConsole/Program.cs index ffb1fb14..c5642b33 100644 --- a/src/TestConsole/Program.cs +++ b/src/TestConsole/Program.cs @@ -6,8 +6,8 @@ class Program static async Task Main() { var text = "Hello World!"; - await Clipboard.SetTextAsync(text); - var result = await Clipboard.GetTextAsync(); + await ClipboardService.SetTextAsync(text); + var result = await ClipboardService.GetTextAsync(); if (result == text) { return 0; diff --git a/src/Tests/ClipboardServiceTests.cs b/src/Tests/ClipboardServiceTests.cs new file mode 100644 index 00000000..409e93f3 --- /dev/null +++ b/src/Tests/ClipboardServiceTests.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; +using TextCopy; +using VerifyXunit; +using Xunit; +using Xunit.Abstractions; + +public class ClipboardServiceTests : + VerifyBase +{ + [Fact] + public async Task Simple() + { + VerifyInner("Foo"); + VerifyInner("🅢"); + await VerifyInnerAsync("Foo"); + await VerifyInnerAsync("🅢"); + } + + static void VerifyInner(string expected) + { + ClipboardService.SetText(expected); + + var actual = ClipboardService.GetText(); + Assert.Equal(expected, actual); + } + + static async Task VerifyInnerAsync(string expected) + { + await ClipboardService.SetTextAsync(expected); + + var actual = await ClipboardService.GetTextAsync(); + Assert.Equal(expected, actual); + } + + public ClipboardServiceTests(ITestOutputHelper output) : + base(output) + { + } +} \ No newline at end of file diff --git a/src/Tests/ClipboardTests.cs b/src/Tests/ClipboardTests.cs index 8fcb1e25..11cb54fe 100644 --- a/src/Tests/ClipboardTests.cs +++ b/src/Tests/ClipboardTests.cs @@ -18,17 +18,17 @@ public async Task Simple() static void VerifyInner(string expected) { - Clipboard.SetText(expected); + ClipboardService.SetText(expected); - var actual = Clipboard.GetText(); + var actual = new Clipboard().GetText(); Assert.Equal(expected, actual); } static async Task VerifyInnerAsync(string expected) { - await Clipboard.SetTextAsync(expected); + await new Clipboard().SetTextAsync(expected); - var actual = await Clipboard.GetTextAsync(); + var actual = await ClipboardService.GetTextAsync(); Assert.Equal(expected, actual); } diff --git a/src/Tests/Snippets.cs b/src/Tests/Snippets.cs index 86500f38..63e00148 100644 --- a/src/Tests/Snippets.cs +++ b/src/Tests/Snippets.cs @@ -1,4 +1,6 @@ using System.Threading.Tasks; +using TextCopy; + // ReSharper disable UnusedVariable class Snippets @@ -7,7 +9,14 @@ void SetText() { #region SetText - TextCopy.Clipboard.SetText("Text to place in clipboard"); + ClipboardService.SetText("Text to place in clipboard"); + + #endregion + + #region SetTextInstance + + var clipboard = new Clipboard(); + clipboard.SetText("Text to place in clipboard"); #endregion } @@ -16,7 +25,7 @@ void GetText() { #region GetText - var text = TextCopy.Clipboard.GetText(); + var text = ClipboardService.GetText(); #endregion } @@ -25,7 +34,7 @@ async Task SetTextAsync() { #region SetTextAsync - await TextCopy.Clipboard.SetTextAsync("Text to place in clipboard"); + await ClipboardService.SetTextAsync("Text to place in clipboard"); #endregion } @@ -34,7 +43,7 @@ async Task GetTextAsync() { #region GetTextAsync - var text = await TextCopy.Clipboard.GetTextAsync(); + var text = await ClipboardService.GetTextAsync(); #endregion } diff --git a/src/Tests/TestSettings.cs b/src/Tests/TestSettings.cs new file mode 100644 index 00000000..7db84979 --- /dev/null +++ b/src/Tests/TestSettings.cs @@ -0,0 +1,3 @@ +using Xunit; + +[assembly: CollectionBehavior(DisableTestParallelization = true)] \ No newline at end of file diff --git a/src/TextCopy.sln b/src/TextCopy.sln index 151b32af..225d6214 100644 --- a/src/TextCopy.sln +++ b/src/TextCopy.sln @@ -8,6 +8,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .travis.yml = .travis.yml appveyor.yml = appveyor.yml Directory.Build.props = Directory.Build.props + ..\readme.source.md = ..\readme.source.md EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TextCopy", "TextCopy\TextCopy.csproj", "{92E64F4E-6A8E-43C2-9C8D-694E0327BEF0}" diff --git a/src/TextCopy/Clipboard.cs b/src/TextCopy/Clipboard.cs index 23f603cc..03d17112 100644 --- a/src/TextCopy/Clipboard.cs +++ b/src/TextCopy/Clipboard.cs @@ -1,5 +1,4 @@ -using System; -using System.Threading; +using System.Threading; using System.Threading.Tasks; namespace TextCopy @@ -7,46 +6,39 @@ namespace TextCopy /// /// Provides methods to place text on and retrieve text from the system Clipboard. /// - public static partial class Clipboard + public class Clipboard : + IClipboard { - static Func> getAsyncFunc = CreateAsyncGet(); - static Func getFunc = CreateGet(); - /// /// Retrieves text data from the Clipboard. /// - public static Task GetTextAsync(CancellationToken cancellation = default) + public virtual Task GetTextAsync(CancellationToken cancellation = default) { - return getAsyncFunc(cancellation); + return ClipboardService.GetTextAsync(cancellation); } /// /// Retrieves text data from the Clipboard. /// - public static string? GetText() + public virtual string? GetText() { - return getFunc(); + return ClipboardService.GetText(); } - static Func setAsyncAction = CreateAsyncSet(); - static Action setAction = CreateSet(); - /// /// Clears the Clipboard and then adds text data to it. /// - public static Task SetTextAsync(string text, CancellationToken cancellation = default) + public virtual Task SetTextAsync(string text, CancellationToken cancellation = default) { - Guard.AgainstNull(text, nameof(text)); - return setAsyncAction(text, cancellation); + return ClipboardService.SetTextAsync(text, cancellation); } /// /// Clears the Clipboard and then adds text data to it. /// - public static void SetText(string text) + public virtual void SetText(string text) { - Guard.AgainstNull(text, nameof(text)); - setAction(text); + ClipboardService.SetText(text); } } } \ No newline at end of file diff --git a/src/TextCopy/ClipboardService.cs b/src/TextCopy/ClipboardService.cs new file mode 100644 index 00000000..61e5d2d1 --- /dev/null +++ b/src/TextCopy/ClipboardService.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace TextCopy +{ + /// + /// Provides methods to place text on and retrieve text from the system Clipboard. + /// + public static partial class ClipboardService + { + static Func> getAsyncFunc = CreateAsyncGet(); + static Func getFunc = CreateGet(); + + /// + /// Retrieves text data from the Clipboard. + /// + public static Task GetTextAsync(CancellationToken cancellation = default) + { + return getAsyncFunc(cancellation); + } + + /// + /// Retrieves text data from the Clipboard. + /// + public static string? GetText() + { + return getFunc(); + } + + static Func setAsyncAction = CreateAsyncSet(); + static Action setAction = CreateSet(); + + /// + /// Clears the Clipboard and then adds text data to it. + /// + public static Task SetTextAsync(string text, CancellationToken cancellation = default) + { + Guard.AgainstNull(text, nameof(text)); + return setAsyncAction(text, cancellation); + } + + /// + /// Clears the Clipboard and then adds text data to it. + /// + public static void SetText(string text) + { + Guard.AgainstNull(text, nameof(text)); + setAction(text); + } + } +} \ No newline at end of file diff --git a/src/TextCopy/Clipboard_GetAndroid.cs b/src/TextCopy/ClipboardService_GetAndroid.cs similarity index 93% rename from src/TextCopy/Clipboard_GetAndroid.cs rename to src/TextCopy/ClipboardService_GetAndroid.cs index 9f21a758..d5a7799f 100644 --- a/src/TextCopy/Clipboard_GetAndroid.cs +++ b/src/TextCopy/ClipboardService_GetAndroid.cs @@ -6,7 +6,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func> CreateAsyncGet() { diff --git a/src/TextCopy/Clipboard_GetStandard.cs b/src/TextCopy/ClipboardService_GetStandard.cs similarity index 96% rename from src/TextCopy/Clipboard_GetStandard.cs rename to src/TextCopy/ClipboardService_GetStandard.cs index 2af67cb1..e3356e85 100644 --- a/src/TextCopy/Clipboard_GetStandard.cs +++ b/src/TextCopy/ClipboardService_GetStandard.cs @@ -6,7 +6,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func> CreateAsyncGet() { diff --git a/src/TextCopy/Clipboard_GetUap.cs b/src/TextCopy/ClipboardService_GetUap.cs similarity index 96% rename from src/TextCopy/Clipboard_GetUap.cs rename to src/TextCopy/ClipboardService_GetUap.cs index 5f3a032a..c4780cf4 100644 --- a/src/TextCopy/Clipboard_GetUap.cs +++ b/src/TextCopy/ClipboardService_GetUap.cs @@ -9,7 +9,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func> CreateAsyncGet() { diff --git a/src/TextCopy/Clipboard_GetiOS.cs b/src/TextCopy/ClipboardService_GetiOS.cs similarity index 67% rename from src/TextCopy/Clipboard_GetiOS.cs rename to src/TextCopy/ClipboardService_GetiOS.cs index 1b9acaf2..2abf66ad 100644 --- a/src/TextCopy/Clipboard_GetiOS.cs +++ b/src/TextCopy/ClipboardService_GetiOS.cs @@ -6,19 +6,19 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func> CreateAsyncGet() { - return token => Task.FromResult(GetTextiOS()); + return token => Task.FromResult(GetTextIos()); } static Func CreateGet() { - return GetTextiOS; + return GetTextIos; } - static string? GetTextiOS() + static string? GetTextIos() { return UIPasteboard.General.String; } diff --git a/src/TextCopy/Clipboard_SetAndroid.cs b/src/TextCopy/ClipboardService_SetAndroid.cs similarity index 95% rename from src/TextCopy/Clipboard_SetAndroid.cs rename to src/TextCopy/ClipboardService_SetAndroid.cs index e33df32f..422113d2 100644 --- a/src/TextCopy/Clipboard_SetAndroid.cs +++ b/src/TextCopy/ClipboardService_SetAndroid.cs @@ -6,7 +6,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func CreateAsyncSet() { diff --git a/src/TextCopy/Clipboard_SetStandard.cs b/src/TextCopy/ClipboardService_SetStandard.cs similarity index 96% rename from src/TextCopy/Clipboard_SetStandard.cs rename to src/TextCopy/ClipboardService_SetStandard.cs index 40f91618..57d93981 100644 --- a/src/TextCopy/Clipboard_SetStandard.cs +++ b/src/TextCopy/ClipboardService_SetStandard.cs @@ -6,7 +6,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func CreateAsyncSet() { diff --git a/src/TextCopy/Clipboard_SetUap.cs b/src/TextCopy/ClipboardService_SetUap.cs similarity index 95% rename from src/TextCopy/Clipboard_SetUap.cs rename to src/TextCopy/ClipboardService_SetUap.cs index a6eb144e..c044419c 100644 --- a/src/TextCopy/Clipboard_SetUap.cs +++ b/src/TextCopy/ClipboardService_SetUap.cs @@ -9,7 +9,7 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func CreateAsyncSet() { diff --git a/src/TextCopy/Clipboard_SetiOS.cs b/src/TextCopy/ClipboardService_SetiOS.cs similarity index 74% rename from src/TextCopy/Clipboard_SetiOS.cs rename to src/TextCopy/ClipboardService_SetiOS.cs index 7e98d001..1ef8e4e7 100644 --- a/src/TextCopy/Clipboard_SetiOS.cs +++ b/src/TextCopy/ClipboardService_SetiOS.cs @@ -6,23 +6,23 @@ namespace TextCopy { - public static partial class Clipboard + public static partial class ClipboardService { static Func CreateAsyncSet() { return (text, cancellation) => { - SetTextiOS(text); + SetTextIos(text); return Task.CompletedTask; }; } static Action CreateSet() { - return SetTextiOS; + return SetTextIos; } - static void SetTextiOS(string text) + static void SetTextIos(string text) { UIPasteboard.General.String = text; } diff --git a/src/TextCopy/IClipboard.cs b/src/TextCopy/IClipboard.cs new file mode 100644 index 00000000..dfd9d1e3 --- /dev/null +++ b/src/TextCopy/IClipboard.cs @@ -0,0 +1,31 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace TextCopy +{ + /// + /// Provides methods to place text on and retrieve text from the system Clipboard. + /// + public interface IClipboard + { + /// + /// Retrieves text data from the Clipboard. + /// + public Task GetTextAsync(CancellationToken cancellation = default); + + /// + /// Retrieves text data from the Clipboard. + /// + public string? GetText(); + + /// + /// Clears the Clipboard and then adds text data to it. + /// + public Task SetTextAsync(string text, CancellationToken cancellation = default); + + /// + /// Clears the Clipboard and then adds text data to it. + /// + public void SetText(string text); + } +} \ No newline at end of file diff --git a/src/UapApp/MainPage.xaml.cs b/src/UapApp/MainPage.xaml.cs index e4a0b5d8..4eabd470 100644 --- a/src/UapApp/MainPage.xaml.cs +++ b/src/UapApp/MainPage.xaml.cs @@ -14,8 +14,8 @@ public MainPage() async void OutputClipboardText() { - await TextCopy.Clipboard.SetTextAsync("AAA"); - var text = await TextCopy.Clipboard.GetTextAsync(); + await TextCopy.ClipboardService.SetTextAsync("AAA"); + var text = await TextCopy.ClipboardService.GetTextAsync(); Debug.WriteLine(text); } } diff --git a/src/UapApp/UapApp.csproj b/src/UapApp/UapApp.csproj index 1728da10..89caa73c 100644 --- a/src/UapApp/UapApp.csproj +++ b/src/UapApp/UapApp.csproj @@ -118,6 +118,9 @@ PackageReference + + ClipboardService.cs + App.xaml @@ -148,13 +151,10 @@ - - Clipboard.cs - - + Clipboard_GetUap.cs - + Clipboard_SetUap.cs diff --git a/src/iOSApp/ViewController.cs b/src/iOSApp/ViewController.cs index c60aa688..89c01b6b 100644 --- a/src/iOSApp/ViewController.cs +++ b/src/iOSApp/ViewController.cs @@ -27,8 +27,8 @@ public override void ViewDidLoad () private void Input_EditingChanged(object sender, EventArgs e) { - TextCopy.Clipboard.SetText(input.Text); - clipboardContent.Text = TextCopy.Clipboard.GetText(); + TextCopy.ClipboardService.SetText(input.Text); + clipboardContent.Text = TextCopy.ClipboardService.GetText(); } } } \ No newline at end of file