diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2023-10-05 21:45:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-05 21:45:11 +0100 |
commit | ac464ead49c9f676d7117baa2ab06433e132e188 (patch) | |
tree | 646d0674bb8d585478d3520b61785c7d453044e3 /cli/tools/repl/session.rs | |
parent | 820e93e3e742a22f010f3200312039c50ae0d63a (diff) |
feat(jupyter): support Deno.test() (#20778)
Diffstat (limited to 'cli/tools/repl/session.rs')
-rw-r--r-- | cli/tools/repl/session.rs | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs index f833fbf5d..338a253d2 100644 --- a/cli/tools/repl/session.rs +++ b/cli/tools/repl/session.rs @@ -9,6 +9,13 @@ use crate::colors; use crate::lsp::ReplLanguageServer; use crate::npm::CliNpmResolver; use crate::resolver::CliGraphResolver; +use crate::tools::test::report_tests; +use crate::tools::test::reporters::PrettyTestReporter; +use crate::tools::test::reporters::TestReporter; +use crate::tools::test::run_tests_for_worker; +use crate::tools::test::worker_has_tests; +use crate::tools::test::TestEvent; +use crate::tools::test::TestEventSender; use deno_ast::swc::ast as swc_ast; use deno_ast::swc::visit::noop_visit_type; @@ -23,6 +30,7 @@ use deno_core::futures::FutureExt; use deno_core::futures::StreamExt; use deno_core::serde_json; use deno_core::serde_json::Value; +use deno_core::unsync::spawn; use deno_core::LocalInspectorSession; use deno_graph::source::Resolver; use deno_runtime::worker::MainWorker; @@ -131,6 +139,11 @@ pub struct ReplSession { pub language_server: ReplLanguageServer, pub notifications: Rc<RefCell<UnboundedReceiver<Value>>>, referrer: ModuleSpecifier, + main_module: ModuleSpecifier, + test_reporter_factory: Box<dyn Fn() -> Box<dyn TestReporter>>, + test_event_sender: TestEventSender, + /// This is only optional because it's temporarily taken when evaluating. + test_event_receiver: Option<tokio::sync::mpsc::UnboundedReceiver<TestEvent>>, } impl ReplSession { @@ -139,6 +152,9 @@ impl ReplSession { npm_resolver: Arc<dyn CliNpmResolver>, resolver: Arc<CliGraphResolver>, mut worker: MainWorker, + main_module: ModuleSpecifier, + test_event_sender: TestEventSender, + test_event_receiver: tokio::sync::mpsc::UnboundedReceiver<TestEvent>, ) -> Result<Self, AnyError> { let language_server = ReplLanguageServer::new_initialized().await?; let mut session = worker.create_inspector_session().await; @@ -189,6 +205,12 @@ impl ReplSession { language_server, referrer, notifications: Rc::new(RefCell::new(notification_rx)), + test_reporter_factory: Box::new(|| { + Box::new(PrettyTestReporter::new(false, true, false, true)) + }), + main_module, + test_event_sender, + test_event_receiver: Some(test_event_receiver), }; // inject prelude @@ -197,6 +219,13 @@ impl ReplSession { Ok(repl_session) } + pub fn set_test_reporter_factory( + &mut self, + f: Box<dyn Fn() -> Box<dyn TestReporter>>, + ) { + self.test_reporter_factory = f; + } + pub async fn closing(&mut self) -> Result<bool, AnyError> { let closed = self .evaluate_expression("(this.closed)") @@ -325,7 +354,7 @@ impl ReplSession { // If that fails, we retry it without wrapping in parens letting the error bubble up to the // user if it is still an error. - if wrapped_line != line + let result = if wrapped_line != line && (evaluate_response.is_err() || evaluate_response .as_ref() @@ -337,7 +366,29 @@ impl ReplSession { self.evaluate_ts_expression(line).await } else { evaluate_response + }; + + if worker_has_tests(&mut self.worker) { + let report_tests_handle = spawn(report_tests( + self.test_event_receiver.take().unwrap(), + (self.test_reporter_factory)(), + )); + run_tests_for_worker( + &mut self.worker, + &self.main_module, + &Default::default(), + &Default::default(), + ) + .await + .unwrap(); + self + .test_event_sender + .send(TestEvent::ForceEndReport) + .unwrap(); + self.test_event_receiver = Some(report_tests_handle.await.unwrap().1); } + + result } async fn set_last_thrown_error( |