use ark_std::{cmp::PartialEq, fmt::Debug, vec::Vec, UniformRand};
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
use scale_codec::{Decode, Encode};
use crate::{self as ark_scale, *};
fn run_test<T, const U: Usage>()
where
T: CanonicalSerialize
+ CanonicalDeserialize
+ UniformRand
+ Clone
+ PartialEq
+ Debug
+ Default,
{
let f = || <T as UniformRand>::rand(&mut rand_core::OsRng);
let array: [T; 4] = [f(), f(), f(), f()];
for a in &array {
let mut x = Vec::new();
a.serialize_with_mode(&mut x, is_compressed(U)).unwrap();
let z = <T as CanonicalDeserialize>::deserialize_with_mode(
&mut x.as_slice(),
is_compressed(U),
is_validated(U),
)
.unwrap();
assert_eq!(a, &z);
let b_ref: ArkScaleRef<T, U> = a.into();
let c_ref = b_ref.encode();
let b: ArkScale<T, U> = (*a).clone().into();
let c = b.encode();
assert_eq!(c, c_ref);
assert_eq!(c.len(), x.len());
assert_eq!(c, x);
let e0 = <T as CanonicalDeserialize>::deserialize_with_mode(
&mut c.as_slice(),
is_compressed(U),
is_validated(U),
)
.unwrap();
assert_eq!(a, &e0);
let e: ArkScale<T, U> = <ArkScale<T, U> as Decode>::decode(&mut c.as_slice()).unwrap();
assert_eq!(a, &e.0);
}
let u = crate::iter_ark_to_scale_bytes::<T, _, _>(&array, U).unwrap();
let v: ArkScale<&[T], U> = ArkScale(array.as_slice());
let w = v.encode();
assert_eq!(u.len(), w.len());
assert_eq!(u, w);
assert_eq!(array, v.0);
let w0 = <Vec<T> as CanonicalDeserialize>::deserialize_with_mode(
&mut u.as_slice(),
crate::is_compressed(U),
crate::is_validated(U),
)
.unwrap();
assert_eq!(array.as_slice(), w0.as_slice());
let w: ArkScale<Vec<T>, U> = ArkScale::decode(&mut u.as_slice()).unwrap();
assert_eq!(array.as_slice(), w.0.as_slice());
}
fn run_tests<T>()
where
T: CanonicalSerialize
+ CanonicalDeserialize
+ UniformRand
+ Clone
+ PartialEq
+ Debug
+ Default,
{
run_test::<T, WIRE>();
run_test::<T, { make_usage(Compress::Yes, Validate::No) }>();
run_test::<T,{ make_usage(Compress::No, Validate::Yes) }>();
run_test::<T, HOST_CALL>();
}
#[test]
fn fields() {
run_tests::<ark_bls12_381::Fr>();
}
#[test]
fn curves() {
run_tests::<ark_bls12_381::G1Affine>();
run_tests::<ark_ed25519::EdwardsAffine>();
}
#[derive(Clone, Eq, PartialEq, Debug, CanonicalSerialize, CanonicalDeserialize)]
struct MacroTest(ark_bls12_381::Fr);
impl_scale_via_ark!(MacroTest);
#[test]
fn macros() {
let f = || MacroTest(ark_std::UniformRand::rand(&mut rand_core::OsRng));
let a: [MacroTest; 4] = [f(), f(), f(), f()];
let v = Encode::encode(&a);
let b: [MacroTest; 4] = <[MacroTest; 4] as Decode>::decode(&mut v.as_slice()).unwrap();
assert_eq!(a,b);
}