|
5 | 5 | // spell-checker:ignore (ToDO) Sdivide |
6 | 6 |
|
7 | 7 | use chrono::{DateTime, Duration, Utc}; |
| 8 | +use regex::Regex; |
8 | 9 | use std::fs::metadata; |
9 | 10 | use uutests::new_ucmd; |
10 | 11 | use uutests::util::UCommand; |
@@ -78,21 +79,22 @@ fn test_with_numbering_option_with_number_width() { |
78 | 79 |
|
79 | 80 | #[test] |
80 | 81 | fn test_with_long_header_option() { |
81 | | - let test_file_path = "test_one_page.log"; |
82 | | - let expected_test_file_path = "test_one_page_header.log.expected"; |
83 | | - let header = "new file"; |
84 | | - for args in [&["-h", header][..], &["--header=new file"][..]] { |
85 | | - let mut scenario = new_ucmd!(); |
86 | | - let value = file_last_modified_time(&scenario, test_file_path); |
87 | | - scenario |
88 | | - .args(args) |
89 | | - .arg(test_file_path) |
90 | | - .succeeds() |
91 | | - .stdout_is_templated_fixture( |
92 | | - expected_test_file_path, |
93 | | - &[("{last_modified_time}", &value), ("{header}", header)], |
94 | | - ); |
95 | | - } |
| 82 | + let whitespace = " ".repeat(21); |
| 83 | + let blank_lines = "\n".repeat(61); |
| 84 | + let datetime_pattern = r"\d\d\d\d-\d\d-\d\d \d\d:\d\d"; |
| 85 | + let pattern = |
| 86 | + format!("\n\n{datetime_pattern}{whitespace}new file{whitespace}Page 1\n\n\na{blank_lines}"); |
| 87 | + let regex = Regex::new(&pattern).unwrap(); |
| 88 | + new_ucmd!() |
| 89 | + .args(&["-h", "new file"]) |
| 90 | + .pipe_in("a") |
| 91 | + .succeeds() |
| 92 | + .stdout_matches(®ex); |
| 93 | + new_ucmd!() |
| 94 | + .args(&["--header=new file"]) |
| 95 | + .pipe_in("a") |
| 96 | + .succeeds() |
| 97 | + .stdout_matches(®ex); |
96 | 98 | } |
97 | 99 |
|
98 | 100 | #[test] |
@@ -400,99 +402,92 @@ fn test_with_offset_space_option() { |
400 | 402 |
|
401 | 403 | #[test] |
402 | 404 | fn test_with_date_format() { |
403 | | - let test_file_path = "test_one_page.log"; |
404 | | - let expected_test_file_path = "test_one_page.log.expected"; |
405 | | - let mut scenario = new_ucmd!(); |
406 | | - let value = file_last_modified_time_format(&scenario, test_file_path, "%Y__%s"); |
407 | | - scenario |
408 | | - .args(&[test_file_path, "-D", "%Y__%s"]) |
| 405 | + let whitespace = " ".repeat(50); |
| 406 | + let blank_lines = "\n".repeat(61); |
| 407 | + let datetime_pattern = r"\d{4}__\d{10}"; |
| 408 | + let pattern = format!("\n\n{datetime_pattern}{whitespace}Page 1\n\n\na{blank_lines}"); |
| 409 | + let regex = Regex::new(&pattern).unwrap(); |
| 410 | + new_ucmd!() |
| 411 | + .args(&["-D", "%Y__%s"]) |
| 412 | + .pipe_in("a") |
409 | 413 | .succeeds() |
410 | | - .stdout_is_templated_fixture(expected_test_file_path, &[("{last_modified_time}", &value)]); |
| 414 | + .stdout_matches(®ex); |
411 | 415 |
|
412 | 416 | // "Format" doesn't need to contain any replaceable token. |
| 417 | + let whitespace = " ".repeat(60); |
| 418 | + let blank_lines = "\n".repeat(61); |
413 | 419 | new_ucmd!() |
414 | | - .args(&[test_file_path, "-D", "Hello!"]) |
| 420 | + .args(&["-D", "Hello!"]) |
| 421 | + .pipe_in("a") |
415 | 422 | .succeeds() |
416 | | - .stdout_is_templated_fixture( |
417 | | - expected_test_file_path, |
418 | | - &[("{last_modified_time}", "Hello!")], |
419 | | - ); |
| 423 | + .stdout_only(format!("\n\nHello!{whitespace}Page 1\n\n\na{blank_lines}")); |
420 | 424 |
|
421 | 425 | // Long option also works |
422 | 426 | new_ucmd!() |
423 | | - .args(&[test_file_path, "--date-format=Hello!"]) |
| 427 | + .args(&["--date-format=Hello!"]) |
| 428 | + .pipe_in("a") |
424 | 429 | .succeeds() |
425 | | - .stdout_is_templated_fixture( |
426 | | - expected_test_file_path, |
427 | | - &[("{last_modified_time}", "Hello!")], |
428 | | - ); |
| 430 | + .stdout_only(format!("\n\nHello!{whitespace}Page 1\n\n\na{blank_lines}")); |
429 | 431 |
|
430 | 432 | // Option takes precedence over environment variables |
431 | 433 | new_ucmd!() |
432 | 434 | .env("POSIXLY_CORRECT", "1") |
433 | 435 | .env("LC_TIME", "POSIX") |
434 | | - .args(&[test_file_path, "-D", "Hello!"]) |
| 436 | + .args(&["--date-format=Hello!"]) |
| 437 | + .pipe_in("a") |
435 | 438 | .succeeds() |
436 | | - .stdout_is_templated_fixture( |
437 | | - expected_test_file_path, |
438 | | - &[("{last_modified_time}", "Hello!")], |
439 | | - ); |
| 439 | + .stdout_only(format!("\n\nHello!{whitespace}Page 1\n\n\na{blank_lines}")); |
440 | 440 | } |
441 | 441 |
|
442 | 442 | #[test] |
443 | 443 | fn test_with_date_format_env() { |
444 | | - const POSIXLY_FORMAT: &str = "%b %e %H:%M %Y"; |
445 | | - |
446 | 444 | // POSIXLY_CORRECT + LC_ALL/TIME=POSIX uses "%b %e %H:%M %Y" date format |
447 | | - let test_file_path = "test_one_page.log"; |
448 | | - let expected_test_file_path = "test_one_page.log.expected"; |
449 | | - let mut scenario = new_ucmd!(); |
450 | | - let value = file_last_modified_time_format(&scenario, test_file_path, POSIXLY_FORMAT); |
451 | | - scenario |
| 445 | + let whitespace = " ".repeat(49); |
| 446 | + let blank_lines = "\n".repeat(61); |
| 447 | + let datetime_pattern = r"[A-Z][a-z][a-z] [ \d]\d \d\d:\d\d \d{4}"; |
| 448 | + let pattern = format!("\n\n{datetime_pattern}{whitespace}Page 1\n\n\na{blank_lines}"); |
| 449 | + let regex = Regex::new(&pattern).unwrap(); |
| 450 | + new_ucmd!() |
452 | 451 | .env("POSIXLY_CORRECT", "1") |
453 | 452 | .env("LC_ALL", "POSIX") |
454 | | - .args(&[test_file_path]) |
| 453 | + .pipe_in("a") |
455 | 454 | .succeeds() |
456 | | - .stdout_is_templated_fixture(expected_test_file_path, &[("{last_modified_time}", &value)]); |
457 | | - |
458 | | - let mut scenario = new_ucmd!(); |
459 | | - let value = file_last_modified_time_format(&scenario, test_file_path, POSIXLY_FORMAT); |
460 | | - scenario |
| 455 | + .stdout_matches(®ex); |
| 456 | + new_ucmd!() |
461 | 457 | .env("POSIXLY_CORRECT", "1") |
462 | 458 | .env("LC_TIME", "POSIX") |
463 | | - .args(&[test_file_path]) |
| 459 | + .pipe_in("a") |
464 | 460 | .succeeds() |
465 | | - .stdout_is_templated_fixture(expected_test_file_path, &[("{last_modified_time}", &value)]); |
| 461 | + .stdout_matches(®ex); |
466 | 462 |
|
467 | 463 | // But not if POSIXLY_CORRECT/LC_ALL is something else. |
468 | | - let mut scenario = new_ucmd!(); |
469 | | - let value = file_last_modified_time_format(&scenario, test_file_path, DATE_TIME_FORMAT_DEFAULT); |
470 | | - scenario |
| 464 | + let whitespace = " ".repeat(50); |
| 465 | + let datetime_pattern = r"\d\d\d\d-\d\d-\d\d \d\d:\d\d"; |
| 466 | + let pattern = format!("\n\n{datetime_pattern}{whitespace}Page 1\n\n\na{blank_lines}"); |
| 467 | + let regex = Regex::new(&pattern).unwrap(); |
| 468 | + new_ucmd!() |
471 | 469 | .env("LC_TIME", "POSIX") |
472 | | - .args(&[test_file_path]) |
| 470 | + .pipe_in("a") |
473 | 471 | .succeeds() |
474 | | - .stdout_is_templated_fixture(expected_test_file_path, &[("{last_modified_time}", &value)]); |
475 | | - |
476 | | - let mut scenario = new_ucmd!(); |
477 | | - let value = file_last_modified_time_format(&scenario, test_file_path, DATE_TIME_FORMAT_DEFAULT); |
478 | | - scenario |
| 472 | + .stdout_matches(®ex); |
| 473 | + new_ucmd!() |
479 | 474 | .env("POSIXLY_CORRECT", "1") |
480 | 475 | .env("LC_TIME", "C") |
481 | | - .args(&[test_file_path]) |
| 476 | + .pipe_in("a") |
482 | 477 | .succeeds() |
483 | | - .stdout_is_templated_fixture(expected_test_file_path, &[("{last_modified_time}", &value)]); |
| 478 | + .stdout_matches(®ex); |
484 | 479 | } |
485 | 480 |
|
486 | 481 | #[test] |
487 | 482 | fn test_with_pr_core_utils_tests() { |
488 | 483 | let test_cases = vec![ |
489 | 484 | ("", vec!["0Ft"], vec!["0F"], 0), |
490 | | - ("", vec!["0Fnt"], vec!["0F"], 0), |
| 485 | + ("", vec!["0Fnt"], vec!["0Fnt-expected"], 0), |
491 | 486 | ("+3", vec!["0Ft"], vec!["3-0F"], 0), |
492 | 487 | ("+3 -f", vec!["0Ft"], vec!["3f-0F"], 0), |
493 | 488 | ("-a -3", vec!["0Ft"], vec!["a3-0F"], 0), |
494 | 489 | ("-a -3 -f", vec!["0Ft"], vec!["a3f-0F"], 0), |
495 | | - ("-a -3 -f", vec!["0Fnt"], vec!["a3f-0F"], 0), |
| 490 | + ("-a -3 -f", vec!["0Fnt"], vec!["a3f-0Fnt-expected"], 0), |
496 | 491 | ("+3 -a -3 -f", vec!["0Ft"], vec!["3a3f-0F"], 0), |
497 | 492 | ("-l 24", vec!["FnFn"], vec!["l24-FF"], 0), |
498 | 493 | ("-W 20 -l24 -f", vec!["tFFt-ll"], vec!["W20l24f-ll"], 0), |
@@ -622,3 +617,13 @@ fn test_b_flag_backwards_compat() { |
622 | 617 | // -b is a no-op for backwards compatibility (column-down is now the default) |
623 | 618 | new_ucmd!().args(&["-b", "-t"]).pipe_in("a\nb\n").succeeds(); |
624 | 619 | } |
| 620 | + |
| 621 | +#[test] |
| 622 | +fn test_page_header_width() { |
| 623 | + let whitespace = " ".repeat(50); |
| 624 | + let blank_lines = "\n".repeat(61); |
| 625 | + let datetime_pattern = r"\d\d\d\d-\d\d-\d\d \d\d:\d\d"; |
| 626 | + let pattern = format!("\n\n{datetime_pattern}{whitespace}Page 1\n\n\na{blank_lines}"); |
| 627 | + let regex = Regex::new(&pattern).unwrap(); |
| 628 | + new_ucmd!().pipe_in("a").succeeds().stdout_matches(®ex); |
| 629 | +} |
0 commit comments