summaryrefslogtreecommitdiff
path: root/cli/tools/test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools/test.rs')
-rw-r--r--cli/tools/test.rs138
1 files changed, 70 insertions, 68 deletions
diff --git a/cli/tools/test.rs b/cli/tools/test.rs
index 8d005b101..e14b5cc8b 100644
--- a/cli/tools/test.rs
+++ b/cli/tools/test.rs
@@ -1,8 +1,11 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
use crate::ast::Location;
+use crate::cache;
+use crate::cache::CacherLoader;
use crate::colors;
use crate::create_main_worker;
+use crate::emit;
use crate::file_fetcher::File;
use crate::file_watcher;
use crate::file_watcher::ResolutionResult;
@@ -11,15 +14,13 @@ use crate::fs_util::collect_specifiers;
use crate::fs_util::is_supported_test_ext;
use crate::fs_util::is_supported_test_path;
use crate::located_script_name;
-use crate::module_graph;
-use crate::module_graph::GraphBuilder;
-use crate::module_graph::Module;
-use crate::module_graph::TypeLib;
+use crate::lockfile;
use crate::ops;
use crate::proc_state::ProcState;
+use crate::resolver::ImportMapResolver;
use crate::tokio_util;
use crate::tools::coverage::CoverageCollector;
-use crate::FetchHandler;
+
use deno_ast::swc::common::comments::CommentKind;
use deno_ast::MediaType;
use deno_core::error::generic_error;
@@ -28,7 +29,6 @@ use deno_core::futures::future;
use deno_core::futures::stream;
use deno_core::futures::FutureExt;
use deno_core::futures::StreamExt;
-use deno_core::parking_lot::Mutex;
use deno_core::serde_json::json;
use deno_core::JsRuntime;
use deno_core::ModuleSpecifier;
@@ -500,7 +500,7 @@ async fn check_specifiers(
ps: ProcState,
permissions: Permissions,
specifiers: Vec<(ModuleSpecifier, TestMode)>,
- lib: TypeLib,
+ lib: emit::TypeLib,
) -> Result<(), AnyError> {
let inline_files = fetch_inline_files(
ps.clone(),
@@ -527,12 +527,12 @@ async fn check_specifiers(
ps.file_fetcher.insert_cached(file);
}
- ps.prepare_module_graph(
+ ps.prepare_module_load(
specifiers,
+ false,
lib.clone(),
Permissions::allow_all(),
permissions.clone(),
- ps.maybe_import_map.clone(),
)
.await?;
}
@@ -548,12 +548,12 @@ async fn check_specifiers(
})
.collect();
- ps.prepare_module_graph(
+ ps.prepare_module_load(
module_specifiers,
+ false,
lib,
Permissions::allow_all(),
permissions,
- ps.maybe_import_map.clone(),
)
.await?;
@@ -743,11 +743,14 @@ fn collect_specifiers_with_test_mode(
Ok(specifiers_with_mode)
}
-/// Collects module and document specifiers with test modes via `collect_specifiers_with_test_mode`
-/// which are then pre-fetched and adjusted based on the media type.
+/// Collects module and document specifiers with test modes via
+/// `collect_specifiers_with_test_mode` which are then pre-fetched and adjusted
+/// based on the media type.
///
-/// Specifiers that do not have a known media type that can be executed as a module are marked as
-/// `TestMode::Documentation`.
+/// Specifiers that do not have a known media type that can be executed as a
+/// module are marked as `TestMode::Documentation`. Type definition files
+/// cannot be run, and therefore need to be marked as `TestMode::Documentation`
+/// as well.
async fn fetch_specifiers_with_test_mode(
ps: ProcState,
include: Vec<String>,
@@ -762,7 +765,9 @@ async fn fetch_specifiers_with_test_mode(
.fetch(specifier, &mut Permissions::allow_all())
.await?;
- if file.media_type == MediaType::Unknown {
+ if file.media_type == MediaType::Unknown
+ || file.media_type == MediaType::Dts
+ {
*mode = TestMode::Documentation
}
}
@@ -798,9 +803,9 @@ pub async fn run_tests(
}
let lib = if flags.unstable {
- TypeLib::UnstableDenoWindow
+ emit::TypeLib::UnstableDenoWindow
} else {
- TypeLib::DenoWindow
+ emit::TypeLib::DenoWindow
};
check_specifiers(
@@ -845,26 +850,33 @@ pub async fn run_tests_with_watch(
let permissions = Permissions::from_options(&flags.clone().into());
let lib = if flags.unstable {
- TypeLib::UnstableDenoWindow
+ emit::TypeLib::UnstableDenoWindow
} else {
- TypeLib::DenoWindow
+ emit::TypeLib::DenoWindow
};
- let handler = Arc::new(Mutex::new(FetchHandler::new(
- &ps,
- Permissions::allow_all(),
- Permissions::allow_all(),
- )?));
-
let include = include.unwrap_or_else(|| vec![".".to_string()]);
let paths_to_watch: Vec<_> = include.iter().map(PathBuf::from).collect();
let resolver = |changed: Option<Vec<PathBuf>>| {
+ let mut cache = cache::FetchCacher::new(
+ ps.dir.gen_cache.clone(),
+ ps.file_fetcher.clone(),
+ Permissions::allow_all(),
+ Permissions::allow_all(),
+ );
+
let paths_to_watch = paths_to_watch.clone();
let paths_to_watch_clone = paths_to_watch.clone();
- let handler = handler.clone();
- let ps = ps.clone();
+ let maybe_resolver =
+ ps.maybe_import_map.as_ref().map(ImportMapResolver::new);
+ let maybe_locker = lockfile::as_maybe_locker(ps.lockfile.clone());
+ let maybe_imports = ps
+ .maybe_config_file
+ .as_ref()
+ .map(|cf| cf.to_maybe_imports())
+ .flatten();
let files_changed = changed.is_some();
let include = include.clone();
let ignore = ignore.clone();
@@ -886,61 +898,51 @@ pub async fn run_tests_with_watch(
.collect()
};
- let mut builder = GraphBuilder::new(
- handler,
- ps.maybe_import_map.clone(),
- ps.lockfile.clone(),
- );
- for specifier in test_modules.iter() {
- builder.add(specifier, false).await?;
- }
- builder.analyze_config_file(&ps.maybe_config_file).await?;
- let graph = builder.get_graph();
+ let graph = deno_graph::create_graph(
+ test_modules.clone(),
+ false,
+ maybe_imports,
+ cache.as_mut_loader(),
+ maybe_resolver.as_ref().map(|r| r.as_resolver()),
+ maybe_locker,
+ None,
+ )
+ .await;
+ graph.valid()?;
+ // TODO(@kitsonk) - This should be totally derivable from the graph.
for specifier in test_modules {
fn get_dependencies<'a>(
- graph: &'a module_graph::Graph,
- module: &'a Module,
+ graph: &'a deno_graph::ModuleGraph,
+ maybe_module: Option<&'a deno_graph::Module>,
// This needs to be accessible to skip getting dependencies if they're already there,
// otherwise this will cause a stack overflow with circular dependencies
output: &mut HashSet<&'a ModuleSpecifier>,
- ) -> Result<(), AnyError> {
- for dep in module.dependencies.values() {
- if let Some(specifier) = &dep.maybe_code {
- if !output.contains(specifier) {
- output.insert(specifier);
-
- get_dependencies(
- graph,
- graph.get_specifier(specifier)?,
- output,
- )?;
+ ) {
+ if let Some(module) = maybe_module {
+ for dep in module.dependencies.values() {
+ if let Some(specifier) = &dep.get_code() {
+ if !output.contains(specifier) {
+ output.insert(specifier);
+
+ get_dependencies(graph, graph.get(specifier), output);
+ }
}
- }
- if let Some(specifier) = &dep.maybe_type {
- if !output.contains(specifier) {
- output.insert(specifier);
-
- get_dependencies(
- graph,
- graph.get_specifier(specifier)?,
- output,
- )?;
+ if let Some(specifier) = &dep.get_type() {
+ if !output.contains(specifier) {
+ output.insert(specifier);
+
+ get_dependencies(graph, graph.get(specifier), output);
+ }
}
}
}
-
- Ok(())
}
// This test module and all it's dependencies
let mut modules = HashSet::new();
modules.insert(&specifier);
- get_dependencies(
- &graph,
- graph.get_specifier(&specifier)?,
- &mut modules,
- )?;
+ get_dependencies(&graph, graph.get(&specifier), &mut modules);
paths_to_watch.extend(
modules