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()