use nu_cli::{NushellPrompt, update_prompt};
use nu_protocol::{
Config, Span, Value,
engine::{EngineState, Stack},
};
use nu_test_support::nu;
use reedline::{Prompt, PromptEditMode};
use std::sync::Arc;
fn create_test_engine() -> (EngineState, Stack, Arc<Config>) {
let mut engine_state =
nu_command::add_shell_command_context(nu_cmd_lang::create_default_context());
engine_state.generate_nu_constant();
let mut stack = Stack::new();
stack.add_env_var(
"PROMPT_COMMAND".to_string(),
Value::string("❯ ".to_string(), Span::test_data()),
);
stack.add_env_var(
"PROMPT_INDICATOR".to_string(),
Value::string("> ".to_string(), Span::test_data()),
);
stack.add_env_var(
"PROMPT_COMMAND_RIGHT".to_string(),
Value::string("~/code".to_string(), Span::test_data()),
);
stack.add_env_var(
"PROMPT_MULTILINE_INDICATOR".to_string(),
Value::string("... ".to_string(), Span::test_data()),
);
stack.add_env_var(
"PWD".to_string(),
Value::string("/test".to_string(), Span::test_data()),
);
let config = engine_state.get_config().clone();
(engine_state, stack, config)
}
#[test]
fn test_update_prompt_with_osc133() {
let (engine_state, mut stack, config) = create_test_engine();
let mut prompt = NushellPrompt::new();
update_prompt(&config, &engine_state, &mut stack, &mut prompt);
let left = prompt.render_prompt_left();
let indicator = prompt.render_prompt_indicator(PromptEditMode::Default);
let right = prompt.render_prompt_right();
let multiline = prompt.render_prompt_multiline_indicator();
assert_eq!(left.as_ref(), "❯ ");
assert_eq!(indicator.as_ref(), "> ");
assert_eq!(right.as_ref(), "~/code");
assert_eq!(multiline.as_ref(), "... ");
}
#[test]
fn test_update_prompt_with_osc633() {
let (engine_state, mut stack, config) = create_test_engine();
let mut prompt = NushellPrompt::new();
update_prompt(&config, &engine_state, &mut stack, &mut prompt);
let left = prompt.render_prompt_left();
assert_eq!(left.as_ref(), "❯ ");
}
#[test]
fn test_update_prompt_left_and_right() {
let (engine_state, mut stack, config) = create_test_engine();
let mut prompt = NushellPrompt::new();
update_prompt(&config, &engine_state, &mut stack, &mut prompt);
let left = prompt.render_prompt_left();
let right = prompt.render_prompt_right();
assert_eq!(left.as_ref(), "❯ ");
assert_eq!(right.as_ref(), "~/code");
}
#[test]
fn test_update_prompt_multiline() {
let (engine_state, mut stack, config) = create_test_engine();
let mut prompt = NushellPrompt::new();
update_prompt(&config, &engine_state, &mut stack, &mut prompt);
let multiline = prompt.render_prompt_multiline_indicator();
assert_eq!(multiline.as_ref(), "... ");
}
#[test]
fn test_update_prompt_with_missing_vars() {
let mut engine_state =
nu_command::add_shell_command_context(nu_cmd_lang::create_default_context());
engine_state.generate_nu_constant();
let mut stack = Stack::new();
stack.add_env_var(
"PWD".to_string(),
Value::string("/test".to_string(), Span::test_data()),
);
let config = (*engine_state.get_config()).clone();
let mut prompt = NushellPrompt::new();
update_prompt(&config, &engine_state, &mut stack, &mut prompt);
let left = prompt.render_prompt_left();
assert!(!left.as_ref().is_empty());
}
#[test]
fn test_osc133_config_toggle() {
let result = nu!("$env.config.shell_integration.osc133");
assert_eq!(result.out, "true");
let result = nu!("
$env.config.shell_integration.osc133 = false
$env.config.shell_integration.osc133
");
assert_eq!(result.out, "false");
}
#[test]
fn test_osc633_config_toggle() {
let result = nu!("$env.config.shell_integration.osc633");
assert_eq!(result.out, "true");
let result = nu!("
$env.config.shell_integration.osc633 = false
$env.config.shell_integration.osc633
");
assert_eq!(result.out, "false");
}