73 lines · cpp
1//===- llvm/unittest/ADT/FunctionRefTest.cpp - function_ref unit tests ----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/STLExtras.h"10#include "gtest/gtest.h"11 12using namespace llvm;13 14namespace {15 16// Ensure that there is a default constructor and we can test for a null17// function_ref.18TEST(FunctionRefTest, Null) {19 function_ref<int()> F;20 EXPECT_FALSE(F);21 22 auto L = [] { return 1; };23 F = L;24 EXPECT_TRUE(F);25 26 F = {};27 EXPECT_FALSE(F);28}29 30// Ensure that copies of a function_ref copy the underlying state rather than31// causing one function_ref to chain to the next.32TEST(FunctionRefTest, Copy) {33 auto A = [] { return 1; };34 auto B = [] { return 2; };35 function_ref<int()> X = A;36 function_ref<int()> Y = X;37 X = B;38 EXPECT_EQ(1, Y());39}40 41TEST(FunctionRefTest, BadCopy) {42 auto A = [] { return 1; };43 function_ref<int()> X;44 function_ref<int()> Y = A;45 function_ref<int()> Z = static_cast<const function_ref<int()> &&>(Y);46 X = Z;47 Y = nullptr;48 ASSERT_EQ(1, X());49}50 51// Test that overloads on function_refs are resolved as expected.52std::string returns(StringRef) { return "not a function"; }53std::string returns(function_ref<double()> F) { return "number"; }54std::string returns(function_ref<StringRef()> F) { return "string"; }55 56TEST(FunctionRefTest, SFINAE) {57 EXPECT_EQ("not a function", returns("boo!"));58 EXPECT_EQ("number", returns([] { return 42; }));59 EXPECT_EQ("string", returns([] { return "hello"; }));60}61 62TEST(FunctionRefTest, Equality) {63 const auto Lambda = []() { return 0; };64 function_ref<int()> X = Lambda;65 function_ref<int()> Y = X;66 EXPECT_EQ(X, Y);67 68 function_ref<int()> A(Lambda), B(Lambda);69 EXPECT_EQ(A, B);70}71 72} // namespace73