Skip to content

Commit

Permalink
Merge pull request apple#34286 from xedin/add-sema-unittest-fixture
Browse files Browse the repository at this point in the history
[unittests] Add a fixture for Sema unit tests
  • Loading branch information
xedin committed Oct 14, 2020
2 parents 5d21200 + fde1af7 commit 6a19d37
Show file tree
Hide file tree
Showing 6 changed files with 205 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/swift/Sema/ConstraintSystem.h
Expand Up @@ -4942,6 +4942,7 @@ class ConstraintSystem {
Optional<Type> checkTypeOfBinding(TypeVariableType *typeVar, Type type) const;
Optional<PotentialBindings> determineBestBindings();

public:
/// Infer bindings for the given type variable based on current
/// state of the constraint system.
PotentialBindings inferBindingsFor(TypeVariableType *typeVar,
Expand Down
1 change: 1 addition & 0 deletions unittests/CMakeLists.txt
Expand Up @@ -12,6 +12,7 @@ if(SWIFT_INCLUDE_TOOLS)
add_subdirectory(Localization)
add_subdirectory(IDE)
add_subdirectory(Parse)
add_subdirectory(Sema)
add_subdirectory(SwiftDemangle)
add_subdirectory(Syntax)
if(SWIFT_BUILD_SYNTAXPARSERLIB)
Expand Down
46 changes: 46 additions & 0 deletions unittests/Sema/BindingInferenceTests.cpp
@@ -0,0 +1,46 @@
//===--- BindingInferenceTests.cpp ----------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include "SemaFixture.h"
#include "swift/AST/Expr.h"
#include "swift/Sema/ConstraintSystem.h"

using namespace swift;
using namespace swift::unittest;
using namespace swift::constraints;

TEST_F(SemaTest, TestIntLiteralBindingInference) {
ConstraintSystemOptions options;
options |= ConstraintSystemFlags::AllowUnresolvedTypeVariables;

ConstraintSystem cs(DC, options);

auto *intLiteral = IntegerLiteralExpr::createFromUnsigned(Context, 42);

auto *literalTy = cs.createTypeVariable(cs.getConstraintLocator(intLiteral),
/*options=*/0);

cs.addConstraint(
ConstraintKind::LiteralConformsTo, literalTy,
Context.getProtocol(KnownProtocolKind::ExpressibleByIntegerLiteral)
->getDeclaredInterfaceType(),
cs.getConstraintLocator(intLiteral));

auto bindings = cs.inferBindingsFor(literalTy);

ASSERT_EQ(bindings.Bindings.size(), (unsigned)1);

const auto &binding = bindings.Bindings.front();

ASSERT_TRUE(binding.BindingType->isEqual(getStdlibType("Int")));
ASSERT_TRUE(binding.hasDefaultedLiteralProtocol());
}
13 changes: 13 additions & 0 deletions unittests/Sema/CMakeLists.txt
@@ -0,0 +1,13 @@

add_swift_unittest(swiftSemaTests
SemaFixture.cpp
BindingInferenceTests.cpp)

target_link_libraries(swiftSemaTests
PRIVATE
swiftAST
swiftSema
swiftSerialization)

target_compile_definitions(swiftSemaTests PRIVATE
SWIFTLIB_DIR=\"${SWIFTLIB_DIR}\")
76 changes: 76 additions & 0 deletions unittests/Sema/SemaFixture.cpp
@@ -0,0 +1,76 @@
//===--- SemaFixture.cpp - Helper for setting up Sema context --------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include "SemaFixture.h"
#include "swift/AST/Decl.h"
#include "swift/AST/Import.h"
#include "swift/AST/Module.h"
#include "swift/AST/ParseRequests.h"
#include "swift/AST/SourceFile.h"
#include "swift/AST/Type.h"
#include "swift/AST/Types.h"
#include "swift/Basic/LLVMInitialize.h"
#include "swift/ClangImporter/ClangImporter.h"
#include "swift/Serialization/SerializedModuleLoader.h"
#include "swift/Subsystems.h"

using namespace swift;
using namespace swift::unittest;

SemaTest::SemaTest()
: Context(*ASTContext::get(LangOpts, TypeCheckerOpts, SearchPathOpts,
ClangImporterOpts, SourceMgr, Diags)) {
INITIALIZE_LLVM();

registerParseRequestFunctions(Context.evaluator);
registerTypeCheckerRequestFunctions(Context.evaluator);

Context.addModuleLoader(ImplicitSerializedModuleLoader::create(Context));
Context.addModuleLoader(ClangImporter::create(Context), /*isClang=*/true);

auto *stdlib = Context.getStdlibModule(/*loadIfAbsent=*/true);
assert(stdlib && "Failed to load standard library");

auto *module =
ModuleDecl::create(Context.getIdentifier("SemaTests"), Context);

MainFile = new (Context) SourceFile(*module, SourceFileKind::Main,
/*buffer=*/None);

AttributedImport<ImportedModule> stdlibImport{{ImportPath::Access(), stdlib},
/*options=*/{}};

MainFile->setImports(stdlibImport);
module->addFile(*MainFile);

DC = module;
}

Type SemaTest::getStdlibType(StringRef name) const {
auto typeName = Context.getIdentifier(name);

auto *stdlib = Context.getStdlibModule();

llvm::SmallVector<ValueDecl *, 4> results;
stdlib->lookupValue(typeName, NLKind::UnqualifiedLookup, results);

if (results.size() != 1)
return Type();

if (auto *decl = dyn_cast<TypeDecl>(results.front())) {
if (auto *NTD = dyn_cast<NominalTypeDecl>(decl))
return NTD->getDeclaredType();
return decl->getDeclaredInterfaceType();
}

return Type();
}
68 changes: 68 additions & 0 deletions unittests/Sema/SemaFixture.h
@@ -0,0 +1,68 @@
//===--- SemaFixture.h - Helper for setting up Sema context -----*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include "swift/AST/ASTContext.h"
#include "swift/AST/DiagnosticEngine.h"
#include "swift/AST/Module.h"
#include "swift/AST/SourceFile.h"
#include "swift/AST/Type.h"
#include "swift/Basic/LangOptions.h"
#include "swift/Basic/Platform.h"
#include "swift/Basic/SourceManager.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/Path.h"
#include "gtest/gtest.h"
#include <string>

namespace swift {
namespace unittest {

class SemaTestBase : public ::testing::Test {
public:
LangOptions LangOpts;
TypeCheckerOptions TypeCheckerOpts;
SearchPathOptions SearchPathOpts;
ClangImporterOptions ClangImporterOpts;
SourceManager SourceMgr;
DiagnosticEngine Diags;

SemaTestBase() : Diags(SourceMgr) {
LangOpts.Target = llvm::Triple(llvm::sys::getDefaultTargetTriple());

llvm::SmallString<128> libDir(SWIFTLIB_DIR);
llvm::sys::path::append(libDir, getPlatformNameForTriple(LangOpts.Target));

SearchPathOpts.RuntimeResourcePath = SWIFTLIB_DIR;
SearchPathOpts.RuntimeLibraryPaths.push_back(std::string(libDir.str()));
SearchPathOpts.RuntimeLibraryImportPaths.push_back(
std::string(libDir.str()));
}
};

/// Owns an ASTContext and the associated types.
class SemaTest : public SemaTestBase {
SourceFile *MainFile;

public:
ASTContext &Context;
DeclContext *DC;

SemaTest();

protected:
Type getStdlibType(StringRef name) const;
};

} // end namespace unittest
} // end namespace swift

0 comments on commit 6a19d37

Please sign in to comment.