// mpz
cond( [[ master()->resolv("Gmp")->mpz ]],
[[
  test_true(programp(Gmp.mpz))
  test_false(clone(Gmp.mpz))
  test_do(destruct(clone(Gmp.mpz)))

  test_eq(Gmp.mpz(10),10)
  test_eq(Gmp.mpz("10"),10)
  test_eq(Gmp.mpz(10.0),10)
  test_eq(Gmp.mpz("10",8),8)
  test_eq(Gmp.mpz("0",256),'0')

  test_eq(Gmp.mpz("17") == "foo", 0)
  test_eq(Gmp.mpz("17") != "foo", 1)
  test_true(catch(Gmp.mpz("17") < "foo"))

  define([[test_binop]],[[
    test_eq(Gmp.mpz($1) $2 $3, $4)
    test_eq(Gmp.mpz($1) $2 $3.0, $4)
    test_eq(Gmp.mpz($1) $2 Gmp.mpz($3), $4)
    test_eq($1 $2 Gmp.mpz($3), $4)
    test_eq($1.0 $2 Gmp.mpz($3), $4)
    test_eq($1.0 $2 Gmp.mpz($3), $4)
    test_eq($1 $2 $3,Gmp.mpz($4))
  ]])

  test_binop(99,+,1,100)
  test_binop(100,*,10,1000)
  test_binop(100,/,4,25)
  test_binop(103,/,4,25)
  test_binop(10,<<,1,20)
  test_binop(10,>>,1,5)
  test_binop(66,+,11,77)
  test_binop(66,-,11,55)
  test_binop(17,|,7,23)
  test_binop(17,&,18,16)

  test_eq(-clone(Gmp.mpz,17),-17)
  test_eq((~clone(Gmp.mpz,17)) & 255,238)
  test_true(stringp((string)clone(Gmp.mpz,17)))
  test_eq((string)clone(Gmp.mpz,17),"17")
  test_true(intp((int)clone(Gmp.mpz,17)))
  test_eq((int)clone(Gmp.mpz,17),17)
  test_false(clone(Gmp.mpz,0))
  test_true(clone(Gmp.mpz,1))
  test_eq(clone(Gmp.mpz,17)->powm(12,4711),85)

  define([[mpz_test_cmp]],[[
    test_cmp(clone(Gmp.mpz,$1), $2)
    test_cmp($1, clone(Gmp.mpz,$2))
    test_cmp(clone(Gmp.mpz, $1), clone(Gmp.mpz, $2))
  ]])

  define([[mpz_test_type1]],[[
    mpz_test_cmp($1,$2)
    mpz_test_cmp($1.0,$2)
  ]])

  define([[mpz_test_type2]],[[
    mpz_test_type1($1,$2)
    mpz_test_type1($1,$2.0)
  ]])

  mpz_test_type2(1,2)
  mpz_test_type2(-2,1)

  test_true(catch(Gmp.mpz("abcd", 47)))
  test_true(catch(Gmp.mpz(-17)->digits(256)))
  test_eq(Gmp.mpz(4711)->size(2), 13)
  test_true(catch(Gmp.mpz(17) + 18 + "19"))
  test_true(catch(Gmp.mpz(17) - 18 - "19"))
  test_true(catch(Gmp.mpz(17) / 0))
  test_true(catch(Gmp.mpz(49) % 0))
  test_eq(Gmp.mpz(0)->pow(0), 1)
  test_true(equal(Gmp.mpz(13)->gcdext(19), ({1, 3, -2})))
  test_eq(Gmp.mpz(17)->invert(4711), 2217)
  test_true(catch(Gmp.mpz(4711)->invert(0)))
  test_true(catch(Gmp.mpz(7)->invert(4711)))
  test_true(catch(Gmp.mpz(2)->powm(47, 0)))
  test_any([[object o=Gmp.mpz(1); o++; return o;]],2)
  test_any([[object o=Gmp.mpz(1); return o++;]],1)
  test_any([[object o=Gmp.mpz(1); return ++o;]],2)
  test_any([[object o=Gmp.mpz(1); o++;o++;o++;o++;o++;o++;o++;o++;o++; return o]],10)
  test_any([[object o=Gmp.mpz(2); o--; return o;]],1)
  test_any([[object o=Gmp.mpz(2); return --o;]],1)
  test_any([[object o=Gmp.mpz(2); return o--;]],2)
]]);

