std::unique_ptr<Unit> TypeChecker::TypeCheckerTest::runCore(std::unique_ptr<Factory> factory, const std::string& code, const std::string& fullFileName, const std::vector<Diagnostic::Code>& expectedReports, const std::pair<std::string, Type::Kind>& expectedBindings) { std::vector<std::string> searchPaths = readSearchPaths(); TokenMap tokens; LexemeMap lexs; Snapshot snapshot; DiagnosticReports reports; Manager manager; manager.config(factory.get(), &tokens, &lexs, snapshot); for (const auto& path : searchPaths) manager.addSearchPath(path); std::unique_ptr<Unit> unit = manager.process(code, fullFileName); UAISO_EXPECT_TRUE(unit->ast()); Program* prog = snapshot.find(fullFileName); UAISO_EXPECT_TRUE(prog); TypeChecker typeChecker(factory.get()); typeChecker.setLexemes(&lexs); typeChecker.setTokens(&tokens); typeChecker.collectDiagnostics(&reports); typeChecker.check(Program_Cast(unit->ast())); UAISO_EXPECT_INT_EQ(expectedReports.size(), reports.size()); for (const auto& s : expectedReports) { UAISO_EXPECT_TRUE(std::find_if(reports.begin(), reports.end(), [s](const DiagnosticReport& report) { return report.diagnostic().code() == s; }) != reports.end()); } const std::string& symName = expectedBindings.first; if (!symName.empty()) { for (auto valSym : prog->env().listValueDecls()) { if (valSym->name()->str() == symName) { auto ty = valSym->valueType(); UAISO_EXPECT_INT_EQ(static_cast<int>(expectedBindings.second), static_cast<int>(ty->kind())); } } } return std::move(unit); }