Comments (10)
Hmm, it seems we're not relying on the dictionary's own equality algorithms then...
from fluentassertions.
I took a quick look at the code and it seems that indeed the dictionary's EqualityComparer is not used.
from fluentassertions.
I'm trying to fix it myself, but it's not possible to retrieve the Comparer from an IDictionary<K,V>.
GenericDictionaryAssertions.cs line 334.
var missingKeys = expectedKeys.Except(Subject.Keys);
could become
var missingKeys = expectedKeys.Except(Subject.Keys);
var dictionarySubject = Subject as Dictionary<TKey, TValue>;
if (dictionarySubject != null)
{
missingKeys = expectedKeys.Except(Subject.Keys, dictionarySubject.Comparer);
}
But this solves only the Dictionary problem.
Stuff like ConcurrentDictionary<,> will still not work as this is a different impl of IDictionary<,>. Still trying to find a generic way to fix this.
I also notice that the sources are linked from the 3.5 to the 4.0 project, so I cannot include System.Collections.Concurrent to test for ConcurrentDictionary.
from fluentassertions.
Reflection on Subject.GetType() and check for a public property of type IEqualityComparer of TKey ?
Could work.
from fluentassertions.
GenericDictionaryAssertions.cs line 334.
var missingKeys = expectedKeys.Except(Subject.Keys);
becomes:
var missingKeys = expectedKeys.Except(Subject.Keys);
var comparerPropertyInfo = Subject.GetType().GetProperties(BindingFlags.Public)
.FirstOrDefault(p => p.PropertyType == typeof(IEqualityComparer));
if(comparerPropertyInfo != null)
{
var comparer = (IEqualityComparer)comparerPropertyInfo.GetValue(Subject, null);
missingKeys = expectedKeys.Except(Subject.Keys, comparer);
}
Do you agree?
from fluentassertions.
Still no good for ConcurrentDictionary because that one does not expose the IEqualityComparer publicly. Would need to look for private fields of that type also.
Pfiu....
from fluentassertions.
Maybe we should just rewrite that code to use the ContainsKey() method of the dictionary. That'll use whatever the dictionary uses internally.
from fluentassertions.
Ahaaa, indeed.
var missingKeys = expectedKeys.Except(Subject.Keys);
//becomes
var missingKeys = expectedKeys.Where(key => !Subject.ContainsKey(key));
This is the obvious way. What was I thinking!?!
Thanks!
from fluentassertions.
Don't worry. I'm looking at it from a large distance so my mind is not clouded by the interiors of a dictionary :-)
from fluentassertions.
Fixed by pull request #61.
from fluentassertions.
Related Issues (20)
- Add assertions on `JsonElement` HOT 3
- Incorrect line breaks handling with custom string comparer HOT 2
- ComparingEnumsByName() seems not to work as expected HOT 2
- Excluding and Including options should fail when applied on types with value semantics HOT 6
- Compare memberless records by value, others by members HOT 11
- Add support for asserting NaN values HOT 10
- Library is not compatible with .NET MAUI 8.0.6 HOT 3
- Add feature to check if an XElement or XAttribute is absent within the XDocument HOT 18
- Null reference exception when using custom comparer in equivalency options HOT 7
- [Feature]: Multi dimension arrays assertions HOT 10
- WithInnerException<T>() needs the type as a parameter HOT 2
- `Should().BeEquivalentTo` failing for identical objects HOT 3
- FluetntAssertion doesn't work correctly for records HOT 8
- Equivalency assertion option Excluding outputs "value(...<>c__DisplayClass).variableName" in some instances HOT 2
- Add string-option for ignoring newline style HOT 2
- Unexpected default equivalency behaviour with interfaces HOT 3
- ArgumentOutOfRangeException in FluentAssertions.Equivalency.Tracing.StringBuilderTraceWriter.ToString() HOT 8
- FluentAssertions: using a NullorEqual string EqualityComparer still returns a type difference error HOT 2
- [API Proposal]: Allow to assert RegEx matched groups HOT 3
- BeXmlSerializable does not respect XmlIgnoreAttribute HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fluentassertions.