use super::*;
use crate::snippets::types::{SnippetMetadata, SourceOrigin};
use std::path::PathBuf;
fn snippet(language: crate::snippets::types::Language, target: Option<&str>) -> Snippet {
Snippet {
id: None,
path: PathBuf::from("example.md"),
language,
title: None,
code: String::new(),
start_line: 1,
block_index: 0,
annotation: None,
metadata: SnippetMetadata {
target: target.map(str::to_string),
..SnippetMetadata::default()
},
source_origin: SourceOrigin {
path: PathBuf::from("example.md"),
line: 1,
block_index: 0,
},
}
}
fn session(language: crate::snippets::types::Language, working_directory: &str) -> SessionSpec {
SessionSpec {
language,
working_directory: PathBuf::from(working_directory),
manifest: None,
before: vec!["build".to_string()],
env: Default::default(),
include_paths: Vec::new(),
rust_features: Vec::new(),
rust_dependencies: Default::default(),
}
}
#[test]
fn a_lang_filtered_run_prepares_only_the_matching_session() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
("go".to_string(), session(Language::Go, "/crate/go")),
("kotlin".to_string(), session(Language::Kotlin, "/crate/kotlin")),
("swift".to_string(), session(Language::Swift, "/crate/swift")),
]);
let snippets = vec![snippet(Language::Go, None)];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert_eq!(needed.len(), 1, "expected only the go session, got {needed:?}");
assert!(needed.contains_key("go"));
}
#[test]
fn an_unfiltered_run_still_needs_every_configured_session() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
("go".to_string(), session(Language::Go, "/crate/go")),
("kotlin".to_string(), session(Language::Kotlin, "/crate/kotlin")),
("swift".to_string(), session(Language::Swift, "/crate/swift")),
]);
let snippets = vec![
snippet(Language::Go, None),
snippet(Language::Kotlin, None),
snippet(Language::Swift, None),
];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert_eq!(needed.len(), 3, "expected every session, got {needed:?}");
}
#[test]
fn an_unclaimed_language_with_its_own_working_directory_is_dropped() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
("python".to_string(), session(Language::Python, "/crate/python")),
("zig".to_string(), session(Language::Zig, "/crate/zig")),
]);
let snippets = vec![snippet(Language::Python, None)];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert!(
!needed.contains_key("zig"),
"zig has no claim and no shared directory: {needed:?}"
);
}
#[test]
fn a_session_sharing_a_working_directory_with_a_needed_one_is_kept_even_when_unclaimed() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
(
"typescript".to_string(),
session(Language::TypeScript, "/crate/bindings"),
),
("wasm".to_string(), session(Language::Rust, "/crate/bindings")),
]);
let snippets = vec![snippet(Language::TypeScript, None)];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert_eq!(
needed.len(),
2,
"the cohabiting wasm session must be kept to protect its scratch: {needed:?}"
);
}
#[test]
fn an_explicit_target_claims_its_named_session_even_when_the_language_matches_another_too() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
("typescript".to_string(), session(Language::TypeScript, "/crate/node")),
("wasm".to_string(), session(Language::TypeScript, "/crate/wasm")),
]);
let snippets = vec![snippet(Language::TypeScript, Some("wasm"))];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert_eq!(
needed.len(),
1,
"expected only the explicitly targeted session: {needed:?}"
);
assert!(needed.contains_key("wasm"));
}
#[test]
fn an_ambiguous_claim_keeps_every_candidate_session() {
use crate::snippets::types::Language;
let sessions = HashMap::from([
("typescript".to_string(), session(Language::TypeScript, "/crate/node")),
("wasm".to_string(), session(Language::TypeScript, "/crate/wasm")),
]);
let snippets = vec![snippet(Language::TypeScript, None)];
let needed = sessions_needed_for_preparation(&snippets, &sessions);
assert_eq!(
needed.len(),
2,
"an ambiguous claim must not silently drop a candidate: {needed:?}"
);
}