/* * Java Genetic Algorithm Library (@__identifier__@). * Copyright (c) @__year__@ Franz Wilhelmstötter * * Licensed 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. * * Author: * Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at) */ package org.jenetics.util; import java.util.HashSet; import java.util.Iterator; import java.util.Random; import java.util.Set; import java.util.regex.PatternSyntaxException; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.jenetics.internal.math.random; /** * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a> */ public class CharSeqTest extends ObjectTester<CharSeq> { @Override protected Factory<CharSeq> factory() { return () -> { final Random r = RandomRegistry.getRandom(); return new CharSeq(random.nextString(r, r.nextInt(200) + 100)); }; } @Test public void distinct() { final CharSeq cs1 = new CharSeq("abcdeaafg"); final CharSeq cs2 = new CharSeq("gfedcbabb"); Assert.assertEquals(cs1, cs2); } @Test public void distinct1() { CharSeq set = new CharSeq("".toCharArray()); Assert.assertEquals(set.toString(), ""); set = new CharSeq("1".toCharArray()); Assert.assertEquals(set.toString(), "1"); set = new CharSeq("11".toCharArray()); Assert.assertEquals(set.toString(), "1"); set = new CharSeq("142321423456789".toCharArray()); Assert.assertEquals(set.toString(), "123456789"); set = new CharSeq("0000000000000000000000000".toCharArray()); Assert.assertEquals(set.toString(), "0"); set = new CharSeq("0111111111111111111111111112".toCharArray()); Assert.assertEquals(set.toString(), "012"); set = new CharSeq("111111111111111112".toCharArray()); Assert.assertEquals(set.toString(), "12"); set = new CharSeq("1222222222222222222".toCharArray()); Assert.assertEquals(set.toString(), "12"); set = new CharSeq("000000987654321111111111".toCharArray()); Assert.assertEquals(set.toString(), "0123456789"); } @Test public void distinct2() { CharSeq set = new CharSeq(""); Assert.assertEquals(set.toString(), ""); set = new CharSeq("1"); Assert.assertEquals(set.toString(), "1"); set = new CharSeq("11"); Assert.assertEquals(set.toString(), "1"); set = new CharSeq("1223345667899"); Assert.assertEquals(set.toString(), "123456789"); set = new CharSeq("0000000000000000000000000"); Assert.assertEquals(set.toString(), "0"); set = new CharSeq("0111111111111111111111111112"); Assert.assertEquals(set.toString(), "012"); set = new CharSeq("111111111111111112"); Assert.assertEquals(set.toString(), "12"); set = new CharSeq("1222222222222222222"); Assert.assertEquals(set.toString(), "12"); set = new CharSeq("000000987654321111111111"); Assert.assertEquals(set.toString(), "0123456789"); } @Test(dataProvider = "randomString") public void distinctRandomStrings(final String value) { final CharSeq seq = new CharSeq(value); final Set<Character> set = new HashSet<>(); for (int i = value.length(); --i >= 0;) { set.add(value.charAt(i)); } Assert.assertEquals(seq.length(), set.size()); for (Character c : seq) { Assert.assertTrue(set.contains(c), "Set must contain " + c); } } @DataProvider(name = "randomString") public Object[][] randomString() { final Random random = new Random(123); final Object[][] strings = new Object[25][1]; for (int i = 0; i < strings.length; ++i) { strings[i][0] = nextString(random, 25); } return strings; } private static String nextString(final Random random, final int length) { final char[] chars = new char[length]; for (int i = 0; i < chars.length; ++i) { chars[i] = (char) org.jenetics.internal.math.random.nextInt(random, 'a', 'k'); } return new String(chars); } @Test public void expand1() { String value = CharSeq.expand('a', 'z'); Assert.assertEquals(value.length(), 26); Assert.assertEquals(value, "abcdefghijklmnopqrstuvwxyz"); value = CharSeq.expand('A', 'Z'); Assert.assertEquals(value.length(), 26); Assert.assertEquals(value, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); value = CharSeq.expand('0', '9'); Assert.assertEquals(value.length(), 10); Assert.assertEquals(value, "0123456789"); } @Test public void expand2() { String value = CharSeq.expand("a-z"); Assert.assertEquals(value.length(), 26); Assert.assertEquals(value, "abcdefghijklmnopqrstuvwxyz"); value = CharSeq.expand("a-z\\-"); Assert.assertEquals(value.length(), 27); Assert.assertEquals(value, "abcdefghijklmnopqrstuvwxyz-"); value = CharSeq.expand("a-z\\\\xx"); Assert.assertEquals(value.length(), 29); Assert.assertEquals(value, "abcdefghijklmnopqrstuvwxyz\\xx"); value = CharSeq.expand("A-Z"); Assert.assertEquals(value.length(), 26); Assert.assertEquals(value, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); value = CharSeq.expand("0-9"); Assert.assertEquals(value.length(), 10); Assert.assertEquals(value, "0123456789"); value = CharSeq.expand("0-9yxcvba-z"); Assert.assertEquals(value.length(), 41); Assert.assertEquals(value, "0123456789yxcvbabcdefghijklmnopqrstuvwxyz"); value = CharSeq.expand("0-9a-zA-Z"); Assert.assertEquals(value.length(), 10 + 26 + 26); Assert.assertEquals(value, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); } @Test(expectedExceptions = PatternSyntaxException.class) public void expand3() { CharSeq.expand("a-z-"); } @Test(expectedExceptions = PatternSyntaxException.class) public void expand4() { CharSeq.expand("-az"); } @Test public void contains() { final CharSeq set = new CharSeq(CharSeq.expand("a-z")); Assert.assertTrue(set.contains('t')); Assert.assertTrue(set.contains('a')); Assert.assertTrue(set.contains('z')); Assert.assertFalse(set.contains('T')); Assert.assertFalse(set.contains('1')); Assert.assertFalse(set.contains('Z')); } @Test public void iterate() { final CharSeq set = new CharSeq(CharSeq.expand("a-z")); final String values = CharSeq.expand("a-z"); final Iterator<Character> it = set.iterator(); for (int i = 0; i < values.length(); ++i) { Assert.assertTrue(it.hasNext()); Assert.assertEquals(it.next(), new Character(values.charAt(i))); } Assert.assertFalse(it.hasNext()); } @Test public void subSequence() { final CharSeq set = new CharSeq(CharSeq.expand("a-z")); final CharSeq sub = set.subSequence(3, 10); Assert.assertEquals(sub.length(), 7); Assert.assertEquals(sub.toString(), "defghij"); } }