summaryrefslogtreecommitdiffstats
path: root/t/scripts/harness/hintdiff.t
diff options
context:
space:
mode:
Diffstat (limited to 't/scripts/harness/hintdiff.t')
-rw-r--r--t/scripts/harness/hintdiff.t207
1 files changed, 207 insertions, 0 deletions
diff --git a/t/scripts/harness/hintdiff.t b/t/scripts/harness/hintdiff.t
new file mode 100644
index 0000000..ed59f38
--- /dev/null
+++ b/t/scripts/harness/hintdiff.t
@@ -0,0 +1,207 @@
+#!/usr/bin/perl
+
+# Copyright (C) 2019 Felix Lechner
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, you can find it on the World Wide
+# Web at https://www.gnu.org/copyleft/gpl.html, or write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA
+
+use strict;
+use warnings;
+
+use Capture::Tiny qw(capture_merged);
+use Const::Fast;
+use List::Util qw(none);
+use Path::Tiny;
+use Test::More;
+
+const my $EMPTY => q{};
+const my $SPACE => q{ };
+const my $LINESEP => qr/^/;
+const my $WAIT_STATUS_SHIFT => 8;
+
+# the files below were generated from changelog-file-general on Feb 1, 2019
+
+# original file
+my $original =<<'EOSTR';
+changelog-file-general (source): latest-debian-changelog-entry-without-new-date
+changelog-file-general (binary): possible-missing-colon-in-closes Closes #555555
+changelog-file-general (binary): misspelled-closes-bug #666666
+changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+changelog-file-general (binary): latest-changelog-entry-without-new-date
+changelog-file-general (binary): improbable-bug-number-in-closes 1234
+changelog-file-general (binary): epoch-changed-but-upstream-version-did-not-go-backwards 1.0 >= 1.0
+changelog-file-general (binary): debian-changelog-line-too-long line 8
+changelog-file-general (binary): debian-changelog-line-too-long line 15
+changelog-file-general (binary): debian-changelog-file-contains-obsolete-user-emacs-settings
+changelog-file-general (binary): debian-changelog-file-contains-invalid-email-address unknown@unknown
+changelog-file-general (binary): changelog-references-temp-security-identifier TEMP-1234567-abcdef
+changelog-file-general (binary): changelog-not-compressed-with-max-compression changelog.Debian.gz
+changelog-file-general (binary): bad-intended-distribution intended to experimental but uploaded to unstable
+EOSTR
+
+# test plan
+plan tests => 8;
+
+# different order
+my $reordered =<<'EOSTR';
+changelog-file-general (binary): changelog-references-temp-security-identifier TEMP-1234567-abcdef
+changelog-file-general (binary): changelog-not-compressed-with-max-compression changelog.Debian.gz
+changelog-file-general (binary): debian-changelog-line-too-long line 15
+changelog-file-general (binary): debian-changelog-file-contains-obsolete-user-emacs-settings
+changelog-file-general (binary): debian-changelog-file-contains-invalid-email-address unknown@unknown
+changelog-file-general (binary): bad-intended-distribution intended to experimental but uploaded to unstable
+changelog-file-general (binary): possible-missing-colon-in-closes Closes #555555
+changelog-file-general (binary): misspelled-closes-bug #666666
+changelog-file-general (binary): improbable-bug-number-in-closes 1234
+changelog-file-general (binary): epoch-changed-but-upstream-version-did-not-go-backwards 1.0 >= 1.0
+changelog-file-general (binary): debian-changelog-line-too-long line 8
+changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+changelog-file-general (binary): latest-changelog-entry-without-new-date
+changelog-file-general (source): latest-debian-changelog-entry-without-new-date
+EOSTR
+
+ok(hintdiff($original, $reordered) eq $EMPTY, 'Reordered hints on the right');
+ok(hintdiff($reordered, $original) eq $EMPTY, 'Reordered hints on the left');
+
+# lines missing
+my $missing =<<'EOSTR';
+changelog-file-general (source): latest-debian-changelog-entry-without-new-date
+changelog-file-general (binary): possible-missing-colon-in-closes Closes #555555
+changelog-file-general (binary): latest-changelog-entry-without-new-date
+changelog-file-general (binary): improbable-bug-number-in-closes 1234
+changelog-file-general (binary): epoch-changed-but-upstream-version-did-not-go-backwards 1.0 >= 1.0
+changelog-file-general (binary): debian-changelog-line-too-long line 15
+changelog-file-general (binary): debian-changelog-file-contains-obsolete-user-emacs-settings
+changelog-file-general (binary): debian-changelog-file-contains-invalid-email-address unknown@unknown
+changelog-file-general (binary): changelog-references-temp-security-identifier TEMP-1234567-abcdef
+changelog-file-general (binary): bad-intended-distribution intended to experimental but uploaded to unstable
+EOSTR
+
+my $missingright =<<'EOSTR';
+-changelog-file-general (binary): misspelled-closes-bug #666666
+-changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+-changelog-file-general (binary): debian-changelog-line-too-long line 8
+-changelog-file-general (binary): changelog-not-compressed-with-max-compression changelog.Debian.gz
+EOSTR
+
+ok(hintdiff($original, $missing) eq $missingright,
+ 'Missing hints on the right');
+ok(hintdiff($missing, $original) eq complement($missingright),
+ 'Missing hints on the left');
+
+# lines extra
+my $extra =<<'EOSTR';
+changelog-file-general (source): latest-debian-changelog-entry-without-new-date
+changelog-file-general (binary): possible-missing-colon-in-closes Closes #555555
+changelog-file-general (binary): misspelled-closes-bug #666666
+changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+changelog-file-general (binary): latest-changelog-entry-without-new-date
+changelog-file-general (binary): improbable-bug-number-in-closes 1234
+changelog-file-general (binary): epoch-changed-but-upstream-version-did-not-go-backwards 1.0 >= 1.0
+changelog-file-general (binary): debian-changelog-line-too-long line 8
+changelog-file-general (binary): debian-changelog-line-too-long line 15
+changelog-file-general (binary): misspelled-closes-bug #666666
+changelog-file-general (binary): debian-changelog-file-contains-obsolete-user-emacs-settings
+changelog-file-general (source): completely-new never seen before
+changelog-file-general (binary): debian-changelog-file-contains-invalid-email-address unknown@unknown
+changelog-file-general (binary): changelog-references-temp-security-identifier TEMP-1234567-abcdef
+changelog-file-general (binary): changelog-not-compressed-with-max-compression changelog.Debian.gz
+changelog-file-general (binary): bad-intended-distribution intended to experimental but uploaded to unstable
+EOSTR
+
+my $extraright =<<'EOSTR';
++changelog-file-general (source): completely-new never seen before
++changelog-file-general (binary): misspelled-closes-bug #666666
++changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+EOSTR
+
+ok(hintdiff($original, $extra) eq $extraright, 'Extra hints on the right');
+ok(hintdiff($extra, $original) eq complement($extraright),
+ 'Extra hints on the left');
+
+# lines different
+my $different =<<'EOSTR';
+changelog-file-general (source): latest-debian-changelog-entry-without-new-date
+changelog-file-general (binary): possible-missing-semicolon-in-closes Closes #555555
+changelog-file-general (binary): misspelled-closes-bug #666666
+changelog-file-general (binary): latest-debian-changelog-entry-reuses-existing-version 1:1.0-1 == 1.0-1 (last used: Fri, 01 Feb 2019 12:27:45 -0800)
+changelog-file-general (binary): latest-changelog-entry-without-new-date
+changelog-file-general (binary): improbable-bug-number-in-closes 1234
+changelog-file-general (binary): epoch-changed-but-upstream-version-did-not-go-backwards 1.0 >= 1.0
+changelog-file-general (binary): debian-changelog-line-too-long line 9
+changelog-file-general (binary): debian-changelog-line-too-long line 15
+changelog-file-general (source): debian-changelog-file-contains-obsolete-user-emacs-settings
+changelog-file-general (binary): debian-changelog-file-contains-invalid-irc-address unknown@unknown
+changelog-file-general (binary): changelog-references-temp-security-identifier TEMP-1234567-abcdef
+changelog-file-general (binary): changelog-not-compressed-with-max-compression changelog.Debian.gz
+changelog-file-general (binary): bad-intended-distribution intended to experimental but uploaded to unstable
+EOSTR
+
+my $differentright =<<'EOSTR';
+-changelog-file-general (binary): possible-missing-colon-in-closes Closes #555555
+-changelog-file-general (binary): debian-changelog-line-too-long line 8
+-changelog-file-general (binary): debian-changelog-file-contains-obsolete-user-emacs-settings
+-changelog-file-general (binary): debian-changelog-file-contains-invalid-email-address unknown@unknown
++changelog-file-general (source): debian-changelog-file-contains-obsolete-user-emacs-settings
++changelog-file-general (binary): possible-missing-semicolon-in-closes Closes #555555
++changelog-file-general (binary): debian-changelog-line-too-long line 9
++changelog-file-general (binary): debian-changelog-file-contains-invalid-irc-address unknown@unknown
+EOSTR
+
+ok(hintdiff($original, $different) eq $differentright,
+ 'Different hints on the right');
+ok(hintdiff($different, $original) eq complement($differentright),
+ 'Different hints on the left');
+
+exit;
+
+sub complement {
+ my ($diff) = @_;
+
+ return $EMPTY
+ unless length $diff;
+
+ my @lines = split($LINESEP, $diff);
+ $_ = -$_ for @lines;
+
+ return join($EMPTY, reverse sort @lines);
+}
+
+sub hintdiff {
+ my ($left_contents, $right_contents) = @_;
+
+ my $left_tiny = Path::Tiny->tempfile;
+ my $right_tiny = Path::Tiny->tempfile;
+
+ $left_tiny->spew($left_contents);
+ $right_tiny->spew($right_contents);
+
+ my @command = ('hintdiff', $left_tiny->stringify, $right_tiny->stringify);
+ my ($diff, $status) = capture_merged { system(@command); };
+ $status >>= $WAIT_STATUS_SHIFT;
+
+ die 'Error executing: ' . join($SPACE, @command) . ": $!"
+ if none { $_ eq $status } (0, 1);
+
+ return $diff;
+}
+
+# Local Variables:
+# indent-tabs-mode: nil
+# cperl-indent-level: 4
+# End:
+# vim: syntax=perl sw=4 sts=4 sr et