summaryrefslogtreecommitdiff
path: root/cli/tools/repl/session.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2023-10-05 21:45:11 +0100
committerGitHub <noreply@github.com>2023-10-05 21:45:11 +0100
commitac464ead49c9f676d7117baa2ab06433e132e188 (patch)
tree646d0674bb8d585478d3520b61785c7d453044e3 /cli/tools/repl/session.rs
parent820e93e3e742a22f010f3200312039c50ae0d63a (diff)
feat(jupyter): support Deno.test() (#20778)
Diffstat (limited to 'cli/tools/repl/session.rs')
-rw-r--r--cli/tools/repl/session.rs53
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(