use std::collections::BTreeMap;
use supercode::configfile::{resolve, ResolveOptions};
use supercode::{ApprovalPolicy, SandboxPolicy};
fn resolve_preset(name: &str) -> supercode::configfile::Resolved {
let top = format!("extends = \"{name}\"\n");
resolve(&top, None, &ResolveOptions::default())
.unwrap_or_else(|e| panic!("preset `{name}` failed to resolve: {e}"))
}
fn assert_modules(modules: &BTreeMap<String, bool>, on: &[&str], off: &[&str]) {
for name in on {
assert_eq!(
modules.get(*name),
Some(&true),
"expected module `{name}` ON"
);
}
for name in off {
assert_ne!(
modules.get(*name),
Some(&true),
"expected module `{name}` OFF"
);
}
}
#[test]
fn pi_core_resolves_with_only_the_c3_mandatory_warning() {
let r = resolve_preset("pi-core");
assert_eq!(r.config.effort.as_deref(), Some("medium"));
assert_eq!(r.config.max_tool_output_bytes, Some(51200));
assert!(r.config.load_project_context);
assert_eq!(r.config.tool_schema_tier, supercode::SchemaTier::Full);
assert_eq!(r.config.compact_after_messages, Some(0));
assert_modules(
&r.modules,
&[
"trust",
"session_tree",
"session_share",
"server",
"plugins",
"tui",
],
&[
"tools_search",
"mcp",
"subagents",
"permissions",
"plan_mode",
"todos",
"tools_background",
"tools_web",
"checkpoint",
"memory",
"hooks",
"deferred_tools",
"cache",
"reduction",
"model_catalog",
"model_oauth",
"tools_apply_patch",
"tools_persistent_shell",
"tools_question",
"lsp",
"formatters",
"structured_output",
"telemetry",
"integrations",
],
);
assert_eq!(
r.warnings.len(),
1,
"pi-core should carry exactly the C3 mandatory warning: {:?}",
r.warnings
);
assert!(r.warnings[0].contains("C3"));
assert_eq!(r.config.sandbox, SandboxPolicy::DangerFullAccess);
assert_eq!(r.config.approval, ApprovalPolicy::Never);
}
#[test]
fn cc_parity_resolves_with_zero_warnings_c6_satisfied_via_parent() {
let r = resolve_preset("cc-parity");
assert_eq!(r.config.model, "anthropic/claude-opus-4-8");
assert_eq!(r.config.effort.as_deref(), Some("medium"));
assert_eq!(r.config.approval, ApprovalPolicy::Untrusted);
assert!(r.config.auto_approved_tools.contains("read_file"));
assert_modules(
&r.modules,
&[
"tools_search",
"tools_web",
"tools_question",
"todos",
"plan_mode",
"subagents",
"tools_background",
"permissions",
"permissions.rules",
"permissions.protected_paths",
"trust",
"mcp",
"deferred_tools",
"hooks",
"memory",
"checkpoint",
"session_tree",
"model_catalog",
"tui",
],
&[
"tools_apply_patch",
"tools_persistent_shell",
"lsp",
"formatters",
"session_share",
"server",
"reduction",
"cache",
"structured_output",
"model_oauth",
"permissions.sandbox", ],
);
assert!(
r.warnings.is_empty(),
"cc-parity should resolve with zero warnings: {:?}",
r.warnings
);
}
#[test]
fn cx_parity_resolves_with_d7_and_c6_s8_warnings_only() {
let r = resolve_preset("cx-parity");
assert_eq!(
r.harness.core.tools.enabled.as_deref(),
Some(&["bash".to_string(), "view_image".to_string()][..])
);
assert_eq!(r.harness.core.shell_env_snapshot, Some(true));
assert_eq!(r.config.approval, ApprovalPolicy::ModelRequested);
assert_eq!(r.config.sandbox, SandboxPolicy::WorkspaceWrite);
assert_modules(
&r.modules,
&[
"tools_persistent_shell",
"tools_apply_patch",
"todos",
"tools_web",
"tools_background",
"subagents",
"deferred_tools",
"structured_output",
"permissions",
"permissions.rules",
"permissions.protected_paths",
"trust",
"mcp",
"hooks",
"model_catalog",
"tui",
],
&[
"tools_search",
"tools_question",
"plan_mode",
"memory",
"checkpoint",
"session_tree",
"session_share",
"lsp",
"formatters",
"server",
"reduction",
"cache",
"model_oauth",
],
);
assert!(!r.warnings.iter().any(|w| w.contains("C1")));
assert!(!r.warnings.iter().any(|w| w.contains("C3")));
let d7: Vec<_> = r.warnings.iter().filter(|w| w.contains("D-7")).collect();
assert_eq!(
d7.len(),
1,
"expected exactly one D-7 warning: {:?}",
r.warnings
);
let c6: Vec<_> = r.warnings.iter().filter(|w| w.contains("C6")).collect();
assert_eq!(
c6.len(),
1,
"expected exactly one C6 warning: {:?}",
r.warnings
);
assert!(c6[0].contains("S8"));
assert_eq!(
r.warnings.len(),
2,
"expected exactly D-7 + C6, nothing else: {:?}",
r.warnings
);
}
#[test]
fn oc_parity_resolves_with_zero_warnings_trust_on_as_deviation() {
let r = resolve_preset("oc-parity");
assert_eq!(r.config.approval, ApprovalPolicy::OnRequest);
assert_eq!(r.config.sandbox, SandboxPolicy::DangerFullAccess);
assert_modules(
&r.modules,
&[
"tools_search",
"todos",
"tools_web",
"subagents",
"tools_apply_patch",
"permissions",
"permissions.rules",
"trust", "mcp",
"plugins",
"lsp",
"formatters",
"checkpoint",
"session_share",
"server",
"model_catalog",
"tui",
],
&[
"plan_mode", "tools_question",
"tools_background",
"session_tree",
"memory",
"hooks",
"deferred_tools",
"cache",
"reduction",
"structured_output",
"model_oauth",
"permissions.protected_paths", ],
);
assert!(
r.warnings.is_empty(),
"oc-parity should resolve with zero resolver-checked warnings: {:?}",
r.warnings
);
}
#[test]
fn token_saver_extends_pi_core_chain_and_inherits_only_c3() {
let r = resolve_preset("token-saver");
assert_eq!(
r.preset_chain,
vec!["pi-core".to_string(), "token-saver".to_string()]
);
assert_eq!(r.config.tool_schema_tier, supercode::SchemaTier::Minimal);
assert_eq!(
r.config.schema_tier_for("edit_file"),
supercode::SchemaTier::Full
);
let reduction = &r.config.reduction_policy;
assert_eq!(reduction.stale_reads, Some(true));
assert_eq!(reduction.diff_reads, Some(true));
assert_eq!(reduction.tool_input_elision, Some(true));
assert_eq!(reduction.supersede, Some(true));
assert_eq!(reduction.normalize_output, Some(true));
assert_eq!(reduction.image_redaction, Some(true));
assert_eq!(reduction.span_summaries, Some(true));
assert_modules(
&r.modules,
&["reduction", "deferred_tools", "cache", "model_catalog"],
&[],
);
assert!(!r.warnings.iter().any(|w| w.contains("D-9")));
assert_eq!(
r.warnings.len(),
1,
"token-saver should inherit exactly pi-core's C3 warning: {:?}",
r.warnings
);
assert!(r.warnings[0].contains("C3"));
assert_modules(
&r.modules,
&[
"trust",
"session_tree",
"session_share",
"server",
"plugins",
"tui",
],
&[
"mcp",
"permissions",
"subagents",
"todos",
"tools_background",
"tools_web",
],
);
}
#[test]
fn direct_reduction_gate_overrides_token_saver_preset() {
let r = resolve(
"extends = \"token-saver\"\n[capabilities.reduction]\nstale_reads = false\n",
None,
&ResolveOptions::default(),
)
.expect("direct reduction override resolves");
assert_eq!(r.config.reduction_policy.stale_reads, Some(false));
assert_eq!(r.config.reduction_policy.diff_reads, Some(true));
assert_eq!(r.config.reduction_policy.duplicates, Some(true));
assert!(r.config.handoff_enabled);
}
#[test]
fn reduction_master_false_disables_the_separate_handoff_consumer() {
let r = resolve(
"extends = \"token-saver\"\n[capabilities.reduction]\nenabled = false\n",
None,
&ResolveOptions::default(),
)
.expect("token-saver with reduction master disabled must resolve");
assert!(!r.config.handoff_enabled);
}
#[test]
fn supercode_default_resolves_with_c1_and_c3_no_plugins_trust_edge() {
let r = resolve_preset("supercode-default");
assert_eq!(r.config.effort.as_deref(), Some("medium"));
assert_eq!(r.config.max_tool_output_bytes, Some(51200));
assert_modules(
&r.modules,
&[
"tools_search",
"tools_apply_patch",
"tools_persistent_shell",
"todos",
"notify",
],
&[
"trust",
"session_tree",
"session_share",
"server",
"plugins",
"reduction",
"permissions",
],
);
assert_modules(&r.modules, &["tui"], &[]);
assert_eq!(
r.warnings.len(),
2,
"supercode-default should carry exactly C1 + C3: {:?}",
r.warnings
);
assert!(r.warnings.iter().any(|w| w.contains("C1")));
assert!(r.warnings.iter().any(|w| w.contains("C3")));
assert!(!r.warnings.iter().any(|w| w.contains("D-10")));
}
#[test]
fn supercode_default_matches_todays_actual_default_posture() {
let r = resolve_preset("supercode-default");
assert_eq!(r.config.sandbox, SandboxPolicy::DangerFullAccess);
assert_eq!(r.config.approval, ApprovalPolicy::Never);
}