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)
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)
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)
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)
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)
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)
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)
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)
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)
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")
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)
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)
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
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