kg_js/
console.rs

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}