ARGS_TUPLE args;
if (!sourceArgs.hasKeywords())
{
- DEBUG(".");
validateArgumentCount(sourceArgs.size(), firstDefaultArgIndex, expectedArgCount);
- DEBUG(".");
detail::Converter<0, expectedArgCount>::convert(args, sourceArgs, firstDefaultArgIndex, defaultArguments);
- DEBUG(".");
} else
{
- DEBUG(".");
std::vector<bool> used(expectedArgCount, false);
- DEBUG("%d", (int)sourceArgs.size());
detail::Converter<0, expectedArgCount>::convert(args, sourceArgs, firstDefaultArgIndex, defaultArguments, sourceArgs.size());
- DEBUG(".");
for (auto i = 0u; i < sourceArgs.size(); ++i) used[i] = true;
- DEBUG(".");
for (auto &val : sourceArgs.keywords()) {
- DEBUG(".");
auto it = keywordIndexes.find(val.first);
if (it == keywordIndexes.end()) {
- DEBUG(".");
throw EvaluationFailure{} << "unknown keyword argument '" << val.first << "'";
}
- DEBUG("%d", (int)it->second);
if (used[it->second]) {
- DEBUG(".");
throw EvaluationFailure{} << "argument '" << val.first << "' is already set (when applying keyword)";
}
- DEBUG(". %d", (int)it->second);
used[it->second] = true;
- DEBUG(".");
detail::Converter<0, expectedArgCount>::convertSingleArgumentByIndex(args, val.second, it->second);
- DEBUG(".");
}
- DEBUG("%d %d", (int)firstDefaultArgIndex, (int)expectedArgCount);
for (auto i = 0u; i < firstDefaultArgIndex; ++i) {
if (!used[i]) {
- DEBUG(".");
throw EvaluationFailure{} << "argument " << (i + 1) << " not set";
}
}
- DEBUG(".");
for (auto i = firstDefaultArgIndex; i < expectedArgCount; ++i) {
- DEBUG(".");
if (!used[i]) {
- DEBUG(".");
auto &val = defaultArguments[i - firstDefaultArgIndex];
detail::Converter<0, expectedArgCount>::convertSingleArgumentByIndex(args, val, i);
}
}
- DEBUG(".");
}
return detail::apply(f, args);
};
auto res = parseBlockOfLines();
if (res && index < tokens.size()) {
error("unexpected token '" + tokens[index].text() + "'");
- DEBUG(".");
return {};
}
return std::move(res);
TestExecutor exec{ std::move(vars) };
EvaluationContext ec{ exec };
- DEBUG(".");
execute("func(6,7,8,a4=9)", ec, true);
expected = { 6, 7, 8, 9};
ASSERT_EQ(val, expected);
- DEBUG(".");
execute("func(5, 6, a3=3)", ec, true);
expected = { 5, 6, 3, 2};
ASSERT_EQ(val, expected);
- DEBUG(".");
execute("func(5, 6, a4=3)", ec, true);
expected = { 5, 6, 1, 3};
ASSERT_EQ(val, expected);
- DEBUG(".");
execute("func(5, 6, a4=3, a3=5)", ec, true);
expected = { 5, 6, 5, 3};
ASSERT_EQ(val, expected);
- DEBUG(".");
try {
execute("func(1,a3=5,a4=6)", ec, true);
FAIL() << "didn't throw";
} catch (EvaluationFailure &) {
}
- DEBUG(".");
try {
execute("func(1,2,3,4,a3=5)", ec, true);
FAIL() << "didn't throw";
} catch (EvaluationFailure &) {
}
- DEBUG(".");
}
int main(int argc, char *argv[])