LCOV - code coverage report
Current view: top level - test - day-delta-test.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 232 232 100.0 %
Date: 2017-04-30 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Present - Date/Time Library
       3             :  *
       4             :  * Tests for the DayDelta C++ class and C-compatible methods
       5             :  *
       6             :  * Licensed under the MIT License.
       7             :  * For details, see LICENSE.
       8             :  */
       9             : 
      10             : #include "catch.hpp"
      11             : #include "test-utils.hpp"
      12             : 
      13             : #include "present.h"
      14             : 
      15             : /**
      16             :  * Shortcut macro to compare the number of days.
      17             :  * Expects that the delta is called "d".
      18             :  */
      19             : #define IS(test_delta_days)                         \
      20             :     CHECK(d.data_.delta_days == test_delta_days);
      21             : 
      22             : 
      23             : /**
      24             :  * This test case tests all of the "from_" methods (which also tests the C
      25             :  * "DayDelta_from_..." methods).
      26             :  */
      27           4 : TEST_CASE("DayDelta creators", "[day-delta]") {
      28             :     DayDelta d;
      29             : 
      30           3 :     SECTION("creating from a number of days") {
      31           1 :         d = DayDelta::from_days(1);
      32           1 :         IS(1);
      33           1 :         d = DayDelta::from_days(-1);
      34           1 :         IS(-1);
      35           1 :         d = DayDelta::from_days(0);
      36           1 :         IS(0);
      37           1 :         d = DayDelta::from_days(2147483647);
      38           1 :         IS(2147483647);
      39           1 :         d = DayDelta::from_days(-2147483647);
      40           1 :         IS(-2147483647);
      41             : 
      42           1 :         d = DayDelta_from_days(13);
      43           1 :         IS(13);
      44             : 
      45           1 :         DayDelta_ptr_from_days(&d, -11);
      46           1 :         IS(-11);
      47           3 :     }
      48             : 
      49           3 :     SECTION("creating from a number of weeks") {
      50           1 :         d = DayDelta::from_weeks(1);
      51           1 :         IS(7);
      52           1 :         d = DayDelta::from_weeks(5);
      53           1 :         IS(35);
      54           1 :         d = DayDelta::from_weeks(-1);
      55           1 :         IS(-7);
      56           1 :         d = DayDelta::from_weeks(-11);
      57           1 :         IS(-77);
      58           1 :         d = DayDelta::from_weeks(0);
      59           1 :         IS(0);
      60           1 :         d = DayDelta::from_weeks(306783378);
      61           1 :         IS(2147483646);
      62           1 :         d = DayDelta::from_weeks(-306783378);
      63           1 :         IS(-2147483646);
      64             : 
      65           1 :         d = DayDelta_from_weeks(7);
      66           1 :         IS(49);
      67             : 
      68           1 :         DayDelta_ptr_from_weeks(&d, -9);
      69           1 :         IS(-63);
      70           3 :     }
      71             : 
      72           3 :     SECTION("creating with 0 days") {
      73           1 :         d = DayDelta::zero();
      74           1 :         IS(0);
      75             : 
      76           1 :         d = DayDelta_zero();
      77           1 :         IS(0);
      78             : 
      79           1 :         DayDelta_ptr_zero(&d);
      80           1 :         IS(0);
      81           3 :     }
      82           3 : }
      83             : 
      84           2 : TEST_CASE("DayDelta accessors", "[day-delta]") {
      85           1 :     DayDelta d1 = DayDelta::from_days(5),
      86           1 :              d2 = DayDelta::from_days(7),
      87           1 :              d3 = DayDelta::from_days(-14),
      88           1 :              d4 = DayDelta::from_days(-20),
      89           1 :              d5 = DayDelta::zero();
      90             : 
      91           1 :     CHECK(d1.days() == 5);
      92           1 :     CHECK(d2.days() == 7);
      93           1 :     CHECK(d3.days() == -14);
      94           1 :     CHECK(d4.days() == -20);
      95           1 :     CHECK(d5.days() == 0);
      96             : 
      97           1 :     CHECK(d1.weeks() == 0);
      98           1 :     CHECK(d2.weeks() == 1);
      99           1 :     CHECK(d3.weeks() == -2);
     100           1 :     CHECK(d4.weeks() == -2);
     101           1 :     CHECK(d5.weeks() == 0);
     102             : 
     103           1 :     CHECK(d1.weeks_decimal() == 0.7142857142857143);
     104           1 :     CHECK(d2.weeks_decimal() == 1.0);
     105           1 :     CHECK(d3.weeks_decimal() == -2.0);
     106           1 :     CHECK(d4.weeks_decimal() == -2.857142857142857);
     107           1 :     CHECK(d5.weeks_decimal() == 0.0);
     108             : 
     109           1 :     CHECK(d1.to_TimeDelta() == TimeDelta::from_days(5));
     110           1 :     CHECK(d2.to_TimeDelta() == TimeDelta::from_days(7));
     111           1 :     CHECK(d3.to_TimeDelta() == TimeDelta::from_days(-14));
     112           1 :     CHECK(d4.to_TimeDelta() == TimeDelta::from_days(-20));
     113           1 :     CHECK(d5.to_TimeDelta() == TimeDelta::from_days(0));
     114           1 : }
     115             : 
     116           7 : TEST_CASE("DayDelta arithmetic operators", "[day-delta]") {
     117           6 :     DayDelta d1 = DayDelta::from_days(8),
     118           6 :              d2 = DayDelta::from_days(-21),
     119           6 :              d3 = DayDelta::zero();
     120             : 
     121           6 :     SECTION("is_negative()") {
     122           1 :         CHECK(!d1.is_negative());
     123           1 :         CHECK(d2.is_negative());
     124           1 :         CHECK(!d3.is_negative());
     125           6 :     }
     126             : 
     127           6 :     SECTION("negate()") {
     128           1 :         d1.negate();
     129           1 :         CHECK(d1.days() == -8);
     130           1 :         CHECK(d1.weeks() == -1);
     131           1 :         d1.negate();
     132           1 :         CHECK(d1.days() == 8);
     133           1 :         CHECK(d1.weeks() == 1);
     134             : 
     135           1 :         d2.negate();
     136           1 :         CHECK(d2.days() == 21);
     137           1 :         CHECK(d2.weeks() == 3);
     138           1 :         d2.negate();
     139           1 :         CHECK(d2.days() == -21);
     140           1 :         CHECK(d2.weeks() == -3);
     141             : 
     142           1 :         d3.negate();
     143           1 :         CHECK(!d3.is_negative());
     144           1 :         d3.negate();
     145           1 :         CHECK(!d3.is_negative());
     146           6 :     }
     147             : 
     148           6 :     SECTION("operator-") {
     149             :         DayDelta d;
     150             : 
     151           1 :         d = -d1;
     152           1 :         IS(-8);
     153           1 :         d = -d2;
     154           1 :         IS(21);
     155           1 :         d = -d3;
     156           1 :         IS(0);
     157           6 :     }
     158             : 
     159           6 :     SECTION("operator++ / operator--") {
     160             :         DayDelta d;
     161             : 
     162           1 :         d = DayDelta::from_days(5);
     163           1 :         IS(5);
     164           1 :         CHECK((d++).days() == 5);
     165           1 :         IS(6);
     166           1 :         CHECK((++d).days() == 7);
     167           1 :         IS(7);
     168           1 :         CHECK((d--).days() == 7);
     169           1 :         IS(6);
     170           1 :         CHECK((--d).days() == 5);
     171           1 :         IS(5);
     172           6 :     }
     173             : 
     174           6 :     SECTION("scaling") {
     175             :         DayDelta d;
     176             : 
     177           1 :         d = DayDelta::from_days(5);
     178           1 :         IS(5);
     179           1 :         d *= 6;
     180           1 :         IS(30);
     181           1 :         d /= 10;
     182           1 :         IS(3);
     183             : 
     184           1 :         d = DayDelta::from_days(-10);
     185           1 :         IS(-10);
     186           1 :         d *= 6;
     187           1 :         IS(-60);
     188           1 :         d /= 25;
     189           1 :         IS(-2);
     190             : 
     191           1 :         d = DayDelta::from_days(9);
     192           1 :         IS(9);
     193           1 :         CHECK((d * 3).days() == 27);
     194           1 :         IS(9);
     195           1 :         CHECK((d * -5).days() == -45);
     196           1 :         IS(9);
     197           1 :         CHECK((d / 4).days() == 2);
     198           1 :         IS(9);
     199           1 :         CHECK((d / -3).days() == -3);
     200           1 :         IS(9);
     201             : 
     202           1 :         d = DayDelta::from_days(-43);
     203           1 :         IS(-43);
     204           1 :         CHECK((d * 2).days() == -86);
     205           1 :         IS(-43);
     206           1 :         CHECK((d * -4).days() == 172);
     207           1 :         IS(-43);
     208           1 :         CHECK((d / 6).days() == -7);
     209           1 :         IS(-43);
     210           1 :         CHECK((d / -7).days() == 6);
     211           1 :         IS(-43);
     212           6 :     }
     213             : 
     214           6 :     SECTION("addition / subtraction") {
     215             :         DayDelta d;
     216             : 
     217           1 :         d = DayDelta::from_days(5);
     218           1 :         IS(5);
     219           1 :         d += DayDelta::from_days(8);
     220           1 :         IS(13);
     221           1 :         d += DayDelta::from_days(-4);
     222           1 :         IS(9);
     223           1 :         d -= DayDelta::from_days(12);
     224           1 :         IS(-3);
     225           1 :         d -= DayDelta::from_days(-5);
     226           1 :         IS(2);
     227             : 
     228           1 :         d = DayDelta::from_days(-13);
     229           1 :         IS(-13);
     230           1 :         CHECK((d + DayDelta::from_days(4)).days() == -9);
     231           1 :         IS(-13);
     232           1 :         CHECK((d + DayDelta::from_days(-7)).days() == -20);
     233           1 :         IS(-13);
     234           1 :         CHECK((d - DayDelta::from_days(8)).days() == -21);
     235           1 :         IS(-13);
     236           1 :         CHECK((d - DayDelta::from_days(-34)).days() == 21);
     237           1 :         IS(-13);
     238           6 :     }
     239           6 : }
     240             : 
     241           2 : TEST_CASE("DayDelta comparison operators", "[day-delta]") {
     242           1 :     DayDelta d1 = DayDelta::from_days(19),
     243           1 :              d2 = DayDelta::from_days(21),
     244           1 :              d3 = DayDelta::from_days(-13),
     245           1 :              d4 = DayDelta::from_days(-13),
     246           1 :              d5 = DayDelta::zero();
     247             : 
     248           1 :     TimeDelta td1 = TimeDelta::from_days(19),
     249           1 :               td2 = TimeDelta::from_days(21),
     250           1 :               td3 = TimeDelta::from_days(-13),
     251           1 :               td4 = TimeDelta::from_days(-13),
     252           1 :               td5 = TimeDelta::zero();
     253             : 
     254           1 :     CHECK(DayDelta::compare(d1, d2) < 0);
     255           1 :     CHECK(DayDelta::compare(d1, d3) > 0);
     256           1 :     CHECK(DayDelta::compare(d1, d5) > 0);
     257           1 :     CHECK(DayDelta::compare(d3, d4) == 0);
     258           1 :     CHECK(DayDelta::compare(d4, d3) == 0);
     259           1 :     CHECK(DayDelta::compare(d5, d5) == 0);
     260             : 
     261           1 :     CHECK(DayDelta::compare(d1, td2) < 0);
     262           1 :     CHECK(DayDelta::compare(d1, td3) > 0);
     263           1 :     CHECK(DayDelta::compare(d1, td5) > 0);
     264           1 :     CHECK(DayDelta::compare(d3, td4) == 0);
     265           1 :     CHECK(DayDelta::compare(d4, td3) == 0);
     266           1 :     CHECK(DayDelta::compare(d5, td5) == 0);
     267             : 
     268           1 :     CHECK(DayDelta::compare(td1, d2) < 0);
     269           1 :     CHECK(DayDelta::compare(td1, d3) > 0);
     270           1 :     CHECK(DayDelta::compare(td1, d5) > 0);
     271           1 :     CHECK(DayDelta::compare(td3, d4) == 0);
     272           1 :     CHECK(DayDelta::compare(td4, d3) == 0);
     273           1 :     CHECK(DayDelta::compare(td5, d5) == 0);
     274             : 
     275           1 :     CHECK(d3 == d4);        CHECK(d3 == td4);
     276           1 :     CHECK(d4 == d3);        CHECK(d4 == td3);
     277           1 :     CHECK(!(d1 == d2));     CHECK(!(d1 == td2));
     278           1 :     CHECK(!(d1 == d5));     CHECK(!(d1 == td5));
     279           1 :     CHECK(d1 != d2);        CHECK(d1 != td2);
     280           1 :     CHECK(d5 != d1);        CHECK(d5 != td1);
     281             : 
     282           1 :     CHECK(d1 < d2);         CHECK(d1 < td2);
     283           1 :     CHECK(d3 < d1);         CHECK(d3 < td1);
     284           1 :     CHECK(!(d5 < d4));      CHECK(!(d5 < td4));
     285           1 :     CHECK(!(d3 < d4));      CHECK(!(d3 < td4));
     286             : 
     287           1 :     CHECK(d1 <= d2);        CHECK(d1 <= td2);
     288           1 :     CHECK(d3 <= d2);        CHECK(d3 <= td2);
     289           1 :     CHECK(!(d5 <= d4));     CHECK(!(d5 <= td4));
     290           1 :     CHECK(d3 <= d4);        CHECK(d3 <= td4);
     291             : 
     292           1 :     CHECK(d1 > d3);         CHECK(d1 > td3);
     293           1 :     CHECK(d2 > d1);         CHECK(d2 > td1);
     294           1 :     CHECK(d5 > d3);         CHECK(d5 > td3);
     295           1 :     CHECK(!(d3 > d4));      CHECK(!(d3 > td4));
     296           1 :     CHECK(!(d3 > d2));      CHECK(!(d3 > td2));
     297           1 :     CHECK(!(d1 > d2));      CHECK(!(d1 > td2));
     298             : 
     299           1 :     CHECK(d1 >= d3);        CHECK(d1 >= td3);
     300           1 :     CHECK(d2 >= d1);        CHECK(d2 >= td1);
     301           1 :     CHECK(d5 >= d3);        CHECK(d5 >= td3);
     302           1 :     CHECK(d3 >= d4);        CHECK(d3 >= td4);
     303           1 :     CHECK(!(d5 >= d2));     CHECK(!(d5 >= td2));
     304           4 : }
     305             : 

Generated by: LCOV version 1.10