diff --git a/PROGRESS.md b/PROGRESS.md index d2242c1..7a17130 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -755,3 +755,7 @@ vcpkg's imgui 1.91.9 removed the `sdl2-binding` feature (only `sdl3-binding` exi | 2026-02-10 | Codex | Step 233: Training data pipeline CLI (load/anonymize/convert/filter/dedup/export + stats). 1/1 tests pass. | | 2026-02-10 | Codex | Step 234: Session pipeline tests (anonymizer round-trip, no PII, trace conversion, pipeline output count, quality filter, dedup). 1/1 tests pass. | | 2026-02-10 | Codex | Step 241: Text-first default mode (default buffer mode Text, settings preference, wizard step, tips updated). 1/1 tests pass (`file_limits_test`). | +| 2026-02-10 | Codex | Step 242: DockBuilder initial layout on first launch + View→Reset Layout (applies preset docking for Explorer/Editor/Panel and tool windows). Tests not run. | +| 2026-02-10 | Codex | Step 243: First-launch polish — Explorer shows Open Folder prompt when no workspace, status bar shows “Text Mode/Structured Mode”, bottom panel collapses on initial layout/reset. Tests not run. | +| 2026-02-10 | Codex | Ubuntu 24 build portability pass: fixed Linux/GCC compile/link regressions and validated product target build (`whetstone_editor`, `orchestrator`) via `installer/linux/build.sh`. Updated Linux build/install scripts with explicit prerequisite checks/deps and product-target build mode. | +| 2026-02-10 | Codex | Step 244: Added integration-style test target `step244_test` validating text-first defaults, mode policy gating, per-buffer mode persistence, VSCode preset layout ratios, and settings-driven default buffer mode mapping. 6/6 checks pass (`./editor/build/step244_test`). | diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 8b4ee75..a6cbf6b 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -387,11 +387,29 @@ target_link_libraries(step49_test PRIVATE unofficial::tree-sitter::tree-sitter t add_executable(step50_test tests/step50_test.cpp) target_include_directories(step50_test PRIVATE src) -target_link_libraries(step50_test PRIVATE unofficial::tree-sitter::tree-sitter tree_sitter_python tree_sitter_cpp tree_sitter_elisp) +target_link_libraries(step50_test PRIVATE + unofficial::tree-sitter::tree-sitter + tree_sitter_python + tree_sitter_cpp + tree_sitter_elisp + tree_sitter_javascript + tree_sitter_typescript + tree_sitter_java + tree_sitter_rust + tree_sitter_go) add_executable(step51_test tests/step51_test.cpp) target_include_directories(step51_test PRIVATE src) -target_link_libraries(step51_test PRIVATE unofficial::tree-sitter::tree-sitter tree_sitter_python tree_sitter_cpp tree_sitter_elisp) +target_link_libraries(step51_test PRIVATE + unofficial::tree-sitter::tree-sitter + tree_sitter_python + tree_sitter_cpp + tree_sitter_elisp + tree_sitter_javascript + tree_sitter_typescript + tree_sitter_java + tree_sitter_rust + tree_sitter_go) add_executable(step52_test tests/step52_test.cpp) target_include_directories(step52_test PRIVATE src) @@ -468,7 +486,16 @@ target_include_directories(step71_test PRIVATE src) add_executable(step72_test tests/step72_test.cpp) target_include_directories(step72_test PRIVATE src) -target_link_libraries(step72_test PRIVATE unofficial::tree-sitter::tree-sitter tree_sitter_python tree_sitter_cpp tree_sitter_elisp) +target_link_libraries(step72_test PRIVATE + unofficial::tree-sitter::tree-sitter + tree_sitter_python + tree_sitter_cpp + tree_sitter_elisp + tree_sitter_javascript + tree_sitter_typescript + tree_sitter_java + tree_sitter_rust + tree_sitter_go) add_executable(step73_test tests/step73_test.cpp) target_include_directories(step73_test PRIVATE src) @@ -1187,6 +1214,9 @@ target_link_libraries(step233_test PRIVATE nlohmann_json::nlohmann_json) add_executable(step234_test tests/step234_test.cpp) target_include_directories(step234_test PRIVATE src) target_link_libraries(step234_test PRIVATE nlohmann_json::nlohmann_json) +add_executable(step244_test tests/step244_test.cpp) +target_include_directories(step244_test PRIVATE src) +target_link_libraries(step244_test PRIVATE nlohmann_json::nlohmann_json) add_executable(step213_test tests/step213_test.cpp) target_include_directories(step213_test PRIVATE src) target_link_libraries(step213_test PRIVATE nlohmann_json::nlohmann_json) diff --git a/editor/tests/file_limits_test.cpp b/editor/tests/file_limits_test.cpp index c37d004..beb149d 100644 --- a/editor/tests/file_limits_test.cpp +++ b/editor/tests/file_limits_test.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include static void expect(bool cond, const std::string& name, int& passed, int& failed) { if (cond) { diff --git a/editor/tests/step244_test.cpp b/editor/tests/step244_test.cpp new file mode 100644 index 0000000..757854e --- /dev/null +++ b/editor/tests/step244_test.cpp @@ -0,0 +1,109 @@ +// Step 244 TDD Test: First-launch UX checks +// +// Verifies: +// 1. New buffers default to Text mode. +// 2. Text mode disables structured-only features. +// 3. Structured mode enables structured-only features. +// 4. Mode toggle behavior persists per-buffer in BufferManager. +// 5. LayoutManager VSCode preset matches DockBuilder expectations. +// 6. Settings defaultBufferMode preference is readable and can drive default mode. + +#include +#include +#include +#include + +#include "BufferManager.h" +#include "EditorModePolicy.h" +#include "LayoutManager.h" +#include "SettingsManager.h" + +static bool approx(float a, float b) { + return std::fabs(a - b) < 0.0001f; +} + +int main() { + int passed = 0; + int failed = 0; + + // 1. New buffers default to Text mode. + { + BufferManager bm; + bm.openBuffer("a.py", "print('x')", "python"); + assert(bm.getBufferMode("a.py") == BufferManager::BufferMode::Text); + std::cout << "Test 1 PASS: new buffers default to text mode" << std::endl; + ++passed; + } + + // 2. Text mode disables structured-only features. + { + assert(isTextMode(BufferManager::BufferMode::Text)); + assert(!allowStructuredFeatures(BufferManager::BufferMode::Text)); + std::cout << "Test 2 PASS: text mode disables structured features" << std::endl; + ++passed; + } + + // 3. Structured mode enables structured-only features. + { + assert(!isTextMode(BufferManager::BufferMode::Structured)); + assert(allowStructuredFeatures(BufferManager::BufferMode::Structured)); + std::cout << "Test 3 PASS: structured mode enables structured features" << std::endl; + ++passed; + } + + // 4. Mode toggle behavior persists per-buffer. + { + BufferManager bm; + bm.openBuffer("b.py", "", "python"); + bm.setBufferMode("b.py", BufferManager::BufferMode::Structured); + assert(bm.getBufferMode("b.py") == BufferManager::BufferMode::Structured); + bm.switchToBuffer("b.py"); + assert(bm.getBufferMode("b.py") == BufferManager::BufferMode::Structured); + std::cout << "Test 4 PASS: mode toggle persists per-buffer" << std::endl; + ++passed; + } + + // 5. LayoutManager VSCode preset data matches Step 242 DockBuilder expectations. + { + LayoutManager layout; + layout.setPreset(LayoutPreset::VSCode); + const DockPanel* explorer = layout.findPanel("Explorer"); + const DockPanel* editor = layout.findPanel("Editor"); + const DockPanel* panel = layout.findPanel("Panel"); + assert(explorer && editor && panel); + assert(explorer->direction == DockDirection::Left); + assert(editor->direction == DockDirection::Center); + assert(panel->direction == DockDirection::Bottom); + assert(approx(explorer->sizeRatio, 0.20f)); + assert(approx(editor->sizeRatio, 0.60f)); + assert(approx(panel->sizeRatio, 0.20f)); + std::cout << "Test 5 PASS: VSCode layout preset matches expected docking data" << std::endl; + ++passed; + } + + // 6. Settings defaultBufferMode preference is respected by caller mapping. + { + SettingsManager settings; + assert(settings.getDefaultBufferMode() == "text"); + + settings.setDefaultBufferMode("structured"); + assert(settings.getDefaultBufferMode() == "structured"); + + auto modeFromSetting = [](const std::string& value) { + return value == "structured" + ? BufferManager::BufferMode::Structured + : BufferManager::BufferMode::Text; + }; + + BufferManager bm; + bm.openBuffer("c.py", "", "python", modeFromSetting(settings.getDefaultBufferMode())); + assert(bm.getBufferMode("c.py") == BufferManager::BufferMode::Structured); + std::cout << "Test 6 PASS: defaultBufferMode setting drives buffer default mode" << std::endl; + ++passed; + } + + std::cout << "\n=== Step 244 Results: " << passed << " passed, " << failed + << " failed ===" << std::endl; + return failed > 0 ? 1 : 0; +} +