Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve value retriever/comparer registration #1260

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
86 changes: 16 additions & 70 deletions TechTalk.SpecFlow/Assist/Service.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
using System;
using System.Collections.Generic;
using TechTalk.SpecFlow.Assist.ValueComparers;
using TechTalk.SpecFlow.Assist.ValueRetrievers;

namespace TechTalk.SpecFlow.Assist
{
public class Service
{

private List<IValueComparer> _registeredValueComparers;
private List<IValueRetriever> _registeredValueRetrievers;

public IEnumerable<IValueComparer> ValueComparers => _registeredValueComparers;
public IEnumerable<IValueRetriever> ValueRetrievers => _registeredValueRetrievers;
public ServiceComponentList<IValueComparer> ValueComparers { get; private set; }
public ServiceComponentList<IValueRetriever> ValueRetrievers { get; private set; }

public static Service Instance { get; internal set; }

Expand All @@ -28,92 +22,44 @@ public Service()

public void RestoreDefaults()
{
_registeredValueComparers = new List<IValueComparer>();
_registeredValueRetrievers = new List<IValueRetriever>();
RegisterSpecFlowDefaults();
ValueComparers = new SpecFlowDefaultValueComparerList();
ValueRetrievers = new SpecFlowDefaultValueRetrieverList();
}

[Obsolete("Use ValueComparers.Register")]
public void RegisterValueComparer(IValueComparer valueComparer)
{
_registeredValueComparers.Insert(0, valueComparer);
ValueComparers.Register(valueComparer);
}

[Obsolete("Use ValueComparers.RegisterDefault")]
public void RegisterDefaultValueComparer(IValueComparer valueComparer)
{
_registeredValueComparers.Add(valueComparer);
ValueComparers.RegisterDefault(valueComparer);
}

[Obsolete("Use ValueComparers.Unregister")]
public void UnregisterValueComparer(IValueComparer valueComparer)
{
_registeredValueComparers.Remove(valueComparer);
ValueComparers.Unregister(valueComparer);
}

[Obsolete("Use ValueRetrievers.Register")]
public void RegisterValueRetriever(IValueRetriever valueRetriever)
{
_registeredValueRetrievers.Add(valueRetriever);
ValueRetrievers.Register(valueRetriever);
}

[Obsolete("Use ValueRetrievers.Unregister")]
public void UnregisterValueRetriever(IValueRetriever valueRetriever)
{
_registeredValueRetrievers.Remove(valueRetriever);
}

public void RegisterSpecFlowDefaults()
{
RegisterValueComparer(new DateTimeValueComparer());
RegisterValueComparer(new BoolValueComparer());
RegisterValueComparer(new GuidValueComparer(new GuidValueRetriever()));
RegisterValueComparer(new DecimalValueComparer());
RegisterValueComparer(new DoubleValueComparer());
RegisterValueComparer(new FloatValueComparer());
RegisterDefaultValueComparer(new DefaultValueComparer());

RegisterValueRetriever(new StringValueRetriever());
RegisterValueRetriever(new ByteValueRetriever());
RegisterValueRetriever(new SByteValueRetriever());
RegisterValueRetriever(new IntValueRetriever());
RegisterValueRetriever(new UIntValueRetriever());
RegisterValueRetriever(new ShortValueRetriever());
RegisterValueRetriever(new UShortValueRetriever());
RegisterValueRetriever(new LongValueRetriever());
RegisterValueRetriever(new ULongValueRetriever());
RegisterValueRetriever(new FloatValueRetriever());
RegisterValueRetriever(new DoubleValueRetriever());
RegisterValueRetriever(new DecimalValueRetriever());
RegisterValueRetriever(new CharValueRetriever());
RegisterValueRetriever(new BoolValueRetriever());
RegisterValueRetriever(new DateTimeValueRetriever());
RegisterValueRetriever(new GuidValueRetriever());
RegisterValueRetriever(new EnumValueRetriever());
RegisterValueRetriever(new TimeSpanValueRetriever());
RegisterValueRetriever(new DateTimeOffsetValueRetriever());
RegisterValueRetriever(new NullableGuidValueRetriever());
RegisterValueRetriever(new NullableDateTimeValueRetriever());
RegisterValueRetriever(new NullableBoolValueRetriever());
RegisterValueRetriever(new NullableCharValueRetriever());
RegisterValueRetriever(new NullableDecimalValueRetriever());
RegisterValueRetriever(new NullableDoubleValueRetriever());
RegisterValueRetriever(new NullableFloatValueRetriever());
RegisterValueRetriever(new NullableULongValueRetriever());
RegisterValueRetriever(new NullableByteValueRetriever());
RegisterValueRetriever(new NullableSByteValueRetriever());
RegisterValueRetriever(new NullableIntValueRetriever());
RegisterValueRetriever(new NullableUIntValueRetriever());
RegisterValueRetriever(new NullableShortValueRetriever());
RegisterValueRetriever(new NullableUShortValueRetriever());
RegisterValueRetriever(new NullableLongValueRetriever());
RegisterValueRetriever(new NullableTimeSpanValueRetriever());
RegisterValueRetriever(new NullableDateTimeOffsetValueRetriever());

RegisterValueRetriever(new StringArrayValueRetriever());
RegisterValueRetriever(new StringListValueRetriever());
RegisterValueRetriever(new EnumArrayValueRetriever());
RegisterValueRetriever(new EnumListValueRetriever());
ValueRetrievers.Unregister(valueRetriever);
}

public IValueRetriever GetValueRetrieverFor(TableRow row, Type targetType, Type propertyType)
{
foreach(var valueRetriever in ValueRetrievers){
foreach (var valueRetriever in ValueRetrievers)
{
if (valueRetriever.CanRetrieve(new KeyValuePair<string, string>(row[0], row[1]), targetType, propertyType))
return valueRetriever;
}
Expand Down
57 changes: 57 additions & 0 deletions TechTalk.SpecFlow/Assist/ServiceComponentList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace TechTalk.SpecFlow.Assist
{
public class ServiceComponentList<T> : IEnumerable<T>
{
private readonly List<T> components;

IEnumerator<T> IEnumerable<T>.GetEnumerator() => components.GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)components).GetEnumerator();

public ServiceComponentList()
{
components = new List<T>();
}

public void Register(T component)
{
components.Insert(0, component);
}

public void Register<TImpl>() where TImpl : T, new()
{
Register(new TImpl());
}

public void RegisterDefault(T component)
{
components.Add(component);
}

public void Unregister(T component)
{
components.Remove(component);
}

public void Unregister<TImpl>() where TImpl : T
{
components.OfType<TImpl>().ToList().ForEach(component => components.Remove(component));
}

public void Replace(T old, T @new)
{
Unregister(old);
Register(@new);
}

public void Replace<TOld, TNew>() where TOld : T where TNew : T, new()
{
Unregister<TOld>();
Register<TNew>();
}
}
}
19 changes: 19 additions & 0 deletions TechTalk.SpecFlow/Assist/SpecFlowDefaultValueComparerList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using TechTalk.SpecFlow.Assist.ValueComparers;
using TechTalk.SpecFlow.Assist.ValueRetrievers;

namespace TechTalk.SpecFlow.Assist
{
public class SpecFlowDefaultValueComparerList : ServiceComponentList<IValueComparer>
{
public SpecFlowDefaultValueComparerList()
{
Register(new DateTimeValueComparer());
SabotageAndi marked this conversation as resolved.
Show resolved Hide resolved
Register(new BoolValueComparer());
Register(new GuidValueComparer(new GuidValueRetriever()));
Register(new DecimalValueComparer());
Register(new DoubleValueComparer());
Register(new FloatValueComparer());
RegisterDefault(new DefaultValueComparer());
}
}
}
52 changes: 52 additions & 0 deletions TechTalk.SpecFlow/Assist/SpecFlowDefaultValueRetrieverList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using TechTalk.SpecFlow.Assist.ValueRetrievers;

namespace TechTalk.SpecFlow.Assist
{
internal class SpecFlowDefaultValueRetrieverList : ServiceComponentList<IValueRetriever>
{
public SpecFlowDefaultValueRetrieverList()
{
Register(new StringValueRetriever());
SabotageAndi marked this conversation as resolved.
Show resolved Hide resolved
Register(new ByteValueRetriever());
Register(new SByteValueRetriever());
Register(new IntValueRetriever());
Register(new UIntValueRetriever());
Register(new ShortValueRetriever());
Register(new UShortValueRetriever());
Register(new LongValueRetriever());
Register(new ULongValueRetriever());
Register(new FloatValueRetriever());
Register(new DoubleValueRetriever());
Register(new DecimalValueRetriever());
Register(new CharValueRetriever());
Register(new BoolValueRetriever());
Register(new DateTimeValueRetriever());
Register(new GuidValueRetriever());
Register(new EnumValueRetriever());
Register(new TimeSpanValueRetriever());
Register(new DateTimeOffsetValueRetriever());
Register(new NullableGuidValueRetriever());
Register(new NullableDateTimeValueRetriever());
Register(new NullableBoolValueRetriever());
Register(new NullableCharValueRetriever());
Register(new NullableDecimalValueRetriever());
Register(new NullableDoubleValueRetriever());
Register(new NullableFloatValueRetriever());
Register(new NullableULongValueRetriever());
Register(new NullableByteValueRetriever());
Register(new NullableSByteValueRetriever());
Register(new NullableIntValueRetriever());
Register(new NullableUIntValueRetriever());
Register(new NullableShortValueRetriever());
Register(new NullableUShortValueRetriever());
Register(new NullableLongValueRetriever());
Register(new NullableTimeSpanValueRetriever());
Register(new NullableDateTimeOffsetValueRetriever());

Register(new StringArrayValueRetriever());
Register(new StringListValueRetriever());
Register(new EnumArrayValueRetriever());
Register(new EnumListValueRetriever());
}
}
}
3 changes: 3 additions & 0 deletions TechTalk.SpecFlow/TechTalk.SpecFlow.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,11 @@
<Compile Include="Assist\FindInSetExtensionMethods.cs" />
<Compile Include="Assist\FormattingTableDiffExceptionBuilder.cs" />
<Compile Include="Assist\SafetyTableDiffExceptionBuilder.cs" />
<Compile Include="Assist\ServiceComponentList.cs" />
<Compile Include="Assist\SetComparer.cs" />
<Compile Include="Assist\Attributes\TableAliasesAttribute.cs" />
<Compile Include="Assist\SpecFlowDefaultValueComparerList.cs" />
<Compile Include="Assist\SpecFlowDefaultValueRetrieverList.cs" />
<Compile Include="Assist\TableDifferenceItem.cs" />
<Compile Include="Assist\TableDifferenceResults.cs" />
<Compile Include="Assist\TableDiffExceptionBuilder.cs" />
Expand Down