1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4try:
5    unicode
6except NameError:
7    unicode = str
8
9
10try:
11    long
12except NameError:
13    long = int
14
15
16class TestNumberFormatter (TestCase):
17    def testTypes(self):
18        self.assertIsCFType(CFNumberFormatterRef)
19
20    def testTypeID(self):
21        self.assertIsInstance(CFNumberFormatterGetTypeID(), (int, long))
22
23    def testFuncs(self):
24        locale = CFLocaleCopyCurrent()
25        fmt = CFNumberFormatterCreate(None, locale, kCFNumberFormatterDecimalStyle)
26        self.assertIsInstance(fmt, CFNumberFormatterRef)
27        v = CFNumberFormatterGetLocale(fmt)
28        self.assertIs(v, locale)
29        v = CFNumberFormatterGetStyle(fmt)
30        self.assertEqual(v , kCFNumberFormatterDecimalStyle)
31        v = CFNumberFormatterGetFormat(fmt)
32        self.assertIsInstance(v, unicode)
33        CFNumberFormatterSetFormat(fmt, v[:-2])
34        v2 = CFNumberFormatterGetFormat(fmt)
35        self.assertEqual(v2 , v[:-2])
36        v = CFNumberFormatterCreateStringWithNumber(None, fmt, 42.5)
37        self.assertIsInstance(v, unicode)
38        self.assertEqual(v , b'42.5'.decode('ascii'))
39        num, rng = CFNumberFormatterCreateNumberFromString(None, fmt, b"42.0a".decode('ascii'), (0, 5), 0)
40        self.assertEqual(num , 42.0)
41        self.assertEqual(rng , (0, 4))
42        num, rng = CFNumberFormatterCreateNumberFromString(None, fmt, b"42.0a".decode('ascii'), (0, 5), kCFNumberFormatterParseIntegersOnly)
43        self.assertEqual(num , 42)
44        self.assertEqual(rng , (0, 2))
45        v = CFNumberFormatterCopyProperty(fmt, kCFNumberFormatterCurrencyCode)
46        self.assertIsInstance(v, unicode)
47        CFNumberFormatterSetProperty(fmt, kCFNumberFormatterCurrencyCode, b"HFL".decode('ascii'))
48
49        self.assertResultIsCFRetained(CFNumberFormatterCopyProperty)
50        v = CFNumberFormatterCopyProperty(fmt, kCFNumberFormatterCurrencyCode)
51        self.assertEqual(v , b"HFL".decode('ascii'))
52        self.assertArgIsOut(CFNumberFormatterGetDecimalInfoForCurrencyCode, 1)
53        self.assertArgIsOut(CFNumberFormatterGetDecimalInfoForCurrencyCode, 2)
54        ok, frac, rnd = CFNumberFormatterGetDecimalInfoForCurrencyCode("EUR", None, None)
55        self.assertEqual(ok, True)
56        self.assertEqual(frac, 2)
57        self.assertEqual(rnd, 0.0)
58
59    def testConstants(self):
60        self.assertEqual(kCFNumberFormatterNoStyle, 0)
61        self.assertEqual(kCFNumberFormatterDecimalStyle, 1)
62        self.assertEqual(kCFNumberFormatterCurrencyStyle, 2)
63        self.assertEqual(kCFNumberFormatterPercentStyle, 3)
64        self.assertEqual(kCFNumberFormatterScientificStyle, 4)
65        self.assertEqual(kCFNumberFormatterSpellOutStyle, 5)
66
67        self.assertEqual(kCFNumberFormatterParseIntegersOnly, 1)
68
69        self.assertEqual(kCFNumberFormatterRoundCeiling, 0)
70        self.assertEqual(kCFNumberFormatterRoundFloor, 1)
71        self.assertEqual(kCFNumberFormatterRoundDown, 2)
72        self.assertEqual(kCFNumberFormatterRoundUp, 3)
73        self.assertEqual(kCFNumberFormatterRoundHalfEven, 4)
74        self.assertEqual(kCFNumberFormatterRoundHalfDown, 5)
75        self.assertEqual(kCFNumberFormatterRoundHalfUp, 6)
76
77        self.assertEqual(kCFNumberFormatterPadBeforePrefix, 0)
78        self.assertEqual(kCFNumberFormatterPadAfterPrefix, 1)
79        self.assertEqual(kCFNumberFormatterPadBeforeSuffix, 2)
80        self.assertEqual(kCFNumberFormatterPadAfterSuffix, 3)
81
82        self.assertIsInstance(kCFNumberFormatterCurrencyCode, unicode)
83        self.assertIsInstance(kCFNumberFormatterDecimalSeparator, unicode)
84        self.assertIsInstance(kCFNumberFormatterCurrencyDecimalSeparator, unicode)
85        self.assertIsInstance(kCFNumberFormatterAlwaysShowDecimalSeparator, unicode)
86        self.assertIsInstance(kCFNumberFormatterGroupingSeparator, unicode)
87        self.assertIsInstance(kCFNumberFormatterUseGroupingSeparator, unicode)
88        self.assertIsInstance(kCFNumberFormatterPercentSymbol, unicode)
89        self.assertIsInstance(kCFNumberFormatterZeroSymbol, unicode)
90        self.assertIsInstance(kCFNumberFormatterNaNSymbol, unicode)
91        self.assertIsInstance(kCFNumberFormatterInfinitySymbol, unicode)
92        self.assertIsInstance(kCFNumberFormatterMinusSign, unicode)
93        self.assertIsInstance(kCFNumberFormatterPlusSign, unicode)
94        self.assertIsInstance(kCFNumberFormatterCurrencySymbol, unicode)
95        self.assertIsInstance(kCFNumberFormatterExponentSymbol, unicode)
96        self.assertIsInstance(kCFNumberFormatterMinIntegerDigits, unicode)
97        self.assertIsInstance(kCFNumberFormatterMaxIntegerDigits, unicode)
98        self.assertIsInstance(kCFNumberFormatterMinFractionDigits, unicode)
99        self.assertIsInstance(kCFNumberFormatterMaxFractionDigits, unicode)
100        self.assertIsInstance(kCFNumberFormatterGroupingSize, unicode)
101        self.assertIsInstance(kCFNumberFormatterSecondaryGroupingSize, unicode)
102        self.assertIsInstance(kCFNumberFormatterRoundingMode, unicode)
103        self.assertIsInstance(kCFNumberFormatterRoundingIncrement, unicode)
104        self.assertIsInstance(kCFNumberFormatterFormatWidth, unicode)
105        self.assertIsInstance(kCFNumberFormatterPaddingPosition, unicode)
106        self.assertIsInstance(kCFNumberFormatterPaddingCharacter, unicode)
107        self.assertIsInstance(kCFNumberFormatterDefaultFormat, unicode)
108        self.assertIsInstance(kCFNumberFormatterMultiplier, unicode)
109        self.assertIsInstance(kCFNumberFormatterPositivePrefix, unicode)
110        self.assertIsInstance(kCFNumberFormatterPositiveSuffix, unicode)
111        self.assertIsInstance(kCFNumberFormatterNegativePrefix, unicode)
112        self.assertIsInstance(kCFNumberFormatterNegativeSuffix, unicode)
113        self.assertIsInstance(kCFNumberFormatterPerMillSymbol, unicode)
114        self.assertIsInstance(kCFNumberFormatterInternationalCurrencySymbol, unicode)
115
116    @min_os_level('10.5')
117    def testConstants10_5(self):
118        self.assertIsInstance(kCFNumberFormatterCurrencyGroupingSeparator, unicode)
119        self.assertIsInstance(kCFNumberFormatterIsLenient, unicode)
120        self.assertIsInstance(kCFNumberFormatterUseSignificantDigits, unicode)
121        self.assertIsInstance(kCFNumberFormatterMinSignificantDigits, unicode)
122        self.assertIsInstance(kCFNumberFormatterMaxSignificantDigits, unicode)
123
124if __name__ == "__main__":
125    main()
126