Procházet zdrojové kódy

Multiply/divide torture test

Kent Overstreet před 9 roky
rodič
revize
fa372e230b
1 změnil soubory, kde provedl 36 přidání a 0 odebrání
  1. 36 0
      src/bigint.rs

+ 36 - 0
src/bigint.rs

@@ -3292,6 +3292,42 @@ mod biguint_tests {
         assert_eq!(sub_sign(&a.data.data[..], &b.data.data[..]), &a - &b);
         assert_eq!(sub_sign(&b.data.data[..], &a.data.data[..]), &b - &a);
     }
+
+    fn test_mul_divide_torture_count(count: usize) {
+        use rand::{SeedableRng, StdRng, Rng};
+
+        let bits_max = 1 << 12;
+        let seed: &[_] = &[1, 2, 3, 4];
+        let mut rng: StdRng = SeedableRng::from_seed(seed);
+
+        for _ in 0..count {
+            /* Test with numbers of random sizes: */
+            let xbits = rng.gen_range(0, bits_max);
+            let ybits = rng.gen_range(0, bits_max);
+
+            let x = rng.gen_biguint(xbits);
+            let y = rng.gen_biguint(ybits);
+
+            if x.is_zero() || y.is_zero() {
+                continue;
+            }
+
+            let prod = &x * &y;
+            assert_eq!(&prod / &x, y);
+            assert_eq!(&prod / &y, x);
+        }
+    }
+
+    #[test]
+    fn test_mul_divide_torture() {
+        test_mul_divide_torture_count(1000);
+    }
+
+    #[test]
+    #[ignore]
+    fn test_mul_divide_torture_long() {
+        test_mul_divide_torture_count(1000000);
+    }
 }
 
 #[cfg(test)]