Route every extension bank-directory lookup through one bankRootOf seam

The pure bankRootFor(rppPath, unsavedRoot) and the shell bankRootOf(ReaProject*) replace eleven hand-rolled .rpp-parent derivations. No unsaved root is supplied yet, so behaviour and refusals are unchanged. Save-As relocation now reads the stored lastBankRoot_.
This commit is contained in:
2026-09-25 14:53:48 -04:00
parent c3e7556261
commit 43994e0d9d
27 changed files with 212 additions and 192 deletions
+49
View File
@@ -402,6 +402,49 @@ static void testBankRelativeForNameConventionAndEdge() {
CHECK(bankRelativeForName("").empty());
}
// --- bankRootFor --------------------------------------------------------------
static void testBankRootForSavedProjectIsTheRppDirectory() {
CHECK(bankRootFor("/home/d/proj/song.rpp", "") == "/home/d/proj");
#ifdef _WIN32
CHECK(bankRootFor("C:\\Users\\D\\Proj\\song.rpp", "") == "c:/users/d/proj");
#endif
}
static void testBankRootForSavedProjectIgnoresTheUnsavedRoot() {
// Once the project has a directory, a supplied unsaved root must not leak through.
CHECK(bankRootFor("/home/d/proj/song.rpp", "/tmp/unsaved") == "/home/d/proj");
}
static void testBankRootForUnsavedProjectFallsBackToTheUnsavedRoot() {
CHECK(bankRootFor("", "/tmp/unsaved") == "/tmp/unsaved");
// Normalized like the saved branch: trailing slash stripped, backslashes flipped.
CHECK(bankRootFor("", "/tmp/unsaved/") == "/tmp/unsaved");
#ifdef _WIN32
CHECK(bankRootFor("", "C:\\Temp\\Unsaved\\") == "c:/temp/unsaved");
#endif
}
static void testBankRootForUnsavedProjectWithNoUnsavedRootIsEmpty() {
// No CWD / default-location fallback: an unsaved project with nowhere to bank
// yields empty, which every caller treats as "no bank location".
CHECK(bankRootFor("", "").empty());
}
static void testBankRootForRppWithNoDirectoryIsTreatedAsUnsaved() {
CHECK(bankRootFor("song.rpp", "/tmp/unsaved") == "/tmp/unsaved");
CHECK(bankRootFor("song.rpp", "").empty());
}
static void testBankRootForBothBranchesProduceComparableRoots() {
// The same directory reached through either branch is the same string, so a
// root recorded under one branch compares equal to the other's.
CHECK(bankRootFor("/a/b/song.rpp", "") == bankRootFor("", "/a/b/"));
#ifdef _WIN32
CHECK(bankRootFor("C:\\A\\B\\song.rpp", "") == bankRootFor("", "c:/a/b"));
#endif
}
int main() {
testNormalizeSlashes();
testNormalizeSlashesCaseFolding();
@@ -433,6 +476,12 @@ int main() {
testRenderPathsTakeTheirDirectoryVerbatim();
testRenderPathsEmptyDirectoryStaysEmpty();
testBankRelativeForNameConventionAndEdge();
testBankRootForSavedProjectIsTheRppDirectory();
testBankRootForSavedProjectIgnoresTheUnsavedRoot();
testBankRootForUnsavedProjectFallsBackToTheUnsavedRoot();
testBankRootForUnsavedProjectWithNoUnsavedRootIsEmpty();
testBankRootForRppWithNoDirectoryIsTreatedAsUnsaved();
testBankRootForBothBranchesProduceComparableRoots();
if (g_fail == 0) std::printf("capture_paths: all tests passed\n");
else std::printf("capture_paths: %d CHECK(s) FAILED\n", g_fail);