-
Notifications
You must be signed in to change notification settings - Fork 0
/
romantest.py
120 lines (105 loc) · 4.16 KB
/
romantest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import roman4 as roman
import unittest
class KnownValue(unittest.TestCase):
knowValues = ((1,'I'),
(2,'II'),
(3, 'III'),
(4, 'IV'),
(5, 'V'),
(6, 'VI'),
(7, 'VII'),
(8, 'VIII'),
(9, 'IX'),
(10, 'X'),
(50, 'L'),
(100, 'C'),
(500, 'D'),
(1000, 'M'),
(31, 'XXXI'),
(148, 'CXLVIII'),
(294, 'CCXCIV'),
(312, 'CCCXII'),
(421,'CDXXI'),
(528,'DXXVIII'),
(621,'DCXXI'),
(782,'DCCLXXXII'),
(870,'DCCCLXX'),
(941,'CMXLI'),
(1043,'MXLIII'),
(1110,'MCX'),
(1226,'MCCXXVI'),
(1301,'MCCCI'),
(1485,'MCDLXXXV'),
(1509,'MDIX'),
(1607,'MDCVII'),
(1754,'MDCCLIV'),
(1832,'MDCCCXXXII'),
(1993,'MCMXCIII'),
(2074,'MMLXXIV'),
(2152,'MMCLII'),
(2212,'MMCCXII'),
(2343,'MMCCCXLIII'),
(2499,'MMCDXCIX'),
(2574, 'MMDLXXIV'),
(2646, 'MMDCXLVI'),
(2723, 'MMDCCXXIII'),
(2892, 'MMDCCCXCII'),
(2975, 'MMCMLXXV'),
(3051, 'MMMLI'),
(3185, 'MMMCLXXXV'),
(3250, 'MMMCCL'),
(3313, 'MMMCCCXIII'),
(3408, 'MMMCDVIII'),
(3501, 'MMMDI'),
(3610, 'MMMDCX'),
(3743, 'MMMDCCXLIII'),
(3844, 'MMMDCCCXLIV'),
(3888, 'MMMDCCCLXXXVIII'),
(3940, 'MMMCMXL'),
(3999, 'MMMCMXCIX'))
def testToRomanKnownValues(self):
for integer, numeral in self.knowValues:
result = roman.toRoman(integer)
self.assertEqual(numeral,result)
def testFromRomanKnownValues(self):
for integer, numeral in self.knowValues:
result = roman.fromRoman(numeral)
self.assertEqual(integer,result)
def testTooLarge(self):
self.assertRaises(roman.OutOfRangeError, roman.toRoman,4000)
def testZero(self):
self.assertRaises(roman.OutOfRangeError, roman.toRoman, 0)
def testNegative(self):
self.assertRaises(roman.OutOfRangeError, roman.toRoman, -1)
def testNonInteger(self):
self.assertRaises(roman.NotIntegerError, roman.toRoman, 0.5)
def testTooManyRepeatedNumerals(self):
for s in ('MMM','DD','CCCC','LL','XXXX','VV','IIII'):
self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman,numeral)
def testRepeatedPairs(self):
for s in ('CMCM','CDCD','XCXC','XLXL','IXIX','IVIV'):
self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman,numeral)
def testMalformedAntecedent(self):
for s in ('IIMXCC','VX','DCM','CMM','IXIV','MCMC','XCX','IVI','LM','LD','LC'):
self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman,numeral)
class SanityCheck(unittest.TestCase):
def testSanity(self):
##fromRoman(toRoman(n)) == n for all n
for integer in range(1,4000):
numeral = roman.toRoman(integer)
result = roman.fromRoman(numeral)
self.assertEqual(integer,result)
class CaseCheck(unittest.TestCase):
def testToRomanCase(self):
##toRoman should be upperCase
for integer in range(1,4000):
numeral = roman.toRoman(integer)
self.assertEqual(numeral,numeral.upper())
def testFromRomanCase(self):
##fromRoman should only accept uppercase
for integer in range(1,4000):
numeral = roman.toRoman(integer)
roman.fromRoman(numeral.upper())
self.assertRaises(roman.InvalidRomanNumeralError,roman.fromRoman,numeral.lower())
if __name__ == "__main__":
unittest.main()