#!/usr/bin/python3-dbg # -*- coding: utf-8 -*- from chrysacase import ChrysalideTestCase from pychrysalide.plugins.yaml import YamlReader class TestYamlReader(ChrysalideTestCase): """TestCase for the Yaml reader.""" @classmethod def setUpClass(cls): super(TestYamlReader, cls).setUpClass() cls._simple_map_data = ''' a: av b: bv c: cv ''' cls._simple_seq_data = ''' - a: av - b: bv - c: cv ''' cls._nested_data = ''' root: a: v0 b: v1 c: v2 sub: aa: v00 bb: v01 cc: v02 - i: w - j: x - k: c d: v3 ''' cls._mixed_data = ''' root: - a: av aa: aav ab: abv - b: bv ba: bav bb: bbv ''' def testSimpleYamlContent(self): """Validate Yaml content readers.""" def _build_node_desc(node, left, extra = ''): if hasattr(node, 'key'): line = node.yaml_line prefix = '- ' if line.is_list_item else extra desc = left + prefix + line.key + ':' + (' ' + line.value if line.value else '') + '\n' indent = ' ' collec = node.collection else: desc = '' indent = '' if hasattr(node, 'nodes'): collec = node if collec: if collec.is_sequence: extra = ' ' for child in collec.nodes: desc += _build_node_desc(child, left + indent, extra) return desc reader = YamlReader(text=self._simple_map_data) self.assertIsNotNone(reader) self.assertIsNotNone(reader.tree) fulldesc = _build_node_desc(reader.tree.root, '') self.assertEqual('\n' + fulldesc + '\n', self._simple_map_data) reader = YamlReader(text=self._simple_seq_data) self.assertIsNotNone(reader) self.assertIsNotNone(reader.tree) fulldesc = _build_node_desc(reader.tree.root, '') self.assertEqual('\n' + fulldesc + '\n', self._simple_seq_data) reader = YamlReader(text=self._nested_data) self.assertIsNotNone(reader) self.assertIsNotNone(reader.tree) fulldesc = _build_node_desc(reader.tree.root, '') self.assertEqual('\n' + fulldesc + '\n', self._nested_data) reader = YamlReader(text=self._mixed_data) self.assertIsNotNone(reader) self.assertIsNotNone(reader.tree) fulldesc = _build_node_desc(reader.tree.root, '') self.assertEqual('\n' + fulldesc + '\n', self._mixed_data) def testSimpleYamlContentFinder(self): """Validate Yaml nested content search.""" reader = YamlReader(text=self._nested_data) self.assertIsNotNone(reader) found = reader.tree.find_by_path('/root/sub') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'sub') found = reader.tree.find_by_path('/root/sub/') self.assertEqual(len(found), 3) found = reader.tree.find_by_path('/root/sub/xx') self.assertEqual(len(found), 0) found = reader.tree.find_by_path('/root/sub/cc/i') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'i') self.assertEqual(found[0].yaml_line.is_list_item, True) found = reader.tree.find_by_path('/root/sub/cc') self.assertEqual(len(found), 1) if len(found) == 1: root = found[0] found = root.find_by_path('cc/i') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'i') self.assertEqual(found[0].yaml_line.is_list_item, True) found = root.find_by_path('/cc/i') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'i') self.assertEqual(found[0].yaml_line.is_list_item, True) found = root.find_by_path('//i') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'i') self.assertEqual(found[0].yaml_line.is_list_item, True) def testMixedYamlContentFinder(self): """Validate Yaml mixed content search.""" reader = YamlReader(text=self._mixed_data) self.assertIsNotNone(reader) found = reader.tree.find_by_path('/root') self.assertEqual(len(found), 1) if len(found) == 1: self.assertEqual(found[0].key, 'root') found = reader.tree.find_by_path('/root/', True) self.assertEqual(len(found), 1) found = reader.tree.find_one_by_path('/root/', True) self.assertIsNotNone(found) if found: sub = found.find_one_by_path('/a') self.assertIsNotNone(sub) self.assertEqual(sub.key, 'a') sub = found.find_one_by_path('/aa') self.assertIsNotNone(sub) self.assertEqual(sub.key, 'aa') found = reader.tree.find_by_path('/root/') self.assertEqual(len(found), 2) if len(found) == 2: sub = found[0].find_one_by_path('/a') self.assertIsNotNone(sub) self.assertEqual(sub.key, 'a') sub = found[0].find_one_by_path('/aa') self.assertIsNotNone(sub) self.assertEqual(sub.key, 'aa') def testItemsWithoutValue(self): """Find items without values.""" from pychrysalide import core core.set_verbosity(5) data = ''' vals: - 1 - 2 - 3 ''' reader = YamlReader(text=data) self.assertIsNotNone(reader) found = reader.tree.find_by_path('/vals/') self.assertEqual(len(found), 3) self.assertEqual(found[0].nodes[0].key, '1') self.assertEqual(found[1].nodes[0].key, '2') self.assertEqual(found[2].nodes[0].key, '3')