/* * ************************************************************************************* * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * * ************************************************************************************* */ package com.espertech.esper.collection; import junit.framework.TestCase; import java.util.Arrays; import java.util.NoSuchElementException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class TestPermutationEnumeration extends TestCase { public void testInvalid() { try { new PermutationEnumeration(0); fail(); } catch (IllegalArgumentException ex) { // expected } } public void testNext() { final int[][] expectedValues4 = new int[][] { { 0, 1, 2, 3 }, // 0 { 0, 1, 3, 2 }, { 0, 2, 1, 3 }, { 0, 2, 3, 1 }, { 0, 3, 1, 2 }, { 0, 3, 2, 1 }, // 5 { 1, 0, 2, 3 }, // 6 { 1, 0, 3, 2 }, // 7 { 1, 2, 0, 3 }, // 8 { 1, 2, 3, 0 }, { 1, 3, 0, 2 }, { 1, 3, 2, 0 }, // 11 { 2, 0, 1, 3 }, // 12 { 2, 0, 3, 1 }, { 2, 1, 0, 3 }, { 2, 1, 3, 0 }, { 2, 3, 0, 1 }, { 2, 3, 1, 0 }, // 17 { 3, 0, 1, 2 }, // 18 { 3, 0, 2, 1 }, { 3, 1, 0, 2 }, { 3, 1, 2, 0 }, // 21 { 3, 2, 0, 1 }, { 3, 2, 1, 0 } }; tryPermutation(4, expectedValues4); final int[][] expectedValues3 = new int[][] { { 0, 1, 2 }, { 0, 2, 1 }, { 1, 0, 2 }, { 1, 2, 0 }, { 2, 0, 1 }, { 2, 1, 0 }}; tryPermutation(3, expectedValues3); final int[][] expectedValues2 = new int[][] { { 0, 1}, { 1, 0}}; tryPermutation(2, expectedValues2); final int[][] expectedValues1 = new int[][] { {0}}; tryPermutation(1, expectedValues1); } private void tryPermutation(int numElements, int[][] expectedValues) { /* Total: 4 * 3 * 2 = 24 = 6! (6 faculty) Example:8 n / 6 = first number == index 1, total {1}, remains {0, 2, 3} remainder 8 - 1 * 6 == 2 n / 2 = second number == index 1, total {1, 2}, remain {0, 3} remainder 2 - 1 * 2 == 0 == total {1, 2, 0, 3} Example:21 out {0, 1, 2, 3} 21 / 6 == index 3 -> in {3}, out {0, 1, 2} remainder 21 - 3 * 6 == 3 3 / 2 = second number == index 1 -> in {3, 1}, remain {0, 2} remainder 3 - 1 * 2 == 1 == index 1 -> in {3, 1, 2} out {0} */ PermutationEnumeration enumeration = new PermutationEnumeration(numElements); int count = 0; while(enumeration.hasMoreElements()) { int[] result = enumeration.nextElement(); int[] expected = expectedValues[count]; log.debug(".tryPermutation result=" + Arrays.toString(result)); log.debug(".tryPermutation expected=" + Arrays.toString(result)); count++; assertTrue("Mismatch in count=" + count, Arrays.equals(result, expected)); } assertEquals(count, expectedValues.length); try { enumeration.nextElement(); fail(); } catch (NoSuchElementException ex) { // Expected } } public static void testGetPermutation() { int[] factors = PermutationEnumeration.getFactors(4); int[] result = PermutationEnumeration.getPermutation(4, 21, factors); log.debug(".testGetPermutation result=" + Arrays.toString(result)); assertTrue(Arrays.equals(result, new int[] {3, 1, 2, 0})); } public static void testGetFactors() { int[] factors = PermutationEnumeration.getFactors(5); assertTrue(Arrays.equals(factors, new int[] {24, 6, 2, 1, 0})); factors = PermutationEnumeration.getFactors(4); assertTrue(Arrays.equals(factors, new int[] {6, 2, 1, 0})); factors = PermutationEnumeration.getFactors(3); assertTrue(Arrays.equals(factors, new int[] {2, 1, 0})); factors = PermutationEnumeration.getFactors(2); assertTrue(Arrays.equals(factors, new int[] {1, 0})); factors = PermutationEnumeration.getFactors(1); assertTrue(Arrays.equals(factors, new int[] {0})); //log.debug(".testGetFactors " + Arrays.toString(factors)); } public static void testFaculty() { assertEquals(0, PermutationEnumeration.faculty(0)); assertEquals(1, PermutationEnumeration.faculty(1)); assertEquals(2, PermutationEnumeration.faculty(2)); assertEquals(6, PermutationEnumeration.faculty(3)); assertEquals(24, PermutationEnumeration.faculty(4)); assertEquals(120, PermutationEnumeration.faculty(5)); assertEquals(720, PermutationEnumeration.faculty(6)); } private static Log log = LogFactory.getLog(TestPermutationEnumeration.class); }