From 949f0eae171baf1806b20eabf9ef82b1ceed01c2 Mon Sep 17 00:00:00 2001 From: Derek Smithson Date: Thu, 28 Nov 2019 14:41:35 -0700 Subject: [PATCH] Feature/nuget semver (#5) * Added gitversion file * Added TraceQueue test and updated nuspec * Ran code cleanup to remove unused using statements * Removing merge-message-formats field from GitVersion.yml * Updated nuget package info in knightwarecore.csproj * Added some additional unit tests --- .../Collections/CompositeCollection.cs | 8 ++- src/KnightwareCore/Collections/Grouping.cs | 5 +- .../INotifyCollectionItemChanged.cs | 6 +-- .../Collections/ListExtensions.cs | 26 +++++----- .../NotifyCollectionItemChangedEventArgs.cs | 6 +-- .../NotifyingObservableCollection.cs | 17 +++--- .../Diagnostics/TraceMessage.cs | 6 +-- src/KnightwareCore/Diagnostics/TraceQueue.cs | 8 +-- .../Diagnostics/TracingLevel.cs | 8 +-- .../DispatcherPropertyChangedBase.cs | 18 +++---- src/KnightwareCore/Drawing/BitmapHelper.cs | 11 ++-- src/KnightwareCore/Drawing/DrawingHelper.cs | 7 +-- src/KnightwareCore/GitVersion.yml | 9 ++++ .../IO/GZipStreamDecompressor.cs | 7 +-- .../IO/IGZipStreamDecompressor.cs | 8 +-- src/KnightwareCore/IO/IStreamDecompressor.cs | 8 +-- src/KnightwareCore/IO/XmlDeserializer.cs | 9 ++-- src/KnightwareCore/KnightwareCore.csproj | 10 ++++ src/KnightwareCore/KnightwareCore.nuspec | 5 +- .../Net/Sockets/DataReceivedEventArgs.cs | 4 -- .../Net/Sockets/IMulticastListener.cs | 8 +-- src/KnightwareCore/Net/Sockets/ISocket.cs | 6 +-- .../Net/Sockets/IStreamSocket.cs | 10 +--- src/KnightwareCore/Net/Sockets/IUDPSocket.cs | 3 -- src/KnightwareCore/Net/TCPSocket.cs | 14 ++--- .../Net/UDPMulticastListener.cs | 21 ++++---- src/KnightwareCore/Net/UDPSocket.cs | 18 +++---- src/KnightwareCore/Primitives/Color.cs | 6 +-- src/KnightwareCore/Primitives/Colors.cs | 8 +-- src/KnightwareCore/Primitives/Point.cs | 4 -- src/KnightwareCore/Primitives/Rectangle.cs | 8 +-- src/KnightwareCore/Primitives/Size.cs | 4 -- src/KnightwareCore/Primitives/Thickness.cs | 10 ++-- src/KnightwareCore/PropertyChangedBase.cs | 6 +-- src/KnightwareCore/Text/HexUtil.cs | 7 +-- src/KnightwareCore/Threading/Dispatcher.cs | 3 -- .../Threading/ResourcePool.Request.cs | 7 +-- .../ResourcePool.ResourcePoolEntry.cs | 2 - src/KnightwareCore/Threading/ResourcePool.cs | 9 ++-- .../Threading/Tasks/AsyncAutoResetEvent.cs | 4 +- .../Threading/Tasks/AsyncListProcessor.cs | 4 +- .../Tasks/AsyncListProcessorItemEventArgs.cs | 8 +-- .../Threading/Tasks/AsyncLock.cs | 11 ++-- .../Threading/Tasks/AsyncSemaphore.cs | 5 +- .../Threading/Tasks/AutoResetWorker.cs | 7 +-- .../Threading/Tasks/BatchProcessor.cs | 25 +++++---- .../Threading/Tasks/RequestDeferral.cs | 8 ++- .../Threading/Tasks/TaskExtensions.cs | 7 +-- src/KnightwareCore/TimedCacheWeakReference.cs | 15 +++--- .../Diagnostics/TraceQueueTests.cs | 52 +++++++++++++++++++ .../Drawing/BitmapHelperTest.cs | 39 ++++++++++++++ .../KnightwareCoreTests.csproj | 1 + src/KnightwareCoreTests/Text/HexUtilTests.cs | 47 +++++++++++++++++ .../TimedCacheWeakReferenceTests.cs | 39 ++++++++++++++ 54 files changed, 325 insertions(+), 287 deletions(-) create mode 100644 src/KnightwareCore/GitVersion.yml create mode 100644 src/KnightwareCoreTests/Diagnostics/TraceQueueTests.cs create mode 100644 src/KnightwareCoreTests/Drawing/BitmapHelperTest.cs create mode 100644 src/KnightwareCoreTests/Text/HexUtilTests.cs create mode 100644 src/KnightwareCoreTests/TimedCacheWeakReferenceTests.cs diff --git a/src/KnightwareCore/Collections/CompositeCollection.cs b/src/KnightwareCore/Collections/CompositeCollection.cs index e391ba8..650c0e9 100644 --- a/src/KnightwareCore/Collections/CompositeCollection.cs +++ b/src/KnightwareCore/Collections/CompositeCollection.cs @@ -4,8 +4,6 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Collections { @@ -18,7 +16,7 @@ public ObservableCollection Collections { get { return collections; } } - + public event NotifyCollectionChangedEventHandler CollectionChanged; protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e) @@ -59,7 +57,7 @@ void collections_CollectionChanged(object sender, NotifyCollectionChangedEventAr if (e.Action == NotifyCollectionChangedAction.Reset) { //De-register all items - while(registeredNotifyingCollections.Count > 0) + while (registeredNotifyingCollections.Count > 0) { registeredNotifyingCollections[0].CollectionChanged -= observable_CollectionChanged; registeredNotifyingCollections.RemoveAt(0); @@ -74,7 +72,7 @@ void collections_CollectionChanged(object sender, NotifyCollectionChangedEventAr if (observable != null) { observable.CollectionChanged -= observable_CollectionChanged; - if(registeredNotifyingCollections.Contains(observable)) + if (registeredNotifyingCollections.Contains(observable)) registeredNotifyingCollections.Remove(observable); } } diff --git a/src/KnightwareCore/Collections/Grouping.cs b/src/KnightwareCore/Collections/Grouping.cs index 810b3af..8118ae3 100644 --- a/src/KnightwareCore/Collections/Grouping.cs +++ b/src/KnightwareCore/Collections/Grouping.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Collections { diff --git a/src/KnightwareCore/Collections/INotifyCollectionItemChanged.cs b/src/KnightwareCore/Collections/INotifyCollectionItemChanged.cs index a3c0dfc..9c976bf 100644 --- a/src/KnightwareCore/Collections/INotifyCollectionItemChanged.cs +++ b/src/KnightwareCore/Collections/INotifyCollectionItemChanged.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using System.Text; +using System.Collections.Specialized; namespace Knightware.Collections { diff --git a/src/KnightwareCore/Collections/ListExtensions.cs b/src/KnightwareCore/Collections/ListExtensions.cs index 527ccb0..34bd118 100644 --- a/src/KnightwareCore/Collections/ListExtensions.cs +++ b/src/KnightwareCore/Collections/ListExtensions.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Collections { @@ -23,15 +21,15 @@ public static void CopyTo(this IEnumerable source, IList destinat /// Synchronizes a destination list of items from a provided source list, constrained by the type of object /// public static void ConstrainedCopyTo(this IEnumerable source, IList destination, Func getSourceKey, Func getDestKey, Func createNew, Action copyFrom, Action onRemoved = null) - where C: U + where C : U { - ConstrainedCopyTo( + ConstrainedCopyTo( source, destination, (item) => item is C, getSourceKey, (item) => getDestKey((C)item), - (item) => (U)createNew(item), + (item) => createNew(item), (from, to) => copyFrom(from, (C)to), (removed) => { @@ -42,13 +40,13 @@ public static void ConstrainedCopyTo(this IEnumerable source, ILi public static void ConstrainedCopyTo(this IDictionary source, IDictionary destination, Func destinationItemsToCompareFilter, Func createNew, Action copyFrom, Action onRemoved = null) { - if(source == null || destination == null) + if (source == null || destination == null) return; //By default, if no dest list filter is provided, all items will be compared if (destinationItemsToCompareFilter == null) destinationItemsToCompareFilter = new Func(item => true); - + //Process updates and deletes var removeList = new List>(); foreach (var item in destination) @@ -70,7 +68,7 @@ public static void ConstrainedCopyTo(this IDictionary(this IEnumerable source, IList< return; //By default, if no dest list filter is provided, all items will be compared - if(destinationItemsToCompareFilter == null) - destinationItemsToCompareFilter = new Func(item => true); + if (destinationItemsToCompareFilter == null) + destinationItemsToCompareFilter = new Func(item => true); var sourceDict = source.ToDictionary((item) => getSourceKey(item)); var destDict = destination.Where(destinationItemsToCompareFilter).ToDictionary((item) => getDestKey(item)); - + //Process updates and deletes var removeList = new Dictionary(); foreach (var destItem in destDict) @@ -120,7 +118,7 @@ public static void ConstrainedCopyTo(this IEnumerable source, IList< destDict.Remove(removeItem.Key); destination.Remove(removeItem.Value); - if(onRemoved != null) + if (onRemoved != null) onRemoved(removeItem.Value); } @@ -137,10 +135,10 @@ public static void RemoveWhere(this IDictionary source, Func keysToRemove = new List(); - foreach(var item in source) + foreach (var item in source) { if (removeIf(item.Value)) - keysToRemove.Add(item.Key); + keysToRemove.Add(item.Key); } foreach (K key in keysToRemove) diff --git a/src/KnightwareCore/Collections/NotifyCollectionItemChangedEventArgs.cs b/src/KnightwareCore/Collections/NotifyCollectionItemChangedEventArgs.cs index fe012a6..b3f63b2 100644 --- a/src/KnightwareCore/Collections/NotifyCollectionItemChangedEventArgs.cs +++ b/src/KnightwareCore/Collections/NotifyCollectionItemChangedEventArgs.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; +using System.ComponentModel; namespace Knightware.Collections { diff --git a/src/KnightwareCore/Collections/NotifyingObservableCollection.cs b/src/KnightwareCore/Collections/NotifyingObservableCollection.cs index 4fcb549..606ca6b 100644 --- a/src/KnightwareCore/Collections/NotifyingObservableCollection.cs +++ b/src/KnightwareCore/Collections/NotifyingObservableCollection.cs @@ -1,12 +1,7 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; -using System.Reflection; namespace Knightware.Collections { @@ -40,7 +35,7 @@ public NotifyingObservableCollection(IEnumerable items) foreach (T item in items) this.Add(item); } - + protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { base.OnCollectionChanged(e); @@ -71,19 +66,19 @@ void NotifyingObservableCollection_PropertyChanged(object sender, PropertyChange { OnCollectionItemChanged(new NotifyCollectionItemChangedEventArgs(sender, e.PropertyName, this.IndexOf((T)sender))); } - + private void hookPropertyChange(T item) { var propertyChangedItem = item as INotifyPropertyChanged; - if(propertyChangedItem != null) - propertyChangedItem.PropertyChanged += new PropertyChangedEventHandler(NotifyingObservableCollection_PropertyChanged); + if (propertyChangedItem != null) + propertyChangedItem.PropertyChanged += new PropertyChangedEventHandler(NotifyingObservableCollection_PropertyChanged); } private void unhookPropertyChange(T item) { var propertyChangedItem = item as INotifyPropertyChanged; if (propertyChangedItem != null) - propertyChangedItem.PropertyChanged -= new PropertyChangedEventHandler(NotifyingObservableCollection_PropertyChanged); + propertyChangedItem.PropertyChanged -= new PropertyChangedEventHandler(NotifyingObservableCollection_PropertyChanged); } } } diff --git a/src/KnightwareCore/Diagnostics/TraceMessage.cs b/src/KnightwareCore/Diagnostics/TraceMessage.cs index acb45aa..fada35d 100644 --- a/src/KnightwareCore/Diagnostics/TraceMessage.cs +++ b/src/KnightwareCore/Diagnostics/TraceMessage.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Diagnostics { @@ -20,7 +16,7 @@ public string SenderShortName { get { - if(Sender == null) + if (Sender == null) return ""; else return Sender.GetType().Name; diff --git a/src/KnightwareCore/Diagnostics/TraceQueue.cs b/src/KnightwareCore/Diagnostics/TraceQueue.cs index 73bb73c..816f4c9 100644 --- a/src/KnightwareCore/Diagnostics/TraceQueue.cs +++ b/src/KnightwareCore/Diagnostics/TraceQueue.cs @@ -1,8 +1,4 @@ using Knightware.Threading.Tasks; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Knightware.Diagnostics @@ -14,7 +10,7 @@ public static class TraceQueue { private const int maxMessageQueueCount = 100; private static readonly AsyncListProcessor messageQueue; - + /// /// Event raised when a new Trace message is generated /// @@ -83,7 +79,7 @@ public static void Trace(TraceMessage message) private static Task ProcessQueue(AsyncListProcessorItemEventArgs args) { - if(args?.Item != null) + if (args?.Item != null) { TraceMessageRaised?.Invoke(args.Item); } diff --git a/src/KnightwareCore/Diagnostics/TracingLevel.cs b/src/KnightwareCore/Diagnostics/TracingLevel.cs index 859951a..9ee85af 100644 --- a/src/KnightwareCore/Diagnostics/TracingLevel.cs +++ b/src/KnightwareCore/Diagnostics/TracingLevel.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Knightware.Diagnostics +namespace Knightware.Diagnostics { public enum TracingLevel { diff --git a/src/KnightwareCore/DispatcherPropertyChangedBase.cs b/src/KnightwareCore/DispatcherPropertyChangedBase.cs index 0f80694..0696ced 100644 --- a/src/KnightwareCore/DispatcherPropertyChangedBase.cs +++ b/src/KnightwareCore/DispatcherPropertyChangedBase.cs @@ -1,12 +1,10 @@ -using System; +using Knightware.Diagnostics; +using Knightware.Threading; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using Knightware.Diagnostics; -using Knightware.Threading; namespace Knightware { @@ -15,17 +13,17 @@ namespace Knightware /// public class DispatcherPropertyChangedBase : INotifyPropertyChanged { - private readonly List> subscribers = new List>(); + private readonly List> subscribers = new List>(); private readonly object subscribserLock = new object(); public event PropertyChangedEventHandler PropertyChanged { - add + add { - lock(subscribserLock) + lock (subscribserLock) subscribers.Add(new Tuple(value, new Dispatcher())); } - remove + remove { lock (subscribserLock) { @@ -60,7 +58,7 @@ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName subscriber.Item1(this, args); } } - catch(Exception ex) + catch (Exception ex) { TraceQueue.Trace(this, TracingLevel.Warning, "{0} occurred while raising propertyChanged: {1}", ex.GetType().Name, ex.Message); } diff --git a/src/KnightwareCore/Drawing/BitmapHelper.cs b/src/KnightwareCore/Drawing/BitmapHelper.cs index 718b57a..3f04c79 100644 --- a/src/KnightwareCore/Drawing/BitmapHelper.cs +++ b/src/KnightwareCore/Drawing/BitmapHelper.cs @@ -1,10 +1,5 @@ using Knightware.Primitives; -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Drawing { @@ -36,7 +31,7 @@ public static void GenerateSolidColorBitmap(Stream stream, Color color, int widt int fileSize = bmpHeaderSize + dibHeaderSize + (strideBytes * height); int imageStartPosition = bmpHeaderSize + dibHeaderSize; - + //Write out BMP Header stream.WriteByte((byte)'B'); stream.WriteByte((byte)'M'); @@ -60,14 +55,14 @@ public static void GenerateSolidColorBitmap(Stream stream, Color color, int widt //Write pixel data now byte[] line = new byte[strideBytes]; int index = 0; - for(int i=0 ; i /// Interface used to identify a decompression algorithm for a GZip compressed stream diff --git a/src/KnightwareCore/IO/IStreamDecompressor.cs b/src/KnightwareCore/IO/IStreamDecompressor.cs index 0ed4cee..2bc9adc 100644 --- a/src/KnightwareCore/IO/IStreamDecompressor.cs +++ b/src/KnightwareCore/IO/IStreamDecompressor.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Knightware.IO +namespace Knightware.IO { /// /// Decompresses a provided zip stream diff --git a/src/KnightwareCore/IO/XmlDeserializer.cs b/src/KnightwareCore/IO/XmlDeserializer.cs index 60a4aa1..397d5a4 100644 --- a/src/KnightwareCore/IO/XmlDeserializer.cs +++ b/src/KnightwareCore/IO/XmlDeserializer.cs @@ -1,8 +1,7 @@ -using System; +using Knightware.Diagnostics; +using System; using System.IO; using System.Xml.Linq; -using Knightware.Diagnostics; -using Knightware.Primitives; namespace Knightware.Core { @@ -59,7 +58,7 @@ public float Read(XElement parent, string elementName, float defaultValue) return float.TryParse(value, out response) ? response : ReturnDefaultValue(elementName, defaultValue); }); } - + public bool Read(XElement parent, string elementName, bool defaultValue) { return Read(parent, elementName, defaultValue, (value) => @@ -114,7 +113,7 @@ public XElement ReadElement(XElement parent, string elementName) try { - return parent.Element(elementName); + return parent.Element(elementName); } catch (Exception ex) { diff --git a/src/KnightwareCore/KnightwareCore.csproj b/src/KnightwareCore/KnightwareCore.csproj index 32d04d8..1ca4d68 100644 --- a/src/KnightwareCore/KnightwareCore.csproj +++ b/src/KnightwareCore/KnightwareCore.csproj @@ -2,6 +2,16 @@ netstandard2.0 AnyCPU;x86;x64 + Derek Smithson + Knightware + + Net Standard library providing helpful classes for threading, networking, and other primitives not available in Net Standard. + Copyright 2019 + https://github.com/dsmithson/KnightwareCore + knightware + Apache-2.0 + https://github.com/dsmithson/KnightwareCore + git diff --git a/src/KnightwareCore/KnightwareCore.nuspec b/src/KnightwareCore/KnightwareCore.nuspec index 41c0692..198b16e 100644 --- a/src/KnightwareCore/KnightwareCore.nuspec +++ b/src/KnightwareCore/KnightwareCore.nuspec @@ -1,15 +1,14 @@ - $id$ + KnightwareCore $version$ - $title$ Derek Smithson Derek Smithson http://www.apache.org/licenses/LICENSE-2.0.html https://github.com/dsmithson/KnightwareCore false - $description$ + Net Standard library providing helpful classes for threading, networking, and other primitives not available in Net Standard. Misc fixes and improvements. Copyright 2019 knightware diff --git a/src/KnightwareCore/Net/Sockets/DataReceivedEventArgs.cs b/src/KnightwareCore/Net/Sockets/DataReceivedEventArgs.cs index 0b04b60..1796a26 100644 --- a/src/KnightwareCore/Net/Sockets/DataReceivedEventArgs.cs +++ b/src/KnightwareCore/Net/Sockets/DataReceivedEventArgs.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Net.Sockets { diff --git a/src/KnightwareCore/Net/Sockets/IMulticastListener.cs b/src/KnightwareCore/Net/Sockets/IMulticastListener.cs index 1aa7f27..692d253 100644 --- a/src/KnightwareCore/Net/Sockets/IMulticastListener.cs +++ b/src/KnightwareCore/Net/Sockets/IMulticastListener.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Knightware.Net.Sockets { @@ -11,7 +7,7 @@ public interface IMulticastListener bool IsRunning { get; } string MulticastIP { get; } int MulticastPort { get; } - + event DataReceivedHandler DataReceived; Task StartupAsync(string multicastIP, int multicastPort); diff --git a/src/KnightwareCore/Net/Sockets/ISocket.cs b/src/KnightwareCore/Net/Sockets/ISocket.cs index 5879584..15b4605 100644 --- a/src/KnightwareCore/Net/Sockets/ISocket.cs +++ b/src/KnightwareCore/Net/Sockets/ISocket.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Knightware.Net.Sockets { diff --git a/src/KnightwareCore/Net/Sockets/IStreamSocket.cs b/src/KnightwareCore/Net/Sockets/IStreamSocket.cs index f5f0a13..4a694e6 100644 --- a/src/KnightwareCore/Net/Sockets/IStreamSocket.cs +++ b/src/KnightwareCore/Net/Sockets/IStreamSocket.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Knightware.Net.Sockets { @@ -13,7 +7,7 @@ public interface IStreamSocket : ISocket bool IsConnected { get; } Task ReadAsync(byte[] buffer, int offset, int length); - + Task ReadAsync(byte[] buffer, int offset, int length, int timeout); Task WriteAsync(byte[] buffer, int offset, int length); diff --git a/src/KnightwareCore/Net/Sockets/IUDPSocket.cs b/src/KnightwareCore/Net/Sockets/IUDPSocket.cs index 350b2ed..6ed47b1 100644 --- a/src/KnightwareCore/Net/Sockets/IUDPSocket.cs +++ b/src/KnightwareCore/Net/Sockets/IUDPSocket.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Knightware.Net.Sockets diff --git a/src/KnightwareCore/Net/TCPSocket.cs b/src/KnightwareCore/Net/TCPSocket.cs index f7e2be1..112833f 100644 --- a/src/KnightwareCore/Net/TCPSocket.cs +++ b/src/KnightwareCore/Net/TCPSocket.cs @@ -1,11 +1,7 @@ -using Knightware.Net.Sockets; -using Knightware.Diagnostics; +using Knightware.Diagnostics; +using Knightware.Net.Sockets; using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Net.Sockets; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -86,7 +82,7 @@ public async Task StartupAsync(string serverIP, int serverPort) stream = client.GetStream(); return true; } - catch(Exception ex) + catch (Exception ex) { TraceQueue.Trace(this, TracingLevel.Warning, "{0} occurred while starting up socket: {1}", ex.GetType().Name, ex.Message); await ShutdownAsync(); @@ -98,13 +94,13 @@ public Task ShutdownAsync() { IsRunning = false; - if(client != null) + if (client != null) { client.Dispose(); client = null; } - if(stream != null) + if (stream != null) { stream.Dispose(); stream = null; diff --git a/src/KnightwareCore/Net/UDPMulticastListener.cs b/src/KnightwareCore/Net/UDPMulticastListener.cs index c31e541..fbd75fe 100644 --- a/src/KnightwareCore/Net/UDPMulticastListener.cs +++ b/src/KnightwareCore/Net/UDPMulticastListener.cs @@ -1,12 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using Knightware.Diagnostics; +using Knightware.Net.Sockets; +using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; -using Knightware.Diagnostics; -using Knightware.Net.Sockets; namespace Knightware.Net { @@ -103,7 +100,7 @@ private bool BeginListening(SocketAsyncEventArgs args = null) } //Begin asynchronous receive - if(!socket.ReceiveFromAsync(args)) + if (!socket.ReceiveFromAsync(args)) { //Request completed and data is immediately available socket_DataReceived(socket, args); @@ -122,11 +119,11 @@ private void socket_DataReceived(object sender, SocketAsyncEventArgs e) Array.Copy(e.Buffer, 0, buffer, 0, buffer.Length); OnDataReceived(new DataReceivedEventArgs() - { - Data = buffer, - Length = e.BytesTransferred, - SenderAddress = ((IPEndPoint)e.RemoteEndPoint).Address.ToString() - }); + { + Data = buffer, + Length = e.BytesTransferred, + SenderAddress = ((IPEndPoint)e.RemoteEndPoint).Address.ToString() + }); } catch (Exception ex) { diff --git a/src/KnightwareCore/Net/UDPSocket.cs b/src/KnightwareCore/Net/UDPSocket.cs index c96e56a..69a338a 100644 --- a/src/KnightwareCore/Net/UDPSocket.cs +++ b/src/KnightwareCore/Net/UDPSocket.cs @@ -1,12 +1,10 @@ -using System; +using Knightware.Diagnostics; +using Knightware.Net.Sockets; +using System; using System.Collections.Generic; -using System.Linq; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; -using Knightware.Diagnostics; -using Knightware.Net.Sockets; namespace Knightware.Net { @@ -37,7 +35,7 @@ public int ServerPort public event DataReceivedHandler DataReceived; protected void OnDataReceived(DataReceivedEventArgs e) { - if(DataReceived != null) + if (DataReceived != null) DataReceived(this, e); } @@ -57,16 +55,16 @@ public async Task StartupAsync(string serverIP, int serverPort) await ShutdownAsync(); return false; } - + messageReceiptAwaiters = new Stack>(); - + socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(new IPEndPoint(IPAddress.Any, 0)); if (server.Equals(IPAddress.Broadcast)) { socket.EnableBroadcast = true; } - + if (!BeginReceive()) { await ShutdownAsync(); @@ -110,7 +108,7 @@ private bool BeginReceive(SocketAsyncEventArgs args = null) } catch (Exception ex) { - if(!IsRunning) + if (!IsRunning) TraceQueue.Trace(this, TracingLevel.Warning, "{0} ocurred while trying to begin receiving data: {1}", ex.GetType().Name, ex.Message); return false; diff --git a/src/KnightwareCore/Primitives/Color.cs b/src/KnightwareCore/Primitives/Color.cs index 2a7cc5f..a250b66 100644 --- a/src/KnightwareCore/Primitives/Color.cs +++ b/src/KnightwareCore/Primitives/Color.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Primitives { @@ -128,7 +124,7 @@ public static Color FromHexString(string hexString) } byte a = 0xff; - if(hexString.Length - index == 8) + if (hexString.Length - index == 8) { a = byte.Parse(hexString.Substring(index, 2), NumberStyles.HexNumber); index += 2; diff --git a/src/KnightwareCore/Primitives/Colors.cs b/src/KnightwareCore/Primitives/Colors.cs index 47063c8..4222b63 100644 --- a/src/KnightwareCore/Primitives/Colors.cs +++ b/src/KnightwareCore/Primitives/Colors.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Knightware.Primitives +namespace Knightware.Primitives { public static class Colors { diff --git a/src/KnightwareCore/Primitives/Point.cs b/src/KnightwareCore/Primitives/Point.cs index 04432cb..8f344f4 100644 --- a/src/KnightwareCore/Primitives/Point.cs +++ b/src/KnightwareCore/Primitives/Point.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Primitives { diff --git a/src/KnightwareCore/Primitives/Rectangle.cs b/src/KnightwareCore/Primitives/Rectangle.cs index f01c6ed..3c40aad 100644 --- a/src/KnightwareCore/Primitives/Rectangle.cs +++ b/src/KnightwareCore/Primitives/Rectangle.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Primitives { @@ -50,7 +46,7 @@ public bool IsEmpty return false; } } - + public Rectangle(int x, int y, int width, int height) : this() { this.X = x; @@ -101,7 +97,7 @@ public bool Contains(Rectangle rect) else return false; } - + public static Rectangle Offset(Rectangle rect, Point offset) { Rectangle response = new Rectangle(rect); diff --git a/src/KnightwareCore/Primitives/Size.cs b/src/KnightwareCore/Primitives/Size.cs index c0a46d3..8ce7685 100644 --- a/src/KnightwareCore/Primitives/Size.cs +++ b/src/KnightwareCore/Primitives/Size.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Primitives { diff --git a/src/KnightwareCore/Primitives/Thickness.cs b/src/KnightwareCore/Primitives/Thickness.cs index 7373dc6..bfe9d99 100644 --- a/src/KnightwareCore/Primitives/Thickness.cs +++ b/src/KnightwareCore/Primitives/Thickness.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Knightware.Primitives { @@ -35,9 +31,9 @@ public Thickness(double left, double top, double right, double bottom) : this() public bool Equals(Thickness other) { - if (this.Left == other.Left && - this.Right == other.Right && - this.Top == other.Top && + if (this.Left == other.Left && + this.Right == other.Right && + this.Top == other.Top && this.Bottom == other.Bottom) return true; else diff --git a/src/KnightwareCore/PropertyChangedBase.cs b/src/KnightwareCore/PropertyChangedBase.cs index baee630..32bcf90 100644 --- a/src/KnightwareCore/PropertyChangedBase.cs +++ b/src/KnightwareCore/PropertyChangedBase.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; +using System.ComponentModel; using System.Runtime.CompilerServices; -using System.Text; namespace Knightware { diff --git a/src/KnightwareCore/Text/HexUtil.cs b/src/KnightwareCore/Text/HexUtil.cs index 7ad1ca2..166d494 100644 --- a/src/KnightwareCore/Text/HexUtil.cs +++ b/src/KnightwareCore/Text/HexUtil.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Knightware.Text { @@ -20,12 +17,12 @@ public static byte[] GetBytes(string hexString) if (!IsValidHexCharLength(hexString)) throw new ArgumentException("Character count for hex string must be divisible by 2 to be valid", "hexString"); - + byte[] response = new byte[hexString.Length / 2]; int index = 0; int parseIndex = 0; - while(parseIndex < hexString.Length) + while (parseIndex < hexString.Length) { string subString = hexString.Substring(parseIndex, 2); response[index++] = byte.Parse(subString, System.Globalization.NumberStyles.HexNumber); diff --git a/src/KnightwareCore/Threading/Dispatcher.cs b/src/KnightwareCore/Threading/Dispatcher.cs index 6c685f0..23807ac 100644 --- a/src/KnightwareCore/Threading/Dispatcher.cs +++ b/src/KnightwareCore/Threading/Dispatcher.cs @@ -1,8 +1,5 @@ using Knightware.Diagnostics; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; diff --git a/src/KnightwareCore/Threading/ResourcePool.Request.cs b/src/KnightwareCore/Threading/ResourcePool.Request.cs index 54a77e7..1bc8827 100644 --- a/src/KnightwareCore/Threading/ResourcePool.Request.cs +++ b/src/KnightwareCore/Threading/ResourcePool.Request.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Knightware.Threading { @@ -12,7 +9,7 @@ public class Request public TaskCompletionSource Tcs { get; } = new TaskCompletionSource(); public string SerializationKey { get; private set; } - public Task Task { get { return Tcs.Task; } } + public Task Task { get { return Tcs.Task; } } public Request(string serializationKey = null) { diff --git a/src/KnightwareCore/Threading/ResourcePool.ResourcePoolEntry.cs b/src/KnightwareCore/Threading/ResourcePool.ResourcePoolEntry.cs index b478d74..b4ff66b 100644 --- a/src/KnightwareCore/Threading/ResourcePool.ResourcePoolEntry.cs +++ b/src/KnightwareCore/Threading/ResourcePool.ResourcePoolEntry.cs @@ -1,7 +1,5 @@ using Knightware.Threading.Tasks; using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace Knightware.Threading diff --git a/src/KnightwareCore/Threading/ResourcePool.cs b/src/KnightwareCore/Threading/ResourcePool.cs index c8ede5b..3037168 100644 --- a/src/KnightwareCore/Threading/ResourcePool.cs +++ b/src/KnightwareCore/Threading/ResourcePool.cs @@ -1,9 +1,8 @@ -using System; +using Knightware.Threading.Tasks; +using System; using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; using System.Linq; -using Knightware.Threading.Tasks; +using System.Threading.Tasks; namespace Knightware.Threading { @@ -272,7 +271,7 @@ private async Task connectionPoolMonitor_DoWork(object state) } //Check to see if we need to remove pending requests - if (!newConnectionsAdded + if (!newConnectionsAdded && requestQueue.Count == 0 && now.Subtract(lastResourceClosedCheck) > ResourceDeallocationInterval && resourcePool.Count > MinimumConnections) { diff --git a/src/KnightwareCore/Threading/Tasks/AsyncAutoResetEvent.cs b/src/KnightwareCore/Threading/Tasks/AsyncAutoResetEvent.cs index 9bcf060..e7f784c 100644 --- a/src/KnightwareCore/Threading/Tasks/AsyncAutoResetEvent.cs +++ b/src/KnightwareCore/Threading/Tasks/AsyncAutoResetEvent.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -11,7 +9,7 @@ public class AsyncAutoResetEvent { private readonly static Task completed = Task.FromResult(true); private readonly List waits = new List(); - private bool signaled; + private bool signaled; public Task WaitAsync() { diff --git a/src/KnightwareCore/Threading/Tasks/AsyncListProcessor.cs b/src/KnightwareCore/Threading/Tasks/AsyncListProcessor.cs index 8a420b9..4c4f2e7 100644 --- a/src/KnightwareCore/Threading/Tasks/AsyncListProcessor.cs +++ b/src/KnightwareCore/Threading/Tasks/AsyncListProcessor.cs @@ -1,8 +1,6 @@ using Knightware.Diagnostics; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; @@ -45,7 +43,7 @@ public async Task StartupAsync() IsRunning = true; this.cancellationTokenSource = new CancellationTokenSource(); - + var workerBlockOptions = new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = MaxDegreeOfParallelism, diff --git a/src/KnightwareCore/Threading/Tasks/AsyncListProcessorItemEventArgs.cs b/src/KnightwareCore/Threading/Tasks/AsyncListProcessorItemEventArgs.cs index 17b6aae..ea424bb 100644 --- a/src/KnightwareCore/Threading/Tasks/AsyncListProcessorItemEventArgs.cs +++ b/src/KnightwareCore/Threading/Tasks/AsyncListProcessorItemEventArgs.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Knightware.Threading.Tasks +namespace Knightware.Threading.Tasks { public class AsyncListProcessorItemEventArgs { diff --git a/src/KnightwareCore/Threading/Tasks/AsyncLock.cs b/src/KnightwareCore/Threading/Tasks/AsyncLock.cs index e5c8e40..11b29ad 100644 --- a/src/KnightwareCore/Threading/Tasks/AsyncLock.cs +++ b/src/KnightwareCore/Threading/Tasks/AsyncLock.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -27,10 +24,10 @@ public Task LockAsync() } else { - return wait.ContinueWith((_, state) => new Releaser((AsyncLock)state), - this, - CancellationToken.None, - TaskContinuationOptions.ExecuteSynchronously, + return wait.ContinueWith((_, state) => new Releaser((AsyncLock)state), + this, + CancellationToken.None, + TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } } diff --git a/src/KnightwareCore/Threading/Tasks/AsyncSemaphore.cs b/src/KnightwareCore/Threading/Tasks/AsyncSemaphore.cs index e93900c..ffb9ca0 100644 --- a/src/KnightwareCore/Threading/Tasks/AsyncSemaphore.cs +++ b/src/KnightwareCore/Threading/Tasks/AsyncSemaphore.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; using System.Threading.Tasks; namespace Knightware.Threading.Tasks diff --git a/src/KnightwareCore/Threading/Tasks/AutoResetWorker.cs b/src/KnightwareCore/Threading/Tasks/AutoResetWorker.cs index 4518ad8..4cbbcf9 100644 --- a/src/KnightwareCore/Threading/Tasks/AutoResetWorker.cs +++ b/src/KnightwareCore/Threading/Tasks/AutoResetWorker.cs @@ -1,8 +1,5 @@ using Knightware.Diagnostics; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -18,7 +15,7 @@ public class AutoResetWorker private object workerState; public bool IsRunning { get; private set; } - + /// /// When set, will automatically trigger the update method at a defined interval if not triggered manually. Set to Timeout.InfiniteTimeSpan to disable. /// @@ -96,7 +93,7 @@ public void Set() { if (IsRunning) { - if(asyncResetEvent != null) + if (asyncResetEvent != null) asyncResetEvent.Set(); } } diff --git a/src/KnightwareCore/Threading/Tasks/BatchProcessor.cs b/src/KnightwareCore/Threading/Tasks/BatchProcessor.cs index cd6b38a..17f9dca 100644 --- a/src/KnightwareCore/Threading/Tasks/BatchProcessor.cs +++ b/src/KnightwareCore/Threading/Tasks/BatchProcessor.cs @@ -2,11 +2,10 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Diagnostics; +using System.Linq; using System.Threading; +using System.Threading.Tasks; namespace Knightware.Threading.Tasks { @@ -68,18 +67,18 @@ public async Task StartupAsync(BatchHandler batchHand { await ShutdownAsync(); - if(minimumTimeInterval > maximumTimeInterval) + if (minimumTimeInterval > maximumTimeInterval) throw new ArgumentException("Maximum time interval cannot be less than the minimum time interval"); - if(minimumTimeInterval <= TimeSpan.Zero) + if (minimumTimeInterval <= TimeSpan.Zero) throw new ArgumentException("Minimum time interval must be greater than zero"); - + this.userBatchProcessorHandler = batchHandler; this.MinimumTimeInterval = minimumTimeInterval; this.MaximumTimeInterval = maximumTimeInterval; this.MaximumCount = maximumCount; IsRunning = true; - + batchProcessor = new AsyncListProcessor>(batchProcessor_DoWork, () => IsRunning); if (!await batchProcessor.StartupAsync()) { @@ -90,7 +89,7 @@ public async Task StartupAsync(BatchHandler batchHand return true; } - + /// /// Shutdown the current batch processor /// @@ -127,14 +126,14 @@ public async Task ShutdownAsync(int maxWait = -1) /// A Task of TResponse which will be completed when the item has been processed public async Task EnqueueAsync(TRequest request, bool processImmediate = false) { - if(request == null) + if (request == null) return default(TResponse); var newItem = new InternalBatchProcessorItem(request); using (var releaser = await queueLock.LockAsync().ConfigureAwait(false)) { - if(queue == null) + if (queue == null) queue = new List(); queue.Add(newItem); @@ -156,7 +155,7 @@ public async Task EnqueueAsync(TRequest request, bool processImmediat batchTimer = new Timer((state) => { Task t = OnTimerElapsed(state); - }, + }, null, this.MinimumTimeInterval, this.MinimumTimeInterval); } } @@ -234,7 +233,7 @@ private async Task batchProcessor_DoWork(AsyncListProcessorItemEventArgs /// Contains a request item to be processed by a batch processor handler /// diff --git a/src/KnightwareCore/Threading/Tasks/RequestDeferral.cs b/src/KnightwareCore/Threading/Tasks/RequestDeferral.cs index 8af4586..2ba7981 100644 --- a/src/KnightwareCore/Threading/Tasks/RequestDeferral.cs +++ b/src/KnightwareCore/Threading/Tasks/RequestDeferral.cs @@ -1,7 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Knightware.Threading.Tasks @@ -25,10 +23,10 @@ public Task WaitForCompletedAsync() public static async Task WaitForAllCompletedAsync(IEnumerable requests) { - if(requests != null) + if (requests != null) { var tasks = requests.Select(r => r.tcs.Task).ToList(); - if(tasks.Count > 0) + if (tasks.Count > 0) { await Task.WhenAll(tasks); } diff --git a/src/KnightwareCore/Threading/Tasks/TaskExtensions.cs b/src/KnightwareCore/Threading/Tasks/TaskExtensions.cs index bfc8af5..8af9c0d 100644 --- a/src/KnightwareCore/Threading/Tasks/TaskExtensions.cs +++ b/src/KnightwareCore/Threading/Tasks/TaskExtensions.cs @@ -1,14 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using System.Threading.Tasks; namespace Knightware.Threading.Tasks { public static class TaskExtensions { - public static async Task AllSuccess( params Task[] tasks) + public static async Task AllSuccess(params Task[] tasks) { if (tasks == null || tasks.Length == 0) return false; diff --git a/src/KnightwareCore/TimedCacheWeakReference.cs b/src/KnightwareCore/TimedCacheWeakReference.cs index e025c5d..d9d45aa 100644 --- a/src/KnightwareCore/TimedCacheWeakReference.cs +++ b/src/KnightwareCore/TimedCacheWeakReference.cs @@ -1,14 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading; -using System.Threading.Tasks; -using Knightware.Threading; namespace Knightware { - public class TimedCacheWeakReference where T: class + public class TimedCacheWeakReference where T : class { #region Static Cache Expiration Monitor @@ -100,13 +97,19 @@ private class CacheExpirationRecord private WeakReference weakReference; private T strongReference; + /// + /// Amount of time to preserve a strong reference to the wrapped object, before allowing it to be reclaimed by GC + /// public TimeSpan CacheDuration { get; set; } + /// + /// Determines if this WeakReference wrapper currently has a live reference to it's wrapped object + /// public bool StrongReferenceAvailable { get { return strongReference != null; } } - + /// /// Initializes a new instance of the TimedCacheWeakReference<T> class that references the specified object /// @@ -115,7 +118,7 @@ public TimedCacheWeakReference(T target, TimeSpan cacheDuration) { this.CacheDuration = cacheDuration; - if(target != null) + if (target != null) SetTarget(target); } diff --git a/src/KnightwareCoreTests/Diagnostics/TraceQueueTests.cs b/src/KnightwareCoreTests/Diagnostics/TraceQueueTests.cs new file mode 100644 index 0000000..7969741 --- /dev/null +++ b/src/KnightwareCoreTests/Diagnostics/TraceQueueTests.cs @@ -0,0 +1,52 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Knightware.Diagnostics +{ + [TestClass] + public class TraceQueueTests + { + [TestMethod] + public void SetTracingLevelTest() + { + //Register for event notification + TracingLevel eventLevel = TracingLevel.Error; + bool eventFired = false; + TraceQueue.TracingLevelChanged += (newLevel) => + { + eventFired = true; + eventLevel = newLevel; + }; + + //Change our way through tracing levels + foreach (TracingLevel level in Enum.GetValues(typeof(TracingLevel))) + { + eventFired = false; + TraceQueue.TracingLevel = level; + Assert.AreEqual(level, TraceQueue.TracingLevel, "Level was not set correctly"); + Assert.IsTrue(eventFired, "TracingLevelChanged event did not fire"); + Assert.AreEqual(level, eventLevel, "TracingLevelChanged event fired, but with incorrect value"); + } + } + + [TestMethod] + public async Task TraceMessageTest() + { + var expectedLevel = TraceQueue.TracingLevel; + string expectedMessage = "My Test trace"; + + var tcs = new TaskCompletionSource(); + TraceQueue.TraceMessageRaised += (msg) => tcs.TrySetResult(msg); + + //Send a message + TraceQueue.Trace(expectedLevel, expectedMessage); + var actual = await tcs.Task; + Assert.IsNotNull(actual, "Failed to receive trace notification"); + Assert.AreEqual(expectedLevel, actual.Level, "Level was incorrect"); + Assert.AreEqual(expectedMessage, actual.Message, "Message was incorrect"); + } + } +} diff --git a/src/KnightwareCoreTests/Drawing/BitmapHelperTest.cs b/src/KnightwareCoreTests/Drawing/BitmapHelperTest.cs new file mode 100644 index 0000000..83d8181 --- /dev/null +++ b/src/KnightwareCoreTests/Drawing/BitmapHelperTest.cs @@ -0,0 +1,39 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; + + +namespace Knightware.Drawing +{ + [TestClass] + public class BitmapHelperTest + { + [TestMethod] + public void DrawSolidBitmapTest() + { + const byte a = 227; + const byte r = 25; + const byte g = 88; + const byte b = 127; + const int width = 808; + const int height = 402; + + using (var stream = BitmapHelper.GenerateSolidColorBitmap(Primitives.Color.FromArgb(a, r, g, b), width, height)) + { + stream.Seek(0, SeekOrigin.Begin); + + //Use System.Drawing bitmap to confirm + using (var bitmap = Bitmap.FromStream(stream)) + { + Assert.AreEqual(width, bitmap.Width, "Width was incorrect"); + Assert.AreEqual(height, bitmap.Height, "Height was incorrect"); + + //TODO: Test all the pixels for the correct color + } + } + } + } +} diff --git a/src/KnightwareCoreTests/KnightwareCoreTests.csproj b/src/KnightwareCoreTests/KnightwareCoreTests.csproj index e1c884a..4236d58 100644 --- a/src/KnightwareCoreTests/KnightwareCoreTests.csproj +++ b/src/KnightwareCoreTests/KnightwareCoreTests.csproj @@ -12,6 +12,7 @@ + diff --git a/src/KnightwareCoreTests/Text/HexUtilTests.cs b/src/KnightwareCoreTests/Text/HexUtilTests.cs new file mode 100644 index 0000000..a47711c --- /dev/null +++ b/src/KnightwareCoreTests/Text/HexUtilTests.cs @@ -0,0 +1,47 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Knightware.Text +{ + [TestClass] + public class HexUtilTests + { + [TestMethod] + public void ToStringFromStringTest() + { + string expected = "33343536373839404142434445464748"; + if (!HexUtil.IsValidHexCharLength(expected)) + expected += "A"; + + byte[] bytes = HexUtil.GetBytes(expected); + string actual = HexUtil.GetString(bytes); + + Assert.AreEqual(expected, actual, "Failed to convert string to and from byte array"); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentException))] + public void ToBytesFromInvalidStringTest() + { + //Ensure we start with an invalid test string + string testString = "AAA"; + if (HexUtil.IsValidHexCharLength(testString)) + Assert.Inconclusive("Failed to start with a known bad test string"); + + //Expect an exception here since we have an invalid length + HexUtil.GetBytes(testString); + } + + [TestMethod] + public void IsValidHexLength() + { + string invalid = "A"; + Assert.IsFalse(HexUtil.IsValidHexCharLength(invalid), "Should have returned false"); + + string valid = "AA"; + Assert.IsTrue(HexUtil.IsValidHexCharLength(valid), "Should have returned true"); + } + } +} diff --git a/src/KnightwareCoreTests/TimedCacheWeakReferenceTests.cs b/src/KnightwareCoreTests/TimedCacheWeakReferenceTests.cs new file mode 100644 index 0000000..1521d84 --- /dev/null +++ b/src/KnightwareCoreTests/TimedCacheWeakReferenceTests.cs @@ -0,0 +1,39 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Knightware +{ + [TestClass] + public class TimedCacheWeakReferenceTests + { + public class TestObject + { + public string Name { get; set; } + } + + [TestMethod] + public async Task CacheExpirationTimeTest() + { + const int cacheSeconds = 2; + + var testObject = new TestObject() { Name = "My Test" }; + var weakReference = new TimedCacheWeakReference(testObject, TimeSpan.FromSeconds(cacheSeconds)); + Assert.IsTrue(weakReference.StrongReferenceAvailable, "No strong reference available"); + + //Drop my strong refrence, and perform a GC + testObject = null; + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + + //We are well within our cache time, so we should still have a reference + Assert.IsTrue(weakReference.StrongReferenceAvailable, "Lost reference before cache timeout expired"); + + //Now wait past our cache second time, then do a GC and verify we've lost the reference + await Task.Delay(TimeSpan.FromSeconds(cacheSeconds + 1)); + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + Assert.IsFalse(weakReference.StrongReferenceAvailable, "Strong reference is still available after cache expiration"); + } + } +}