use super::types::{RecordClass, RecordType};
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Question {
qname: String,
qtype: RecordType,
qclass: RecordClass,
}
impl Question {
pub fn new(qname: String, qtype: RecordType, qclass: RecordClass) -> Self {
Self {
qname,
qtype,
qclass,
}
}
pub fn qname(&self) -> &str {
&self.qname
}
pub fn qtype(&self) -> RecordType {
self.qtype
}
pub fn qclass(&self) -> RecordClass {
self.qclass
}
pub fn set_qname(&mut self, qname: String) {
self.qname = qname;
}
pub fn set_qtype(&mut self, qtype: RecordType) {
self.qtype = qtype;
}
pub fn set_qclass(&mut self, qclass: RecordClass) {
self.qclass = qclass;
}
}
impl fmt::Display for Question {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}\t{}\t{}", self.qname, self.qclass, self.qtype)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_question_creation() {
let question = Question::new("example.com".to_string(), RecordType::A, RecordClass::IN);
assert_eq!(question.qname(), "example.com");
assert_eq!(question.qtype(), RecordType::A);
assert_eq!(question.qclass(), RecordClass::IN);
}
#[test]
fn test_question_setters() {
let mut question = Question::new("example.com".to_string(), RecordType::A, RecordClass::IN);
question.set_qname("test.com".to_string());
question.set_qtype(RecordType::AAAA);
question.set_qclass(RecordClass::CH);
assert_eq!(question.qname(), "test.com");
assert_eq!(question.qtype(), RecordType::AAAA);
assert_eq!(question.qclass(), RecordClass::CH);
}
#[test]
fn test_question_display() {
let question = Question::new("example.com".to_string(), RecordType::A, RecordClass::IN);
let display = format!("{}", question);
assert!(display.contains("example.com"));
assert!(display.contains("IN"));
assert!(display.contains("A"));
}
#[test]
fn test_question_equality() {
let q1 = Question::new("example.com".to_string(), RecordType::A, RecordClass::IN);
let q2 = Question::new("example.com".to_string(), RecordType::A, RecordClass::IN);
let q3 = Question::new("other.com".to_string(), RecordType::A, RecordClass::IN);
assert_eq!(q1, q2);
assert_ne!(q1, q3);
}
}