import unittest from mmath/rational import newRational, `+`, `-`, `*`, `/`, `$`, simplify, gcd, pow, mcm, `==`, `cmp`, `<`, `>`, `<=`, `>=`, abs suite "Nim rational numbers": test "gcd": let a = 14 let b = 21 check 7 == gcd(a, b) test "mcm": let a = 14 let b = 21 check 42 == mcm(a, b) test "pow": check 625 == pow(5, 4) test "==": let r1 = newRational(1, 3) let r2 = newRational(5, 15) let r3 = newRational(35, 105) check r1 == r2 check r1 == r3 check r2 == r3 test "+": let r1 = newRational(1, 3) let r2 = newRational(2, 3) let r3 = r1 + r2 check r3 == newRational(1) test "-": let r1 = newRational(1, 3) let r2 = newRational(2, 3) let r3 = r1 - r2 check r3 == newRational(-1, 3) test "*": let r1 = newRational(1, 3) let r2 = newRational(2, 3) let r3 = r1 * r2 check r3 == newRational(2, 9) test "/": let r1 = newRational(1, 3) let r2 = newRational(2, 3) let r3 = r1 / r2 check r3 == newRational(1, 2) test "simplify": var r1 = newRational(65, 169) check r1 == newRational(5, 13) r1.simplify() check r1.num == 5 check r1.den == 13 test "pow": let r1 = newRational(65, 169) let r2 = r1.pow(2) check r2 == newRational(25, 169) test "cmp": let r1 = newRational(65, 169) let r2 = newRational(5, 13) let r3 = newRational(6, 13) check r1 < r3 check r3 > r1 check r1 <= r3 check r1 <= r2 check r3 >= r1 check r2 >= r1 check r2 == r1 test "abs": let r1 = newRational(-65, -169) let r2 = newRational(65, -169) check r1 == r1.abs() check r1 == r2.abs() check r1 != r2 test "i64": let p1 = 32452867i64 let p2 = 49979687i64 let p3 = 15485867i64 let r1 = newRational(p3, p1 * p2) let r2 = newRational(p2, p1 * p3) var r3 = newRational(p2, p2 * p3) check newRational(1i64, p3) == r3 r3.simplify() check r3.num == 1i64 check r3.den == p3 expect(OverflowDefect): discard r1 / r2 expect(OverflowDefect): discard r1 + r2