|
| 1 | +#! usr/bin/env python3 |
| 2 | + |
| 3 | +import re |
| 4 | + |
| 5 | +import stochastic_hill_climbing as shc |
| 6 | + |
| 7 | +import unittest |
| 8 | + |
| 9 | +class StochasticHillClimbingTests(unittest.TestCase): |
| 10 | + """ |
| 11 | + Unit tests for functions in stochastic_hill_climbing.py . |
| 12 | + Has some additional tests compared to Ruby version. |
| 13 | + |
| 14 | + @author Chad Estioco |
| 15 | + """ |
| 16 | + |
| 17 | + def test_onemax(self): |
| 18 | + self.assertEqual(4, shc.onemax("1111")) |
| 19 | + self.assertEqual(2, shc.onemax("0101")) |
| 20 | + self.assertEqual(0, shc.onemax("0000")) |
| 21 | + |
| 22 | + def test_random_bitstring(self): |
| 23 | + """ |
| 24 | + Tests the string generated as well as it's size. |
| 25 | + """ |
| 26 | + |
| 27 | + bit10 = re.compile("[01]{10}") |
| 28 | + |
| 29 | + for i in range(100): |
| 30 | + self.assertTrue(bit10.match(shc.random_bitstring(10))) |
| 31 | + |
| 32 | + bit8 = re.compile("[01]{8}") |
| 33 | + |
| 34 | + for i in range(100): |
| 35 | + self.assertTrue(bit8.match(shc.random_bitstring(8))) |
| 36 | + |
| 37 | + # TODO: test_random_bitstring_ratio |
| 38 | + |
| 39 | + def test_random_neighbor(self): |
| 40 | + parent = "00000000" |
| 41 | + |
| 42 | + for i in range(100): |
| 43 | + random_neighbor = shc.random_neighbor(parent) |
| 44 | + self.assertEqual(len(random_neighbor), len(parent)) |
| 45 | + self.assertNotEqual(random_neighbor, parent) |
| 46 | + self.assertFalse(random_neighbor is parent) |
| 47 | + |
| 48 | + diffs = 0 |
| 49 | + |
| 50 | + for i in range(len(random_neighbor)): |
| 51 | + if parent[i] != random_neighbor[i]: |
| 52 | + diffs += 1 |
| 53 | + |
| 54 | + self.assertEqual(1, diffs) |
| 55 | + |
| 56 | +if __name__ == "__main__": |
| 57 | + tests = unittest.TestLoader().loadTestsFromTestCase(StochasticHillClimbingTests) |
| 58 | + unittest.TextTestRunner(verbosity=2).run(tests) |
0 commit comments