content: /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you 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 org.apache.chemistry.opencmis.inmemory.content.loremipsum;
  
  import static org.junit.Assert.assertArrayEquals;
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  import static org.junit.Assert.fail;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.Reader;
  import java.io.StringWriter;
  
  import org.apache.chemistry.opencmis.inmemory.content.loremipsum.LoremIpsum;
  import org.junit.After;
  import org.junit.Before;
  import org.junit.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  public class LoremIpsumTest {
  
      private static final Logger LOG = LoggerFactory.getLogger(LoremIpsumTest.class);
  
      String sample = "One two three four five six. Seven eight nine ten eleven twelve. " + "\n\n"
              + "Thirteen fourteen fifteen sixteen. Seventeen eighteen nineteen twenty.";
  
      String dictionary = "a bb ccc dddd eeeee ffffff ggggggg hhhhhhhh iiiiiiiii jjjjjjjjjj kkkkkkkkkkk llllllllllll";
      LoremIpsum generator = new LoremIpsum(sample, dictionary);
  
      @Before
      public void setUp() throws Exception {
          // dictionary.split(" ");
      }
  
      @After
      public void tearDown() throws Exception {
      }
  
      @Test
      public void test_mean() {
          int[] ia1 = { 1, 2, 3, 4 };
          assertEquals(2.5d, LoremIpsum.mean(ia1), 0.01d);
          int[] ia2 = { 6, 6, 4, 4 };
          assertEquals(5.0d, LoremIpsum.mean(ia2), 0.01d);
      }
  
      @Test
      public void test_mean_empty() {
          int[] ia1 = {};
          assertEquals(0.0d, LoremIpsum.mean(ia1), 0.01d);
      }
  
      @Test
      public void test_variance() {
          double[] ia1 = { 6.0d, 6.0d, 4.0d, 4.0d };
          assertEquals(1.0d, LoremIpsum.variance(ia1), 0.01d);
          double[] ia2 = { 1.0d, 2.0d, 3.0d, 4.0d };
          assertEquals(1.25d, LoremIpsum.variance(ia2), 0.01d);
      }
  
      @Test
      public void test_sigma() {
          double[] ia1 = { 6.0d, 6.0d, 4.0d, 4.0d };
          double[] ia2 = { 1.0d, 2.0d, 3.0d, 4.0d };
          assertEquals(1.0d, LoremIpsum.sigma(ia1), 0.01d);
          assertEquals(Math.sqrt(1.25), LoremIpsum.sigma(ia2), 0.01d);
      }
  
      @Test
      public void test_sigma_empty() {
          int[] ia1 = {};
          assertEquals(0.0d, LoremIpsum.sigma(ia1), 0.01d);
      }
  
      @Test
      public void test_split_sentences() {
          String[] sentences1 = { "Hello", "Hi" };
          assertArrayEquals(sentences1, LoremIpsum.splitSentences("Hello. Hi."));
          String[] sentences2 = { "One two three four five six", "Seven eight nine ten eleven twelve",
                  "Thirteen fourteen fifteen sixteen", "Seventeen eighteen nineteen twenty" };
          assertArrayEquals(sentences2, LoremIpsum.splitSentences(sample));
      }
  
      @Test
      public void test_split_sentences_empty() {
          String[] sentences = {};
          assertArrayEquals(sentences, LoremIpsum.splitSentences(""));
      }
  
      @Test
      public void test_split_sentences_trailing() {
          String[] sentences1 = { "Hello", "Hi", "Hello" };
          assertArrayEquals(sentences1, LoremIpsum.splitSentences("Hello. Hi. Hello"));
          String[] sentences2 = { "Hello", "Hi", "Hello" };
          assertArrayEquals(sentences2, LoremIpsum.splitSentences("  Hello. Hi. Hello  "));
          String[] sentences3 = { "Hello", "Hi", "Hello" };
          assertArrayEquals(sentences3, LoremIpsum.splitSentences("..  Hello... Hi.... Hello  "));
      }
  
      @Test
      public void test_split_paragraphs() {
          String[] paragraphs = { "One two three four five six. Seven eight nine ten eleven twelve.",
                  "Thirteen fourteen fifteen sixteen. Seventeen eighteen nineteen twenty." };
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs(sample));
      }
  
      @Test
      public void test_split_paragraphs_empty() {
          String[] paragraphs = {};
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs(""));
      }
  
      @Test
      public void test_split_paragraphs_trailing() {
          String[] paragraphs = { "Hello", "Hi" };
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("Hello\n\nHi"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("Hello\n\nHi\n"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("Hello\n\nHi\n\n"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("Hello\n\nHi\n\n\n"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("Hello\n\nHi\n\n\n\n\n\n"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("\nHello\n\nHi"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("\n\nHello\n\nHi"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("\n\n\nHello\n\nHi"));
          assertArrayEquals(paragraphs, LoremIpsum.splitParagraphs("\n\n\n\n\n\nHello\n\nHi"));
      }
  
      @Test
      public void test_split_words() {
          String[] words = { "One", "two", "three", "four" };
          assertArrayEquals(words, LoremIpsum.splitWords("One two three four"));
          assertArrayEquals(words, LoremIpsum.splitWords("  One    two  three  four   "));
      }
  
      @Test
      public void test_split_words_empty() {
          String[] words = {};
          assertArrayEquals(words, LoremIpsum.splitWords(""));
      }
  
      @Test
      public void test_choose_closest() {
          Integer[] intArray1 = { 1, 2, 3, 4 };
          assertEquals(1, LoremIpsum.chooseClosest(intArray1, 1));
          Integer[] intArray2 = { 1, 2, 3, 4 };
          assertEquals(4, LoremIpsum.chooseClosest(intArray2, 4));
          assertEquals(4, LoremIpsum.chooseClosest(intArray2, 20));
          assertEquals(1, LoremIpsum.chooseClosest(intArray2, -10));
          Integer[] intArray3 = { 1, 4 };
          assertEquals(1, LoremIpsum.chooseClosest(intArray3, 2));
          assertEquals(4, LoremIpsum.chooseClosest(intArray3, 3));
          Integer[] intArray4 = { 1, 3 };
          assertEquals(1, LoremIpsum.chooseClosest(intArray4, 2));
          Integer[] intArray5 = { 3, 1 };
          assertEquals(3, LoremIpsum.chooseClosest(intArray5, 2));
          Integer[] intArray6 = { 1 };
          assertEquals(1, LoremIpsum.chooseClosest(intArray6, 200));
      }
  
      @Test
      public void test_sentence_mean() {
          assertEquals(5.0d, generator.getSentenceMean(), 0.01d);
      }
  
      @Test
      public void test_paragraph_mean() {
          assertEquals(2.0d, generator.getParagraphMean(), 0.01d);
      }
  
      @Test
      public void test_sentence_sigma() {
          assertEquals(1.0d, generator.getSentenceSigma(), 0.01d);
      }
  
      @Test
      public void test_paragraph_sigma() {
          assertEquals(0.0d, generator.getParagraphSigma(), 0.01d);
      }
  
      @Test
      public void test_sample() {
          assertEquals(generator.getSample(), sample);
      }
  
      @Test
      public void test_dictionary() {
          assertEquals(generator.getDictionary(), dictionary);
      }
  
      @Test
      public void test_set_dictionary() {
          String newdict = "a b c";
          generator.setDictionary(newdict);
          assertEquals(generator.getDictionary(), newdict);
      }
  
      @Test
      public void test_init_no_sample() {
          doGenerate("");
          doGenerate(" ");
          doGenerate("\n\n");
          doGenerate("  \n\n  ");
          doGenerate(" .\n\n .");
      }
  
      private void doGenerate(String text) {
          try {
              generator = new LoremIpsum(text, dictionary);
              generator.generateParagraph(false);
              fail("Sample text " + text + " should generate exception.");
          } catch (RuntimeException e) {
              assertTrue(e.getMessage().contains("Invalid sample text"));
          }
      }
  
      @Test
      public void test_init_no_dict() {
          doGenerateNoDict("");
          doGenerateNoDict(" ");
          doGenerateNoDict("\n\n");
          doGenerateNoDict("  \n\n  ");
      }
  
      private void doGenerateNoDict(String dict) {
          try {
              generator = new LoremIpsum(sample, dict);
              generator.generateParagraph(false);
              fail("Dictionary " + dict + " should generate exception.");
          } catch (RuntimeException e) {
              assertEquals(e.getMessage(), "Invalid dictionary.");
          }
      }
  
      @Test
      public void testGenerate() {
          LOG.debug("Generate new text: ");
          String newDict = "me you he the One two three four five six Seven eight nine ten eleven twelve "
                  + "Thirteen fourteen fifteen sixteen Seventeen eighteen nineteen twenty joe fred some";
          String[] newParagraphs = new String[4];
          generator.setDictionary(newDict);
          for (int i = 0; i < newParagraphs.length; i++) {
              newParagraphs[i] = generator.generateParagraph(false);
              LOG.debug(newParagraphs[i]);
              LOG.debug("");
          }
          assertFalse(newParagraphs[0].equals(newParagraphs[1]));
          assertFalse(newParagraphs[0].equals(newParagraphs[2]));
          assertFalse(newParagraphs[0].equals(newParagraphs[3]));
          assertFalse(newParagraphs[1].equals(newParagraphs[2]));
          assertFalse(newParagraphs[1].equals(newParagraphs[3]));
          assertFalse(newParagraphs[2].equals(newParagraphs[3]));
      }
  
      @Test
      public void testGenerateLoreIpsum() {
          LOG.debug("Generate new Lore Ipsum text: ");
          LoremIpsum ipsum = new LoremIpsum();
          String[] newParagraphs = new String[4];
          for (int i = 0; i < newParagraphs.length; i++) {
              newParagraphs[i] = ipsum.generateParagraph(false);
              LOG.debug(newParagraphs[i]);
              LOG.debug("");
              LOG.debug("");
          }
      }
  
      @Test
      public void testGenerateLoreIpsumHtml1() {
          LOG.debug("Generate new Lore Ipsum as html paragraphs:");
          LoremIpsum ipsum = new LoremIpsum();
          String output = ipsum.generateParagraphsHtml(2048, true);
          LOG.debug(output);
          LOG.debug("");
      }
  
      @Test
      public void testGenerateLoreIpsumHtml2() {
          LOG.debug("Generate new Lore Ipsum as one html paragraph:");
          LoremIpsum ipsum = new LoremIpsum();
          String output = ipsum.generateOneParagraphHtml(2048, true);
          LOG.debug(output);
          LOG.debug("");
      }
  
      @Test
      public void testGenerateLoreIpsumHtml3() {
          LOG.debug("Generate new Lore Ipsum as full html document: ");
          LoremIpsum ipsum = new LoremIpsum();
          String output = ipsum.generateParagraphsFullHtml(2048, true);
          LOG.debug(output);
          LOG.debug("");
      }
  
      @Test
      public void testGenerateLoreIpsumPlainText() {
          LOG.debug("Generate new Lore Ipsum as plain text: ");
          LoremIpsum ipsum = new LoremIpsum();
          String output = ipsum.generateParagraphsPlainText(2048, true);
          LOG.debug(output);
          LOG.debug("");
      }
  
      @Test
      public void testGenerateLoreIpsumPlainTextFormatted() {
          LOG.debug("Generate new Lore Ipsum as plain text with 60 columns: ");
          LoremIpsum ipsum = new LoremIpsum();
          String output = ipsum.generateParagraphsPlainText(256, 60, false);
          LOG.debug(output);
          LOG.debug("");
      }
  
      @Test
      public void testGenerateLoreIpsumHtml1Writer() throws IOException {
          LOG.debug("Generate new Lore Ipsum as html paragraphs with PrintWriter:");
          LoremIpsum ipsum = new LoremIpsum();
          StringWriter writer = new StringWriter();
          ipsum.generateParagraphsHtml(writer, 2048, true);
          LOG.debug(writer.toString());
          LOG.debug("End Test.");
      }
  
      @Test
      public void testGenerateLoreIpsumHtml2Writer() throws IOException {
          LOG.debug("Generate new Lore Ipsum as full html paragraph with PrintWriter:");
          LoremIpsum ipsum = new LoremIpsum();
          StringWriter writer = new StringWriter();
          ipsum.generateParagraphsFullHtml(writer, 2048, true);
          LOG.debug(writer.toString());
          LOG.debug("End Test.");
      }
  
      @Test
      public void testGenerateLoreIpsumPlainTextWriter() throws IOException {
          LOG.debug("Generate new Lore Ipsum as plain text with PrintWriter: ");
          LoremIpsum ipsum = new LoremIpsum();
          StringWriter writer = new StringWriter();
          ipsum.generateParagraphsPlainText(writer, 2048, true);
          LOG.debug(writer.toString());
          LOG.debug("End Test.");
      }
  
      @Test
      public void testGenerateLoreIpsumPlainTextFormattedWriter() throws IOException {
          LOG.debug("Generate new Lore Ipsum as plain text with 60 columns with PrintWriter: ");
          LoremIpsum ipsum = new LoremIpsum();
          StringWriter writer = new StringWriter();
          ipsum.generateParagraphsPlainText(writer, 256, 60, false);
          LOG.debug(writer.toString());
          LOG.debug("End Test.");
      }
  
      @Test
      public void testGenerateLoreIpsumGerman() throws Exception {
          LOG.debug("Generate new Lore Ipsum Ferry Tale: ");
          InputStream is = this.getClass().getResourceAsStream("/Apache-License-2.0.txt");
  
          // read stream into a string
          final char[] buffer = new char[0x10000];
          StringBuilder sample = new StringBuilder();
          Reader in = new InputStreamReader(is, "ISO-8859-1");
          int read;
          do {
              read = in.read(buffer, 0, buffer.length);
              if (read > 0) {
                  sample.append(buffer, 0, read);
              }
          } while (read >= 0);
  
          LoremIpsum ipsum = new LoremIpsum(sample.toString());
          String output = ipsum.generateParagraphsPlainText(4096, 80, false);
          LOG.debug(output);
          LOG.debug("End Test.");
      }
  
  }
  