/tests/src/python/test_qgsnumericformat.py

https://github.com/ricardogsilva/Quantum-GIS · Python · 801 lines · 706 code · 79 blank · 16 comment · 2 complexity · 5d4aefba949a9365843103c6fb5df2d5 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """QGIS Unit tests for QgsNumericFormat
  3. .. note:: This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. """
  8. __author__ = 'Nyall Dawson'
  9. __date__ = '6/01/2020'
  10. __copyright__ = 'Copyright 2020, The QGIS Project'
  11. import qgis # NOQA
  12. from qgis.core import (QgsFallbackNumericFormat,
  13. QgsBasicNumericFormat,
  14. QgsNumericFormatContext,
  15. QgsBearingNumericFormat,
  16. QgsPercentageNumericFormat,
  17. QgsScientificNumericFormat,
  18. QgsCurrencyNumericFormat,
  19. QgsNumericFormatRegistry,
  20. QgsNumericFormat,
  21. QgsFractionNumericFormat,
  22. QgsReadWriteContext)
  23. from qgis.testing import start_app, unittest
  24. from qgis.PyQt.QtXml import QDomDocument
  25. start_app()
  26. class TestFormat(QgsNumericFormat):
  27. def id(self):
  28. return 'test'
  29. def formatDouble(self, value, context):
  30. return 'xxx' + str(value)
  31. def visibleName(self):
  32. return 'Test'
  33. def clone(self):
  34. return TestFormat()
  35. def create(self, configuration, context):
  36. return TestFormat()
  37. def configuration(self, context):
  38. return {}
  39. class TestQgsNumericFormat(unittest.TestCase):
  40. def testFallbackFormat(self):
  41. """ test fallback formatter """
  42. f = QgsFallbackNumericFormat()
  43. context = QgsNumericFormatContext()
  44. self.assertEqual(f.formatDouble(5, context), '5')
  45. self.assertEqual(f.formatDouble(5.5, context), '5.5')
  46. self.assertEqual(f.formatDouble(-5, context), '-5')
  47. self.assertEqual(f.formatDouble(-5.5, context), '-5.5')
  48. f2 = f.clone()
  49. self.assertIsInstance(f2, QgsFallbackNumericFormat)
  50. doc = QDomDocument("testdoc")
  51. elem = doc.createElement("test")
  52. f2.writeXml(elem, doc, QgsReadWriteContext())
  53. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  54. self.assertIsInstance(f3, QgsFallbackNumericFormat)
  55. def testEquality(self):
  56. f = QgsBasicNumericFormat()
  57. f2 = QgsBasicNumericFormat()
  58. self.assertEqual(f, f2)
  59. f2.setShowPlusSign(True)
  60. self.assertNotEqual(f, f2)
  61. f.setShowPlusSign(True)
  62. self.assertEqual(f, f2)
  63. self.assertNotEqual(f, QgsCurrencyNumericFormat())
  64. def testBasicFormat(self):
  65. """ test basic formatter """
  66. f = QgsBasicNumericFormat()
  67. context = QgsNumericFormatContext()
  68. self.assertEqual(f.formatDouble(0, context), '0')
  69. self.assertEqual(f.formatDouble(5, context), '5')
  70. self.assertEqual(f.formatDouble(5.5, context), '5.5')
  71. self.assertEqual(f.formatDouble(-5, context), '-5')
  72. self.assertEqual(f.formatDouble(-5.5, context), '-5.5')
  73. self.assertEqual(f.formatDouble(-55555555.5, context), '-55,555,555.5')
  74. context.setDecimalSeparator('☕')
  75. self.assertEqual(f.formatDouble(0, context), '0')
  76. self.assertEqual(f.formatDouble(-5.5, context), '-5☕5')
  77. self.assertEqual(f.formatDouble(-55555555.5, context), '-55,555,555☕5')
  78. context.setThousandsSeparator('⚡')
  79. self.assertEqual(f.formatDouble(-5.5, context), '-5☕5')
  80. self.assertEqual(f.formatDouble(-55555555.5, context), '-55⚡555⚡555☕5')
  81. f.setShowThousandsSeparator(False)
  82. self.assertEqual(f.formatDouble(-5.5, context), '-5☕5')
  83. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555☕5')
  84. context.setDecimalSeparator('.')
  85. f.setDecimalSeparator('⛹')
  86. self.assertEqual(f.formatDouble(-5.5, context), '-5⛹5')
  87. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555⛹5')
  88. f.setNumberDecimalPlaces(0)
  89. self.assertEqual(f.formatDouble(0, context), '0')
  90. self.assertEqual(f.formatDouble(5.5, context), '6')
  91. self.assertEqual(f.formatDouble(55555555.5, context), '55555556')
  92. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555')
  93. self.assertEqual(f.formatDouble(-5.5, context), '-6')
  94. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555556')
  95. f.setNumberDecimalPlaces(3)
  96. self.assertEqual(f.formatDouble(0, context), '0')
  97. self.assertEqual(f.formatDouble(5.5, context), '5⛹5')
  98. self.assertEqual(f.formatDouble(55555555.5, context), '55555555⛹5')
  99. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555⛹123')
  100. self.assertEqual(f.formatDouble(-5.5, context), '-5⛹5')
  101. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555⛹5')
  102. f.setShowTrailingZeros(True)
  103. self.assertEqual(f.formatDouble(0, context), '0⛹000')
  104. self.assertEqual(f.formatDouble(5, context), '5⛹000')
  105. self.assertEqual(f.formatDouble(-5, context), '-5⛹000')
  106. self.assertEqual(f.formatDouble(5.5, context), '5⛹500')
  107. self.assertEqual(f.formatDouble(55555555.5, context), '55555555⛹500')
  108. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555⛹123')
  109. self.assertEqual(f.formatDouble(-5.5, context), '-5⛹500')
  110. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555⛹500')
  111. f.setShowPlusSign(True)
  112. self.assertEqual(f.formatDouble(0, context), '0⛹000')
  113. self.assertEqual(f.formatDouble(5, context), '+5⛹000')
  114. self.assertEqual(f.formatDouble(-5, context), '-5⛹000')
  115. self.assertEqual(f.formatDouble(5.5, context), '+5⛹500')
  116. self.assertEqual(f.formatDouble(55555555.5, context), '+55555555⛹500')
  117. self.assertEqual(f.formatDouble(55555555.123456, context), '+55555555⛹123')
  118. self.assertEqual(f.formatDouble(-5.5, context), '-5⛹500')
  119. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555⛹500')
  120. context.setPositiveSign('w')
  121. self.assertEqual(f.formatDouble(5, context), 'w5⛹000')
  122. self.assertEqual(f.formatDouble(-5, context), '-5⛹000')
  123. self.assertEqual(f.formatDouble(5.5, context), 'w5⛹500')
  124. f.setShowPlusSign(False)
  125. f.setRoundingType(QgsBasicNumericFormat.SignificantFigures)
  126. self.assertEqual(f.formatDouble(0, context), '0⛹00')
  127. self.assertEqual(f.formatDouble(5, context), '5⛹00')
  128. self.assertEqual(f.formatDouble(-5, context), '-5⛹00')
  129. self.assertEqual(f.formatDouble(5.5, context), '5⛹50')
  130. self.assertEqual(f.formatDouble(1231.23123123123123, context), '1230')
  131. self.assertEqual(f.formatDouble(123.123123123123123, context), '123')
  132. self.assertEqual(f.formatDouble(12.3123123123123123, context), '12⛹3')
  133. self.assertEqual(f.formatDouble(1.23123123123123123, context), '1⛹23')
  134. self.assertEqual(f.formatDouble(-1231.23123123123123, context), '-1230')
  135. self.assertEqual(f.formatDouble(-123.123123123123123, context), '-123')
  136. self.assertEqual(f.formatDouble(-12.3123123123123123, context), '-12⛹3')
  137. self.assertEqual(f.formatDouble(-1.23123123123123123, context), '-1⛹23')
  138. self.assertEqual(f.formatDouble(100, context), '100')
  139. self.assertEqual(f.formatDouble(1000, context), '1000')
  140. self.assertEqual(f.formatDouble(1001, context), '1000')
  141. self.assertEqual(f.formatDouble(9999, context), '10000')
  142. self.assertEqual(f.formatDouble(10, context), '10⛹0')
  143. self.assertEqual(f.formatDouble(1, context), '1⛹00')
  144. self.assertEqual(f.formatDouble(0.00000123456, context), '0⛹00000123')
  145. self.assertEqual(f.formatDouble(55555555.5, context), '55600000')
  146. self.assertEqual(f.formatDouble(55555555.123456, context), '55600000')
  147. self.assertEqual(f.formatDouble(-5.5, context), '-5⛹50')
  148. self.assertEqual(f.formatDouble(-55555555.5, context), '-55600000')
  149. f.setThousandsSeparator('✅')
  150. f.setShowThousandsSeparator(True)
  151. self.assertEqual(f.formatDouble(-55555555.5, context), '-55✅600✅000')
  152. f.setShowThousandsSeparator(False)
  153. f.setShowPlusSign(True)
  154. f2 = f.clone()
  155. self.assertIsInstance(f2, QgsBasicNumericFormat)
  156. self.assertEqual(f2.showTrailingZeros(), f.showTrailingZeros())
  157. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  158. self.assertEqual(f2.numberDecimalPlaces(), f.numberDecimalPlaces())
  159. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  160. self.assertEqual(f2.roundingType(), f.roundingType())
  161. self.assertEqual(f2.thousandsSeparator(), f.thousandsSeparator())
  162. self.assertEqual(f2.decimalSeparator(), f.decimalSeparator())
  163. doc = QDomDocument("testdoc")
  164. elem = doc.createElement("test")
  165. f2.writeXml(elem, doc, QgsReadWriteContext())
  166. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  167. self.assertIsInstance(f3, QgsBasicNumericFormat)
  168. self.assertEqual(f3.showTrailingZeros(), f.showTrailingZeros())
  169. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  170. self.assertEqual(f3.numberDecimalPlaces(), f.numberDecimalPlaces())
  171. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  172. self.assertEqual(f3.roundingType(), f.roundingType())
  173. self.assertEqual(f3.thousandsSeparator(), f.thousandsSeparator())
  174. self.assertEqual(f3.decimalSeparator(), f.decimalSeparator())
  175. def testCurrencyFormat(self):
  176. """ test currency formatter """
  177. f = QgsCurrencyNumericFormat()
  178. f.setPrefix('$')
  179. context = QgsNumericFormatContext()
  180. f.setShowTrailingZeros(False)
  181. self.assertEqual(f.formatDouble(0, context), '$0')
  182. self.assertEqual(f.formatDouble(5, context), '$5')
  183. self.assertEqual(f.formatDouble(5.5, context), '$5.5')
  184. self.assertEqual(f.formatDouble(-5, context), '-$5')
  185. self.assertEqual(f.formatDouble(-5.5, context), '-$5.5')
  186. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55,555,555.5')
  187. context.setDecimalSeparator('x')
  188. self.assertEqual(f.formatDouble(0, context), '$0')
  189. self.assertEqual(f.formatDouble(-5.5, context), '-$5x5')
  190. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55,555,555x5')
  191. context.setThousandsSeparator('y')
  192. self.assertEqual(f.formatDouble(-5.5, context), '-$5x5')
  193. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55y555y555x5')
  194. f.setShowThousandsSeparator(False)
  195. self.assertEqual(f.formatDouble(-5.5, context), '-$5x5')
  196. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555555x5')
  197. context.setDecimalSeparator('.')
  198. f.setNumberDecimalPlaces(0)
  199. self.assertEqual(f.formatDouble(0, context), '$0')
  200. self.assertEqual(f.formatDouble(5.5, context), '$6')
  201. self.assertEqual(f.formatDouble(55555555.5, context), '$55555556')
  202. self.assertEqual(f.formatDouble(55555555.123456, context), '$55555555')
  203. self.assertEqual(f.formatDouble(-5.5, context), '-$6')
  204. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555556')
  205. f.setNumberDecimalPlaces(3)
  206. self.assertEqual(f.formatDouble(0, context), '$0')
  207. self.assertEqual(f.formatDouble(5.5, context), '$5.5')
  208. self.assertEqual(f.formatDouble(55555555.5, context), '$55555555.5')
  209. self.assertEqual(f.formatDouble(55555555.123456, context), '$55555555.123')
  210. self.assertEqual(f.formatDouble(-5.5, context), '-$5.5')
  211. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555555.5')
  212. f.setShowTrailingZeros(True)
  213. self.assertEqual(f.formatDouble(0, context), '$0.000')
  214. self.assertEqual(f.formatDouble(5, context), '$5.000')
  215. self.assertEqual(f.formatDouble(-5, context), '-$5.000')
  216. self.assertEqual(f.formatDouble(5.5, context), '$5.500')
  217. self.assertEqual(f.formatDouble(55555555.5, context), '$55555555.500')
  218. self.assertEqual(f.formatDouble(55555555.123456, context), '$55555555.123')
  219. self.assertEqual(f.formatDouble(-5.5, context), '-$5.500')
  220. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555555.500')
  221. f.setShowPlusSign(True)
  222. self.assertEqual(f.formatDouble(0, context), '$0.000')
  223. self.assertEqual(f.formatDouble(5, context), '+$5.000')
  224. self.assertEqual(f.formatDouble(-5, context), '-$5.000')
  225. self.assertEqual(f.formatDouble(5.5, context), '+$5.500')
  226. self.assertEqual(f.formatDouble(55555555.5, context), '+$55555555.500')
  227. self.assertEqual(f.formatDouble(55555555.123456, context), '+$55555555.123')
  228. self.assertEqual(f.formatDouble(-5.5, context), '-$5.500')
  229. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555555.500')
  230. f.setSuffix('AUD')
  231. self.assertEqual(f.formatDouble(0, context), '$0.000AUD')
  232. self.assertEqual(f.formatDouble(5, context), '+$5.000AUD')
  233. self.assertEqual(f.formatDouble(-5, context), '-$5.000AUD')
  234. self.assertEqual(f.formatDouble(5.5, context), '+$5.500AUD')
  235. self.assertEqual(f.formatDouble(55555555.5, context), '+$55555555.500AUD')
  236. self.assertEqual(f.formatDouble(55555555.123456, context), '+$55555555.123AUD')
  237. self.assertEqual(f.formatDouble(-5.5, context), '-$5.500AUD')
  238. self.assertEqual(f.formatDouble(-55555555.5, context), '-$55555555.500AUD')
  239. f2 = f.clone()
  240. self.assertIsInstance(f2, QgsCurrencyNumericFormat)
  241. self.assertEqual(f2.showTrailingZeros(), f.showTrailingZeros())
  242. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  243. self.assertEqual(f2.numberDecimalPlaces(), f.numberDecimalPlaces())
  244. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  245. self.assertEqual(f2.prefix(), f.prefix())
  246. self.assertEqual(f2.suffix(), f.suffix())
  247. doc = QDomDocument("testdoc")
  248. elem = doc.createElement("test")
  249. f2.writeXml(elem, doc, QgsReadWriteContext())
  250. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  251. self.assertIsInstance(f3, QgsCurrencyNumericFormat)
  252. self.assertEqual(f3.showTrailingZeros(), f.showTrailingZeros())
  253. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  254. self.assertEqual(f3.numberDecimalPlaces(), f.numberDecimalPlaces())
  255. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  256. self.assertEqual(f3.prefix(), f.prefix())
  257. self.assertEqual(f3.suffix(), f.suffix())
  258. def testBearingFormat(self):
  259. """ test bearing formatter """
  260. f = QgsBearingNumericFormat()
  261. f.setDirectionFormat(QgsBearingNumericFormat.UseRange0To180WithEWDirectionalSuffix)
  262. context = QgsNumericFormatContext()
  263. self.assertEqual(f.formatDouble(0, context), '0°')
  264. self.assertEqual(f.formatDouble(90, context), '90°E')
  265. self.assertEqual(f.formatDouble(180, context), '180°')
  266. self.assertEqual(f.formatDouble(270, context), '90°W')
  267. self.assertEqual(f.formatDouble(300, context), '60°W')
  268. self.assertEqual(f.formatDouble(5, context), '5°E')
  269. self.assertEqual(f.formatDouble(5.5, context), '5.5°E')
  270. self.assertEqual(f.formatDouble(-5, context), '5°W')
  271. self.assertEqual(f.formatDouble(-5.5, context), '5.5°W')
  272. context.setDecimalSeparator('x')
  273. self.assertEqual(f.formatDouble(0, context), '0°')
  274. self.assertEqual(f.formatDouble(-5.5, context), '5x5°W')
  275. self.assertEqual(f.formatDouble(180, context), '180°')
  276. context.setDecimalSeparator('.')
  277. f.setNumberDecimalPlaces(0)
  278. self.assertEqual(f.formatDouble(0, context), '0°')
  279. self.assertEqual(f.formatDouble(5.5, context), '6°E')
  280. self.assertEqual(f.formatDouble(-5.5, context), '6°W')
  281. self.assertEqual(f.formatDouble(180, context), '180°')
  282. f.setNumberDecimalPlaces(3)
  283. self.assertEqual(f.formatDouble(0, context), '0°')
  284. self.assertEqual(f.formatDouble(5.5, context), '5.5°E')
  285. self.assertEqual(f.formatDouble(-5.5, context), '5.5°W')
  286. self.assertEqual(f.formatDouble(180, context), '180°')
  287. f.setShowTrailingZeros(True)
  288. self.assertEqual(f.formatDouble(0, context), '0.000°E') # todo - fix and avoid E
  289. self.assertEqual(f.formatDouble(5, context), '5.000°E')
  290. self.assertEqual(f.formatDouble(-5, context), '5.000°W')
  291. self.assertEqual(f.formatDouble(5.5, context), '5.500°E')
  292. self.assertEqual(f.formatDouble(-5.5, context), '5.500°W')
  293. self.assertEqual(f.formatDouble(180, context), '180.000°E') # todo fix and avoid E
  294. f = QgsBearingNumericFormat()
  295. f.setDirectionFormat(QgsBearingNumericFormat.UseRangeNegative180ToPositive180)
  296. self.assertEqual(f.formatDouble(0, context), '0°')
  297. self.assertEqual(f.formatDouble(90, context), '90°')
  298. self.assertEqual(f.formatDouble(180, context), '180°')
  299. self.assertEqual(f.formatDouble(270, context), '-90°')
  300. self.assertEqual(f.formatDouble(5, context), '5°')
  301. self.assertEqual(f.formatDouble(5.5, context), '5.5°')
  302. self.assertEqual(f.formatDouble(-5, context), '-5°')
  303. self.assertEqual(f.formatDouble(-5.5, context), '-5.5°')
  304. context.setDecimalSeparator('x')
  305. self.assertEqual(f.formatDouble(0, context), '0°')
  306. self.assertEqual(f.formatDouble(-5.5, context), '-5x5°')
  307. self.assertEqual(f.formatDouble(180, context), '180°')
  308. context.setDecimalSeparator('.')
  309. f.setNumberDecimalPlaces(0)
  310. self.assertEqual(f.formatDouble(0, context), '0°')
  311. self.assertEqual(f.formatDouble(5.5, context), '6°')
  312. self.assertEqual(f.formatDouble(-5.5, context), '-6°')
  313. self.assertEqual(f.formatDouble(180, context), '180°')
  314. f.setNumberDecimalPlaces(3)
  315. self.assertEqual(f.formatDouble(0, context), '0°')
  316. self.assertEqual(f.formatDouble(5.5, context), '5.5°')
  317. self.assertEqual(f.formatDouble(-5.5, context), '-5.5°')
  318. self.assertEqual(f.formatDouble(180, context), '180°')
  319. f.setShowTrailingZeros(True)
  320. self.assertEqual(f.formatDouble(0, context), '0.000°')
  321. self.assertEqual(f.formatDouble(5, context), '5.000°')
  322. self.assertEqual(f.formatDouble(-5, context), '-5.000°')
  323. self.assertEqual(f.formatDouble(5.5, context), '5.500°')
  324. self.assertEqual(f.formatDouble(-5.5, context), '-5.500°')
  325. self.assertEqual(f.formatDouble(180, context), '180.000°')
  326. f = QgsBearingNumericFormat()
  327. f.setDirectionFormat(QgsBearingNumericFormat.UseRange0To360)
  328. self.assertEqual(f.formatDouble(0, context), '0°')
  329. self.assertEqual(f.formatDouble(90, context), '90°')
  330. self.assertEqual(f.formatDouble(180, context), '180°')
  331. self.assertEqual(f.formatDouble(270, context), '270°')
  332. self.assertEqual(f.formatDouble(5, context), '5°')
  333. self.assertEqual(f.formatDouble(5.5, context), '5.5°')
  334. self.assertEqual(f.formatDouble(-5, context), '355°')
  335. self.assertEqual(f.formatDouble(-5.5, context), '354.5°')
  336. context.setDecimalSeparator('x')
  337. self.assertEqual(f.formatDouble(0, context), '0°')
  338. self.assertEqual(f.formatDouble(-5.5, context), '354x5°')
  339. self.assertEqual(f.formatDouble(180, context), '180°')
  340. context.setDecimalSeparator('.')
  341. f.setNumberDecimalPlaces(0)
  342. self.assertEqual(f.formatDouble(0, context), '0°')
  343. self.assertEqual(f.formatDouble(5.5, context), '6°')
  344. self.assertEqual(f.formatDouble(-5.4, context), '355°')
  345. self.assertEqual(f.formatDouble(180, context), '180°')
  346. f.setNumberDecimalPlaces(3)
  347. self.assertEqual(f.formatDouble(0, context), '0°')
  348. self.assertEqual(f.formatDouble(5.5, context), '5.5°')
  349. self.assertEqual(f.formatDouble(-5.5, context), '354.5°')
  350. self.assertEqual(f.formatDouble(180, context), '180°')
  351. f.setShowTrailingZeros(True)
  352. self.assertEqual(f.formatDouble(0, context), '0.000°')
  353. self.assertEqual(f.formatDouble(5, context), '5.000°')
  354. self.assertEqual(f.formatDouble(-5, context), '355.000°')
  355. self.assertEqual(f.formatDouble(5.5, context), '5.500°')
  356. self.assertEqual(f.formatDouble(-5.5, context), '354.500°')
  357. self.assertEqual(f.formatDouble(180, context), '180.000°')
  358. f2 = f.clone()
  359. self.assertIsInstance(f2, QgsBearingNumericFormat)
  360. self.assertEqual(f2.showTrailingZeros(), f.showTrailingZeros())
  361. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  362. self.assertEqual(f2.numberDecimalPlaces(), f.numberDecimalPlaces())
  363. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  364. self.assertEqual(f2.directionFormat(), f.directionFormat())
  365. doc = QDomDocument("testdoc")
  366. elem = doc.createElement("test")
  367. f2.writeXml(elem, doc, QgsReadWriteContext())
  368. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  369. self.assertIsInstance(f3, QgsBearingNumericFormat)
  370. self.assertEqual(f3.showTrailingZeros(), f.showTrailingZeros())
  371. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  372. self.assertEqual(f3.numberDecimalPlaces(), f.numberDecimalPlaces())
  373. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  374. self.assertEqual(f3.directionFormat(), f.directionFormat())
  375. def testPercentageFormat(self):
  376. """ test percentage formatter """
  377. f = QgsPercentageNumericFormat()
  378. f.setInputValues(QgsPercentageNumericFormat.ValuesArePercentage)
  379. context = QgsNumericFormatContext()
  380. self.assertEqual(f.formatDouble(0, context), '0%')
  381. self.assertEqual(f.formatDouble(5, context), '5%')
  382. self.assertEqual(f.formatDouble(5.5, context), '5.5%')
  383. self.assertEqual(f.formatDouble(-5, context), '-5%')
  384. self.assertEqual(f.formatDouble(-5.5, context), '-5.5%')
  385. self.assertEqual(f.formatDouble(-55555555.5, context), '-55,555,555.5%')
  386. context.setDecimalSeparator('x')
  387. self.assertEqual(f.formatDouble(0, context), '0%')
  388. self.assertEqual(f.formatDouble(-5.5, context), '-5x5%')
  389. self.assertEqual(f.formatDouble(-55555555.5, context), '-55,555,555x5%')
  390. context.setThousandsSeparator('y')
  391. self.assertEqual(f.formatDouble(-5.5, context), '-5x5%')
  392. self.assertEqual(f.formatDouble(-55555555.5, context), '-55y555y555x5%')
  393. f.setShowThousandsSeparator(False)
  394. self.assertEqual(f.formatDouble(-5.5, context), '-5x5%')
  395. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555x5%')
  396. context.setDecimalSeparator('.')
  397. f.setNumberDecimalPlaces(0)
  398. self.assertEqual(f.formatDouble(0, context), '0%')
  399. self.assertEqual(f.formatDouble(5.5, context), '6%')
  400. self.assertEqual(f.formatDouble(55555555.5, context), '55555556%')
  401. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555%')
  402. self.assertEqual(f.formatDouble(-5.5, context), '-6%')
  403. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555556%')
  404. f.setNumberDecimalPlaces(3)
  405. self.assertEqual(f.formatDouble(0, context), '0%')
  406. self.assertEqual(f.formatDouble(5.5, context), '5.5%')
  407. self.assertEqual(f.formatDouble(55555555.5, context), '55555555.5%')
  408. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555.123%')
  409. self.assertEqual(f.formatDouble(-5.5, context), '-5.5%')
  410. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555.5%')
  411. f.setShowTrailingZeros(True)
  412. self.assertEqual(f.formatDouble(0, context), '0.000%')
  413. self.assertEqual(f.formatDouble(5, context), '5.000%')
  414. self.assertEqual(f.formatDouble(-5, context), '-5.000%')
  415. self.assertEqual(f.formatDouble(5.5, context), '5.500%')
  416. self.assertEqual(f.formatDouble(55555555.5, context), '55555555.500%')
  417. self.assertEqual(f.formatDouble(55555555.123456, context), '55555555.123%')
  418. self.assertEqual(f.formatDouble(-5.5, context), '-5.500%')
  419. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555.500%')
  420. f.setShowPlusSign(True)
  421. self.assertEqual(f.formatDouble(0, context), '0.000%')
  422. self.assertEqual(f.formatDouble(5, context), '+5.000%')
  423. self.assertEqual(f.formatDouble(-5, context), '-5.000%')
  424. self.assertEqual(f.formatDouble(5.5, context), '+5.500%')
  425. self.assertEqual(f.formatDouble(55555555.5, context), '+55555555.500%')
  426. self.assertEqual(f.formatDouble(55555555.123456, context), '+55555555.123%')
  427. self.assertEqual(f.formatDouble(-5.5, context), '-5.500%')
  428. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555.500%')
  429. f = QgsPercentageNumericFormat()
  430. f.setInputValues(QgsPercentageNumericFormat.ValuesAreFractions)
  431. context = QgsNumericFormatContext()
  432. self.assertEqual(f.formatDouble(0, context), '0%')
  433. self.assertEqual(f.formatDouble(5, context), '500%')
  434. self.assertEqual(f.formatDouble(5.5, context), '550%')
  435. self.assertEqual(f.formatDouble(-5, context), '-500%')
  436. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  437. self.assertEqual(f.formatDouble(-55555555.5, context), '-5,555,555,550%')
  438. context.setDecimalSeparator('x')
  439. self.assertEqual(f.formatDouble(0, context), '0%')
  440. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  441. self.assertEqual(f.formatDouble(-0.005, context), '-0x5%')
  442. context.setThousandsSeparator('y')
  443. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  444. self.assertEqual(f.formatDouble(-55555555.5, context), '-5y555y555y550%')
  445. f.setShowThousandsSeparator(False)
  446. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  447. self.assertEqual(f.formatDouble(-55555555.5, context), '-5555555550%')
  448. context.setDecimalSeparator('.')
  449. f.setNumberDecimalPlaces(0)
  450. self.assertEqual(f.formatDouble(0, context), '0%')
  451. self.assertEqual(f.formatDouble(5.5, context), '550%')
  452. self.assertEqual(f.formatDouble(55555555.5, context), '5555555550%')
  453. self.assertEqual(f.formatDouble(0.123456, context), '12%')
  454. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  455. self.assertEqual(f.formatDouble(-0.123456, context), '-12%')
  456. f.setNumberDecimalPlaces(3)
  457. self.assertEqual(f.formatDouble(0, context), '0%')
  458. self.assertEqual(f.formatDouble(5.5, context), '550%')
  459. self.assertEqual(f.formatDouble(55555555.5, context), '5555555550%')
  460. self.assertEqual(f.formatDouble(0.123456, context), '12.346%')
  461. self.assertEqual(f.formatDouble(-5.5, context), '-550%')
  462. self.assertEqual(f.formatDouble(-0.123456, context), '-12.346%')
  463. f.setShowTrailingZeros(True)
  464. self.assertEqual(f.formatDouble(0, context), '0.000%')
  465. self.assertEqual(f.formatDouble(5, context), '500.000%')
  466. self.assertEqual(f.formatDouble(-5, context), '-500.000%')
  467. self.assertEqual(f.formatDouble(0.5, context), '50.000%')
  468. self.assertEqual(f.formatDouble(55555555.5, context), '5555555550.000%')
  469. self.assertEqual(f.formatDouble(0.123456, context), '12.346%')
  470. self.assertEqual(f.formatDouble(-5.5, context), '-550.000%')
  471. self.assertEqual(f.formatDouble(-1234.5, context), '-123450.000%')
  472. f.setShowPlusSign(True)
  473. self.assertEqual(f.formatDouble(0, context), '0.000%')
  474. self.assertEqual(f.formatDouble(5, context), '+500.000%')
  475. self.assertEqual(f.formatDouble(-5, context), '-500.000%')
  476. self.assertEqual(f.formatDouble(5.5, context), '+550.000%')
  477. self.assertEqual(f.formatDouble(-5.5, context), '-550.000%')
  478. context.setPercent('p')
  479. self.assertEqual(f.formatDouble(0, context), '0.000p')
  480. self.assertEqual(f.formatDouble(5, context), '+500.000p')
  481. self.assertEqual(f.formatDouble(-5, context), '-500.000p')
  482. f2 = f.clone()
  483. self.assertIsInstance(f2, QgsPercentageNumericFormat)
  484. self.assertEqual(f2.showTrailingZeros(), f.showTrailingZeros())
  485. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  486. self.assertEqual(f2.numberDecimalPlaces(), f.numberDecimalPlaces())
  487. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  488. self.assertEqual(f2.inputValues(), f.inputValues())
  489. doc = QDomDocument("testdoc")
  490. elem = doc.createElement("test")
  491. f2.writeXml(elem, doc, QgsReadWriteContext())
  492. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  493. self.assertIsInstance(f3, QgsPercentageNumericFormat)
  494. self.assertEqual(f3.showTrailingZeros(), f.showTrailingZeros())
  495. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  496. self.assertEqual(f3.numberDecimalPlaces(), f.numberDecimalPlaces())
  497. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  498. self.assertEqual(f3.inputValues(), f.inputValues())
  499. def testScientificFormat(self):
  500. """ test scientific formatter """
  501. f = QgsScientificNumericFormat()
  502. context = QgsNumericFormatContext()
  503. self.assertEqual(f.formatDouble(0, context), '0e+00')
  504. self.assertEqual(f.formatDouble(5, context), '5e+00')
  505. self.assertEqual(f.formatDouble(5.5, context), '5.5e+00')
  506. self.assertEqual(f.formatDouble(-5, context), '-5e+00')
  507. self.assertEqual(f.formatDouble(-5.5, context), '-5.5e+00')
  508. self.assertEqual(f.formatDouble(-55555555.5, context), '-5.555556e+07')
  509. context.setDecimalSeparator('x')
  510. self.assertEqual(f.formatDouble(0, context), '0e+00')
  511. self.assertEqual(f.formatDouble(-5.5, context), '-5x5e+00')
  512. self.assertEqual(f.formatDouble(-55555555.5, context), '-5x555556e+07')
  513. context.setDecimalSeparator('.')
  514. # places must be at least 1 for scientific notation!
  515. f.setNumberDecimalPlaces(0)
  516. self.assertEqual(f.numberDecimalPlaces(), 1)
  517. self.assertEqual(f.formatDouble(0, context), '0e+00')
  518. self.assertEqual(f.formatDouble(5.5, context), '5.5e+00')
  519. self.assertEqual(f.formatDouble(55555555.5, context), '5.6e+07')
  520. self.assertEqual(f.formatDouble(55555555.123456, context), '5.6e+07')
  521. self.assertEqual(f.formatDouble(-5.5, context), '-5.5e+00')
  522. self.assertEqual(f.formatDouble(-55555555.5, context), '-5.6e+07')
  523. f.setNumberDecimalPlaces(3)
  524. self.assertEqual(f.formatDouble(0, context), '0e+00')
  525. self.assertEqual(f.formatDouble(5.5, context), '5.5e+00')
  526. self.assertEqual(f.formatDouble(55555555.5, context), '5.556e+07')
  527. self.assertEqual(f.formatDouble(55555555.123456, context), '5.556e+07')
  528. self.assertEqual(f.formatDouble(-5.5, context), '-5.5e+00')
  529. self.assertEqual(f.formatDouble(-55555555.5, context), '-5.556e+07')
  530. f.setShowTrailingZeros(True)
  531. self.assertEqual(f.formatDouble(0, context), '0.000e+00')
  532. self.assertEqual(f.formatDouble(5, context), '5.000e+00')
  533. self.assertEqual(f.formatDouble(-5, context), '-5.000e+00')
  534. self.assertEqual(f.formatDouble(5.5, context), '5.500e+00')
  535. self.assertEqual(f.formatDouble(55555555.5, context), '5.556e+07')
  536. self.assertEqual(f.formatDouble(55555555.123456, context), '5.556e+07')
  537. self.assertEqual(f.formatDouble(-5.5, context), '-5.500e+00')
  538. self.assertEqual(f.formatDouble(-55555555.5, context), '-5.556e+07')
  539. f.setShowPlusSign(True)
  540. self.assertEqual(f.formatDouble(0, context), '0.000e+00')
  541. self.assertEqual(f.formatDouble(5, context), '+5.000e+00')
  542. self.assertEqual(f.formatDouble(-5, context), '-5.000e+00')
  543. self.assertEqual(f.formatDouble(5.5, context), '+5.500e+00')
  544. self.assertEqual(f.formatDouble(55555555.5, context), '+5.556e+07')
  545. self.assertEqual(f.formatDouble(55555555.123456, context), '+5.556e+07')
  546. self.assertEqual(f.formatDouble(-5.5, context), '-5.500e+00')
  547. self.assertEqual(f.formatDouble(-55555555.5, context), '-5.556e+07')
  548. f2 = f.clone()
  549. self.assertIsInstance(f2, QgsScientificNumericFormat)
  550. self.assertEqual(f2.showTrailingZeros(), f.showTrailingZeros())
  551. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  552. self.assertEqual(f2.numberDecimalPlaces(), f.numberDecimalPlaces())
  553. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  554. doc = QDomDocument("testdoc")
  555. elem = doc.createElement("test")
  556. f2.writeXml(elem, doc, QgsReadWriteContext())
  557. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  558. self.assertIsInstance(f3, QgsScientificNumericFormat)
  559. self.assertEqual(f3.showTrailingZeros(), f.showTrailingZeros())
  560. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  561. self.assertEqual(f3.numberDecimalPlaces(), f.numberDecimalPlaces())
  562. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  563. def testDoubleToFraction(self):
  564. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(1), (True, 1, 1, 1))
  565. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(2), (True, 2, 1, 1))
  566. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-1), (True, 1, 1, -1))
  567. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-2), (True, 2, 1, -1))
  568. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0), (True, 0, 1, 1))
  569. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(1000000), (True, 1000000, 1, 1))
  570. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-1000000), (True, 1000000, 1, -1))
  571. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.5), (True, 1, 2, 1))
  572. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.25), (True, 1, 4, 1))
  573. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.75), (True, 3, 4, 1))
  574. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.5), (True, 1, 2, -1))
  575. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.25), (True, 1, 4, -1))
  576. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.75), (True, 3, 4, -1))
  577. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(1.5), (True, 3, 2, 1))
  578. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(1.25), (True, 5, 4, 1))
  579. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(1.75), (True, 7, 4, 1))
  580. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.5), (True, 1, 2, -1))
  581. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.25), (True, 1, 4, -1))
  582. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.1), (True, 1, 10, -1))
  583. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-1.5), (True, 3, 2, -1))
  584. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-1.25), (True, 5, 4, -1))
  585. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-1.75), (True, 7, 4, -1))
  586. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.3333333333333333333333), (True, 1, 3, 1))
  587. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.333333333), (True, 333333355, 1000000066, 1))
  588. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.333333333, 0.0000000001),
  589. (True, 333333355, 1000000066, 1))
  590. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.333333333, 0.000000001), (True, 1, 3, 1))
  591. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.333333333, 0.1), (True, 1, 3, 1))
  592. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.3333333333333333333333), (True, 1, 3, -1))
  593. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.333333333),
  594. (True, 333333355, 1000000066, -1))
  595. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.333333333, 0.0000000001),
  596. (True, 333333355, 1000000066, -1))
  597. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.333333333, 0.000000001), (True, 1, 3, -1))
  598. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(-0.333333333, 0.1), (True, 1, 3, -1))
  599. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(0.000000123123), (True, 1, 8121959, 1))
  600. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979), (True, 312689, 99532, 1))
  601. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979, 0.0000001),
  602. (True, 103993, 33102, 1))
  603. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979, 0.00001),
  604. (True, 355, 113, 1))
  605. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979, 0.001), (True, 333, 106, 1))
  606. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979, 0.1), (True, 22, 7, 1))
  607. self.assertEqual(QgsFractionNumericFormat.doubleToVulgarFraction(3.14159265358979, 1), (True, 3, 1, 1))
  608. def testToUnicodeSuperscript(self):
  609. self.assertEqual(QgsFractionNumericFormat.toUnicodeSuperscript(''), '')
  610. self.assertEqual(QgsFractionNumericFormat.toUnicodeSuperscript('asd'), 'asd')
  611. self.assertEqual(QgsFractionNumericFormat.toUnicodeSuperscript('1234567890'), '¹²³⁴⁵⁶⁷⁸⁹⁰')
  612. self.assertEqual(QgsFractionNumericFormat.toUnicodeSuperscript('aa112233bbcc'), 'aa¹¹²²³³bbcc')
  613. def testToUnicodeSubcript(self):
  614. self.assertEqual(QgsFractionNumericFormat.toUnicodeSubscript(''), '')
  615. self.assertEqual(QgsFractionNumericFormat.toUnicodeSubscript('asd'), 'asd')
  616. self.assertEqual(QgsFractionNumericFormat.toUnicodeSubscript('1234567890'), '₁₂₃₄₅₆₇₈₉₀')
  617. self.assertEqual(QgsFractionNumericFormat.toUnicodeSubscript('aa112233bbcc'), 'aa₁₁₂₂₃₃bbcc')
  618. def testFractionFormat(self):
  619. """ test fraction formatter """
  620. f = QgsFractionNumericFormat()
  621. f.setUseUnicodeSuperSubscript(False)
  622. context = QgsNumericFormatContext()
  623. self.assertEqual(f.formatDouble(0, context), '0')
  624. self.assertEqual(f.formatDouble(5, context), '5')
  625. self.assertEqual(f.formatDouble(5.5, context), '5 1/2')
  626. self.assertEqual(f.formatDouble(-5, context), '-5')
  627. self.assertEqual(f.formatDouble(-5.5, context), '-5 1/2')
  628. self.assertEqual(f.formatDouble(-55555555.5, context), '-55,555,555 1/2')
  629. context.setThousandsSeparator('⚡')
  630. self.assertEqual(f.formatDouble(-55555555.5, context), '-55⚡555⚡555 1/2')
  631. f.setShowThousandsSeparator(False)
  632. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555 1/2')
  633. f.setShowPlusSign(True)
  634. self.assertEqual(f.formatDouble(0, context), '0')
  635. self.assertEqual(f.formatDouble(5, context), '+5')
  636. self.assertEqual(f.formatDouble(-5, context), '-5')
  637. self.assertEqual(f.formatDouble(5.5, context), '+5 1/2')
  638. self.assertEqual(f.formatDouble(-5.5, context), '-5 1/2')
  639. self.assertEqual(f.formatDouble(55555555.5, context), '+55555555 1/2')
  640. self.assertEqual(f.formatDouble(55555555.123456, context), '+55555555 5797/46956')
  641. self.assertEqual(f.formatDouble(-5.5, context), '-5 1/2')
  642. self.assertEqual(f.formatDouble(-55555555.5, context), '-55555555 1/2')
  643. context.setPositiveSign('w')
  644. self.assertEqual(f.formatDouble(5, context), 'w5')
  645. self.assertEqual(f.formatDouble(-5, context), '-5')
  646. self.assertEqual(f.formatDouble(5.5, context), 'w5 1/2')
  647. f.setShowPlusSign(False)
  648. f.setUseDedicatedUnicodeCharacters(True)
  649. self.assertEqual(f.formatDouble(0, context), '0')
  650. self.assertEqual(f.formatDouble(5, context), '5')
  651. self.assertEqual(f.formatDouble(5.5, context), '5 ½')
  652. self.assertEqual(f.formatDouble(-5, context), '-5')
  653. self.assertEqual(f.formatDouble(-5.5, context), '-5 ½')
  654. self.assertEqual(f.formatDouble(5.333333333333333333333333333, context), '5 ⅓')
  655. self.assertEqual(f.formatDouble(5.666666666666666666666666666, context), '5 ⅔')
  656. self.assertEqual(f.formatDouble(5.25, context), '5 ¼')
  657. self.assertEqual(f.formatDouble(5.75, context), '5 ¾')
  658. self.assertEqual(f.formatDouble(5.2, context), '5 ⅕')
  659. self.assertEqual(f.formatDouble(5.4, context), '5 ⅖')
  660. self.assertEqual(f.formatDouble(5.6, context), '5 ⅗')
  661. self.assertEqual(f.formatDouble(5.8, context), '5 ⅘')
  662. self.assertEqual(f.formatDouble(5.1666666666666666666666666666666666, context), '5 ⅙')
  663. self.assertEqual(f.formatDouble(5.8333333333333333333333333333333333, context), '5 ⅚')
  664. self.assertEqual(f.formatDouble(5.14285714285714285, context), '5 ⅐')
  665. self.assertEqual(f.formatDouble(5.125, context), '5 ⅛')
  666. self.assertEqual(f.formatDouble(5.375, context), '5 ⅜')
  667. self.assertEqual(f.formatDouble(5.625, context), '5 ⅝')
  668. self.assertEqual(f.formatDouble(5.875, context), '5 ⅞')
  669. self.assertEqual(f.formatDouble(5.1111111111111111, context), '5 ⅑')
  670. self.assertEqual(f.formatDouble(5.1, context), '5 ⅒')
  671. self.assertEqual(f.formatDouble(5.13131313133, context), '5 13/99')
  672. f.setUseUnicodeSuperSubscript(True)
  673. self.assertEqual(f.formatDouble(0, context), '0')
  674. self.assertEqual(f.formatDouble(5, context), '5')
  675. self.assertEqual(f.formatDouble(5.5, context), '5 ½')
  676. self.assertEqual(f.formatDouble(-5, context), '-5')
  677. self.assertEqual(f.formatDouble(-5.5, context), '-5 ½')
  678. self.assertEqual(f.formatDouble(5.55555555, context), '5 ¹¹¹¹¹¹¹¹/₂₀₀₀₀₀₀₀')
  679. self.assertEqual(f.formatDouble(-5.55555555, context), '-5 ¹¹¹¹¹¹¹¹/₂₀₀₀₀₀₀₀')
  680. self.assertEqual(f.formatDouble(0.555, context), '¹¹¹/₂₀₀')
  681. f.setShowPlusSign(True)
  682. f.setUseUnicodeSuperSubscript(False)
  683. f2 = f.clone()
  684. self.assertIsInstance(f2, QgsFractionNumericFormat)
  685. self.assertEqual(f2.showPlusSign(), f.showPlusSign())
  686. self.assertEqual(f2.showThousandsSeparator(), f.showThousandsSeparator())
  687. self.assertEqual(f2.thousandsSeparator(), f.thousandsSeparator())
  688. self.assertEqual(f2.useDedicatedUnicodeCharacters(), f.useDedicatedUnicodeCharacters())
  689. self.assertEqual(f2.useUnicodeSuperSubscript(), f.useUnicodeSuperSubscript())
  690. doc = QDomDocument("testdoc")
  691. elem = doc.createElement("test")
  692. f2.writeXml(elem, doc, QgsReadWriteContext())
  693. f3 = QgsNumericFormatRegistry().createFromXml(elem, QgsReadWriteContext())
  694. self.assertIsInstance(f3, QgsFractionNumericFormat)
  695. self.assertEqual(f3.showPlusSign(), f.showPlusSign())
  696. self.assertEqual(f3.showThousandsSeparator(), f.showThousandsSeparator())
  697. self.assertEqual(f3.thousandsSeparator(), f.thousandsSeparator())
  698. self.assertEqual(f3.useDedicatedUnicodeCharacters(), f.useDedicatedUnicodeCharacters())
  699. self.assertEqual(f3.useUnicodeSuperSubscript(), f.useUnicodeSuperSubscript())
  700. def testRegistry(self):
  701. registry = QgsNumericFormatRegistry()
  702. self.assertTrue(registry.formats())
  703. for f in registry.formats():
  704. self.assertEqual(registry.format(f).id(), f)
  705. self.assertIn('default', registry.formats())
  706. registry.addFormat(TestFormat())
  707. self.assertIn('test', registry.formats())
  708. self.assertTrue(isinstance(registry.format('test'), TestFormat))
  709. self.assertTrue(isinstance(registry.create('test', {}, QgsReadWriteContext()), TestFormat))
  710. registry.removeFormat('test')
  711. self.assertNotIn('test', registry.formats())
  712. self.assertTrue(isinstance(registry.format('test'), QgsFallbackNumericFormat))
  713. self.assertTrue(isinstance(registry.create('test', {}, QgsReadWriteContext()), QgsFallbackNumericFormat))
  714. self.assertTrue(isinstance(registry.fallbackFormat(), QgsFallbackNumericFormat))
  715. self.assertEqual(registry.visibleName('default'), 'General')
  716. self.assertEqual(registry.visibleName('basic'), 'Number')
  717. self.assertEqual(registry.sortKey('default'), 0)
  718. self.assertEqual(registry.sortKey('basic'), 1)
  719. self.assertEqual(registry.sortKey('currency'), 100)
  720. if __name__ == '__main__':
  721. unittest.main()