mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-30 05:42:05 +00:00
fe1b7062eb
* include/abg-diff-utils.h (point::{operator!=,operator==}): New operators. (end_of_fr_d_path_in_k, end_of_frr_d_path_in_k_plus_delta): Allow the initial point (-1,-1) that is not a point addressing elements of the input sequences, but that is the starting point of the forward paths and the ending point of reverse paths in the "Linear Refinement" of the algorithm. (is_match_point, maybe_record_match_point) (find_snake_start_point): New functions. (find_last_snake_in_path): Remove this. It's not used anymore. (compute_middle_snake): Allow checking for overlapping paths even on points that are outside of the edit graph boundaries. Once the overlap is detected, if a non-empty snake has been seen already, report it as the middle snake. Otherwise, keep building the path until the end and report the last snake encountered as the middle snake. Add comments. (compute_diff): For the d == 1 case, fix the logic of the finding the non-diagonal edge. Fix typos. Add comments. (display_edit_script): Fix report glitches. * tests/data/test-core-diff/report3.txt: Update as per the report glitch above. * tests/data/test-core-diff/report4.txt: Likewise. * tests/data/test-core-diff/report5.txt: Likewise. * tests/data/test-core-diff/report6.txt: New reference report for a new test. * tests/test-core-diff.cc: Add a new test for negative delta. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
150 lines
4.0 KiB
C++
150 lines
4.0 KiB
C++
// -*- Mode: C++ -*-
|
|
|
|
// Copyright (C) 2013 Red Hat, Inc.
|
|
//
|
|
// This file is part of the GNU Application Binary Interface Generic
|
|
// Analysis and Instrumentation Library (libabigail). This library is
|
|
// free software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU Lesser General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option) any
|
|
// later version.
|
|
|
|
// This library is distributed in the hope that it will be useful, but
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// General Lesser Public License for more details.
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this program; see the file COPYING-LGPLV3. If
|
|
// not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// Author: Dodji Seketeli
|
|
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
#include "abg-tools-utils.h"
|
|
#include "abg-diff-utils.h"
|
|
#include "test-utils.h"
|
|
|
|
using std::string;
|
|
using std::ofstream;
|
|
using std::cerr;
|
|
|
|
/// This structure describes the set of strings we want to diff
|
|
/// against each other as well as the reports we expect from these
|
|
/// diffs.
|
|
struct SESInOutSpec
|
|
{
|
|
// This is the path to the report we expect from the diff algorithm
|
|
// applied to second_string (below) diffed against first_string.
|
|
const char* in_path;
|
|
// This is the path where to store the report of the diff algorithm
|
|
// applied to second_string (below) diffed against first_string.
|
|
const char* out_path;
|
|
// This is the first string to feed the diff algorithm with.
|
|
const char* first_string;
|
|
// This is the second string to feed the diff algorithm with.
|
|
const char* second_string;
|
|
};// end struct SESInOutSpec
|
|
|
|
SESInOutSpec in_out_specs[] =
|
|
{
|
|
{
|
|
"data/test-core-diff/report0.txt",
|
|
"output/test-core-diff/report0.txt",
|
|
"abcabba",
|
|
"cbabac"
|
|
},
|
|
{
|
|
"data/test-core-diff/report1.txt",
|
|
"output/test-core-diff/report1.txt",
|
|
"xxabxx",
|
|
"xbx"
|
|
},
|
|
{
|
|
"data/test-core-diff/report2.txt",
|
|
"output/test-core-diff/report2.txt",
|
|
"xxabxx",
|
|
"xbcx"
|
|
},
|
|
{
|
|
"data/test-core-diff/report3.txt",
|
|
"output/test-core-diff/report3.txt",
|
|
"abc",
|
|
"abdecfgc"
|
|
},
|
|
{
|
|
"data/test-core-diff/report4.txt",
|
|
"output/test-core-diff/report4.txt",
|
|
"xxx",
|
|
"xxx"
|
|
},
|
|
{
|
|
"data/test-core-diff/report5.txt",
|
|
"output/test-core-diff/report5.txt",
|
|
"xabx",
|
|
"xbx"
|
|
},
|
|
{
|
|
"data/test-core-diff/report6.txt",
|
|
"output/test-core-diff/report6.txt",
|
|
"fou",
|
|
"fubar"
|
|
},
|
|
// This should be the last entry.
|
|
{NULL, NULL, NULL, NULL}
|
|
};
|
|
|
|
using abigail::diff_utils::edit_script;
|
|
using abigail::diff_utils::compute_ses;
|
|
using abigail::diff_utils::display_edit_script;
|
|
|
|
int
|
|
main()
|
|
{
|
|
unsigned result = 1;
|
|
|
|
bool problem = false;
|
|
string in_path, out_path;
|
|
|
|
for (SESInOutSpec *s = in_out_specs; s->in_path; ++s)
|
|
{
|
|
string input_suffix(s->in_path);
|
|
in_path = abigail::tests::get_src_dir() + "/tests/" + input_suffix;
|
|
|
|
string output_suffix(s->out_path);
|
|
out_path = abigail::tests::get_build_dir() + "/tests/" + output_suffix;
|
|
|
|
if (!abigail::tools::ensure_parent_dir_created(out_path))
|
|
{
|
|
cerr << "Could not create parent director for " << out_path;
|
|
problem = true;
|
|
return result;
|
|
}
|
|
|
|
ofstream of(out_path.c_str(), std::ios_base::trunc);
|
|
if (!of.is_open())
|
|
{
|
|
cerr << "failed to read " << out_path << "\n";
|
|
problem = true;
|
|
continue;
|
|
}
|
|
|
|
edit_script ses;
|
|
// Compute the Shortest Edit Script (aka diff) that changes
|
|
// s->first_string into s->second_string.
|
|
compute_ses(s->first_string, s->second_string, ses);
|
|
// Emit a report about that edit script
|
|
display_edit_script(ses, s->first_string, s->second_string, of);
|
|
of.close();
|
|
// Diff that report against what we expect.
|
|
string cmd = "diff -u " + in_path + " " + out_path;
|
|
if (system(cmd.c_str()))
|
|
problem= true;
|
|
}
|
|
|
|
return problem;
|
|
}
|