Skip to content

Commit 1e6ded8

Browse files
committed
fixed non-copyable and non-movable types for change_observer
1 parent 62c2804 commit 1e6ded8

File tree

1 file changed

+141
-106
lines changed

1 file changed

+141
-106
lines changed

tests/change_observer.cpp

Lines changed: 141 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,10 @@ std::string toString<NoCopy>(NoCopy const &v) {
225225

226226
TEMPLATE_TEST_CASE("Change observer KeepOldCopy::Yes",
227227
"[change_observer]",
228-
// NoMove, //
229-
// NoCopy, //
230-
int, //
231-
Simple //
228+
NoMove, //
229+
NoCopy, //
230+
int, //
231+
Simple //
232232
) {
233233
SECTION("No compare") {
234234
using Observer = ut::ChangeObserver<TestType, ut::ChangeObserverKeepOldCopy::Yes, void>;
@@ -256,44 +256,51 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::Yes",
256256
value_ctor.onChange([&](auto &&...) { changed++; });
257257
Observer default_val;
258258
Observer similar_val {getSimilarValue<TestType>()};
259-
value_ctor = default_val;
259+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
260+
value_ctor = default_val;
261+
} else {
262+
value_ctor = std::move(default_val);
263+
}
260264
value_ctor = Observer {getValue<TestType>()};
261265
value_ctor = Observer {getValue<TestType>()};
262266
REQUIRE(changed == 3);
263267
}
264268
SECTION("getRef & Proxy") {
265-
int changed = 0;
266-
Observer v;
267-
v.onChange([&](auto &&...) { changed++; });
268-
v.getRef() = getValue<TestType>();
269-
REQUIRE(changed == 1);
270-
{
271-
auto ref = v.getRef();
272-
ref = getDefaultValue<TestType>();
273-
REQUIRE(changed == 1); // No calls until ref goes out of scope
274-
}
275-
REQUIRE(changed == 2);
276-
v.getRef() = getValue<TestType>();
277-
REQUIRE(changed == 3);
278-
{
279-
// Setting the
280-
auto ref = v.getRef();
281-
ref = getDefaultValue<TestType>();
282-
ref = getValue<TestType>();
283-
ref = getDefaultValue<TestType>();
284-
ref = getValue<TestType>();
285-
}
286-
REQUIRE(changed == 4);
287-
REQUIRE(compare(v.get(), getValue<TestType>()));
288-
if constexpr (requires { v.get().getX(); }) {
289-
v.getRef()->setX(55);
290-
REQUIRE(changed == 5);
291-
v.getRef()->getX();
292-
REQUIRE(changed == 6); // Still counts as an update
293-
std::as_const(v).getRef()->getX();
294-
REQUIRE(changed == 6); // no call
295-
v.getCRef()->getX();
296-
REQUIRE(changed == 6); // no call
269+
if constexpr (std::is_constructible_v<TestType, TestType const &>
270+
&& std::is_assignable_v<TestType, TestType>) {
271+
int changed = 0;
272+
Observer v;
273+
v.onChange([&](auto &&...) { changed++; });
274+
v.getRef() = getValue<TestType>();
275+
REQUIRE(changed == 1);
276+
{
277+
auto ref = v.getRef();
278+
ref = getDefaultValue<TestType>();
279+
REQUIRE(changed == 1); // No calls until ref goes out of scope
280+
}
281+
REQUIRE(changed == 2);
282+
v.getRef() = getValue<TestType>();
283+
REQUIRE(changed == 3);
284+
{
285+
// Setting the
286+
auto ref = v.getRef();
287+
ref = getDefaultValue<TestType>();
288+
ref = getValue<TestType>();
289+
ref = getDefaultValue<TestType>();
290+
ref = getValue<TestType>();
291+
}
292+
REQUIRE(changed == 4);
293+
REQUIRE(compare(v.get(), getValue<TestType>()));
294+
if constexpr (requires { v.get().getX(); }) {
295+
v.getRef()->setX(55);
296+
REQUIRE(changed == 5);
297+
v.getRef()->getX();
298+
REQUIRE(changed == 6); // Still counts as an update
299+
std::as_const(v).getRef()->getX();
300+
REQUIRE(changed == 6); // no call
301+
v.getCRef()->getX();
302+
REQUIRE(changed == 6); // no call
303+
}
297304
}
298305
}
299306
}
@@ -324,42 +331,50 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::Yes",
324331
value_ctor.onChange([&](auto &&...) { changed++; });
325332
Observer default_val;
326333
Observer similar_val {getSimilarValue<TestType>()};
327-
value_ctor = default_val;
334+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
335+
value_ctor = default_val;
336+
} else {
337+
value_ctor = std::move(default_val);
338+
}
328339
value_ctor = Observer {getValue<TestType>()};
329340
value_ctor = Observer {getValue<TestType>()};
330341
REQUIRE(changed == 2);
331342
}
332343
SECTION("getRef & Proxy") {
333-
int changed = 0;
334-
Observer v;
335-
v.onChange([&](auto &&...) { changed++; });
336-
v.getRef() = getValue<TestType>();
337-
REQUIRE(changed == 1);
338-
{
339-
auto ref = v.getRef();
340-
ref = getDefaultValue<TestType>();
341-
REQUIRE(changed == 1); // No calls until ref goes out of scope
342-
}
343-
REQUIRE(changed == 2);
344-
v.getRef() = getValue<TestType>();
345-
REQUIRE(changed == 3);
346-
{
347-
// Setting the
348-
auto ref = v.getRef();
349-
ref = getDefaultValue<TestType>();
350-
ref = getValue<TestType>();
351-
ref = getDefaultValue<TestType>();
352-
ref = getValue<TestType>();
353-
}
354-
REQUIRE(changed == 3); // no call
355-
REQUIRE(compare(v.get(), getValue<TestType>()));
356-
if constexpr (requires { v.get().getX(); }) {
357-
v.getRef()->setX(55);
358-
REQUIRE(changed == 4);
359-
std::as_const(v).getRef()->getX();
360-
REQUIRE(changed == 4); // no call
361-
v.getCRef()->getX();
362-
REQUIRE(changed == 4); // no call
344+
if constexpr (std::is_constructible_v<TestType, TestType const &>
345+
&& std::is_assignable_v<TestType, TestType>) {
346+
347+
int changed = 0;
348+
Observer v;
349+
v.onChange([&](auto &&...) { changed++; });
350+
v.getRef() = getValue<TestType>();
351+
REQUIRE(changed == 1);
352+
{
353+
auto ref = v.getRef();
354+
ref = getDefaultValue<TestType>();
355+
REQUIRE(changed == 1); // No calls until ref goes out of scope
356+
}
357+
REQUIRE(changed == 2);
358+
v.getRef() = getValue<TestType>();
359+
REQUIRE(changed == 3);
360+
{
361+
// Setting the
362+
auto ref = v.getRef();
363+
ref = getDefaultValue<TestType>();
364+
ref = getValue<TestType>();
365+
ref = getDefaultValue<TestType>();
366+
ref = getValue<TestType>();
367+
}
368+
REQUIRE(changed == 3); // no call
369+
REQUIRE(compare(v.get(), getValue<TestType>()));
370+
if constexpr (requires { v.get().getX(); }) {
371+
v.getRef()->setX(55);
372+
REQUIRE(changed == 4);
373+
std::as_const(v).getRef()->getX();
374+
REQUIRE(changed == 4); // no call
375+
v.getCRef()->getX();
376+
REQUIRE(changed == 4); // no call
377+
}
363378
}
364379
}
365380
}
@@ -400,53 +415,61 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::Yes",
400415
value_ctor.onChange([&](auto &&...) { changed++; });
401416
Observer default_val;
402417
Observer similar_val {getSimilarValue<TestType>()};
403-
value_ctor = default_val;
418+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
419+
value_ctor = default_val;
420+
} else {
421+
value_ctor = std::move(default_val);
422+
}
404423
value_ctor = std::move(similar_val);
405424
value_ctor = Observer {getValue<TestType>()};
406425
REQUIRE(changed == 2);
407426
}
408427
SECTION("getRef & Proxy") {
409-
int changed = 0;
410-
Observer v;
411-
v.onChange([&](auto &&...) { changed++; });
412-
v.getRef() = getValue<TestType>();
413-
REQUIRE(changed == 1);
414-
{
415-
auto ref = v.getRef();
416-
ref = getDefaultValue<TestType>();
417-
REQUIRE(changed == 1); // No calls until ref goes out of scope
418-
}
419-
REQUIRE(changed == 2);
420-
v.getRef() = getValue<TestType>();
421-
REQUIRE(changed == 3);
422-
{
423-
// Setting the
424-
auto ref = v.getRef();
425-
ref = getDefaultValue<TestType>();
426-
ref = getSimilarValue<TestType>();
427-
ref = getDefaultValue<TestType>();
428-
ref = getSimilarValue<TestType>();
429-
}
430-
REQUIRE(changed == 3); // no call
431-
REQUIRE(compare(v.get(), getSimilarValue<TestType>()));
432-
if constexpr (requires { v.get().getX(); }) {
433-
v.getRef()->setX(55);
434-
REQUIRE(changed == 4);
435-
std::as_const(v).getRef()->getX();
436-
REQUIRE(changed == 4); // no call
437-
v.getCRef()->getX();
438-
REQUIRE(changed == 4); // no call
428+
if constexpr (std::is_constructible_v<TestType, TestType const &>
429+
&& std::is_assignable_v<TestType, TestType>) {
430+
431+
int changed = 0;
432+
Observer v;
433+
v.onChange([&](auto &&...) { changed++; });
434+
v.getRef() = getValue<TestType>();
435+
REQUIRE(changed == 1);
436+
{
437+
auto ref = v.getRef();
438+
ref = getDefaultValue<TestType>();
439+
REQUIRE(changed == 1); // No calls until ref goes out of scope
440+
}
441+
REQUIRE(changed == 2);
442+
v.getRef() = getValue<TestType>();
443+
REQUIRE(changed == 3);
444+
{
445+
// Setting the
446+
auto ref = v.getRef();
447+
ref = getDefaultValue<TestType>();
448+
ref = getSimilarValue<TestType>();
449+
ref = getDefaultValue<TestType>();
450+
ref = getSimilarValue<TestType>();
451+
}
452+
REQUIRE(changed == 3); // no call
453+
REQUIRE(compare(v.get(), getSimilarValue<TestType>()));
454+
if constexpr (requires { v.get().getX(); }) {
455+
v.getRef()->setX(55);
456+
REQUIRE(changed == 4);
457+
std::as_const(v).getRef()->getX();
458+
REQUIRE(changed == 4); // no call
459+
v.getCRef()->getX();
460+
REQUIRE(changed == 4); // no call
461+
}
439462
}
440463
}
441464
}
442465
}
443466

444467
TEMPLATE_TEST_CASE("Change observer KeepOldCopy::No",
445468
"[change_observer]",
446-
// NoMove,//
447-
// NoCopy, //
448-
int, //
449-
Simple //
469+
NoMove, //
470+
NoCopy, //
471+
int, //
472+
Simple //
450473
) {
451474
SECTION("No compare") {
452475
using Observer = ut::ChangeObserver<TestType, ut::ChangeObserverKeepOldCopy::No, void>;
@@ -469,7 +492,11 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::No",
469492
value_ctor.onChange([&](auto &&...) { changed++; });
470493
Observer default_val;
471494
Observer similar_val {getSimilarValue<TestType>()};
472-
value_ctor = default_val;
495+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
496+
value_ctor = default_val;
497+
} else {
498+
value_ctor = std::move(default_val);
499+
}
473500
value_ctor = Observer {getValue<TestType>()};
474501
value_ctor = Observer {getValue<TestType>()};
475502
REQUIRE(changed == 3);
@@ -535,7 +562,11 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::No",
535562
value_ctor.onChange([&](auto &&...) { changed++; });
536563
Observer default_val;
537564
Observer similar_val {getSimilarValue<TestType>()};
538-
value_ctor = default_val;
565+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
566+
value_ctor = default_val;
567+
} else {
568+
value_ctor = std::move(default_val);
569+
}
539570
value_ctor = Observer {getValue<TestType>()};
540571
value_ctor = Observer {getValue<TestType>()};
541572
REQUIRE(changed == 2);
@@ -609,7 +640,11 @@ TEMPLATE_TEST_CASE("Change observer KeepOldCopy::No",
609640
value_ctor.onChange([&](auto &&...) { changed++; });
610641
Observer default_val;
611642
Observer similar_val {getSimilarValue<TestType>()};
612-
value_ctor = default_val;
643+
if constexpr (std::is_assignable_v<Observer, Observer const &>) {
644+
value_ctor = default_val;
645+
} else {
646+
value_ctor = std::move(default_val);
647+
}
613648
value_ctor = std::move(similar_val);
614649
value_ctor = Observer {getValue<TestType>()};
615650
REQUIRE(changed == 2);

0 commit comments

Comments
 (0)