2 * Copyright 2015 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <gtest/gtest.h>
20 #include <folly/futures/Future.h>
22 using namespace folly;
25 int v_, copied_, moved_;
26 /* implicit */ Widget(int v) : v_(v), copied_(0), moved_(0) {}
27 Widget(const Widget& other)
28 : v_(other.v_), copied_(other.copied_ + 1), moved_(other.moved_) {}
29 Widget(Widget&& other) noexcept
30 : v_(other.v_), copied_(other.copied_), moved_(other.moved_ + 1) {}
31 Widget& operator=(const Widget& other)
32 { throw std::logic_error("unexpected copy assignment"); }
33 Widget& operator=(Widget&& other)
34 { throw std::logic_error("unexpected move assignment"); }
37 TEST(Then, tryConstructor) {
38 auto t = Try<Widget>(23);
39 EXPECT_EQ(t.value().v_, 23);
40 EXPECT_EQ(t.value().copied_, 0);
41 EXPECT_EQ(t.value().moved_, 1);
44 TEST(Then, makeFuture) {
45 auto future = makeFuture<Widget>(23);
46 EXPECT_EQ(future.value().v_, 23);
47 EXPECT_EQ(future.value().copied_, 0);
48 EXPECT_EQ(future.value().moved_, 2);
51 TEST(Then, TryConstRValueReference) {
52 auto future = makeFuture<Widget>(23).then(
53 [](const Try<Widget>&& t) {
54 EXPECT_EQ(t.value().copied_, 0);
55 EXPECT_EQ(t.value().moved_, 2);
58 EXPECT_EQ(future.value(), 23);
61 TEST(Then, TryRValueReference) {
62 auto future = makeFuture<Widget>(23).then(
64 EXPECT_EQ(t.value().copied_, 0);
65 EXPECT_EQ(t.value().moved_, 2);
68 EXPECT_EQ(future.value(), 23);
71 TEST(Then, TryLValueReference) {
72 auto future = makeFuture<Widget>(23).then(
74 EXPECT_EQ(t.value().copied_, 0);
75 EXPECT_EQ(t.value().moved_, 2);
78 EXPECT_EQ(future.value(), 23);
81 TEST(Then, TryConstLValueReference) {
82 auto future = makeFuture<Widget>(23).then(
83 [](const Try<Widget>& t) {
84 EXPECT_EQ(t.value().copied_, 0);
85 EXPECT_EQ(t.value().moved_, 2);
88 EXPECT_EQ(future.value(), 23);
91 TEST(Then, TryValue) {
92 auto future = makeFuture<Widget>(23).then(
94 EXPECT_EQ(t.value().copied_, 0);
95 EXPECT_EQ(t.value().moved_, 3);
98 EXPECT_EQ(future.value(), 23);
101 TEST(Then, TryConstValue) {
102 auto future = makeFuture<Widget>(23).then(
103 [](const Try<Widget> t) {
104 EXPECT_EQ(t.value().copied_, 0);
105 EXPECT_EQ(t.value().moved_, 3);
108 EXPECT_EQ(future.value(), 23);
111 TEST(Then, ConstRValueReference) {
112 auto future = makeFuture<Widget>(23).then(
113 [](const Widget&& w) {
114 EXPECT_EQ(w.copied_, 0);
115 EXPECT_EQ(w.moved_, 2);
118 EXPECT_EQ(future.value(), 23);
121 TEST(Then, RValueReference) {
122 auto future = makeFuture<Widget>(23).then(
124 EXPECT_EQ(w.copied_, 0);
125 EXPECT_EQ(w.moved_, 2);
128 EXPECT_EQ(future.value(), 23);
131 TEST(Then, LValueReference) {
132 auto future = makeFuture<Widget>(23).then(
134 EXPECT_EQ(w.copied_, 0);
135 EXPECT_EQ(w.moved_, 2);
138 EXPECT_EQ(future.value(), 23);
141 TEST(Then, ConstLValueReference) {
142 auto future = makeFuture<Widget>(23).then(
143 [](const Widget& w) {
144 EXPECT_EQ(w.copied_, 0);
145 EXPECT_EQ(w.moved_, 2);
148 EXPECT_EQ(future.value(), 23);
152 auto future = makeFuture<Widget>(23).then(
154 EXPECT_EQ(w.copied_, 0);
155 EXPECT_EQ(w.moved_, 3);
158 EXPECT_EQ(future.value(), 23);
161 TEST(Then, ConstValue) {
162 auto future = makeFuture<Widget>(23).then(
164 EXPECT_EQ(w.copied_, 0);
165 EXPECT_EQ(w.moved_, 3);
168 EXPECT_EQ(future.value(), 23);