[89] | 1 | from _decimal import Decimal
|
---|
| 2 | import json
|
---|
| 3 | from typing import List, Any
|
---|
| 4 | import unittest
|
---|
| 5 |
|
---|
| 6 | from pyson.ObjectMapper import ObjectMapper
|
---|
| 7 | from unitpy.GeneralTests import GeneralTests
|
---|
| 8 |
|
---|
| 9 | from geniusweb.issuevalue.NumberValue import NumberValue
|
---|
| 10 | from geniusweb.issuevalue.Value import Value
|
---|
| 11 |
|
---|
| 12 |
|
---|
| 13 | class NumberValueTest(unittest.TestCase, GeneralTests[NumberValue]):
|
---|
| 14 | value = NumberValue(Decimal("12.31"))
|
---|
| 15 | value1 = NumberValue(Decimal("12.31"))
|
---|
| 16 | value1c = NumberValue(Decimal("1.231E+1"))
|
---|
| 17 | valueb = NumberValue(Decimal("12.310000000000000001"))
|
---|
| 18 | serialized = "12.31"
|
---|
| 19 |
|
---|
| 20 | bigserialized = "8748703924870439218876954320948372058"
|
---|
| 21 | bigvalue = NumberValue(Decimal(bigserialized))
|
---|
| 22 | jackson = ObjectMapper()
|
---|
| 23 |
|
---|
| 24 | def getGeneralTestData(self)->List[List[NumberValue]]:
|
---|
| 25 | return [ [self.value, self.value1, self.value1c], [self.valueb]]
|
---|
| 26 |
|
---|
| 27 | def getGeneralTestStrings(self)->List[str]:
|
---|
| 28 | return ["12.31", "12.310000000000000001"]
|
---|
| 29 |
|
---|
| 30 | def testSerialize(self) :
|
---|
| 31 | self.assertEquals(json.loads(self.serialized), self.jackson.toJson(self.value))
|
---|
| 32 |
|
---|
| 33 | def testDeserialize(self):
|
---|
| 34 | self.assertEqual(self.value, self.jackson.parse(json.loads(self.serialized), NumberValue))
|
---|
| 35 |
|
---|
| 36 | def testDeserializeFromValue(self):
|
---|
| 37 | self.assertEqual(self.value, self.jackson.parse(json.loads(self.serialized), Value))
|
---|
| 38 |
|
---|
| 39 | def testBigSerialize(self):
|
---|
| 40 | self.assertEqual(json.loads(self.bigserialized), self.jackson.toJson(self.bigvalue))
|
---|
| 41 |
|
---|
| 42 | def testBigDeserialize(self):
|
---|
| 43 | self.assertEquals(self.bigvalue,
|
---|
| 44 | self.jackson.parse(json.loads(self.bigserialized), NumberValue))
|
---|
| 45 |
|
---|
| 46 | def testSerializeShorts(self):
|
---|
| 47 | print(self.jackson.toJson([ 1, 2, 3, 4, 5 ]))
|
---|
| 48 |
|
---|
| 49 | def testDeserializeShorts(self) :
|
---|
| 50 | list = self.jackson.parse(json.loads("[1,2,3,4,5]"),List[Any])
|
---|
| 51 | print(list)
|
---|
| 52 | print(list[0].__class__)
|
---|
| 53 |
|
---|
| 54 | def testDeserializeMix(self):
|
---|
| 55 | list = self.jackson.parse(json.loads('["short",1,2,3,4,5]'), List[Any])
|
---|
| 56 | print(list)
|
---|
| 57 | print(list[0].__class__)
|
---|
| 58 |
|
---|
| 59 | def testDeserializePlainNumber(self):
|
---|
| 60 | '''
|
---|
| 61 | Showing that we CAN deserialize big numbers without double quotes
|
---|
| 62 | correctly, if we tell jackson upfront that it's a BigDecimal.
|
---|
| 63 | '''
|
---|
| 64 | valstr = "483958743698732691487326987569213874694328974329874328947320984372498327493827432987231874681273648127";
|
---|
| 65 | val = self.jackson.parse(valstr, Decimal)
|
---|
| 66 | self.assertEqual(valstr, str(val))
|
---|
| 67 |
|
---|
| 68 |
|
---|
| 69 | def testNumberBlab(self):
|
---|
| 70 | # jackson.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
|
---|
| 71 | self.assertEqual(self.value, self.jackson.parse(json.loads("12.31"), Value))
|
---|
| 72 |
|
---|
| 73 | def testNonNumber(self):
|
---|
| 74 | self.assertRaises(ValueError, lambda: NumberValue("abc"))
|
---|
| 75 |
|
---|
| 76 | def testDeserializeScientificNotation(self):
|
---|
| 77 | valstr = "9E+2";
|
---|
| 78 | val = self.jackson.parse(json.loads(valstr), Value)
|
---|
| 79 | # self.assertEqual(valstr, str(val)) FIXME?
|
---|
| 80 | self.assertEqual(val, NumberValue(Decimal("900")))
|
---|
| 81 | |
---|