use hacspec_lib::prelude::*;
#[test]
fn test_cswap() {
let x = 123u8;
let y = 234u8;
let (xs, ys) = cswap(x, y, 0);
assert_eq!(xs, x);
assert_eq!(ys, y);
let (xs, ys) = cswap_bit(x, y, 0);
assert_eq!(xs, x);
assert_eq!(ys, y);
let (xs, ys) = cswap(x, y, u8::max_val());
assert_eq!(xs, y);
assert_eq!(ys, x);
let (xs, ys) = cswap_bit(x, y, 1);
assert_eq!(xs, y);
assert_eq!(ys, x);
}
#[test]
fn test_csub() {
fn test<T: Integer + Copy>(x: T, y: T) {
let d = csub(x, y, T::default());
assert!(d.equal(x));
let d = csub(x, y, T::max_val());
assert!(d.equal(x.wrap_sub(y)));
}
test(13u8, 234u8);
test(827629u64, 16u64);
}
#[test]
fn test_cadd() {
fn test<T: Integer + Copy>(x: T, y: T) {
let d = cadd(x, y, T::default());
assert!(d.equal(x));
let d = cadd(x, y, T::max_val());
assert!(d.equal(x.wrap_add(y)));
}
test(13u8, 234u8);
test(827629u64, 16u64);
}
#[test]
fn test_cmul() {
fn test<T: Integer + Copy>(x: T, y: T) {
let d = cmul(x, y, T::default());
assert!(d.equal(x));
let d = cmul(x, y, T::max_val());
assert!(d.equal(x.wrap_mul(y)));
}
test(13u8, 234u8);
test(827629u64, 16u64);
}
#[test]
fn test_div() {
fn test<T: Integer + Copy>(x: T, y: T) {
let (q, r) = ct_div(x, y);
assert!(q.equal(x.divide(y)));
assert!(r.equal(x.modulo(y)));
}
fn test_8(x: u8, y: u8) {
test(x, y);
test(U8(x), U8(y));
}
test_8(13, 234);
fn test_16(x: u16, y: u16) {
test(x, y);
test(U16(x), U16(y));
}
test_16(13, 234);
fn test_32(x: u32, y: u32) {
test(x, y);
test(U32(x), U32(y));
}
test_32(827629, 12);
fn test_64(x: u64, y: u64) {
test(x, y);
test(U64(x), U64(y));
}
test_64(827629, 12);
test_64(16, 827629);
}
#[test]
fn test_zn_inv() {
let n = 65537;
assert_eq!(u128::inv(37543865, n), 37686);
}
#[test]
fn test_poly_div() {
let a: Seq<i128> = Seq::from_native_slice(&[3, 3]);
let b: Seq<i128> = Seq::from_native_slice(&[1, 1]);
let mut quotient = div_poly(&a, &b, 4);
let r: Seq<i128> = Seq::from_native_slice(&[0, 0]);
let q: Seq<i128> = Seq::from_native_slice(&[3, 0]);
assert_eq!(degree_poly("ient.clone().unwrap().0), 0);
assert_eq!(quotient.clone().unwrap().0[0], q[0]);
assert_eq!(degree_poly("ient.clone().unwrap().1), 0);
assert_eq!(quotient.clone().unwrap().1[0], r[0]);
let a_2: Seq<i128> = Seq::from_native_slice(&[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
let b_2: Seq<i128> = Seq::from_native_slice(&[-1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
quotient = div_poly(&a_2, &b_2, 4);
assert_eq!(degree_poly("ient.clone().unwrap().0), 11);
for i in 1..12 {
assert_eq!(quotient.clone().unwrap().0[i], 1i128);
}
assert_eq!(quotient.clone().unwrap().0[0], 2i128);
assert_eq!(degree_poly("ient.clone().unwrap().1), 0);
assert_eq!(quotient.unwrap().1[0], 2i128);
}
#[test]
fn test_mul_poly() {
let a: Seq<i128> = Seq::from_native_slice(&[1, -2, 0, 0, 0, 0]);
let b: Seq<i128> = Seq::from_native_slice(&[-1, 1, 0, 2, 0, 0]);
let product = mul_poly(&a, &b, 5);
let p: Seq<i128> = Seq::from_native_slice(&[-1, 3, -2, 2, -4, 0]);
for i in 0..6 {
assert_eq!(product[i], p[i]);
}
}
#[test]
fn test_mul_poly_with_unequal_sized_poly() {
let a: Seq<i128> = Seq::from_native_slice(&[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
let b: Seq<i128> = Seq::from_native_slice(&[-1, 1]);
mul_poly(&a, &b, 3);
}
#[test]
fn test_poly_eea() {
let h: Seq<i128> = Seq::from_native_slice(&[1, 0, 1, 0]);
let irr: Seq<i128> = Seq::from_native_slice(&[1, 2, 0, 1]);
let h_pre_inv = extended_euclid(&h, &irr, 3);
let h_inv = match h_pre_inv {
Ok(v) => v,
Err(_) => panic!("test, failed!"),
};
let expected: Seq<i128> = Seq::from_native_slice(&[2, 1, 2]);
assert_eq!(h_inv.len(), expected.len());
for i in 0..h_inv.len() {
assert_eq!(h_inv[i], expected[i]);
}
let scalar = mul_poly_irr(&h, &h_inv, &irr, 3);
let one: Seq<i128> = Seq::from_native_slice(&[1, 0, 0, 0]);
assert_eq!(scalar.len(), one.len());
for i in 0..scalar.len() {
assert_eq!(one[i], scalar[i]);
}
}