39 std::vector<std::string>& data_,
41 for(std::string line_; std::getline(is_, line_);) {
42 data_.push_back(std::move(line_));
51 const std::string& line_) {
52 os_ << std::setfill(
'0');
56 os_ << std::setw(4) << (left_line_ + 1);
64 os_ << std::setw(4) << (right_line_ + 1);
84 <<
"........................................"
90 bool LongTextAssertion::testAssertImpl(
94 std::vector<std::string> a_data_;
95 slurpFile(a_data_, a_);
96 std::vector<std::string> b_data_;
97 slurpFile(b_data_, b_);
101 DiffLogBuilderBlock log_builder_(&diff_log_);
104 bool result_(diff_log_.empty());
108 report_ <<
"the texts are equal" <<
commitMsg();
109 return report_.getResult();
113 report_ <<
"the texts are different" <<
commitMsg();
116 constexpr
int CONTEXT(3);
117 bool trailing_context_(
false);
120 std::ostringstream oss_;
121 for(
const auto& difference_ : diff_log_) {
123 if(trailing_context_) {
124 const int context_end_(left_line_ + CONTEXT);
126 left_line_ < difference_.left_begin && left_line_ < context_end_;
127 ++left_line_, ++right_line_) {
128 assert(right_line_ < difference_.right_begin);
129 formatLine(report_, left_line_, right_line_,
' ', a_data_[left_line_]);
133 trailing_context_ =
true;
136 if(left_line_ < difference_.left_begin - CONTEXT) {
137 assert(right_line_ < difference_.right_begin);
139 printSeparator(report_);
140 left_line_ = difference_.left_begin - CONTEXT;
141 right_line_ = difference_.right_begin - CONTEXT;
146 left_line_ < difference_.left_begin;
147 ++left_line_, ++right_line_) {
148 assert(right_line_ < difference_.right_begin);
149 formatLine(report_, left_line_, right_line_,
' ', a_data_[left_line_]);
153 assert(left_line_ == difference_.left_begin);
154 assert(right_line_ == difference_.right_begin);
155 for(; left_line_ < difference_.left_end; ++left_line_) {
156 formatLine(report_, left_line_, -1,
'<', a_data_[left_line_]);
158 for(; right_line_ < difference_.right_end; ++right_line_) {
159 formatLine(report_, -1, right_line_,
'>', b_data_[right_line_]);
164 const int context_end_(left_line_ + CONTEXT);
166 left_line_ < a_data_.size() && left_line_ < context_end_;
167 ++left_line_, ++right_line_) {
168 assert(right_line_ < b_data_.size());
169 formatLine(report_, left_line_, right_line_,
' ', a_data_[left_line_]);
173 if(left_line_ < a_data_.size()) {
174 assert(right_line_ < b_data_.size());
175 printSeparator(report_);
178 return report_.getResult();
184 return testAssertImpl(a_, b_);
189 const std::string& b_) {
190 std::istringstream str_b_(b_);
191 return testAssertImpl(a_, str_b_);
196 const std::string& file_b_) {
197 std::ifstream str_b_(file_b_);
198 return testAssertImpl(a_, str_b_);
202 const std::string& a_,
204 std::istringstream str_a_(a_);
205 return testAssertImpl(str_a_, b_);
209 const std::string& a_,
210 const std::string& b_) {
211 std::istringstream str_a_(a_);
212 std::istringstream str_b_(b_);
213 return testAssertImpl(str_a_, str_b_);
217 const std::string& a_,
218 const std::string& file_b_) {
219 std::istringstream str_a_(a_);
220 std::ifstream str_b_(file_b_);
221 return testAssertImpl(str_a_, str_b_);
225 const std::string& file_a_,
227 std::ifstream str_a_(file_a_);
228 return testAssertImpl(str_a_, b_);
232 const std::string& file_a_,
233 const std::string& b_) {
234 std::ifstream str_a_(file_a_);
235 std::istringstream str_b_(b_);
236 return testAssertImpl(str_a_, str_b_);
240 const std::string& file_a_,
241 const std::string& file_b_) {
242 std::ifstream str_a_(file_a_);
243 std::ifstream str_b_(file_b_);
244 return testAssertImpl(str_a_, str_b_);