@@ -225,10 +225,10 @@ std::string toString<NoCopy>(NoCopy const &v) {
225225
226226TEMPLATE_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
444467TEMPLATE_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