Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_TestingTools.cpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #include "Thyra_TestingTools.hpp"
43 
44 
46  const std::string &boolExprName,
47  const bool &boolExpr,
48  const bool &boolExpected,
49  const Ptr<std::ostream> &out,
50  const std::string &li
51  )
52 {
53  const bool success = ( boolExpr == boolExpected );
54  if (nonnull(out)) {
55  *out
56  << std::endl
57  << li << "Check: " << boolExprName << " = " << boolExpr << " == " << boolExpected
58  << " : " << passfail(success) << std::endl;
59  }
60  return success;
61 }
62 
63 
64 void Thyra::printTestResults(
65  const bool result,
66  const std::string &test_summary,
67  const bool show_all_tests,
68  const Ptr<bool> &success,
69  const Ptr<std::ostream> &out
70  )
71 {
72  if (!result) *success = false;
73  if (nonnull(out)) {
74  if (!result || show_all_tests) {
75  *out << std::endl << test_summary;
76  }
77  else {
78  *out << "passed!\n";
79  }
80  }
81 }
82 
83 
84 void Thyra::printTestResults(
85  const bool result,
86  const std::string &test_summary,
87  const bool show_all_tests,
88  bool *success,
89  std::ostream *out
90  )
91 {
92  using Teuchos::ptr;
93  printTestResults(result, test_summary, show_all_tests,
94  ptr(success), ptr(out));
95 }
96 
97 
98 // TestResultsPrinter
99 
100 
101 namespace Thyra {
102 
103 
104 TestResultsPrinter::TestResultsPrinter(
105  const RCP<FancyOStream> &out, const bool show_all_tests)
106  : out_(out.assert_not_null()), show_all_tests_(show_all_tests),
107  printedTestResults_(false)
108 {
109  if (show_all_tests_) {
110  oss_ = out_;
111  }
112  else {
113  oss_ = Teuchos::fancyOStream(Teuchos::rcpFromRef(ossStore_));
114  ossStore_.copyfmt(*out_);
115  }
116 }
117 
118 
120 {
121  using Teuchos::inoutArg;
122  if (!printedTestResults_) {
123  // If we get here, either someone made a mistake in not calling
124  // printTestResults() or an exception was thrown. Either way, we are
125  // going to assume failure and dump everything.
126  try {
127  bool dummy_success = true;
128  this->printTestResults(false, inoutArg(dummy_success));
129  }
130  catch(...) {
131  // Need to eat any exceptions in case an exception is already active
132  // which is calling this destructor.
133  }
134  }
135  printedTestResults_ = true;
136 }
137 
138 
141 {
142  const RCP<FancyOStream> oldOut = out_;
143  out_ = out;
144  return oldOut;
145 }
146 
147 
149 {
150  return oss_;
151 }
152 
153 
154 void TestResultsPrinter::printTestResults(const bool this_result,
155  const Ptr<bool> &success)
156 {
157  if (!show_all_tests_) {
158  Thyra::printTestResults(this_result, ossStore_.str(), false,
159  success, out_.ptr());
160  }
161  else {
162  if (!this_result) {
163  *success = false;
164  }
165  }
166  printedTestResults_ = true;
167 }
168 
169 
170 } // namespace Thyra
const std::string passfail(const bool result)
RCP< FancyOStream > replaceOStream(const RCP< FancyOStream > &out)
Replace the underlying output stream (used for unit testing this class).
Ptr< T > ptr() const
void printTestResults(const bool this_result, const Ptr< bool > &success)
Print the test result.
~TestResultsPrinter()
Print the test results on destruction if not already printed.
bool nonnull(const boost::shared_ptr< T > &p)
RCP< FancyOStream > getTestOStream()
Return the stream used for testing.
bool testBoolExpr(const std::string &boolExprName, const bool &boolExpr, const bool &boolExpected, const Ptr< std::ostream > &out, const std::string &leadingIndent=std::string(""))
Check a boolean result against expected result.