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() {
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]; 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);
}