Skip to content

Commit 3d9ea4b

Browse files
committed
feat(tests): reading multiple files inside subfolders to construct multiple Ark::types::Contract inside TypeCheckerSuite, to test alternatives
1 parent 5bee6c4 commit 3d9ea4b

File tree

7 files changed

+82
-19
lines changed

7 files changed

+82
-19
lines changed

tests/unittests/Suites/TypeCheckerSuite.cpp

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <boost/ut.hpp>
22

3+
#include <ranges>
34
#include <string>
45
#include <sstream>
56
#include <fmt/core.h>
@@ -18,6 +19,7 @@ struct Input
1819
Ark::types::Contract expected_arg_types;
1920
std::vector<Ark::Value> given_args;
2021

22+
std::string filename;
2123
bool initialized = false;
2224
};
2325

@@ -160,35 +162,66 @@ Input parse_input(const std::string& path)
160162
.expected_arg_count = arg_count,
161163
.expected_arg_types = args,
162164
.given_args = given_args,
165+
.filename = std::filesystem::path(path).stem().generic_string(),
163166
.initialized = true
164167
};
165168
}
166169

167170
ut::suite<"TypeChecker"> type_checker_suite = [] {
168171
using namespace ut;
169172

170-
iter_test_files("TypeCheckerSuite", [&](TestData&& data) {
171-
const Input input = parse_input(data.path);
172-
expect(fatal(input.initialized)) << "invalid test input: " << data.stem;
173+
iterTestFiles(
174+
"TypeCheckerSuite",
175+
[&](TestData&& data) {
176+
std::vector<Input> inputs;
177+
std::vector<Ark::types::Contract> contracts;
173178

174-
should("generate error message " + data.stem) = [input, data] {
175-
std::stringstream stream;
176-
try
179+
if (data.is_folder)
177180
{
178-
Ark::types::generateError(
179-
input.func,
180-
{ input.expected_arg_types },
181-
input.given_args,
182-
stream,
183-
/* colorize= */ false);
184-
expect(fatal(false)) << "generateError should throw an Ark::TypeError";
181+
iterTestFiles(
182+
data.path,
183+
[&inputs](TestData&& inner) {
184+
const Input input = parse_input(inner.path);
185+
expect(fatal(input.initialized)) << "invalid test input: " << inner.stem;
186+
inputs.push_back(input);
187+
},
188+
{ .folder_is_resource = false, .ignore_expected = true });
189+
190+
std::ranges::sort(inputs, [](const Input& a, const Input& b) {
191+
return a.filename < b.filename;
192+
});
193+
194+
std::ranges::transform(inputs, std::back_inserter(contracts), [](const Input& input) {
195+
return input.expected_arg_types;
196+
});
185197
}
186-
catch (const Ark::TypeError&)
198+
else
187199
{
188-
auto result = stream.str();
189-
rtrim(ltrim(result));
190-
expect_or_diff(data.expected, result);
200+
const Input input = parse_input(data.path);
201+
expect(fatal(input.initialized)) << "invalid test input: " << data.stem;
202+
inputs.push_back(input);
203+
contracts.push_back(input.expected_arg_types);
191204
}
192-
};
193-
});
205+
206+
should("generate error message " + data.stem) = [inputs, contracts, data] {
207+
std::stringstream stream;
208+
try
209+
{
210+
Ark::types::generateError(
211+
inputs.front().func,
212+
contracts,
213+
inputs.front().given_args,
214+
stream,
215+
/* colorize= */ false);
216+
expect(fatal(false)) << "generateError should throw an Ark::TypeError";
217+
}
218+
catch (const Ark::TypeError&)
219+
{
220+
auto result = stream.str();
221+
rtrim(ltrim(result));
222+
expectOrDiff(data.expected, result);
223+
}
224+
};
225+
},
226+
{ .skip_folders = false });
194227
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Function f expected 2 arguments but got 1
2+
-> n (Number)
3+
-> m (Number) was not provided
4+
Alternative 2:
5+
-> n (Number)
6+
-> m (String) was not provided
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# f,2
2+
# n:Number
3+
# m:Number
4+
# Number
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# f,2
2+
# n:Number
3+
# m:String
4+
# Number
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Function f expected between 2 arguments and 3 arguments but got 1
2+
-> n (Number)
3+
-> m (Number) was not provided
4+
Alternative 2:
5+
-> n (Number)
6+
-> m (String) was not provided
7+
-> o (List) was not provided
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# f,2
2+
# n:Number
3+
# m:Number
4+
# Number
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# f,3
2+
# n:Number
3+
# m:String
4+
# o:List
5+
# Number

0 commit comments

Comments
 (0)