Skip to content

feat!: rewrite to use cucumber messages#273

Open
daantimmer wants to merge 205 commits intomainfrom
feature/rewrite-to-use-cucumber-messages
Open

feat!: rewrite to use cucumber messages#273
daantimmer wants to merge 205 commits intomainfrom
feature/rewrite-to-use-cucumber-messages

Conversation

@daantimmer
Copy link
Collaborator

@daantimmer daantimmer commented Dec 18, 2025

This (internal) rewrite is to make amp-cucumber-cpp-runner cucumber-messages compatible. Both during runtime and during formatting.

This will enable amp-cucumber-cpp-runner to be compatible with other, standalone, formatters.

  • implement all compatibility tests (37 / 39 done)
  • auto search for feature files if no paths are given
  • use CLI11's 'config file' option
  • implement minimum formatters
    • console/file: summary (partially done)
      • allow theming/disabling colouring
    • console/file: pretty printer (partially done)
      • allow theming/disabling colouring
    • console/file: step statistics
    • console/file: ndjson
    • console/file: junit

@daantimmer daantimmer mentioned this pull request Dec 18, 2025
15 tasks
@github-actions
Copy link

github-actions bot commented Dec 18, 2025

⚠️MegaLinter analysis: Success with warnings

Descriptor Linter Files Fixed Errors Warnings Elapsed time
✅ ACTION actionlint 6 0 0 0.25s
✅ CPP clang-format 185 0 0 0 1.35s
✅ DOCKERFILE hadolint 1 0 0 0.27s
✅ JSON jsonlint 8 0 0 0.16s
✅ JSON prettier 8 6 0 0 0.51s
⚠️ MARKDOWN markdownlint 6 3 14 0 0.89s
✅ MARKDOWN markdown-table-formatter 6 3 0 0 0.27s
✅ REPOSITORY git_diff yes no no 0.02s
✅ REPOSITORY grype yes no no 29.13s
✅ REPOSITORY ls-lint yes no no 0.07s
✅ REPOSITORY secretlint yes no no 2.01s
✅ REPOSITORY syft yes no no 1.34s
✅ REPOSITORY trivy yes no no 5.51s
✅ REPOSITORY trivy-sbom yes no no 0.12s
✅ REPOSITORY trufflehog yes no no 2.18s
⚠️ SPELL lychee 83 1 0 3.57s
✅ YAML prettier 10 0 0 0 0.48s
✅ YAML v8r 10 0 0 5.65s
✅ YAML yamllint 10 0 0 0.5s

Detailed Issues

⚠️ SPELL / lychee - 1 error
[404] https://github.com/yourname/amp-cucumber-cpp-runner.git | Network error: Not Found
📝 Summary
---------------------
🔍 Total..........155
✅ Successful.....154
⏳ Timeouts.........0
🔀 Redirected.......0
👻 Excluded.........0
❓ Unknown..........0
🚫 Errors...........1

Errors in CONTRIBUTING.md
[404] https://github.com/yourname/amp-cucumber-cpp-runner.git | Network error: Not Found
⚠️ MARKDOWN / markdownlint - 14 errors
CHANGELOG.md:26 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Chores"]
CHANGELOG.md:38 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Features"]
CHANGELOG.md:47 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Features"]
CHANGELOG.md:53 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Chores"]
CHANGELOG.md:61 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "⚠ BREAKING CHANGES"]
CHANGELOG.md:65 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Features"]
CHANGELOG.md:70 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Bug Fixes"]
CHANGELOG.md:79 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Features"]
CHANGELOG.md:90 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Chores"]
CHANGELOG.md:98 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "⚠ BREAKING CHANGES"]
CHANGELOG.md:102 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Features"]
CHANGELOG.md:127 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Bug Fixes"]
CHANGELOG.md:134 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Chores"]
README.md:114 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]

See detailed reports in MegaLinter artifacts

Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)

  • Documentation: Custom Flavors
  • Command: npx mega-linter-runner@9.3.0 --custom-flavor-setup --custom-flavor-linters ACTION_ACTIONLINT,CPP_CLANG_FORMAT,DOCKERFILE_HADOLINT,JSON_JSONLINT,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,REPOSITORY_GIT_DIFF,REPOSITORY_GRYPE,REPOSITORY_LS_LINT,REPOSITORY_SECRETLINT,REPOSITORY_SYFT,REPOSITORY_TRIVY,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,SPELL_LYCHEE,YAML_PRETTIER,YAML_YAMLLINT,YAML_V8R

MegaLinter is graciously provided by OX Security

@github-actions
Copy link

github-actions bot commented Dec 18, 2025

Test Results

27 tests   - 1   26 ✅  - 2   29s ⏱️ +26s
 1 suites ±0    0 💤 ±0 
 1 files   ±0    1 ❌ +1 

For more details on these failures, see this check.

Results for commit bcfa4cf. ± Comparison against base commit 42ee292.

This pull request removes 6 and adds 5 tests. Note that renamed tests count towards both.
test.bats ‑ Missing mandatory feature argument
test.bats ‑ Missing mandatory report argument
test.bats ‑ Second feature file does not overwrite success with an undefined status
test.bats ‑ Test the asterisk keyword - will fail
test.bats ‑ Test unused step reporting
test.bats ‑ Undefined tests
test.bats ‑ Second feature file does not overwrite success with an ■ status
test.bats ‑ Test nested steps
test.bats ‑ Test the asterisk keyword
test.bats ‑ Test usage formatter
test.bats ‑ ■ tests

♻️ This comment has been updated with latest results.

Copilot AI review requested due to automatic review settings January 23, 2026 22:35
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 291 out of 419 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

cucumber_cpp/library/engine/Table.cpp:1

  • This file appears to be a header file (with header guards) but has a .cpp extension. This is a mismatch - either rename to .hpp or remove the header guards if this is meant to be a source file.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

#include "cucumber_cpp/library/cucumber_expression/ParameterRegistry.hpp"
#include "fmt/format.h"
#include <cstddef>
#include <format>
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The <format> header is included but never used. All formatting is done with fmt::format. Remove this unused include.

Suggested change
#include <format>

Copilot uses AI. Check for mistakes.
@alextech
Copy link
Contributor

@daantimmer Did the .ts (typescript) placeholders get into the repository by accident?
I did basic run-through in console and looks functional out of the box so far.

Though I did not find how to actually supply parameter for "optionally supply PATH to redirect formatter output". What is the intended usage? Besides pipeline convenience, also wanted to check if the bug that I addressed in my PR about formatters always outputting something, even when not enabled was still there. Probably not, given all the changes, but was still curious.

I have some ideas about implementing meta message. Will try it out after this PR as an exercise to learn how I can hook into the new broadcaster architecture.
I was thinking to try supplying the message output into some report viewer after the PR completion too, to see how well it handles it. Though maybe it could be useful if I do it sooner.

@daantimmer
Copy link
Collaborator Author

daantimmer commented Jan 27, 2026

@alextech

Did the .ts (typescript) placeholders get into the repository by accident?

Good remark, forgot to remove them. They are the original step implementation for each compatibility test (CCK) that I needed to re-implement in C++.

I did basic run-through in console and looks functional out of the box so far.

Thats some good feedback! Have you noticed the additions made to hooks (optional naming, optional explicit ordering) (hooks are now automatically ordered by filename - line number. AFTER_hooks are ordered in reverse of appearance). And have you seen that you can now create custom arguments for Cucumber Expessions?

Though I did not find how to actually supply parameter for "optionally supply PATH to redirect formatter output". What is the intended usage? Besides pipeline convenience, also wanted to check if the bug that I addressed in my PR about formatters always outputting something, even when not enabled was still there. Probably not, given all the changes, but was still curious.

'docs' are a bit WIP. But you can supply them like: --format summary summary:yoursummary.txt pretty message:envelopes.ndjson
This will print the summary and pretty output to your console and write the summary output to a file named yoursummary.txt also it'll store all messages generated in the envelopes.ndjson file.

--format-options all you to change the output behaviour of these formatters. Although if you set 'summary' settings for example, they apply to both the summary going to a file and to the console. (So you can't choose to change theme separately for example). --format-options takes a json argument. I'll have to whip up some example docs later.

I have some ideas about implementing meta message. Will try it out after this PR as an exercise to learn how I can hook into the new broadcaster architecture.
I was thinking to try supplying the message output into some report viewer after the PR completion too, to see how well it handles it. Though maybe it could be useful if I do it sooner.

That would be great to have some additional thought going in to the meta message. I am not too sure of the best way getting this working on both mac, windows and linux.

Copilot AI review requested due to automatic review settings January 28, 2026 22:44
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 291 out of 381 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (3)

cucumber_cpp/library/formatter/helper/test/TestDummy.cpp:1

  • The namespace is declared as cucumber_cpp::library::support but the test is for the formatter.helper library. This should be cucumber_cpp::library::formatter::helper to match the library being tested.
    cucumber_cpp/library/assemble/test/TestDummy.cpp:1
  • The namespace is declared as cucumber_cpp::library::support but the test is for the assemble library. This should be cucumber_cpp::library::assemble to match the library being tested.
    cucumber_cpp/library/api/test/TestDummy.cpp:1
  • The namespace is declared as cucumber_cpp::library::support but the test is for the api library. This should be cucumber_cpp::library::api to match the library being tested.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@@ -0,0 +1,8 @@
#include <gtest/gtest.h>

namespace cucumber_cpp::library::support
Copy link

Copilot AI Jan 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The namespace is declared as cucumber_cpp::library::support but the test is for the formatter library. This should be cucumber_cpp::library::formatter to match the library being tested.

Suggested change
namespace cucumber_cpp::library::support
namespace cucumber_cpp::library::formatter

Copilot uses AI. Check for mistakes.
#include "cucumber_cpp/library/cucumber_expression/ParameterRegistry.hpp"
#include "fmt/format.h"
#include <cstddef>
#include <format>
Copy link

Copilot AI Jan 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The <format> header is included but fmt::format is used throughout the file (imported via fmt/format.h on line 4). The standard library <format> include should be removed as it's unused.

Suggested change
#include <format>

Copilot uses AI. Check for mistakes.
Comment on lines +23 to +34
const auto& expectedTalbe = dataTable;

const auto rows = actualTable.rows.size();
ASSERT_THAT(rows, testing::Eq(expectedTalbe->rows.size()));

for (auto rowIdx = 0; rowIdx < rows; ++rowIdx)
{
const auto columns = expectedTalbe->rows[rowIdx].cells.size();
ASSERT_THAT(columns, testing::Eq(actualTable.rows[rowIdx].cells.size()));
for (auto colIdx = 0; colIdx < columns; ++colIdx)
{
const auto& expectedCell = expectedTalbe->rows[rowIdx].cells[colIdx];
Copy link

Copilot AI Jan 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected spelling of 'expectedTalbe' to 'expectedTable'

Suggested change
const auto& expectedTalbe = dataTable;
const auto rows = actualTable.rows.size();
ASSERT_THAT(rows, testing::Eq(expectedTalbe->rows.size()));
for (auto rowIdx = 0; rowIdx < rows; ++rowIdx)
{
const auto columns = expectedTalbe->rows[rowIdx].cells.size();
ASSERT_THAT(columns, testing::Eq(actualTable.rows[rowIdx].cells.size()));
for (auto colIdx = 0; colIdx < columns; ++colIdx)
{
const auto& expectedCell = expectedTalbe->rows[rowIdx].cells[colIdx];
const auto& expectedTable = dataTable;
const auto rows = actualTable.rows.size();
ASSERT_THAT(rows, testing::Eq(expectedTable->rows.size()));
for (auto rowIdx = 0; rowIdx < rows; ++rowIdx)
{
const auto columns = expectedTable->rows[rowIdx].cells.size();
ASSERT_THAT(columns, testing::Eq(actualTable.rows[rowIdx].cells.size()));
for (auto colIdx = 0; colIdx < columns; ++colIdx)
{
const auto& expectedCell = expectedTable->rows[rowIdx].cells[colIdx];

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings January 30, 2026 11:37
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 291 out of 381 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (3)

cucumber_cpp/library/formatter/helper/test/TestDummy.cpp:1

  • The namespace is cucumber_cpp::library::support but this test file is in the formatter/helper directory. The namespace should be cucumber_cpp::library::formatter::helper to match the directory structure and purpose.
    cucumber_cpp/library/assemble/test/TestDummy.cpp:1
  • The namespace is cucumber_cpp::library::support but this test file is in the assemble directory. The namespace should be cucumber_cpp::library::assemble to match the directory structure and purpose.
    cucumber_cpp/library/api/test/TestDummy.cpp:1
  • The namespace is cucumber_cpp::library::support but this test file is in the api directory. The namespace should be cucumber_cpp::library::api to match the directory structure and purpose.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sonarqubecloud
Copy link

Copilot AI review requested due to automatic review settings February 4, 2026 10:40
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 291 out of 381 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (3)

cucumber_cpp/library/formatter/helper/test/TestDummy.cpp:1

  • The namespace is cucumber_cpp::library::support but this test is for the formatter module. The namespace should be cucumber_cpp::library::formatter to match the module being tested.
    cucumber_cpp/library/assemble/test/TestDummy.cpp:1
  • The namespace is cucumber_cpp::library::support but this test is for the assemble module. The namespace should be cucumber_cpp::library::assemble to match the module being tested.
    cucumber_cpp/library/api/test/TestDummy.cpp:1
  • The namespace is cucumber_cpp::library::support but this test is for the api module. The namespace should be cucumber_cpp::library::api to match the module being tested.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants