1#!/usr/bin/env python 2# Copyright 2009 Google Inc. All Rights Reserved. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16"""Tests for the selector module.""" 17 18__author__ = 'tstromberg@google.com (Thomas Stromberg)' 19 20import selectors 21import unittest 22 23 24 25class SelectorsTest(unittest.TestCase): 26 def testMaxRepeatCount(self): 27 self.assertEquals(selectors.MaxRepeatCount(range(1,10), 5), 28 selectors.MAX_REPEAT) 29 self.assertEquals(selectors.MaxRepeatCount(range(1,10), 50), 30 2**32) 31 32 def testRandomSelect(self): 33 elements = range(10) 34 result = selectors.RandomSelect(elements, 10) 35 self.assertEquals(len(result), 10) 36 self.assertNotEquals(result, range(10)) 37 38 def testRandomSelectConstrained(self): 39 elements = range(5) 40 result = selectors.RandomSelect(elements, 10) 41 self.assertEquals(len(result), 10) 42 ones = [x for x in result if x == 1] 43 twos = [x for x in result if x == 2] 44 self.assertTrue(len(ones) <= selectors.MAX_REPEAT) 45 self.assertTrue(len(twos) <= selectors.MAX_REPEAT) 46 47 def testRandomSelectVeryConstrained(self): 48 """Test to make sure we don't infinite loop if count > len(elements)*3""" 49 elements = range(2) 50 result = selectors.RandomSelect(elements, 20) 51 self.assertEquals(len(result), 20) 52 ones = [x for x in result if x == 1] 53 twos = [x for x in result if x == 2] 54 self.assertTrue(ones > selectors.MAX_REPEAT) 55 self.assertTrue(twos > selectors.MAX_REPEAT) 56 57 def testWeightedDistribution(self): 58 """Ensure that a weighted distribution is indeed weighted.""" 59 elements = range(20) 60 result = selectors.WeightedDistribution(elements, 10) 61 self.assertEquals(len(result), 10) 62 zeros = [x for x in result if x == 0] 63 ones = [x for x in result if x == 1] 64 low = [x for x in result if x < 3] 65 mid = [x for x in result if x > 7 and x < 13] 66 high = [x for x in result if x > 17] 67 self.assertTrue(len(zeros) <= selectors.MAX_REPEAT) 68 self.assertTrue(len(ones) <= selectors.MAX_REPEAT) 69 self.assertTrue(len(low) >= 3) 70 self.assertTrue(len(mid) <= 3) 71 self.assertTrue(len(high) <= 2) 72 73 def testChuckSelect(self): 74 elements = range(10000) 75 result = selectors.ChunkSelect(elements, 5) 76 self.assertEquals(len(result), 5) 77 # Make sure our segment is a subset 78 self.assertTrue(set(result).issubset(set(elements))) 79 80 # Make sure our segment is contiguous 81 self.assertEquals(result, range(result[0], result[0]+5)) 82 83 84 result2 = selectors.ChunkSelect(elements, 5) 85 self.assertEquals(len(result), 5) 86 self.assertNotEquals(result, result2) 87 88 89 def testChunkSelectConstrained(self): 90 """Make sure we aren't inventing bogus data.""" 91 elements = range(20) 92 result = selectors.ChunkSelect(elements, 25) 93 self.assertEquals(len(result), 20) 94 self.assertEquals(elements, result) 95 96 97 98if __name__ == '__main__': 99 unittest.main() 100