Consolidate unit handling and use proxy classes.
[cookbook.git] / cookbook / tests.py
1 """
2 This file demonstrates writing tests using the unittest module. These will pass
3 when you run "manage.py test".
4
5 Replace this with more appropriate tests for your application.
6 """
7
8 from django.forms import ValidationError
9 from django.test import TestCase
10 from . import models
11
12
13 class UnitTest(TestCase):
14     def setUp(self):
15         self.F = models.Unit(
16             name=u'degree Farenheit', abbrev=u'\u00b0F', type=u'temperature',
17             system=models.US, scale=1/1.8, offset=32)
18         self.gal = models.Unit(
19             name=u'gallon', abbrev=u'gal', type=u'volume',
20             system=models.US, scale=3.78541, offset=0)
21
22     def test_conversion_from_si(self):
23         "Test from-SI conversion"
24         self.assertEqual(self.F.convert_from_si(0), 32)
25         self.assertEqual(self.F.convert_from_si(100), 212)
26         self.assertEqual(self.gal.convert_from_si(1), 0.26417217685798894)
27
28     def test_conversion_to_si(self):
29         "Test to-SI conversion"
30         self.assertEqual(self.F.convert_to_si(32), 0)
31         self.assertEqual(self.F.convert_to_si(212), 100)
32         self.assertEqual(self.gal.convert_to_si(1), 3.78541)
33
34     def test_formatting(self):
35         "Test amount formatting"
36         self.assertEqual(unicode(self.gal), u'gal')
37         self.assertEqual(unicode(self.F), u'\u00b0F')
38
39
40 class AmountTest(TestCase):
41     def setUp(self):
42         self.unit = models.Unit(
43             name=u'gallon', abbrev=u'gal', type=u'volume',
44             system=models.US, scale=3.78541, offset=0)
45         self.amount = models.Amount()
46
47     def test_formatting(self):
48         "Test amount formatting"
49         for v,minv,maxv,unit,result in (
50             (None, None, None, None, u'-'),
51             (None, None, None, self.unit, u'- gal'),
52             (2,    None, None, self.unit, u'2 gal'),
53             (2,     1.5, None, self.unit, u'1.5-2 gal'),
54             (2,    None,  2.5, self.unit, u'2-2.5 gal'),
55             (2,     1.5,  2.5, self.unit, u'2 (1.5-2.5) gal'),
56             (None,  1.5,  2.5, self.unit, u'1.5-2.5 gal'),
57             ):
58             self.amount.unit = unit
59             self.amount.value = v
60             self.amount.min_value = minv
61             self.amount.max_value = maxv
62             self.assertEqual(self.amount.format_amount(), result)
63
64     def test_invalid_formatting(self):
65         "Test amount formatting which raises errors"
66         for v,minv,maxv,unit,result in (
67             (None,  1.5, None, self.unit, u'2 gal'),
68             (None, None,  2.5, self.unit, u'2 gal'),
69             ):
70             self.amount.unit = unit
71             self.amount.value = v
72             self.amount.min_value = minv
73             self.amount.max_value = maxv
74             self.assertRaises(ValidationError, self.amount.format_amount)
75
76     def test_validation(self):
77         "Test amount validation"
78         for valid,v,minv,maxv,unit in (
79             (True,  None, None, None, None),
80             (True,  None, None, None, self.unit),
81             (True,  2,    None, None, self.unit),
82             (True,  2,     1.5, None, self.unit),
83             (True,  2,    None,  2.5, self.unit),
84             (True,  2,     1.5,  2.5, self.unit),
85             (True,  None,  1.5,  2.5, self.unit),
86             (False, None,  1.5, None, self.unit),
87             (False, None, None,  2.5, self.unit),
88             ):
89             self.amount.unit = unit
90             self.amount.value = v
91             self.amount.min_value = minv
92             self.amount.max_value = maxv
93             if valid:
94                 self.amount.validate_amount()
95             else:
96                 self.assertRaises(ValidationError, self.amount.format_amount)