comparison env/lib/python3.7/site-packages/prov/tests/test_model.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 """
2 Created on Jan 25, 2012
3
4 @author: Trung Dong Huynh
5 """
6 from __future__ import (absolute_import, division, print_function,
7 unicode_literals)
8
9 import unittest
10 import logging
11 import os
12
13 from prov.model import ProvDocument, ProvBundle, ProvException, first, Literal
14 from prov.tests import examples
15 from prov.tests.attributes import TestAttributesBase
16 from prov.tests.qnames import TestQualifiedNamesBase
17 from prov.tests.statements import TestStatementsBase
18 from prov.tests.utility import RoundTripTestCase
19
20 logger = logging.getLogger(__name__)
21
22
23 EX_URI = 'http://www.example.org/'
24 EX2_URI = 'http://www.example2.org/'
25
26
27 class TestExamplesBase(object):
28 """This is the base class for testing support for all the examples provided
29 in prov.tests.examples.
30 It is not runnable and needs to be included in a subclass of
31 RoundTripTestCase.
32 """
33 def test_all_examples(self):
34 counter = 0
35 for name, graph in examples.tests:
36 counter += 1
37 logger.info('%d. Testing the %s example', counter, name)
38 g = graph()
39 self.do_tests(g)
40
41
42 class TestLoadingProvToolboxJSON(unittest.TestCase):
43 def setUp(self):
44 self.json_path = os.path.dirname(os.path.abspath(__file__)) + '/json/'
45 filenames = os.listdir(self.json_path)
46 self.fails = []
47 for filename in filenames:
48 if filename.endswith('.json'):
49 with open(self.json_path + filename) as json_file:
50 try:
51 g1 = ProvDocument.deserialize(json_file)
52 json_str = g1.serialize(indent=4)
53 g2 = ProvDocument.deserialize(content=json_str)
54 self.assertEqual(
55 g1, g2,
56 'Round-trip JSON encoding/decoding failed: %s.'
57 % filename
58 )
59 except:
60 self.fails.append(filename)
61
62 def test_loading_all_json(self):
63 # self.assertFalse(fails, 'Failed to load/round-trip %d JSON files (%s)' % (len(fails), ', '.join(fails)))
64
65 # Code for debugging the failed tests
66 for filename in self.fails:
67 # Reload the failed files
68 filepath = self.json_path + filename
69 # os.rename(json_path + filename, json_path + filename + '-fail')
70 with open(filepath) as json_file:
71 logger.info("Loading %s...", filepath)
72 g1 = ProvDocument.deserialize(json_file)
73 json_str = g1.serialize(indent=4)
74 g2 = ProvDocument.deserialize(content=json_str)
75 self.assertEqual(
76 g1, g2,
77 'Round-trip JSON encoding/decoding failed: %s.'
78 % filename
79 )
80
81
82 class TestFlattening(unittest.TestCase):
83 def test_flattening(self):
84 for name, graph in examples.tests:
85 logger.info('Testing flattening of the %s example', name)
86 document = graph()
87 flattened = document.flattened()
88 flattened_records = set(flattened.get_records())
89 # counting all the records:
90 n_records = 0
91 for record in document.get_records():
92 n_records += 1
93 self.assertIn(record, flattened_records)
94 for bundle in document.bundles:
95 for record in bundle.get_records():
96 n_records += 1
97 self.assertIn(record, flattened_records)
98 self.assertEqual(n_records, len(flattened.get_records()))
99
100
101 class TestUnification(unittest.TestCase):
102 def test_unifying(self):
103 # This is a very trivial test just to exercise the unified() function
104 # TODO: Create a proper unification test
105 json_path = os.path.dirname(os.path.abspath(__file__)) + '/unification/'
106 filenames = os.listdir(json_path)
107 for filename in filenames:
108 if not filename.endswith('.json'):
109 continue
110 filepath = json_path + filename
111 with open(filepath) as json_file:
112 logger.info('Testing unifying: %s', filename)
113 logger.debug("Loading %s...", filepath)
114 document = ProvDocument.deserialize(json_file)
115 flattened = document.flattened()
116 unified = flattened.unified()
117 self.assertLess(
118 len(unified.get_records()),
119 len(flattened.get_records())
120 )
121
122
123 class TestBundleUpdate(unittest.TestCase):
124 def test_bundle_update_simple(self):
125 doc = ProvDocument()
126 doc.set_default_namespace(EX_URI)
127
128 b1 = doc.bundle('b1')
129 b1.entity('e')
130
131 b2 = doc.bundle('b2')
132 b2.entity('e')
133
134 self.assertRaises(ProvException, lambda: b1.update(1))
135 self.assertRaises(ProvException, lambda: b1.update(doc))
136
137 b1.update(b2)
138 self.assertEqual(len(b1.get_records()), 2)
139
140 def test_document_update_simple(self):
141 d1 = ProvDocument()
142 d1.set_default_namespace(EX_URI)
143 d1.entity('e')
144
145 b1 = d1.bundle('b1')
146 b1.entity('e')
147
148 d2 = ProvDocument()
149 d2.set_default_namespace(EX_URI)
150 d2.entity('e')
151
152 b1 = d2.bundle('b1')
153 b1.entity('e')
154 b2 = d2.bundle('b2')
155 b2.entity('e')
156
157 self.assertRaises(ProvException, lambda: d1.update(1))
158
159 d1.update(d2)
160 self.assertEqual(len(d1.get_records()), 2)
161 self.assertEqual(len(d1.bundles), 2)
162
163
164 class TestAddBundle(unittest.TestCase):
165 def document_1(self):
166 d1 = ProvDocument()
167 ns_ex = d1.add_namespace('ex', EX_URI)
168 d1.entity(ns_ex['e1'])
169 return d1
170
171 def document_2(self):
172 d2 = ProvDocument()
173 ns_ex = d2.add_namespace('ex', EX2_URI)
174 d2.activity(ns_ex['a1'])
175 return d2
176
177 def bundle_0(self):
178 b = ProvBundle(namespaces={'ex': EX2_URI})
179 return b
180
181 def test_add_bundle_simple(self):
182 d1 = self.document_1()
183 b0 = self.bundle_0()
184
185 def sub_test_1():
186 d1.add_bundle(b0)
187 self.assertRaises(ProvException, sub_test_1)
188 self.assertFalse(d1.has_bundles())
189
190 d1.add_bundle(b0, 'ex:b0')
191 self.assertTrue(d1.has_bundles())
192 self.assertIn(b0, d1.bundles)
193
194 def sub_test_2():
195 ex2_b0 = b0.identifier
196 d1.add_bundle(ProvBundle(identifier=ex2_b0))
197 self.assertRaises(ProvException, sub_test_2)
198
199 d1.add_bundle(ProvBundle(), 'ex:b0')
200 self.assertEqual(len(d1.bundles), 2)
201
202 def test_add_bundle_document(self):
203 d1 = self.document_1()
204 d2 = self.document_2()
205
206 def sub_test_1():
207 d1.add_bundle(d2)
208 self.assertRaises(ProvException, sub_test_1)
209
210 ex2_b2 = d2.valid_qualified_name('ex:b2')
211 d1.add_bundle(d2, 'ex:b2')
212 self.assertEqual(ex2_b2, first(d1.bundles).identifier)
213 self.assertNotIn(d2, d1.bundles)
214 b2 = ProvBundle()
215 b2.update(d2)
216 self.assertIn(b2, d1.bundles)
217
218 class TestLiteralRepresentation(unittest.TestCase):
219 def test_literal_provn_with_single_quotes(self):
220 l = Literal('{"foo": "bar"}')
221 string_rep = l.provn_representation()
222 self.assertTrue('{\\"f' in string_rep)
223
224 def test_literal_provn_with_triple_quotes(self):
225 l = Literal('"""foo\\nbar"""')
226 string_rep = l.provn_representation()
227 self.assertTrue('\\"\\"\\"f' in string_rep)
228
229 class AllTestsBase(TestExamplesBase, TestStatementsBase,
230 TestAttributesBase, TestQualifiedNamesBase):
231 """This is a test to include all available tests.
232 """
233 pass
234
235
236 class RoundTripModelTest(RoundTripTestCase, AllTestsBase):
237 def assertRoundTripEquivalence(self, prov_doc, msg=None):
238 """Exercises prov.model without the actual serialization and PROV-N
239 generation.
240 """
241 provn_content = prov_doc.get_provn()
242 # Checking for self-equality
243 self.assertEqual(
244 prov_doc, prov_doc,
245 'The document is not self-equal:\n' + provn_content)
246
247
248 if __name__ == "__main__":
249 unittest.main()