예제 #1
0
 def test_detect_missing_property_value(self):
     data = b"field1 = \r\nfield2 = 4"
     p = Parser(data)
     p.state = p.parse_item
     for i in range(2):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #2
0
 def test_parse_item_with_no_end(self):
     data = b"item\r\n  prop1 = 1\r\n  prop2 = 2\r\nitem\r\n  prop3 = 3\r\n  prop4 = 4\r\nend"
     p = Parser(data)
     p.state = p.parse_item_sequence
     for i in range(5):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #3
0
 def test_comma_in_non_identifier_sequence(self):
     data = b"= (1,2,3)"
     p = Parser(data)
     p.state = p.parse_property_value
     for i in range(2):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #4
0
 def test_binary_sequence_not_closed(self):
     data = b"property = {\r\n3333333333337733333333333330033333333333333773333333333333003333\r\n  anotherProperty = 1"
     p = Parser(data)
     p.state = p.parse_item
     for i in range(3):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #5
0
 def test_identifier_sequence_no_comma(self):
     data = b"property = [a b c]"
     p = Parser(data)
     p.state = p.parse_item
     for i in range(3):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #6
0
 def test_scalar_sequence_not_closed(self):
     data = b"property = (\r\n1\r\n2\r\nanotherProperty = [a,b,c]"
     p = Parser(data)
     p.state = p.parse_item
     for i in range(4):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #7
0
 def test_parse_property_with_boolean_value(self):
     data = b"booleanProperty = False"
     p = Parser(data)
     p.state = p.parse_item
     p.get_event()
     event = p.get_event()
     self.assertIsInstance(event, ValueEvent)
     self.assertEqual(event.value, False)
예제 #8
0
 def test_item_sequence_not_closed(self):
     # незакрытая последовательность item'ов вызывает ошибку
     # т.к. парсер напарывается на название свойства вместо
     # слова 'item' или закрывающей скобки
     data = b"raz = <\r\nitem\r\n  prop1 = 1\r\nend\r\ndva = 2"
     p = Parser(data)
     p.state = p.parse_object_content
     p.tokenizer.get_next_token()
     for i in range(6):
         p.get_event()
     self.assertRaises(ParserError, p.get_event)
예제 #9
0
 def test_parse_object_property_with_numeric_value(self):
     data = b"propertyName = 983"
     p = Parser(data)
     p.state = p.parse_object_content
     p.tokenizer.get_next_token()
     evt = p.get_event()
     self.assertTrue(isinstance(evt, PropertyNameEvent))
     self.assertEqual(evt.value, "propertyName")
     evt = p.get_event()
     self.assertTrue(isinstance(evt, ValueEvent))
     self.assertEqual(evt.value, 983)
예제 #10
0
 def test_parse_object_property_with_string_value(self):
     data = b"propertyName = Lorem ipsum dolor sit amet"
     p = Parser(data)
     p.state = p.parse_object_content
     p.tokenizer.get_next_token()
     evt = p.get_event()
     self.assertTrue(isinstance(evt, PropertyNameEvent))
     self.assertEqual(evt.value, "propertyName")
     evt = p.get_event()
     self.assertTrue(isinstance(evt, ValueEvent))
     self.assertEqual(evt.value, "Lorem ipsum dolor sit amet")
예제 #11
0
 def test_parse_property_with_binary_sequence_value(self):
     data = b"property = {\r\n3333333333337733333333333330033333333333333773333333333333003333}"
     # формат токенов временно (?) изменён для улучшения читаемости
     # fixture = [int(d, 16) for d in "3333333333337733333333333330033333333333333773333333333333003333"]
     fixture = "3333333333337733333333333330033333333333333773333333333333003333"
     p = Parser(data)
     p.state = p.parse_item
     for i in range(2):
         p.get_event()
     event = p.get_event()
     self.assertIsInstance(event, BinaryDataEvent)
     self.assertEqual(event.value, fixture)
예제 #12
0
 def test_parse_item(self):
     data = b"item\r\n  prop1 = 1\r\n  prop2 = [qw,er,ty]\r\nend"
     p = Parser(data)
     p.state = p.parse_item_sequence
     event = p.get_event()
     self.assertIsInstance(event, ItemEvent)
     event = p.get_event()
     self.assertIsInstance(event, PropertyNameEvent)
     self.assertEqual(event.value, "prop1")
     event = p.get_event()
     self.assertIsInstance(event, ValueEvent)
     self.assertEqual(event.value, 1)
     for i in range(6):
         p.get_event()
     event = p.get_event()
     self.assertIsInstance(event, EndOfBlockEvent)
예제 #13
0
 def check_events_for_parsing_items(self, events, values, data):
     """
     Заставляет парсер разобрать свойство item'а;
     Порядок событий и их значения должны сойтись с ожидаемыми;
     events - ожидаемые события;
     values - ожидаемые значения;
     data - входные данные.
     """
     p = Parser(data)
     p.state = p.parse_item
     i = 0
     for event in events:
         evt = p.get_event()
         self.assertTrue(isinstance(evt, event))
         if values[i] is not None:
             self.assertEqual(evt.value, values[i])
         else:
             self.assertIsNone(evt.value)
         i += 1
예제 #14
0
 def check_events_for_parsing_sequences(self, events, values, data):
     """
     Заставляет парсер разобрать свойство со значением в виде последовательности;
     Порядок событий и их значения должны сойтись с ожидаемыми;
     events - ожидаемые события;
     values - ожидаемые значения;
     data - входные данные.
     """
     p = Parser(data)
     p.state = p.parse_object_content
     # разбор содержимого объекта начинается с peek_token,
     # поэтому подбираем первый токен вручную
     p.tokenizer.get_next_token()
     i = 0
     for event in events:
         evt = p.get_event()
         self.assertTrue(isinstance(evt, event))
         if values[i] is not None:
             self.assertEqual(evt.value, values[i])
         else:
             self.assertIsNone(evt.value)
         i += 1