| Index: third_party/WebKit/Source/wtf/FunctionalTest.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/FunctionalTest.cpp b/third_party/WebKit/Source/wtf/FunctionalTest.cpp
|
| deleted file mode 100644
|
| index 30dc23646b61bc1807643b729f1cae726c98de3c..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/wtf/FunctionalTest.cpp
|
| +++ /dev/null
|
| @@ -1,594 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2011 Apple Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
| - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
| - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
| - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
| - * THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "wtf/Functional.h"
|
| -
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "wtf/RefCounted.h"
|
| -#include "wtf/WeakPtr.h"
|
| -#include <utility>
|
| -
|
| -namespace WTF {
|
| -
|
| -class UnwrappedClass {
|
| - public:
|
| - explicit UnwrappedClass(int value) : m_value(value) {}
|
| -
|
| - int value() const { return m_value; }
|
| -
|
| - private:
|
| - int m_value;
|
| -};
|
| -
|
| -// This class must be wrapped in bind() and unwrapped in closure execution.
|
| -class ClassToBeWrapped {
|
| - WTF_MAKE_NONCOPYABLE(ClassToBeWrapped);
|
| -
|
| - public:
|
| - explicit ClassToBeWrapped(int value) : m_value(value) {}
|
| -
|
| - int value() const { return m_value; }
|
| -
|
| - private:
|
| - int m_value;
|
| -};
|
| -
|
| -class WrappedClass {
|
| - public:
|
| - WrappedClass(const ClassToBeWrapped& to_be_wrapped)
|
| - : m_value(to_be_wrapped.value()) {}
|
| -
|
| - explicit WrappedClass(int value) : m_value(value) {}
|
| -
|
| - UnwrappedClass unwrap() const { return UnwrappedClass(m_value); }
|
| -
|
| - private:
|
| - int m_value;
|
| -};
|
| -
|
| -template <>
|
| -struct ParamStorageTraits<ClassToBeWrapped> {
|
| - using StorageType = WrappedClass;
|
| -};
|
| -
|
| -class HasWeakPtrSupport {
|
| - public:
|
| - HasWeakPtrSupport() : m_weakPtrFactory(this) {}
|
| -
|
| - WTF::WeakPtr<HasWeakPtrSupport> createWeakPtr() {
|
| - return m_weakPtrFactory.createWeakPtr();
|
| - }
|
| -
|
| - void revokeAll() { m_weakPtrFactory.revokeAll(); }
|
| -
|
| - void increment(int* counter) { ++*counter; }
|
| -
|
| - private:
|
| - WTF::WeakPtrFactory<HasWeakPtrSupport> m_weakPtrFactory;
|
| -};
|
| -
|
| -} // namespace WTF
|
| -
|
| -namespace base {
|
| -
|
| -template <>
|
| -struct BindUnwrapTraits<WTF::WrappedClass> {
|
| - static WTF::UnwrappedClass Unwrap(const WTF::WrappedClass& wrapped) {
|
| - return wrapped.unwrap();
|
| - }
|
| -};
|
| -
|
| -} // namespace base
|
| -
|
| -namespace WTF {
|
| -namespace {
|
| -
|
| -int returnFortyTwo() {
|
| - return 42;
|
| -}
|
| -
|
| -TEST(FunctionalTest, Basic) {
|
| - std::unique_ptr<Function<int()>> returnFortyTwoFunction =
|
| - bind(returnFortyTwo);
|
| - EXPECT_EQ(42, (*returnFortyTwoFunction)());
|
| -}
|
| -
|
| -int multiplyByTwo(int n) {
|
| - return n * 2;
|
| -}
|
| -
|
| -double multiplyByOneAndAHalf(double d) {
|
| - return d * 1.5;
|
| -}
|
| -
|
| -TEST(FunctionalTest, UnaryBind) {
|
| - std::unique_ptr<Function<int()>> multiplyFourByTwoFunction =
|
| - bind(multiplyByTwo, 4);
|
| - EXPECT_EQ(8, (*multiplyFourByTwoFunction)());
|
| -
|
| - std::unique_ptr<Function<double()>> multiplyByOneAndAHalfFunction =
|
| - bind(multiplyByOneAndAHalf, 3);
|
| - EXPECT_EQ(4.5, (*multiplyByOneAndAHalfFunction)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, UnaryPartBind) {
|
| - std::unique_ptr<Function<int(int)>> multiplyByTwoFunction =
|
| - bind(multiplyByTwo);
|
| - EXPECT_EQ(8, (*multiplyByTwoFunction)(4));
|
| -
|
| - std::unique_ptr<Function<double(double)>> multiplyByOneAndAHalfFunction =
|
| - bind(multiplyByOneAndAHalf);
|
| - EXPECT_EQ(4.5, (*multiplyByOneAndAHalfFunction)(3));
|
| -}
|
| -
|
| -int multiply(int x, int y) {
|
| - return x * y;
|
| -}
|
| -
|
| -int subtract(int x, int y) {
|
| - return x - y;
|
| -}
|
| -
|
| -TEST(FunctionalTest, BinaryBind) {
|
| - std::unique_ptr<Function<int()>> multiplyFourByTwoFunction =
|
| - bind(multiply, 4, 2);
|
| - EXPECT_EQ(8, (*multiplyFourByTwoFunction)());
|
| -
|
| - std::unique_ptr<Function<int()>> subtractTwoFromFourFunction =
|
| - bind(subtract, 4, 2);
|
| - EXPECT_EQ(2, (*subtractTwoFromFourFunction)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, BinaryPartBind) {
|
| - std::unique_ptr<Function<int(int)>> multiplyFourFunction = bind(multiply, 4);
|
| - EXPECT_EQ(8, (*multiplyFourFunction)(2));
|
| - std::unique_ptr<Function<int(int, int)>> multiplyFunction = bind(multiply);
|
| - EXPECT_EQ(8, (*multiplyFunction)(4, 2));
|
| -
|
| - std::unique_ptr<Function<int(int)>> subtractFromFourFunction =
|
| - bind(subtract, 4);
|
| - EXPECT_EQ(2, (*subtractFromFourFunction)(2));
|
| - std::unique_ptr<Function<int(int, int)>> subtractFunction = bind(subtract);
|
| - EXPECT_EQ(2, (*subtractFunction)(4, 2));
|
| -}
|
| -
|
| -void sixArgFunc(int a, double b, char c, int* d, double* e, char* f) {
|
| - *d = a;
|
| - *e = b;
|
| - *f = c;
|
| -}
|
| -
|
| -void assertArgs(int actualInt,
|
| - double actualDouble,
|
| - char actualChar,
|
| - int expectedInt,
|
| - double expectedDouble,
|
| - char expectedChar) {
|
| - EXPECT_EQ(expectedInt, actualInt);
|
| - EXPECT_EQ(expectedDouble, actualDouble);
|
| - EXPECT_EQ(expectedChar, actualChar);
|
| -}
|
| -
|
| -TEST(FunctionalTest, MultiPartBind) {
|
| - int a = 0;
|
| - double b = 0.5;
|
| - char c = 'a';
|
| -
|
| - std::unique_ptr<Function<void(int, double, char, int*, double*, char*)>>
|
| - unbound = bind(sixArgFunc);
|
| - (*unbound)(1, 1.5, 'b', &a, &b, &c);
|
| - assertArgs(a, b, c, 1, 1.5, 'b');
|
| -
|
| - std::unique_ptr<Function<void(double, char, int*, double*, char*)>> oneBound =
|
| - bind(sixArgFunc, 2);
|
| - (*oneBound)(2.5, 'c', &a, &b, &c);
|
| - assertArgs(a, b, c, 2, 2.5, 'c');
|
| -
|
| - std::unique_ptr<Function<void(char, int*, double*, char*)>> twoBound =
|
| - bind(sixArgFunc, 3, 3.5);
|
| - (*twoBound)('d', &a, &b, &c);
|
| - assertArgs(a, b, c, 3, 3.5, 'd');
|
| -
|
| - std::unique_ptr<Function<void(int*, double*, char*)>> threeBound =
|
| - bind(sixArgFunc, 4, 4.5, 'e');
|
| - (*threeBound)(&a, &b, &c);
|
| - assertArgs(a, b, c, 4, 4.5, 'e');
|
| -
|
| - std::unique_ptr<Function<void(double*, char*)>> fourBound =
|
| - bind(sixArgFunc, 5, 5.5, 'f', WTF::unretained(&a));
|
| - (*fourBound)(&b, &c);
|
| - assertArgs(a, b, c, 5, 5.5, 'f');
|
| -
|
| - std::unique_ptr<Function<void(char*)>> fiveBound =
|
| - bind(sixArgFunc, 6, 6.5, 'g', WTF::unretained(&a), WTF::unretained(&b));
|
| - (*fiveBound)(&c);
|
| - assertArgs(a, b, c, 6, 6.5, 'g');
|
| -
|
| - std::unique_ptr<Function<void()>> sixBound =
|
| - bind(sixArgFunc, 7, 7.5, 'h', WTF::unretained(&a), WTF::unretained(&b),
|
| - WTF::unretained(&c));
|
| - (*sixBound)();
|
| - assertArgs(a, b, c, 7, 7.5, 'h');
|
| -}
|
| -
|
| -class A {
|
| - public:
|
| - explicit A(int i) : m_i(i) {}
|
| -
|
| - int f() { return m_i; }
|
| - int addF(int j) { return m_i + j; }
|
| - virtual int overridden() { return 42; }
|
| -
|
| - private:
|
| - int m_i;
|
| -};
|
| -
|
| -class B : public A {
|
| - public:
|
| - explicit B(int i) : A(i) {}
|
| -
|
| - int f() { return A::f() + 1; }
|
| - int addF(int j) { return A::addF(j) + 1; }
|
| - int overridden() override { return 43; }
|
| -};
|
| -
|
| -TEST(FunctionalTest, MemberFunctionBind) {
|
| - A a(10);
|
| - std::unique_ptr<Function<int()>> function1 = bind(&A::f, WTF::unretained(&a));
|
| - EXPECT_EQ(10, (*function1)());
|
| -
|
| - std::unique_ptr<Function<int()>> function2 =
|
| - bind(&A::addF, WTF::unretained(&a), 15);
|
| - EXPECT_EQ(25, (*function2)());
|
| -
|
| - std::unique_ptr<Function<int()>> function3 =
|
| - bind(&A::overridden, WTF::unretained(&a));
|
| - EXPECT_EQ(42, (*function3)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, MemberFunctionBindWithSubclassPointer) {
|
| - B b(10);
|
| - std::unique_ptr<Function<int()>> function1 = bind(&A::f, WTF::unretained(&b));
|
| - EXPECT_EQ(10, (*function1)());
|
| -
|
| - std::unique_ptr<Function<int()>> function2 =
|
| - bind(&A::addF, WTF::unretained(&b), 15);
|
| - EXPECT_EQ(25, (*function2)());
|
| -
|
| - std::unique_ptr<Function<int()>> function3 =
|
| - bind(&A::overridden, WTF::unretained(&b));
|
| - EXPECT_EQ(43, (*function3)());
|
| -
|
| - std::unique_ptr<Function<int()>> function4 = bind(&B::f, WTF::unretained(&b));
|
| - EXPECT_EQ(11, (*function4)());
|
| -
|
| - std::unique_ptr<Function<int()>> function5 =
|
| - bind(&B::addF, WTF::unretained(&b), 15);
|
| - EXPECT_EQ(26, (*function5)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, MemberFunctionBindWithSubclassPointerWithCast) {
|
| - B b(10);
|
| - std::unique_ptr<Function<int()>> function1 =
|
| - bind(&A::f, WTF::unretained(static_cast<A*>(&b)));
|
| - EXPECT_EQ(10, (*function1)());
|
| -
|
| - std::unique_ptr<Function<int()>> function2 =
|
| - bind(&A::addF, WTF::unretained(static_cast<A*>(&b)), 15);
|
| - EXPECT_EQ(25, (*function2)());
|
| -
|
| - std::unique_ptr<Function<int()>> function3 =
|
| - bind(&A::overridden, WTF::unretained(static_cast<A*>(&b)));
|
| - EXPECT_EQ(43, (*function3)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, MemberFunctionPartBind) {
|
| - A a(10);
|
| - std::unique_ptr<Function<int(class A*)>> function1 = bind(&A::f);
|
| - EXPECT_EQ(10, (*function1)(&a));
|
| -
|
| - std::unique_ptr<Function<int(class A*, int)>> unboundFunction2 =
|
| - bind(&A::addF);
|
| - EXPECT_EQ(25, (*unboundFunction2)(&a, 15));
|
| - std::unique_ptr<Function<int(int)>> objectBoundFunction2 =
|
| - bind(&A::addF, WTF::unretained(&a));
|
| - EXPECT_EQ(25, (*objectBoundFunction2)(15));
|
| -}
|
| -
|
| -TEST(FunctionalTest, MemberFunctionBindByUniquePtr) {
|
| - std::unique_ptr<Function<int()>> function1 =
|
| - WTF::bind(&A::f, WTF::makeUnique<A>(10));
|
| - EXPECT_EQ(10, (*function1)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, MemberFunctionBindByPassedUniquePtr) {
|
| - std::unique_ptr<Function<int()>> function1 =
|
| - WTF::bind(&A::f, WTF::passed(WTF::makeUnique<A>(10)));
|
| - EXPECT_EQ(10, (*function1)());
|
| -}
|
| -
|
| -class Number : public RefCounted<Number> {
|
| - public:
|
| - static PassRefPtr<Number> create(int value) {
|
| - return adoptRef(new Number(value));
|
| - }
|
| -
|
| - ~Number() { m_value = 0; }
|
| -
|
| - int value() const { return m_value; }
|
| -
|
| - private:
|
| - explicit Number(int value) : m_value(value) {}
|
| -
|
| - int m_value;
|
| -};
|
| -
|
| -int multiplyNumberByTwo(Number* number) {
|
| - return number->value() * 2;
|
| -}
|
| -
|
| -TEST(FunctionalTest, RefCountedStorage) {
|
| - RefPtr<Number> five = Number::create(5);
|
| - EXPECT_EQ(1, five->refCount());
|
| - std::unique_ptr<Function<int()>> multiplyFiveByTwoFunction =
|
| - bind(multiplyNumberByTwo, five);
|
| - EXPECT_EQ(2, five->refCount());
|
| - EXPECT_EQ(10, (*multiplyFiveByTwoFunction)());
|
| - EXPECT_EQ(2, five->refCount());
|
| -
|
| - std::unique_ptr<Function<int()>> multiplyFourByTwoFunction =
|
| - bind(multiplyNumberByTwo, Number::create(4));
|
| - EXPECT_EQ(8, (*multiplyFourByTwoFunction)());
|
| -
|
| - RefPtr<Number> six = Number::create(6);
|
| - std::unique_ptr<Function<int()>> multiplySixByTwoFunction =
|
| - bind(multiplyNumberByTwo, six.release());
|
| - EXPECT_FALSE(six);
|
| - EXPECT_EQ(12, (*multiplySixByTwoFunction)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, UnretainedWithRefCounted) {
|
| - RefPtr<Number> five = Number::create(5);
|
| - EXPECT_EQ(1, five->refCount());
|
| - std::unique_ptr<Function<int()>> multiplyFiveByTwoFunction =
|
| - bind(multiplyNumberByTwo, WTF::unretained(five.get()));
|
| - EXPECT_EQ(1, five->refCount());
|
| - EXPECT_EQ(10, (*multiplyFiveByTwoFunction)());
|
| - EXPECT_EQ(1, five->refCount());
|
| -}
|
| -
|
| -int processUnwrappedClass(const UnwrappedClass& u, int v) {
|
| - return u.value() * v;
|
| -}
|
| -
|
| -// Tests that:
|
| -// - ParamStorageTraits's wrap()/unwrap() are called, and
|
| -// - bind()'s arguments are passed as references to ParamStorageTraits::wrap()
|
| -// with no additional copies.
|
| -// This test would fail in compile if something is wrong,
|
| -// rather than in runtime.
|
| -TEST(FunctionalTest, WrapUnwrap) {
|
| - std::unique_ptr<Function<int()>> function =
|
| - bind(processUnwrappedClass, ClassToBeWrapped(3), 7);
|
| - EXPECT_EQ(21, (*function)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, WrapUnwrapInPartialBind) {
|
| - std::unique_ptr<Function<int(int)>> partiallyBoundFunction =
|
| - bind(processUnwrappedClass, ClassToBeWrapped(3));
|
| - EXPECT_EQ(21, (*partiallyBoundFunction)(7));
|
| -}
|
| -
|
| -bool lotsOfArguments(int first,
|
| - int second,
|
| - int third,
|
| - int fourth,
|
| - int fifth,
|
| - int sixth,
|
| - int seventh,
|
| - int eighth,
|
| - int ninth,
|
| - int tenth) {
|
| - return first == 1 && second == 2 && third == 3 && fourth == 4 && fifth == 5 &&
|
| - sixth == 6 && seventh == 7 && eighth == 8 && ninth == 9 && tenth == 10;
|
| -}
|
| -
|
| -TEST(FunctionalTest, LotsOfBoundVariables) {
|
| - std::unique_ptr<Function<bool(int, int)>> eightBound =
|
| - bind(lotsOfArguments, 1, 2, 3, 4, 5, 6, 7, 8);
|
| - EXPECT_TRUE((*eightBound)(9, 10));
|
| -
|
| - std::unique_ptr<Function<bool(int)>> nineBound =
|
| - bind(lotsOfArguments, 1, 2, 3, 4, 5, 6, 7, 8, 9);
|
| - EXPECT_TRUE((*nineBound)(10));
|
| -
|
| - std::unique_ptr<Function<bool()>> allBound =
|
| - bind(lotsOfArguments, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
|
| - EXPECT_TRUE((*allBound)());
|
| -}
|
| -
|
| -class MoveOnly {
|
| - public:
|
| - explicit MoveOnly(int value) : m_value(value) {}
|
| - MoveOnly(MoveOnly&& other) : m_value(other.m_value) {
|
| - // Reset the value on move.
|
| - other.m_value = 0;
|
| - }
|
| -
|
| - int value() const { return m_value; }
|
| -
|
| - private:
|
| - MoveOnly(const MoveOnly&) = delete;
|
| - MoveOnly& operator=(const MoveOnly&) = delete;
|
| -
|
| - // Disable move-assignment, since it isn't used within bind().
|
| - MoveOnly& operator=(MoveOnly&&) = delete;
|
| -
|
| - int m_value;
|
| -};
|
| -
|
| -int singleMoveOnlyByRvalueReference(MoveOnly&& moveOnly) {
|
| - int value = moveOnly.value();
|
| - MoveOnly(std::move(moveOnly));
|
| - return value;
|
| -}
|
| -
|
| -int tripleMoveOnlysByRvalueReferences(MoveOnly&& first,
|
| - MoveOnly&& second,
|
| - MoveOnly&& third) {
|
| - int value = first.value() + second.value() + third.value();
|
| - MoveOnly(std::move(first));
|
| - MoveOnly(std::move(second));
|
| - MoveOnly(std::move(third));
|
| - return value;
|
| -}
|
| -
|
| -int singleMoveOnlyByValue(MoveOnly moveOnly) {
|
| - return moveOnly.value();
|
| -}
|
| -
|
| -int tripleMoveOnlysByValues(MoveOnly first, MoveOnly second, MoveOnly third) {
|
| - return first.value() + second.value() + third.value();
|
| -}
|
| -
|
| -TEST(FunctionalTest, BindMoveOnlyObjects) {
|
| - MoveOnly one(1);
|
| - std::unique_ptr<Function<int()>> bound =
|
| - bind(singleMoveOnlyByRvalueReference, WTF::passed(std::move(one)));
|
| - EXPECT_EQ(0, one.value()); // Should be moved away.
|
| - EXPECT_EQ(1, (*bound)());
|
| - // The stored value must be cleared in the first function call.
|
| - EXPECT_EQ(0, (*bound)());
|
| -
|
| - bound = bind(singleMoveOnlyByValue, WTF::passed(MoveOnly(1)));
|
| - EXPECT_EQ(1, (*bound)());
|
| - EXPECT_EQ(0, (*bound)());
|
| -
|
| - bound = bind(tripleMoveOnlysByRvalueReferences, WTF::passed(MoveOnly(1)),
|
| - WTF::passed(MoveOnly(2)), WTF::passed(MoveOnly(3)));
|
| - EXPECT_EQ(6, (*bound)());
|
| - EXPECT_EQ(0, (*bound)());
|
| -
|
| - bound = bind(tripleMoveOnlysByValues, WTF::passed(MoveOnly(1)),
|
| - WTF::passed(MoveOnly(2)), WTF::passed(MoveOnly(3)));
|
| - EXPECT_EQ(6, (*bound)());
|
| - EXPECT_EQ(0, (*bound)());
|
| -}
|
| -
|
| -class CountCopy {
|
| - public:
|
| - CountCopy() : m_copies(0) {}
|
| - CountCopy(const CountCopy& other) : m_copies(other.m_copies + 1) {}
|
| -
|
| - int copies() const { return m_copies; }
|
| -
|
| - private:
|
| - // Copy/move-assignment is not needed in the test.
|
| - CountCopy& operator=(const CountCopy&) = delete;
|
| - CountCopy& operator=(CountCopy&&) = delete;
|
| -
|
| - int m_copies;
|
| -};
|
| -
|
| -int takeCountCopyAsConstReference(const CountCopy& counter) {
|
| - return counter.copies();
|
| -}
|
| -
|
| -int takeCountCopyAsValue(CountCopy counter) {
|
| - return counter.copies();
|
| -}
|
| -
|
| -TEST(FunctionalTest, CountCopiesOfBoundArguments) {
|
| - CountCopy lvalue;
|
| - std::unique_ptr<Function<int()>> bound =
|
| - bind(takeCountCopyAsConstReference, lvalue);
|
| - EXPECT_EQ(2, (*bound)()); // wrapping and unwrapping.
|
| -
|
| - bound = bind(takeCountCopyAsConstReference, CountCopy()); // Rvalue.
|
| - EXPECT_EQ(2, (*bound)());
|
| -
|
| - bound = bind(takeCountCopyAsValue, lvalue);
|
| - // wrapping, unwrapping and copying in the final function argument.
|
| - EXPECT_EQ(3, (*bound)());
|
| -
|
| - bound = bind(takeCountCopyAsValue, CountCopy());
|
| - EXPECT_EQ(3, (*bound)());
|
| -}
|
| -
|
| -TEST(FunctionalTest, MoveUnboundArgumentsByRvalueReference) {
|
| - std::unique_ptr<Function<int(MoveOnly &&)>> boundSingle =
|
| - bind(singleMoveOnlyByRvalueReference);
|
| - EXPECT_EQ(1, (*boundSingle)(MoveOnly(1)));
|
| - EXPECT_EQ(42, (*boundSingle)(MoveOnly(42)));
|
| -
|
| - std::unique_ptr<Function<int(MoveOnly&&, MoveOnly&&, MoveOnly &&)>>
|
| - boundTriple = bind(tripleMoveOnlysByRvalueReferences);
|
| - EXPECT_EQ(6, (*boundTriple)(MoveOnly(1), MoveOnly(2), MoveOnly(3)));
|
| - EXPECT_EQ(666, (*boundTriple)(MoveOnly(111), MoveOnly(222), MoveOnly(333)));
|
| -
|
| - std::unique_ptr<Function<int(MoveOnly)>> boundSingleByValue =
|
| - bind(singleMoveOnlyByValue);
|
| - EXPECT_EQ(1, (*boundSingleByValue)(MoveOnly(1)));
|
| -
|
| - std::unique_ptr<Function<int(MoveOnly, MoveOnly, MoveOnly)>>
|
| - boundTripleByValue = bind(tripleMoveOnlysByValues);
|
| - EXPECT_EQ(6, (*boundTripleByValue)(MoveOnly(1), MoveOnly(2), MoveOnly(3)));
|
| -}
|
| -
|
| -TEST(FunctionalTest, CountCopiesOfUnboundArguments) {
|
| - CountCopy lvalue;
|
| - std::unique_ptr<Function<int(const CountCopy&)>> bound1 =
|
| - bind(takeCountCopyAsConstReference);
|
| - EXPECT_EQ(0, (*bound1)(lvalue)); // No copies!
|
| - EXPECT_EQ(0, (*bound1)(CountCopy()));
|
| -
|
| - std::unique_ptr<Function<int(CountCopy)>> bound2 = bind(takeCountCopyAsValue);
|
| - // At Function::operator(), at Callback::Run() and at the destination
|
| - // function.
|
| - EXPECT_EQ(3, (*bound2)(lvalue));
|
| - // Compiler is allowed to optimize one copy away if the argument is rvalue.
|
| - EXPECT_LE((*bound2)(CountCopy()), 2);
|
| -}
|
| -
|
| -TEST(FunctionalTest, WeakPtr) {
|
| - HasWeakPtrSupport obj;
|
| - int counter = 0;
|
| - std::unique_ptr<WTF::Closure> bound =
|
| - WTF::bind(&HasWeakPtrSupport::increment, obj.createWeakPtr(),
|
| - WTF::unretained(&counter));
|
| -
|
| - (*bound)();
|
| - EXPECT_FALSE(bound->isCancelled());
|
| - EXPECT_EQ(1, counter);
|
| -
|
| - obj.revokeAll();
|
| - EXPECT_TRUE(bound->isCancelled());
|
| - (*bound)();
|
| - EXPECT_EQ(1, counter);
|
| -}
|
| -
|
| -} // anonymous namespace
|
| -
|
| -} // namespace WTF
|
|
|