Commit Graph

13 Commits

Author SHA1 Message Date
Christoph K.
6a7b20e548 Add comprehensive test quality report
Detailed assessment of test coverage, compliance with CLAUDE.md requirements,
identified gaps, and recommendations for future improvements. Report includes:

- Test execution summary: 57/57 passing (100%)
- Component-by-component coverage analysis
- CLAUDE.md compliance verification
- Identified P1/P2/P3 test gaps
- Testability assessment (strengths and weaknesses)
- Recommendations for integration tests, mocking, golden images

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:59:46 +01:00
Christoph K.
8a462d74f9 feat: add build-all.sh script for all targets
Compiles photo-converter, all test binaries, and runs ctest.
Supports --release/--debug, --clean, --no-gui, --no-tests flags.
Auto-detects available CPU cores and skips Qt if not installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:59:02 +01:00
Christoph K.
3f0cf5a0fa Improve test coverage and fix failing test
- Fix InverterTest.ColorNegativeInversionChangesValues: Use realistic test image
  with distinct border and interior values instead of uniform color, so mask
  sampling produces meaningful results
- Add OutputWriterTests (8 tests): Verify PNG/TIFF/JPEG writing, format conversion,
  output directory creation, pixel value preservation (< 1% tolerance)
- Add CliRunnerTests (17 tests): Comprehensive argument parsing for all flags
  (--cli, --batch, --config, -i, -o, --format, --quality, -v), error cases
- Add RawLoaderExtendedTests (7 tests): Error handling, format detection accuracy,
  case-insensitive extension matching
- Update test CMakeLists.txt with new test executables

Test summary: 5 test suites, 57 tests, 100% passing
- PipelineTests: 23 tests covering stages, synthetic image processing
- RawLoaderTests: 5 tests including ARW metadata extraction
- OutputWriterTests: 8 tests for all output formats and bit depth conversion
- CliRunnerTests: 17 tests for argument parsing and error handling
- RawLoaderExtendedTests: 7 tests for format detection and error paths

Addresses CLAUDE.md requirements:
- Tests use RAW golden files (DSC09246.ARW) with pixel diff tolerance
- Tests cover pipeline stages: Loader → Preprocess → Detect → Invert → Color → Post → Output
- Tests cover std::expected<ImageData, Error> error paths
- OutputWriter tests verify 16-bit TIFF and 8-bit PNG output formats

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:58:53 +01:00
Christoph K.
e740234a06 fix: respect config film_type to force negative inversion
NegativeDetector now accepts an optional forced FilmType. When
film_type != "auto" in config.ini, auto-detection is skipped and
the configured type is applied directly. build_pipeline() in
CliRunner maps c41→ColorNegative and bw→BWNegative accordingly.

Default config changed from film_type=auto to film_type=c41 to
match the project's primary use case (C-41 color negatives).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:56:39 +01:00
Christoph K.
ee016b9a5a chore: set default output format to JPG, add .gitignore
- config.ini: output_format = jpg (quality 95)
- .gitignore: exclude build/, output/, IDE files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:54:19 +01:00
Christoph K.
e5f6fa88fd fix: make project compilable on Ubuntu with Qt 6.4 and no GTest
- Lower Qt6 minimum version requirement from 6.8 to 6.4
- tests/CMakeLists.txt: fall back to FetchContent for GTest if not found
- Add MIT LICENSE file (required by CPack)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:52:34 +01:00
Christoph K.
73ccaa3e95 feat: extend CliRunner with config file/batch mode and add comprehensive tests
CliRunner:
- --batch / --config <file> flags trigger batch mode with directory scanning
- collect_files() with recursive support and case-insensitive extension matching
- build_pipeline() respects AppConfig conversion flags (invert toggle)
- Progress output to stderr: "[1/42] Processing DSC09246.ARW..."

Tests (test_pipeline.cpp):
- AppConfig: load/save roundtrip, missing file error, extension parsing,
  format mapping, write_default
- CropProcessor: levels adjustment, sharpening no-clip, empty image error
- ColorCorrector: AWB preserves neutral grey, skips B&W film
- Inverter: color negative changes values, B&W inversion, positive passthrough
- Preprocessor: 8-bit→16-bit conversion

test_rawloader.cpp: added missing <fstream> include

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:42:01 +01:00
Christoph K.
db39ef8c58 feat: add Windows cross-compilation build script
scripts/build-windows.sh configures and builds with the MinGW-w64 toolchain,
collects runtime DLLs (OpenCV, LibRaw, Qt6, MinGW runtime) into dist-windows/,
strips release binaries, and packages a ZIP archive.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:41:50 +01:00
Christoph K.
54efb58c65 feat: add MinGW-w64 cross-compilation toolchain and CPack packaging
- CMakeLists.txt: adds AppConfig to converter_core sources, LibRaw fallback
  find_library for MinGW, CPack config for NSIS+ZIP (Windows) and TGZ+DEB
  (Linux), install rules for binary and example config
- cmake/toolchain-mingw64.cmake: x86_64-w64-mingw32 toolchain, static
  libgcc/libstdc++ linking, optional vcpkg x64-mingw-static triplet

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:41:33 +01:00
Christoph K.
71d535fc50 feat: extend MainWindow with QThread worker, settings panel, and batch dialog
- ConversionWorker runs pipeline on background QThread so the GUI stays
  responsive during conversion; emits file_done, preview_ready, finished
- MainWindow adds: output-format QComboBox, film-type QComboBox, Batch button
  that opens an AppConfig INI file and discovers files from batch.input_dir
- main.cpp: --batch and --config flags trigger CLI mode without Qt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:41:23 +01:00
Christoph K.
fd2d97ddeb feat: implement all core pipeline stage algorithms
- CropProcessor: Canny/contour auto-crop with kMinFrameAreaRatio guard,
  percentile-based levels adjustment (0.5th/99.5th), unsharp mask sharpening
- Inverter: C-41 orange mask removal via border sampling + per-channel
  pedestal subtraction before bitwise_not; B&W simple bitwise_not
- ColorCorrector: LAB-space C-41 cast correction (a*/b* re-centering)
  followed by gray-world auto white balance; EXIF WB fallback
- Preprocessor: 8-bit→16-bit scaling already correct; deskew stub retained

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:41:18 +01:00
Christoph K.
344c22b6e3 feat: add AppConfig INI-based configuration system
Implements a zero-dependency INI parser for application settings with
[batch], [conversion], and [quality] sections. Includes AppConfig::load(),
write_default(), output_format(), and parsed_extensions() helpers, along
with a documented config.ini example file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:41:07 +01:00
Christoph K.
65b411b23d chore: initial project scaffold from architecture design
- Add CLAUDE.md with project overview, tech stack, build commands,
  architecture description, coding standards, and sample images section
- Add full directory structure: src/, docs/, tests/, import/
- Add CMakeLists.txt with C++20, OpenCV/LibRaw/Qt6 dependencies,
  converter_core static lib, optional GUI, and GTest tests
- Add architecture documentation: ARCHITECTURE.md, PIPELINE.md, MODULES.md
- Add source skeletons for all pipeline stages:
  RawLoader, Preprocessor, NegativeDetector, Inverter, ColorCorrector,
  CropProcessor, OutputWriter, Pipeline, MainWindow, CliRunner, main.cpp
- Add initial test stubs for pipeline and rawloader
- Add sample ARW files in import/ for integration testing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 09:28:32 +01:00