def testEncodeStringEscapes(self): # FIXME: How do you account for ordering? # obj = chjson.encode({"a\"b": 'zz', "22": (1,2),}) # because it's one of these: # self.assertEqual('{"a\\"b": "zz", "22": [1, 2]}', obj) # self.assertEqual('{"22": [1, 2], "a\\"b": "zz"}', obj) obj = chjson.encode({"a\"b": 'zz'}) self.assertEqual('{"a\\"b": "zz"}', obj) obj = chjson.encode({"22": (1,2),}) self.assertEqual('{"22": [1, 2]}', obj)
def testReadWriteCopies(self): orig_obj = {'a':' " '} json_str = chjson.encode(orig_obj) copy_obj = chjson.decode(json_str) self.assertEqual(orig_obj, copy_obj) self.assertEqual(True, orig_obj == copy_obj) self.assertEqual(False, orig_obj is copy_obj)
def testStringEncoding(self): s = chjson.encode([1, 2, 3]) if sys.version_info[0] >= 3: encoded = "[1,2,3]" else: encoded = unicode("[1,2,3]", "utf-8") self.assertEqual(encoded, _removeWhitespace(s))
def testWriteEscapedHexCharacter(self): s = chjson.encode(u'\u1001') if sys.version_info[0] >= 3: self.assertEqual(r'"แ"', _removeWhitespace(s)) else: #self.assertEqual(r'"\u1001"', _removeWhitespace(s)) self.assertEqual(r'u"\u1001"', _removeWhitespace(s))
def testEncodeSolidus_02(self): obj = chjson.encode("{'string': 'hello\/goodbye'}") # NOTE: This might look wrong and you might think it should be: 'hello\\/goodbye' # But [lb]'s understanding of the spec. is that \/ is for # decoding: it's stripped on input, so if \/ is being encoded, # it's a backslash which we need to escape, followed by a # solidus which also needs to be escaped. self.assertEqual('"{\'string\': \'hello\\\\\\/goodbye\'}"', obj)
def testWriteSmallObject(self): s = chjson.encode({ "name" : "Patrick", "age": 44 }) # HA! This is a hack. self.assertTrue( _removeWhitespace(s) in [ '{"name":"Patrick","age":44}', '{"age":44,"name":"Patrick"}', ] )
def testWriteEscapedFormfeed(self): if sys.version_info[0] >= 3: # Hrmm. Return gets interrupted as KeyboardInterrupt: # File "test_chjson.py", line 111, in testWriteEscapedFormfeed # s = chjson.encode("\f") # KeyboardInterrupt pass else: s = chjson.encode("\f") self.assertEqual(r'"\f"', _removeWhitespace(s))
def app_cfg_dump(self): try: with open(self.cfg_path, 'w') as f_out: #f_out.write(json.dumps(self.cfg_data)) f_out.write(chjson.encode(self.cfg_data)) except Exception as err: warning('Failed: Could not write app config to: %s [%s]' % ( self.cfg_path, str(err), ))
def testWriteComplexArray(self): obj = [{"name":"Patrick","age":44,"Employed?":True,"Female?":False,"grandchildren":None}, "used","abused","confused", 1,2,[3,4,5]] # HA! This is a hack: Programmatically generate the list of # acceptable answers, since order is not predictable. kvals = [ '"age":44', '"Female?":false', '"name":"Patrick"', '"Employed?":true', '"grandchildren":null', ] acceptable_answers = set([ ('[{%s},"used","abused","confused",1,2,[3,4,5]]' % ','.join(x)) for x in itertools.permutations(kvals) ]) self.assertTrue(_removeWhitespace(chjson.encode(obj)) in acceptable_answers)
def testWriteLongUnicode(self): # This test causes a buffer overrun in cjson 1.0.5, on UCS4 builds. # The string length is only resized for wide unicode characters if # there is less than 12 bytes of space left. Padding with # narrow-but-escaped characters prevents string resizing. # Note that u'\U0001D11E\u1234' also breaks, but sometimes goes # undetected. s = chjson.encode(u'\U0001D11E\U0001D11E\U0001D11E\U0001D11E' u'\u1234\u1234\u1234\u1234\u1234\u1234') if sys.version_info[0] >= 3: # Wha? # FIXME: This has got to be wrong.......... or is this just unicode output? self.assertEqual( '"๐๐๐๐แดแดแดแดแดแด"' , s ) else: #self.assertEqual(r'"\U0001d11e\U0001d11e\U0001d11e\U0001d11e' # r'\u1234\u1234\u1234\u1234\u1234\u1234"', s) self.assertEqual(r'u"\U0001d11e\U0001d11e\U0001d11e\U0001d11e' r'\u1234\u1234\u1234\u1234\u1234\u1234"', s)
def testWriteEmptyObject(self): s = chjson.encode({}) self.assertEqual("{}", _removeWhitespace(s))
def testWriteLong(self): self.assertEqual("12345678901234567890", chjson.encode(12345678901234567890))
def testWriteEscapedReverseSolidus(self): s = chjson.encode("\\") self.assertEqual(r'"\\"', _removeWhitespace(s))
def testWriteEscapedBackspace(self): s = chjson.encode("\b") self.assertEqual(r'"\b"', _removeWhitespace(s))
def testWriteStringValue(self): s = chjson.encode({ "name" : "Patrick" }) self.assertEqual('{"name":"Patrick"}', _removeWhitespace(s))
def testWriteNonEscapedSolidus(self): s = chjson.encode(r'/') self.assertEqual('"\\/"', _removeWhitespace(s))
def testWriteNull(self): self.assertEqual("null", _removeWhitespace(chjson.encode(None)))
def testEncodeUnicodeStringLeader(self): obj = chjson.encode([u'xx','yy']) self.assertEqual('["xx", "yy"]', obj)
def testWriteEscapedNewline(self): s = chjson.encode("\n") self.assertEqual(r'"\n"', _removeWhitespace(s))
def testWriteEscapedCarriageReturn(self): s = chjson.encode("\r") self.assertEqual(r'"\r"', _removeWhitespace(s))
def testWriteSmallArray(self): self.assertEqual('[1,2,3,4]', _removeWhitespace(chjson.encode([1, 2, 3, 4])))
def testWriteEmptyArray(self): self.assertEqual("[]", _removeWhitespace(chjson.encode([])))
def testObjectBasicString_04(self): obj = chjson.encode("\f") self.assertEqual('"\\f"', obj)
def testWriteArrayOfSymbolsFromTuple(self): self.assertEqual("[true,false,null]", _removeWhitespace(chjson.encode((True, False, None))))
def testWriteFloat(self): n = 3.44556677 self.assertEqual(repr(n), _removeWhitespace(chjson.encode(n)))
def testWriteEscapedHorizontalTab(self): s = chjson.encode("\t") self.assertEqual(r'"\t"', _removeWhitespace(s))
def testEncodeSolidus_01(self): obj = chjson.encode("{'string': 'hello/goodbye'}") self.assertEqual('"{\'string\': \'hello\\/goodbye\'}"', obj)
def testWriteTrue(self): self.assertEqual("true", _removeWhitespace(chjson.encode(True)))
def testWriteEscapedQuotationMark(self): s = chjson.encode(r'"') self.assertEqual(r'"\""', _removeWhitespace(s))
def testWriteFalse(self): self.assertEqual("false", _removeWhitespace(chjson.encode(False)))