public void TestCreateNaN() { try { ERational.CreateNaN(null); Assert.Fail("Should have failed"); } catch (ArgumentNullException) { new Object(); } catch (Exception ex) { Assert.Fail(ex.ToString()); throw new InvalidOperationException(String.Empty, ex); } try { ERational.CreateNaN(EInteger.FromString("-1")); Assert.Fail("Should have failed"); } catch (ArgumentException) { new Object(); } catch (Exception ex) { Assert.Fail(ex.ToString()); throw new InvalidOperationException(String.Empty, ex); } try { ERational.CreateNaN(null, false, false); Assert.Fail("Should have failed"); } catch (ArgumentNullException) { new Object(); } catch (Exception ex) { Assert.Fail(ex.ToString()); throw new InvalidOperationException(String.Empty, ex); } ERational ef = ERational.CreateNaN(EInteger.Zero, false, true); Assert.IsTrue(ef.IsNegative); ef = ERational.CreateNaN(EInteger.Zero, false, false); Assert.IsTrue(!ef.IsNegative); }
private static CBORNumber RationalToNumber( CBORObject o, int tagName) { if (o.Type != CBORType.Array) { return(null); // "Big fraction must be an array"; } if (tagName == 270) { if (o.Count != 3) { return(null); // "Extended big fraction requires exactly 3 items"; } if (!IsUntaggedInteger(o[2])) { return(null); // "Third item must be an integer"; } } else { if (o.Count != 2) { return(null); // "Big fraction requires exactly 2 items"; } } if (!IsUntaggedIntegerOrBignum(o[0])) { return(null); // "Numerator is not an integer or bignum"; } if (!IsUntaggedIntegerOrBignum(o[1])) { return(null); // "Denominator is not an integer or bignum"); } EInteger numerator = IntegerOrBignum(o[0]); EInteger denominator = IntegerOrBignum(o[1]); if (denominator.Sign <= 0) { return(null); // "Denominator may not be negative or zero"); } ERational erat = ERational.Create(numerator, denominator); if (tagName == 270) { if (numerator.Sign < 0) { return(null); // "Numerator may not be negative"); } if (!o[2].CanValueFitInInt32()) { return(null); // "Invalid options"; } int options = o[2].AsInt32Value(); switch (options) { case 0: break; case 1: erat = erat.Negate(); break; case 2: if (!numerator.IsZero || denominator.CompareTo(1) != 0) { return(null); // "invalid values"); } erat = ERational.PositiveInfinity; break; case 3: if (!numerator.IsZero || denominator.CompareTo(1) != 0) { return(null); // "invalid values"); } erat = ERational.NegativeInfinity; break; case 4: case 5: case 6: case 7: if (denominator.CompareTo(1) != 0) { return(null); // "invalid values"); } erat = ERational.CreateNaN( numerator, options >= 6, options == 5 || options == 7); break; default: return(null); // "Invalid options"); } } return(CBORNumber.FromObject(erat)); }