1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/private/SkTArray.h" 9cb93a386Sopenharmony_ci#include "include/private/SkTOptional.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "tests/Test.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalEmpty, r) { 14cb93a386Sopenharmony_ci skstd::optional<int> o; 15cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 16cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o.has_value()); 17cb93a386Sopenharmony_ci} 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalNulloptCtor, r) { 20cb93a386Sopenharmony_ci skstd::optional<int> o(skstd::nullopt); 21cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 22cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o.has_value()); 23cb93a386Sopenharmony_ci} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalValueOr, r) { 26cb93a386Sopenharmony_ci { 27cb93a386Sopenharmony_ci skstd::optional<const char*> o; 28cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !strcmp(o.value_or("Hello"), "Hello")); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci { 31cb93a386Sopenharmony_ci skstd::optional<const char*> o("Bye"); 32cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !strcmp(o.value_or("Hello"), "Bye")); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci { 35cb93a386Sopenharmony_ci skstd::optional<std::unique_ptr<int>> o; 36cb93a386Sopenharmony_ci std::unique_ptr<int> a = std::move(o).value_or(std::make_unique<int>(5)); 37cb93a386Sopenharmony_ci REPORTER_ASSERT(r, *a == 5); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci { 40cb93a386Sopenharmony_ci skstd::optional<std::unique_ptr<int>> o(std::make_unique<int>(3)); 41cb93a386Sopenharmony_ci std::unique_ptr<int> a = std::move(o).value_or(std::make_unique<int>(5)); 42cb93a386Sopenharmony_ci REPORTER_ASSERT(r, *a == 3); 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalValue, r) { 47cb93a386Sopenharmony_ci skstd::optional<const char*> o("test"); 48cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 49cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o.has_value()); 50cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !strcmp(*o, "test")); 51cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !strcmp(o.value(), "test")); 52cb93a386Sopenharmony_ci o.reset(); 53cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 54cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o.has_value()); 55cb93a386Sopenharmony_ci} 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalNulloptAssignment, r) { 58cb93a386Sopenharmony_ci skstd::optional<const char*> o("test"); 59cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 60cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o.has_value()); 61cb93a386Sopenharmony_ci o = skstd::nullopt; 62cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 63cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o.has_value()); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalNulloptReturn, r) { 67cb93a386Sopenharmony_ci auto fn = []() -> skstd::optional<float> { return skstd::nullopt; }; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci skstd::optional<float> o = fn(); 70cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 71cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o.has_value()); 72cb93a386Sopenharmony_ci} 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalComparisons, r) { 75cb93a386Sopenharmony_ci int v[] = { 1, 2, 3, 4, 5 }; 76cb93a386Sopenharmony_ci skstd::optional<int> o[] = {1, 2, skstd::nullopt, 4, 5}; 77cb93a386Sopenharmony_ci skstd::optional<int> five = 5; 78cb93a386Sopenharmony_ci skstd::optional<int> six = 6; 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci for (int index = 0; index < (int)SK_ARRAY_COUNT(v); ++index) { 81cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] < six); 82cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] < six); 83cb93a386Sopenharmony_ci REPORTER_ASSERT(r, six > v[index]); 84cb93a386Sopenharmony_ci REPORTER_ASSERT(r, six > o[index]); 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] < 6); 87cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] < 6); 88cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 > v[index]); 89cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 > o[index]); 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(six < v[index])); 92cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(six < o[index])); 93cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(v[index] > six)); 94cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(o[index] > six)); 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(6 < v[index])); 97cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(6 < o[index])); 98cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(v[index] > 6)); 99cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(o[index] > 6)); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] <= five); 102cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] <= five); 103cb93a386Sopenharmony_ci REPORTER_ASSERT(r, five >= v[index]); 104cb93a386Sopenharmony_ci REPORTER_ASSERT(r, five >= o[index]); 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] <= 5); 107cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] <= 5); 108cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 >= v[index]); 109cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 >= o[index]); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci REPORTER_ASSERT(r, skstd::nullopt <= o[index]); 112cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(skstd::nullopt > o[index])); 113cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] >= skstd::nullopt); 114cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(o[index] < skstd::nullopt)); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci if (o[index].has_value()) { 117cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] != skstd::nullopt); 118cb93a386Sopenharmony_ci REPORTER_ASSERT(r, skstd::nullopt != o[index]); 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] == o[index]); 121cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] != six); 122cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] == v[index]); 123cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] == o[index]); 124cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] > 0); 125cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] >= 1); 126cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] <= 5); 127cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] < 6); 128cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 0 < o[index]); 129cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 1 <= o[index]); 130cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 5 >= o[index]); 131cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 6 > o[index]); 132cb93a386Sopenharmony_ci } else { 133cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] == skstd::nullopt); 134cb93a386Sopenharmony_ci REPORTER_ASSERT(r, skstd::nullopt == o[index]); 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] == o[index]); 137cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] != five); 138cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] != v[index]); 139cb93a386Sopenharmony_ci REPORTER_ASSERT(r, v[index] != o[index]); 140cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] < 0); 141cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o[index] <= 0); 142cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 0 > o[index]); 143cb93a386Sopenharmony_ci REPORTER_ASSERT(r, 0 >= o[index]); 144cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(o[index] > 0)); 145cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(o[index] >= 0)); 146cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(0 < o[index])); 147cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !(0 <= o[index])); 148cb93a386Sopenharmony_ci } 149cb93a386Sopenharmony_ci } 150cb93a386Sopenharmony_ci} 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_ciclass SkTOptionalTestPayload { 153cb93a386Sopenharmony_cipublic: 154cb93a386Sopenharmony_ci enum State { 155cb93a386Sopenharmony_ci kConstructed, 156cb93a386Sopenharmony_ci kCopyConstructed, 157cb93a386Sopenharmony_ci kCopyAssigned, 158cb93a386Sopenharmony_ci kMoveConstructed, 159cb93a386Sopenharmony_ci kMoveAssigned, 160cb93a386Sopenharmony_ci kMovedFrom 161cb93a386Sopenharmony_ci }; 162cb93a386Sopenharmony_ci 163cb93a386Sopenharmony_ci SkTOptionalTestPayload(int payload) 164cb93a386Sopenharmony_ci : fState(kConstructed) 165cb93a386Sopenharmony_ci , fPayload(payload) {} 166cb93a386Sopenharmony_ci 167cb93a386Sopenharmony_ci SkTOptionalTestPayload(const SkTOptionalTestPayload& other) 168cb93a386Sopenharmony_ci : fState(kCopyConstructed) 169cb93a386Sopenharmony_ci , fPayload(other.fPayload) {} 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ci SkTOptionalTestPayload(SkTOptionalTestPayload&& other) 172cb93a386Sopenharmony_ci : fState(kMoveConstructed) 173cb93a386Sopenharmony_ci , fPayload(other.fPayload) { 174cb93a386Sopenharmony_ci other.fState = kMovedFrom; 175cb93a386Sopenharmony_ci } 176cb93a386Sopenharmony_ci 177cb93a386Sopenharmony_ci SkTOptionalTestPayload& operator=(const SkTOptionalTestPayload& other) { 178cb93a386Sopenharmony_ci fState = kCopyAssigned; 179cb93a386Sopenharmony_ci fPayload = other.fPayload; 180cb93a386Sopenharmony_ci return *this; 181cb93a386Sopenharmony_ci } 182cb93a386Sopenharmony_ci 183cb93a386Sopenharmony_ci SkTOptionalTestPayload& operator=(SkTOptionalTestPayload&& other) { 184cb93a386Sopenharmony_ci fState = kMoveAssigned; 185cb93a386Sopenharmony_ci fPayload = other.fPayload; 186cb93a386Sopenharmony_ci other.fState = kMovedFrom; 187cb93a386Sopenharmony_ci return *this; 188cb93a386Sopenharmony_ci } 189cb93a386Sopenharmony_ci State fState; 190cb93a386Sopenharmony_ci int fPayload; 191cb93a386Sopenharmony_ci}; 192cb93a386Sopenharmony_ci 193cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalConstruction, r) { 194cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> o(1); 195cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 196cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kConstructed); 197cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fPayload == 1); 198cb93a386Sopenharmony_ci 199cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> copy(o); 200cb93a386Sopenharmony_ci REPORTER_ASSERT(r, copy); 201cb93a386Sopenharmony_ci REPORTER_ASSERT(r, copy->fState == SkTOptionalTestPayload::kCopyConstructed); 202cb93a386Sopenharmony_ci REPORTER_ASSERT(r, copy->fPayload == 1); 203cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kConstructed); 204cb93a386Sopenharmony_ci 205cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> move(std::move(o)); 206cb93a386Sopenharmony_ci REPORTER_ASSERT(r, move); 207cb93a386Sopenharmony_ci REPORTER_ASSERT(r, move->fState == SkTOptionalTestPayload::kMoveConstructed); 208cb93a386Sopenharmony_ci REPORTER_ASSERT(r, move->fPayload == 1); 209cb93a386Sopenharmony_ci // NOLINTNEXTLINE(bugprone-use-after-move) 210cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kMovedFrom); 211cb93a386Sopenharmony_ci} 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalMoveAssignment, r) { 214cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> o; 215cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 216cb93a386Sopenharmony_ci 217cb93a386Sopenharmony_ci // assign to an empty optional from an empty optional 218cb93a386Sopenharmony_ci o = skstd::optional<SkTOptionalTestPayload>(); 219cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 220cb93a386Sopenharmony_ci 221cb93a386Sopenharmony_ci // assign to an empty optional from a full optional 222cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> full(1); 223cb93a386Sopenharmony_ci o = std::move(full); 224cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 225cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kMoveConstructed); 226cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fPayload == 1); 227cb93a386Sopenharmony_ci // NOLINTNEXTLINE(bugprone-use-after-move) 228cb93a386Sopenharmony_ci REPORTER_ASSERT(r, full->fState == SkTOptionalTestPayload::kMovedFrom); 229cb93a386Sopenharmony_ci 230cb93a386Sopenharmony_ci // assign to a full optional from a full optional 231cb93a386Sopenharmony_ci full = skstd::optional<SkTOptionalTestPayload>(2); 232cb93a386Sopenharmony_ci o = std::move(full); 233cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 234cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kMoveAssigned); 235cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fPayload == 2); 236cb93a386Sopenharmony_ci // NOLINTNEXTLINE(bugprone-use-after-move) 237cb93a386Sopenharmony_ci REPORTER_ASSERT(r, full->fState == SkTOptionalTestPayload::kMovedFrom); 238cb93a386Sopenharmony_ci 239cb93a386Sopenharmony_ci // assign to a full optional from an empty optional 240cb93a386Sopenharmony_ci o = skstd::optional<SkTOptionalTestPayload>(); 241cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 242cb93a386Sopenharmony_ci} 243cb93a386Sopenharmony_ci 244cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalCopyAssignment, r) { 245cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> o; 246cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 247cb93a386Sopenharmony_ci 248cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> empty; 249cb93a386Sopenharmony_ci skstd::optional<SkTOptionalTestPayload> full(1); 250cb93a386Sopenharmony_ci 251cb93a386Sopenharmony_ci // assign to an empty optional from an empty optional 252cb93a386Sopenharmony_ci o = empty; 253cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 254cb93a386Sopenharmony_ci 255cb93a386Sopenharmony_ci // assign to an empty optional from a full optional 256cb93a386Sopenharmony_ci o = full; 257cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 258cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kCopyConstructed); 259cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fPayload == 1); 260cb93a386Sopenharmony_ci 261cb93a386Sopenharmony_ci // assign to a full optional from a full optional 262cb93a386Sopenharmony_ci o = full; 263cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o); 264cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fState == SkTOptionalTestPayload::kCopyAssigned); 265cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->fPayload == 1); 266cb93a386Sopenharmony_ci 267cb93a386Sopenharmony_ci // assign to a full optional from an empty optional 268cb93a386Sopenharmony_ci o = empty; 269cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 270cb93a386Sopenharmony_ci} 271cb93a386Sopenharmony_ci 272cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalEmplace, r) { 273cb93a386Sopenharmony_ci skstd::optional<std::vector<int>> o; 274cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o); 275cb93a386Sopenharmony_ci 276cb93a386Sopenharmony_ci // Emplace with the no-argument constructor 277cb93a386Sopenharmony_ci o.emplace(); 278cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o.has_value()); 279cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o->empty()); 280cb93a386Sopenharmony_ci 281cb93a386Sopenharmony_ci // Emplace with the initializer-list constructor 282cb93a386Sopenharmony_ci o.emplace({1, 2, 3}); 283cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o.has_value()); 284cb93a386Sopenharmony_ci REPORTER_ASSERT(r, (*o == std::vector<int>{1, 2, 3})); 285cb93a386Sopenharmony_ci 286cb93a386Sopenharmony_ci // Emplace with a normal constructor 287cb93a386Sopenharmony_ci std::vector<int> otherVec = {4, 5, 6}; 288cb93a386Sopenharmony_ci o.emplace(otherVec.begin(), otherVec.end()); 289cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o.has_value()); 290cb93a386Sopenharmony_ci REPORTER_ASSERT(r, (*o == std::vector<int>{4, 5, 6})); 291cb93a386Sopenharmony_ci} 292cb93a386Sopenharmony_ci 293cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalNoDefaultConstructor, r) { 294cb93a386Sopenharmony_ci class NoDefaultConstructor { 295cb93a386Sopenharmony_ci public: 296cb93a386Sopenharmony_ci NoDefaultConstructor(int value) 297cb93a386Sopenharmony_ci : fValue(value) {} 298cb93a386Sopenharmony_ci 299cb93a386Sopenharmony_ci int fValue; 300cb93a386Sopenharmony_ci }; 301cb93a386Sopenharmony_ci 302cb93a386Sopenharmony_ci skstd::optional<NoDefaultConstructor> o1; 303cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !o1); 304cb93a386Sopenharmony_ci skstd::optional<NoDefaultConstructor> o2(5); 305cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o2); 306cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o2->fValue == 5); 307cb93a386Sopenharmony_ci o1 = std::move(o2); 308cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o1); 309cb93a386Sopenharmony_ci REPORTER_ASSERT(r, o1->fValue == 5); 310cb93a386Sopenharmony_ci} 311cb93a386Sopenharmony_ci 312cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalDestroyed, r) { 313cb93a386Sopenharmony_ci bool destroyed = false; 314cb93a386Sopenharmony_ci struct NotifyWhenDestroyed { 315cb93a386Sopenharmony_ci NotifyWhenDestroyed(bool* e) : fE(e) {} 316cb93a386Sopenharmony_ci ~NotifyWhenDestroyed() { *fE = true; } 317cb93a386Sopenharmony_ci bool* fE; 318cb93a386Sopenharmony_ci }; 319cb93a386Sopenharmony_ci { 320cb93a386Sopenharmony_ci skstd::optional<NotifyWhenDestroyed> notify(&destroyed); 321cb93a386Sopenharmony_ci } 322cb93a386Sopenharmony_ci REPORTER_ASSERT(r, destroyed); 323cb93a386Sopenharmony_ci} 324cb93a386Sopenharmony_ci 325cb93a386Sopenharmony_ciDEF_TEST(SkTOptionalSelfAssignment, r) { 326cb93a386Sopenharmony_ci skstd::optional<SkString> empty; 327cb93a386Sopenharmony_ci skstd::optional<SkString>& emptyRef = empty; 328cb93a386Sopenharmony_ci empty = emptyRef; 329cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !empty); 330cb93a386Sopenharmony_ci empty = std::move(emptyRef); 331cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !empty); 332cb93a386Sopenharmony_ci 333cb93a386Sopenharmony_ci skstd::optional<SkString> full("full"); 334cb93a386Sopenharmony_ci skstd::optional<SkString>& fullRef = full; 335cb93a386Sopenharmony_ci full = fullRef; 336cb93a386Sopenharmony_ci REPORTER_ASSERT(r, full); 337cb93a386Sopenharmony_ci REPORTER_ASSERT(r, *full == SkString("full")); 338cb93a386Sopenharmony_ci full = std::move(fullRef); 339cb93a386Sopenharmony_ci REPORTER_ASSERT(r, full); 340cb93a386Sopenharmony_ci REPORTER_ASSERT(r, *full == SkString("full")); 341cb93a386Sopenharmony_ci} 342