puniyu_message 0.8.8

puniyu 消息链封装库,提供 Message 类型与 message! 构建宏
Documentation
use puniyu_element::send::{AtElement, Elements, FaceElement, TextElement};
use puniyu_message::message;

#[test]
fn test_macro_single_element() {
	let msg = message!(Elements::Text(TextElement::new("Hello")));
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 1);
	assert_eq!(elements[0].as_text(), Some("Hello"));
}

#[test]
fn test_macro_multiple_elements() {
	let msg = message!(
		Elements::At(AtElement::new("123456")),
		Elements::Text(TextElement::new(" Hello")),
		Elements::Face(FaceElement::new(178u64)),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 3);
	assert!(elements[0].as_at().is_some());
	assert_eq!(elements[1].as_text(), Some(" Hello"));
	assert!(elements[2].as_face().is_some());
}

#[test]
fn test_macro_trailing_comma() {
	let msg = message!(
		Elements::Text(TextElement::new("First")),
		Elements::Text(TextElement::new("Second")),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 2);
}

#[test]
fn test_macro_no_trailing_comma() {
	let msg = message!(
		Elements::Text(TextElement::new("First")),
		Elements::Text(TextElement::new("Second"))
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 2);
}

#[test]
fn test_macro_with_variables() {
	let text = TextElement::new("Variable text");
	let at = AtElement::new("user123");

	let msg = message!(Elements::Text(text), Elements::At(at));
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 2);
	assert_eq!(elements[0].as_text(), Some("Variable text"));
	assert_eq!(elements[1].as_at().unwrap().target_id, "user123");
}

#[test]
fn test_macro_complex_message() {
	let msg = message!(
		Elements::At(AtElement::new("all")),
		Elements::Text(TextElement::new(" Announcement: ")),
		Elements::Text(TextElement::new("Important message")),
		Elements::Face(FaceElement::new(1u64)),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 4);
	assert_eq!(elements[0].as_at().unwrap().target_id, "all");
	assert_eq!(elements[1].as_text(), Some(" Announcement: "));
	assert_eq!(elements[2].as_text(), Some("Important message"));
	assert_eq!(elements[3].as_face().unwrap().id, 1u64);
}

#[test]
fn test_macro_only_text() {
	let msg = message!(
		Elements::Text(TextElement::new("Line 1")),
		Elements::Text(TextElement::new("Line 2")),
		Elements::Text(TextElement::new("Line 3")),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 3);
	assert_eq!(elements[0].as_text(), Some("Line 1"));
	assert_eq!(elements[1].as_text(), Some("Line 2"));
	assert_eq!(elements[2].as_text(), Some("Line 3"));
}

#[test]
fn test_macro_only_at() {
	let msg = message!(
		Elements::At(AtElement::new("user1")),
		Elements::At(AtElement::new("user2")),
		Elements::At(AtElement::new("user3")),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 3);
	assert_eq!(elements[0].as_at().unwrap().target_id, "user1");
	assert_eq!(elements[1].as_at().unwrap().target_id, "user2");
	assert_eq!(elements[2].as_at().unwrap().target_id, "user3");
}

#[test]
fn test_macro_only_face() {
	let msg = message!(
		Elements::Face(FaceElement::new(1u64)),
		Elements::Face(FaceElement::new(2u64)),
		Elements::Face(FaceElement::new(3u64)),
	);
	let elements: Vec<Elements> = msg.into();

	assert_eq!(elements.len(), 3);
	assert_eq!(elements[0].as_face().unwrap().id, 1u64);
	assert_eq!(elements[1].as_face().unwrap().id, 2u64);
	assert_eq!(elements[2].as_face().unwrap().id, 3u64);
}