1 /*
2  *  Created by Phil on 8/8/12
3  *  Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
4  *
5  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
6  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7  */
8 
9 #include "catch_assertionresult.h"
10 
11 namespace Catch {
AssertionResultData(ResultWas::OfType _resultType,LazyExpression const & _lazyExpression)12     AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):
13         lazyExpression(_lazyExpression),
14         resultType(_resultType) {}
15 
reconstructExpression() const16     std::string AssertionResultData::reconstructExpression() const {
17 
18         if( reconstructedExpression.empty() ) {
19             if( lazyExpression ) {
20                 ReusableStringStream rss;
21                 rss << lazyExpression;
22                 reconstructedExpression = rss.str();
23             }
24         }
25         return reconstructedExpression;
26     }
27 
AssertionResult(AssertionInfo const & info,AssertionResultData const & data)28     AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
29     :   m_info( info ),
30         m_resultData( data )
31     {}
32 
33     // Result was a success
succeeded() const34     bool AssertionResult::succeeded() const {
35         return Catch::isOk( m_resultData.resultType );
36     }
37 
38     // Result was a success, or failure is suppressed
isOk() const39     bool AssertionResult::isOk() const {
40         return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
41     }
42 
getResultType() const43     ResultWas::OfType AssertionResult::getResultType() const {
44         return m_resultData.resultType;
45     }
46 
hasExpression() const47     bool AssertionResult::hasExpression() const {
48         return !m_info.capturedExpression.empty();
49     }
50 
hasMessage() const51     bool AssertionResult::hasMessage() const {
52         return !m_resultData.message.empty();
53     }
54 
getExpression() const55     std::string AssertionResult::getExpression() const {
56         // Possibly overallocating by 3 characters should be basically free
57         std::string expr; expr.reserve(m_info.capturedExpression.size() + 3);
58         if (isFalseTest(m_info.resultDisposition)) {
59             expr += "!(";
60         }
61         expr += m_info.capturedExpression;
62         if (isFalseTest(m_info.resultDisposition)) {
63             expr += ')';
64         }
65         return expr;
66     }
67 
getExpressionInMacro() const68     std::string AssertionResult::getExpressionInMacro() const {
69         std::string expr;
70         if( m_info.macroName.empty() )
71             expr = static_cast<std::string>(m_info.capturedExpression);
72         else {
73             expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 );
74             expr += m_info.macroName;
75             expr += "( ";
76             expr += m_info.capturedExpression;
77             expr += " )";
78         }
79         return expr;
80     }
81 
hasExpandedExpression() const82     bool AssertionResult::hasExpandedExpression() const {
83         return hasExpression() && getExpandedExpression() != getExpression();
84     }
85 
getExpandedExpression() const86     std::string AssertionResult::getExpandedExpression() const {
87         std::string expr = m_resultData.reconstructExpression();
88         return expr.empty()
89                 ? getExpression()
90                 : expr;
91     }
92 
getMessage() const93     std::string AssertionResult::getMessage() const {
94         return m_resultData.message;
95     }
getSourceInfo() const96     SourceLineInfo AssertionResult::getSourceInfo() const {
97         return m_info.lineInfo;
98     }
99 
getTestMacroName() const100     StringRef AssertionResult::getTestMacroName() const {
101         return m_info.macroName;
102     }
103 
104 } // end namespace Catch
105