autoagents_core/agent/
task.rs

1#[cfg(not(target_arch = "wasm32"))]
2use crate::actor::{ActorMessage, CloneableMessage};
3use crate::protocol::SubmissionId;
4use autoagents_llm::chat::ImageMime;
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7use uuid::Uuid;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Task {
11    pub prompt: String,
12    pub image: Option<(ImageMime, Vec<u8>)>,
13    pub submission_id: SubmissionId,
14    pub completed: bool,
15    pub result: Option<Value>,
16}
17
18impl Task {
19    pub fn new<T: Into<String>>(task: T) -> Self {
20        Self {
21            prompt: task.into(),
22            image: None,
23            submission_id: Uuid::new_v4(),
24            completed: false,
25            result: None,
26        }
27    }
28
29    pub fn new_with_image<T: Into<String>>(
30        task: T,
31        image_mime: ImageMime,
32        image_data: Vec<u8>,
33    ) -> Self {
34        Self {
35            prompt: task.into(),
36            image: Some((image_mime, image_data)),
37            submission_id: Uuid::new_v4(),
38            completed: false,
39            result: None,
40        }
41    }
42}
43
44#[cfg(not(target_arch = "wasm32"))]
45impl ActorMessage for Task {}
46#[cfg(not(target_arch = "wasm32"))]
47impl CloneableMessage for Task {}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use serde_json::json;
53
54    #[test]
55    fn test_task_creation() {
56        let task = Task::new("Test task");
57
58        assert_eq!(task.prompt, "Test task");
59        assert!(!task.completed);
60        assert!(task.result.is_none());
61        assert!(!task.submission_id.is_nil());
62    }
63
64    #[test]
65    fn test_task_creation_with_string() {
66        let task_str = "Another test task".to_string();
67        let task = Task::new(task_str);
68
69        assert_eq!(task.prompt, "Another test task");
70    }
71
72    #[test]
73    fn test_task_serialization() {
74        let task = Task::new("Serialize me");
75
76        // Test serialization
77        let serialized = serde_json::to_string(&task).unwrap();
78        assert!(serialized.contains("Serialize me"));
79        assert!(serialized.contains("submission_id"));
80        assert!(serialized.contains("completed"));
81
82        // Test deserialization
83        let deserialized: Task = serde_json::from_str(&serialized).unwrap();
84        assert_eq!(deserialized.prompt, task.prompt);
85        assert_eq!(deserialized.submission_id, task.submission_id);
86        assert_eq!(deserialized.completed, task.completed);
87    }
88
89    #[test]
90    fn test_task_with_result() {
91        let mut task = Task::new("Task with result");
92        let result_value = json!({"output": "success", "value": 42});
93        task.result = Some(result_value.clone());
94        task.completed = true;
95
96        assert!(task.completed);
97        assert_eq!(task.result, Some(result_value));
98    }
99
100    #[test]
101    fn test_task_unique_submission_ids() {
102        let task1 = Task::new("Task 1");
103        let task2 = Task::new("Task 2");
104
105        assert_ne!(task1.submission_id, task2.submission_id);
106    }
107
108    #[test]
109    fn test_task_clone() {
110        let original = Task::new("Original task");
111        let cloned = original.clone();
112
113        assert_eq!(original.prompt, cloned.prompt);
114        assert_eq!(original.submission_id, cloned.submission_id);
115        assert_eq!(original.completed, cloned.completed);
116        assert_eq!(original.result, cloned.result);
117    }
118
119    #[test]
120    fn test_task_debug() {
121        let task = Task::new("Debug test");
122        let debug_str = format!("{task:?}");
123
124        assert!(debug_str.contains("Task"));
125        assert!(debug_str.contains("Debug test"));
126    }
127
128    #[test]
129    fn test_task_with_image() {
130        let image_data = vec![0x89, 0x50, 0x4E, 0x47]; // PNG header bytes
131        let task = Task::new_with_image("Task with image", ImageMime::PNG, image_data.clone());
132
133        assert_eq!(task.prompt, "Task with image");
134        assert!(task.image.is_some());
135        if let Some((mime, data)) = &task.image {
136            assert_eq!(*mime, ImageMime::PNG);
137            assert_eq!(*data, image_data);
138        }
139        assert!(!task.completed);
140        assert!(task.result.is_none());
141    }
142
143    #[test]
144    fn test_task_without_image() {
145        let task = Task::new("Task without image");
146
147        assert_eq!(task.prompt, "Task without image");
148        assert!(task.image.is_none());
149        assert!(!task.completed);
150        assert!(task.result.is_none());
151    }
152
153    #[test]
154    fn test_task_image_serialization() {
155        let image_data = vec![0xFF, 0xD8, 0xFF, 0xE0]; // JPEG header bytes
156        let task = Task::new_with_image("Serialize with image", ImageMime::JPEG, image_data);
157
158        // Test serialization
159        let serialized = serde_json::to_string(&task).unwrap();
160        assert!(serialized.contains("Serialize with image"));
161        assert!(serialized.contains("image"));
162
163        // Test deserialization
164        let deserialized: Task = serde_json::from_str(&serialized).unwrap();
165        assert_eq!(deserialized.prompt, task.prompt);
166        assert_eq!(deserialized.image, task.image);
167        assert_eq!(deserialized.submission_id, task.submission_id);
168    }
169}