1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright (c) 2024-2025 R3BL LLC. Licensed under Apache License, Version 2.0.
//! All tests have been moved to
//! `fs_path.rs::test_all_fs_path_functions_in_isolated_process()` to prevent flakiness
//! when tests are run in parallel.
use crate::;
use ;
/// This macro is used to wrap a block with code that saves the current working directory,
/// runs the block of code for the test, and then restores the original working directory.
///
/// You might need to run tests that use this function in an isolated process. See tests
/// in [`mod@crate::script::fs_path`] as an example of how to do this.
///
/// # Examples
///
/// ## Sync usage - temporarily changes directory and restores it
///
/// ```no_run
/// # use std::env;
/// # use r3bl_tui::with_saved_pwd;
/// let result = with_saved_pwd!({
/// let _ = env::set_current_dir("/tmp");
/// // Operations here see /tmp as current directory
/// 42 // Return value from the block
/// });
/// assert_eq!(result, 42);
/// // Original directory is restored here
/// ```
///
/// ## Async usage - works with async code
///
/// ```no_run
/// # use r3bl_tui::with_saved_pwd;
/// # async fn async_example() {
/// let result = with_saved_pwd!(async {
/// let _ = std::env::set_current_dir("/tmp");
/// // Operations here see /tmp as current directory
/// // Can use .await and async operations here
/// // Directory is restored when block completes
/// "done" // Return value from the block
/// });
/// assert_eq!(result, "done");
/// # }
/// ```
/// Change cwd for current process. This is potentially dangerous, as it can
/// affect other parts of the program that rely on the current working directory.
/// Use with caution. An example of this is when running tests in parallel in `cargo
/// test`. `cargo test` runs all the tests in a single process. This means that when one
/// test changes the current working directory, it affects all other tests that run after
/// it.
///
/// # Errors
///
/// Returns an error if:
/// - The directory does not exist
/// - Insufficient permissions to access the directory
/// - The directory name is invalid
/// - I/O errors occur while changing the directory