pub mod common;
use anyhow::Result;
#[test]
fn garden_root() {
let config = common::garden_config();
let expect_src_dir = "/home/test/src".to_string();
assert_eq!("${root}", config.root.get_expr());
assert_eq!(Some(&expect_src_dir), config.root.get_value());
assert_eq!(expect_src_dir, config.root_path.to_string_lossy());
}
#[test]
fn tree_variable() {
let config = common::garden_config();
let tree_idx: garden::model::TreeIndex = 0;
let result = garden::eval::tree_value(&config, "${prefix}", tree_idx, None);
assert_eq!(result, "/home/test/.local");
}
#[test]
fn config_variable() {
let config = common::garden_config();
let tree_idx: garden::model::TreeIndex = 0;
let test = garden::eval::tree_value(&config, "${test}", tree_idx, None);
assert_eq!("TEST", test);
let local = garden::eval::tree_value(&config, "${local}", tree_idx, None);
assert_eq!("TEST/local", local);
}
#[test]
fn tree_name() {
let config = common::garden_config();
let tree_idx: garden::model::TreeIndex = 0;
let expect = "git";
let actual = garden::eval::tree_value(&config, "${TREE_NAME}", tree_idx, None);
assert_eq!(expect, actual);
}
#[test]
fn tree_path() {
let config = common::garden_config();
let tree_idx: garden::model::TreeIndex = 0;
let expect = "/home/test/src/git";
let actual = garden::eval::tree_value(&config, "${TREE_PATH}", tree_idx, None);
assert_eq!(expect, actual);
}
#[test]
fn garden_path() {
let config = common::garden_config();
let expect = "/home/test/src";
let actual = garden::eval::value(&config, "${GARDEN_ROOT}");
assert_eq!(expect, actual);
}
#[test]
fn exec_expression() {
let config = common::garden_config();
let value = garden::eval::value(&config, "$ echo test");
assert_eq!(value, "test");
let value = garden::eval::value(&config, "${echo_cmd_exec}");
assert_eq!(value, "cmd");
}
#[test]
fn shell_variable_syntax() {
let config = common::garden_config();
let value = garden::eval::value(&config, "$ value=$(echo test); echo $value");
assert_eq!(value, "test");
let value = garden::eval::value(&config, "$ echo '$${value[@]:0:1}'");
assert_eq!(value, "${value[@]:0:1}");
}
#[test]
fn multi_variable_with_tree() {
let config = common::garden_config();
assert!(config.trees.len() > 1);
assert!(config.trees[1].environment.len() > 1);
let mut var = config.trees[1].environment[1].clone();
assert_eq!("PATH", var.get_name());
let context = garden::model::TreeContext::new(1, None, None, None);
let values = garden::eval::multi_variable(&config, &mut var, &context);
assert_eq!(
values,
[
"/home/test/src/git-cola/local/bin",
"/home/test/src/git-cola/bin",
]
);
}
#[test]
fn multi_variable_with_garden() {
let config = common::garden_config();
assert!(config.trees.len() > 1);
assert!(config.trees[1].environment.len() > 1);
let mut var = config.trees[1].environment[1].clone();
assert_eq!("PATH", var.get_name());
let context = garden::model::TreeContext::new(1, None, Some(0), None);
let values = garden::eval::multi_variable(&config, &mut var, &context);
assert_eq!(
values,
[
"/home/test/apps/git-cola/current/bin",
"/home/test/src/git-cola/bin",
]
);
}
#[test]
fn garden_environment() {
let config = common::garden_config();
let context = garden::model::TreeContext::new(1, None, Some(0), None);
let values = garden::eval::environment(&config, &context);
assert_eq!(values.len(), 7);
let mut idx = 0;
assert_eq!(values[idx].0, "PYTHONPATH"); assert_eq!(values[idx].1, "/home/test/src/git-cola");
idx += 1;
assert_eq!(values[idx].0, "PATH"); assert_eq!(
values[idx].1,
"/home/test/apps/git-cola/current/bin:/usr/bin:/bin"
);
idx += 1;
assert_eq!(values[idx].0, "PATH"); assert_eq!(
values[idx].1,
format!(
"{}:{}:/usr/bin:/bin",
"/home/test/src/git-cola/bin", "/home/test/apps/git-cola/current/bin"
)
);
idx += 1;
assert_eq!(values[idx].0, "PYTHONPATH");
assert_eq!(
values[idx].1,
"/home/test/src/python/send2trash:/home/test/src/git-cola"
);
idx += 1;
assert_eq!(values[idx].0, "PYTHONPATH"); assert_eq!(
values[idx].1,
"/home/test/src/python/qtpy:/home/test/src/python/send2trash:/home/test/src/git-cola"
);
idx += 1;
assert_eq!(values[idx].0, "GIT_COLA_TRACE"); assert_eq!(values[idx].1, "full");
idx += 1;
assert_eq!(values[idx].0, "PATH"); assert_eq!(
values[idx].1,
format!(
"{}:{}:/usr/bin:/bin:{}",
"/home/test/src/git-cola/bin",
"/home/test/apps/git-cola/current/bin",
"/home/test/apps/git-cola/current/bin"
)
);
idx += 1;
assert_eq!(values.len(), idx);
}
#[test]
fn group_environment() {
let config = common::garden_config();
let context = garden::model::TreeContext::new(1, None, None, Some(0));
let values = garden::eval::environment(&config, &context);
assert_eq!(values.len(), 5);
let mut idx = 0;
assert_eq!(values[idx].0, "PYTHONPATH");
assert_eq!(values[idx].1, "/home/test/src/git-cola");
idx += 1;
assert_eq!(values[idx].0, "PATH");
assert_eq!(
values[idx].1,
format!("{}:/usr/bin:/bin", "/home/test/src/git-cola/local/bin")
);
idx += 1;
assert_eq!(values[idx].0, "PATH");
assert_eq!(
values[idx].1,
format!(
"{}:{}:/usr/bin:/bin",
"/home/test/src/git-cola/bin", "/home/test/src/git-cola/local/bin"
)
);
idx += 1;
assert_eq!(values[idx].0, "PYTHONPATH");
assert_eq!(
values[idx].1,
"/home/test/src/python/send2trash:/home/test/src/git-cola"
);
idx += 1;
assert_eq!(values[idx].0, "PYTHONPATH");
assert_eq!(
values[idx].1,
format!(
"{}:{}:{}",
"/home/test/src/python/qtpy",
"/home/test/src/python/send2trash",
"/home/test/src/git-cola"
)
);
idx += 1;
assert_eq!(values.len(), idx);
}
#[test]
fn environment_empty_value() {
let config = common::garden_config();
let context = garden::query::tree_from_name(&config, "tmp", None, None).unwrap();
let values = garden::eval::environment(&config, &context);
assert_eq!(values.len(), 3);
let mut idx = 0;
assert_eq!(values[idx].0, "EMPTY"); assert_eq!(values[idx].1, "a");
idx += 1;
assert_eq!(values[idx].0, "EMPTY"); assert_eq!(values[idx].1, "b:a");
idx += 1;
assert_eq!(values[idx].0, "tmp_VALUE"); assert_eq!(values[idx].1, "/tmp");
idx += 1;
assert_eq!(values.len(), idx);
}
#[test]
fn command_garden_scope() -> Result<()> {
let config = common::garden_config();
let options = garden::cli::MainOptions::new();
let app = garden::build::context_from_config(config, &options)?;
let context = garden::model::TreeContext::new(1, None, Some(0), None);
let values = garden::eval::command(&app, &context, "build");
assert_eq!(values.len(), 1);
let cmd_vec = &values[0];
assert_eq!(cmd_vec.len(), 1);
let cmd = &cmd_vec[0];
assert_eq!(cmd, "make -j prefix=/home/test/apps/git-cola/current all");
Ok(())
}
#[test]
fn command_tree_scope() -> Result<()> {
let options = garden::cli::MainOptions::new();
let config = common::garden_config();
let app = garden::build::context_from_config(config, &options)?;
let context = garden::model::TreeContext::new(1, None, None, None);
{
let values = garden::eval::command(&app, &context, "build");
assert_eq!(values.len(), 1);
assert_eq!(values[0].len(), 1);
let cmd = &values[0][0];
assert_eq!(cmd, "make -j prefix=/home/test/src/git-cola/local all");
}
{
let values = garden::eval::command(&app, &context, "test");
assert_eq!(values.len(), 2);
assert_eq!(values[0].len(), 1);
assert_eq!(values[0][0], "make test");
assert_eq!(values[1].len(), 2);
assert_eq!(values[1][0], "git status --short");
assert_eq!(values[1][1], "make tox");
}
Ok(())
}
#[test]
fn environment_variables() {
let config = common::garden_config();
std::env::set_var("GARDEN_TEST_VALUE", "test");
let value = garden::eval::value(&config, "${GARDEN_TEST_VALUE}");
assert_eq!(value, "test");
let value = garden::eval::tree_value(&config, "${GARDEN_TEST_VALUE}", 0, None);
assert_eq!(value, "test");
}
#[test]
fn find_tree_in_graft() -> Result<()> {
let app = garden::build::context_from_path("tests/data/garden.yaml")?;
let id = app.get_root_id();
let ctx = garden::query::find_tree(&app, id, "graft::graft", None)?;
assert_eq!(0, ctx.tree);
assert!(ctx.config.is_some());
let node_id: usize = ctx.config.unwrap().into();
assert_eq!(2usize, node_id);
Ok(())
}
#[test]
fn eval_graft_tree() -> Result<()> {
let app = garden::build::context_from_path("tests/data/garden.yaml")?;
let id = app.get_root_id();
let ctx = garden::query::find_tree(&app, id, "graft::graft", None)?;
assert!(ctx.config.is_some());
let node_id: usize = ctx.config.unwrap().into();
assert_eq!(2usize, node_id);
let config = app.get_config(ctx.config.unwrap());
let path = garden::eval::tree_value(config, "${TREE_PATH}", ctx.tree, ctx.garden);
assert!(path.ends_with("/graft"));
let actual = garden::eval::tree_value(config, "${current_config}", ctx.tree, ctx.garden);
assert_eq!("graft", actual);
let example_ctx = garden::query::find_tree(&app, id, "example/tree", None)?;
assert!(example_ctx.config.is_some());
let example_config = app.get_config(example_ctx.config.unwrap());
let actual = garden::eval::tree_value(
example_config,
"${current_config}",
example_ctx.tree,
example_ctx.garden,
);
assert_eq!("main", actual);
let actual = garden::eval::tree_value(config, "${undefined::variable}", ctx.tree, ctx.garden);
assert_eq!("", actual);
let actual = garden::eval::tree_value(config, "${graft::current_config}", ctx.tree, ctx.garden);
assert_eq!("", actual);
Ok(())
}