def testDefaultParseValueQuotedStrings(self): self.assertEqual(parser.DefaultParseValue("'hello'"), 'hello') self.assertEqual(parser.DefaultParseValue("'hello world'"), 'hello world') self.assertEqual(parser.DefaultParseValue("'--flag'"), '--flag') self.assertEqual(parser.DefaultParseValue('"hello"'), 'hello') self.assertEqual(parser.DefaultParseValue('"hello world"'), 'hello world') self.assertEqual(parser.DefaultParseValue('"--flag"'), '--flag')
def testDefaultParseValueFuzz(self, value): try: result = parser.DefaultParseValue(value) except TypeError: # It's OK to get a TypeError if the string has the null character. if u"\x00" in value: return raise except MemoryError: if len(value) > 100: # This is not what we're testing. return raise try: uvalue = six.text_type(value) uresult = six.text_type(result) except UnicodeDecodeError: # This is not what we're testing. return # Check that the parsed value doesn't differ too much from the input. distance = Levenshtein.distance(uresult, uvalue) max_distance = ( 2 + sum(c.isspace() for c in value) # Quotes or parenthesis can be implicit. + value.count('"') + value.count("'") + 3 * (value.count(",") + 1) + 3 * (value.count(":")) # 'a,' can expand to "'a', " + 2 * value.count("\\") # 'a:' can expand to "'a': " ) if "#" in value: max_distance += len(value) - value.index("#") if not isinstance(result, six.string_types): max_distance += value.count("0") # Leading 0s are stripped. # Note: We don't check distance for dicts since item order can be changed. if "{" not in value: self.assertLessEqual( distance, max_distance, (distance, max_distance, uvalue, uresult) )
def testDefaultParseValueBadLiteral(self): # If it can't be parsed, we treat it as a string. This behavior may change. self.assertEqual(parser.DefaultParseValue('[(A, 2, "3"), 5'), '[(A, 2, "3"), 5') self.assertEqual(parser.DefaultParseValue("x=10"), "x=10")
def testDefaultParseValueComments(self): self.assertEqual(parser.DefaultParseValue('"0#comments"'), "0#comments") # Comments are stripped. This behavior may change in the future. self.assertEqual(parser.DefaultParseValue("0#comments"), 0)
def testDefaultParseValueBareWordsTuple(self): self.assertEqual(parser.DefaultParseValue('(one, 2, "3")'), ("one", 2, "3")) self.assertEqual(parser.DefaultParseValue('one, "2", 3'), ("one", "2", 3))
def testDefaultParseValueBool(self): self.assertEqual(parser.DefaultParseValue("True"), True) self.assertEqual(parser.DefaultParseValue("False"), False)
def testDefaultParseValueNone(self): self.assertEqual(parser.DefaultParseValue("None"), None)
def testDefaultParseValueNestedContainers(self): self.assertEqual( parser.DefaultParseValue('[(A, 2, "3"), 5, {alph: 10.2, beta: "cat"}]'), [('A', 2, '3'), 5, {'alph': 10.2, 'beta': 'cat'}])
def testDefaultParseValueQuotedStringNumbers(self): self.assertEqual(parser.DefaultParseValue("\"'123'\""), "'123'")
def testDefaultParseValueQuotedStringNumbers(self): self.assertEqual(parser.DefaultParseValue('"\'123\'"'), "'123'")
def testDefaultParseValueNumbers(self): self.assertEqual(parser.DefaultParseValue('23'), 23) self.assertEqual(parser.DefaultParseValue('23.0'), 23.0) self.assertIsInstance(parser.DefaultParseValue('23'), int) self.assertIsInstance(parser.DefaultParseValue('23.0'), float) self.assertEqual(parser.DefaultParseValue('23.5'), 23.5)
def testDefaultParseValueBool(self): self.assertEqual(parser.DefaultParseValue('True'), True) self.assertEqual(parser.DefaultParseValue('False'), False)
def testDefaultParseValueIgnoreBinOp(self): self.assertEqual(parser.DefaultParseValue('2017-10-10'), '2017-10-10') self.assertEqual(parser.DefaultParseValue('1+1'), '1+1')
def testDefaultParseValueLists(self): self.assertEqual(parser.DefaultParseValue('[1, 2, 3]'), [1, 2, 3]) self.assertEqual(parser.DefaultParseValue('[1, "2", 3]'), [1, '2', 3]) self.assertEqual(parser.DefaultParseValue('[1, \'"2"\', 3]'), [1, '"2"', 3]) self.assertEqual(parser.DefaultParseValue( '[1, "hello", 3]'), [1, 'hello', 3])
def testDefaultParseValueStrings(self): self.assertEqual(parser.DefaultParseValue('hello'), 'hello') self.assertEqual(parser.DefaultParseValue('path/file.jpg'), 'path/file.jpg') self.assertEqual(parser.DefaultParseValue('hello world'), 'hello world') self.assertEqual(parser.DefaultParseValue('--flag'), '--flag')
def testDefaultParseValueSyntaxError(self): # If it can't be parsed, we treat it as a string. self.assertEqual(parser.DefaultParseValue('"'), '"')
def testDefaultParseValueIgnoreBinOp(self): self.assertEqual(parser.DefaultParseValue("2017-10-10"), "2017-10-10") self.assertEqual(parser.DefaultParseValue("1+1"), "1+1")
def testDefaultParseValueBareWordsLists(self): self.assertEqual(parser.DefaultParseValue('[one, 2, "3"]'), ["one", 2, "3"])
def testDefaultParseValueOtherNumbers(self): self.assertEqual(parser.DefaultParseValue("1e5"), 100000.0)
def testDefaultParseValueDict(self): self.assertEqual(parser.DefaultParseValue('{"abc": 5, "123": 1}'), { "abc": 5, "123": 1 })