| // Copyright (C) 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.server.mail.send; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.LIST; |
| import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.PARAGRAPH; |
| import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.PRE_FORMATTED; |
| import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.QUOTE; |
| |
| import java.util.List; |
| import org.junit.Test; |
| |
| public class CommentFormatterTest { |
| private void assertBlock( |
| List<CommentFormatter.Block> list, int index, CommentFormatter.BlockType type, String text) { |
| CommentFormatter.Block block = list.get(index); |
| assertThat(block.type).isEqualTo(type); |
| assertThat(block.text).isEqualTo(text); |
| assertThat(block.items).isNull(); |
| assertThat(block.quotedBlocks).isNull(); |
| } |
| |
| private void assertListBlock( |
| List<CommentFormatter.Block> list, int index, int itemIndex, String text) { |
| CommentFormatter.Block block = list.get(index); |
| assertThat(block.type).isEqualTo(LIST); |
| assertThat(block.items.get(itemIndex)).isEqualTo(text); |
| assertThat(block.text).isNull(); |
| assertThat(block.quotedBlocks).isNull(); |
| } |
| |
| private void assertQuoteBlock(List<CommentFormatter.Block> list, int index, int size) { |
| CommentFormatter.Block block = list.get(index); |
| assertThat(block.type).isEqualTo(QUOTE); |
| assertThat(block.items).isNull(); |
| assertThat(block.text).isNull(); |
| assertThat(block.quotedBlocks).hasSize(size); |
| } |
| |
| @Test |
| public void parseNullAsEmpty() { |
| assertThat(CommentFormatter.parse(null)).isEmpty(); |
| } |
| |
| @Test |
| public void parseEmpty() { |
| assertThat(CommentFormatter.parse("")).isEmpty(); |
| } |
| |
| @Test |
| public void parseSimple() { |
| String comment = "Para1"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PARAGRAPH, comment); |
| } |
| |
| @Test |
| public void parseMultilinePara() { |
| String comment = "Para 1\nStill para 1"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PARAGRAPH, comment); |
| } |
| |
| @Test |
| public void parseParaBreak() { |
| String comment = "Para 1\n\nPara 2\n\nPara 3"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "Para 1"); |
| assertBlock(result, 1, PARAGRAPH, "Para 2"); |
| assertBlock(result, 2, PARAGRAPH, "Para 3"); |
| } |
| |
| @Test |
| public void parseQuote() { |
| String comment = "> Quote text"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertQuoteBlock(result, 0, 1); |
| assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, "Quote text"); |
| } |
| |
| @Test |
| public void parseExcludesEmpty() { |
| String comment = "Para 1\n\n\n\nPara 2"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "Para 1"); |
| assertBlock(result, 1, PARAGRAPH, "Para 2"); |
| } |
| |
| @Test |
| public void parseQuoteLeadSpace() { |
| String comment = " > Quote text"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertQuoteBlock(result, 0, 1); |
| assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, "Quote text"); |
| } |
| |
| @Test |
| public void parseMultiLineQuote() { |
| String comment = "> Quote line 1\n> Quote line 2\n > Quote line 3\n"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertQuoteBlock(result, 0, 1); |
| assertBlock( |
| result.get(0).quotedBlocks, 0, PARAGRAPH, "Quote line 1\nQuote line 2\nQuote line 3\n"); |
| } |
| |
| @Test |
| public void parsePre() { |
| String comment = " Four space indent."; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PRE_FORMATTED, comment); |
| } |
| |
| @Test |
| public void parseOneSpacePre() { |
| String comment = " One space indent.\n Another line."; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PRE_FORMATTED, comment); |
| } |
| |
| @Test |
| public void parseTabPre() { |
| String comment = "\tOne tab indent.\n\tAnother line.\n Yet another!"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PRE_FORMATTED, comment); |
| } |
| |
| @Test |
| public void parseIntermediateLeadingWhitespacePre() { |
| String comment = "No indent.\n\tNonzero indent.\nNo indent again."; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertBlock(result, 0, PRE_FORMATTED, comment); |
| } |
| |
| @Test |
| public void parseStarList() { |
| String comment = "* Item 1\n* Item 2\n* Item 3"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertListBlock(result, 0, 0, "Item 1"); |
| assertListBlock(result, 0, 1, "Item 2"); |
| assertListBlock(result, 0, 2, "Item 3"); |
| } |
| |
| @Test |
| public void parseDashList() { |
| String comment = "- Item 1\n- Item 2\n- Item 3"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertListBlock(result, 0, 0, "Item 1"); |
| assertListBlock(result, 0, 1, "Item 2"); |
| assertListBlock(result, 0, 2, "Item 3"); |
| } |
| |
| @Test |
| public void parseMixedList() { |
| String comment = "- Item 1\n* Item 2\n- Item 3\n* Item 4"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertListBlock(result, 0, 0, "Item 1"); |
| assertListBlock(result, 0, 1, "Item 2"); |
| assertListBlock(result, 0, 2, "Item 3"); |
| assertListBlock(result, 0, 3, "Item 4"); |
| } |
| |
| @Test |
| public void parseMixedBlockTypes() { |
| String comment = |
| "Paragraph\nacross\na\nfew\nlines." |
| + "\n\n" |
| + "> Quote\n> across\n> not many lines." |
| + "\n\n" |
| + "Another paragraph" |
| + "\n\n" |
| + "* Series\n* of\n* list\n* items" |
| + "\n\n" |
| + "Yet another paragraph" |
| + "\n\n" |
| + "\tPreformatted text." |
| + "\n\n" |
| + "Parting words."; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(7); |
| assertBlock(result, 0, PARAGRAPH, "Paragraph\nacross\na\nfew\nlines."); |
| assertQuoteBlock(result, 1, 1); |
| assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, "Quote\nacross\nnot many lines."); |
| assertBlock(result, 2, PARAGRAPH, "Another paragraph"); |
| assertListBlock(result, 3, 0, "Series"); |
| assertListBlock(result, 3, 1, "of"); |
| assertListBlock(result, 3, 2, "list"); |
| assertListBlock(result, 3, 3, "items"); |
| assertBlock(result, 4, PARAGRAPH, "Yet another paragraph"); |
| assertBlock(result, 5, PRE_FORMATTED, "\tPreformatted text."); |
| assertBlock(result, 6, PARAGRAPH, "Parting words."); |
| } |
| |
| @Test |
| public void bulletList1() { |
| String comment = "A\n\n* line 1\n* 2nd line"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertListBlock(result, 1, 0, "line 1"); |
| assertListBlock(result, 1, 1, "2nd line"); |
| } |
| |
| @Test |
| public void bulletList2() { |
| String comment = "A\n\n* line 1\n* 2nd line\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertListBlock(result, 1, 0, "line 1"); |
| assertListBlock(result, 1, 1, "2nd line"); |
| assertBlock(result, 2, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void bulletList3() { |
| String comment = "* line 1\n* 2nd line\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertListBlock(result, 0, 0, "line 1"); |
| assertListBlock(result, 0, 1, "2nd line"); |
| assertBlock(result, 1, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void bulletList4() { |
| String comment = |
| "To see this bug, you have to:\n" // |
| + "* Be on IMAP or EAS (not on POP)\n" // |
| + "* Be very unlucky\n"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "To see this bug, you have to:"); |
| assertListBlock(result, 1, 0, "Be on IMAP or EAS (not on POP)"); |
| assertListBlock(result, 1, 1, "Be very unlucky"); |
| } |
| |
| @Test |
| public void bulletList5() { |
| String comment = |
| "To see this bug,\n" // |
| + "you have to:\n" // |
| + "* Be on IMAP or EAS (not on POP)\n" // |
| + "* Be very unlucky\n"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "To see this bug, you have to:"); |
| assertListBlock(result, 1, 0, "Be on IMAP or EAS (not on POP)"); |
| assertListBlock(result, 1, 1, "Be very unlucky"); |
| } |
| |
| @Test |
| public void dashList1() { |
| String comment = "A\n\n- line 1\n- 2nd line"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertListBlock(result, 1, 0, "line 1"); |
| assertListBlock(result, 1, 1, "2nd line"); |
| } |
| |
| @Test |
| public void dashList2() { |
| String comment = "A\n\n- line 1\n- 2nd line\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertListBlock(result, 1, 0, "line 1"); |
| assertListBlock(result, 1, 1, "2nd line"); |
| assertBlock(result, 2, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void dashList3() { |
| String comment = "- line 1\n- 2nd line\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertListBlock(result, 0, 0, "line 1"); |
| assertListBlock(result, 0, 1, "2nd line"); |
| assertBlock(result, 1, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void preformat1() { |
| String comment = "A\n\n This is pre\n formatted"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertBlock(result, 1, PRE_FORMATTED, " This is pre\n formatted"); |
| } |
| |
| @Test |
| public void preformat2() { |
| String comment = "A\n\n This is pre\n formatted\n\nbut this is not"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertBlock(result, 1, PRE_FORMATTED, " This is pre\n formatted"); |
| assertBlock(result, 2, PARAGRAPH, "but this is not"); |
| } |
| |
| @Test |
| public void preformat3() { |
| String comment = "A\n\n Q\n <R>\n S\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "A"); |
| assertBlock(result, 1, PRE_FORMATTED, " Q\n <R>\n S"); |
| assertBlock(result, 2, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void preformat4() { |
| String comment = " Q\n <R>\n S\n\nB"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertBlock(result, 0, PRE_FORMATTED, " Q\n <R>\n S"); |
| assertBlock(result, 1, PARAGRAPH, "B"); |
| } |
| |
| @Test |
| public void quote1() { |
| String comment = "> I'm happy\n > with quotes!\n\nSee above."; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertQuoteBlock(result, 0, 1); |
| assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, "I'm happy\nwith quotes!"); |
| assertBlock(result, 1, PARAGRAPH, "See above."); |
| } |
| |
| @Test |
| public void quote2() { |
| String comment = "See this said:\n\n > a quoted\n > string block\n\nOK?"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(3); |
| assertBlock(result, 0, PARAGRAPH, "See this said:"); |
| assertQuoteBlock(result, 1, 1); |
| assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, "a quoted\nstring block"); |
| assertBlock(result, 2, PARAGRAPH, "OK?"); |
| } |
| |
| @Test |
| public void nestedQuotes1() { |
| String comment = " > > prior\n > \n > next\n"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(1); |
| assertQuoteBlock(result, 0, 2); |
| assertQuoteBlock(result.get(0).quotedBlocks, 0, 1); |
| assertBlock(result.get(0).quotedBlocks.get(0).quotedBlocks, 0, PARAGRAPH, "prior"); |
| assertBlock(result.get(0).quotedBlocks, 1, PARAGRAPH, "next\n"); |
| } |
| |
| @Test |
| public void largeMixedQuote() { |
| String comment = |
| "> > Paragraph 1.\n" |
| + "> > \n" |
| + "> > > Paragraph 2.\n" |
| + "> > \n" |
| + "> > Paragraph 3.\n" |
| + "> > \n" |
| + "> > pre line 1;\n" |
| + "> > pre line 2;\n" |
| + "> > \n" |
| + "> > Paragraph 4.\n" |
| + "> > \n" |
| + "> > * List item 1.\n" |
| + "> > * List item 2.\n" |
| + "> > \n" |
| + "> > Paragraph 5.\n" |
| + "> \n" |
| + "> Paragraph 6.\n" |
| + "\n" |
| + "Paragraph 7.\n"; |
| List<CommentFormatter.Block> result = CommentFormatter.parse(comment); |
| |
| assertThat(result).hasSize(2); |
| assertQuoteBlock(result, 0, 2); |
| |
| assertQuoteBlock(result.get(0).quotedBlocks, 0, 7); |
| List<CommentFormatter.Block> bigQuote = result.get(0).quotedBlocks.get(0).quotedBlocks; |
| assertBlock(bigQuote, 0, PARAGRAPH, "Paragraph 1."); |
| assertQuoteBlock(bigQuote, 1, 1); |
| assertBlock(bigQuote.get(1).quotedBlocks, 0, PARAGRAPH, "Paragraph 2."); |
| assertBlock(bigQuote, 2, PARAGRAPH, "Paragraph 3."); |
| assertBlock(bigQuote, 3, PRE_FORMATTED, " pre line 1;\n pre line 2;"); |
| assertBlock(bigQuote, 4, PARAGRAPH, "Paragraph 4."); |
| assertListBlock(bigQuote, 5, 0, "List item 1."); |
| assertListBlock(bigQuote, 5, 1, "List item 2."); |
| assertBlock(bigQuote, 6, PARAGRAPH, "Paragraph 5."); |
| assertBlock(result.get(0).quotedBlocks, 1, PARAGRAPH, "Paragraph 6."); |
| assertBlock(result, 1, PARAGRAPH, "Paragraph 7.\n"); |
| } |
| } |