Package org.freeplane.features.format

Source Code of org.freeplane.features.format.PatternFormatTest

/*
*  Freeplane - mind map editor
*  Copyright (C) 2011 Volker Boerchers
*
*  This file author is Volker Boerchers
*
*  This program is free software: you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation, either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.features.format;

import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.freeplane.core.util.HtmlUtils;
import org.freeplane.features.format.PatternFormat;
import org.junit.Test;

/**
* @author Volker Boerchers
*/
public class PatternFormatTest {
  private static final String HTML_BODY_INDENT = "    ";
  private static final ArrayList<String> singlePatterns = toList("e = %+10.4f" //
      , "Amount gained or lost since last statement: $ %(,.2f" //
      , "Local time: %tT" //
  );
  private static final ArrayList<String> multiPatterns = toList("%tH:%tM" //
      , "%tH:%tM:%tS" //
      , "%tI:%tM:%tS %Tp" //
      , "%tm/%td/%ty" //
      , "%tY-%tm-%td" //
      , "%ta %tb %td %tT %tZ %tY" //
  // , "Duke's Birthday: %1$tm %1$te,%1$tY" // in principle this could work
  // , "Duke's Birthday: %1$tm %<$te,%<$tY" // in principle this could work
  );
  private static final ArrayList<String> parameterizedPatterns = toList("%3$2s" //
          + "%2$2s" //
          + "%1$2s" //
  , "Unable to open file '%1$s':" //
      , "Duke's Birthday: %1$tm" //
      , "Duke's Birthday: %1$te" //
      , "Duke's Birthday: %1$tY" //
  );
  static {
    for (String pattern : multiPatterns) {
      final String[] fragments = pattern.split("(?=%)");
      for (String string : fragments) {
        if (string.contains("%"))
          singlePatterns.add(string);
      }
    }
  }

  @Test
  public void testMatchPattern() {
    final Pattern pattern = PatternFormat.formatterPattern;
    for (String string : singlePatterns) {
      assertMatches(pattern, string);
    }
  }

  private static ArrayList<String> toList(String... strings) {
    return new ArrayList<String>(Arrays.asList(strings));
  }

  @Test
  public void test_guessPatternFormat() {
    for (String pattern : singlePatterns) {
      assertNotNull("should be a formatter pattern: " + pattern, PatternFormat.guessPatternFormat(pattern));
    }
    for (String pattern : multiPatterns) {
      assertNull("only single pattern may be accepted as a formatter pattern: " + pattern,
          PatternFormat.guessPatternFormat(pattern));
    }
    for (String pattern : parameterizedPatterns) {
      assertNull("positional parameters (n$) are not accepted as a formatter patterns: " + pattern,
          PatternFormat.guessPatternFormat(pattern));
    }
  }

  @Test
  public void testFormat() {
    for (String pattern : singlePatterns) {
      testOnePattern(pattern);
    }
  }

  private void testOnePattern(String pattern) {
    final PatternFormat formatter = PatternFormat.guessPatternFormat(pattern);
    assertNotNull("could not create a formatter for pattern " + pattern, formatter);
    if (formatter.acceptsDate())
      System.err.println(pattern + "->" + formatter.formatObject(new Date()));
    else if (formatter.acceptsNumber())
      System.err.println(pattern + "->" + formatter.formatObject(1223.456789));
    else
      System.err.println(pattern + "->" + formatter.formatObject("Hello world!"));
  }

  private void assertMatches(final Pattern pattern, String string) {
    final Matcher m = pattern.matcher(string);
    final boolean matches = m.find();
    if (matches)
      System.out.println("match " + string + "->" + m.group() + "->" + m.group(1));
    else
      System.out.println("no match for " + string);
    assertTrue(string, matches);
  }

  @Test
  public void testTransform() {
    final long t = System.currentTimeMillis();
    for (int i = 0; i < 20000; ++i) {
      String text = makeHtmlText("one\ntwo" + i);
      assertEquals("one\n" + HTML_BODY_INDENT + "two" + i, HtmlUtils.extractRawBody(text));
    }
    System.err.println((System.currentTimeMillis() - t) / 1000.);
  }

  private String makeHtmlText(String body) {
    return "<html>" //
            + "  <head>" //
            + HTML_BODY_INDENT + "  </head>" //
            + "  <body>" //
            + HTML_BODY_INDENT + body.replace("\n", "\n" + HTML_BODY_INDENT) //
            + "  </body>" //
            + "</html>";
  }

  final static Pattern bodyPattern = Pattern.compile("<body>\\s*(.*?)\\s*</body>", Pattern.DOTALL);

  // alternative implementation of HtmlUtils.extractRawBody() - approximately two times slower
  public static String extractRawBodyRegexp(final String text) {
    final Matcher matcher = bodyPattern.matcher(text);
    if (matcher.find())
      return matcher.group(1);
    return "";
  }

  @Test
  public void performanceTest() {
    final int count = 20000;
    {
      final long t = System.currentTimeMillis();
      for (int i = 0; i < count; ++i) {
        String text = makeHtmlText("one\ntwo" + i);
        assertEquals("one\n" + HTML_BODY_INDENT + "two" + i, HtmlUtils.extractRawBody(text));
        //      assertEquals("one\n" + HTML_BODY_INDENT + "two" + i, extractRawBodyRegexp(text));
      }
      System.err.println("HtmlUtils.extractRawBody(text): " + (System.currentTimeMillis() - t) / 1000.);
    }
    {
      final long t = System.currentTimeMillis();
      for (int i = 0; i < count; ++i) {
        String text = makeHtmlText("one\ntwo" + i);
        assertEquals("one\n" + HTML_BODY_INDENT + "two" + i, extractRawBodyRegexp(text));
      }
      System.err.println("extractRawBodyRegexp(text): " + (System.currentTimeMillis() - t) / 1000.);
    }
  }
}
TOP

Related Classes of org.freeplane.features.format.PatternFormatTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.