clicktype-macros 0.2.0

Procedural macros for ClickType - #[derive(ClickTable)] and more
Documentation
//! Tests for ClickEnum derive macro

use clicktype_core::ClickHouseType;
use clicktype_macros::ClickEnum;
use std::io::Cursor;

#[derive(ClickEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Status {
    Pending,
    Active,
    Completed,
    Cancelled,
}

#[derive(ClickEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Priority {
    Low,
    Medium,
    High,
}

#[test]
fn test_enum_type_name() {
    assert_eq!(Status::type_name(), "Int8");
    assert_eq!(Priority::type_name(), "Int8");
}

#[test]
fn test_enum_fixed_size() {
    assert_eq!(Status::fixed_size(), Some(1));
    assert_eq!(Priority::fixed_size(), Some(1));
}

#[test]
fn test_enum_roundtrip() {
    let status = Status::Active;
    let mut buf = Vec::new();
    status.write_binary(&mut buf).unwrap();
    let decoded = Status::read_binary(&mut Cursor::new(&buf)).unwrap();
    assert_eq!(status, decoded);
}

#[test]
fn test_all_status_variants() {
    let variants = vec![
        Status::Pending,
        Status::Active,
        Status::Completed,
        Status::Cancelled,
    ];

    for variant in variants {
        let mut buf = Vec::new();
        variant.write_binary(&mut buf).unwrap();
        let decoded = Status::read_binary(&mut Cursor::new(&buf)).unwrap();
        assert_eq!(variant, decoded);
    }
}

#[test]
fn test_all_priority_variants() {
    let variants = vec![Priority::Low, Priority::Medium, Priority::High];

    for variant in variants {
        let mut buf = Vec::new();
        variant.write_binary(&mut buf).unwrap();
        let decoded = Priority::read_binary(&mut Cursor::new(&buf)).unwrap();
        assert_eq!(variant, decoded);
    }
}

#[test]
fn test_enum_discriminants() {
    // Test that discriminants are correct
    let mut buf = Vec::new();

    Status::Pending.write_binary(&mut buf).unwrap();
    assert_eq!(buf, vec![0]);

    buf.clear();
    Status::Active.write_binary(&mut buf).unwrap();
    assert_eq!(buf, vec![1]);

    buf.clear();
    Status::Completed.write_binary(&mut buf).unwrap();
    assert_eq!(buf, vec![2]);

    buf.clear();
    Status::Cancelled.write_binary(&mut buf).unwrap();
    assert_eq!(buf, vec![3]);
}


#[test]
fn test_invalid_variant() {
    let buf = vec![99]; // Invalid discriminant
    let result = Status::read_binary(&mut Cursor::new(&buf));
    assert!(result.is_err());
}

#[test]
fn test_enum_in_array() {
    let statuses = vec![Status::Pending, Status::Active, Status::Completed];
    let mut buf = Vec::new();
    statuses.write_binary(&mut buf).unwrap();
    let decoded = Vec::<Status>::read_binary(&mut Cursor::new(&buf)).unwrap();
    assert_eq!(statuses, decoded);
}