Contact: fumanchu@aminus.org

Log in as guest/dejavu to create tickets

I think I've seen this ORM somewhere before...

root/trunk/test_containers.py

Revision 19 (checked in by fumanchu, 9 years ago)

1. Changed containers.Balloon class to .warehouse function.
2. Doc updates.

Line 
1 import unittest
2 import operator
3 from dejavu import containers
4
5
6 class WarehouseTests(unittest.TestCase):
7    
8     def test_builtin_types(self):
9         # ints
10         avail, rem = containers.warehouse([1,2,3])
11         self.assertEqual([avail.next() for x in xrange(5)], [1,2,3,0,0])
12        
13         avail, rem = containers.warehouse([1,2,3])
14         self.assertEqual([avail.next() for x in xrange(2)], [1,2])
15         self.assertEqual([x for x in rem], [3])
16        
17         # strings
18         avail, rem = containers.warehouse(['fish', 'bananas', 'old pyjamas'])
19         self.assertEqual([avail.next() for x in xrange(5)], ['fish', 'bananas', 'old pyjamas', '', ''])
20        
21         avail, rem = containers.warehouse(['fish', 'bananas', 'old pyjamas'])
22         self.assertEqual([avail.next() for x in xrange(2)], ['fish', 'bananas'])
23         self.assertEqual([x for x in rem], ['old pyjamas'])
24        
25         # Empty seq
26         avail, rem = containers.warehouse([])
27         self.assertRaises(ValueError, avail.next)
28    
29     def test_custom_classes(self):
30         class Thing:
31             def __init__(self, value=None):
32                 self.value = value
33        
34         things = Thing(1), Thing(2), Thing(3), Thing(4)
35         avail, rem = containers.warehouse(things)
36         self.assertEqual([avail.next().value for x in xrange(5)],
37                          [1, 2, 3, 4, None])
38        
39         avail, rem = containers.warehouse(things)
40         self.assertEqual([avail.next().value for x in xrange(2)], [1, 2])
41         self.assertEqual([x for x in rem], [things[2], things[3]])
42        
43         # Empty seq
44         avail, rem = containers.warehouse([], Thing)
45         self.assertEqual([avail.next().value for x in xrange(2)], [None, None])
46         self.assertEqual([x for x in rem], [])
47
48
49 class GraphTests(unittest.TestCase):
50    
51     def test_creation(self):
52         g = containers.Graph()
53         self.assertEqual(g, {})
54        
55         g = containers.Graph({'a': []})
56         self.assertEqual(g, {'a': []})
57        
58         g = containers.Graph({'a': []}, True)
59         self.assertEqual(g, {'a': []})
60    
61     def test_connect(self):
62         g = containers.Graph()
63         g.connect('A', 'B')
64         self.assertEqual(g, {'A': ['B'],
65                              'B': ['A'],
66                              })
67         g.connect('C', ('A', 'B'))
68         self.assertEqual(g, {'A': ['B', 'C'],
69                              'B': ['A', 'C'],
70                              'C': ['A', 'B'],
71                              })
72    
73     def test_chain(self):
74         # Form the undirected graph:
75         #   A--B--C--D
76         #   |  |\   /
77         #   |  | \ /
78         #   E--F--G
79         g = containers.Graph()
80         g.chain('A', 'B', 'C', 'D', 'G', 'F', 'E', 'A')
81         g.chain('B', 'F', 'G', 'B')
82         self.assertEqual(g, {'A': ['B', 'E'],
83                              'B': ['A', 'C', 'F', 'G'],
84                              'C': ['B', 'D'],
85                              'D': ['C', 'G'],
86                              'E': ['F', 'A'],
87                              'F': ['G', 'E', 'B'],
88                              'G': ['D', 'F', 'B'],
89                              })
90        
91         # Form the directed graph:
92         #   A-->B->C->D
93         #   |   |     |
94         #   +>E-+->F--+->G
95         g = containers.Graph(directed=True)
96         g.chain('A', 'B', 'C', 'D', 'G')
97         g.chain('A', 'E', 'F', 'G')
98         g.chain('B', 'F')
99         self.assertEqual(g, {'A': ['B', 'E'],
100                              'B': ['C', 'F'],
101                              'C': ['D'],
102                              'D': ['G'],
103                              'E': ['F'],
104                              'F': ['G'],
105                              })
106    
107     def test_shortest_path(self):
108         # Form the graph:
109         #   A--B--C--D
110         #   |  |\   /
111         #   |  | \ /
112         #   E--F--G
113         g = containers.Graph()
114         g.connect('A', ('B', 'E'))
115         g.connect('B', ('C', 'F', 'G'))
116         g.connect('D', ('C', 'G'))
117         g.connect('E', 'F')
118         g.connect('F', 'G')
119        
120         self.assertEqual(g.shortest_path('A', 'D'), ['A', 'B', 'C', 'D'])
121         self.assertEqual(g.shortest_path('B', 'A'), ['B', 'A'])
122         self.assertEqual(g.shortest_path('E', 'C'), ['E', 'A', 'B', 'C'])
123         self.assertEqual(g.shortest_path('A', 'G'), ['A', 'B', 'G'])
124        
125         # Do the same test again to see if caching works.
126         self.assertEqual(g.shortest_path('A', 'D'), ['A', 'B', 'C', 'D'])
127         self.assertEqual(g.shortest_path('B', 'A'), ['B', 'A'])
128         self.assertEqual(g.shortest_path('E', 'C'), ['E', 'A', 'B', 'C'])
129         self.assertEqual(g.shortest_path('A', 'G'), ['A', 'B', 'G'])
130        
131         # Test invalid paths.
132         self.assertRaises(KeyError, g.shortest_path, 'R', 'D')
133         self.assertEqual(g.shortest_path('D', 'R'), None)
134    
135     def test_shortest_path_directed(self):
136         # Form the graph:
137         #   A-->B->C->D
138         #   |   |     |
139         #   +>E-+->F--+->G
140         g = containers.Graph(directed=True)
141         g.connect('A', ('B', 'E'))
142         g.connect('B', ('C', 'F'))
143         g.connect('C', 'D')
144         g.connect('D', 'G')
145         g.connect('E', 'F')
146         g.connect('F', 'G')
147        
148         self.assertEqual(g, {'A': ['B', 'E'],
149                              'B': ['C', 'F'],
150                              'C': ['D'],
151                              'D': ['G'],
152                              'E': ['F'],
153                              'F': ['G'],
154                              })
155        
156         self.assertEqual(g.shortest_path('A', 'D'), ['A', 'B', 'C', 'D'])
157         self.assertEqual(g.shortest_path('B', 'A'), None)
158         self.assertEqual(g.shortest_path('E', 'C'), None)
159         self.assertEqual(g.shortest_path('A', 'G'), ['A', 'B', 'F', 'G'])
160
161
162 class Artwork(object):
163     def __init__(self, Name='', Artist='', Rate=''):
164         self.Name = Name
165         self.Artist = Artist
166         self.Rate = Rate
167
168
169 class IndexTests(unittest.TestCase):
170    
171     def test_Index(self):
172         artworks = containers.Index('Name', 'Artist', 'Rate')
173         for index in artworks:
174             self.assertEqual(index in ['Name', 'Artist', 'Rate'], True)
175        
176         # Store a single object.
177         guernica = Artwork('Guernica', 'Pablo Picasso', 185.00)
178         artworks.store(guernica)
179         self.assertEqual(artworks.bucket('Name', 'Guernica'), [guernica])
180        
181         # Add another that should collide on an indexed attribute.
182         frenzy = Artwork('Frenzy', 'Pablo Picasso', 203.45)
183         artworks.store(frenzy)
184         self.assertEqual(artworks.bucket('Artist', 'Pablo Picasso'),
185                          [guernica, frenzy])
186        
187         # Add a bunch.
188         magrittes = [Artwork('Empire of Light', 'Rene Magritte', 512.13),
189                      Artwork('The Rape', 'Rene Magritte', 121.99),
190                      Artwork('The Son of Man', 'Rene Magritte', 1024.33),
191                      Artwork('The Difficult Crossing', 'Rene Magritte', 0.32),
192                      ]
193         for work in magrittes:
194             artworks.store(work)
195        
196         # Manually find all artworks rated under 200
197         cheapos = []
198         for rate in artworks.handles('Rate'):
199             if rate < 200:
200                 cheapos.extend(artworks.bucket('Rate', rate))
201         expected = [magrittes[1], guernica, magrittes[3]]
202         self.assertEqual(len(cheapos), len(expected))
203         for work in expected:
204             self.assertEqual(work in cheapos, True)
205        
206         # Retrieve() all artworks rated over 200.
207         assets = artworks.retrieve('Rate', operator.gt, 200)
208         expected = [magrittes[2], frenzy, magrittes[0]]
209         self.assertEqual(len(assets), len(expected))
210         for work in expected:
211             self.assertEqual(work in assets, True)
212        
213         # Retrieve() all artworks. Use two different attributes
214         # and compare the results.
215         byrate = artworks.retrieve('Rate')
216         byartist = artworks.retrieve('Artist')
217         self.assertEqual(len(byrate), len(byartist))
218         for work in byrate:
219             self.assertEqual(work in byartist, True)
220        
221         # Delete a single artwork.
222         artworks.remove(guernica)
223         self.assertEqual(artworks.bucket('Artist', 'Pablo Picasso'), [frenzy])
224         self.assertRaises(KeyError, artworks.bucket, 'Name', 'Guernica')
225        
226         # Change an indexed value of an artwork.
227         guernica.Rate = 300.0
228         artworks.reindex(guernica, 'Rate')
229         self.assertEqual(artworks.retrieve('Rate', operator.eq, 300), [guernica])
230        
231         # Reindex with the known last value.
232         guernica.Rate = 135.0
233         artworks.reindex(guernica, 'Rate', 300.0)
234         self.assertEqual(artworks.retrieve('Rate', operator.eq, 135), [guernica])
235         self.assertEqual(artworks.retrieve('Rate', operator.eq, 300), [])
236         self.assertRaises(KeyError, artworks.bucket, 'Rate', 300.0)
237
238
239 class PrismTests(unittest.TestCase):
240    
241     def test_Prism(self):
242         artworks = containers.Prism('Name', 'Artist', 'Rate')
243         for index in artworks.facets.keys():
244             self.assertEqual(index in ['Name', 'Artist', 'Rate'], True)
245        
246         # Store a single row.
247         artworks.add(Name='Guernica', Artist='Pablo Picasso', Rate=185.00)
248         self.assertEqual(artworks.Artist(Name='Guernica'), 'Pablo Picasso')
249        
250         # Add another that should collide on an indexed attribute.
251         artworks.add(Name='Frenzy', Artist='Pablo Picasso', Rate=203.45)
252         self.assertEqual(artworks.Name(Artist='Pablo Picasso'), 'Guernica')
253         self.assertEqual(artworks.Rate(Artist='Pablo Picasso'), 185.00)
254        
255         # Add a row with missing facets.
256         artworks.add(Name='Empire of Light', Artist='Rene Magritte')
257         self.assertEqual(artworks.Rate(Artist='Rene Magritte'), None)
258         # Fill in the missing value.
259         i = artworks.row_number(Name='Empire of Light')
260         artworks.facets['Rate'][i] = 512.13
261         self.assertEqual(artworks.Rate(Artist='Rene Magritte'), 512.13)
262
263
264
265
266 if __name__ == "__main__":
267     unittest.main()
268
Note: See TracBrowser for help on using the browser.