use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(u8)]
pub enum BasicAxisTypes {
Delta,
Gamma,
Theta,
Vega,
Volatility,
Price,
UnderlyingPrice,
Strike,
Expiration,
Vanna,
Vomma,
Veta,
Charm,
Color,
}
pub struct BasicAxisTypesIter {
index: usize,
}
impl BasicAxisTypes {
const VALUES: [BasicAxisTypes; 14] = [
BasicAxisTypes::Delta,
BasicAxisTypes::Gamma,
BasicAxisTypes::Theta,
BasicAxisTypes::Vega,
BasicAxisTypes::Volatility,
BasicAxisTypes::Price,
BasicAxisTypes::UnderlyingPrice,
BasicAxisTypes::Strike,
BasicAxisTypes::Expiration,
BasicAxisTypes::Vanna,
BasicAxisTypes::Vomma,
BasicAxisTypes::Veta,
BasicAxisTypes::Charm,
BasicAxisTypes::Color,
];
#[must_use]
pub fn iter() -> BasicAxisTypesIter {
BasicAxisTypesIter { index: 0 }
}
}
impl Iterator for BasicAxisTypesIter {
type Item = BasicAxisTypes;
fn next(&mut self) -> Option<Self::Item> {
let value = *BasicAxisTypes::VALUES.get(self.index)?;
self.index += 1;
Some(value)
}
}
#[cfg(test)]
mod tests_basic_axis_types {
use super::*;
use serde_json;
#[test]
fn test_debug_implementation() {
assert_eq!(format!("{:?}", BasicAxisTypes::Delta), "Delta");
assert_eq!(format!("{:?}", BasicAxisTypes::Gamma), "Gamma");
assert_eq!(format!("{:?}", BasicAxisTypes::Theta), "Theta");
assert_eq!(format!("{:?}", BasicAxisTypes::Vega), "Vega");
assert_eq!(format!("{:?}", BasicAxisTypes::Volatility), "Volatility");
assert_eq!(format!("{:?}", BasicAxisTypes::Price), "Price");
assert_eq!(format!("{:?}", BasicAxisTypes::Strike), "Strike");
assert_eq!(format!("{:?}", BasicAxisTypes::Expiration), "Expiration");
assert_eq!(format!("{:?}", BasicAxisTypes::Vanna), "Vanna");
assert_eq!(format!("{:?}", BasicAxisTypes::Vomma), "Vomma");
assert_eq!(format!("{:?}", BasicAxisTypes::Veta), "Veta");
assert_eq!(format!("{:?}", BasicAxisTypes::Charm), "Charm");
assert_eq!(format!("{:?}", BasicAxisTypes::Color), "Color");
}
#[test]
fn test_clone_implementation() {
let axis_type = BasicAxisTypes::Delta;
let cloned = axis_type;
assert_eq!(axis_type, cloned);
}
#[test]
fn test_copy_implementation() {
let axis_type = BasicAxisTypes::Gamma;
let copied = axis_type;
assert_eq!(axis_type, copied);
}
#[test]
fn test_equality_comparison() {
assert_eq!(BasicAxisTypes::Delta, BasicAxisTypes::Delta);
assert_ne!(BasicAxisTypes::Delta, BasicAxisTypes::Gamma);
assert_ne!(BasicAxisTypes::Theta, BasicAxisTypes::Vega);
}
#[test]
fn test_serialization() {
let variants = vec![
BasicAxisTypes::Delta,
BasicAxisTypes::Gamma,
BasicAxisTypes::Theta,
BasicAxisTypes::Vega,
BasicAxisTypes::Volatility,
BasicAxisTypes::Price,
BasicAxisTypes::Strike,
BasicAxisTypes::Vanna,
BasicAxisTypes::Vomma,
BasicAxisTypes::Veta,
BasicAxisTypes::Charm,
BasicAxisTypes::Color,
];
for variant in variants {
let serialized = serde_json::to_string(&variant).expect("Failed to serialize");
let deserialized: BasicAxisTypes =
serde_json::from_str(&serialized).expect("Failed to deserialize");
assert_eq!(variant, deserialized);
}
}
#[test]
fn test_specific_serialization_format() {
let serialized = serde_json::to_string(&BasicAxisTypes::Delta).unwrap();
assert_eq!(serialized, "\"Delta\"");
let serialized = serde_json::to_string(&BasicAxisTypes::Volatility).unwrap();
assert_eq!(serialized, "\"Volatility\"");
}
#[test]
fn test_deserialization() {
let json_delta = "\"Delta\"";
let deserialized: BasicAxisTypes = serde_json::from_str(json_delta).unwrap();
assert_eq!(deserialized, BasicAxisTypes::Delta);
let json_volatility = "\"Volatility\"";
let deserialized: BasicAxisTypes = serde_json::from_str(json_volatility).unwrap();
assert_eq!(deserialized, BasicAxisTypes::Volatility);
}
#[test]
fn test_invalid_deserialization() {
let result = serde_json::from_str::<BasicAxisTypes>("\"InvalidAxis\"");
assert!(result.is_err());
}
#[test]
fn test_exhaustive_variant_comparison() {
assert!(matches!(BasicAxisTypes::Delta, BasicAxisTypes::Delta));
assert!(matches!(BasicAxisTypes::Gamma, BasicAxisTypes::Gamma));
assert!(matches!(BasicAxisTypes::Theta, BasicAxisTypes::Theta));
assert!(matches!(BasicAxisTypes::Vega, BasicAxisTypes::Vega));
assert!(matches!(
BasicAxisTypes::Volatility,
BasicAxisTypes::Volatility
));
assert!(matches!(BasicAxisTypes::Price, BasicAxisTypes::Price));
assert!(matches!(BasicAxisTypes::Strike, BasicAxisTypes::Strike));
assert!(matches!(BasicAxisTypes::Vanna, BasicAxisTypes::Vanna));
assert!(matches!(BasicAxisTypes::Vomma, BasicAxisTypes::Vomma));
assert!(matches!(BasicAxisTypes::Veta, BasicAxisTypes::Veta));
assert!(matches!(BasicAxisTypes::Charm, BasicAxisTypes::Charm));
assert!(matches!(BasicAxisTypes::Color, BasicAxisTypes::Color));
}
#[test]
fn test_memory_layout() {
use std::mem::size_of;
assert_eq!(size_of::<BasicAxisTypes>(), 1);
}
}
#[cfg(test)]
mod tests_basic_axis_types_extended {
use super::*;
use std::collections::HashSet;
#[test]
fn test_iterator_creation() {
let iterator = BasicAxisTypes::iter();
assert_eq!(iterator.index, 0);
}
#[test]
fn test_iterator_next() {
let mut iterator = BasicAxisTypes::iter();
assert_eq!(iterator.next(), Some(BasicAxisTypes::Delta));
assert_eq!(iterator.index, 1);
}
#[test]
fn test_iterator_complete_traversal() {
let mut iterator = BasicAxisTypes::iter();
assert_eq!(iterator.next(), Some(BasicAxisTypes::Delta));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Gamma));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Theta));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Vega));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Volatility));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Price));
assert_eq!(iterator.next(), Some(BasicAxisTypes::UnderlyingPrice));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Strike));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Expiration));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Vanna));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Vomma));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Veta));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Charm));
assert_eq!(iterator.next(), Some(BasicAxisTypes::Color));
assert_eq!(iterator.next(), None);
}
#[test]
fn test_iterator_exhaustion() {
let mut iterator = BasicAxisTypes::iter();
for _ in 0..BasicAxisTypes::VALUES.len() {
iterator.next();
}
assert_eq!(iterator.next(), None);
assert_eq!(iterator.next(), None);
assert_eq!(iterator.index, BasicAxisTypes::VALUES.len());
}
#[test]
fn test_values_array_completeness() {
let values_set: HashSet<BasicAxisTypes> = BasicAxisTypes::VALUES.iter().cloned().collect();
assert!(values_set.contains(&BasicAxisTypes::Delta));
assert!(values_set.contains(&BasicAxisTypes::Gamma));
assert!(values_set.contains(&BasicAxisTypes::Theta));
assert!(values_set.contains(&BasicAxisTypes::Vega));
assert!(values_set.contains(&BasicAxisTypes::Volatility));
assert!(values_set.contains(&BasicAxisTypes::Price));
assert!(values_set.contains(&BasicAxisTypes::UnderlyingPrice));
assert!(values_set.contains(&BasicAxisTypes::Strike));
assert!(values_set.contains(&BasicAxisTypes::Expiration));
assert!(values_set.contains(&BasicAxisTypes::Vanna));
assert!(values_set.contains(&BasicAxisTypes::Vomma));
assert!(values_set.contains(&BasicAxisTypes::Veta));
assert!(values_set.contains(&BasicAxisTypes::Charm));
assert!(values_set.contains(&BasicAxisTypes::Color));
assert_eq!(values_set.len(), 14);
}
#[test]
fn test_iterator_collect() {
let collected: Vec<BasicAxisTypes> = BasicAxisTypes::iter().collect();
assert_eq!(collected.len(), 14);
assert_eq!(collected, BasicAxisTypes::VALUES);
}
#[test]
fn test_iterator_count() {
let count = BasicAxisTypes::iter().count();
assert_eq!(count, 14);
}
#[test]
fn test_iterator_for_loop() {
let mut encountered = vec![];
for axis_type in BasicAxisTypes::iter() {
encountered.push(axis_type);
}
assert_eq!(encountered.len(), 14);
assert_eq!(encountered, BasicAxisTypes::VALUES);
}
#[test]
fn test_iterator_partial_consumption() {
let mut iterator = BasicAxisTypes::iter();
for _ in 0..3 {
iterator.next();
}
assert_eq!(iterator.next(), Some(BasicAxisTypes::Vega));
assert_eq!(iterator.index, 4);
}
#[test]
fn test_iterator_multiple_use() {
let mut iterator1 = BasicAxisTypes::iter();
let mut iterator2 = BasicAxisTypes::iter();
assert_eq!(iterator1.next(), Some(BasicAxisTypes::Delta));
assert_eq!(iterator1.next(), Some(BasicAxisTypes::Gamma));
assert_eq!(iterator2.next(), Some(BasicAxisTypes::Delta));
assert_eq!(iterator1.next(), Some(BasicAxisTypes::Theta));
assert_eq!(iterator1.index, 3);
assert_eq!(iterator2.index, 1);
}
#[test]
fn test_filter_map_operations() {
let greeks: Vec<BasicAxisTypes> = BasicAxisTypes::iter()
.filter(|axis| {
matches!(
axis,
BasicAxisTypes::Delta
| BasicAxisTypes::Gamma
| BasicAxisTypes::Theta
| BasicAxisTypes::Vega
| BasicAxisTypes::Vanna
| BasicAxisTypes::Vomma
| BasicAxisTypes::Veta
| BasicAxisTypes::Charm
| BasicAxisTypes::Color
)
})
.collect();
assert_eq!(greeks.len(), 9);
assert_eq!(greeks[0], BasicAxisTypes::Delta);
assert_eq!(greeks[3], BasicAxisTypes::Vega);
assert_eq!(greeks[4], BasicAxisTypes::Vanna);
assert_eq!(greeks[5], BasicAxisTypes::Vomma);
assert_eq!(greeks[6], BasicAxisTypes::Veta);
assert_eq!(greeks[7], BasicAxisTypes::Charm);
assert_eq!(greeks[8], BasicAxisTypes::Color);
let names: Vec<&str> = BasicAxisTypes::iter()
.map(|axis| match axis {
BasicAxisTypes::Delta => "delta",
BasicAxisTypes::Gamma => "gamma",
BasicAxisTypes::Theta => "theta",
BasicAxisTypes::Vega => "vega",
BasicAxisTypes::Volatility => "volatility",
BasicAxisTypes::Price => "price",
BasicAxisTypes::UnderlyingPrice => "underlying",
BasicAxisTypes::Strike => "strike",
BasicAxisTypes::Expiration => "expiration",
BasicAxisTypes::Vanna => "vanna",
BasicAxisTypes::Vomma => "vomma",
BasicAxisTypes::Veta => "veta",
BasicAxisTypes::Charm => "charm",
BasicAxisTypes::Color => "color",
})
.collect();
assert_eq!(names.len(), 14);
assert_eq!(names[0], "delta");
assert_eq!(names[4], "volatility");
assert_eq!(names[9], "vanna");
assert_eq!(names[10], "vomma");
assert_eq!(names[11], "veta");
assert_eq!(names[12], "charm");
assert_eq!(names[13], "color");
}
#[test]
fn test_reverse_traversal() {
let all_axes: Vec<BasicAxisTypes> = BasicAxisTypes::iter().collect();
let reverse_order: Vec<BasicAxisTypes> = all_axes.into_iter().rev().collect();
assert_eq!(reverse_order.len(), 14);
assert_eq!(reverse_order[0], BasicAxisTypes::Color);
assert_eq!(reverse_order[13], BasicAxisTypes::Delta);
}
#[test]
fn test_find_in_iterator() {
let price = BasicAxisTypes::iter().find(|&axis| axis == BasicAxisTypes::Price);
assert_eq!(price, Some(BasicAxisTypes::Price));
let nonexistent = BasicAxisTypes::iter().find(|_| false);
assert_eq!(nonexistent, None);
}
#[test]
fn test_functional_operations() {
let has_price = BasicAxisTypes::iter().any(|axis| axis == BasicAxisTypes::Price);
assert!(has_price);
let all_valid = BasicAxisTypes::iter().all(|_| true);
assert!(all_valid);
let vega_position = BasicAxisTypes::iter().position(|axis| axis == BasicAxisTypes::Vega);
assert_eq!(vega_position, Some(3));
}
}
#[cfg(test)]
mod tests_values_array {
use super::*;
#[test]
fn test_values_array_length() {
assert_eq!(BasicAxisTypes::VALUES.len(), 14);
}
#[test]
fn test_values_array_content() {
assert_eq!(BasicAxisTypes::VALUES[0], BasicAxisTypes::Delta);
assert_eq!(BasicAxisTypes::VALUES[1], BasicAxisTypes::Gamma);
assert_eq!(BasicAxisTypes::VALUES[2], BasicAxisTypes::Theta);
assert_eq!(BasicAxisTypes::VALUES[3], BasicAxisTypes::Vega);
assert_eq!(BasicAxisTypes::VALUES[4], BasicAxisTypes::Volatility);
assert_eq!(BasicAxisTypes::VALUES[5], BasicAxisTypes::Price);
assert_eq!(BasicAxisTypes::VALUES[6], BasicAxisTypes::UnderlyingPrice);
assert_eq!(BasicAxisTypes::VALUES[7], BasicAxisTypes::Strike);
assert_eq!(BasicAxisTypes::VALUES[8], BasicAxisTypes::Expiration);
assert_eq!(BasicAxisTypes::VALUES[9], BasicAxisTypes::Vanna);
assert_eq!(BasicAxisTypes::VALUES[10], BasicAxisTypes::Vomma);
assert_eq!(BasicAxisTypes::VALUES[11], BasicAxisTypes::Veta);
assert_eq!(BasicAxisTypes::VALUES[12], BasicAxisTypes::Charm);
assert_eq!(BasicAxisTypes::VALUES[13], BasicAxisTypes::Color);
}
#[test]
fn test_values_array_order_consistency() {
let iter_values: Vec<BasicAxisTypes> = BasicAxisTypes::iter().collect();
for (i, &value) in BasicAxisTypes::VALUES.iter().enumerate() {
assert_eq!(value, iter_values[i]);
}
}
#[test]
fn test_direct_array_access() {
for i in 0..BasicAxisTypes::VALUES.len() {
let _axis_type = BasicAxisTypes::VALUES[i];
}
}
}