def test_second_argument_type(self): # any type with an __index__ method should be permitted as # a second argument self.assertAlmostEqual(round2(12.34, True), 12.3) class MyIndex(object): def __index__(self): return 4 self.assertAlmostEqual(round2(-0.123456, MyIndex()), -0.1235) # but floats should be illegal self.assertRaises(TypeError, round2, 3.14159, 2.0)
def postscriptWeightNameFallback(info): """ Fallback to the closest match of the *openTypeOS2WeightClass* in this table: === =========== 100 Thin 200 Extra-light 300 Light 400 Normal 500 Medium 600 Semi-bold 700 Bold 800 Extra-bold 900 Black === =========== """ value = getAttrWithFallback(info, "openTypeOS2WeightClass") value = int(round2(value, -2)) if value < 100: value = 100 elif value > 900: value = 900 name = _postscriptWeightNameOptions[value] return name
def _processPostscriptWeightName(self, copiedInfo): # handle postscriptWeightName by taking the value # of openTypeOS2WeightClass and getting the closest # value from the OS/2 specification. name = None if hasattr(copiedInfo, "openTypeOS2WeightClass") and copiedInfo.openTypeOS2WeightClass is not None: v = copiedInfo.openTypeOS2WeightClass # here we use Python 2 rounding (i.e. away from 0) instead of Python 3: # e.g. 150 -> 200 and 250 -> 300, instead of 150 -> 200 and 250 -> 200 v = int(round2(v, -2)) if v < 100: v = 100 elif v > 900: v = 900 name = _postscriptWeightNameOptions[v] copiedInfo.postscriptWeightName = name
def _openTypeOS2WidthClassFormatter(value): """ >>> _openTypeOS2WidthClassFormatter(-2) 1 >>> _openTypeOS2WidthClassFormatter(0) 1 >>> _openTypeOS2WidthClassFormatter(5.4) 5 >>> _openTypeOS2WidthClassFormatter(9.6) 9 >>> _openTypeOS2WidthClassFormatter(12) 9 """ value = int(round2(value)) if value > 9: value = 9 elif value < 1: value = 1 return value
def test_halfway_cases(self): # Halfway cases need special attention, since the current # implementation has to deal with them specially. Note that # 2.x rounds halfway values up (i.e., away from zero) while # 3.x does round-half-to-even. self.assertAlmostEqual(round2(0.125, 2), 0.13) self.assertAlmostEqual(round2(0.375, 2), 0.38) self.assertAlmostEqual(round2(0.625, 2), 0.63) self.assertAlmostEqual(round2(0.875, 2), 0.88) self.assertAlmostEqual(round2(-0.125, 2), -0.13) self.assertAlmostEqual(round2(-0.375, 2), -0.38) self.assertAlmostEqual(round2(-0.625, 2), -0.63) self.assertAlmostEqual(round2(-0.875, 2), -0.88) self.assertAlmostEqual(round2(0.25, 1), 0.3) self.assertAlmostEqual(round2(0.75, 1), 0.8) self.assertAlmostEqual(round2(-0.25, 1), -0.3) self.assertAlmostEqual(round2(-0.75, 1), -0.8) self.assertEqual(round2(-6.5, 0), -7.0) self.assertEqual(round2(-5.5, 0), -6.0) self.assertEqual(round2(-1.5, 0), -2.0) self.assertEqual(round2(-0.5, 0), -1.0) self.assertEqual(round2(0.5, 0), 1.0) self.assertEqual(round2(1.5, 0), 2.0) self.assertEqual(round2(2.5, 0), 3.0) self.assertEqual(round2(3.5, 0), 4.0) self.assertEqual(round2(4.5, 0), 5.0) self.assertEqual(round2(5.5, 0), 6.0) self.assertEqual(round2(6.5, 0), 7.0) # same but without an explicit second argument; in 3.x these # will give integers self.assertEqual(round2(-6.5), -7.0) self.assertEqual(round2(-5.5), -6.0) self.assertEqual(round2(-1.5), -2.0) self.assertEqual(round2(-0.5), -1.0) self.assertEqual(round2(0.5), 1.0) self.assertEqual(round2(1.5), 2.0) self.assertEqual(round2(2.5), 3.0) self.assertEqual(round2(3.5), 4.0) self.assertEqual(round2(4.5), 5.0) self.assertEqual(round2(5.5), 6.0) self.assertEqual(round2(6.5), 7.0) self.assertEqual(round2(-25.0, -1), -30.0) self.assertEqual(round2(-15.0, -1), -20.0) self.assertEqual(round2(-5.0, -1), -10.0) self.assertEqual(round2(5.0, -1), 10.0) self.assertEqual(round2(15.0, -1), 20.0) self.assertEqual(round2(25.0, -1), 30.0) self.assertEqual(round2(35.0, -1), 40.0) self.assertEqual(round2(45.0, -1), 50.0) self.assertEqual(round2(55.0, -1), 60.0) self.assertEqual(round2(65.0, -1), 70.0) self.assertEqual(round2(75.0, -1), 80.0) self.assertEqual(round2(85.0, -1), 90.0) self.assertEqual(round2(95.0, -1), 100.0) self.assertEqual(round2(12325.0, -1), 12330.0) self.assertEqual(round2(0, -1), 0.0) self.assertEqual(round2(350.0, -2), 400.0) self.assertEqual(round2(450.0, -2), 500.0) self.assertAlmostEqual(round2(0.5e21, -21), 1e21) self.assertAlmostEqual(round2(1.5e21, -21), 2e21) self.assertAlmostEqual(round2(2.5e21, -21), 3e21) self.assertAlmostEqual(round2(5.5e21, -21), 6e21) self.assertAlmostEqual(round2(8.5e21, -21), 9e21) self.assertAlmostEqual(round2(-1.5e22, -22), -2e22) self.assertAlmostEqual(round2(-0.5e22, -22), -1e22) self.assertAlmostEqual(round2(0.5e22, -22), 1e22) self.assertAlmostEqual(round2(1.5e22, -22), 2e22)
def round(self, multiple=1): multiple = float(multiple) for k, v in self._kerning.items(): self._kerning[k] = int(round2(int(round2(v / multiple)) * multiple))
def round(self, multiple=1): multiple = float(multiple) for k, v in self._kerning.items(): self._kerning[k] = int(round2( int(round2(v / multiple)) * multiple))