Skip to content

Commit 407f9f1

Browse files
committed
refactored filtering
- changed in feature_file std::vector to std::unordered_set for storing lines - added filter base class and line_filter - test_runner holds all filters and evalutes them in run_scenario
1 parent deb8030 commit 407f9f1

7 files changed

Lines changed: 77 additions & 42 deletions

File tree

gtest/options.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ TEST(options, file_path_does_exist_w_line)
7979
EXPECT_EQ(prog_args.get_feature_files().at(0).path,
8080
details::remove_trailing_char(argv[1], 2));
8181
ASSERT_FALSE(prog_args.get_feature_files().at(0).lines_to_run.empty());
82-
EXPECT_EQ(prog_args.get_feature_files().at(0).lines_to_run.at(0), 3);
82+
EXPECT_TRUE(prog_args.get_feature_files().at(0).lines_to_run.contains(3));
8383
}
8484
TEST(options, file_path_does_exist_w_lines)
8585
{
@@ -93,9 +93,9 @@ TEST(options, file_path_does_exist_w_lines)
9393
EXPECT_EQ(prog_args.get_feature_files().at(0).path,
9494
details::remove_trailing_char(argv[1], 11));
9595
ASSERT_EQ(prog_args.get_feature_files().at(0).lines_to_run.size(), 3);
96-
EXPECT_EQ(prog_args.get_feature_files().at(0).lines_to_run.at(2), 3);
97-
EXPECT_EQ(prog_args.get_feature_files().at(0).lines_to_run.at(1), 123);
98-
EXPECT_EQ(prog_args.get_feature_files().at(0).lines_to_run.at(0), 9999);
96+
EXPECT_TRUE(prog_args.get_feature_files().at(0).lines_to_run.contains(3));
97+
EXPECT_TRUE(prog_args.get_feature_files().at(0).lines_to_run.contains(123));
98+
EXPECT_TRUE(prog_args.get_feature_files().at(0).lines_to_run.contains(9999));
9999
}
100100
TEST(options, tag_expression_1)
101101
{

gtest/util_filepath.cc

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ TEST(util_filepath, absolute_path_win_single_line)
5959

6060
EXPECT_EQ(fp, std::string(R"(C:\git\cwt-cucumber\any.feature)"));
6161
EXPECT_EQ(lines.size(), 1);
62-
EXPECT_EQ(lines[0], 12);
62+
EXPECT_TRUE(lines.contains(12));
6363
}
6464
TEST(util_filepath, relative_path_win_single_line_1)
6565
{
@@ -68,7 +68,7 @@ TEST(util_filepath, relative_path_win_single_line_1)
6868

6969
EXPECT_EQ(fp, std::string("some_dir\\any.feature"));
7070
EXPECT_EQ(lines.size(), 1);
71-
EXPECT_EQ(lines[0], 12);
71+
EXPECT_TRUE(lines.contains(12));
7272
}
7373
TEST(util_filepath, relative_path_win_single_line_2)
7474
{
@@ -77,7 +77,7 @@ TEST(util_filepath, relative_path_win_single_line_2)
7777

7878
EXPECT_EQ(fp, std::string(".\\some_dir\\any.feature"));
7979
EXPECT_EQ(lines.size(), 1);
80-
EXPECT_EQ(lines[0], 12);
80+
EXPECT_TRUE(lines.contains(12));
8181
}
8282
TEST(util_filepath, absolute_path_win_multi_line)
8383
{
@@ -87,10 +87,10 @@ TEST(util_filepath, absolute_path_win_multi_line)
8787

8888
EXPECT_EQ(fp, std::string(R"(C:\git\cwt-cucumber\any.feature)"));
8989
EXPECT_EQ(lines.size(), 4);
90-
EXPECT_EQ(lines[3], 12);
91-
EXPECT_EQ(lines[2], 123);
92-
EXPECT_EQ(lines[1], 999);
93-
EXPECT_EQ(lines[0], 123456789);
90+
EXPECT_TRUE(lines.contains(12));
91+
EXPECT_TRUE(lines.contains(123));
92+
EXPECT_TRUE(lines.contains(999));
93+
EXPECT_TRUE(lines.contains(123456789));
9494
}
9595
TEST(util_filepath, relative_path_win_multi_line_1)
9696
{
@@ -99,10 +99,10 @@ TEST(util_filepath, relative_path_win_multi_line_1)
9999

100100
EXPECT_EQ(fp, std::string("some_dir\\any.feature"));
101101
EXPECT_EQ(lines.size(), 4);
102-
EXPECT_EQ(lines[3], 12);
103-
EXPECT_EQ(lines[2], 123);
104-
EXPECT_EQ(lines[1], 999);
105-
EXPECT_EQ(lines[0], 123456789);
102+
EXPECT_TRUE(lines.contains(12));
103+
EXPECT_TRUE(lines.contains(123));
104+
EXPECT_TRUE(lines.contains(999));
105+
EXPECT_TRUE(lines.contains(123456789));
106106
}
107107
TEST(util_filepath, relative_path_win_multi_line_2)
108108
{
@@ -111,10 +111,10 @@ TEST(util_filepath, relative_path_win_multi_line_2)
111111

112112
EXPECT_EQ(fp, std::string(".\\some_dir\\any.feature"));
113113
EXPECT_EQ(lines.size(), 4);
114-
EXPECT_EQ(lines[3], 12);
115-
EXPECT_EQ(lines[2], 123);
116-
EXPECT_EQ(lines[1], 999);
117-
EXPECT_EQ(lines[0], 123456789);
114+
EXPECT_TRUE(lines.contains(12));
115+
EXPECT_TRUE(lines.contains(123));
116+
EXPECT_TRUE(lines.contains(999));
117+
EXPECT_TRUE(lines.contains(123456789));
118118
}
119119
TEST(util_filepath, absolute_path_unix_single_line)
120120
{
@@ -123,7 +123,7 @@ TEST(util_filepath, absolute_path_unix_single_line)
123123

124124
EXPECT_EQ(fp, std::string("/c/git/cwt-cucumber/any.feature"));
125125
EXPECT_EQ(lines.size(), 1);
126-
EXPECT_EQ(lines[0], 12);
126+
EXPECT_TRUE(lines.contains(12));
127127
}
128128
TEST(util_filepath, absolute_path_unix_multi_line)
129129
{
@@ -133,8 +133,8 @@ TEST(util_filepath, absolute_path_unix_multi_line)
133133

134134
EXPECT_EQ(fp, std::string("/c/git/cwt-cucumber/any.feature"));
135135
EXPECT_EQ(lines.size(), 4);
136-
EXPECT_EQ(lines[3], 12);
137-
EXPECT_EQ(lines[2], 123);
138-
EXPECT_EQ(lines[1], 999);
139-
EXPECT_EQ(lines[0], 123456789);
140-
}
136+
EXPECT_TRUE(lines.contains(12));
137+
EXPECT_TRUE(lines.contains(123));
138+
EXPECT_TRUE(lines.contains(999));
139+
EXPECT_TRUE(lines.contains(123456789));
140+
}

src/options.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <string_view>
77
#include <thread>
88
#include <unordered_map>
9+
#include <unordered_set>
910
#include <vector>
1011
#include <string>
1112
#include <filesystem>
@@ -59,7 +60,7 @@ void fail_step(const std::string_view msg = "");
5960
struct feature_file
6061
{
6162
std::string path;
62-
std::vector<std::size_t> lines_to_run;
63+
std::unordered_set<std::size_t> lines_to_run;
6364
};
6465

6566
} // namespace cuke

src/parser.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,11 @@ class parser
411411
return nullptr;
412412
}
413413

414+
auto make_scenario_view() const
415+
{
416+
return m_head.feature().scenarios() | std::ranges::views::all;
417+
}
418+
414419
void for_each_scenario(ast::node_visitor& visitor) const
415420
{
416421
visitor.visit(m_head.feature());

src/test_runner.cpp

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "test_runner.hpp"
22

3+
#include <memory>
34
#include <string>
45
#include <algorithm>
56

@@ -16,6 +17,22 @@ namespace cuke
1617
namespace
1718
{
1819

20+
class line_filter : public filter
21+
{
22+
public:
23+
line_filter(std::unordered_set<std::size_t> lines) : m_lines(std::move(lines))
24+
{
25+
}
26+
27+
bool matches(const ast::scenario_node& scenario) const override
28+
{
29+
return m_lines.contains(scenario.line());
30+
}
31+
32+
private:
33+
std::unordered_set<std::size_t> m_lines;
34+
};
35+
1936
struct step_pipeline_context
2037
{
2138
const ast::step_node& step;
@@ -319,21 +336,11 @@ void test_runner::run()
319336
{
320337
parser p;
321338
p.parse_from_file(feature.path);
322-
if (feature.lines_to_run.empty())
339+
if (!feature.lines_to_run.empty())
323340
{
324-
p.for_each_scenario(*this);
325-
}
326-
else
327-
{
328-
visit(p.head().feature());
329-
for (const std::size_t line : feature.lines_to_run)
330-
{
331-
if (const ast::scenario_node* scenario = p.get_scenario_from_line(line))
332-
{
333-
run_scenario(*scenario);
334-
}
335-
}
341+
m_filters.push_back(std::make_unique<line_filter>(feature.lines_to_run));
336342
}
343+
p.for_each_scenario(*this);
337344
}
338345
}
339346

@@ -357,6 +364,17 @@ void test_runner::visit(const ast::scenario_outline_node& scenario_outline)
357364

358365
void test_runner::run_scenario(const ast::scenario_node& scenario) const
359366
{
367+
if (!m_filters.empty())
368+
{
369+
for (const auto& filter : m_filters)
370+
{
371+
if (!filter->matches(scenario))
372+
{
373+
return;
374+
}
375+
}
376+
}
377+
360378
scenario_pipeline_context context{.scenario = scenario,
361379
.tag_expression = m_tag_expression,
362380
.result = results::new_scenario(scenario)};

src/test_runner.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
#pragma once
22

33
#include <cstddef>
4+
#include <unordered_set>
45

56
#include "ast.hpp"
67
#include "tags.hpp"
78
#include "options.hpp"
89

910
namespace cuke
1011
{
12+
13+
class filter
14+
{
15+
public:
16+
virtual ~filter() = default;
17+
virtual bool matches(const ast::scenario_node& scenario) const = 0;
18+
};
19+
1120
class test_runner : public ast::node_visitor
1221
{
1322
public:
@@ -31,6 +40,7 @@ class test_runner : public ast::node_visitor
3140

3241
private:
3342
internal::tag_expression m_tag_expression;
43+
std::vector<std::unique_ptr<filter>> m_filters;
3444
};
3545

3646
} // namespace cuke

src/util.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <chrono>
44
#include <string>
55
#include <fstream>
6+
#include <unordered_set>
67

78
#include "token.hpp"
89
#include "log.hpp"
@@ -118,10 +119,10 @@ template <typename T>
118119
return true;
119120
}
120121

121-
[[nodiscard]] inline std::pair<std::string, std::vector<std::size_t>>
122+
[[nodiscard]] inline std::pair<std::string, std::unordered_set<std::size_t>>
122123
filepath_and_lines(std::string_view sv)
123124
{
124-
std::vector<std::size_t> lines;
125+
std::unordered_set<std::size_t> lines;
125126
long pos = static_cast<long>(sv.size());
126127
long last_pos = pos;
127128
while (pos > 0)
@@ -130,7 +131,7 @@ filepath_and_lines(std::string_view sv)
130131
const std::string_view sub = sv.substr(pos + 1, last_pos - pos);
131132
if (is_number(sub))
132133
{
133-
lines.push_back(std::stoul(sub.data()));
134+
lines.insert(std::stoul(sub.data()));
134135
}
135136
else
136137
{

0 commit comments

Comments
 (0)