2012-03-30 5 views
2

Ich habe eine tiefe Baumstruktur mit Listen, Listen und Floats gebaut. Ich möchte Behauptungen über eine solche Struktur machen, ohne ein Delta für die Floats verwenden zu können. Mein Problem ist, dass die Ausgabe der fehlgeschlagenen Assertion nicht ausreicht, da eine oder zwei zusätzliche Dezimalstellen benötigt werden. Ich muss diese Dezimalzahlen erraten, um fortzufahren.Assert.AreEqual für Float ohne Delta

using System.Collections; 
using System.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

    namespace TestAssertLab 
    { 
     public class List : ArrayList { 
      public List(params object[] list) { 
       AddRange(list); 
      } 
      public override bool Equals(object other) { 
       List l = other as List; 
       if (l != null) { 
        if (Count != l.Count) return false; 
        return !l.Cast<object>().Where((t, i) => !this[i].Equals(t)).Any(); 
       } 
       return false; 
      } 
      public override string ToString() { 
       string s = this.Cast<object>().Aggregate("", (current, item) => current + (item + ",")); 
       return "[" + s.TrimEnd(',') + "]"; 
      } 
     } 

     [TestClass] 
     public class AssertLab 
     { 
      public List z(params object[] l) { 
        return new List(l); 
      } 
      [TestMethod] 
      public void TestFails() { 
       List expected = z(0.1428571f, z(101, 102)); 
       List actual = z(1/7.0f,  z(101, 102)); 
       Assert.AreEqual(expected, actual); 
       // output: Assert.AreEqual failed. Expected:<[0.1428571,[101,102]]>. Actual:<[0.1428571,[101,102]]>. 
      } 
      [TestMethod] 
      public void TestOK() 
      { 
       List expected = z(0.142857143f, z(30101, 30102)); 
       List actual = z(1/7.0f, z(30101, 30102)); 
       Assert.AreEqual(expected, actual); 
      } 
     } 
    } 
+2

warum können Sie nicht ein Delta für Ihre Schwimmer verwenden in Ihrem behauptet? – BrokenGlass

+0

Da die Assert auf einer höheren Ebene in der Struktur ist, Listen vergleichen. –

Antwort

3

Sie könnten sie dezimal Stimmen:

(Decimal) 0.1428571f == (Decimal)(1/7.0f) 
+0

Funktioniert, aber dann muss ich float aufgeben. –

+0

Sie sollten besser 'decimal' verwenden, das ist C# eingebauter Typ. – LoBo