Example #1
0
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);
}