/* * (c) Copyright 2011 by Volker Bergmann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, is permitted under the terms of the * GNU General Public License (GPL). * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS, * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package org.databene.benerator.primitive; import static org.junit.Assert.*; import java.util.Locale; import java.util.Set; import org.databene.benerator.distribution.SequenceManager; import org.databene.benerator.test.GeneratorTest; import org.databene.commons.CollectionUtil; import org.databene.commons.Validator; import org.databene.commons.validator.PrefixValidator; import org.databene.commons.validator.RegexValidator; import org.databene.commons.validator.StringLengthValidator; import org.databene.commons.validator.SuffixValidator; import org.junit.Test; /** * Tests the {@link StringGenerator}.<br/><br/> * Created: 01.08.2011 20:15:04 * @since 0.7.0 * @author Volker Bergmann */ public class StringGeneratorTest extends GeneratorTest { public static final int N = 500; @Test public void testDefault() { StringGenerator generator = initialize(new StringGenerator()); expectGenerations(generator, N, new StringLengthValidator(1, 8), new RegexValidator("\\w{1,8}")); } @Test public void testPattern() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(2); generator.setMaxLength(3); initialize(generator); expectGeneratedSet(generator, N, "AA", "AB", "BA", "BB", "AAA", "AAB", "ABA", "ABB", "BAA", "BAB", "BBA", "BBB"); } @Test public void testPrefix() { StringGenerator generator = new StringGenerator(); generator.setPrefix("pp"); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new PrefixValidator("pp")); } @Test public void testSuffix() { StringGenerator generator = new StringGenerator(); generator.setSuffix("ss"); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new SuffixValidator("ss")); } @Test public void testPrefixAndSuffix() { StringGenerator generator = new StringGenerator(); generator.setPrefix("pp"); generator.setSuffix("ss"); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new PrefixValidator("pp"), new SuffixValidator("ss")); } @Test public void testMinInitial() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[0-9]"); generator.setMinInitial('9'); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new PrefixValidator("9")); } @Test public void testPrefixAndMinInitial() { StringGenerator generator = new StringGenerator(); generator.setPrefix("pp"); generator.setCharSet("[0-9]"); generator.setMinInitial('9'); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new PrefixValidator("pp9")); } @Test public void testMinInitialAndSuffix() { StringGenerator generator = new StringGenerator(); generator.setSuffix("ss"); generator.setCharSet("[0-9]"); generator.setMinInitial('9'); generator.setMinLength(4); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(4, 8), new PrefixValidator("9"), new SuffixValidator("ss")); } @Test public void testPrefixMinInitialAndSuffix() { StringGenerator generator = new StringGenerator(); generator.setPrefix("pp"); generator.setSuffix("ss"); generator.setCharSet("[0-9]"); generator.setMinInitial('9'); generator.setMinLength(5); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(5, 8), new PrefixValidator("pp9"), new SuffixValidator("ss")); } @Test public void testGermanLocale() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[\\w^A-Za-z0-9_]"); generator.setLocale(Locale.GERMAN); generator.setMinLength(5); generator.setMaxLength(8); initialize(generator); expectGenerations(generator, N, new StringLengthValidator(5, 8), new UmlautValidator()); } @Test public void testLengthLimit_nonUnique() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(5); generator.setMaxLength(1000); initialize(generator); expectGenerations(generator, 100, new StringLengthValidator(5, 1000)); } @Test public void testLengthLimit_unique() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(5); generator.setMaxLength(1000); generator.setOrdered(false); generator.setUnique(true); initialize(generator); expectGenerations(generator, 100, new StringLengthValidator(5, 1000)); } @Test public void testLengthLimit_ordered() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(5); generator.setMaxLength(1000); generator.setOrdered(true); generator.setUnique(true); initialize(generator); expectGenerations(generator, 100, new StringLengthValidator(5, 1000)); } @Test public void testLengthGranularity() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(500); generator.setMaxLength(1000); generator.setLengthGranularity(250); generator.setOrdered(true); generator.setUnique(true); initialize(generator); expectGenerations(generator, 100, new LengthsValidator()); } @Test public void testLengthDistribution() { StringGenerator generator = new StringGenerator(); generator.setCharSet("x"); generator.setMinLength(1); generator.setMaxLength(5); generator.setLengthGranularity(2); generator.setLengthDistribution(SequenceManager.STEP_SEQUENCE); generator.setOrdered(true); generator.setUnique(true); initialize(generator); assertEquals("x", generator.generate()); assertEquals("xxx", generator.generate()); assertEquals("xxxxx", generator.generate()); assertUnavailable(generator); generator.reset(); assertEquals("x", generator.generate()); assertEquals("xxx", generator.generate()); assertEquals("xxxxx", generator.generate()); assertUnavailable(generator); generator.close(); } public void testNonUnique() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(2); generator.setMaxLength(3); generator.setUnique(false); generator.setOrdered(false); initialize(generator); expectGeneratedSet(generator, 100, "AA", "AB", "BA", "BB", "AAA", "AAB", "ABA", "ABB", "BAA", "BAB", "BBA", "BBB"); } @Test public void testUniqueUnordered() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(2); generator.setMaxLength(3); generator.setUnique(true); generator.setOrdered(false); initialize(generator); expectUniquelyGeneratedSet(generator, "AA", "AB", "BA", "BB", "AAA", "AAB", "ABA", "ABB", "BAA", "BAB", "BBA", "BBB"); } @Test public void testUniqueOrdered() { StringGenerator generator = new StringGenerator(); generator.setCharSet("[AB]"); generator.setMinLength(2); generator.setMaxLength(3); generator.setUnique(true); generator.setOrdered(true); initialize(generator); expectGeneratedSequence(generator, "AA", "AB", "BA", "BB", "AAA", "AAB", "ABA", "ABB", "BAA", "BAB", "BBA", "BBB"); } public class UmlautValidator implements Validator<String> { private Set<Character> allowedValues = CollectionUtil.toSet('Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß'); public boolean valid(String value) { for (int i = 0; i < value.length(); i++) if (!allowedValues.contains(value.charAt(i))) return false; return true; } } public class LengthsValidator implements Validator<String> { public boolean valid(String value) { return value.length() == 500 || value.length() == 750 || value.length() == 1000; } } }