/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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. */ package org.apache.hadoop.mapred.gridmix; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import org.junit.Test; import com.sun.tools.javac.code.Attribute.Array; public class TestRandomAlgorithm { private static final int[][] parameters = new int[][] { {5, 1, 1}, {10, 1, 2}, {10, 2, 2}, {20, 1, 3}, {20, 2, 3}, {20, 3, 3}, {100, 3, 10}, {100, 3, 100}, {100, 3, 1000}, {100, 3, 10000}, {100, 3, 100000}, {100, 3, 1000000} }; private List<Integer> convertIntArray(int[] from) { List<Integer> ret = new ArrayList<Integer>(from.length); for (int v : from) { ret.add(v); } return ret; } private void testRandomSelectSelector(int niter, int m, int n) { RandomAlgorithms.Selector selector = new RandomAlgorithms.Selector(n, (double) m / n, new Random()); Map<List<Integer>, Integer> results = new HashMap<List<Integer>, Integer>( niter); for (int i = 0; i < niter; ++i, selector.reset()) { int[] result = new int[m]; for (int j = 0; j < m; ++j) { int v = selector.next(); if (v < 0) break; result[j]=v; } Arrays.sort(result); List<Integer> resultAsList = convertIntArray(result); Integer count = results.get(resultAsList); if (count == null) { results.put(resultAsList, 1); } else { results.put(resultAsList, ++count); } } verifyResults(results, m, n); } private void testRandomSelect(int niter, int m, int n) { Random random = new Random(); Map<List<Integer>, Integer> results = new HashMap<List<Integer>, Integer>( niter); for (int i = 0; i < niter; ++i) { int[] result = RandomAlgorithms.select(m, n, random); Arrays.sort(result); List<Integer> resultAsList = convertIntArray(result); Integer count = results.get(resultAsList); if (count == null) { results.put(resultAsList, 1); } else { results.put(resultAsList, ++count); } } verifyResults(results, m, n); } private void verifyResults(Map<List<Integer>, Integer> results, int m, int n) { if (n>=10) { assertTrue(results.size() >= Math.min(m, 2)); } for (List<Integer> result : results.keySet()) { assertEquals(m, result.size()); Set<Integer> seen = new HashSet<Integer>(); for (int v : result) { System.out.printf("%d ", v); assertTrue((v >= 0) && (v < n)); assertTrue(seen.add(v)); } System.out.printf(" ==> %d\n", results.get(result)); } System.out.println("===="); } @Test public void testRandomSelect() { for (int[] param : parameters) { testRandomSelect(param[0], param[1], param[2]); } } @Test public void testRandomSelectSelector() { for (int[] param : parameters) { testRandomSelectSelector(param[0], param[1], param[2]); } } }