From f6c788c037036a66653043d8c1bfbfd3f68cd0f2 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 5 Jul 2026 18:44:34 +0100 Subject: [PATCH 1/4] build: extract graph-compose-testing into a standalone module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The consumer testing helpers — LayoutSnapshotAssertions (deterministic layout snapshots) and PdfVisualRegression (page pixel-diff) — shipped inside the engine jar, forcing Jackson and PDFBox onto every graph-compose consumer. Split them into their own published, lockstep-versioned module so the core stays lean and consumers opt in at test scope. Imports are unchanged (same com.demcha.compose.testing.* packages); only the artifact carrying them moves. - New graph-compose-testing module (standalone + published, like render-docx), carrying com.demcha.compose.testing.{layout,visual} plus its Jackson and PDFBox dependencies. The engine pom drops Jackson. - New non-published graph-compose-qa module (aggregator child, reactor tail) for the cross-module suites that need the testing module on the classpath — they cannot stay in the engine's test scope without a reactor cycle. They reuse the engine's shared test scaffolding through its existing tests-classifier jar, and their snapshot/visual baselines move with them. - Wire both into aggregator/pom.xml, publish.yml (deploy testing), and cut-release.ps1 (bump + commit testing); the CI build gate now runs the engine + testing + qa reactor slice on every matrix JDK. - VersionConsistencyGuardTest now holds graph-compose-testing and graph-compose-render-docx at the engine version and requires qa to inherit its version from the aggregator parent. --- .github/workflows/ci.yml | 7 +- .github/workflows/publish.yml | 10 + .gitignore | 1 + CHANGELOG.md | 7 + aggregator/pom.xml | 2 + docs/operations/layout-snapshot-testing.md | 2 +- docs/operations/visual-regression-testing.md | 2 +- docs/recipes/snapshot-testing.md | 6 +- pom.xml | 25 +- qa/pom.xml | 154 +++++++++++ .../document/api/DocumentListNodeTest.java | 0 .../api/DocumentSessionImageTest.java | 0 .../document/api/PathNodeRenderingTest.java | 0 .../pdf/FontShowcaseLayoutSnapshotTest.java | 0 .../document/dsl/CanvasLayerBuilderTest.java | 0 .../document/dsl/ChartLayoutSnapshotTest.java | 0 .../document/dsl/ListBuilderNestedTest.java | 0 .../dsl/ShapeContainerLayoutSnapshotTest.java | 0 .../table/TableCellComposedContentTest.java | 0 .../templates/TemplateTestSupport.java | 0 .../CoverLetterV2VisualParityTest.java | 0 .../cv/presets/CvV2VisualParityTest.java | 0 .../presets/InvoiceV2VisualParityTest.java | 0 .../presets/ProposalV2VisualParityTest.java | 0 .../FeatureShowcaseRenderTest.java | 0 .../RepositoryShowcaseRenderTest.java | 20 +- .../TablePaginationIntegrationTest.java | 0 .../layout/LayoutSnapshotExtractorTest.java | 0 .../LayoutSnapshotPublicApiDogfoodTest.java | 0 .../visual/DebugNodeLabelsDemoTest.java | 0 .../testing/visual/HeadingBarDemoTest.java | 0 .../LayoutSnapshotRegressionDemoTest.java | 0 .../testing/visual/LineDashedDemoTest.java | 0 .../testing/visual/PathPrimitiveDemoTest.java | 0 .../visual/PdfVisualRegressionTest.java | 0 .../visual/PublicVisualApiDogfoodTest.java | 0 .../visual/ShapeClipPathVisualTest.java | 0 .../ShapeContainerPerCornerDemoTest.java | 0 .../ShapeContainerVisualRegressionTest.java | 0 .../testing/visual/TableRowSpanDemoTest.java | 0 .../visual/TextVerticalAlignDemoTest.java | 0 .../testing/visual/TimelineDemoTest.java | 0 .../template_v2_letter_blue_banner.json | 0 .../template_v2_letter_boxed_sections.json | 0 .../template_v2_letter_centered_headline.json | 0 .../template_v2_letter_classic_serif.json | 0 .../template_v2_letter_compact_mono.json | 0 .../template_v2_letter_editorial_blue.json | 0 ...template_v2_letter_engineering_resume.json | 0 .../template_v2_letter_executive.json | 0 ...emplate_v2_letter_modern_professional.json | 0 .../template_v2_letter_monogram_sidebar.json | 0 .../template_v2_letter_nordic_clean.json | 0 .../template_v2_letter_panel.json | 0 .../template_v2_letter_sidebar_portrait.json | 0 .../template_v2_letter_timeline_minimal.json | 0 .../boxed_sections_education_block.json | 0 .../boxed_sections_key_value_bold_key.json | 0 ..._sections_prose_rejection_legacy_path.json | 0 .../boxed_sections_work_history_block.json | 0 .../cv-v2/template_v2_cv_blue_banner.json | 0 .../cv-v2/template_v2_cv_boxed_sections.json | 0 .../template_v2_cv_centered_headline.json | 0 .../cv-v2/template_v2_cv_classic_serif.json | 0 .../cv-v2/template_v2_cv_compact_mono.json | 0 .../cv-v2/template_v2_cv_editorial_blue.json | 0 .../template_v2_cv_engineering_resume.json | 0 .../cv-v2/template_v2_cv_executive.json | 0 .../template_v2_cv_modern_professional.json | 0 .../template_v2_cv_monogram_sidebar.json | 0 .../cv-v2/template_v2_cv_nordic_clean.json | 0 .../cv-v2/template_v2_cv_panel.json | 0 .../template_v2_cv_sidebar_portrait.json | 0 .../template_v2_cv_timeline_minimal.json | 0 .../invoice/invoice_standard_layout.json | 0 .../proposal/proposal_long_layout.json | 0 ...kly_schedule_changed_category_catalog.json | 0 .../weekly_schedule_standard.json | 0 ...eekly_schedule_with_additional_person.json | 0 ...eekly_schedule_without_metrics_footer.json | 0 .../charts/grouped_bar_basic.json | 0 .../layout-snapshots/charts/line_basic.json | 0 .../charts/line_monotone.json | 0 .../document/canvas_layer_basic.json | 0 .../document/list_markers.json | 0 .../document/nested_list_three_levels.json | 0 .../document/path_primitive.json | 0 .../document/table_cell_with_paragraph.json | 0 .../fonts/available_fonts_preview.json | 0 .../integration/container_split.json | 0 .../features/barcode_showcase_render.json | 0 .../features/document_features_paginated.json | 0 .../integration/massive_text.json | 0 .../repository_showcase_render.json | 0 .../integration/table_pagination_test.json | 0 .../shape-container/circle_with_text.json | 0 .../shape-container/ellipse_with_overlay.json | 0 qa/src/test/resources/logback.xml | 123 +++++++++ .../blue_banner-page-0.png | Bin .../boxed_sections-page-0.png | Bin .../centered_headline-page-0.png | Bin .../classic_serif-page-0.png | Bin .../compact_mono-page-0.png | Bin .../editorial_blue-page-0.png | Bin .../engineering_resume-page-0.png | Bin .../executive-page-0.png | Bin .../mint-editorial-letter-page-0.png | Bin .../modern_professional-page-0.png | Bin .../monogram_sidebar-page-0.png | Bin .../nordic_clean-page-0.png | Bin .../coverletter-v2-layered/panel-page-0.png | Bin .../sidebar_portrait-page-0.png | Bin .../timeline_minimal-page-0.png | Bin .../coverletter-v2/blue_banner-page-0.png | Bin .../coverletter-v2/boxed_sections-page-0.png | Bin .../centered_headline-page-0.png | Bin .../coverletter-v2/classic_serif-page-0.png | Bin .../coverletter-v2/compact_mono-page-0.png | Bin .../coverletter-v2/editorial_blue-page-0.png | Bin .../engineering_resume-page-0.png | Bin .../coverletter-v2/executive-page-0.png | Bin .../modern_professional-page-0.png | Bin .../monogram_sidebar-page-0.png | Bin .../coverletter-v2/nordic_clean-page-0.png | Bin .../coverletter-v2/panel-page-0.png | Bin .../sidebar_portrait-page-0.png | Bin .../timeline_minimal-page-0.png | Bin .../cv-v2-layered/blue_banner-page-0.png | Bin .../cv-v2-layered/blue_banner-page-1.png | Bin .../cv-v2-layered/boxed_sections-page-0.png | Bin .../cv-v2-layered/boxed_sections-page-1.png | Bin .../centered_headline-page-0.png | Bin .../centered_headline-page-1.png | Bin .../cv-v2-layered/classic_serif-page-0.png | Bin .../cv-v2-layered/classic_serif-page-1.png | Bin .../cv-v2-layered/compact_mono-page-0.png | Bin .../cv-v2-layered/editorial_blue-page-0.png | Bin .../cv-v2-layered/editorial_blue-page-1.png | Bin .../engineering_resume-page-0.png | Bin .../cv-v2-layered/executive-page-0.png | Bin .../cv-v2-layered/executive-page-1.png | Bin .../minimal_underlined-page-0.png | Bin .../minimal_underlined-page-1.png | Bin .../cv-v2-layered/mint_editorial-page-0.png | Bin .../cv-v2-layered/mint_editorial-page-1.png | Bin .../modern_professional-page-0.png | Bin .../modern_professional-page-1.png | Bin .../cv-v2-layered/monogram_sidebar-page-0.png | Bin .../cv-v2-layered/nordic_clean-page-0.png | Bin .../cv-v2-layered/panel-page-0.png | Bin .../cv-v2-layered/sidebar_portrait-page-0.png | Bin .../cv-v2-layered/timeline_minimal-page-0.png | Bin .../cv-v2/blue_banner-page-0.png | Bin .../cv-v2/boxed_sections-page-0.png | Bin .../cv-v2/centered_headline-page-0.png | Bin .../cv-v2/classic_serif-page-0.png | Bin .../cv-v2/classic_serif-page-1.png | Bin .../cv-v2/compact_mono-page-0.png | Bin .../cv-v2/editorial_blue-page-0.png | Bin .../cv-v2/engineering_resume-page-0.png | Bin .../cv-v2/executive-page-0.png | Bin .../cv-v2/modern_professional-page-0.png | Bin .../cv-v2/monogram_sidebar-page-0.png | Bin .../cv-v2/nordic_clean-page-0.png | Bin .../visual-baselines/cv-v2/panel-page-0.png | Bin .../cv-v2/sidebar_portrait-page-0.png | Bin .../cv-v2/timeline_minimal-page-0.png | Bin .../modern_invoice-page-0.png | Bin .../modern_proposal-page-0.png | Bin .../modern_proposal-page-1.png | Bin ...hape-container-circle-with-text-page-0.png | Bin ...shape-container-ellipse-overlay-page-0.png | Bin .../shape-container-rounded-card-page-0.png | Bin scripts/cut-release.ps1 | 6 + .../VersionConsistencyGuardTest.java | 9 + testing/pom.xml | 239 ++++++++++++++++++ .../layout/LayoutSnapshotAssertions.java | 0 .../testing/layout/LayoutSnapshotJson.java | 0 .../compose/testing/layout/package-info.java | 0 .../compose/testing/visual/ImageDiff.java | 0 .../testing/visual/PdfVisualRegression.java | 0 .../compose/testing/visual/package-info.java | 0 .../layout/LayoutSnapshotAssertionsTest.java | 0 183 files changed, 583 insertions(+), 30 deletions(-) create mode 100644 qa/pom.xml rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentListNodeTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionImageTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/api/PathNodeRenderingTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/CanvasLayerBuilderTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/ListBuilderNestedTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/ShapeContainerLayoutSnapshotTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/table/TableCellComposedContentTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/templates/TemplateTestSupport.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/CvV2VisualParityTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/FeatureShowcaseRenderTest.java (100%) rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java (94%) rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TablePaginationIntegrationTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/layout/LayoutSnapshotExtractorTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/layout/LayoutSnapshotPublicApiDogfoodTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/DebugNodeLabelsDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/HeadingBarDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/LayoutSnapshotRegressionDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/LineDashedDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/PathPrimitiveDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/PdfVisualRegressionTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/PublicVisualApiDogfoodTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/ShapeClipPathVisualTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/ShapeContainerPerCornerDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/ShapeContainerVisualRegressionTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/TableRowSpanDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/TextVerticalAlignDemoTest.java (100%) rename {src => qa/src}/test/java/com/demcha/testing/visual/TimelineDemoTest.java (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_blue_banner.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_boxed_sections.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_centered_headline.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_classic_serif.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_compact_mono.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_editorial_blue.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_engineering_resume.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_executive.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_modern_professional.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_monogram_sidebar.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_nordic_clean.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_panel.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_sidebar_portrait.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_timeline_minimal.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_education_block.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_key_value_bold_key.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_prose_rejection_legacy_path.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_work_history_block.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_blue_banner.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_boxed_sections.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_centered_headline.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_classic_serif.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_compact_mono.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_editorial_blue.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_engineering_resume.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_executive.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_modern_professional.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_monogram_sidebar.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_nordic_clean.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_panel.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_sidebar_portrait.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_timeline_minimal.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/invoice/invoice_standard_layout.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/proposal/proposal_long_layout.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_changed_category_catalog.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_standard.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_with_additional_person.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_without_metrics_footer.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/charts/grouped_bar_basic.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/charts/line_basic.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/charts/line_monotone.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/document/canvas_layer_basic.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/document/list_markers.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/document/nested_list_three_levels.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/document/path_primitive.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/document/table_cell_with_paragraph.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/fonts/available_fonts_preview.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/container_split.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/features/barcode_showcase_render.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/features/document_features_paginated.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/massive_text.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/repository_showcase_render.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/integration/table_pagination_test.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/shape-container/circle_with_text.json (100%) rename {src => qa/src}/test/resources/layout-snapshots/shape-container/ellipse_with_overlay.json (100%) create mode 100644 qa/src/test/resources/logback.xml rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/blue_banner-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/boxed_sections-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/centered_headline-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/classic_serif-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/compact_mono-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/editorial_blue-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/engineering_resume-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/executive-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/mint-editorial-letter-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/modern_professional-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/monogram_sidebar-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/nordic_clean-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/panel-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/sidebar_portrait-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2-layered/timeline_minimal-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/blue_banner-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/boxed_sections-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/centered_headline-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/classic_serif-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/compact_mono-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/editorial_blue-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/engineering_resume-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/executive-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/modern_professional-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/monogram_sidebar-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/nordic_clean-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/panel-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/sidebar_portrait-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/coverletter-v2/timeline_minimal-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/compact_mono-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/engineering_resume-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/executive-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/executive-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/monogram_sidebar-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/nordic_clean-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/panel-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/sidebar_portrait-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2-layered/timeline_minimal-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/blue_banner-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/boxed_sections-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/centered_headline-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/classic_serif-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/classic_serif-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/compact_mono-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/editorial_blue-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/engineering_resume-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/executive-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/modern_professional-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/monogram_sidebar-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/nordic_clean-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/panel-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/sidebar_portrait-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/cv-v2/timeline_minimal-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/invoice-v2-layered/modern_invoice-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-1.png (100%) rename {src => qa/src}/test/resources/visual-baselines/shape-container-circle-with-text-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/shape-container-ellipse-overlay-page-0.png (100%) rename {src => qa/src}/test/resources/visual-baselines/shape-container-rounded-card-page-0.png (100%) create mode 100644 testing/pom.xml rename {src => testing/src}/main/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertions.java (100%) rename {src => testing/src}/main/java/com/demcha/compose/testing/layout/LayoutSnapshotJson.java (100%) rename {src => testing/src}/main/java/com/demcha/compose/testing/layout/package-info.java (100%) rename {src => testing/src}/main/java/com/demcha/compose/testing/visual/ImageDiff.java (100%) rename {src => testing/src}/main/java/com/demcha/compose/testing/visual/PdfVisualRegression.java (100%) rename {src => testing/src}/main/java/com/demcha/compose/testing/visual/package-info.java (100%) rename {src => testing/src}/test/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertionsTest.java (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3201cb851..3b1d2464a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,12 @@ jobs: cache: maven - name: Build and run tests - run: ./mvnw -B -ntp clean verify + # Reactor slice: the engine plus the extracted graph-compose-testing + # module and the graph-compose-qa cross-module suites (which need the + # testing module + the engine test-jar on the classpath and so cannot + # live in the engine's own test scope). -am pulls the fonts / emoji + # upstreams; render-docx / bundle / examples / benchmarks are excluded. + run: ./mvnw -B -ntp -f aggregator/pom.xml clean verify -pl :graph-compose,:graph-compose-testing,:graph-compose-qa -am - name: Generate Javadoc # Run only on the baseline JDK — Javadoc output is identical diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f0be42a20..69f6974f0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -109,6 +109,16 @@ jobs: CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + - name: Publish testing to Maven Central + # Consumer testing support (LayoutSnapshotAssertions / PdfVisualRegression), + # lockstep-versioned with the engine (ships on the same v* tag). graph-compose + # resolves from the local repo installed by the engine deploy above. + run: ./mvnw -B -ntp -f testing/pom.xml -P release -DskipTests -Dgpg.skip=false deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + - name: Publish bundle to Maven Central # The graph-compose-bundle convenience aggregate pins this engine # version + a compatible graph-compose-fonts version. It tracks the diff --git a/.gitignore b/.gitignore index 57ac55088..17c75d506 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ build/ .DS_Store /logs/ benchmarks/logs/ +qa/logs/ /CV_Generated.pdf *.pdf # Allow PDF previews that are committed README assets. diff --git a/CHANGELOG.md b/CHANGELOG.md index e94fac197..f3a72e20b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,13 @@ for this cycle. to `com.demcha.compose.document.backend.semantic.pptx`; add `graph-compose-render-docx` (it brings POI transitively) to export DOCX. The `no-poi` build profile is retired. +- `graph-compose-testing` is now a separate artifact: the consumer testing + support — `LayoutSnapshotAssertions` (deterministic layout snapshots) and + `PdfVisualRegression` (pixel-diff of rendered pages) — leaves the + `graph-compose` jar together with its Jackson and PDFBox dependencies. The + `com.demcha.compose.testing.layout` / `com.demcha.compose.testing.visual` + packages are unchanged, so imports stay the same; add `graph-compose-testing` + at test scope to keep using them. ## v1.9.0 — 2026-06-29 diff --git a/aggregator/pom.xml b/aggregator/pom.xml index 2f5361242..e1b7814bd 100644 --- a/aggregator/pom.xml +++ b/aggregator/pom.xml @@ -61,8 +61,10 @@ ../fonts ../emoji ../render-docx + ../testing ../bundle ../examples ../benchmarks + ../qa diff --git a/docs/operations/layout-snapshot-testing.md b/docs/operations/layout-snapshot-testing.md index 16e8cd46d..849253271 100644 --- a/docs/operations/layout-snapshot-testing.md +++ b/docs/operations/layout-snapshot-testing.md @@ -288,7 +288,7 @@ Or update a focused test only: ./mvnw "-Dgraphcompose.updateSnapshots=true" "-Dtest=MyFeatureLayoutSnapshotTest" test ``` -The same property works for downstream projects that use `LayoutSnapshotAssertions` from the published GraphCompose artifact. +The same property works for downstream projects that use `LayoutSnapshotAssertions` from the published `graph-compose-testing` artifact. In normal mode: diff --git a/docs/operations/visual-regression-testing.md b/docs/operations/visual-regression-testing.md index 980887cda..9417e943a 100644 --- a/docs/operations/visual-regression-testing.md +++ b/docs/operations/visual-regression-testing.md @@ -23,7 +23,7 @@ The semantic layer is cheap, deterministic, and cross-platform stable. The pixel ## Public API -The harness is `com.demcha.compose.testing.visual.PdfVisualRegression` (`@since 1.6.9`), a sibling to the semantic `com.demcha.compose.testing.layout.*` helpers. It ships in the main artifact, so library consumers use the exact helpers GraphCompose uses in its own tests. +The harness is `com.demcha.compose.testing.visual.PdfVisualRegression` (`@since 1.6.9`), a sibling to the semantic `com.demcha.compose.testing.layout.*` helpers. It ships in the `graph-compose-testing` artifact (split out of the engine jar in 2.0) — add it at test scope, and consumers use the exact helpers GraphCompose uses in its own tests. ### Assert a committed baseline diff --git a/docs/recipes/snapshot-testing.md b/docs/recipes/snapshot-testing.md index 41098784d..2712b81b5 100644 --- a/docs/recipes/snapshot-testing.md +++ b/docs/recipes/snapshot-testing.md @@ -29,8 +29,10 @@ void invoiceLayoutIsStable() throws Exception { The slash-delimited key is a logical path: this example compares against `src/test/resources/layout-snapshots/templates/invoice/invoice_baseline.json`. -`LayoutSnapshotAssertions` ships in the main GraphCompose artifact, so -consumer projects can use it without any extra test dependency. +`LayoutSnapshotAssertions` ships in the `graph-compose-testing` artifact +(`io.github.demchaav:graph-compose-testing`), split out of the engine jar in +2.0. Add it at test scope alongside `graph-compose`; the import path is +unchanged. ## First run and updates diff --git a/pom.xml b/pom.xml index 9354ac2c1..7156bc88f 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,6 @@ 0.64.8 - 2.21.4 1.5.37 1.18.46 3.0.7 @@ -103,13 +102,6 @@ pom import - - com.fasterxml.jackson - jackson-bom - ${jackson.bom.version} - pom - import - @@ -181,21 +173,6 @@ ${flexmark.version} - - com.fasterxml.jackson.core - jackson-annotations - - - - com.fasterxml.jackson.core - jackson-core - - - - com.fasterxml.jackson.core - jackson-databind - - com.google.zxing core @@ -461,7 +438,7 @@ true public true - com.demcha.compose.document:com.demcha.compose.testing + com.demcha.compose.document diff --git a/qa/pom.xml b/qa/pom.xml new file mode 100644 index 000000000..40f808c24 --- /dev/null +++ b/qa/pom.xml @@ -0,0 +1,154 @@ + + + 4.0.0 + + + + io.github.demchaav + graph-compose-build + 2.0.0-SNAPSHOT + ../aggregator/pom.xml + + + graph-compose-qa + GraphCompose QA + Non-published cross-module test suites and shared fixtures for GraphCompose. + + + UTF-8 + 17 + + 3.15.0 + 3.5.6 + + 2.21.4 + 6.1.1 + 3.27.7 + 5.23.0 + 1.5.37 + 3.0.7 + + + + + + io.github.demchaav + graph-compose + ${project.version} + test + + + + io.github.demchaav + graph-compose + ${project.version} + test-jar + tests + test + + + io.github.demchaav + graph-compose-testing + ${project.version} + test + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + test + + + io.github.demchaav + graph-compose-emoji + ${graphcompose.emoji.version} + test + + + + org.apache.pdfbox + pdfbox + ${pdfbox.version} + test + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.bom.version} + test + + + + org.junit.jupiter + junit-jupiter + ${junit.bom.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + ch.qos.logback + logback-classic + ${logback.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.plugin.version} + + + + diff --git a/src/test/java/com/demcha/compose/document/api/DocumentListNodeTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentListNodeTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/api/DocumentListNodeTest.java rename to qa/src/test/java/com/demcha/compose/document/api/DocumentListNodeTest.java diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionImageTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionImageTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/api/DocumentSessionImageTest.java rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionImageTest.java diff --git a/src/test/java/com/demcha/compose/document/api/PathNodeRenderingTest.java b/qa/src/test/java/com/demcha/compose/document/api/PathNodeRenderingTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/api/PathNodeRenderingTest.java rename to qa/src/test/java/com/demcha/compose/document/api/PathNodeRenderingTest.java diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java rename to qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java diff --git a/src/test/java/com/demcha/compose/document/dsl/CanvasLayerBuilderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/CanvasLayerBuilderTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/dsl/CanvasLayerBuilderTest.java rename to qa/src/test/java/com/demcha/compose/document/dsl/CanvasLayerBuilderTest.java diff --git a/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java rename to qa/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java diff --git a/src/test/java/com/demcha/compose/document/dsl/ListBuilderNestedTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/ListBuilderNestedTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/dsl/ListBuilderNestedTest.java rename to qa/src/test/java/com/demcha/compose/document/dsl/ListBuilderNestedTest.java diff --git a/src/test/java/com/demcha/compose/document/dsl/ShapeContainerLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/ShapeContainerLayoutSnapshotTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/dsl/ShapeContainerLayoutSnapshotTest.java rename to qa/src/test/java/com/demcha/compose/document/dsl/ShapeContainerLayoutSnapshotTest.java diff --git a/src/test/java/com/demcha/compose/document/table/TableCellComposedContentTest.java b/qa/src/test/java/com/demcha/compose/document/table/TableCellComposedContentTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/table/TableCellComposedContentTest.java rename to qa/src/test/java/com/demcha/compose/document/table/TableCellComposedContentTest.java diff --git a/src/test/java/com/demcha/compose/document/templates/TemplateTestSupport.java b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTestSupport.java similarity index 100% rename from src/test/java/com/demcha/compose/document/templates/TemplateTestSupport.java rename to qa/src/test/java/com/demcha/compose/document/templates/TemplateTestSupport.java diff --git a/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java rename to qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/CvV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvV2VisualParityTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/templates/cv/presets/CvV2VisualParityTest.java rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvV2VisualParityTest.java diff --git a/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java rename to qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceV2VisualParityTest.java diff --git a/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java similarity index 100% rename from src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java rename to qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java diff --git a/src/test/java/com/demcha/compose/engine/integration/FeatureShowcaseRenderTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/FeatureShowcaseRenderTest.java similarity index 100% rename from src/test/java/com/demcha/compose/engine/integration/FeatureShowcaseRenderTest.java rename to qa/src/test/java/com/demcha/compose/engine/integration/FeatureShowcaseRenderTest.java diff --git a/src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java similarity index 94% rename from src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java rename to qa/src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java index 3543642ab..7c9b5df20 100644 --- a/src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java +++ b/qa/src/test/java/com/demcha/compose/engine/integration/RepositoryShowcaseRenderTest.java @@ -24,13 +24,31 @@ import org.junit.jupiter.api.Test; import java.awt.Color; +import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; class RepositoryShowcaseRenderTest { - private static final Path COVER_ASSET = Path.of("assets", "GraphComposeCover.png"); + private static final Path COVER_ASSET = locateRepoAsset(Path.of("assets", "GraphComposeCover.png")); + + /** + * Resolves a repository-root asset independently of which module runs the + * test. The suite moved from the engine module (working dir = repo root) to + * the qa reactor tail (working dir = {@code qa/}); walking up from the + * working directory until the relative path resolves keeps the cover image + * reachable from either location. + */ + private static Path locateRepoAsset(Path relative) { + for (Path dir = Path.of("").toAbsolutePath(); dir != null; dir = dir.getParent()) { + Path candidate = dir.resolve(relative); + if (Files.exists(candidate)) { + return candidate; + } + } + return relative; + } private static final Color TITLE_COLOR = new Color(18, 40, 74); private static final Color ACCENT_COLOR = new Color(37, 128, 197); private static final Color MUTED_COLOR = new Color(86, 98, 120); diff --git a/src/test/java/com/demcha/compose/engine/integration/TablePaginationIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TablePaginationIntegrationTest.java similarity index 100% rename from src/test/java/com/demcha/compose/engine/integration/TablePaginationIntegrationTest.java rename to qa/src/test/java/com/demcha/compose/engine/integration/TablePaginationIntegrationTest.java diff --git a/src/test/java/com/demcha/testing/layout/LayoutSnapshotExtractorTest.java b/qa/src/test/java/com/demcha/testing/layout/LayoutSnapshotExtractorTest.java similarity index 100% rename from src/test/java/com/demcha/testing/layout/LayoutSnapshotExtractorTest.java rename to qa/src/test/java/com/demcha/testing/layout/LayoutSnapshotExtractorTest.java diff --git a/src/test/java/com/demcha/testing/layout/LayoutSnapshotPublicApiDogfoodTest.java b/qa/src/test/java/com/demcha/testing/layout/LayoutSnapshotPublicApiDogfoodTest.java similarity index 100% rename from src/test/java/com/demcha/testing/layout/LayoutSnapshotPublicApiDogfoodTest.java rename to qa/src/test/java/com/demcha/testing/layout/LayoutSnapshotPublicApiDogfoodTest.java diff --git a/src/test/java/com/demcha/testing/visual/DebugNodeLabelsDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/DebugNodeLabelsDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/DebugNodeLabelsDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/DebugNodeLabelsDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/HeadingBarDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/HeadingBarDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/HeadingBarDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/HeadingBarDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/LayoutSnapshotRegressionDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/LayoutSnapshotRegressionDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/LayoutSnapshotRegressionDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/LayoutSnapshotRegressionDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/LineDashedDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/LineDashedDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/LineDashedDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/LineDashedDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/PathPrimitiveDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/PathPrimitiveDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/PathPrimitiveDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/PathPrimitiveDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/PdfVisualRegressionTest.java b/qa/src/test/java/com/demcha/testing/visual/PdfVisualRegressionTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/PdfVisualRegressionTest.java rename to qa/src/test/java/com/demcha/testing/visual/PdfVisualRegressionTest.java diff --git a/src/test/java/com/demcha/testing/visual/PublicVisualApiDogfoodTest.java b/qa/src/test/java/com/demcha/testing/visual/PublicVisualApiDogfoodTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/PublicVisualApiDogfoodTest.java rename to qa/src/test/java/com/demcha/testing/visual/PublicVisualApiDogfoodTest.java diff --git a/src/test/java/com/demcha/testing/visual/ShapeClipPathVisualTest.java b/qa/src/test/java/com/demcha/testing/visual/ShapeClipPathVisualTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/ShapeClipPathVisualTest.java rename to qa/src/test/java/com/demcha/testing/visual/ShapeClipPathVisualTest.java diff --git a/src/test/java/com/demcha/testing/visual/ShapeContainerPerCornerDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/ShapeContainerPerCornerDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/ShapeContainerPerCornerDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/ShapeContainerPerCornerDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/ShapeContainerVisualRegressionTest.java b/qa/src/test/java/com/demcha/testing/visual/ShapeContainerVisualRegressionTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/ShapeContainerVisualRegressionTest.java rename to qa/src/test/java/com/demcha/testing/visual/ShapeContainerVisualRegressionTest.java diff --git a/src/test/java/com/demcha/testing/visual/TableRowSpanDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/TableRowSpanDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/TableRowSpanDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/TableRowSpanDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/TextVerticalAlignDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/TextVerticalAlignDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/TextVerticalAlignDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/TextVerticalAlignDemoTest.java diff --git a/src/test/java/com/demcha/testing/visual/TimelineDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/TimelineDemoTest.java similarity index 100% rename from src/test/java/com/demcha/testing/visual/TimelineDemoTest.java rename to qa/src/test/java/com/demcha/testing/visual/TimelineDemoTest.java diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_blue_banner.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_blue_banner.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_blue_banner.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_blue_banner.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_boxed_sections.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_boxed_sections.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_boxed_sections.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_boxed_sections.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_centered_headline.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_centered_headline.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_centered_headline.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_centered_headline.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_classic_serif.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_classic_serif.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_classic_serif.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_classic_serif.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_compact_mono.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_compact_mono.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_compact_mono.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_compact_mono.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_editorial_blue.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_editorial_blue.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_editorial_blue.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_editorial_blue.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_engineering_resume.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_engineering_resume.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_engineering_resume.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_engineering_resume.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_executive.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_executive.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_executive.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_executive.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_modern_professional.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_modern_professional.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_modern_professional.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_modern_professional.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_monogram_sidebar.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_monogram_sidebar.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_monogram_sidebar.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_monogram_sidebar.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_nordic_clean.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_nordic_clean.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_nordic_clean.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_nordic_clean.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_panel.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_panel.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_panel.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_panel.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_sidebar_portrait.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_sidebar_portrait.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_sidebar_portrait.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_sidebar_portrait.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_timeline_minimal.json b/qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_timeline_minimal.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_timeline_minimal.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/coverletter-v2/template_v2_letter_timeline_minimal.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_education_block.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_education_block.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_education_block.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_education_block.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_key_value_bold_key.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_key_value_bold_key.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_key_value_bold_key.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_key_value_bold_key.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_prose_rejection_legacy_path.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_prose_rejection_legacy_path.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_prose_rejection_legacy_path.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_prose_rejection_legacy_path.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_work_history_block.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_work_history_block.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_work_history_block.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/regression/boxed_sections_work_history_block.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_blue_banner.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_blue_banner.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_blue_banner.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_blue_banner.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_boxed_sections.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_boxed_sections.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_boxed_sections.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_boxed_sections.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_centered_headline.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_centered_headline.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_centered_headline.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_centered_headline.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_classic_serif.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_classic_serif.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_classic_serif.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_classic_serif.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_compact_mono.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_compact_mono.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_compact_mono.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_compact_mono.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_editorial_blue.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_editorial_blue.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_editorial_blue.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_editorial_blue.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_engineering_resume.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_engineering_resume.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_engineering_resume.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_engineering_resume.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_executive.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_executive.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_executive.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_executive.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_modern_professional.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_modern_professional.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_modern_professional.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_modern_professional.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_monogram_sidebar.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_monogram_sidebar.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_monogram_sidebar.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_monogram_sidebar.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_nordic_clean.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_nordic_clean.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_nordic_clean.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_nordic_clean.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_panel.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_panel.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_panel.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_panel.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_sidebar_portrait.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_sidebar_portrait.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_sidebar_portrait.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_sidebar_portrait.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_timeline_minimal.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_timeline_minimal.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_timeline_minimal.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/template_v2_cv_timeline_minimal.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/invoice/invoice_standard_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/invoice_standard_layout.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/invoice/invoice_standard_layout.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/invoice/invoice_standard_layout.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/proposal/proposal_long_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/proposal/proposal_long_layout.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/proposal/proposal_long_layout.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/proposal/proposal_long_layout.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_changed_category_catalog.json b/qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_changed_category_catalog.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_changed_category_catalog.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_changed_category_catalog.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_standard.json b/qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_standard.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_standard.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_standard.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_with_additional_person.json b/qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_with_additional_person.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_with_additional_person.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_with_additional_person.json diff --git a/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_without_metrics_footer.json b/qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_without_metrics_footer.json similarity index 100% rename from src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_without_metrics_footer.json rename to qa/src/test/resources/layout-snapshots/canonical-templates/weekly-schedule/weekly_schedule_without_metrics_footer.json diff --git a/src/test/resources/layout-snapshots/charts/grouped_bar_basic.json b/qa/src/test/resources/layout-snapshots/charts/grouped_bar_basic.json similarity index 100% rename from src/test/resources/layout-snapshots/charts/grouped_bar_basic.json rename to qa/src/test/resources/layout-snapshots/charts/grouped_bar_basic.json diff --git a/src/test/resources/layout-snapshots/charts/line_basic.json b/qa/src/test/resources/layout-snapshots/charts/line_basic.json similarity index 100% rename from src/test/resources/layout-snapshots/charts/line_basic.json rename to qa/src/test/resources/layout-snapshots/charts/line_basic.json diff --git a/src/test/resources/layout-snapshots/charts/line_monotone.json b/qa/src/test/resources/layout-snapshots/charts/line_monotone.json similarity index 100% rename from src/test/resources/layout-snapshots/charts/line_monotone.json rename to qa/src/test/resources/layout-snapshots/charts/line_monotone.json diff --git a/src/test/resources/layout-snapshots/document/canvas_layer_basic.json b/qa/src/test/resources/layout-snapshots/document/canvas_layer_basic.json similarity index 100% rename from src/test/resources/layout-snapshots/document/canvas_layer_basic.json rename to qa/src/test/resources/layout-snapshots/document/canvas_layer_basic.json diff --git a/src/test/resources/layout-snapshots/document/list_markers.json b/qa/src/test/resources/layout-snapshots/document/list_markers.json similarity index 100% rename from src/test/resources/layout-snapshots/document/list_markers.json rename to qa/src/test/resources/layout-snapshots/document/list_markers.json diff --git a/src/test/resources/layout-snapshots/document/nested_list_three_levels.json b/qa/src/test/resources/layout-snapshots/document/nested_list_three_levels.json similarity index 100% rename from src/test/resources/layout-snapshots/document/nested_list_three_levels.json rename to qa/src/test/resources/layout-snapshots/document/nested_list_three_levels.json diff --git a/src/test/resources/layout-snapshots/document/path_primitive.json b/qa/src/test/resources/layout-snapshots/document/path_primitive.json similarity index 100% rename from src/test/resources/layout-snapshots/document/path_primitive.json rename to qa/src/test/resources/layout-snapshots/document/path_primitive.json diff --git a/src/test/resources/layout-snapshots/document/table_cell_with_paragraph.json b/qa/src/test/resources/layout-snapshots/document/table_cell_with_paragraph.json similarity index 100% rename from src/test/resources/layout-snapshots/document/table_cell_with_paragraph.json rename to qa/src/test/resources/layout-snapshots/document/table_cell_with_paragraph.json diff --git a/src/test/resources/layout-snapshots/fonts/available_fonts_preview.json b/qa/src/test/resources/layout-snapshots/fonts/available_fonts_preview.json similarity index 100% rename from src/test/resources/layout-snapshots/fonts/available_fonts_preview.json rename to qa/src/test/resources/layout-snapshots/fonts/available_fonts_preview.json diff --git a/src/test/resources/layout-snapshots/integration/container_split.json b/qa/src/test/resources/layout-snapshots/integration/container_split.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/container_split.json rename to qa/src/test/resources/layout-snapshots/integration/container_split.json diff --git a/src/test/resources/layout-snapshots/integration/features/barcode_showcase_render.json b/qa/src/test/resources/layout-snapshots/integration/features/barcode_showcase_render.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/features/barcode_showcase_render.json rename to qa/src/test/resources/layout-snapshots/integration/features/barcode_showcase_render.json diff --git a/src/test/resources/layout-snapshots/integration/features/document_features_paginated.json b/qa/src/test/resources/layout-snapshots/integration/features/document_features_paginated.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/features/document_features_paginated.json rename to qa/src/test/resources/layout-snapshots/integration/features/document_features_paginated.json diff --git a/src/test/resources/layout-snapshots/integration/massive_text.json b/qa/src/test/resources/layout-snapshots/integration/massive_text.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/massive_text.json rename to qa/src/test/resources/layout-snapshots/integration/massive_text.json diff --git a/src/test/resources/layout-snapshots/integration/repository_showcase_render.json b/qa/src/test/resources/layout-snapshots/integration/repository_showcase_render.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/repository_showcase_render.json rename to qa/src/test/resources/layout-snapshots/integration/repository_showcase_render.json diff --git a/src/test/resources/layout-snapshots/integration/table_pagination_test.json b/qa/src/test/resources/layout-snapshots/integration/table_pagination_test.json similarity index 100% rename from src/test/resources/layout-snapshots/integration/table_pagination_test.json rename to qa/src/test/resources/layout-snapshots/integration/table_pagination_test.json diff --git a/src/test/resources/layout-snapshots/shape-container/circle_with_text.json b/qa/src/test/resources/layout-snapshots/shape-container/circle_with_text.json similarity index 100% rename from src/test/resources/layout-snapshots/shape-container/circle_with_text.json rename to qa/src/test/resources/layout-snapshots/shape-container/circle_with_text.json diff --git a/src/test/resources/layout-snapshots/shape-container/ellipse_with_overlay.json b/qa/src/test/resources/layout-snapshots/shape-container/ellipse_with_overlay.json similarity index 100% rename from src/test/resources/layout-snapshots/shape-container/ellipse_with_overlay.json rename to qa/src/test/resources/layout-snapshots/shape-container/ellipse_with_overlay.json diff --git a/qa/src/test/resources/logback.xml b/qa/src/test/resources/logback.xml new file mode 100644 index 000000000..ea732eb0f --- /dev/null +++ b/qa/src/test/resources/logback.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + ${LOG_DIR}/app.log + + ${LOG_DIR}/app-%d{yyyy-MM-dd}.log + 30 + 1GB + + + INFO + ACCEPT + DENY + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + + ${LOG_DIR}/warn.log + + ${LOG_DIR}/warn-%d{yyyy-MM-dd}.log + 30 + 512MB + + + WARN + ACCEPT + DENY + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + + ${LOG_DIR}/error.log + + ${LOG_DIR}/error-%d{yyyy-MM-dd}.log + 30 + 512MB + + + ERROR + ACCEPT + DENY + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + + + + + + + %d{HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{36}) - %msg%n + + + + + + + WARN + + + %d{HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{36}) - %msg%n + + + + + + ${LOG_DIR}/layout-trace.log + + ${LOG_DIR}/layout-trace-%d{yyyy-MM-dd}.log + 14 + 512MB + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{48} - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/blue_banner-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/blue_banner-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/blue_banner-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/blue_banner-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/boxed_sections-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/boxed_sections-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/boxed_sections-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/boxed_sections-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/centered_headline-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/centered_headline-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/centered_headline-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/centered_headline-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/classic_serif-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/classic_serif-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/classic_serif-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/classic_serif-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/compact_mono-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/compact_mono-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/compact_mono-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/compact_mono-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/editorial_blue-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/editorial_blue-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/editorial_blue-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/editorial_blue-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/engineering_resume-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/engineering_resume-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/engineering_resume-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/engineering_resume-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/executive-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/executive-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/executive-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/executive-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/mint-editorial-letter-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/mint-editorial-letter-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/mint-editorial-letter-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/mint-editorial-letter-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/modern_professional-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/modern_professional-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/modern_professional-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/modern_professional-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/monogram_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/monogram_sidebar-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/monogram_sidebar-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/monogram_sidebar-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/nordic_clean-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/nordic_clean-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/nordic_clean-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/nordic_clean-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/panel-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/panel-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/panel-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/panel-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/sidebar_portrait-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/sidebar_portrait-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/sidebar_portrait-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/sidebar_portrait-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2-layered/timeline_minimal-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2-layered/timeline_minimal-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2-layered/timeline_minimal-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2-layered/timeline_minimal-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/blue_banner-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/blue_banner-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/blue_banner-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/blue_banner-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/boxed_sections-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/boxed_sections-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/boxed_sections-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/boxed_sections-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/centered_headline-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/centered_headline-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/centered_headline-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/centered_headline-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/classic_serif-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/classic_serif-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/classic_serif-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/classic_serif-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/compact_mono-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/compact_mono-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/compact_mono-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/compact_mono-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/editorial_blue-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/editorial_blue-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/editorial_blue-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/editorial_blue-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/engineering_resume-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/engineering_resume-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/engineering_resume-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/engineering_resume-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/executive-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/executive-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/executive-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/executive-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/modern_professional-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/modern_professional-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/modern_professional-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/modern_professional-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/monogram_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/monogram_sidebar-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/monogram_sidebar-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/monogram_sidebar-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/nordic_clean-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/nordic_clean-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/nordic_clean-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/nordic_clean-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/panel-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/panel-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/panel-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/panel-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/sidebar_portrait-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/sidebar_portrait-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/sidebar_portrait-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/sidebar_portrait-page-0.png diff --git a/src/test/resources/visual-baselines/coverletter-v2/timeline_minimal-page-0.png b/qa/src/test/resources/visual-baselines/coverletter-v2/timeline_minimal-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/coverletter-v2/timeline_minimal-page-0.png rename to qa/src/test/resources/visual-baselines/coverletter-v2/timeline_minimal-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/blue_banner-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/boxed_sections-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/centered_headline-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/classic_serif-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/compact_mono-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/compact_mono-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/compact_mono-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/compact_mono-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/editorial_blue-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/engineering_resume-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/engineering_resume-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/engineering_resume-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/engineering_resume-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/executive-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/executive-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/executive-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/executive-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/executive-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/executive-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/executive-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/executive-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/minimal_underlined-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/mint_editorial-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/modern_professional-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/monogram_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/monogram_sidebar-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/monogram_sidebar-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/monogram_sidebar-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/nordic_clean-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/nordic_clean-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/nordic_clean-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/nordic_clean-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/panel-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/panel-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/panel-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/panel-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/sidebar_portrait-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/sidebar_portrait-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/sidebar_portrait-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/sidebar_portrait-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2-layered/timeline_minimal-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/timeline_minimal-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2-layered/timeline_minimal-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2-layered/timeline_minimal-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/blue_banner-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/blue_banner-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/blue_banner-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/blue_banner-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/boxed_sections-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/boxed_sections-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/boxed_sections-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/boxed_sections-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/centered_headline-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/centered_headline-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/centered_headline-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/centered_headline-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/classic_serif-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/classic_serif-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/classic_serif-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/classic_serif-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/classic_serif-page-1.png b/qa/src/test/resources/visual-baselines/cv-v2/classic_serif-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/classic_serif-page-1.png rename to qa/src/test/resources/visual-baselines/cv-v2/classic_serif-page-1.png diff --git a/src/test/resources/visual-baselines/cv-v2/compact_mono-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/compact_mono-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/compact_mono-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/compact_mono-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/editorial_blue-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/editorial_blue-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/editorial_blue-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/editorial_blue-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/engineering_resume-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/engineering_resume-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/engineering_resume-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/engineering_resume-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/executive-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/executive-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/executive-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/executive-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/modern_professional-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/modern_professional-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/modern_professional-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/modern_professional-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/monogram_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/monogram_sidebar-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/monogram_sidebar-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/monogram_sidebar-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/nordic_clean-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/nordic_clean-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/nordic_clean-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/nordic_clean-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/panel-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/panel-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/panel-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/panel-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/sidebar_portrait-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/sidebar_portrait-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/sidebar_portrait-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/sidebar_portrait-page-0.png diff --git a/src/test/resources/visual-baselines/cv-v2/timeline_minimal-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2/timeline_minimal-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/cv-v2/timeline_minimal-page-0.png rename to qa/src/test/resources/visual-baselines/cv-v2/timeline_minimal-page-0.png diff --git a/src/test/resources/visual-baselines/invoice-v2-layered/modern_invoice-page-0.png b/qa/src/test/resources/visual-baselines/invoice-v2-layered/modern_invoice-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/invoice-v2-layered/modern_invoice-page-0.png rename to qa/src/test/resources/visual-baselines/invoice-v2-layered/modern_invoice-page-0.png diff --git a/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-0.png b/qa/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-0.png rename to qa/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-0.png diff --git a/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-1.png b/qa/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-1.png similarity index 100% rename from src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-1.png rename to qa/src/test/resources/visual-baselines/proposal-v2-layered/modern_proposal-page-1.png diff --git a/src/test/resources/visual-baselines/shape-container-circle-with-text-page-0.png b/qa/src/test/resources/visual-baselines/shape-container-circle-with-text-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/shape-container-circle-with-text-page-0.png rename to qa/src/test/resources/visual-baselines/shape-container-circle-with-text-page-0.png diff --git a/src/test/resources/visual-baselines/shape-container-ellipse-overlay-page-0.png b/qa/src/test/resources/visual-baselines/shape-container-ellipse-overlay-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/shape-container-ellipse-overlay-page-0.png rename to qa/src/test/resources/visual-baselines/shape-container-ellipse-overlay-page-0.png diff --git a/src/test/resources/visual-baselines/shape-container-rounded-card-page-0.png b/qa/src/test/resources/visual-baselines/shape-container-rounded-card-page-0.png similarity index 100% rename from src/test/resources/visual-baselines/shape-container-rounded-card-page-0.png rename to qa/src/test/resources/visual-baselines/shape-container-rounded-card-page-0.png diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1 index 15c2360a9..77e119e50 100644 --- a/scripts/cut-release.ps1 +++ b/scripts/cut-release.ps1 @@ -482,6 +482,11 @@ try { # render-docx tracks the engine line (lockstep): its bumps here and # its graph-compose dep is ${project.version} (follows automatically). Update-PomVersion (Join-Path $repoRoot 'render-docx/pom.xml') $Version + # graph-compose-testing tracks the engine line (lockstep): its + # bumps here and its graph-compose dep is ${project.version} (follows + # automatically). graph-compose-qa is an aggregator child (its version is + # inherited) and is never published, so it needs no explicit bump. + Update-PomVersion (Join-Path $repoRoot 'testing/pom.xml') $Version # Bundle tracks the engine line: its project bumps here; its # graph-compose dep is ${project.version} (follows automatically) and its # graph-compose-fonts dep is ${graphcompose.fonts.version} (stays pinned — @@ -551,6 +556,7 @@ try { 'aggregator/pom.xml', 'bundle/pom.xml', 'render-docx/pom.xml', + 'testing/pom.xml', 'examples/pom.xml', 'benchmarks/pom.xml', 'README.md', diff --git a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java index 5a4fd50d1..955d64946 100644 --- a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java +++ b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java @@ -61,6 +61,12 @@ void everyModuleResolvesToTheRootProjectVersion() throws Exception { assertThat(effectiveVersion(PROJECT_ROOT.resolve("bundle/pom.xml"))) .describedAs("bundle (graph-compose-bundle) tracks the engine line and must equal the root version (%s)", root) .isEqualTo(root); + assertThat(effectiveVersion(PROJECT_ROOT.resolve("render-docx/pom.xml"))) + .describedAs("render-docx (graph-compose-render-docx) tracks the engine line and must equal the root version (%s)", root) + .isEqualTo(root); + assertThat(effectiveVersion(PROJECT_ROOT.resolve("testing/pom.xml"))) + .describedAs("testing (graph-compose-testing) tracks the engine line and must equal the root version (%s)", root) + .isEqualTo(root); // NOTE: fonts/pom.xml (graph-compose-fonts) is intentionally NOT checked // here. It carries an independent version line (it ships on its own @@ -92,6 +98,9 @@ void childModulesInheritVersionInsteadOfDeclaringTheirOwn() throws Exception { assertThat(declaresOwnVersion(PROJECT_ROOT.resolve("benchmarks/pom.xml"))) .describedAs("benchmarks/pom.xml must inherit from the aggregator parent, not declare its own") .isFalse(); + assertThat(declaresOwnVersion(PROJECT_ROOT.resolve("qa/pom.xml"))) + .describedAs("qa/pom.xml must inherit from the aggregator parent, not declare its own") + .isFalse(); } @Test diff --git a/testing/pom.xml b/testing/pom.xml new file mode 100644 index 000000000..7f9925be2 --- /dev/null +++ b/testing/pom.xml @@ -0,0 +1,239 @@ + + + 4.0.0 + + + io.github.demchaav + graph-compose-testing + 2.0.0-SNAPSHOT + + GraphCompose Testing + Consumer testing support for GraphCompose: layout-snapshot assertions and PDF visual regression. + https://github.com/DemchaAV/GraphCompose + + + + MIT License + https://opensource.org/licenses/MIT + repo + + + + + + DemchaAV + Artem Demchyshyn + demchishynartem@gmail.com + https://github.com/DemchaAV + + Lead Developer + Architect + + UTC 0 + + + + + scm:git:https://github.com/DemchaAV/GraphCompose.git + scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git + https://github.com/DemchaAV/GraphCompose/tree/main + + + + UTF-8 + 17 + + 3.0.7 + 2.21.4 + 6.1.1 + 3.27.7 + 1.5.37 + + 3.15.0 + 3.5.0 + 3.5.6 + 3.4.0 + 3.12.0 + 3.2.8 + 0.11.0 + + + true + + + + + io.github.demchaav + graph-compose + ${project.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.bom.version} + + + org.apache.pdfbox + pdfbox + ${pdfbox.version} + + + + + org.junit.jupiter + junit-jupiter + ${junit.bom.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + ch.qos.logback + logback-classic + ${logback.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.plugin.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.plugin.version} + + com.demcha.compose.testing + all + + + + validate-public-api-javadoc + verify + + javadoc + + + + + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin.version} + + + attach-sources + package + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.plugin.version} + + + attach-javadocs + package + + jar + + + com.demcha.compose.testing + all + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + ${gpg.skip} + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.plugin.version} + true + + central + false + validated + + + + + + + diff --git a/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertions.java b/testing/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertions.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertions.java rename to testing/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertions.java diff --git a/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotJson.java b/testing/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotJson.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotJson.java rename to testing/src/main/java/com/demcha/compose/testing/layout/LayoutSnapshotJson.java diff --git a/src/main/java/com/demcha/compose/testing/layout/package-info.java b/testing/src/main/java/com/demcha/compose/testing/layout/package-info.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/layout/package-info.java rename to testing/src/main/java/com/demcha/compose/testing/layout/package-info.java diff --git a/src/main/java/com/demcha/compose/testing/visual/ImageDiff.java b/testing/src/main/java/com/demcha/compose/testing/visual/ImageDiff.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/visual/ImageDiff.java rename to testing/src/main/java/com/demcha/compose/testing/visual/ImageDiff.java diff --git a/src/main/java/com/demcha/compose/testing/visual/PdfVisualRegression.java b/testing/src/main/java/com/demcha/compose/testing/visual/PdfVisualRegression.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/visual/PdfVisualRegression.java rename to testing/src/main/java/com/demcha/compose/testing/visual/PdfVisualRegression.java diff --git a/src/main/java/com/demcha/compose/testing/visual/package-info.java b/testing/src/main/java/com/demcha/compose/testing/visual/package-info.java similarity index 100% rename from src/main/java/com/demcha/compose/testing/visual/package-info.java rename to testing/src/main/java/com/demcha/compose/testing/visual/package-info.java diff --git a/src/test/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertionsTest.java b/testing/src/test/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertionsTest.java similarity index 100% rename from src/test/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertionsTest.java rename to testing/src/test/java/com/demcha/compose/testing/layout/LayoutSnapshotAssertionsTest.java From e671149ee7519f2a434cbf7e40bb52fe46bda503 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 5 Jul 2026 19:30:56 +0100 Subject: [PATCH 2/4] build: give the examples module its own graph-compose-testing dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The examples module used Jackson (EngineDeckData reads the comparative-benchmark JSON) and LayoutSnapshotJson (LayoutSnapshotRegressionExample), both of which it had been getting transitively from the engine jar. With Jackson and the testing helpers now out of the core, the examples build lost them. Add a direct graph-compose-testing dependency — it supplies LayoutSnapshotJson and brings jackson-databind transitively, restoring the examples compile. --- examples/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/examples/pom.xml b/examples/pom.xml index c96aad7fe..f135206b7 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -76,6 +76,17 @@ ${graphcompose.version} + + + io.github.demchaav + graph-compose-testing + ${graphcompose.version} + + ch.qos.logback logback-classic From 4ad0a1e87af36cfc005fd49ec934b6d8d4ac6875 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 5 Jul 2026 19:44:40 +0100 Subject: [PATCH 3/4] ci: install graph-compose-testing before the examples build The examples module now depends on graph-compose-testing (for LayoutSnapshotJson and the jackson it brings). Like render-docx, that module is a SNAPSHOT not on Maven Central, so the examples-generation job must install it into the local repo after the engine, or dependency resolution fails before compile. --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b1d2464a..74ca8ce23 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -125,6 +125,13 @@ jobs: # dependency) so the examples build resolves it. run: ./mvnw -B -ntp -f render-docx/pom.xml -DskipTests install + - name: Install graph-compose-testing (consumed by the examples module) + # LayoutSnapshotRegressionExample uses LayoutSnapshotJson and EngineDeckData + # reads benchmark JSON through the jackson it brings; the testing module is + # not on Central, so install it after the engine (its graph-compose + # dependency) before the examples build resolves it. + run: ./mvnw -B -ntp -f testing/pom.xml -DskipTests install + - name: Compile examples module run: ./mvnw -B -ntp -f examples/pom.xml clean compile From fbc58a100c3f3b3c01055bf71018b4732faef80c Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 5 Jul 2026 19:54:20 +0100 Subject: [PATCH 4/4] build: install the examples' bumped SNAPSHOT siblings before the showcase exec cut-release.ps1's ShowcaseSync installs only the root artifact before running the examples module via exec:java, but examples also depends on the bumped render-docx and graph-compose-testing SNAPSHOTs, which are not on Maven Central. After the Step-1 version bump they are absent from the local repo, so exec:java fails to resolve them. Install each sibling alongside the root, and mirror the commands in the -DryRun preview. --- scripts/cut-release.ps1 | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1 index 77e119e50..8ab940507 100644 --- a/scripts/cut-release.ps1 +++ b/scripts/cut-release.ps1 @@ -302,22 +302,28 @@ function Run-ShowcaseSync { # lifecycle phase. Wrapping the whole token in quotes preserves it # as a single literal argument. $execProp = '"-Dexec.mainClass=com.demcha.examples.support.ShowcaseSync"' + # The examples module depends on these bumped SNAPSHOT siblings (not on + # Central); each must be installed before exec:java can resolve them. + $exampleSnapshotSiblings = @('render-docx/pom.xml', 'testing/pom.xml') if ($DryRun) { Write-Host " [DRY RUN] $mvnw -B -ntp -DskipTests install -pl ." -ForegroundColor Yellow + foreach ($modulePom in $exampleSnapshotSiblings) { + Write-Host " [DRY RUN] $mvnw -B -ntp -DskipTests install -f $modulePom" -ForegroundColor Yellow + } Write-Host " [DRY RUN] $mvnw -f examples/pom.xml exec:java $execProp" -ForegroundColor Yellow return } Push-Location $repoRoot try { - # ShowcaseSync runs from the examples module, which depends on - # io.github.demchaav:graphcompose:${project.version}. After Step 1 - # bumps the four pom.xml files to the new release version, that - # artifact is not yet in the local m2 cache — only the previous - # release is — so exec:java fails dependency resolution with - # "Could not find artifact ...:graphcompose:jar:". - # Install the root artifact first so the examples module can - # resolve it. Bug surfaced during v1.6.5 cut: Step 4 aborted with - # exit 1; we had to install by hand and resume manually. + # ShowcaseSync runs from the examples module, which depends on the + # engine plus the bumped SNAPSHOT siblings render-docx and + # graph-compose-testing. After Step 1 bumps the poms to the new release + # version, those artifacts are not yet in the local m2 cache — only the + # previous release is — so exec:java fails dependency resolution with + # "Could not find artifact ...:jar:". Install the engine and + # each sibling first so the examples module can resolve them. Bug + # surfaced during v1.6.5 cut: Step 4 aborted with exit 1; we had to + # install by hand and resume manually. Write-Host " > $mvnw -B -ntp -DskipTests install -pl ." -ForegroundColor DarkGray & $mvnw -B -ntp -DskipTests install -pl . 2>&1 | ForEach-Object { if ($_ -match 'BUILD SUCCESS|BUILD FAILURE|ERROR') { @@ -327,6 +333,17 @@ function Run-ShowcaseSync { if ($LASTEXITCODE -ne 0) { throw "Install root artifact failed (exit $LASTEXITCODE)" } + foreach ($modulePom in $exampleSnapshotSiblings) { + Write-Host " > $mvnw -B -ntp -DskipTests install -f $modulePom" -ForegroundColor DarkGray + & $mvnw -B -ntp -DskipTests install -f $modulePom 2>&1 | ForEach-Object { + if ($_ -match 'BUILD SUCCESS|BUILD FAILURE|ERROR') { + Write-Host " $_" -ForegroundColor DarkGray + } + } + if ($LASTEXITCODE -ne 0) { + throw "Install $modulePom failed (exit $LASTEXITCODE)" + } + } & $mvnw -f examples/pom.xml exec:java $execProp 2>&1 | ForEach-Object { if ($_ -match 'Synced|Wrote manifest|BUILD SUCCESS|BUILD FAILURE|ERROR') { Write-Host " $_" -ForegroundColor DarkGray