use brink_db::ProjectDb;
const BARTER: &str = "\
var gold = 10
/// Trade at the market stall.
flow haggle() {
You haggle over the price.
}
";
const MAIN: &str = "\
use story::market::barter::haggle;
flow start() {
The market is busy.
-> haggle
}
";
#[test]
fn native_files_group_into_one_project_despite_having_no_includes() {
let mut db = ProjectDb::new();
db.set_file("main.brink", MAIN.to_owned());
db.set_file("market/barter.brink", BARTER.to_owned());
let projects = db.compute_projects();
assert_eq!(
projects.len(),
1,
"the native module tree is one compilation unit, so it is one \
project — got {projects:?}",
);
let (root, members) = &projects[0];
let member_paths: Vec<&str> = members
.iter()
.map(|&id| db.file_path(id).unwrap_or_default())
.collect();
assert_eq!(member_paths, ["main.brink", "market/barter.brink"]);
assert_eq!(db.file_path(*root), Some("main.brink"));
}
#[test]
fn native_project_root_does_not_depend_on_insertion_order() {
let mut reversed = ProjectDb::new();
reversed.set_file("market/barter.brink", BARTER.to_owned());
reversed.set_file("main.brink", MAIN.to_owned());
let projects = reversed.compute_projects();
assert_eq!(projects.len(), 1, "{projects:?}");
let (root, members) = &projects[0];
assert_eq!(
reversed.file_path(*root),
Some("main.brink"),
"the lexicographically first native path is the root regardless of \
which file was registered first",
);
assert_eq!(members.len(), 2, "{projects:?}");
}
#[test]
fn ink_include_grouping_survives_alongside_a_native_tree() {
let mut db = ProjectDb::new();
db.set_file("story.ink", "INCLUDE chapter.ink\n-> start\n".to_owned());
db.set_file("chapter.ink", "== start ==\nHello.\n-> DONE\n".to_owned());
db.set_file("main.brink", MAIN.to_owned());
db.set_file("market/barter.brink", BARTER.to_owned());
db.rebuild_include_graph();
let projects = db.compute_projects();
let rendered: Vec<(Option<&str>, Vec<&str>)> = projects
.iter()
.map(|(root, members)| {
(
db.file_path(*root),
members
.iter()
.map(|&id| db.file_path(id).unwrap_or_default())
.collect(),
)
})
.collect();
assert_eq!(
rendered,
vec![
(Some("story.ink"), vec!["story.ink", "chapter.ink"]),
(
Some("main.brink"),
vec!["main.brink", "market/barter.brink"],
),
],
"the ink project stays its INCLUDE closure and the native files are \
one project of their own",
);
}