q_compress 0.11.4

Good compression for numerical sequences and time series
Documentation
use std::fs;

use crate::{auto_decompress, DecompressorConfig};
use crate::data_types::NumberLike;
#[cfg(feature = "timestamps_96")]
use crate::data_types::TimestampMicros96;
use crate::tests::utils;

#[derive(Clone, Copy, Debug)]
enum Mode {
  Standalone,
  Wrapped,
}

fn assert_compatible<T: NumberLike>(
  filename: &str,
  mode: Mode,
) {
  let raw_bytes = fs::read(format!("assets/{}.bin", filename)).expect("read bin");
  let expected = raw_bytes
    .chunks(T::PHYSICAL_BITS / 8)
    .map(|chunk| T::from_bytes(chunk.to_vec()).expect("raw corruption"))
    .collect::<Vec<_>>();

  let compressed = fs::read(format!("assets/{}.qco", filename)).expect("read qco");
  let decompressed = match mode {
    Mode::Standalone => auto_decompress::<T>(&compressed),
    Mode::Wrapped => utils::wrapped_decompress(compressed, DecompressorConfig::default()),
  }.expect("decompress");

  assert_eq!(decompressed, expected)
}

#[test]
fn test_v0_4_empty() {
  assert_compatible::<i64>("v0.4_i64_empty", Mode::Standalone);
}

#[test]
fn test_v0_4_bool_sparse() {
  assert_compatible::<bool>("v0.4_bool_sparse_2k", Mode::Standalone);
}

#[test]
fn test_v0_4_i32() {
  assert_compatible::<i32>("v0.4_i32_2k", Mode::Standalone);
}

#[test]
fn test_v0_4_f32() {
  assert_compatible::<f32>("v0.4_f32_2k", Mode::Standalone);
}

#[cfg(feature = "timestamps_96")]
#[test]
fn test_v0_6_timestamp_deltas() {
  assert_compatible::<TimestampMicros96>("v0.6_timestamp_deltas_2k", Mode::Standalone);
}

#[test]
fn test_v0_9_dispersed_shorts() {
  assert_compatible::<u16>("v0.9_dispersed_shorts", Mode::Standalone);
}

#[test]
fn test_v0_10_varied_gcds() {
  assert_compatible::<f32>("v0.10_varied_gcds", Mode::Standalone);
}

#[test]
fn test_v0_10_same_gcds() {
  assert_compatible::<i32>("v0.10_same_gcds", Mode::Standalone);
}

#[test]
fn test_v0_11_2_wrapped_brownian() {
  assert_compatible::<f32>("v0.11.2_wrapped_brownian", Mode::Wrapped);
}