1 /// tests cases ported over from python standard library
2 use textwrap::{dedent, indent};
3
4 const ROUNDTRIP_CASES: [&str; 3] = [
5 // basic test case
6 "Hi.\nThis is a test.\nTesting.",
7 // include a blank line
8 "Hi.\nThis is a test.\n\nTesting.",
9 // include leading and trailing blank lines
10 "\nHi.\nThis is a test.\nTesting.\n",
11 ];
12
13 const WINDOWS_CASES: [&str; 2] = [
14 // use windows line endings
15 "Hi.\r\nThis is a test.\r\nTesting.",
16 // pathological case
17 "Hi.\r\nThis is a test.\n\r\nTesting.\r\n\n",
18 ];
19
20 #[test]
test_indent_nomargin_default()21 fn test_indent_nomargin_default() {
22 // indent should do nothing if 'prefix' is empty.
23 for text in ROUNDTRIP_CASES.iter() {
24 assert_eq!(&indent(text, ""), text);
25 }
26 for text in WINDOWS_CASES.iter() {
27 assert_eq!(&indent(text, ""), text);
28 }
29 }
30
31 #[test]
test_roundtrip_spaces()32 fn test_roundtrip_spaces() {
33 // A whitespace prefix should roundtrip with dedent
34 for text in ROUNDTRIP_CASES.iter() {
35 assert_eq!(&dedent(&indent(text, " ")), text);
36 }
37 }
38
39 #[test]
test_roundtrip_tabs()40 fn test_roundtrip_tabs() {
41 // A whitespace prefix should roundtrip with dedent
42 for text in ROUNDTRIP_CASES.iter() {
43 assert_eq!(&dedent(&indent(text, "\t\t")), text);
44 }
45 }
46
47 #[test]
test_roundtrip_mixed()48 fn test_roundtrip_mixed() {
49 // A whitespace prefix should roundtrip with dedent
50 for text in ROUNDTRIP_CASES.iter() {
51 assert_eq!(&dedent(&indent(text, " \t \t ")), text);
52 }
53 }
54
55 #[test]
test_indent_default()56 fn test_indent_default() {
57 // Test default indenting of lines that are not whitespace only
58 let prefix = " ";
59 let expected = [
60 // Basic test case
61 " Hi.\n This is a test.\n Testing.",
62 // Include a blank line
63 " Hi.\n This is a test.\n\n Testing.",
64 // Include leading and trailing blank lines
65 "\n Hi.\n This is a test.\n Testing.\n",
66 ];
67 for (text, expect) in ROUNDTRIP_CASES.iter().zip(expected.iter()) {
68 assert_eq!(&indent(text, prefix), expect)
69 }
70 let expected = [
71 // Use Windows line endings
72 " Hi.\r\n This is a test.\r\n Testing.",
73 // Pathological case
74 " Hi.\r\n This is a test.\n\r\n Testing.\r\n\n",
75 ];
76 for (text, expect) in WINDOWS_CASES.iter().zip(expected.iter()) {
77 assert_eq!(&indent(text, prefix), expect)
78 }
79 }
80
81 #[test]
indented_text_should_have_the_same_number_of_lines_as_the_original_text()82 fn indented_text_should_have_the_same_number_of_lines_as_the_original_text() {
83 let texts = ["foo\nbar", "foo\nbar\n", "foo\nbar\nbaz"];
84 for original in texts.iter() {
85 let indented = indent(original, "");
86 assert_eq!(&indented, original);
87 }
88 }
89