mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
sort: implement --debug
This adds a --debug flag, which, when activated, will draw lines below the characters that are actually used for comparisons. This is not a complete implementation of --debug. It should, quoting the man page for GNU sort: "annotate the part of the line used to sort, and warn about questionable usage to stderr". Warning about "questionable usage" is not part of this patch. This change required some adjustments to be able to get the range that is actually used for comparisons. Most notably, general numeric comparisons were rewritten, fixing some bugs along the lines. Testing is mostly done by adding fixtures for the expected debug output of existing tests.
This commit is contained in:
Generated
+1
@@ -2297,6 +2297,7 @@ dependencies = [
|
||||
"rayon",
|
||||
"semver",
|
||||
"smallvec 1.6.1",
|
||||
"unicode-width",
|
||||
"uucore",
|
||||
"uucore_procs",
|
||||
]
|
||||
|
||||
@@ -22,6 +22,7 @@ fnv = "1.0.7"
|
||||
itertools = "0.10.0"
|
||||
semver = "0.9.0"
|
||||
smallvec = "1.6.1"
|
||||
unicode-width = "0.1.8"
|
||||
uucore = { version=">=0.0.8", package="uucore", path="../../uucore", features=["fs"] }
|
||||
uucore_procs = { version=">=0.0.5", package="uucore_procs", path="../../uucore_procs" }
|
||||
|
||||
|
||||
@@ -137,7 +137,15 @@ impl NumInfo {
|
||||
sign: if had_digit { sign } else { Sign::Positive },
|
||||
exponent: 0,
|
||||
},
|
||||
0..0,
|
||||
if had_digit {
|
||||
// In this case there were only zeroes.
|
||||
// For debug output to work properly, we have to claim to match the end of the number.
|
||||
num.len()..num.len()
|
||||
} else {
|
||||
// This was no number at all.
|
||||
// For debug output to work properly, we have to claim to match the start of the number.
|
||||
0..0
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+301
-166
File diff suppressed because it is too large
Load Diff
+27
-53
@@ -2,10 +2,17 @@ use crate::common::util::*;
|
||||
|
||||
fn test_helper(file_name: &str, args: &str) {
|
||||
new_ucmd!()
|
||||
.arg(args)
|
||||
.arg(format!("{}.txt", file_name))
|
||||
.args(&args.split(' ').collect::<Vec<&str>>())
|
||||
.succeeds()
|
||||
.stdout_is_fixture(format!("{}.expected", file_name));
|
||||
|
||||
new_ucmd!()
|
||||
.arg(format!("{}.txt", file_name))
|
||||
.arg("--debug")
|
||||
.args(&args.split(' ').collect::<Vec<&str>>())
|
||||
.succeeds()
|
||||
.stdout_is_fixture(format!("{}.expected.debug", file_name));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -29,11 +36,7 @@ fn test_human_numeric_whitespace() {
|
||||
|
||||
#[test]
|
||||
fn test_multiple_decimals_general() {
|
||||
new_ucmd!()
|
||||
.arg("-g")
|
||||
.arg("multiple_decimals_general.txt")
|
||||
.succeeds()
|
||||
.stdout_is("\n\n\n\n\n\n\n\nCARAvan\n-2028789030\n-896689\n-8.90880\n-1\n-.05\n000\n00000001\n1\n1.040000000\n1.444\n1.58590\n8.013\n45\n46.89\n576,446.88800000\n576,446.890\n 4567.\n4567.1\n4567.34\n\t\t\t\t\t\t\t\t\t\t4567..457\n\t\t\t\t37800\n\t\t\t\t\t\t45670.89079.098\n\t\t\t\t\t\t45670.89079.1\n4798908.340000000000\n4798908.45\n4798908.8909800\n");
|
||||
test_helper("multiple_decimals_general", "-g")
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -63,7 +66,7 @@ fn test_check_zero_terminated_success() {
|
||||
#[test]
|
||||
fn test_random_shuffle_len() {
|
||||
// check whether output is the same length as the input
|
||||
const FILE: &'static str = "default_unsorted_ints.expected";
|
||||
const FILE: &str = "default_unsorted_ints.expected";
|
||||
let (at, _ucmd) = at_and_ucmd!();
|
||||
let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str();
|
||||
let expected = at.read(FILE);
|
||||
@@ -75,7 +78,7 @@ fn test_random_shuffle_len() {
|
||||
#[test]
|
||||
fn test_random_shuffle_contains_all_lines() {
|
||||
// check whether lines of input are all in output
|
||||
const FILE: &'static str = "default_unsorted_ints.expected";
|
||||
const FILE: &str = "default_unsorted_ints.expected";
|
||||
let (at, _ucmd) = at_and_ucmd!();
|
||||
let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str();
|
||||
let expected = at.read(FILE);
|
||||
@@ -90,7 +93,7 @@ fn test_random_shuffle_two_runs_not_the_same() {
|
||||
// check to verify that two random shuffles are not equal; this has the
|
||||
// potential to fail in the very unlikely event that the random order is the same
|
||||
// as the starting order, or if both random sorts end up having the same order.
|
||||
const FILE: &'static str = "default_unsorted_ints.expected";
|
||||
const FILE: &str = "default_unsorted_ints.expected";
|
||||
let (at, _ucmd) = at_and_ucmd!();
|
||||
let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str();
|
||||
let expected = at.read(FILE);
|
||||
@@ -105,7 +108,7 @@ fn test_random_shuffle_contains_two_runs_not_the_same() {
|
||||
// check to verify that two random shuffles are not equal; this has the
|
||||
// potential to fail in the unlikely event that random order is the same
|
||||
// as the starting order, or if both random sorts end up having the same order.
|
||||
const FILE: &'static str = "default_unsorted_ints.expected";
|
||||
const FILE: &str = "default_unsorted_ints.expected";
|
||||
let (at, _ucmd) = at_and_ucmd!();
|
||||
let result = new_ucmd!().arg("-R").arg(FILE).run().stdout_move_str();
|
||||
let expected = at.read(FILE);
|
||||
@@ -209,13 +212,7 @@ fn test_non_printing_chars() {
|
||||
|
||||
#[test]
|
||||
fn test_exponents_positive_general_fixed() {
|
||||
for exponents_positive_general_param in vec!["-g"] {
|
||||
new_ucmd!()
|
||||
.pipe_in("100E6\n\n50e10\n+100000\n\n10000K78\n10E\n\n\n1000EDKLD\n\n\n100E6\n\n50e10\n+100000\n\n")
|
||||
.arg(exponents_positive_general_param)
|
||||
.succeeds()
|
||||
.stdout_only("\n\n\n\n\n\n\n\n10000K78\n1000EDKLD\n10E\n+100000\n+100000\n100E6\n100E6\n50e10\n50e10\n");
|
||||
}
|
||||
test_helper("exponents_general", "-g");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -334,62 +331,32 @@ fn test_numeric_unique_ints2() {
|
||||
|
||||
#[test]
|
||||
fn test_keys_open_ended() {
|
||||
let input = "aa bb cc\ndd aa ff\ngg aa cc\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "2.2"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("gg aa cc\ndd aa ff\naa bb cc\n");
|
||||
test_helper("keys_open_ended", "-k 2.3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_closed_range() {
|
||||
let input = "aa bb cc\ndd aa ff\ngg aa cc\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "2.2,2.2"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("dd aa ff\ngg aa cc\naa bb cc\n");
|
||||
test_helper("keys_closed_range", "-k 2.2,2.2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_multiple_ranges() {
|
||||
let input = "aa bb cc\ndd aa ff\ngg aa cc\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "2,2", "-k", "3,3"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("gg aa cc\ndd aa ff\naa bb cc\n");
|
||||
test_helper("keys_multiple_ranges", "-k 2,2 -k 3,3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_no_field_match() {
|
||||
let input = "aa aa aa aa\naa bb cc\ndd aa ff\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "4,4"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("aa bb cc\ndd aa ff\naa aa aa aa\n");
|
||||
test_helper("keys_no_field_match", "-k 4,4");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_no_char_match() {
|
||||
let input = "aaa\nba\nc\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "1.2"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("c\nba\naaa\n");
|
||||
test_helper("keys_no_char_match", "-k 1.2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_custom_separator() {
|
||||
let input = "aaxbbxcc\nddxaaxff\nggxaaxcc\n";
|
||||
new_ucmd!()
|
||||
.args(&["-k", "2.2,2.2", "-t", "x"])
|
||||
.pipe_in(input)
|
||||
.succeeds()
|
||||
.stdout_only("ddxaaxff\nggxaaxcc\naaxbbxcc\n");
|
||||
test_helper("keys_custom_separator", "-k 2.2,2.2 -t x");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -416,6 +383,13 @@ fn test_keys_invalid_field_zero() {
|
||||
.stderr_only("sort: error: field index was 0");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_invalid_char_zero() {
|
||||
new_ucmd!().args(&["-k", "1.0"]).fails().stderr_only(
|
||||
"sort: error: invalid character index 0 in `1.0` for the start position of a field",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keys_with_options() {
|
||||
let input = "aa 3 cc\ndd 1 ff\ngg 2 cc\n";
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
1
|
||||
_
|
||||
10
|
||||
__
|
||||
100
|
||||
___
|
||||
11
|
||||
__
|
||||
12
|
||||
__
|
||||
13
|
||||
__
|
||||
14
|
||||
__
|
||||
15
|
||||
__
|
||||
16
|
||||
__
|
||||
17
|
||||
__
|
||||
18
|
||||
__
|
||||
19
|
||||
__
|
||||
2
|
||||
_
|
||||
20
|
||||
__
|
||||
21
|
||||
__
|
||||
22
|
||||
__
|
||||
23
|
||||
__
|
||||
24
|
||||
__
|
||||
25
|
||||
__
|
||||
26
|
||||
__
|
||||
27
|
||||
__
|
||||
28
|
||||
__
|
||||
29
|
||||
__
|
||||
3
|
||||
_
|
||||
30
|
||||
__
|
||||
31
|
||||
__
|
||||
32
|
||||
__
|
||||
33
|
||||
__
|
||||
34
|
||||
__
|
||||
35
|
||||
__
|
||||
36
|
||||
__
|
||||
37
|
||||
__
|
||||
38
|
||||
__
|
||||
39
|
||||
__
|
||||
4
|
||||
_
|
||||
40
|
||||
__
|
||||
41
|
||||
__
|
||||
42
|
||||
__
|
||||
43
|
||||
__
|
||||
44
|
||||
__
|
||||
45
|
||||
__
|
||||
46
|
||||
__
|
||||
47
|
||||
__
|
||||
48
|
||||
__
|
||||
49
|
||||
__
|
||||
5
|
||||
_
|
||||
50
|
||||
__
|
||||
51
|
||||
__
|
||||
52
|
||||
__
|
||||
53
|
||||
__
|
||||
54
|
||||
__
|
||||
55
|
||||
__
|
||||
56
|
||||
__
|
||||
57
|
||||
__
|
||||
58
|
||||
__
|
||||
59
|
||||
__
|
||||
6
|
||||
_
|
||||
60
|
||||
__
|
||||
61
|
||||
__
|
||||
62
|
||||
__
|
||||
63
|
||||
__
|
||||
64
|
||||
__
|
||||
65
|
||||
__
|
||||
66
|
||||
__
|
||||
67
|
||||
__
|
||||
68
|
||||
__
|
||||
69
|
||||
__
|
||||
7
|
||||
_
|
||||
70
|
||||
__
|
||||
71
|
||||
__
|
||||
72
|
||||
__
|
||||
73
|
||||
__
|
||||
74
|
||||
__
|
||||
75
|
||||
__
|
||||
76
|
||||
__
|
||||
77
|
||||
__
|
||||
78
|
||||
__
|
||||
79
|
||||
__
|
||||
8
|
||||
_
|
||||
80
|
||||
__
|
||||
81
|
||||
__
|
||||
82
|
||||
__
|
||||
83
|
||||
__
|
||||
84
|
||||
__
|
||||
85
|
||||
__
|
||||
86
|
||||
__
|
||||
87
|
||||
__
|
||||
88
|
||||
__
|
||||
89
|
||||
__
|
||||
9
|
||||
_
|
||||
90
|
||||
__
|
||||
91
|
||||
__
|
||||
92
|
||||
__
|
||||
93
|
||||
__
|
||||
94
|
||||
__
|
||||
95
|
||||
__
|
||||
96
|
||||
__
|
||||
97
|
||||
__
|
||||
98
|
||||
__
|
||||
99
|
||||
__
|
||||
@@ -0,0 +1,9 @@
|
||||
bbb
|
||||
___
|
||||
___
|
||||
./bbc
|
||||
_____
|
||||
_____
|
||||
bbd
|
||||
___
|
||||
___
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
+100000
|
||||
^ no match for key
|
||||
_______
|
||||
10E
|
||||
__
|
||||
___
|
||||
50e10
|
||||
__
|
||||
_____
|
||||
100E6
|
||||
___
|
||||
_____
|
||||
1000EDKLD
|
||||
____
|
||||
_________
|
||||
10000K78
|
||||
_____
|
||||
________
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
5.5.5.5
|
||||
10E
|
||||
1000EDKLD
|
||||
10000K78
|
||||
+100000
|
||||
+100000
|
||||
100E6
|
||||
100E6
|
||||
10e10e10e10
|
||||
50e10
|
||||
50e10
|
||||
@@ -0,0 +1,57 @@
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
5.5.5.5
|
||||
___
|
||||
_______
|
||||
10E
|
||||
__
|
||||
___
|
||||
1000EDKLD
|
||||
____
|
||||
_________
|
||||
10000K78
|
||||
_____
|
||||
________
|
||||
+100000
|
||||
_______
|
||||
_______
|
||||
+100000
|
||||
_______
|
||||
_______
|
||||
100E6
|
||||
_____
|
||||
_____
|
||||
100E6
|
||||
_____
|
||||
_____
|
||||
10e10e10e10
|
||||
_____
|
||||
___________
|
||||
50e10
|
||||
_____
|
||||
_____
|
||||
50e10
|
||||
_____
|
||||
_____
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
100E6
|
||||
|
||||
50e10
|
||||
+100000
|
||||
|
||||
10000K78
|
||||
10E
|
||||
|
||||
|
||||
1000EDKLD
|
||||
|
||||
|
||||
100E6
|
||||
|
||||
50e10
|
||||
+100000
|
||||
|
||||
10e10e10e10
|
||||
5.5.5.5
|
||||
@@ -0,0 +1,33 @@
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
|
||||
^ no match for key
|
||||
^ no match for key
|
||||
456K
|
||||
____
|
||||
____
|
||||
4568K
|
||||
_____
|
||||
_____
|
||||
>>>456M
|
||||
____
|
||||
_______
|
||||
6.2G
|
||||
____
|
||||
__________________
|
||||
@@ -0,0 +1,33 @@
|
||||
844K
|
||||
____
|
||||
____
|
||||
981K
|
||||
____
|
||||
____
|
||||
11M
|
||||
___
|
||||
___
|
||||
13M
|
||||
___
|
||||
___
|
||||
14M
|
||||
___
|
||||
___
|
||||
16M
|
||||
___
|
||||
___
|
||||
18M
|
||||
___
|
||||
___
|
||||
19M
|
||||
___
|
||||
___
|
||||
20M
|
||||
___
|
||||
___
|
||||
981T
|
||||
____
|
||||
____
|
||||
20P
|
||||
___
|
||||
___
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
aaa
|
||||
___
|
||||
___
|
||||
BBB
|
||||
___
|
||||
___
|
||||
ccc
|
||||
___
|
||||
___
|
||||
DDD
|
||||
___
|
||||
___
|
||||
eee
|
||||
___
|
||||
___
|
||||
FFF
|
||||
___
|
||||
___
|
||||
ggg
|
||||
___
|
||||
___
|
||||
@@ -0,0 +1,6 @@
|
||||
dd aa ff
|
||||
gg aa cc
|
||||
aa bb cc
|
||||
èè éé èè
|
||||
👩🔬 👩🔬 👩🔬
|
||||
💣💣 💣💣 💣💣
|
||||
@@ -0,0 +1,18 @@
|
||||
dd aa ff
|
||||
_
|
||||
________
|
||||
gg aa cc
|
||||
_
|
||||
________
|
||||
aa bb cc
|
||||
_
|
||||
________
|
||||
èè éé èè
|
||||
_
|
||||
________
|
||||
👩🔬 👩🔬 👩🔬
|
||||
__
|
||||
______________
|
||||
💣💣 💣💣 💣💣
|
||||
__
|
||||
______________
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
aa bb cc
|
||||
dd aa ff
|
||||
gg aa cc
|
||||
èè éé èè
|
||||
💣💣 💣💣 💣💣
|
||||
👩🔬 👩🔬 👩🔬
|
||||
@@ -0,0 +1,3 @@
|
||||
ddxaaxff
|
||||
ggxaaxcc
|
||||
aaxbbxcc
|
||||
@@ -0,0 +1,9 @@
|
||||
ddxaaxff
|
||||
_
|
||||
________
|
||||
ggxaaxcc
|
||||
_
|
||||
________
|
||||
aaxbbxcc
|
||||
_
|
||||
________
|
||||
@@ -0,0 +1,3 @@
|
||||
aaxbbxcc
|
||||
ddxaaxff
|
||||
ggxaaxcc
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user