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 // TestResultsPrinter
85 
86 
87 namespace Thyra {
88 
89 
90 TestResultsPrinter::TestResultsPrinter(
91  const RCP<FancyOStream> &out, const bool show_all_tests)
92  : out_(out.assert_not_null()), show_all_tests_(show_all_tests),
93  printedTestResults_(false)
94 {
95  if (show_all_tests_) {
96  oss_ = out_;
97  }
98  else {
99  oss_ = Teuchos::fancyOStream(Teuchos::rcpFromRef(ossStore_));
100  ossStore_.copyfmt(*out_);
101  }
102 }
103 
104 
106 {
107  using Teuchos::inoutArg;
108  if (!printedTestResults_) {
109  // If we get here, either someone made a mistake in not calling
110  // printTestResults() or an exception was thrown. Either way, we are
111  // going to assume failure and dump everything.
112  try {
113  bool dummy_success = true;
114  this->printTestResults(false, inoutArg(dummy_success));
115  }
116  catch(...) {
117  // Need to eat any exceptions in case an exception is already active
118  // which is calling this destructor.
119  }
120  }
121  printedTestResults_ = true;
122 }
123 
124 
127 {
128  const RCP<FancyOStream> oldOut = out_;
129  out_ = out;
130  return oldOut;
131 }
132 
133 
135 {
136  return oss_;
137 }
138 
139 
140 void TestResultsPrinter::printTestResults(const bool this_result,
141  const Ptr<bool> &success)
142 {
143  if (!show_all_tests_) {
144  Thyra::printTestResults(this_result, ossStore_.str(), false,
145  success, out_.ptr());
146  }
147  else {
148  if (!this_result) {
149  *success = false;
150  }
151  }
152  printedTestResults_ = true;
153 }
154 
155 
156 } // 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.