| /** |
| * Copyright (c) 2004-2011 QOS.ch |
| * All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining |
| * a copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sublicense, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| * |
| */ |
| package org.slf4j.migrator.helper; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| import org.junit.Test; |
| |
| public class AbbreviatorTest { |
| |
| static final char FS = '/'; |
| static final String INPUT_0 = "/abc/123456/ABC"; |
| static final String INPUT_1 = "/abc/123456/xxxxx/ABC"; |
| |
| RandomHelper rh = new RandomHelper(FS); |
| |
| @Test |
| public void testSmoke() { |
| { |
| Abbreviator abb = new Abbreviator(2, 100, FS); |
| String r = abb.abbreviate(INPUT_0); |
| assertEquals(INPUT_0, r); |
| } |
| |
| { |
| Abbreviator abb = new Abbreviator(3, 8, FS); |
| String r = abb.abbreviate(INPUT_0); |
| assertEquals("/abc/.../ABC", r); |
| } |
| { |
| Abbreviator abb = new Abbreviator(3, 8, FS); |
| String r = abb.abbreviate(INPUT_0); |
| assertEquals("/abc/.../ABC", r); |
| } |
| } |
| |
| @Test |
| public void testImpossibleToAbbreviate() { |
| Abbreviator abb = new Abbreviator(2, 20, FS); |
| String in = "iczldqwivpgm/mgrmvbjdxrwmqgprdjusth"; |
| String r = abb.abbreviate(in); |
| assertEquals(in, r); |
| } |
| |
| @Test |
| public void testNoFS() { |
| Abbreviator abb = new Abbreviator(2, 100, FS); |
| String r = abb.abbreviate("hello"); |
| assertEquals("hello", r); |
| |
| } |
| |
| @Test |
| public void testZeroPrefix() { |
| { |
| Abbreviator abb = new Abbreviator(0, 100, FS); |
| String r = abb.abbreviate(INPUT_0); |
| assertEquals(INPUT_0, r); |
| } |
| } |
| |
| @Test |
| public void testTheories() { |
| int MAX_RANDOM_FIXED_LEN = 20; |
| int MAX_RANDOM_AVG_LEN = 20; |
| int MAX_RANDOM_MAX_LEN = 100; |
| for (int i = 0; i < 10000; i++) { |
| |
| // System.out.println("Test number " + i); |
| |
| // 0 <= fixedLen < MAX_RANDOM_FIXED_LEN |
| int fixedLen = rh.nextInt(MAX_RANDOM_FIXED_LEN); |
| // 5 <= averageLen < MAX_RANDOM_AVG_LEN |
| int averageLen = rh.nextInt(MAX_RANDOM_AVG_LEN) + 3; |
| // System.out.println("fixedLen="+fixedLen+", averageLen="+averageLen); |
| |
| int maxLen = rh.nextInt(MAX_RANDOM_MAX_LEN) + fixedLen; |
| if (maxLen <= 1) { |
| continue; |
| } |
| // System.out.println("maxLen="+maxLen); |
| int targetLen = (maxLen / 2) + rh.nextInt(maxLen / 2) + 1; |
| |
| if (targetLen > maxLen) { |
| targetLen = maxLen; |
| } |
| String filename = rh.buildRandomFileName(averageLen, maxLen); |
| |
| Abbreviator abb = new Abbreviator(fixedLen, targetLen, FS); |
| String result = abb.abbreviate(filename); |
| assertTheory0(averageLen, filename, result, fixedLen, targetLen); |
| assertUsefulness(averageLen, filename, result, fixedLen, targetLen); |
| assertTheory1(filename, result, fixedLen, targetLen); |
| assertTheory2(filename, result, fixedLen, targetLen); |
| } |
| } |
| |
| // result length is smaller than original length |
| void assertTheory0(int averageLen, String filename, String result, int fixedLen, int targetLength) { |
| assertTrue("filename=[" + filename + "] result=[" + result + "]", result.length() <= filename.length()); |
| } |
| |
| // if conditions allow, result length should be to target length |
| void assertUsefulness(int averageLen, String filename, String result, int fixedLen, int targetLength) { |
| int resLen = result.length(); |
| |
| int margin = averageLen * 4; |
| if (targetLength > fixedLen + margin) { |
| assertTrue("filename=[" + filename + "], result=[" + result + "] resultLength=" + resLen + " fixedLength=" + fixedLen + ", targetLength=" |
| + targetLength + ", avgLen=" + averageLen, result.length() <= targetLength + averageLen); |
| } |
| } |
| |
| // result start with prefix found in filename |
| void assertTheory1(String filename, String result, int fixedLen, int targetLength) { |
| String prefix = filename.substring(0, fixedLen); |
| assertTrue(result.startsWith(prefix)); |
| } |
| |
| // The string /.../ is found in the result once at a position higher |
| // than fixedLen |
| void assertTheory2(String filename, String result, int fixedLen, int targetLength) { |
| if (filename == result) { |
| return; |
| } |
| int fillerIndex = result.indexOf(Abbreviator.FILLER); |
| assertTrue(fillerIndex >= fixedLen); |
| } |
| } |