summaryrefslogtreecommitdiff
path: root/cli/tools/test.rs
diff options
context:
space:
mode:
authorGeert-Jan Zwiers <geertjanzwiers@protonmail.com>2023-01-13 22:39:19 +0100
committerGitHub <noreply@github.com>2023-01-13 22:39:19 +0100
commit052bcc62bba6f5b25eb016a5c8ebf0716ba5a0dc (patch)
treea33da4af3c41a48f29c4c3d6714cc36b08b3a080 /cli/tools/test.rs
parent225114166aa7426d4b93fa13635559029c5ba65d (diff)
refactor(cli/tools): reduce cloning (#17309)
Diffstat (limited to 'cli/tools/test.rs')
-rw-r--r--cli/tools/test.rs143
1 files changed, 72 insertions, 71 deletions
diff --git a/cli/tools/test.rs b/cli/tools/test.rs
index 597666e73..6519a3ca3 100644
--- a/cli/tools/test.rs
+++ b/cli/tools/test.rs
@@ -712,7 +712,7 @@ pub fn format_test_error(js_error: &JsError) -> String {
/// Test a single specifier as documentation containing test programs, an executable test module or
/// both.
async fn test_specifier(
- ps: ProcState,
+ ps: &ProcState,
permissions: Permissions,
specifier: ModuleSpecifier,
mode: TestMode,
@@ -723,13 +723,13 @@ async fn test_specifier(
let stdout = StdioPipe::File(sender.stdout());
let stderr = StdioPipe::File(sender.stderr());
let mut worker = create_main_worker_for_test_or_bench(
- &ps,
- specifier.clone(),
+ ps,
+ specifier,
PermissionsContainer::new(permissions),
vec![ops::testing::init(
sender,
fail_fast_tracker,
- options.filter.clone(),
+ options.filter,
)],
Stdio {
stdin: StdioPipe::Inherit,
@@ -892,7 +892,7 @@ fn extract_files_from_fenced_blocks(
}
async fn fetch_inline_files(
- ps: ProcState,
+ ps: &ProcState,
specifiers: Vec<ModuleSpecifier>,
) -> Result<Vec<File>, AnyError> {
let mut files = Vec::new();
@@ -909,7 +909,7 @@ async fn fetch_inline_files(
} else {
extract_files_from_source_comments(
&file.specifier,
- file.source.clone(),
+ file.source,
file.media_type,
)
};
@@ -928,7 +928,7 @@ pub async fn check_specifiers(
) -> Result<(), AnyError> {
let lib = ps.options.ts_type_lib_window();
let inline_files = fetch_inline_files(
- ps.clone(),
+ ps,
specifiers
.iter()
.filter_map(|(specifier, mode)| {
@@ -963,10 +963,10 @@ pub async fn check_specifiers(
}
let module_specifiers = specifiers
- .iter()
+ .into_iter()
.filter_map(|(specifier, mode)| {
- if *mode != TestMode::Documentation {
- Some(specifier.clone())
+ if mode != TestMode::Documentation {
+ Some(specifier)
} else {
None
}
@@ -988,14 +988,14 @@ pub async fn check_specifiers(
/// Test a collection of specifiers with test modes concurrently.
async fn test_specifiers(
ps: ProcState,
- permissions: Permissions,
+ permissions: &Permissions,
specifiers_with_mode: Vec<(ModuleSpecifier, TestMode)>,
options: TestSpecifierOptions,
) -> Result<(), AnyError> {
let log_level = ps.options.log_level();
let specifiers_with_mode = if let Some(seed) = ps.options.shuffle_tests() {
let mut rng = SmallRng::seed_from_u64(seed);
- let mut specifiers_with_mode = specifiers_with_mode.clone();
+ let mut specifiers_with_mode = specifiers_with_mode;
specifiers_with_mode.sort_by_key(|(specifier, _)| specifier.clone());
specifiers_with_mode.shuffle(&mut rng);
specifiers_with_mode
@@ -1004,48 +1004,47 @@ async fn test_specifiers(
};
let (sender, mut receiver) = unbounded_channel::<TestEvent>();
- let fail_fast_tracker = FailFastTracker::new(options.fail_fast);
let sender = TestEventSender::new(sender);
let concurrent_jobs = options.concurrent_jobs;
let join_handles =
- specifiers_with_mode.iter().map(move |(specifier, mode)| {
- let ps = ps.clone();
- let permissions = permissions.clone();
- let specifier = specifier.clone();
- let mode = mode.clone();
- let mut sender = sender.clone();
- let options = options.clone();
- let fail_fast_tracker = fail_fast_tracker.clone();
-
- tokio::task::spawn_blocking(move || {
- if fail_fast_tracker.should_stop() {
- return Ok(());
- }
+ specifiers_with_mode
+ .into_iter()
+ .map(move |(specifier, mode)| {
+ let ps = ps.clone();
+ let permissions = permissions.clone();
+ let mut sender = sender.clone();
+ let options = options.clone();
+ let fail_fast_tracker = FailFastTracker::new(options.fail_fast);
+
+ tokio::task::spawn_blocking(move || {
+ if fail_fast_tracker.should_stop() {
+ return Ok(());
+ }
- let origin = specifier.to_string();
- let file_result = run_local(test_specifier(
- ps,
- permissions,
- specifier,
- mode,
- sender.clone(),
- fail_fast_tracker,
- options,
- ));
- if let Err(error) = file_result {
- if error.is::<JsError>() {
- sender.send(TestEvent::UncaughtError(
- origin,
- Box::new(error.downcast::<JsError>().unwrap()),
- ))?;
- } else {
- return Err(error);
+ let origin = specifier.to_string();
+ let file_result = run_local(test_specifier(
+ &ps,
+ permissions,
+ specifier,
+ mode,
+ sender.clone(),
+ fail_fast_tracker,
+ options,
+ ));
+ if let Err(error) = file_result {
+ if error.is::<JsError>() {
+ sender.send(TestEvent::UncaughtError(
+ origin,
+ Box::new(error.downcast::<JsError>().unwrap()),
+ ))?;
+ } else {
+ return Err(error);
+ }
}
- }
- Ok(())
- })
- });
+ Ok(())
+ })
+ });
let join_stream = stream::iter(join_handles)
.buffer_unordered(concurrent_jobs.get())
@@ -1093,7 +1092,7 @@ async fn test_specifiers(
TestEvent::Result(id, result, elapsed) => {
if tests_with_result.insert(id) {
- let description = tests.get(&id).unwrap().clone();
+ let description = tests.get(&id).unwrap();
match &result {
TestResult::Ok => {
summary.passed += 1;
@@ -1109,7 +1108,7 @@ async fn test_specifiers(
unreachable!("should be handled in TestEvent::UncaughtError");
}
}
- reporter.report_result(&description, &result, elapsed);
+ reporter.report_result(description, &result, elapsed);
}
}
@@ -1236,13 +1235,13 @@ fn is_supported_test_ext(path: &Path) -> bool {
/// - Specifiers matching the `is_supported_test_path` are marked as `TestMode::Executable`.
/// - Specifiers matching both predicates are marked as `TestMode::Both`
fn collect_specifiers_with_test_mode(
- files: FilesConfig,
- include_inline: bool,
+ files: &FilesConfig,
+ include_inline: &bool,
) -> Result<Vec<(ModuleSpecifier, TestMode)>, AnyError> {
- let module_specifiers = collect_specifiers(&files, is_supported_test_path)?;
+ let module_specifiers = collect_specifiers(files, is_supported_test_path)?;
- if include_inline {
- return collect_specifiers(&files, is_supported_test_ext).map(
+ if *include_inline {
+ return collect_specifiers(files, is_supported_test_ext).map(
|specifiers| {
specifiers
.into_iter()
@@ -1278,10 +1277,11 @@ fn collect_specifiers_with_test_mode(
/// as well.
async fn fetch_specifiers_with_test_mode(
ps: &ProcState,
- files: FilesConfig,
- doc: bool,
+ files: &FilesConfig,
+ doc: &bool,
) -> Result<Vec<(ModuleSpecifier, TestMode)>, AnyError> {
let mut specifiers_with_mode = collect_specifiers_with_test_mode(files, doc)?;
+
for (specifier, mode) in &mut specifiers_with_mode {
let file = ps
.file_fetcher
@@ -1309,9 +1309,12 @@ pub async fn run_tests(
let permissions =
Permissions::from_options(&ps.options.permissions_options())?;
- let specifiers_with_mode =
- fetch_specifiers_with_test_mode(&ps, test_options.files, test_options.doc)
- .await?;
+ let specifiers_with_mode = fetch_specifiers_with_test_mode(
+ &ps,
+ &test_options.files,
+ &test_options.doc,
+ )
+ .await?;
if !test_options.allow_none && specifiers_with_mode.is_empty() {
return Err(generic_error("No test modules found"));
@@ -1326,7 +1329,7 @@ pub async fn run_tests(
test_specifiers(
ps,
- permissions,
+ &permissions,
specifiers_with_mode,
TestSpecifierOptions {
concurrent_jobs: test_options.concurrent_jobs,
@@ -1349,18 +1352,16 @@ pub async fn run_tests_with_watch(
// file would have impact on other files, which is undesirable.
let permissions =
Permissions::from_options(&ps.options.permissions_options())?;
-
- let paths_to_watch: Vec<_> = test_options.files.include.clone();
let no_check = ps.options.type_check_mode() == TypeCheckMode::None;
- let test_options = &test_options;
let ps = RefCell::new(ps);
let resolver = |changed: Option<Vec<PathBuf>>| {
- let paths_to_watch = paths_to_watch.clone();
+ let paths_to_watch = test_options.files.include.clone();
let paths_to_watch_clone = paths_to_watch.clone();
-
let files_changed = changed.is_some();
+ let test_options = &test_options;
+
let ps = ps.borrow().clone();
async move {
@@ -1477,16 +1478,16 @@ pub async fn run_tests_with_watch(
};
let operation = |modules_to_reload: Vec<(ModuleSpecifier, ModuleKind)>| {
- let permissions = permissions.clone();
+ let permissions = &permissions;
+ let test_options = &test_options;
ps.borrow_mut().reset_for_file_watcher();
let ps = ps.borrow().clone();
- let test_options = test_options.clone();
async move {
let specifiers_with_mode = fetch_specifiers_with_test_mode(
&ps,
- test_options.files,
- test_options.doc,
+ &test_options.files,
+ &test_options.doc,
)
.await?
.iter()
@@ -1505,7 +1506,7 @@ pub async fn run_tests_with_watch(
test_specifiers(
ps,
- permissions.clone(),
+ permissions,
specifiers_with_mode,
TestSpecifierOptions {
concurrent_jobs: test_options.concurrent_jobs,