use openjd_expr::{ExprValue, ParsedExpression, PathFormat, SymbolTable};
fn eval_win(expr: &str) -> ExprValue {
let symtab = SymbolTable::new();
let parsed = ParsedExpression::new(expr).unwrap();
parsed
.with_path_format(PathFormat::Windows)
.evaluate(&[&symtab])
.unwrap()
}
fn eval_win_with(expr: &str, symtab: &SymbolTable) -> ExprValue {
let parsed = ParsedExpression::new(expr).unwrap();
parsed
.with_path_format(PathFormat::Windows)
.evaluate(&[symtab])
.unwrap()
}
#[test]
fn path_parent_uses_backslashes() {
let result = eval_win(r"path(r'C:\a\b\c').parent");
assert_eq!(result.to_display_string(), r"C:\a\b");
}
#[test]
fn path_join_uses_backslashes() {
let result = eval_win(r"path(r'C:\a\b') / 'c'");
assert_eq!(result.to_display_string(), r"C:\a\b\c");
}
#[test]
fn path_name_from_windows_path() {
let result = eval_win(r"path(r'C:\a\b\file.txt').name");
assert_eq!(result.to_display_string(), "file.txt");
}
#[test]
fn param_path_parent_uses_backslashes() {
let mut symtab = SymbolTable::new();
symtab
.set(
"Param.Dir",
ExprValue::new_path(
r"C:\projects\shot01\render".to_string(),
PathFormat::Windows,
),
)
.unwrap();
let result = eval_win_with("Param.Dir.parent", &symtab);
assert_eq!(result.to_display_string(), r"C:\projects\shot01");
}
#[test]
fn path_parent_typed() {
let result = eval_win(r"path(r'C:\x\y\z').parent");
assert_eq!(result.to_display_string(), r"C:\x\y");
}
#[test]
fn path_join_typed() {
let result = eval_win(r"path(r'C:\a') / 'b' / 'c'");
assert_eq!(result.to_display_string(), r"C:\a\b\c");
}
use openjd_model::CallerLimits;
use openjd_model::{
create_job, decode_job_template, preprocess_job_parameters, JobParameterInputValues,
};
#[test]
fn create_job_with_windows_path_parameter() {
let v: serde_json::Value = serde_saphyr::from_str(
r#"{
"specificationVersion": "jobtemplate-2023-09",
"name": "{{ Param.Dir }}",
"extensions": ["EXPR"],
"parameterDefinitions": [
{"name": "Dir", "type": "STRING", "default": "C:\\projects\\shot01\\render"}
],
"steps": [{"name": "Step", "script": {"actions": {"onRun": {"command": "echo hello"}}}}]
}"#,
)
.unwrap();
let jt = decode_job_template(v, Some(&["EXPR"]), &CallerLimits::default()).unwrap();
let mut input = JobParameterInputValues::new();
input.insert(
"Dir".into(),
ExprValue::String(r"C:\projects\shot01\render".into()),
);
let processed = preprocess_job_parameters(
&jt,
&input,
&[],
&openjd_model::PathParameterOptions {
job_template_dir: r"C:\tmp",
current_working_dir: r"C:\tmp",
allow_template_dir_walk_up: false,
path_format: PathFormat::Windows,
allow_uri_path_values: true,
},
)
.unwrap();
let job = create_job(&jt, &processed, &jt.default_validation_context()).unwrap();
assert_eq!(job.name, r"C:\projects\shot01\render");
}