File indexing completed on 2025-10-12 04:59:55

0001 // bjgb_state.t.cpp                                                   -*-C++-*-
0002 #include <bjgb_state.h>
0003 
0004 #include <cstdlib>
0005 #include <cstring>
0006 #include <iostream>
0007 #include <sstream>
0008 
0009 // ============================================================================
0010 //                        STANDARD ASSERT TEST FUNCTION
0011 // ----------------------------------------------------------------------------
0012 
0013 namespace {
0014 
0015 int testStatus = 0;
0016 
0017 void aSsErT(bool condition, const char *message, int line)
0018 {
0019     if (condition) {
0020         std::cout << "Error " __FILE__ "(" << line << "): " << message << "    (failed)" << std::endl;
0021 
0022         if (0 <= testStatus && testStatus <= 100) {
0023             ++testStatus;
0024         }
0025     }
0026 }
0027 
0028 } // namespace
0029 
0030 // ============================================================================
0031 //                         STANDARD TEST DRIVER MACROS
0032 // ----------------------------------------------------------------------------
0033 
0034 #define ASSERT(X) aSsErT(!(X), #X, __LINE__);
0035 
0036 // ============================================================================
0037 //                        GLOBAL TYPEDEFS FOR TESTING
0038 // ----------------------------------------------------------------------------
0039 
0040 typedef bjgb::State::Enum Enum;
0041 typedef bjgb::State Util;
0042 
0043 // ============================================================================
0044 //                              MAIN PROGRAM
0045 // ----------------------------------------------------------------------------
0046 
0047 int main(int argc, char *argv[])
0048 {
0049     const int test = argc > 1 ? std::atoi(argv[1]) : 0;
0050     const bool verbose = argc > 2;
0051     const bool veryVerbose = argc > 3;
0052     const bool veryVeryVerbose = argc > 4;
0053     const bool veryVeryVeryVerbose = argc > 5;
0054 
0055     std::cout << "TEST " << __FILE__ << " CASE " << test << std::endl;
0056 
0057     switch (test) {
0058     case 0:
0059     case 1: {
0060         // --------------------------------------------------------------------
0061         // BREATHING TEST
0062         //
0063         // Concerns:
0064         //: 1 TBD
0065         //
0066         // Plan:
0067         //: 1 TBD
0068         //
0069         // Testing:
0070         //   BREATHING TEST
0071         // --------------------------------------------------------------------
0072 
0073         if (verbose)
0074             std::cout << std::endl << "BREATHING TEST" << std::endl << "==============" << std::endl;
0075 
0076         // starting from 0, the enumerators are sequential in value
0077         {
0078             int value = 0;
0079 
0080             ASSERT(value++ == Util::e_S01);
0081             ASSERT(value++ == Util::e_S02);
0082             ASSERT(value++ == Util::e_S03);
0083             ASSERT(value++ == Util::e_S04);
0084             ASSERT(value++ == Util::e_S05);
0085             ASSERT(value++ == Util::e_S06);
0086             ASSERT(value++ == Util::e_S07);
0087             ASSERT(value++ == Util::e_S08);
0088             ASSERT(value++ == Util::e_S09);
0089             ASSERT(value++ == Util::e_S10);
0090             ASSERT(value++ == Util::e_S11);
0091             ASSERT(value++ == Util::e_SBJ);
0092             ASSERT(value++ == Util::e_HZR);
0093             ASSERT(value++ == Util::e_S_A);
0094             ASSERT(value++ == Util::e_H_2);
0095             ASSERT(value++ == Util::e_H_3);
0096             ASSERT(value++ == Util::e_H_4);
0097             ASSERT(value++ == Util::e_H_5);
0098             ASSERT(value++ == Util::e_H_6);
0099             ASSERT(value++ == Util::e_H_7);
0100             ASSERT(value++ == Util::e_H_8);
0101             ASSERT(value++ == Util::e_H_9);
0102             ASSERT(value++ == Util::e_H_T);
0103             ASSERT(value++ == Util::e_H02);
0104             ASSERT(value++ == Util::e_H03);
0105             ASSERT(value++ == Util::e_H04);
0106             ASSERT(value++ == Util::e_H05);
0107             ASSERT(value++ == Util::e_H06);
0108             ASSERT(value++ == Util::e_H07);
0109             ASSERT(value++ == Util::e_H08);
0110             ASSERT(value++ == Util::e_H09);
0111             ASSERT(value++ == Util::e_H10);
0112             ASSERT(value++ == Util::e_H11);
0113             ASSERT(value++ == Util::e_H12);
0114             ASSERT(value++ == Util::e_H13);
0115             ASSERT(value++ == Util::e_H14);
0116             ASSERT(value++ == Util::e_H15);
0117             ASSERT(value++ == Util::e_H16);
0118             ASSERT(value++ == Util::e_H17);
0119             ASSERT(value++ == Util::e_H18);
0120             ASSERT(value++ == Util::e_H19);
0121             ASSERT(value++ == Util::e_H20);
0122             ASSERT(value++ == Util::e_H21);
0123             ASSERT(value++ == Util::e_HOV);
0124             ASSERT(value++ == Util::e_PAA);
0125             ASSERT(value++ == Util::e_P22);
0126             ASSERT(value++ == Util::e_P33);
0127             ASSERT(value++ == Util::e_P44);
0128             ASSERT(value++ == Util::e_P55);
0129             ASSERT(value++ == Util::e_P66);
0130             ASSERT(value++ == Util::e_P77);
0131             ASSERT(value++ == Util::e_P88);
0132             ASSERT(value++ == Util::e_P99);
0133             ASSERT(value++ == Util::e_PTT);
0134 
0135             ASSERT(value == Util::k_NUM_STATES);
0136         }
0137 
0138         // sanity check limits of 'hard', 'soft', 'pair', 'unus'
0139         {
0140             ASSERT(Util::e_H02 == Util::hard(2));
0141             ASSERT(Util::e_H21 == Util::hard(21));
0142 
0143             ASSERT(Util::e_S01 == Util::soft(1));
0144             ASSERT(Util::e_S11 == Util::soft(11));
0145 
0146             ASSERT(Util::e_PAA == Util::pair(1));
0147             ASSERT(Util::e_PTT == Util::pair(10));
0148 
0149             ASSERT(Util::e_S_A == Util::unus(1));
0150             ASSERT(Util::e_H_T == Util::unus(10));
0151         }
0152 
0153         // values returned by 'stateId2String' are unique
0154         {
0155             for (int i = 0; i < Util::k_NUM_STATES; ++i) {
0156                 for (int j = 0; j < Util::k_NUM_STATES; ++j) {
0157                     const bool isSame = 0 == std::strcmp(Util::stateId2String(i), Util::stateId2String(j));
0158                     ASSERT((i == j) == isSame);
0159                 }
0160             }
0161         }
0162 
0163     } break;
0164     default: {
0165         std::cerr << "WARNING: CASE `" << test << "' NOT FOUND." << std::endl;
0166         testStatus = -1;
0167     }
0168     }
0169 
0170     if (testStatus > 0) {
0171         std::cerr << "Error, non-zero test status = " << testStatus << "." << std::endl;
0172     }
0173 
0174     return testStatus;
0175 }