@@ -939,3 +939,44 @@ TEST_CASE(from_f64_seconds)
939939
940940 EXPECT_DEATH (" Converting float NaN seconds" , (void )Duration::from_seconds_f64 (NAN));
941941}
942+
943+ TEST_CASE (time_units)
944+ {
945+ EXPECT_EQ (Duration::from_time_units (1 , 1 , 1 ), Duration::from_seconds (1 ));
946+ EXPECT_EQ (Duration::from_time_units (-312 , 1 , 48'000 ), Duration::from_microseconds (-6'500 ));
947+ EXPECT_EQ (Duration::from_time_units (960 , 1 , 48'000 ), Duration::from_microseconds (20'000 ));
948+ EXPECT_EQ (Duration::from_time_units (960 , 1 , 48'000 ), Duration::from_microseconds (20'000 ));
949+ EXPECT_EQ (Duration::from_time_units (8 , 4 , 1 ), Duration::from_seconds (32 ));
950+ EXPECT_EQ (Duration::from_time_units (3 , 3 , 2'000'000'000 ), Duration::from_nanoseconds (5 ));
951+ EXPECT_EQ (Duration::from_time_units (4 , 3 , 2'000'000'000 ), Duration::from_nanoseconds (6 ));
952+ EXPECT_EQ (Duration::from_time_units (999'999'998 , 1 , 2'000'000'000 ), Duration::from_nanoseconds (499'999'999 ));
953+ EXPECT_EQ (Duration::from_time_units (999'999'999 , 1 , 2'000'000'000 ), Duration::from_nanoseconds (500'000'000 ));
954+ EXPECT_EQ (Duration::from_time_units (1'000'000'000 , 1 , 2'000'000'000 ), Duration::from_nanoseconds (500'000'000 ));
955+
956+ EXPECT_EQ (Duration::from_time_units (NumericLimits<i64 >::max (), 1 , 2 ), Duration::from_seconds (NumericLimits<i64 >::max () / 2 ) + Duration::from_milliseconds (500 ));
957+ EXPECT_EQ (Duration::from_time_units ((NumericLimits<i64 >::max () / 2 ), 2 , 1 ), Duration::from_seconds (NumericLimits<i64 >::max () - 1 ));
958+ EXPECT_EQ (Duration::from_time_units ((NumericLimits<i64 >::max () / 2 ) + 1 , 2 , 1 ), Duration::from_seconds (NumericLimits<i64 >::max ()));
959+ EXPECT_EQ (Duration::from_time_units ((NumericLimits<i64 >::min () / 2 ), 2 , 1 ), Duration::from_seconds (NumericLimits<i64 >::min ()));
960+ EXPECT_EQ (Duration::from_time_units ((NumericLimits<i64 >::min () / 2 ) - 1 , 2 , 1 ), Duration::from_seconds (NumericLimits<i64 >::min ()));
961+
962+ EXPECT_EQ (Duration::from_milliseconds (999 ).to_time_units (1 , 48'000 ), 47'952 );
963+ EXPECT_EQ (Duration::from_milliseconds (-12'500 ).to_time_units (1 , 1'000 ), -12'500 );
964+ EXPECT_EQ (Duration::from_milliseconds (-12'500 ).to_time_units (1 , 1'000 ), -12'500 );
965+
966+ EXPECT_EQ (Duration::from_nanoseconds (154'489'696 ).to_time_units (1 , 48'000 ), 7'416 );
967+ EXPECT_EQ (Duration::from_nanoseconds (154'489'375 ).to_time_units (1 , 48'000 ), 7'415 );
968+ EXPECT_EQ (Duration::from_nanoseconds (-154'489'696 ).to_time_units (1 , 48'000 ), -7'416 );
969+ EXPECT_EQ (Duration::from_nanoseconds (-154'489'375 ).to_time_units (1 , 48'000 ), -7'415 );
970+ EXPECT_EQ (Duration::from_nanoseconds (1'900'000'000 ).to_time_units (3 , 2 ), 1 );
971+ EXPECT_EQ (Duration::from_nanoseconds (1'800'000'000 ).to_time_units (3 , 1 ), 1 );
972+ EXPECT_EQ (Duration::from_seconds (3 ).to_time_units (4 , 1 ), 1 );
973+ EXPECT_EQ (Duration::from_seconds (4 ).to_time_units (4 , 1 ), 1 );
974+ EXPECT_EQ (Duration::from_seconds (5 ).to_time_units (4 , 1 ), 1 );
975+ EXPECT_EQ (Duration::from_seconds (6 ).to_time_units (4 , 1 ), 2 );
976+
977+ EXPECT_EQ (Duration::from_seconds (2'147'483'649 ).to_time_units (1 , NumericLimits<u32 >::max ()), NumericLimits<i64 >::max ());
978+ EXPECT_EQ (Duration::from_seconds (2'147'483'648 ).to_time_units (1 , NumericLimits<u32 >::max ()), NumericLimits<i64 >::max () - (NumericLimits<u32 >::max () / 2 ));
979+
980+ EXPECT_DEATH (" From time units with zero numerator" , (void )Duration::from_time_units (1 , 0 , 1 ));
981+ EXPECT_DEATH (" From time units with zero denominator" , (void )Duration::from_time_units (1 , 1 , 0 ));
982+ }
0 commit comments