proof-of-sql 0.129.1

High performance zero knowledge (ZK) prover for SQL.
Documentation
use super::*;
use crate::base::{bit::BitDistribution, scalar::test_scalar::TestScalar};
use bumpalo::Bump;
use num_traits::{One, Zero};

#[test]
fn we_can_compute_the_bit_matrix_of_empty_data() {
    let data: Vec<TestScalar> = vec![];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert!(matrix.is_empty());
}

#[test]
fn we_can_compute_the_bit_matrix_for_a_single_element() {
    let data: Vec<TestScalar> = vec![TestScalar::one()];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert!(matrix.is_empty());
}

#[test]
fn we_can_compute_the_bit_matrix_for_data_with_a_single_varying_bit() {
    let data: Vec<TestScalar> = vec![TestScalar::one(), TestScalar::zero()];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert_eq!(matrix.len(), 1);
    let slice1 = vec![true, false];
    assert_eq!(matrix[0], slice1);
}

#[test]
fn we_can_compute_the_bit_matrix_for_data_with_a_varying_sign_bit() {
    let data: Vec<TestScalar> = vec![TestScalar::one(), -TestScalar::one()];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert_eq!(matrix.len(), 2);
    let slice1 = vec![true, true];
    let slice2 = vec![true, false];
    assert_eq!(matrix[0], slice1);
    assert_eq!(matrix[1], slice2);
}

#[test]
fn we_can_compute_the_bit_matrix_for_data_with_varying_bits_in_different_positions() {
    let data: Vec<TestScalar> = vec![TestScalar::from(2), TestScalar::one()];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert_eq!(matrix.len(), 2);
    let slice1 = vec![false, true];
    let slice2 = vec![true, false];
    assert_eq!(matrix[0], slice1);
    assert_eq!(matrix[1], slice2);
}

#[test]
fn we_can_compute_the_bit_matrix_for_data_with_varying_bits_and_constant_bits() {
    let data: Vec<TestScalar> = vec![TestScalar::from(3), TestScalar::from(-1)];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert_eq!(matrix.len(), 3);
    let slice1 = vec![true, true];
    let slice2 = vec![true, true];
    let slice3 = vec![true, false];
    assert_eq!(matrix[0], slice1);
    assert_eq!(matrix[1], slice2);
    assert_eq!(matrix[2], slice3);
}

#[test]
fn we_can_compute_the_bit_matrix_for_data_entries_bigger_than_64_bit_integers() {
    let mut val = [0; 4];
    val[3] = 1 << 2;
    let data: Vec<TestScalar> = vec![TestScalar::from_bigint(val), TestScalar::one()];
    let dist = BitDistribution::new::<TestScalar, _>(&data);
    let alloc = Bump::new();
    let matrix = compute_varying_bit_matrix(&alloc, &data, &dist);
    assert_eq!(matrix.len(), 2);
    let slice1 = vec![false, true];
    let slice2 = vec![true, false];
    assert_eq!(matrix[0], slice1);
    assert_eq!(matrix[1], slice2);
}