[1104] | 1 | #!/usr/bin/env python3 |
---|
| 2 | import glob |
---|
| 3 | import json |
---|
| 4 | import os |
---|
| 5 | import unittest |
---|
| 6 | |
---|
| 7 | from parameterized import parameterized |
---|
| 8 | |
---|
| 9 | from ..reader import loads |
---|
| 10 | from ..writer import from_collection |
---|
| 11 | |
---|
| 12 | |
---|
| 13 | class SerializedTest(unittest.TestCase): |
---|
| 14 | def test_keyword_serialization(self): |
---|
| 15 | in_obj = [{'f': '@Serialized:'}] |
---|
| 16 | expected = 'f:@Serialized:"@Serialized:"\n' |
---|
| 17 | actual = from_collection(in_obj) |
---|
| 18 | self.assertEqual(actual, expected) |
---|
| 19 | |
---|
| 20 | def test_list_serialization(self): |
---|
| 21 | in_obj = [{'f': [16, None, 'abc']}] |
---|
| 22 | expected = 'f:@Serialized:[16,null,"abc"]\n' |
---|
| 23 | actual = from_collection(in_obj) |
---|
| 24 | self.assertEqual(actual, expected) |
---|
| 25 | |
---|
| 26 | def test_object_serialization(self): |
---|
| 27 | in_obj = [{'f': {'a': 123, 'b': [7, 8, 9]}}] |
---|
| 28 | expected = 'f:@Serialized:{"a":123,"b":[7,8,9]}\n' |
---|
| 29 | actual = from_collection(in_obj) |
---|
| 30 | self.assertEqual(actual, expected) |
---|
| 31 | |
---|
| 32 | def test_empty_nested_list_serialization(self): |
---|
| 33 | in_obj = [{'f': [[[]]]}] |
---|
| 34 | expected = 'f:@Serialized:[[[]]]\n' |
---|
| 35 | actual = from_collection(in_obj) |
---|
| 36 | self.assertEqual(actual, expected) |
---|
| 37 | |
---|
| 38 | def test_list_with_newlines_serialization(self): |
---|
| 39 | in_obj = [{'f': ['\n\n', '']}] |
---|
| 40 | expected = 'f:@Serialized:["\n\n",""]\n' |
---|
| 41 | actual = from_collection(in_obj) |
---|
| 42 | self.assertEqual(actual, expected) |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | class ClassnameTest(unittest.TestCase): |
---|
| 46 | def test_classname_detection(self): |
---|
| 47 | in_obj = [{'_classname': 'stats', 'a': 'b'}] |
---|
| 48 | expected = 'stats:\na:b\n' |
---|
| 49 | actual = from_collection(in_obj) |
---|
| 50 | self.assertEqual(actual, expected) |
---|
| 51 | |
---|
| 52 | def test_multiple_classname_detection(self): |
---|
| 53 | in_obj = [{'_classname': 'stats', 'a': 'b'}, {'_classname': 'org', 'c': 'd'}] |
---|
| 54 | expected = 'stats:\na:b\n\norg:\nc:d\n' |
---|
| 55 | actual = from_collection(in_obj) |
---|
| 56 | self.assertEqual(actual, expected) |
---|
| 57 | |
---|
| 58 | |
---|
| 59 | class MultilineTest(unittest.TestCase): |
---|
| 60 | def test_tilde_wrap(self): |
---|
| 61 | in_obj = [{'ml': 'this is\na field\nwith multiple lines'}] |
---|
| 62 | expected = 'ml:~\nthis is\na field\nwith multiple lines~\n' |
---|
| 63 | actual = from_collection(in_obj) |
---|
| 64 | self.assertEqual(actual, expected) |
---|
| 65 | |
---|
| 66 | def test_tilde_escape(self): |
---|
| 67 | in_obj = [{'ml': 'this is\na field\nwith multiple lines\n~ is also here'}] |
---|
| 68 | expected = 'ml:~\nthis is\na field\nwith multiple lines\n\\~ is also here~\n' |
---|
| 69 | actual = from_collection(in_obj) |
---|
| 70 | self.assertEqual(actual, expected) |
---|
| 71 | |
---|
| 72 | |
---|
| 73 | json_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_files", "outputs") |
---|
| 74 | input_files = glob.glob(os.path.join(json_root, '*', '*')) |
---|
| 75 | |
---|
| 76 | |
---|
| 77 | class WriterReaderTest(unittest.TestCase): |
---|
| 78 | @parameterized.expand(input_files) |
---|
| 79 | def test_write_then_read(self, filename): |
---|
| 80 | with self.subTest(i=filename): |
---|
| 81 | with open(filename, encoding='UTF-8') as file: |
---|
| 82 | json_content = json.load(file) |
---|
| 83 | after_write = from_collection(json_content) |
---|
| 84 | after_read = loads(after_write) |
---|
| 85 | self.assertEqual(len(json_content), len(after_read)) |
---|
| 86 | for i, o in zip(json_content, after_read): |
---|
| 87 | self.assertDictEqual(i, o) |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | if __name__ == '__main__': |
---|
| 91 | unittest.main() |
---|