use indoc::indoc; use mit_commit::{ Bodies, Body, Comment, Comments, CommitMessage, Fragment, Scissors, Subject, Trailer, Trailers, }; const COMMIT_WITH_ALL_FEATURES: &str = indoc!( " Add file Looks-like-a-trailer: But isn't This adds file primarily for demonstration purposes. It might not be useful as an actual commit, but it's very useful as a example to use in tests. Relates-to: #128 # Short (50 chars or less) summary of changes # # More detailed explanatory text, if necessary. Wrap it to # about 72 characters or so. In some contexts, the first # line is treated as the subject of an email and the rest of # the text as the body. The blank line separating the # summary from the body is critical (unless you omit the body # entirely); tools like rebase can get confused if you run # the two together. # # Further paragraphs come after blank lines. # # - Bullet points are okay, too # # - Typically a hyphen or asterisk is used for the bullet, # preceded by a single space, with blank lines in # between, but conventions vary here # Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen, # die mit '#' beginnen, werden ignoriert, und eine leere Beschreibung # bricht den Commit ab. # # Auf Branch main # Ihr Branch ist auf demselben Stand wie 'origin/main'. # # Zum Commit vorgemerkte \u{00E4}nderungen: # neue Datei: file # # ------------------------ >8 ------------------------ # \u{00E4}ndern oder entfernen Sie nicht die obige Zeile. # Alles unterhalb von ihr wird ignoriert. diff --git a/file b/file new file mode 100644 index 0000000..e69de29 " ); #[test] fn can_reliably_parse_from_commit_with_all_features() { let first_commit_message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); let string_version_of_commit = String::from(first_commit_message.clone()); let second_commit_message = CommitMessage::from(string_version_of_commit.clone()); assert_eq!(string_version_of_commit, COMMIT_WITH_ALL_FEATURES); assert_eq!(first_commit_message, second_commit_message); } #[test] fn can_get_comment_character_with_all_features() { let commit_character = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!(commit_character.get_comment_char().unwrap(), '#'); } #[test] fn can_get_ast_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); let ast: Vec = vec![ Fragment::Body(Body::from("Add file")), Fragment::Body(Body::default()), Fragment::Body(Body::from("Looks-like-a-trailer: But isn\'t")), Fragment::Body(Body::default()), Fragment::Body(Body::from("This adds file primarily for demonstration purposes. It might not be\nuseful as an actual commit, but it\'s very useful as a example to use in\ntests.")), Fragment::Body(Body::default()), Fragment::Body(Body::from("Relates-to: #128")), Fragment::Body(Body::default()), Fragment::Comment(Comment::from("# Short (50 chars or less) summary of changes\n#\n# More detailed explanatory text, if necessary. Wrap it to\n# about 72 characters or so. In some contexts, the first\n# line is treated as the subject of an email and the rest of\n# the text as the body. The blank line separating the\n# summary from the body is critical (unless you omit the body\n# entirely); tools like rebase can get confused if you run\n# the two together.\n#\n# Further paragraphs come after blank lines.\n#\n# - Bullet points are okay, too\n#\n# - Typically a hyphen or asterisk is used for the bullet,\n# preceded by a single space, with blank lines in\n# between, but conventions vary here")), Fragment::Body(Body::default()), Fragment::Comment(Comment::from("# Bitte geben Sie eine Commit-Beschreibung f\u{fc}r Ihre \u{e4}nderungen ein. Zeilen,\n# die mit \'#\' beginnen, werden ignoriert, und eine leere Beschreibung\n# bricht den Commit ab.\n#\n# Auf Branch main\n# Ihr Branch ist auf demselben Stand wie \'origin/main\'.\n#\n# Zum Commit vorgemerkte \u{e4}nderungen:\n#\tneue Datei: file\n#")), ]; assert_eq!(message.get_ast(), ast); } #[test] fn can_get_subject_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!(message.get_subject(), Subject::from("Add file")); } #[test] fn can_get_body_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!( message.get_body(), Bodies::from(vec![ Body::default(), Body::from("Looks-like-a-trailer: But isn't"), Body::default(), Body::from(indoc!( " This adds file primarily for demonstration purposes. It might not be useful as an actual commit, but it's very useful as a example to use in tests." )), ]) ); } #[test] fn can_get_scissors_section_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!( message.get_scissors(), Some(Scissors::from(indoc!( " # ------------------------ >8 ------------------------ # \u{00E4}ndern oder entfernen Sie nicht die obige Zeile. # Alles unterhalb von ihr wird ignoriert. diff --git a/file b/file new file mode 100644 index 0000000..e69de29 " ))) ); } #[test] fn can_get_comments_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!( message.get_comments(), Comments::from(vec![ Comment::from(indoc!( " # Short (50 chars or less) summary of changes # # More detailed explanatory text, if necessary. Wrap it to # about 72 characters or so. In some contexts, the first # line is treated as the subject of an email and the rest of # the text as the body. The blank line separating the # summary from the body is critical (unless you omit the body # entirely); tools like rebase can get confused if you run # the two together. # # Further paragraphs come after blank lines. # # - Bullet points are okay, too # # - Typically a hyphen or asterisk is used for the bullet, # preceded by a single space, with blank lines in # between, but conventions vary here" )), Comment::from(indoc!( " # Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen, # die mit '#' beginnen, werden ignoriert, und eine leere Beschreibung # bricht den Commit ab. # # Auf Branch main # Ihr Branch ist auf demselben Stand wie 'origin/main'. # # Zum Commit vorgemerkte \u{00E4}nderungen: # neue Datei: file #" )), ]) ); } #[test] fn can_get_trailers_from_commit_with_all_features() { let message = CommitMessage::from(COMMIT_WITH_ALL_FEATURES); assert_eq!( message.get_trailers(), Trailers::from(vec![Trailer::new("Relates-to".into(), "#128".into())]) ); }