use super::mutation::MutationKey;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Deleter {
key: MutationKey,
}
impl Deleter {
pub fn for_class(
class_name: impl Into<String>,
class_version: u32,
) -> Self {
Self { key: MutationKey::for_class(class_name, class_version) }
}
pub fn for_field(
class_name: impl Into<String>,
class_version: u32,
field_name: impl Into<String>,
) -> Self {
Self {
key: MutationKey::for_field(class_name, class_version, field_name),
}
}
pub fn key(&self) -> &MutationKey {
&self.key
}
pub fn class_name(&self) -> &str {
self.key.class_name()
}
pub fn class_version(&self) -> u32 {
self.key.class_version()
}
pub fn field_name(&self) -> Option<&str> {
self.key.field_name()
}
}
impl std::fmt::Display for Deleter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[Deleter {}]", self.key)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_class_deleter() {
let d = Deleter::for_class("my.pkg.Stats", 0);
assert_eq!(d.class_name(), "my.pkg.Stats");
assert_eq!(d.class_version(), 0);
assert_eq!(d.field_name(), None);
}
#[test]
fn test_field_deleter() {
let d = Deleter::for_field("my.pkg.Person", 0, "favoriteColors");
assert_eq!(d.class_name(), "my.pkg.Person");
assert_eq!(d.class_version(), 0);
assert_eq!(d.field_name(), Some("favoriteColors"));
}
#[test]
fn test_equality() {
let a = Deleter::for_class("X", 1);
let b = Deleter::for_class("X", 1);
assert_eq!(a, b);
}
#[test]
fn test_inequality_version() {
let a = Deleter::for_class("X", 0);
let b = Deleter::for_class("X", 1);
assert_ne!(a, b);
}
#[test]
fn test_display_class() {
let d = Deleter::for_class("com.example.Stats", 0);
let s = d.to_string();
assert!(s.contains("Deleter"));
assert!(s.contains("com.example.Stats"));
}
#[test]
fn test_display_field() {
let d = Deleter::for_field("com.example.Person", 2, "oldField");
let s = d.to_string();
assert!(s.contains("Deleter"));
assert!(s.contains("oldField"));
}
}