roleProblems method
The problems of the tests of roles in the matrix of modules, whose
apps are apps: for each role of the tests and of testedRoles,
and each module that provides it and is in apps, a test of the role
that applies to none of the apps of the module, or that selects its
apps, takes its values or generates its files by the id of the
module, and no test of a role of testedRoles at all.
A provider of the role that the tests leave out, such as one that a module adds later, is a problem, since its apps would be generated and analyzed, but nothing would check at runtime that it keeps the contract of the role. So is a test that tells the providers apart by their ids, which a new provider would not have: with another id in place of that of a provider in one of its apps, it must apply to the app, fill its values and generate its files as before.
Implementation
List<String> roleProblems(List<SmfModule> modules, List<MatrixApp> apps) {
final roles = {...testedRoles, for (final test in tests) ...test.roles};
return [
for (final role in roles) ..._problemsOfRole(role, modules, apps),
];
}