Skip to content

Commit d1a3e52

Browse files
committed
add multiple-features and multiple-features-reverses compatibility tests
1 parent de2aaeb commit d1a3e52

File tree

16 files changed

+90
-51
lines changed

16 files changed

+90
-51
lines changed

compatibility/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,23 @@ function(add_compatibility_kit name)
1919
compatibility.cpp
2020
)
2121

22+
2223
if (EXISTS ${CMAKE_CURRENT_LIST_DIR}/${name}/${name}.cpp)
2324
target_sources(${libname} PRIVATE
2425
${name}/${name}.cpp
2526
)
27+
else()
28+
set(SKIP_TEST On)
2629
endif()
2730

2831
string(REPLACE "-" "_" KITNAME ${name})
2932

3033
target_compile_definitions(${libname} PRIVATE
3134
KIT_NAME=${KITNAME}
35+
KIT_STRING="${name}"
3236
KIT_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}/${name}"
3337
KIT_NDJSON_FILE="${CMAKE_CURRENT_SOURCE_DIR}/${name}/${name}.ndjson"
38+
$<$<BOOL:${SKIP_TEST}>:SKIP_TEST>
3439
)
3540
endfunction()
3641

compatibility/compatibility.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@
1010
#include "nlohmann/json_fwd.hpp"
1111
#include "gmock/gmock.h"
1212
#include "gtest/gtest.h"
13-
#include <algorithm>
1413
#include <chrono>
1514
#include <cstddef>
1615
#include <filesystem>
17-
#include <format>
1816
#include <fstream>
1917
#include <functional>
2018
#include <gtest/gtest-spi.h>
@@ -24,10 +22,9 @@
2422
#include <memory>
2523
#include <ranges>
2624
#include <regex>
25+
#include <set>
2726
#include <string>
28-
#include <system_error>
2927
#include <utility>
30-
#include <vector>
3128

3229
#ifndef KIT_FOLDER
3330
#error KIT_FOLDER is not defined
@@ -45,7 +42,7 @@ namespace compatibility
4542
{
4643
struct Devkit
4744
{
48-
std::vector<std::filesystem::path> paths;
45+
std::set<std::filesystem::path> paths;
4946
std::string tagExpression;
5047
std::size_t retry;
5148
std::filesystem::path ndjsonFile;
@@ -255,16 +252,19 @@ namespace compatibility
255252
return std::filesystem::is_regular_file(entry) && entry.path().has_extension() && entry.path().extension() == ".feature";
256253
}
257254

258-
std::vector<std::filesystem::path> GetFeatureFiles(std::vector<std::filesystem::path> paths)
255+
std::set<std::filesystem::path> GetFeatureFiles(std::set<std::filesystem::path> paths)
259256
{
260-
std::vector<std::filesystem::path> files;
257+
std::set<std::filesystem::path> files;
261258

262259
for (const auto feature : paths)
263260
if (std::filesystem::is_directory(feature))
264261
for (const auto& entry : std::filesystem::directory_iterator{ feature } | std::views::filter(IsFeatureFile))
265-
files.emplace_back(entry.path());
262+
{
263+
std::cout << " found feature file: " << entry.path() << "\n";
264+
files.insert(entry.path());
265+
}
266266
else
267-
files.emplace_back(feature);
267+
files.insert(feature);
268268

269269
return files;
270270
}
@@ -300,11 +300,13 @@ namespace compatibility
300300
void RunDevkit(Devkit devkit)
301301
{
302302
devkit.paths = GetFeatureFiles(devkit.paths);
303+
const auto isReversed = std::string{ KIT_STRING }.ends_with("-reversed");
303304

304305
cucumber_cpp::library::support::RunOptions runOptions{
305306
.sources = {
306307
.paths = devkit.paths,
307308
.tagExpression = devkit.tagExpression,
309+
.ordering = isReversed ? cucumber_cpp::library::support::RunOptions::Ordering::reverse : cucumber_cpp::library::support::RunOptions::Ordering::defined,
308310
},
309311
.runtime = {
310312
.retry = devkit.retry,
@@ -329,8 +331,9 @@ namespace compatibility
329331

330332
TEST(CompatibilityTest, KIT_NAME)
331333
{
332-
if (std::string{ KIT_FOLDER }.ends_with("markdown"))
333-
GTEST_SKIP();
334+
#ifdef SKIP_TEST
335+
GTEST_SKIP();
336+
#endif
334337

335338
compatibility::StopwatchIncremental stopwatch;
336339
compatibility::TimestampGeneratorIncremental timestampGenerator;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "cucumber_cpp/CucumberCpp.hpp"
2+
#include <string>
3+
4+
STEP(R"(an order for {string})", ([[maybe_unused]] const std::string& order))
5+
{
6+
// no-op
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "cucumber_cpp/CucumberCpp.hpp"
2+
#include <string>
3+
4+
STEP(R"(an order for {string})", ([[maybe_unused]] const std::string& order))
5+
{
6+
// no-op
7+
}

cucumber_cpp/library/Application.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
#include "cucumber_cpp/library/Application.hpp"
2-
#include "cucumber/messages/envelope.hpp"
32
#include "cucumber_cpp/library/Context.hpp"
43
#include "cucumber_cpp/library/Errors.hpp"
5-
#include "cucumber_cpp/library/HookRegistry.hpp"
6-
#include "cucumber_cpp/library/Query.hpp"
74
#include "cucumber_cpp/library/StepRegistry.hpp"
85
#include "cucumber_cpp/library/api/RunCucumber.hpp"
96
#include "cucumber_cpp/library/cucumber_expression/Errors.hpp"
107
#include "cucumber_cpp/library/cucumber_expression/Matcher.hpp"
118
#include "cucumber_cpp/library/cucumber_expression/ParameterRegistry.hpp"
12-
#include "cucumber_cpp/library/formatter/SummaryFormatter.hpp"
139
#include "cucumber_cpp/library/support/Types.hpp"
14-
#include "cucumber_cpp/library/util/Broadcaster.hpp"
1510
#include <CLI/Error.hpp>
1611
#include <CLI/Option.hpp>
1712
#include <CLI/Validators.hpp>
@@ -28,10 +23,10 @@
2823
#include <numeric>
2924
#include <ostream>
3025
#include <ranges>
26+
#include <set>
3127
#include <string>
3228
#include <string_view>
3329
#include <variant>
34-
#include <vector>
3530

3631
namespace cucumber_cpp::library
3732
{
@@ -59,16 +54,16 @@ namespace cucumber_cpp::library
5954
return std::filesystem::is_regular_file(entry) && entry.path().has_extension() && entry.path().extension() == ".feature";
6055
}
6156

62-
std::vector<std::filesystem::path> GetFeatureFiles(Application::Options& options)
57+
std::set<std::filesystem::path> GetFeatureFiles(Application::Options& options)
6358
{
64-
std::vector<std::filesystem::path> files;
59+
std::set<std::filesystem::path> files;
6560

6661
for (const auto feature : options.features | std::views::transform(ToFileSystemPath))
6762
if (std::filesystem::is_directory(feature))
6863
for (const auto& entry : std::filesystem::directory_iterator{ feature } | std::views::filter(IsFeatureFile))
69-
files.emplace_back(entry.path());
64+
files.emplace(entry.path());
7065
else
71-
files.emplace_back(feature);
66+
files.emplace(feature);
7267

7368
return files;
7469
}

cucumber_cpp/library/api/Gherkin.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111
#include "cucumber/messages/source_reference.hpp"
1212
#include "cucumber_cpp/library/support/Types.hpp"
1313
#include "cucumber_cpp/library/util/Broadcaster.hpp"
14+
#include <list>
1415
#include <memory>
15-
#include <vector>
1616

1717
namespace cucumber_cpp::library::api
1818
{
19-
std::vector<support::PickleSource> CollectPickles(const support::RunOptions::Sources& sources, cucumber::gherkin::id_generator_ptr idGenerator, util::Broadcaster& broadcaster)
19+
std::list<support::PickleSource> CollectPickles(const support::RunOptions::Sources& sources, cucumber::gherkin::id_generator_ptr idGenerator, util::Broadcaster& broadcaster)
2020
{
21-
std::vector<support::PickleSource> pickleSources;
21+
std::list<support::PickleSource> pickleSources;
2222

2323
cucumber::gherkin::parser<> parser{ idGenerator };
2424

cucumber_cpp/library/api/Gherkin.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
#include "cucumber/gherkin/id_generator.hpp"
55
#include "cucumber_cpp/library/support/Types.hpp"
66
#include "cucumber_cpp/library/util/Broadcaster.hpp"
7-
#include <vector>
7+
#include <list>
88

99
namespace cucumber_cpp::library::api
1010
{
11-
std::vector<support::PickleSource> CollectPickles(const support::RunOptions::Sources& sources, cucumber::gherkin::id_generator_ptr idGenerator, util::Broadcaster& broadcaster);
11+
std::list<support::PickleSource> CollectPickles(const support::RunOptions::Sources& sources, cucumber::gherkin::id_generator_ptr idGenerator, util::Broadcaster& broadcaster);
1212
}
1313

1414
#endif

cucumber_cpp/library/api/RunCucumber.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
#include "cucumber_cpp/library/tag_expression/Parser.hpp"
1919
#include "cucumber_cpp/library/util/Broadcaster.hpp"
2020
#include <gtest/gtest.h>
21+
#include <list>
2122
#include <memory>
2223
#include <ranges>
2324
#include <utility>
24-
#include <vector>
2525

2626
namespace cucumber_cpp::library::api
2727
{
@@ -125,11 +125,23 @@ namespace cucumber_cpp::library::api
125125
return tagExpression->Evaluate(pickle.pickle->tags);
126126
};
127127
auto filteredPicklesView = pickleSources | std::views::filter(pickleFilter);
128-
std::vector<support::PickleSource> filteredPickles(filteredPicklesView.begin(), filteredPicklesView.end());
128+
129+
const auto createOrderedPickleList = [](auto ordered) -> std::list<support::PickleSource>
130+
{
131+
return { ordered.begin(), ordered.end() };
132+
};
133+
const auto orderPickles = [&](auto pickles) -> std::list<support::PickleSource>
134+
{
135+
if (options.sources.ordering == support::RunOptions::Ordering::defined)
136+
return createOrderedPickleList(pickles);
137+
else
138+
return createOrderedPickleList(pickles | std::views::reverse);
139+
};
140+
std::list<support::PickleSource> orderedPickles = orderPickles(filteredPicklesView);
129141

130142
EmitSupportCodeMessages(supportCodeLibrary, broadcaster, idGenerator);
131143

132-
auto runtime = runtime::MakeRuntime(options.runtime, broadcaster, filteredPickles, supportCodeLibrary, idGenerator, programContext);
144+
auto runtime = runtime::MakeRuntime(options.runtime, broadcaster, orderedPickles, supportCodeLibrary, idGenerator, programContext);
133145

134146
auto& listeners = testing::UnitTest::GetInstance()->listeners();
135147
auto* defaultEventListener = listeners.Release(listeners.default_result_printer());

cucumber_cpp/library/assemble/AssembleTestSuites.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
#include "cucumber/messages/envelope.hpp"
44
#include "cucumber/messages/step_match_arguments_list.hpp"
55
#include "cucumber/messages/test_case.hpp"
6-
#include "cucumber/messages/test_step.hpp"
76
#include "cucumber_cpp/library/HookRegistry.hpp"
87
#include "cucumber_cpp/library/assemble/AssembledTestSuite.hpp"
98
#include "cucumber_cpp/library/cucumber_expression/Matcher.hpp"
109
#include "cucumber_cpp/library/support/SupportCodeLibrary.hpp"
1110
#include "cucumber_cpp/library/support/Types.hpp"
1211
#include "cucumber_cpp/library/util/Broadcaster.hpp"
12+
#include <list>
1313
#include <map>
1414
#include <optional>
1515
#include <ranges>
@@ -25,9 +25,10 @@ namespace cucumber_cpp::library::assemble
2525
std::vector<AssembledTestSuite> AssembleTestSuites(support::SupportCodeLibrary supportCodeLibrary,
2626
std::string_view testRunStartedId,
2727
util::Broadcaster& broadcaster,
28-
std::span<const support::PickleSource> sourcedPickles,
28+
const std::list<support::PickleSource>& sourcedPickles,
2929
cucumber::gherkin::id_generator_ptr idGenerator)
3030
{
31+
std::vector<std::string> testUris;
3132
std::map<std::string, AssembledTestSuite> assembledTestSuiteMap;
3233

3334
for (const auto& pickleSource : sourcedPickles)
@@ -77,16 +78,19 @@ namespace cucumber_cpp::library::assemble
7778
broadcaster.BroadcastEvent(cucumber::messages::envelope{ .test_case = testCase });
7879

7980
if (!assembledTestSuiteMap.contains(pickleSource.gherkinDocument->uri.value()))
81+
{
82+
testUris.emplace_back(pickleSource.gherkinDocument->uri.value());
8083
assembledTestSuiteMap.emplace(pickleSource.gherkinDocument->uri.value(), *pickleSource.gherkinDocument);
84+
}
8185

8286
assembledTestSuiteMap.at(pickleSource.gherkinDocument->uri.value()).testCases.emplace_back(*pickleSource.pickle, testCase);
8387
}
8488

8589
std::vector<AssembledTestSuite> assembledTestSuites;
8690
assembledTestSuites.reserve(assembledTestSuiteMap.size());
8791

88-
for (auto assembledTestSuiteValues : assembledTestSuiteMap | std::views::values)
89-
assembledTestSuites.emplace_back(std::move(assembledTestSuiteValues));
92+
for (auto uri : testUris)
93+
assembledTestSuites.emplace_back(std::move(assembledTestSuiteMap.at(uri)));
9094

9195
return assembledTestSuites;
9296
}

cucumber_cpp/library/assemble/AssembleTestSuites.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "cucumber_cpp/library/support/SupportCodeLibrary.hpp"
77
#include "cucumber_cpp/library/support/Types.hpp"
88
#include "cucumber_cpp/library/util/Broadcaster.hpp"
9-
#include <span>
9+
#include <list>
1010
#include <string_view>
1111
#include <vector>
1212

@@ -16,7 +16,7 @@ namespace cucumber_cpp::library::assemble
1616
support::SupportCodeLibrary supportCodeLibrary,
1717
std::string_view testRunStartedId,
1818
util::Broadcaster& broadcaster,
19-
std::span<const support::PickleSource> sourcedPickles,
19+
const std::list<support::PickleSource>& sourcedPickles,
2020
cucumber::gherkin::id_generator_ptr idGenerator);
2121
}
2222

0 commit comments

Comments
 (0)