View Javadoc
1   /**
2    * Copyright (c) 2004-2011 QOS.ch
3    * All rights reserved.
4    *
5    * Permission is hereby granted, free  of charge, to any person obtaining
6    * a  copy  of this  software  and  associated  documentation files  (the
7    * "Software"), to  deal in  the Software without  restriction, including
8    * without limitation  the rights to  use, copy, modify,  merge, publish,
9    * distribute,  sublicense, and/or sell  copies of  the Software,  and to
10   * permit persons to whom the Software  is furnished to do so, subject to
11   * the following conditions:
12   *
13   * The  above  copyright  notice  and  this permission  notice  shall  be
14   * included in all copies or substantial portions of the Software.
15   *
16   * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
17   * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
18   * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
19   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20   * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21   * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
22   * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23   *
24   */
25  package org.slf4j.migrator.helper;
26  
27  import static org.junit.Assert.assertEquals;
28  import static org.junit.Assert.assertTrue;
29  
30  import org.junit.Test;
31  
32  public class AbbreviatorTest {
33  
34      static final char FS = '/';
35      static final String INPUT_0 = "/abc/123456/ABC";
36      static final String INPUT_1 = "/abc/123456/xxxxx/ABC";
37  
38      RandomHelper rh = new RandomHelper(FS);
39  
40      @Test
41      public void testSmoke() {
42          {
43              Abbreviator abb = new Abbreviator(2, 100, FS);
44              String r = abb.abbreviate(INPUT_0);
45              assertEquals(INPUT_0, r);
46          }
47  
48          {
49              Abbreviator abb = new Abbreviator(3, 8, FS);
50              String r = abb.abbreviate(INPUT_0);
51              assertEquals("/abc/.../ABC", r);
52          }
53          {
54              Abbreviator abb = new Abbreviator(3, 8, FS);
55              String r = abb.abbreviate(INPUT_0);
56              assertEquals("/abc/.../ABC", r);
57          }
58      }
59  
60      @Test
61      public void testImpossibleToAbbreviate() {
62          Abbreviator abb = new Abbreviator(2, 20, FS);
63          String in = "iczldqwivpgm/mgrmvbjdxrwmqgprdjusth";
64          String r = abb.abbreviate(in);
65          assertEquals(in, r);
66      }
67  
68      @Test
69      public void testNoFS() {
70          Abbreviator abb = new Abbreviator(2, 100, FS);
71          String r = abb.abbreviate("hello");
72          assertEquals("hello", r);
73  
74      }
75  
76      @Test
77      public void testZeroPrefix() {
78          {
79              Abbreviator abb = new Abbreviator(0, 100, FS);
80              String r = abb.abbreviate(INPUT_0);
81              assertEquals(INPUT_0, r);
82          }
83      }
84  
85      @Test
86      public void testTheories() {
87          int MAX_RANDOM_FIXED_LEN = 20;
88          int MAX_RANDOM_AVG_LEN = 20;
89          int MAX_RANDOM_MAX_LEN = 100;
90          for (int i = 0; i < 10000; i++) {
91  
92              // System.out.println("Test number " + i);
93  
94              // 0 <= fixedLen < MAX_RANDOM_FIXED_LEN
95              int fixedLen = rh.nextInt(MAX_RANDOM_FIXED_LEN);
96              // 5 <= averageLen < MAX_RANDOM_AVG_LEN
97              int averageLen = rh.nextInt(MAX_RANDOM_AVG_LEN) + 3;
98              // System.out.println("fixedLen="+fixedLen+", averageLen="+averageLen);
99  
100             int maxLen = rh.nextInt(MAX_RANDOM_MAX_LEN) + fixedLen;
101             if (maxLen <= 1) {
102                 continue;
103             }
104             // System.out.println("maxLen="+maxLen);
105             int targetLen = (maxLen / 2) + rh.nextInt(maxLen / 2) + 1;
106 
107             if (targetLen > maxLen) {
108                 targetLen = maxLen;
109             }
110             String filename = rh.buildRandomFileName(averageLen, maxLen);
111 
112             Abbreviator abb = new Abbreviator(fixedLen, targetLen, FS);
113             String result = abb.abbreviate(filename);
114             assertTheory0(averageLen, filename, result, fixedLen, targetLen);
115             assertUsefulness(averageLen, filename, result, fixedLen, targetLen);
116             assertTheory1(filename, result, fixedLen, targetLen);
117             assertTheory2(filename, result, fixedLen, targetLen);
118         }
119     }
120 
121     // result length is smaller than original length
122     void assertTheory0(int averageLen, String filename, String result, int fixedLen, int targetLength) {
123         assertTrue("filename=[" + filename + "] result=[" + result + "]", result.length() <= filename.length());
124     }
125 
126     // if conditions allow, result length should be to target length
127     void assertUsefulness(int averageLen, String filename, String result, int fixedLen, int targetLength) {
128         int resLen = result.length();
129 
130         int margin = averageLen * 4;
131         if (targetLength > fixedLen + margin) {
132             assertTrue("filename=[" + filename + "], result=[" + result + "] resultLength=" + resLen + " fixedLength=" + fixedLen + ", targetLength="
133                             + targetLength + ", avgLen=" + averageLen, result.length() <= targetLength + averageLen);
134         }
135     }
136 
137     // result start with prefix found in filename
138     void assertTheory1(String filename, String result, int fixedLen, int targetLength) {
139         String prefix = filename.substring(0, fixedLen);
140         assertTrue(result.startsWith(prefix));
141     }
142 
143     // The string /.../ is found in the result once at a position higher
144     // than fixedLen
145     void assertTheory2(String filename, String result, int fixedLen, int targetLength) {
146         if (filename == result) {
147             return;
148         }
149         int fillerIndex = result.indexOf(Abbreviator.FILLER);
150         assertTrue(fillerIndex >= fixedLen);
151     }
152 }