Browse Source

Auto merge of #182 - ollie27:ratio_posneg, r=cuviper

Correct Ratio::is_negative and Ratio::is_positive

Zero is not positive or negative.

This was broken in 8be7e7bab5ffc7f998e713547b67c1a424d3b9b1.
Homu 9 years ago
parent
commit
774bf31ec6
1 changed files with 20 additions and 2 deletions
  1. 20 2
      rational/src/lib.rs

+ 20 - 2
rational/src/lib.rs

@@ -526,12 +526,14 @@ impl<T: Clone + Integer + Signed> Signed for Ratio<T> {
 
     #[inline]
     fn is_positive(&self) -> bool {
-        !self.is_negative()
+        (self.numer.is_positive() && self.denom.is_positive()) ||
+        (self.numer.is_negative() && self.denom.is_negative())
     }
 
     #[inline]
     fn is_negative(&self) -> bool {
-        self.numer.is_negative() ^ self.denom.is_negative()
+        (self.numer.is_negative() && self.denom.is_positive()) ||
+        (self.numer.is_positive() && self.denom.is_negative())
     }
 }
 
@@ -674,6 +676,14 @@ mod test {
         numer: -1,
         denom: 2,
     };
+    pub const _1_NEG2: Rational = Ratio {
+        numer: 1,
+        denom: -2,
+    };
+    pub const _NEG1_NEG2: Rational = Ratio {
+        numer: -1,
+        denom: -2,
+    };
     pub const _1_3: Rational = Ratio {
         numer: 1,
         denom: 3,
@@ -1081,9 +1091,17 @@ mod test {
         assert_eq!(_1_2.abs_sub(&_3_2), Zero::zero());
         assert_eq!(_1_2.signum(), One::one());
         assert_eq!(_NEG1_2.signum(), -<Ratio<isize>>::one());
+        assert_eq!(_0.signum(), Zero::zero());
         assert!(_NEG1_2.is_negative());
+        assert!(_1_NEG2.is_negative());
         assert!(!_NEG1_2.is_positive());
+        assert!(!_1_NEG2.is_positive());
+        assert!(_1_2.is_positive());
+        assert!(_NEG1_NEG2.is_positive());
         assert!(!_1_2.is_negative());
+        assert!(!_NEG1_NEG2.is_negative());
+        assert!(!_0.is_positive());
+        assert!(!_0.is_negative());
     }
 
     #[test]