libMesh
Loading...
Searching...
No Matches
getpot_test.C
Go to the documentation of this file.
1
2#include <libmesh/getpot.h>
3
4// For command_line shim methods
5#include <libmesh/libmesh.h>
6
7#include "libmesh_cppunit.h"
8
9using namespace libMesh;
10
11class GetPotTest : public CppUnit::TestCase {
12
13public:
15
20
22
23protected:
24
25 std::stringstream inputfile;
26
27 GetPot input;
28
29public:
30
32 {
33
34 const char* text =
35 "[Section1]\n"
36 "\n"
37 " var1 = '5.0'\n"
38 "\n"
39 " [./SubSection1]\n"
40 "\n"
41 " var2 = 'blah'\n"
42 "\n"
43 "[]\n"
44 "\n"
45 "[Section2]\n"
46 "\n"
47 " #var3 = '5'\n"
48 "\n"
49 " [./Subsection2]\n"
50 "\n"
51 " var4 = 'false'\n"
52 "\n"
53 " [./Subsection3]\n"
54 "\n"
55 " var5 = '6.02e23'\n"
56 "\n"
57 " [../../Subsection4]\n"
58 "\n"
59 " var6 = '42'\n"
60 "\n"
61 "[]\n"
62 "\n"
63 "[Section3]\n"
64 "\n"
65 " unused_var = 'not_used'\n";
66
67 inputfile << text;
68 }
69
70 void setUp()
71 {
72 this->setup_inputfile();
73 input.parse_input_stream(inputfile);
74 }
75
77 {
78 LOG_UNIT_TEST;
79 CPPUNIT_ASSERT( input.have_variable("Section1/var1") );
80 Real var1 = input("Section1/var1", 1.0);
81 CPPUNIT_ASSERT_EQUAL( var1, Real(5));
82
83 CPPUNIT_ASSERT( input.have_variable("Section1/SubSection1/var2") );
84 std::string var2 = input("Section1/SubSection1/var2", "DIE!");
85 CPPUNIT_ASSERT_EQUAL( var2, std::string("blah") );
86
87 // This variable is commented out in the input file so we shouldn't find it.
88 CPPUNIT_ASSERT( !input.have_variable("Section2/var3") );
89 int var3 = input("Section2/var3", 314);
90 CPPUNIT_ASSERT_EQUAL( var3, 314 );
91
92 CPPUNIT_ASSERT( input.have_variable("Section2/Subsection2/var4") );
93 bool var4 = input("Section2/Subsection2/var4", true);
94 CPPUNIT_ASSERT_EQUAL( var4, false );
95
96 CPPUNIT_ASSERT( input.have_variable("Section2/Subsection2/Subsection3/var5") );
97 Real var5 = input("Section2/Subsection2/Subsection3/var5", 3.1415);
98 CPPUNIT_ASSERT_EQUAL( var5, Real(6.02e23));
99
100 CPPUNIT_ASSERT( input.have_variable("Section2/Subsection4/var6") );
101 unsigned int var6 = input("Section2/Subsection4/var6", 21);
102 CPPUNIT_ASSERT_EQUAL(var6, static_cast<unsigned int>(42));
103
104 // We didn't use Section3/unused_var so it should be a UFO
105 std::vector<std::string> ufos = input.unidentified_variables();
106 CPPUNIT_ASSERT_EQUAL( ufos.size(), (std::vector<std::string>::size_type)1 );
107 CPPUNIT_ASSERT_EQUAL( ufos[0], std::string("Section3/unused_var") );
108 }
109
111 {
112 LOG_UNIT_TEST;
113 // GetPot stores the '/' at the end of each section name
114 CPPUNIT_ASSERT(input.have_section("Section1/"));
115 CPPUNIT_ASSERT(input.have_section("Section1/SubSection1/"));
116 CPPUNIT_ASSERT(input.have_section("Section2/Subsection2/"));
117 CPPUNIT_ASSERT(input.have_section("Section2/Subsection2/Subsection3/"));
118 CPPUNIT_ASSERT(input.have_section("Section2/Subsection4/"));
119 CPPUNIT_ASSERT(input.have_section("Section3/"));
120
121 // But we don't need to supply the trailing '/'
122 CPPUNIT_ASSERT(input.have_section("Section1"));
123 CPPUNIT_ASSERT(input.have_section("Section1/SubSection1"));
124 CPPUNIT_ASSERT(input.have_section("Section2/Subsection2/Subsection3"));
125
126 // No such thing as this section
127 CPPUNIT_ASSERT(!input.have_section("ImNotASection/"));
128 }
129
131 {
132 LOG_UNIT_TEST;
133 typedef std::vector<std::string>::size_type sz;
134 typedef std::string str;
135
136 const std::vector<std::string> subsections1 =
137 input.get_subsection_names("Section1");
138
139 CPPUNIT_ASSERT_EQUAL(subsections1.size(), sz(1));
140 CPPUNIT_ASSERT_EQUAL(subsections1[0], str("SubSection1"));
141
142 const std::vector<std::string> subsections1_1 =
143 input.get_subsection_names("Section1/Subsection1");
144
145 CPPUNIT_ASSERT(subsections1_1.empty());
146
147 const std::vector<std::string> subsections2 =
148 input.get_subsection_names("Section2");
149
150 CPPUNIT_ASSERT_EQUAL(subsections2.size(), sz(2));
151 CPPUNIT_ASSERT_EQUAL(subsections2[0], str("Subsection2"));
152 CPPUNIT_ASSERT_EQUAL(subsections2[1], str("Subsection4"));
153
154 const std::vector<std::string> subsections2_2 =
155 input.get_subsection_names("Section2/Subsection2");
156
157 CPPUNIT_ASSERT_EQUAL(subsections2_2.size(), sz(1));
158 CPPUNIT_ASSERT_EQUAL(subsections2_2[0], str("Subsection3"));
159
160 const std::vector<std::string> subsections2_4 =
161 input.get_subsection_names("Section2/Subsection4");
162
163 CPPUNIT_ASSERT(subsections2_4.empty());
164
165 const std::vector<std::string> subsections3 =
166 input.get_subsection_names("Section3");
167
168 CPPUNIT_ASSERT(subsections3.empty());
169 }
170
172 {
173 LOG_UNIT_TEST;
174 // Test whether the new dash/underscore agnosticism works
175 //
176 // This means the unit_tests-foo executable *must* be run with
177 // options equivalent to the asserted ones and without options
178 // equivalent to the anti-asserted ones.
179 CPPUNIT_ASSERT(libMesh::on_command_line("--option-with-underscores"));
180 CPPUNIT_ASSERT(libMesh::on_command_line("--option_with_underscores"));
181 CPPUNIT_ASSERT(libMesh::on_command_line("--option-with-dashes"));
182 CPPUNIT_ASSERT(libMesh::on_command_line("--option_with_dashes"));
183 CPPUNIT_ASSERT(!libMesh::on_command_line("--option-with-lies"));
184 CPPUNIT_ASSERT(!libMesh::on_command_line("--option_with_lies"));
185 CPPUNIT_ASSERT_EQUAL(libMesh::command_line_next("--option-with-underscores", 2), 3);
186 CPPUNIT_ASSERT_EQUAL(libMesh::command_line_next("--option_with_underscores", 2), 3);
187 }
188
189};
190
CPPUNIT_TEST(testVariables)
void testVariables()
Definition getpot_test.C:76
void setUp()
Definition getpot_test.C:70
CPPUNIT_TEST(testSubSections)
void testSubSections()
void testSections()
std::stringstream inputfile
Definition getpot_test.C:25
void testCommandLine()
CPPUNIT_TEST_SUITE_END()
GetPot input
Definition getpot_test.C:27
CPPUNIT_TEST(testSections)
LIBMESH_CPPUNIT_TEST_SUITE(GetPotTest)
void setup_inputfile()
Definition getpot_test.C:31
CPPUNIT_TEST(testCommandLine)
CPPUNIT_TEST_SUITE_REGISTRATION(GetPotTest)
The libMesh namespace provides an interface to certain functionality in the library.
T command_line_next(std::string name, T default_value)
Use GetPot's search()/next() functions to get following arguments from the command line.
Definition libmesh.C:1025
bool on_command_line(std::string arg)
Definition libmesh.C:934
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real