Git Product home page Git Product logo

Comments (5)

sergey-tihon avatar sergey-tihon commented on June 6, 2024 1

FsUnit is an assertion library that supports DSL on top of popular unit testing frameworks. I think that equality should be provided by the type (e.g. Person).

Option1: If you need equality for C# types (and cannot define them in F# ☺️) you may search for C# source generator library that will generate proper equality for your types.

Option2: Reference library like DeepEqual and tiny F# layer on top for assertions

from fsunit.

CaptnCodr avatar CaptnCodr commented on June 6, 2024

Hello @AlexeyRaga,
FsUnit does support for structural equality. You can use records and classes that support comparison.
Here's the implementation: https://github.com/fsprojects/FsUnit/blob/master/src/FsUnit.NUnit/Equality.fs#L24

Another workaround would be to assert every single property:

userA.Name |> should equal userB.Name
userA.Age |> should equal userB.Age

from fsunit.

AlexeyRaga avatar AlexeyRaga commented on June 6, 2024

@CaptnCodr Yes and no :)

FsUnit does support for structural equality.

It only supports structural equality via IStructuralEquatable, as you pointed. I am, in contrast, talking about supporting structural equality that does not require implementing this interface.

For example, when there is an existing C#/.NET type that does not provide IStructuralEquatable (like my Person type above), it is still useful to be able to compare it structurally. Other assertion libs (noticeably super popular FluentAssertions) can do that.

Another workaround would be to assert every single property

As I said, this solution doesn't generalise well.
One problem is when an "outer" type does have structural equality but "inner" type does not.

In this type

type User = 
  | User of Person
  | Student of teacher:Person * student:Person
  | Team of Person array 

This gets infinitely more complicated very quickly.

Now consider that you want to assert equivalence of, say, two Array<User>s.

What I am thinking about is the ability to explicitly instruct FsUnit to ignore possibly defined equality (even if exists) and always use derived method for structural equality.

By "derived method" I mean to do something like:

  • For product types: Take public properties and fields and compare recursively
  • For sum types: Take union case fields and recursively compare those

from fsunit.

AlexeyRaga avatar AlexeyRaga commented on June 6, 2024

I think that equality should be provided by the type

I couldn't agree more. But in reality there are 3rd party libs that are being used, and classes that are out of our control, and for these scenarious it'd be helpful.

library like DeepEqual and tiny F# layer on top for assertions

Thanks, I'll double check. Last time I checked (long time ago) it wasn't F# types friendly... So mixed things like C# type inside F# union didn't work...

from fsunit.

CaptnCodr avatar CaptnCodr commented on June 6, 2024

@AlexeyRaga I'll close this here. This is out of our scope.

from fsunit.

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.