Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/UnitTest/CmdLine/CmdLine.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief UnitTest's command line
9 : : \details This file defines the heterogeneous stack that is used for storing
10 : : the data from user input during the command-line parsing of the unit test
11 : : suite, UnitTest.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef UnitTestCmdLine_h
15 : : #define UnitTestCmdLine_h
16 : :
17 : : #include <string>
18 : :
19 : : #include <brigand/algorithms/for_each.hpp>
20 : :
21 : : #include "Macro.hpp"
22 : : #include "WalkerConfig.hpp"
23 : : #include "TaggedTuple.hpp"
24 : : #include "HelpFactory.hpp"
25 : : #include "Keywords.hpp"
26 : : #include "UnitTest/Types.hpp"
27 : : #include "PrintUtil.hpp"
28 : :
29 : : namespace unittest {
30 : : //! UnitTest control facilitating user input to internal data transfer
31 : : namespace ctr {
32 : :
33 : : //! Member data for tagged tuple
34 : : using CmdLineMembers = brigand::list<
35 : : tag::io, ios
36 : : , tag::verbose, bool
37 : : , tag::chare, bool
38 : : , tag::help, bool
39 : : , tag::quiescence, bool
40 : : , tag::trace, bool
41 : : , tag::version, bool
42 : : , tag::license, bool
43 : : , tag::cmdinfo, tk::ctr::HelpFactory
44 : : , tag::ctrinfo, tk::ctr::HelpFactory
45 : : , tag::helpkw, tk::ctr::HelpKw
46 : : , tag::group, std::string
47 : : , tag::error, std::vector< std::string >
48 : : >;
49 : :
50 : : //! CmdLine is a TaggedTuple specialized to UnitTest
51 : : //! \details The stack is a tagged tuple
52 : : //! \see Base/TaggedTuple.h
53 : : //! \see Control/UnitTest/Types.h
54 : : class CmdLine : public tk::TaggedTuple< CmdLineMembers > {
55 : :
56 : : public:
57 : : //! \brief UnitTest command-line keywords
58 : : //! \see tk::grm::use and its documentation
59 : : using keywords = tk::cmd_keywords< kw::verbose
60 : : , kw::charestate
61 : : , kw::help
62 : : , kw::helpkw
63 : : , kw::group
64 : : , kw::screen
65 : : , kw::quiescence
66 : : , kw::trace
67 : : , kw::version
68 : : , kw::license
69 : : >;
70 : :
71 : : //! Set of tags to ignore when printing this CmdLine
72 : : using ignore =
73 : : brigand::set< tag::cmdinfo
74 : : , tag::ctrinfo
75 : : , tag::helpkw >;
76 : :
77 : : //! \brief Constructor: set defaults.
78 : : //! \details Anything not set here is initialized by the compiler using the
79 : : //! default constructor for the corresponding type. While there is a
80 : : //! ctrinfo parameter, it is unused here, since unittest does not have a
81 : : //! control file parser.
82 : : //! \see walker::ctr::CmdLine
83 : 5 : CmdLine() {
84 : 5 : get< tag::io, tag::screen >() =
85 [ + - ][ + - ]: 10 : tk::baselogname( tk::unittest_executable() );
86 : 5 : get< tag::verbose >() = false; // Use quiet output by default
87 : 5 : get< tag::chare >() = false; // No chare state output by default
88 : 5 : get< tag::trace >() = true; // Output call and stack trace by default
89 : 5 : get< tag::version >() = false; // Do not display version info by default
90 : 5 : get< tag::license >() = false; // Do not display license info by default
91 : : // Initialize help: fill from own keywords
92 [ + - ]: 5 : brigand::for_each< keywords::set >( tk::ctr::Info(get<tag::cmdinfo>()) );
93 : 5 : }
94 : :
95 : : /** @name Pack/Unpack: Serialize CmdLine object for Charm++ */
96 : : ///@{
97 : : //! \brief Pack/Unpack serialize member function
98 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
99 : 3 : void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); }
100 : : //! \brief Pack/Unpack serialize operator|
101 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
102 : : //! \param[in,out] c CmdLine object reference
103 : 3 : friend void operator|( PUP::er& p, CmdLine& c ) { c.pup(p); }
104 : : //@}
105 : :
106 : : //! Compute and return log file name
107 : : //! \param[in] def Default log file name (so we don't mess with user's)
108 : : //! \param[in] nrestart Number of times restarted
109 : : //! \return Log file name
110 : 2502 : std::string logname( const std::string& def, int nrestart ) const {
111 [ - + ]: 2502 : if (get< tag::io, tag::screen >() != def)
112 : 0 : return get< tag::io, tag::screen >();
113 : : else
114 [ + - ]: 5004 : return tk::logname( tk::unittest_executable(), nrestart );
115 : : }
116 : : };
117 : :
118 : : } // ctr::
119 : : } // unittest::
120 : :
121 : : #endif // UnitTestCmdLine_h
|