0

I've this:

namespace metric_system {

  public class Meter {
      
    public double meter { get; set; }
    
    public static Meter operator + ( Meter lhs, Meter rhs ) {
        return new Meter { meter = (lhs.meter + rhs.meter) };
    }
  }
}

I'm trying to test this code:

namespace metric_system.Tests {
  public class Tests {
    [SetUp]
    public void Setup () {}

    [Test]
    public void Meter_operator_plus_Meter_10_Meter_50_return_60 () {

      metric_system.Meter m1        = new Meter { meter = 10 };
      metric_system.Meter m2        = new Meter { meter = 50 };
      metric_system.Meter expected  = new Meter { meter = 60 };


      metric_system.Meter actual = new Meter { meter = ( m1.meter + m2.meter) };

      Assert.AreEqual( expected, actual );
    }
  }
}

This test falls.. help me.

General Grievance
  • 4,555
  • 31
  • 31
  • 45
  • 1
    You need to override `Equals` and `GetHashCode`, implement `IEquatable` or use a struct instead of a class – vc 74 Apr 19 '20 at 09:13
  • As @vc74 said you need to override, here is an example https://stackoverflow.com/a/61167207/2946329 or https://stackoverflow.com/a/38434457/2946329 – Salah Akbari Apr 19 '20 at 09:17
  • Your `actual` variable should be set to `m1 + m2`, that's the whole point of defining the `+` operator in your `Meter` class. You want to test the overloaded `+` operator. – Progman Apr 19 '20 at 11:55

2 Answers2

2

To make Assert.AreEqual(expected, actual) work, you need to implement the equality comparison (or create an equality comparer):

namespace metric_system {

    public class Meter : IEquatable<Meter> {

        public double meter { get; set; }

        public static Meter operator + ( Meter lhs, Meter rhs ) {
            return new Meter { meter = (lhs.meter + rhs.meter) };
        }

        public override bool Equals(object other) => Equals(other as Meter);

        public bool Equals(Meter other) => !(other is null) &&
                                            (other.meter == meter);

        public override int GetHashCode() => HashCode.Combine(meter);
    }
}

Also, if you make meter immutable, you entity would quality for a struct.

vc 74
  • 37,131
  • 7
  • 73
  • 89
0

You should not compare the objects, use the 'meter' property for comparison.

double precision = 0.1;
Assert.AreEqual(60, actual.meter, precision);

https://learn.microsoft.com/en-US/dotnet/api/microsoft.visualstudio.testtools.unittesting.assert.areequal?redirectedfrom=MSDN&view=mstest-net-1.2.0#Microsoft_VisualStudio_TestTools_UnitTesting_Assert_AreEqual_System_Double_System_Double_System_Double_

user8606929
  • 226
  • 1
  • 12