Code Monkey home page Code Monkey logo

Comments (10)

dennisdoomen avatar dennisdoomen commented on May 20, 2024

Hmm, it seems we're not relying on the dictionary's own equality algorithms then...

from fluentassertions.

voicu-matei avatar voicu-matei commented on May 20, 2024

I took a quick look at the code and it seems that indeed the dictionary's EqualityComparer is not used.

from fluentassertions.

voicu-matei avatar voicu-matei commented on May 20, 2024

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.

voicu-matei avatar voicu-matei commented on May 20, 2024

Reflection on Subject.GetType() and check for a public property of type IEqualityComparer of TKey ?
Could work.

from fluentassertions.

voicu-matei avatar voicu-matei commented on May 20, 2024

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.

voicu-matei avatar voicu-matei commented on May 20, 2024

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.

dennisdoomen avatar dennisdoomen commented on May 20, 2024

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.

voicu-matei avatar voicu-matei commented on May 20, 2024

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.

dennisdoomen avatar dennisdoomen commented on May 20, 2024

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.

dennisdoomen avatar dennisdoomen commented on May 20, 2024

Fixed by pull request #61.

from fluentassertions.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.