/ tests.cpp
tests.cpp
  1  // SPDX-FileCopyrightText: 2021 Jeff Epler
  2  //
  3  // SPDX-License-Identifier: GPL-3.0-only
  4  
  5  #ifndef ARDUINO
  6  
  7  #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
  8  #include <doctest/doctest.h>
  9  
 10  #include "decoder.h"
 11  
 12  circular_bit_array<6> cba;
 13  circular_symbol_array<6, 4> csa;
 14  
 15  TEST_CASE("test bit array") {
 16      for (int i = 0; i < 6; i++)
 17          cba.put(0);
 18  
 19      // The next puts need to read out six zeros
 20      for (int i = 0; i < 6; i++)
 21          CHECK(cba.put(1) == 0);
 22  
 23      // The next puts need to read out six ones
 24      for (int i = 0; i < 6; i++)
 25          CHECK(cba.put(1) == 1);
 26  
 27      cba.put(0);
 28      // content now 111110
 29  
 30      CHECK(cba.at(0) == 1);
 31      CHECK(cba.at(1) == 1);
 32      CHECK(cba.at(2) == 1);
 33      CHECK(cba.at(3) == 1);
 34      CHECK(cba.at(4) == 1);
 35      CHECK(cba.at(5) == 0);
 36  }
 37  
 38  TEST_CASE("test symbol array") {
 39      for (int i = 0; i < 6; i++)
 40          csa.put(0);
 41  
 42      // The next puts need to read out six zeros
 43      for (int i = 0; i < 6; i++)
 44          CHECK(csa.put(i) == 0);
 45  
 46      // The next puts need to read out the values above
 47      for (int i = 0; i < 6; i++)
 48          CHECK(csa.put(1) == i);
 49  
 50      csa.put(0);
 51      csa.put(1);
 52      csa.put(2);
 53      csa.put(3);
 54      csa.put(4);
 55      csa.put(5);
 56      // content now 012345
 57  
 58      CHECK(csa.at(0) == 0);
 59      CHECK(csa.at(1) == 1);
 60      CHECK(csa.at(2) == 2);
 61      CHECK(csa.at(3) == 3);
 62      CHECK(csa.at(4) == 4);
 63      CHECK(csa.at(5) == 5);
 64  }
 65  
 66  TEST_CASE("test leap second") {
 67      struct wwvb_time ww = {
 68          .yday = 366,
 69          .year = 16,
 70          .hour = 23,
 71          .minute = 59,
 72          .second = 59,
 73          .ls = 1,
 74          .ly = 1,
 75          .dst = 0,
 76          .dut1 = -4,
 77      };
 78  
 79      ww.advance_seconds();
 80      CHECK(ww.second == 60);
 81      CHECK(ww.ls);
 82      CHECK(ww.dut1 == -4);
 83  
 84      ww.advance_seconds();
 85      CHECK(ww.second == 0);
 86      CHECK(!ww.ls);
 87      CHECK(ww.dut1 == 6);
 88  }
 89  
 90  TEST_CASE("test dst next day") {
 91      struct wwvb_time ww = {
 92          .yday = 73,
 93          .year = 21,
 94          .hour = 23,
 95          .minute = 59,
 96          .second = 59,
 97          .ls = 1,
 98          .ly = 1,
 99          .dst = 2,
100      };
101  
102      ww.advance_seconds();
103      CHECK(ww.second == 0);
104      CHECK(ww.dst == 3);
105  }
106  
107  TEST_CASE("test std next day") {
108      struct wwvb_time ww = {
109          .yday = 311,
110          .year = 21,
111          .hour = 23,
112          .minute = 59,
113          .second = 59,
114          .ls = 1,
115          .ly = 1,
116          .dst = 1,
117      };
118  
119      ww.advance_seconds();
120      CHECK(ww.second == 0);
121      CHECK(ww.minute == 0);
122      CHECK(ww.hour == 0);
123      CHECK(ww.dst == 0);
124      CHECK(ww.yday == 312);
125      CHECK(ww.year == 21);
126  }
127  
128  TEST_CASE("test new year") {
129      struct wwvb_time ww = {
130          .yday = 365,
131          .year = 1,
132          .hour = 23,
133          .minute = 59,
134          .second = 59,
135          .ls = 0,
136          .ly = 0,
137          .dst = 0,
138      };
139      ww.advance_seconds();
140      CHECK(ww.second == 0);
141      CHECK(ww.minute == 0);
142      CHECK(ww.hour == 0);
143      CHECK(ww.year == 2);
144      CHECK(ww.yday == 1);
145  }
146  #endif