Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/prov/tests/test_rdf.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
| author | shellac |
|---|---|
| date | Sat, 02 May 2020 07:14:21 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 from __future__ import (absolute_import, division, print_function, | |
| 2 unicode_literals) | |
| 3 | |
| 4 import unittest | |
| 5 from prov.model import ProvDocument | |
| 6 from prov.tests.utility import RoundTripTestCase | |
| 7 from prov.tests.test_model import (TestStatementsBase, | |
| 8 TestAttributesBase, TestQualifiedNamesBase) | |
| 9 import os | |
| 10 from glob import glob | |
| 11 import logging | |
| 12 logger = logging.getLogger(__name__) | |
| 13 | |
| 14 from prov.tests import examples | |
| 15 import prov.model as pm | |
| 16 | |
| 17 import rdflib as rl | |
| 18 from rdflib.compare import graph_diff | |
| 19 from io import BytesIO, StringIO | |
| 20 | |
| 21 | |
| 22 def find_diff(g_rdf, g0_rdf): | |
| 23 graphs_equal = True | |
| 24 in_both, in_first, in_second = graph_diff(g_rdf, g0_rdf) | |
| 25 g1 = sorted(in_first.serialize(format='nt').splitlines())[1:] | |
| 26 g2 = sorted(in_second.serialize(format='nt').splitlines())[1:] | |
| 27 # Compare literals | |
| 28 if len(g1) != len(g2): | |
| 29 graphs_equal = False | |
| 30 matching_indices = [[], []] | |
| 31 for idx in range(len(g1)): | |
| 32 g1_stmt = list(rl.ConjunctiveGraph().parse(BytesIO(g1[idx]), | |
| 33 format='nt'))[0] | |
| 34 match_found = False | |
| 35 for idx2 in range(len(g2)): | |
| 36 if idx2 in matching_indices[1]: | |
| 37 continue | |
| 38 g2_stmt = list(rl.ConjunctiveGraph().parse(BytesIO(g2[idx2]), | |
| 39 format='nt'))[0] | |
| 40 try: | |
| 41 all_match = all([g1_stmt[i].eq(g2_stmt[i]) for i in range(3)]) | |
| 42 except TypeError as e: | |
| 43 #logger.info(e, g1_stmt, g2_stmt) | |
| 44 all_match = False | |
| 45 if all_match: | |
| 46 matching_indices[0].append(idx) | |
| 47 matching_indices[1].append(idx2) | |
| 48 match_found = True | |
| 49 break | |
| 50 if not match_found: | |
| 51 graphs_equal = False | |
| 52 in_first2 = rl.ConjunctiveGraph() | |
| 53 for idx in range(len(g1)): | |
| 54 if idx in matching_indices[0]: | |
| 55 in_both.parse(BytesIO(g1[idx]), format='nt') | |
| 56 else: | |
| 57 in_first2.parse(BytesIO(g1[idx]), format='nt') | |
| 58 in_second2 = rl.ConjunctiveGraph() | |
| 59 for idx in range(len(g2)): | |
| 60 if not idx in matching_indices[1]: | |
| 61 in_second2.parse(BytesIO(g2[idx]), format='nt') | |
| 62 #logger.info(in_first2) | |
| 63 #logger.info(in_second2) | |
| 64 return graphs_equal, in_both, in_first2, in_second2 | |
| 65 | |
| 66 | |
| 67 class TestExamplesBase(object): | |
| 68 """This is the base class for testing support for all the examples provided | |
| 69 in prov.tests.examples. | |
| 70 It is not runnable and needs to be included in a subclass of | |
| 71 RoundTripTestCase. | |
| 72 """ | |
| 73 def test_all_examples(self): | |
| 74 counter = 0 | |
| 75 for name, graph in examples.tests: | |
| 76 if name in ['datatypes']: | |
| 77 logger.info('%d. Skipping the %s example', counter, name) | |
| 78 continue | |
| 79 counter += 1 | |
| 80 logger.info('%d. Testing the %s example', counter, name) | |
| 81 g = graph() | |
| 82 self.do_tests(g) | |
| 83 | |
| 84 | |
| 85 class TestJSONExamplesBase(object): | |
| 86 """This is the base class for testing support for all the examples provided | |
| 87 in prov.tests.examples. | |
| 88 It is not runnable and needs to be included in a subclass of | |
| 89 RoundTripTestCase. | |
| 90 """ | |
| 91 def test_all_examples(self): | |
| 92 counter = 0 | |
| 93 for name, graph in examples.tests: | |
| 94 if name in ['datatypes']: | |
| 95 logger.info('%d. Skipping the %s example', counter, name) | |
| 96 continue | |
| 97 counter += 1 | |
| 98 logger.info('%d. Testing the %s example', counter, name) | |
| 99 g = graph() | |
| 100 self.do_tests(g) | |
| 101 | |
| 102 | |
| 103 class TestStatementsBase2(TestStatementsBase): | |
| 104 @unittest.expectedFailure | |
| 105 def test_scruffy_end_1(self): | |
| 106 TestStatementsBase.test_scruffy_end_1() | |
| 107 @unittest.expectedFailure | |
| 108 def test_scruffy_end_2(self): | |
| 109 TestStatementsBase.test_scruffy_end_2() | |
| 110 @unittest.expectedFailure | |
| 111 def test_scruffy_end_3(self): | |
| 112 TestStatementsBase.test_scruffy_end_3() | |
| 113 @unittest.expectedFailure | |
| 114 def test_scruffy_end_4(self): | |
| 115 TestStatementsBase.test_scruffy_end_4() | |
| 116 @unittest.expectedFailure | |
| 117 def test_scruffy_generation_1(self): | |
| 118 TestStatementsBase.test_scruffy_generation_1() | |
| 119 @unittest.expectedFailure | |
| 120 def test_scruffy_generation_2(self): | |
| 121 TestStatementsBase.test_scruffy_generation_2() | |
| 122 @unittest.expectedFailure | |
| 123 def test_scruffy_invalidation_1(self): | |
| 124 TestStatementsBase.test_scruffy_invalidation_1() | |
| 125 @unittest.expectedFailure | |
| 126 def test_scruffy_invalidation_2(self): | |
| 127 TestStatementsBase.test_scruffy_invalidation_2() | |
| 128 @unittest.expectedFailure | |
| 129 def test_scruffy_start_1(self): | |
| 130 TestStatementsBase.test_scruffy_start_1() | |
| 131 @unittest.expectedFailure | |
| 132 def test_scruffy_start_2(self): | |
| 133 TestStatementsBase.test_scruffy_start_2() | |
| 134 @unittest.expectedFailure | |
| 135 def test_scruffy_start_3(self): | |
| 136 TestStatementsBase.test_scruffy_start_3() | |
| 137 @unittest.expectedFailure | |
| 138 def test_scruffy_start_4(self): | |
| 139 TestStatementsBase.test_scruffy_start_4() | |
| 140 @unittest.expectedFailure | |
| 141 def test_scruffy_usage_1(self): | |
| 142 TestStatementsBase.test_scruffy_usage_1() | |
| 143 @unittest.expectedFailure | |
| 144 def test_scruffy_usage_2(self): | |
| 145 TestStatementsBase.test_scruffy_usage_2() | |
| 146 | |
| 147 | |
| 148 class TestAttributesBase2(TestAttributesBase): | |
| 149 @unittest.expectedFailure | |
| 150 def test_entity_with_multiple_attribute(self): | |
| 151 TestAttributesBase.test_entity_with_multiple_attribute() | |
| 152 @unittest.expectedFailure | |
| 153 def test_entity_with_multiple_value_attribute(self): | |
| 154 TestAttributesBase.test_entity_with_multiple_value_attribute() | |
| 155 @unittest.expectedFailure | |
| 156 def test_entity_with_one_type_attribute_8(self): | |
| 157 TestAttributesBase.test_entity_with_one_type_attribute_8() | |
| 158 | |
| 159 | |
| 160 class AllTestsBase(TestExamplesBase, | |
| 161 TestStatementsBase2, | |
| 162 TestQualifiedNamesBase, | |
| 163 TestAttributesBase2 | |
| 164 ): | |
| 165 """This is a test to include all available tests. | |
| 166 """ | |
| 167 pass | |
| 168 | |
| 169 | |
| 170 class TestRDFSerializer(unittest.TestCase): | |
| 171 def test_decoding_unicode_value(self): | |
| 172 unicode_char = u'\u2019' | |
| 173 rdf_content = u''' | |
| 174 @prefix ex: <http://www.example.org/> . | |
| 175 @prefix prov: <http://www.w3.org/ns/prov#> . | |
| 176 @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | |
| 177 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . | |
| 178 @prefix xml: <http://www.w3.org/XML/1998/namespace> . | |
| 179 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . | |
| 180 | |
| 181 ex:unicode_char a prov:Entity ; | |
| 182 rdfs:label "%s"^^xsd:string . | |
| 183 ''' % unicode_char | |
| 184 prov_doc = ProvDocument.deserialize(content=rdf_content, | |
| 185 format='rdf', rdf_format='turtle') | |
| 186 e1 = prov_doc.get_record('ex:unicode_char')[0] | |
| 187 self.assertIn(unicode_char, e1.get_attribute('prov:label')) | |
| 188 | |
| 189 def test_json_to_ttl_match(self): | |
| 190 json_files = sorted( | |
| 191 glob(os.path.join(os.path.dirname(__file__), 'json', '*.json'))) | |
| 192 | |
| 193 # invalid round trip files | |
| 194 skip = list(range(352, 380)) | |
| 195 | |
| 196 # invalid literal set representation e.g., set((1, True)) | |
| 197 skip_match = [5, 6, 7, 8, 15, 27, 28, 29, 75, 76, 77, 78, 79, 80, 260, | |
| 198 261, 262, 263, 264, | |
| 199 306, 313, 315, 317, 322, 323, 324, 325, 330, 332, 344, | |
| 200 346, 382, 389, 395, 397, | |
| 201 ] | |
| 202 errors = [] | |
| 203 for idx, fname in enumerate(json_files): | |
| 204 _, ttl_file = os.path.split(fname) | |
| 205 ttl_file = os.path.join(os.path.dirname(__file__), 'rdf', | |
| 206 ttl_file.replace('json', 'ttl')) | |
| 207 try: | |
| 208 g = pm.ProvDocument.deserialize(fname) | |
| 209 if len(g.bundles) == 0: | |
| 210 format = 'turtle' | |
| 211 else: | |
| 212 format = 'trig' | |
| 213 if format == 'trig': | |
| 214 ttl_file = ttl_file.replace('ttl', 'trig') | |
| 215 | |
| 216 with open(ttl_file, 'rb') as fp: | |
| 217 g_rdf = rl.ConjunctiveGraph().parse(fp, format=format) | |
| 218 g0_rdf = rl.ConjunctiveGraph().parse( | |
| 219 StringIO(g.serialize(format='rdf', rdf_format=format)), | |
| 220 format=format) | |
| 221 if idx not in skip_match: | |
| 222 match, _, in_first, in_second = find_diff(g_rdf, g0_rdf) | |
| 223 self.assertTrue(match) | |
| 224 else: | |
| 225 logger.info('Skipping match: %s' % fname) | |
| 226 if idx in skip: | |
| 227 logger.info('Skipping deserialization: %s' % fname) | |
| 228 continue | |
| 229 g1 = pm.ProvDocument.deserialize( | |
| 230 content=g.serialize(format='rdf', rdf_format=format), | |
| 231 format='rdf', rdf_format=format) | |
| 232 except Exception as e: | |
| 233 #logger.info(e) | |
| 234 errors.append((e, idx, fname, in_first, in_second)) | |
| 235 self.assertFalse(errors) | |
| 236 | |
| 237 | |
| 238 class RoundTripRDFTests(RoundTripTestCase, AllTestsBase): | |
| 239 FORMAT = 'rdf' | |
| 240 | |
| 241 if __name__ == "__main__": | |
| 242 suite = unittest.TestSuite() | |
| 243 for method in dir(TestRDFSerializer): | |
| 244 if method.startswith("test"): | |
| 245 suite.addTest(TestRDFSerializer(method)) | |
| 246 unittest.TextTestRunner().run(suite) |
