@@ -380,3 +380,194 @@ TEST(OperationsTest,
380380 EXPECT_EQ (add_result.error (), policy::error::kind::overflow);
381381 EXPECT_EQ (value.load (), static_cast <std::int16_t >(32000 ));
382382}
383+
384+ TEST (OperationsTest, LessThanReturnsCorrectResultForIntegers) {
385+ using namespace mcpplibs ::primitives::operators;
386+ using value_t =
387+ primitive<int , policy::value::checked, policy::error::expected>;
388+
389+ auto const less_result = operations::less_than (value_t {3 }, value_t {7 });
390+ auto const greater_result = operations::less_than (value_t {9 }, value_t {1 });
391+ auto const equal_result = operations::less_than (value_t {5 }, value_t {5 });
392+
393+ ASSERT_TRUE (less_result.has_value ());
394+ ASSERT_TRUE (greater_result.has_value ());
395+ ASSERT_TRUE (equal_result.has_value ());
396+ EXPECT_EQ (less_result->value (), 1 );
397+ EXPECT_EQ (greater_result->value (), 0 );
398+ EXPECT_EQ (equal_result->value (), 0 );
399+ }
400+
401+ TEST (OperationsTest, GreaterThanReturnsCorrectResultForIntegers) {
402+ using namespace mcpplibs ::primitives::operators;
403+ using value_t =
404+ primitive<int , policy::value::checked, policy::error::expected>;
405+
406+ auto const less_result = operations::greater_than (value_t {3 }, value_t {7 });
407+ auto const greater_result = operations::greater_than (value_t {9 }, value_t {1 });
408+ auto const equal_result = operations::greater_than (value_t {5 }, value_t {5 });
409+
410+ ASSERT_TRUE (less_result.has_value ());
411+ ASSERT_TRUE (greater_result.has_value ());
412+ ASSERT_TRUE (equal_result.has_value ());
413+ EXPECT_EQ (less_result->value (), 0 );
414+ EXPECT_EQ (greater_result->value (), 1 );
415+ EXPECT_EQ (equal_result->value (), 0 );
416+ }
417+
418+ TEST (OperationsTest, LessThanOrEqualReturnsCorrectResultForIntegers) {
419+ using namespace mcpplibs ::primitives::operators;
420+ using value_t =
421+ primitive<int , policy::value::checked, policy::error::expected>;
422+
423+ auto const less_result = operations::less_than_or_equal (value_t {3 }, value_t {7 });
424+ auto const greater_result = operations::less_than_or_equal (value_t {9 }, value_t {1 });
425+ auto const equal_result = operations::less_than_or_equal (value_t {5 }, value_t {5 });
426+
427+ ASSERT_TRUE (less_result.has_value ());
428+ ASSERT_TRUE (greater_result.has_value ());
429+ ASSERT_TRUE (equal_result.has_value ());
430+ EXPECT_EQ (less_result->value (), 1 );
431+ EXPECT_EQ (greater_result->value (), 0 );
432+ EXPECT_EQ (equal_result->value (), 1 );
433+ }
434+
435+ TEST (OperationsTest, GreaterThanOrEqualReturnsCorrectResultForIntegers) {
436+ using namespace mcpplibs ::primitives::operators;
437+ using value_t =
438+ primitive<int , policy::value::checked, policy::error::expected>;
439+
440+ auto const less_result = operations::greater_than_or_equal (value_t {3 }, value_t {7 });
441+ auto const greater_result = operations::greater_than_or_equal (value_t {9 }, value_t {1 });
442+ auto const equal_result = operations::greater_than_or_equal (value_t {5 }, value_t {5 });
443+
444+ ASSERT_TRUE (less_result.has_value ());
445+ ASSERT_TRUE (greater_result.has_value ());
446+ ASSERT_TRUE (equal_result.has_value ());
447+ EXPECT_EQ (less_result->value (), 0 );
448+ EXPECT_EQ (greater_result->value (), 1 );
449+ EXPECT_EQ (equal_result->value (), 1 );
450+ }
451+
452+ TEST (OperationsTest, OperatorLessThanDelegatesToDispatcher) {
453+ using namespace mcpplibs ::primitives::operators;
454+ using value_t =
455+ primitive<int , policy::value::checked, policy::error::expected>;
456+
457+ auto const result = (value_t {3 } < value_t {7 });
458+
459+ ASSERT_TRUE (result.has_value ());
460+ EXPECT_EQ (result->value (), 1 );
461+ }
462+
463+ TEST (OperationsTest, OperatorGreaterThanDelegatesToDispatcher) {
464+ using namespace mcpplibs ::primitives::operators;
465+ using value_t =
466+ primitive<int , policy::value::checked, policy::error::expected>;
467+
468+ auto const result = (value_t {9 } > value_t {1 });
469+
470+ ASSERT_TRUE (result.has_value ());
471+ EXPECT_EQ (result->value (), 1 );
472+ }
473+
474+ TEST (OperationsTest, OperatorLessThanOrEqualDelegatesToDispatcher) {
475+ using namespace mcpplibs ::primitives::operators;
476+ using value_t =
477+ primitive<int , policy::value::checked, policy::error::expected>;
478+
479+ auto const less_result = (value_t {3 } <= value_t {7 });
480+ auto const equal_result = (value_t {5 } <= value_t {5 });
481+
482+ ASSERT_TRUE (less_result.has_value ());
483+ ASSERT_TRUE (equal_result.has_value ());
484+ EXPECT_EQ (less_result->value (), 1 );
485+ EXPECT_EQ (equal_result->value (), 1 );
486+ }
487+
488+ TEST (OperationsTest, OperatorGreaterThanOrEqualDelegatesToDispatcher) {
489+ using namespace mcpplibs ::primitives::operators;
490+ using value_t =
491+ primitive<int , policy::value::checked, policy::error::expected>;
492+
493+ auto const greater_result = (value_t {9 } >= value_t {1 });
494+ auto const equal_result = (value_t {5 } >= value_t {5 });
495+
496+ ASSERT_TRUE (greater_result.has_value ());
497+ ASSERT_TRUE (equal_result.has_value ());
498+ EXPECT_EQ (greater_result->value (), 1 );
499+ EXPECT_EQ (equal_result->value (), 1 );
500+ }
501+
502+ TEST (OperationsTest, FourWayComparisonOperatorsWorkTogether) {
503+ using namespace mcpplibs ::primitives::operators;
504+ using value_t =
505+ primitive<int , policy::value::checked, policy::error::expected>;
506+
507+ auto const a = value_t {10 };
508+ auto const b = value_t {20 };
509+ auto const c = value_t {10 };
510+
511+ auto const a_lt_b = (a < b);
512+ auto const a_gt_b = (a > b);
513+ auto const a_le_b = (a <= b);
514+ auto const a_ge_b = (a >= b);
515+ auto const a_lt_c = (a < c);
516+ auto const a_le_c = (a <= c);
517+ auto const a_ge_c = (a >= c);
518+ auto const a_gt_c = (a > c);
519+
520+ ASSERT_TRUE (a_lt_b.has_value ());
521+ ASSERT_TRUE (a_gt_b.has_value ());
522+ ASSERT_TRUE (a_le_b.has_value ());
523+ ASSERT_TRUE (a_ge_b.has_value ());
524+ ASSERT_TRUE (a_lt_c.has_value ());
525+ ASSERT_TRUE (a_le_c.has_value ());
526+ ASSERT_TRUE (a_ge_c.has_value ());
527+ ASSERT_TRUE (a_gt_c.has_value ());
528+
529+ EXPECT_EQ (a_lt_b->value (), 1 );
530+ EXPECT_EQ (a_gt_b->value (), 0 );
531+ EXPECT_EQ (a_le_b->value (), 1 );
532+ EXPECT_EQ (a_ge_b->value (), 0 );
533+ EXPECT_EQ (a_lt_c->value (), 0 );
534+ EXPECT_EQ (a_le_c->value (), 1 );
535+ EXPECT_EQ (a_ge_c->value (), 1 );
536+ EXPECT_EQ (a_gt_c->value (), 0 );
537+ }
538+
539+ TEST (OperationsTest, ComparisonOperatorsWorkWithMixedTypes) {
540+ using namespace mcpplibs ::primitives::operators;
541+ using value_t = primitive<int , policy::value::checked, policy::error::expected,
542+ policy::type::compatible>;
543+
544+ auto const lhs = value_t {10 };
545+ short const rhs = 20 ;
546+
547+ auto const lt_lr = lhs < rhs;
548+ auto const lt_rl = rhs < lhs;
549+ auto const gt_lr = lhs > rhs;
550+ auto const gt_rl = rhs > lhs;
551+ auto const le_lr = lhs <= rhs;
552+ auto const le_rl = rhs <= lhs;
553+ auto const ge_lr = lhs >= rhs;
554+ auto const ge_rl = rhs >= lhs;
555+
556+ ASSERT_TRUE (lt_lr.has_value ());
557+ ASSERT_TRUE (lt_rl.has_value ());
558+ ASSERT_TRUE (gt_lr.has_value ());
559+ ASSERT_TRUE (gt_rl.has_value ());
560+ ASSERT_TRUE (le_lr.has_value ());
561+ ASSERT_TRUE (le_rl.has_value ());
562+ ASSERT_TRUE (ge_lr.has_value ());
563+ ASSERT_TRUE (ge_rl.has_value ());
564+
565+ EXPECT_EQ (lt_lr->value (), 1 );
566+ EXPECT_EQ (lt_rl->value (), 0 );
567+ EXPECT_EQ (gt_lr->value (), 0 );
568+ EXPECT_EQ (gt_rl->value (), 1 );
569+ EXPECT_EQ (le_lr->value (), 1 );
570+ EXPECT_EQ (le_rl->value (), 0 );
571+ EXPECT_EQ (ge_lr->value (), 0 );
572+ EXPECT_EQ (ge_rl->value (), 1 );
573+ }
0 commit comments