1use log::Level;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
4#[repr(u32)]
5pub enum ConsoleFunc {
6 Assert = 1,
7 Log = 2,
8 Debug = 3,
9 Trace = 4,
10 Info = 5,
11 Warn = 6,
12 Error = 7,
13 Exception = 8,
14 Dir = 9,
15}
16
17impl ConsoleFunc {
18 pub fn level(&self) -> Level {
19 match *self {
20 Self::Assert => Level::Error,
21 Self::Log => Level::Debug,
22 Self::Debug => Level::Debug,
23 Self::Trace => Level::Trace,
24 Self::Info => Level::Info,
25 Self::Warn => Level::Warn,
26 Self::Error => Level::Error,
27 Self::Exception => Level::Error,
28 Self::Dir => Level::Debug,
29 }
30 }
31}
32
33impl From<u32> for ConsoleFunc {
34 fn from(value: u32) -> Self {
35 match value {
36 1 => Self::Assert,
37 2 => Self::Log,
38 3 => Self::Debug,
39 4 => Self::Trace,
40 5 => Self::Info,
41 6 => Self::Warn,
42 7 => Self::Error,
43 8 => Self::Exception,
44 9 => Self::Dir,
45 _ => Self::Log,
46 }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use std::sync::{Arc, Mutex};
53 use crate::{ConsoleFunc, DukContext, JsEngine, JsError, JsInterop, Return};
54
55 #[derive(Clone, Debug)]
56 struct ConsoleInterop {
57 messages: Arc<Mutex<Vec<String>>>
58 }
59
60 impl JsInterop for ConsoleInterop {
61 fn call(&mut self, _engine: &mut DukContext, _func_name: &str) -> Result<Return, JsError> {
62 Ok(Return::Error)
63 }
64
65 fn console(&mut self, func: ConsoleFunc, msg: &str) {
66 self.messages.lock().unwrap().push(format!("{}: {}", func.level(), msg));
67 }
68 }
69
70 #[test]
71 fn test_console() {
72 let interop = ConsoleInterop {
73 messages: Arc::new(Mutex::new(Vec::new()))
74 };
75 let engine = JsEngine::with_interop(interop.clone()).unwrap();
76 engine.init_console();
77
78 engine.eval("console.log('test message')").unwrap();
79
80 let messages = interop.messages.lock().unwrap();
81 assert_eq!(messages.len(), 1);
82 assert_eq!(messages[0], "DEBUG: test message");
83 }
84
85 #[test]
86 fn test_console_in_new_globalenv() {
87 let interop = ConsoleInterop {
88 messages: Arc::new(Mutex::new(Vec::new()))
89 };
90 let engine = JsEngine::with_interop(interop.clone()).unwrap();
91
92 let idx = engine.push_thread_new_globalenv();
93 let ctx = engine.get_context(idx).unwrap();
94 ctx.init_console();
95
96 ctx.eval("console.log('test message')").unwrap();
97
98 let messages = interop.messages.lock().unwrap();
99 assert_eq!(messages.len(), 1);
100 assert_eq!(messages[0], "DEBUG: test message");
101 }
102}