import unittest, random import triangulo class TrianguloGoodInput(unittest.TestCase): three_sides = [ ({"A":100, "B":100, "C":100}, {"A":100, "B":100, "C":100, "a":60, "b":60, "c":60}), ({"A":100, "B":70.71067811865, "C":70.71067811865}, {"A":100, "B":70.71067811865, "C":70.71067811865, "a":90, "b":45, "c":45}), ({'A': 100, 'B': 173.20508075688775, 'C': 200}, {'a': 30, 'A': 100, 'c': 90.0, 'b': 60, 'B': 173.20508075688775, 'C': 200.00000000000003}), ] two_sides_one_angle_overlapping = [ ({"A":100, "B":100, "b":60}, {"A":100, "B":100, "C":100, "a":60, "b":60, "c":60}), ({"A":100, "C":70.71067811865, "c":45}, {"A":100, "B":70.71067811865, "C":70.71067811865, "a":90, "b":45, "c":45}), ({'a': 30, 'A': 100, 'C': 200}, {'a': 30, 'A': 100, 'c': 89.999999146226358, 'b': 60.000000853773642, 'B': 173.20508224700384, 'C': 200}), ] two_sides_one_angle_non_overlapping = [ ({"A":100, "B":100, "c":60}, {"A":100, "B":100, "C":100, "a":60, "b":60, "c":60}), ({"A":100, "C":70.71067811865, "b":45}, {"A":100, "B":70.71067811865, "C":70.71067811865, "a":90, "b":45, "c":45}), ({'A': 100, 'b': 60, 'C': 200}, {'a': 30, 'A': 100, 'c': 90.0, 'b': 60, 'B': 173.20508075688775, 'C': 200}), ] one_side_two_angles_overlapping = [ ({"A":100, "a":60, "c":60}, {"A":100, "B":100, "C":100, "a":60, "b":60, "c":60}), ({"A":100, "a":90, "b":45}, {"A":100, "B":70.71067811865, "C":70.71067811865, "a":90, "b":45, "c":45}), ({'A': 100, 'c': 90.0, 'C': 200}, {'a': 30, 'A': 100, 'c': 90.0, 'b': 60, 'B': 173.20508075688775, 'C': 200}), ] one_side_two_angles_non_overlapping = [ ({"A":100, "b":60, "c":60}, {"A":100, "B":100, "C":100, "a":60, "b":60, "c":60}), ({"A":100, "c":45, "b":45}, {"A":100, "B":70.71067811865, "C":70.71067811865, "a":90, "b":45, "c":45}), ] def test_3_sidesgiven(self): for input, expected in self.three_sides: for element, value in triangulo.get_triangle_values(**input).iteritems(): self.assertAlmostEqual(value, expected[element]) def test_2_sides_1_angle_non_overlapping(self): for input, expected in self.two_sides_one_angle_non_overlapping: for element, value in triangulo.get_triangle_values(**input).iteritems(): self.assertAlmostEqual(value, expected[element]) def test_2_sides_1_angle_overlapping(self): for input, expected in self.two_sides_one_angle_overlapping: for element, value in triangulo.get_triangle_values(**input).iteritems(): self.assertAlmostEqual(value, expected[element]) def test_1_side_2_angles_non_overlapping(self): for input, expected in self.one_side_two_angles_non_overlapping: for element, value in triangulo.get_triangle_values(**input).iteritems(): self.assertAlmostEqual(value, expected[element]) def test_1_side_2_angles_overlapping(self): for input, expected in self.one_side_two_angles_overlapping: for element, value in triangulo.get_triangle_values(**input).iteritems(): self.assertAlmostEqual(value, expected[element]) def test_angles(self): """ No matter the input sides, the sum of the angles must be 180. """ for i in range(1): self.assertAlmostEqual( sum( triangulo.get_known_angles( **triangulo.get_triangle_values( A=random.Random().uniform(1,5), B=random.Random().uniform(1,5), c=random.Random().uniform(0,180)) ).itervalues()), 180) class TrianguloBadInput(unittest.TestCase): bad_sides = [ {"A":181, "B":90, "C":90}, {"A":90, "B":181, "C":90}, {"A":90, "B":90, "C":181}, {"A":20, "B":120, "C":90}, {"A":90, "B":20, "C":10}, {"A":0, "B":0, "C":1}, ] bad_angles = [ {"a":90, "b":90, "c":90, "B":90, "C":90}, {"A":90, "B":181, "C":90, "a":90, "b":90, "a":90}, ] few_inputs = [ {"A":100, "B":100}, {"A":100, "C":100}, {"B":100, "C":100}, {"A":100, "b":100}, {"A":100, "c":100}, {"a":100, "C":100}, {"a":100, "B":100}, ] def test_bad_sides(self): """ len([i for i in sides if i <= sum(sides)/2]) == 0 """ for input in self.bad_sides: self.failUnlessRaises(triangulo.InconsistentDataError, triangulo.get_triangle_values, **input) def test_bad_angles(self): """ len([i for i in sides if i <= sum(sides)/2]) == 0 """ for input in self.bad_sides: self.failUnlessRaises(triangulo.InconsistentDataError, triangulo.get_triangle_values, **input) def test_too_few_inputs(self): """ """ for input in self.few_inputs: self.failUnlessRaises(triangulo.InsufficientDataError, triangulo.get_triangle_values, **input) class KnownSides(unittest.TestCase): good_input = [ #100% coverage might be overkill :) ({"A":100, "B":100, "C":100, "a":100, "b":100, "c":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "b":100, "c":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "a":100, "c":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "a":100, "b":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "a":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "b":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "C":100, "c":100}, {"A":100, "B":100, "C":100}), ({"A":100, "B":100, "a":100, "b":100, "c":100}, {"A":100, "B":100}), ({"A":100, "B":100, "b":100, "c":100}, {"A":100, "B":100}), ({"A":100, "B":100, "a":100, "c":100}, {"A":100, "B":100}), ({"A":100, "B":100, "a":100, "b":100}, {"A":100, "B":100}), ({"A":100, "B":100, "a":100}, {"A":100, "B":100}), ({"A":100, "B":100, "b":100}, {"A":100, "B":100}), ({"A":100, "B":100, "c":100}, {"A":100, "B":100}), ({"A":100, "C":100, "a":100, "b":100, "c":100}, {"A":100, "C":100}), ({"A":100, "C":100, "b":100, "c":100}, {"A":100, "C":100}), ({"A":100, "C":100, "a":100, "c":100}, {"A":100, "C":100}), ({"A":100, "C":100, "a":100, "b":100}, {"A":100, "C":100}), ({"A":100, "C":100, "a":100}, {"A":100, "C":100}), ({"A":100, "C":100, "b":100}, {"A":100, "C":100}), ({"A":100, "C":100, "c":100}, {"A":100, "C":100}), ({"B":100, "C":100, "a":100, "b":100, "c":100}, {"B":100, "C":100}), ({"B":100, "C":100, "b":100, "c":100}, {"B":100, "C":100}), ({"B":100, "C":100, "a":100, "c":100}, {"B":100, "C":100}), ({"B":100, "C":100, "a":100, "b":100}, {"B":100, "C":100}), ({"B":100, "C":100, "a":100}, {"B":100, "C":100}), ({"B":100, "C":100, "b":100}, {"B":100, "C":100}), ({"B":100, "C":100, "c":100}, {"B":100, "C":100}), ({"A":100, "a":100, "b":100, "c":100}, {"A":100}), ({"A":100, "b":100, "c":100}, {"A":100}), ({"A":100, "a":100, "c":100}, {"A":100}), ({"A":100, "a":100, "b":100}, {"A":100}), ({"A":100, "a":100}, {"A":100}), ({"A":100, "b":100}, {"A":100}), ({"A":100, "c":100}, {"A":100}), ({"B":100, "a":100, "b":100, "c":100}, {"B":100}), ({"B":100, "b":100, "c":100}, {"B":100}), ({"B":100, "a":100, "c":100}, {"B":100}), ({"B":100, "a":100, "b":100}, {"B":100}), ({"B":100, "a":100}, {"B":100}), ({"B":100, "b":100}, {"B":100}), ({"B":100, "c":100}, {"B":100}), ({"C":100, "a":100, "b":100, "c":100}, {"C":100}), ({"C":100, "b":100, "c":100}, {"C":100}), ({"C":100, "a":100, "c":100}, {"C":100}), ({"C":100, "a":100, "b":100}, {"C":100}), ({"C":100, "a":100}, {"C":100}), ({"C":100, "b":100}, {"C":100}), ({"C":100, "c":100}, {"C":100}), ({"A":100, "B":100, "C":100}, {"A":100, "B":100, "C":100}), ({"B":100, "C":100}, {"B":100, "C":100}), ({"A":100, "C":100}, {"A":100, "C":100}), ({"A":100, "B":100}, {"A":100, "B":100}), ({"A":100}, {"A":100}), ({"B":100}, {"B":100}), ({"C":100}, {"C":100}), ] def test_good_input(self): for input, expected in self.good_input: self.assertEqual(triangulo.get_known_sides(**input), expected) class KnownAngles(unittest.TestCase): good_input = [ #100% coverage might be overkill :) ({"A":100, "B":100, "C":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"A":100, "B":100, "C":100, "b":100, "c":100}, {"b":100, "c":100}), ({"A":100, "B":100, "C":100, "a":100, "c":100}, {"a":100, "c":100}), ({"A":100, "B":100, "C":100, "a":100, "b":100}, {"a":100, "b":100}), ({"A":100, "B":100, "C":100, "a":100}, {"a":100}), ({"A":100, "B":100, "C":100, "b":100}, {"b":100}), ({"A":100, "B":100, "C":100, "c":100}, {"c":100}), ({"A":100, "B":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"A":100, "B":100, "b":100, "c":100}, {"b":100, "c":100}), ({"A":100, "B":100, "a":100, "c":100}, {"a":100, "c":100}), ({"A":100, "B":100, "a":100, "b":100}, {"a":100, "b":100}), ({"A":100, "B":100, "a":100}, {"a":100}), ({"A":100, "B":100, "b":100}, {"b":100}), ({"A":100, "B":100, "c":100}, {"c":100}), ({"A":100, "C":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"A":100, "C":100, "b":100, "c":100}, {"b":100, "c":100}), ({"A":100, "C":100, "a":100, "c":100}, {"a":100, "c":100}), ({"A":100, "C":100, "a":100, "b":100}, {"a":100, "b":100}), ({"A":100, "C":100, "a":100}, {"a":100}), ({"A":100, "C":100, "b":100}, {"b":100}), ({"A":100, "C":100, "c":100}, {"c":100}), ({"B":100, "C":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"B":100, "C":100, "b":100, "c":100}, {"b":100, "c":100}), ({"B":100, "C":100, "a":100, "c":100}, {"a":100, "c":100}), ({"B":100, "C":100, "a":100, "b":100}, {"a":100, "b":100}), ({"B":100, "C":100, "a":100}, {"a":100}), ({"B":100, "C":100, "b":100}, {"b":100}), ({"B":100, "C":100, "c":100}, {"c":100}), ({"A":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"A":100, "b":100, "c":100}, {"b":100, "c":100}), ({"A":100, "a":100, "c":100}, {"a":100, "c":100}), ({"A":100, "a":100, "b":100}, {"a":100, "b":100}), ({"A":100, "a":100}, {"a":100}), ({"A":100, "b":100}, {"b":100}), ({"A":100, "c":100}, {"c":100}), ({"B":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"B":100, "b":100, "c":100}, {"b":100, "c":100}), ({"B":100, "a":100, "c":100}, {"a":100, "c":100}), ({"B":100, "a":100, "b":100}, {"a":100, "b":100}), ({"B":100, "a":100}, {"a":100}), ({"B":100, "b":100}, {"b":100}), ({"B":100, "c":100}, {"c":100}), ({"C":100, "a":100, "b":100, "c":100}, {"a":100, "b":100, "c":100}), ({"C":100, "b":100, "c":100}, {"b":100, "c":100}), ({"C":100, "a":100, "c":100}, {"a":100, "c":100}), ({"C":100, "a":100, "b":100}, {"a":100, "b":100}), ({"C":100, "a":100}, {"a":100}), ({"C":100, "b":100}, {"b":100}), ({"C":100, "c":100}, {"c":100}), ({"A":100, "B":100, "C":100}, {}), ({"B":100, "C":100}, {}), ({"A":100, "C":100}, {}), ({"A":100, "B":100}, {}), ({"A":100}, {}), ({"B":100}, {}), ({"C":100}, {}), ] def test_good_input(self): for input, expected in self.good_input: self.assertEqual(triangulo.get_known_angles(**input), expected) if __name__ == "__main__": unittest.main()