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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
From a016c11d41b3f4f6cdb51eedd5fd652ee8303c8d Mon Sep 17 00:00:00 2001
From: Mark Pilgrim <mark@diveintopython.org>
Date: Thu, 8 Oct 2015 13:03:41 -0700
Subject: add test suite
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Add test suite, extracted from the “Dive Into Python” book (package
diveintopython).
Origin: upstream
Last-Update: 2012-05-05
Patch-Name: tests.diff
---
tests/romantest.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 tests/romantest.py
diff --git a/tests/romantest.py b/tests/romantest.py
new file mode 100644
index 0000000..a20cef2
--- /dev/null
+++ b/tests/romantest.py
@@ -0,0 +1,153 @@
+"""Unit test for roman.py
+
+This program is part of "Dive Into Python", a free Python book for
+experienced programmers. Visit http://diveintopython.org/ for the
+latest version.
+"""
+
+__author__ = "Mark Pilgrim (mark@diveintopython.org)"
+__version__ = "$Revision: 1.2 $"
+__date__ = "$Date: 2004/05/05 21:57:19 $"
+__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
+__license__ = "Python"
+
+import roman
+import unittest
+
+class KnownValues(unittest.TestCase):
+ knownValues = ( (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'),
+ (4000, 'MMMM'),
+ (4500, 'MMMMD'),
+ (4888, 'MMMMDCCCLXXXVIII'),
+ (4999, 'MMMMCMXCIX'))
+
+ def testToRomanKnownValues(self):
+ """toRoman should give known result with known input"""
+ for integer, numeral in self.knownValues:
+ result = roman.toRoman(integer)
+ self.assertEqual(numeral, result)
+
+ def testFromRomanKnownValues(self):
+ """fromRoman should give known result with known input"""
+ for integer, numeral in self.knownValues:
+ result = roman.fromRoman(numeral)
+ self.assertEqual(integer, result)
+
+class ToRomanBadInput(unittest.TestCase):
+ def testTooLarge(self):
+ """toRoman should fail with large input"""
+ self.assertRaises(roman.OutOfRangeError, roman.toRoman, 5000)
+
+ def testZero(self):
+ """toRoman should fail with 0 input"""
+ self.assertRaises(roman.OutOfRangeError, roman.toRoman, 0)
+
+ def testNegative(self):
+ """toRoman should fail with negative input"""
+ self.assertRaises(roman.OutOfRangeError, roman.toRoman, -1)
+
+ def testDecimal(self):
+ """toRoman should fail with non-integer input"""
+ self.assertRaises(roman.NotIntegerError, roman.toRoman, 0.5)
+
+class FromRomanBadInput(unittest.TestCase):
+ def testTooManyRepeatedNumerals(self):
+ """fromRoman should fail with too many repeated numerals"""
+ for s in ('MMMMM', 'DD', 'CCCC', 'LL', 'XXXX', 'VV', 'IIII'):
+ self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman, s)
+
+ def testRepeatedPairs(self):
+ """fromRoman should fail with repeated pairs of numerals"""
+ for s in ('CMCM', 'CDCD', 'XCXC', 'XLXL', 'IXIX', 'IVIV'):
+ self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman, s)
+
+ def testMalformedAntecedent(self):
+ """fromRoman should fail with malformed antecedents"""
+ for s in ('IIMXCC', 'VX', 'DCM', 'CMM', 'IXIV',
+ 'MCMC', 'XCX', 'IVI', 'LM', 'LD', 'LC'):
+ self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman, s)
+
+ def testBlank(self):
+ """fromRoman should fail with blank string"""
+ self.assertRaises(roman.InvalidRomanNumeralError, roman.fromRoman, "")
+
+class SanityCheck(unittest.TestCase):
+ def testSanity(self):
+ """fromRoman(toRoman(n))==n for all n"""
+ for integer in range(1, 5000):
+ numeral = roman.toRoman(integer)
+ result = roman.fromRoman(numeral)
+ self.assertEqual(integer, result)
+
+class CaseCheck(unittest.TestCase):
+ def testToRomanCase(self):
+ """toRoman should always return uppercase"""
+ for integer in range(1, 5000):
+ numeral = roman.toRoman(integer)
+ self.assertEqual(numeral, numeral.upper())
+
+ def testFromRomanCase(self):
+ """fromRoman should only accept uppercase input"""
+ for integer in range(1, 5000):
+ numeral = roman.toRoman(integer)
+ roman.fromRoman(numeral.upper())
+ self.assertRaises(roman.InvalidRomanNumeralError,
+ roman.fromRoman, numeral.lower())
+
+if __name__ == "__main__":
+ unittest.main()
|