1 import codecs
2 import os
3 import sys
4 import unittest
5 import tempfile
6 import shutil
7 import datetime
8 import traceback
9
10 py_ver = sys.version_info[:2]
11 module = globals()
12
13 import dbf
14 from dbf.api import *
15
16 if py_ver < (3, 0):
17 EOF = '\x1a'
18 MISC = ''.join([chr(i) for i in range(256)])
19 PHOTO = ''.join(reversed([chr(i) for i in range(256)]))
20 else:
21 unicode = str
22 xrange = range
23 dbf.LatinByte.export_to(module)
24 MISC = ''.join([chr(i) for i in range(256)]).encode('latin-1')
25 PHOTO = ''.join(reversed([chr(i) for i in range(256)])).encode('latin-1')
26
27
28 print("\nTesting dbf version %d.%02d.%03d on %s with Python %s\n" % (
29 dbf.version + (sys.platform, sys.version) ))
30
31
32
33
34 words = """
35 Soft rains, given time, have rounded the angles of great towers. Generation after generation, wind borne seeds have brought down cities amid the gentle tangle of their roots. All statues of stone have been worn away.
36 Still one statue, not of stone, holds its lines against the passing years.
37 Sunlight, fading autumn light, warms the sculpture as best it can, almost penetrating to its dreaming core. The figure is that of a woman, once the fair sex of a species now untroubled and long unseen. Man sleeps the sleep of extinction. This one statue remains. Behind the grace of its ivory brow and gentle, unseeing eyes, the statue dreams.
38 A susurrus of voices, a flutter of images, and the dream tumbles down through the long morning. Suspended. Floating on the stream that brings from the heart of time the wandering self. Maya for that is the statue s name-- is buoyed by the sensation, rising within the cage of consciousness, but asleep. She has been this way for months: the unmoving figure of a woman caught in mid stride across the glade. The warmth of sunlight on her face makes her wonder if she will ever wake again.
39 Even at the end, there was no proper word for what Maya has become. Robot. Cybernetic Organism. Android. These are as appropriate to her condition as calling the stars campfires of the night sky and equally precise. It is enough to know that her motive energies are no longer sun and sustenance, and though Maya was once a living woman, a scientist, now she inhabits a form of ageless attraction. It is a form whose energies are flagging.
40 With great determination, Maya moves toward wakefulness. Flex a finger. Move a hand. Think of the lemurs, their tongues reaching out in stroke after stroke for the drip of the honeyed thorns. Though there is little time left to save her charges, Maya s only choice is the patience of the trees. On the day her energies return, it is autumn of the year following the morning her sleep began. Maya opens her eyes. The woman, the frozen machine --that which is both-- moves once more.
41 Two lemur cubs tumbling near the edge of the glade take notice. One rushes forward to touch Maya s knee and laugh. Maya reaches out with an arthritic hand, cold in its sculpted smoothness, but the lemur darts away. Leaves swirl about its retreat, making a crisp sound. The cub displays a playfulness Maya s fevered mind cannot match. The second cub rolls between her moss covered feet, laughing. The lemurs are her charges, and she is failing them. Still, it is good to be awake.
42 Sugar maples and sumacs shoulder brilliant robes. In the low sun, their orange and purple hues startle the heart. Of course, Maya has no beating organ, no heart. Her life energies are transmitted from deep underground. Nor are the cubs truly lemurs, nor the sugar maples the trees of old. The names have carried for ten million seasons, but the species have changed. Once the lemurs inhabited an island off the southeast coast of a place called Africa. Now they are here, much changed, in the great forests of the northern climes.
43 The young lemurs seem hale, and it speaks well for their consanguine fellows. But their true fate lies in the story of DNA, of a few strands in the matriarchal line, of a sequence code-named "hope." No doubt a once clever acronym, today Maya s clouded mind holds nothing of the ancient codes. She knows only that a poet once spoke of hope as "the thing with feathers that perches in the soul." Emily Dickinson. A strange name, and so unlike the agnomen of the lemurs. What has become of Giver-of-Corn?
44 Having no reason to alarm the cubs, Maya moves with her hands high, so that any movement will be down as leaves fall. Though anxious about Giver-of-Corn, she ambles on to finish the mission begun six months earlier. Ahead, the shadow of a mound rises up beneath a great oak. A door awaits. Somewhere below the forest, the engine that gives her life weakens. Held in sway to its faltering beat her mind and body froze, sending her into an abyss of dreams. She has been striding toward that door for half a year, unknowing if she would ever wake again.
45 Vines lose their toughened grip as the door responds to Maya s approach. Regretfully, a tree root snaps, but the door shudders to a halt before its whine of power can cross the glade. Suddenly, an opening has been made into the earth, and Maya steps lightly on its downward slope. Without breathing, she catches a scent of mold and of deep, uncirculated water. A flutter like the sound of wings echoes from the hollow. Her vision adjusts as she descends. In spots, lights attempt to greet her, but it is a basement she enters, flickering and ancient, where the footfalls of millipedes wear tracks in grime older than the forest above. After a long descent, she steps into water.
46 How long ago was it that the floor was dry? The exactitude of such time, vast time, escapes her.
47 Once this place sustained great scholars, scientists. Now sightless fish skip through broken walls, retreating as Maya wades their private corridors, finding with each step that she remembers the labyrinthine path to the heart of power. A heart that flutters like dark wings. And with it, she flutters too. The closer she comes to the vault in which the great engine is housed, the less hopeful she becomes.
48 The vault housing the engine rests beneath a silvered arch. Its mirrored surface denies age, even as a new generation of snails rise up out of the dark pool, mounting first the dais of pearled stone left by their ancestors, the discarded shells of millions, then higher to where the overhang drips, layered in egg sacs bright as coral.
49 Maya has no need to set the vault door in motion, to break the dance of the snails. The state of things tells her all she needs to know. There shall be no repairs, no rescue; the engine will die, and she with it. Still, it is impossible not to check. At her touch, a breath of firefly lights coalesces within the patient dampness of the room. They confirm. The heart is simply too tired to go on. Its last reserves wield processes of great weight and care, banking the fires of its blood, dimming the furnace into safe resolve. Perhaps a month or two in cooling, then the last fire kindled by man shall die.
50 For the figure standing knee deep in water the issues are more immediate. The powers that allow her to live will be the first to fade. It is amazing, even now, that she remains cognizant.
51 For a moment, Maya stands transfixed by her own reflection. The silvered arch holds it as moonlight does a ghost. She is a sculpted thing with shoulders of white marble. Lips of stone. A child s face. No, the grace of a woman resides in the features, as though eternity can neither deny the sage nor touch the youth. Demeter. The Earth Mother.
52 Maya smiles at the Greek metaphor. She has never before thought of herself as divine, nor monumental. When the energies of the base are withdrawn entirely, she will become immobile. Once a goddess, then a statue to be worn away by endless time, the crumbling remnant of something the self has ceased to be. Maya trembles at the thought. The last conscious reserve of man will soon fade forever from the halls of time.
53 As if hewn of irresolute marble, Maya begins to shake; were she still human there would be sobs; there would be tears to moisten her grief and add to the dark waters at her feet.
54 In time, Maya breaks the spell. She sets aside her grief to work cold fingers over the dim firefly controls, giving what priorities remain to her survival. In response, the great engine promises little, but does what it can.
55 While life remains, Maya determines to learn what she can of the lemurs, of their progress, and the fate of the matriarchal line. There will be time enough for dreams. Dreams. The one that tumbled down through the long morning comes to her and she pauses to consider it. There was a big table. Indistinct voices gathered around it, but the energy of a family gathering filled the space. The warmth of the room curled about her, perfumed by the smell of cooking. An ancient memory, from a time before the shedding of the flesh. Outside, children laughed. A hand took hers in its own, bringing her to a table filled with colorful dishes and surrounded by relatives and friends. Thanksgiving?
56 They re calling me home, Maya thinks. If indeed her ancestors could reach across time and into a form not of the flesh, perhaps that was the meaning of the dream. I am the last human consciousness, and I am being called home.
57 With a flutter, Maya is outside, and the trees all but bare of leaves. Something has happened. Weeks have passed and she struggles to take in her situation. This time she has neither dreamed nor stood immobile, but she has been active without memory.
58 Her arms cradle a lemur, sheltering the pubescent female against the wind. They sit atop a ridge that separates the valley from the forest to the west, and Walker-in-Leaves has been gone too long. That much Maya remembers. The female lemur sighs. It is a rumbling, mournful noise, and she buries her head tighter against Maya. This is Giver-of-Corn, and Walker is her love.
59 With her free hand, Maya works at a stiff knitting of pine boughs, the blanket which covers their legs. She pulls it up to better shelter Giver-of-Corn. Beside them, on a shell of bark, a sliver of fish has gone bad from inattention.
60 They wait through the long afternoon, but Walker does not return. When it is warmest and Giver sleeps, Maya rises in stages, gently separating herself from the lemur. She covers her charge well. Soon it will snow.
61 There are few memories after reaching the vault, only flashes, and that she has been active in a semi-consciousness state frightens Maya. She stumbles away, shaking, but there is no comfort to seek. She does not know if her diminished abilities endanger the lemurs, and considers locking herself beneath the earth. But the sun is warm, and for the moment every thought is a cloudless sky. Memories descend from the past like a lost tribe wandering for home.
62 To the east lie once powerful lands and remembered sepulchers. The life of the gods, the pulse of kings, it has all vanished and gone. Maya thinks back to the days of man. There was no disaster at the end. Just time. Civilization did not fail, it succumbed to endless seasons. Each vast stretch of years drawn on by the next saw the conquest of earth and stars, then went on, unheeding, until man dwindled and his monuments frayed.
63 To the west rise groves of oaks and grassland plains, beyond them, mountains that shrugged off civilization more easily than the rest.
64 Where is the voyager in those leaves?
65 A flash of time and Maya finds herself deep in the forests to the west. A lemur call escapes her throat, and suddenly she realizes she is searching for Walker-in-Leaves. The season is the same. Though the air is crisp, the trees are not yet unburdened of their color.
66 "Walker!" she calls out. "Your love is dying. She mourns your absence."
67 At the crest of a rise, Maya finds another like herself, but one long devoid of life. This sculpted form startles her at first. It has been almost wholly absorbed into the trunk of a great tree. The knee and calf of one leg escape the surrounding wood, as does a shoulder, the curve of a breast, a mournful face. A single hand reaches out from the tree toward the valley below.
68 In the distance, Maya sees the remnants of a fallen orbiter. Its power nacelle lies buried deep beneath the river that cushioned its fall. Earth and water, which once heaved at the impact, have worn down impenetrable metals and grown a forest over forgotten technologies.
69 Had the watcher in the tree come to see the fall, or to stand vigil over the corpse? Maya knows only that she must go on before the hills and the trees conspire to bury her. She moves on, continuing to call for Walker-in-Leaves.
70 In the night, a coyote finally answers Maya, its frenetic howls awakening responses from many cousins, hunting packs holding court up and down the valley.
71 Giver-of-Corn holds the spark of her generation. It is not much. A gene here and there, a deep manipulation of the flesh. The consciousness that was man is not easy to engender. Far easier to make an eye than a mind to see. Along a path of endless complication, today Giver-of-Corn mourns the absence of her mate. That Giver may die of such stubborn love before passing on her genes forces Maya deeper into the forest, using the last of her strength to call endlessly into the night.
72 Maya is dreaming. It s Thanksgiving, but the table is cold. The chairs are empty, and no one answers her call. As she walks from room to room, the lights dim and it begins to rain within the once familiar walls.
73 When Maya opens her eyes, it is to see Giver-of-Corm sleeping beneath a blanket of pine boughs, the young lemur s bushy tail twitching to the rhythm of sorrowful dreams. Maya is awake once more, but unaware of how much time has passed, or why she decided to return. Her most frightening thought is that she may already have found Walker-in-Leaves, or what the coyotes left behind.
74 Up from the valley, two older lemurs walk arm in arm, supporting one another along the rise. They bring with them a twig basket and a pouch made of hide. The former holds squash, its hollowed interior brimming with water, the latter a corn mash favored by the tribe. They are not without skills, these lemurs. Nor is language unknown to them. They have known Maya forever and treat her, not as a god, but as a force of nature.
75 With a few brief howls, by clicks, chatters, and the sweeping gestures of their tails, the lemurs make clear their plea. Their words all but rhyme. Giver-of-Corn will not eat for them. Will she eat for Maya?
76 Thus has the mission to found a new race come down to this: with her last strength, Maya shall spoon feed a grieving female. The thought strikes her as both funny and sad, while beyond her thoughts, the lemurs continue to chatter.
77 Scouts have been sent, the elders assure Maya, brave sires skilled in tracking. They hope to find Walker before the winter snows. Their voices stir Giver, and she howls in petty anguish at her benefactors, then disappears beneath the blanket. The elders bow their heads and turn to go, oblivious of Maya s failures.
78 Days pass upon the ridge in a thickness of clouds. Growing. Advancing. Dimmed by the mountainous billows above, the sun gives way to snow, and Maya watches Giver focus ever more intently on the line to the west. As the lemur s strength fails, her determination to await Walker s return seems to grow stronger still.
79 Walker-in-Leaves holds a spark of his own. He alone ventures west after the harvest. He has done it before, always returning with a colored stone, a bit of metal, or a flower never before seen by the tribe. It is as if some mad vision compels him, for the journey s end brings a collection of smooth and colored booty to be arranged in a crescent beneath a small monolith Walker himself toiled to raise. Large stones and small, the lemur has broken two fingers of its left hand doing this. To Maya, it seems the ambition of butterflies and falling leaves, of no consequence beyond a motion in the sun. The only importance now is to keep the genes within Giver alive.
80 Long ago, an ambition rose among the last generation of men, of what had once been men: to cultivate a new consciousness upon the Earth. Maya neither led nor knew the masters of the effort, but she was there when the first prosimians arrived, fresh from their land of orchids and baobabs. Men gathered lemurs and said to them "we shall make you men." Long years followed in the work of the genes, gentling the generations forward. Yet with each passing season, the cultivators grew fewer and their skills less true. So while the men died of age, or boredom, or despair, the lemurs prospered in their youth.
81 To warm the starving lemur, Maya builds a fire. For this feat the tribe has little skill, nor do they know zero, nor that a lever can move the world. She holds Giver close and pulls the rough blanket of boughs about them both.
82 All this time, Maya s thoughts remain clear, and the giving of comfort comforts her as well.
83 The snow begins to cover the monument Walker-in-Leaves has built upon the ridge. As Maya stares on and on into the fire, watching it absorb the snow, watching the snow conquer the cold stones and the grasses already bowed under a cloak of white, she drifts into a flutter of reverie, a weakening of consciousness. The gate to the end is closing, and she shall never know never know.
84 "I ll take it easy like, an stay around de house this winter," her father said. "There s carpenter work for me to do."
85 Other voices joined in around a table upon which a vast meal had been set. Thanksgiving. At the call of their names, the children rushed in from outside, their laughter quick as sunlight, their jackets smelling of autumn and leaves. Her mother made them wash and bow their heads in prayer. Those already seated joined in.
86 Grandmother passed the potatoes and called Maya her little kolache, rattling on in a series of endearments and concerns Maya s ear could not follow. Her mother passed on the sense of it and reminded Maya of the Czech for Thank you, Grandma.
87 It s good to be home, she thinks at first, then: where is the walker in those leaves?
88 A hand on which two fingers lay curled by the power of an old wound touches Maya. It shakes her, then gently moves her arms so that its owner can pull back the warm pine boughs hiding Giver-of Corn. Eyes first, then smile to tail, Giver opens herself to the returning wanderer. Walker-in-Leaves has returned, and the silence of their embrace brings the whole of the ridge alive in a glitter of sun-bright snow. Maya too comes awake, though this time neither word nor movement prevails entirely upon the fog of sleep.
89 When the answering howls come to the ridge, those who follow help Maya to stand. She follows them back to the shelter of the valley, and though she stumbles, there is satisfaction in the hurried gait, in the growing pace of the many as they gather to celebrate the return of the one. Songs of rejoicing join the undisciplined and cacophonous barks of youth. Food is brought, from the deep stores, from the caves and their recesses. Someone heats fish over coals they have kept sheltered and going for months. The thought of this ingenuity heartens Maya.
90 A delicacy of honeyed thorns is offered with great ceremony to Giver-of-Corn, and she tastes at last something beyond the bitterness of loss.
91 Though Walker-in-Leaves hesitates to leave the side of his love, the others demand stories, persuading him to the center where he begins a cacophonous song of his own.
92 Maya hopes to see what stones Walker has brought from the west this time, but though she tries to speak, the sounds are forgotten. The engine fades. The last flicker of man s fire is done, and with it the effort of her desires overcome her. She is gone.
93 Around a table suited for the Queen of queens, a thousand and a thousand sit. Mother to daughter, side-by-side, generation after generation of lemurs share in the feast. Maya is there, hearing the excited voices and the stern warnings to prayer. To her left and her right, each daughter speaks freely. Then the rhythms change, rising along one side to the cadence of Shakespeare and falling along the other to howls the forest first knew.
94 Unable to contain herself, Maya rises. She pushes on toward the head of a table she cannot see, beginning at last to run. What is the height her charges have reached? How far have they advanced? Lemur faces turn to laugh, their wide eyes joyous and amused. As the generations pass, she sees herself reflected in spectacles, hears the jangle of bracelets and burnished metal, watches matrons laugh behind scarves of silk. Then at last, someone with sculpted hands directs her outside, where the other children are at play in the leaves, now and forever.
95 THE END""".split()
96
97
98 numbers = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541]
99 floats = []
100 last = 1
101 for number in numbers:
102 floats.append(float(number ** 2 / last))
103 last = number
106 if N <= 0:
107 yield []
108 return
109 for x in Xs:
110 for sub in permutate(Xs, N-1):
111 result = [x]+sub
112 for item in result:
113 if result.count(item) > 1:
114 break
115 else:
116 yield result
117
119 """Generate combinations of N items from list Xs"""
120 if N == 0:
121 yield []
122 return
123 for i in xrange(len(Xs)-N+1):
124 for r in combinate(Xs[i+1:], N-1):
125 yield [Xs[i]] + r
126
128 "returns integers 0 - len(sequence)"
129 for i in xrange(len(sequence)):
130 yield i
131
141
144 "exceptions"
145 self.assertRaises(ValueError, Char, 7)
146 self.assertRaises(ValueError, Char, ['nope'])
147 self.assertRaises(ValueError, Char, True)
148 self.assertRaises(ValueError, Char, False)
149 self.assertRaises(ValueError, Char, type)
150 self.assertRaises(ValueError, Char, str)
151 self.assertRaises(ValueError, Char, None)
153 "booleans and None"
154 empty = Char()
155 self.assertFalse(bool(empty))
156 one = Char(' ')
157 self.assertFalse(bool(one))
158 actual = Char('1')
159 self.assertTrue(bool(actual))
161 "equality"
162 a1 = Char('a')
163 a2 = 'a '
164 self.assertEqual(a1, a2)
165 self.assertEqual(a2, a1)
166 a3 = 'a '
167 a4 = Char('a ')
168 self.assertEqual(a3, a4)
169 self.assertEqual(a4, a3)
171 "inequality"
172 a1 = Char('ab ')
173 a2 = 'a b'
174 self.assertNotEqual(a1, a2)
175 self.assertNotEqual(a2, a1)
176 a3 = 'ab '
177 a4 = Char('a b')
178 self.assertNotEqual(a3, a4)
179 self.assertNotEqual(a4, a3)
181 "less-than"
182 a1 = Char('a')
183 a2 = 'a '
184 self.assertFalse(a1 < a2)
185 self.assertFalse(a2 < a1)
186 a3 = 'a '
187 a4 = Char('a ')
188 self.assertFalse(a3 < a4)
189 self.assertFalse(a4 < a3)
190 a5 = 'abcd'
191 a6 = 'abce'
192 self.assertTrue(a5 < a6)
193 self.assertFalse(a6 < a5)
195 "less-than or equal"
196 a1 = Char('a')
197 a2 = 'a '
198 self.assertTrue(a1 <= a2)
199 self.assertTrue(a2 <= a1)
200 a3 = 'a '
201 a4 = Char('a ')
202 self.assertTrue(a3 <= a4)
203 self.assertTrue(a4 <= a3)
204 a5 = 'abcd'
205 a6 = 'abce'
206 self.assertTrue(a5 <= a6)
207 self.assertFalse(a6 <= a5)
209 "greater-than or equal"
210 a1 = Char('a')
211 a2 = 'a '
212 self.assertTrue(a1 >= a2)
213 self.assertTrue(a2 >= a1)
214 a3 = 'a '
215 a4 = Char('a ')
216 self.assertTrue(a3 >= a4)
217 self.assertTrue(a4 >= a3)
218 a5 = 'abcd'
219 a6 = 'abce'
220 self.assertFalse(a5 >= a6)
221 self.assertTrue(a6 >= a5)
223 "greater-than"
224 a1 = Char('a')
225 a2 = 'a '
226 self.assertFalse(a1 > a2)
227 self.assertFalse(a2 > a1)
228 a3 = 'a '
229 a4 = Char('a ')
230 self.assertFalse(a3 > a4)
231 self.assertFalse(a4 > a3)
232 a5 = 'abcd'
233 a6 = 'abce'
234 self.assertFalse(a5 > a6)
235 self.assertTrue(a6 > a5)
236
238 "Testing Date"
259
276
278 "DateTime replacements"
279 datetime_target = DateTime(2001, 5, 31, 23, 59, 59, 999000)
280 datetime1 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999230)
281 datetime2 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999500)
282 datetime3 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999728)
283 original_datetime = datetime.datetime
284 for dt in (datetime1, datetime2, datetime3):
285 class DateTimeNow(datetime.datetime):
286 @classmethod
287 def now(self):
288 datetime.datetime = original_datetime
289 return dt
290 datetime.datetime = DateTimeNow
291 result = DateTime.now()
292 self.assertEqual(result, datetime_target, 'in: %r out: %r desired: %r' % (dt, result, datetime_target))
293
294
310 "Date, DateTime, & Time Arithmetic"
311 one_day = datetime.timedelta(1)
312 a_day = Date(1970, 5, 20)
313 self.assertEqual(a_day + one_day, Date(1970, 5, 21))
314 self.assertEqual(a_day - one_day, Date(1970, 5, 19))
315 self.assertEqual(datetime.date(1970, 5, 21) - a_day, one_day)
316 a_time = Time(12)
317 one_second = datetime.timedelta(0, 1, 0)
318 self.assertEqual(a_time + one_second, Time(12, 0, 1))
319 self.assertEqual(a_time - one_second, Time(11, 59, 59))
320 self.assertEqual(datetime.time(12, 0, 1) - a_time, one_second)
321 an_appt = DateTime(2012, 4, 15, 12, 30, 00)
322 displacement = datetime.timedelta(1, 60*60*2+60*15)
323 self.assertEqual(an_appt + displacement, DateTime(2012, 4, 16, 14, 45, 0))
324 self.assertEqual(an_appt - displacement, DateTime(2012, 4, 14, 10, 15, 0))
325 self.assertEqual(datetime.datetime(2012, 4, 16, 14, 45, 0) - an_appt, displacement)
327 "comparisons to None"
328 empty_date = Date()
329 empty_time = Time()
330 empty_datetime = DateTime()
331 self.assertEqual(empty_date, None)
332 self.assertEqual(empty_time, None)
333 self.assertEqual(empty_datetime, None)
335 "singletons"
336 empty_date = Date()
337 empty_time = Time()
338 empty_datetime = DateTime()
339 self.assertTrue(empty_date is NullDate)
340 self.assertTrue(empty_time is NullTime)
341 self.assertTrue(empty_datetime is NullDateTime)
343 "boolean evaluation"
344 empty_date = Date()
345 empty_time = Time()
346 empty_datetime = DateTime()
347 self.assertEqual(bool(empty_date), False)
348 self.assertEqual(bool(empty_time), False)
349 self.assertEqual(bool(empty_datetime), False)
350 actual_date = Date.today()
351 actual_time = Time.now()
352 actual_datetime = DateTime.now()
353 self.assertEqual(bool(actual_date), True)
354 self.assertEqual(bool(actual_time), True)
355 self.assertEqual(bool(actual_datetime), True)
357 self.assertEqual(empty1, empty2)
358 self.assertEqual(uno < dos, True)
359 self.assertEqual(uno <= dos, True)
360 self.assertEqual(dos <= dos, True)
361 self.assertEqual(dos <= tres, True)
362 self.assertEqual(dos < tres, True)
363 self.assertEqual(tres <= tres, True)
364 self.assertEqual(uno == uno, True)
365 self.assertEqual(dos == dos, True)
366 self.assertEqual(tres == tres, True)
367 self.assertEqual(uno != dos, True)
368 self.assertEqual(dos != tres, True)
369 self.assertEqual(tres != uno, True)
370 self.assertEqual(tres >= tres, True)
371 self.assertEqual(tres > dos, True)
372 self.assertEqual(dos >= dos, True)
373 self.assertEqual(dos >= uno, True)
374 self.assertEqual(dos > uno, True)
375 self.assertEqual(uno >= uno, True)
376 self.assertEqual(uno >= dos, False)
377 self.assertEqual(uno >= tres, False)
378 self.assertEqual(dos >= tres, False)
379 self.assertEqual(tres <= dos, False)
380 self.assertEqual(tres <= uno, False)
381 self.assertEqual(tres < tres, False)
382 self.assertEqual(tres < dos, False)
383 self.assertEqual(tres < uno, False)
384 self.assertEqual(dos < dos, False)
385 self.assertEqual(dos < uno, False)
386 self.assertEqual(uno < uno, False)
387 self.assertEqual(uno == dos, False)
388 self.assertEqual(uno == tres, False)
389 self.assertEqual(dos == uno, False)
390 self.assertEqual(dos == tres, False)
391 self.assertEqual(tres == uno, False)
392 self.assertEqual(tres == dos, False)
393 self.assertEqual(uno != uno, False)
394 self.assertEqual(dos != dos, False)
395 self.assertEqual(tres != tres, False)
396
503
505 "Testing Logical"
507 "Unknown"
508 for unk in '', '?', ' ', None, Null, Unknown, Other:
509 huh = unknown = Logical(unk)
510 self.assertEqual(huh == None, True, "huh is %r from %r, which is not None" % (huh, unk))
511 self.assertEqual(huh != None, False, "huh is %r from %r, which is not None" % (huh, unk))
512 self.assertEqual(huh != True, True, "huh is %r from %r, which is not None" % (huh, unk))
513 self.assertEqual(huh == True, False, "huh is %r from %r, which is not None" % (huh, unk))
514 self.assertEqual(huh != False, True, "huh is %r from %r, which is not None" % (huh, unk))
515 self.assertEqual(huh == False, False, "huh is %r from %r, which is not None" % (huh, unk))
516 if py_ver >= (2, 5):
517 self.assertRaises(ValueError, lambda : (0, 1, 2)[huh])
519 "true"
520 for true in 'True', 'yes', 't', 'Y', 7, ['blah']:
521 huh = Logical(true)
522 self.assertEqual(huh == True, True)
523 self.assertEqual(huh != True, False)
524 self.assertEqual(huh == False, False, "%r is not True" % true)
525 self.assertEqual(huh != False, True)
526 self.assertEqual(huh == None, False)
527 self.assertEqual(huh != None, True)
528 if py_ver >= (2, 5):
529 self.assertEqual((0, 1, 2)[huh], 1)
531 "false"
532 for false in 'false', 'No', 'F', 'n', 0, []:
533 huh = Logical(false)
534 self.assertEqual(huh != False, False)
535 self.assertEqual(huh == False, True)
536 self.assertEqual(huh != True, True)
537 self.assertEqual(huh == True, False)
538 self.assertEqual(huh != None, True)
539 self.assertEqual(huh == None, False)
540 if py_ver >= (2, 5):
541 self.assertEqual((0, 1, 2)[huh], 0)
543 "singletons"
544 heh = Logical(True)
545 hah = Logical('Yes')
546 ick = Logical(False)
547 ack = Logical([])
548 unk = Logical('?')
549 bla = Logical(None)
550 self.assertEqual(heh is hah, True)
551 self.assertEqual(ick is ack, True)
552 self.assertEqual(unk is bla, True)
554 "errors"
555 self.assertRaises(ValueError, Logical, 'wrong')
557 "and"
558 true = Logical(True)
559 false = Logical(False)
560 unknown = Logical(None)
561 self.assertEqual((true & true) is true, True)
562 self.assertEqual((true & false) is false, True)
563 self.assertEqual((false & true) is false, True)
564 self.assertEqual((false & false) is false, True)
565 self.assertEqual((true & unknown) is unknown, True)
566 self.assertEqual((false & unknown) is false, True)
567 self.assertEqual((unknown & true) is unknown, True)
568 self.assertEqual((unknown & false) is false, True)
569 self.assertEqual((unknown & unknown) is unknown, True)
570 self.assertEqual((true & True) is true, True)
571 self.assertEqual((true & False) is false, True)
572 self.assertEqual((false & True) is false, True)
573 self.assertEqual((false & False) is false, True)
574 self.assertEqual((true & None) is unknown, True)
575 self.assertEqual((false & None) is false, True)
576 self.assertEqual((unknown & True) is unknown, True)
577 self.assertEqual((unknown & False) is false, True)
578 self.assertEqual((unknown & None) is unknown, True)
579 self.assertEqual((True & true) is true, True)
580 self.assertEqual((True & false) is false, True)
581 self.assertEqual((False & true) is false, True)
582 self.assertEqual((False & false) is false, True)
583 self.assertEqual((True & unknown) is unknown, True)
584 self.assertEqual((False & unknown) is false, True)
585 self.assertEqual((None & true) is unknown, True)
586 self.assertEqual((None & false) is false, True)
587 self.assertEqual((None & unknown) is unknown, True)
588 self.assertEqual(type(true & 0), int)
589 self.assertEqual(true & 0, 0)
590 self.assertEqual(type(true & 3), int)
591 self.assertEqual(true & 3, 1)
592 self.assertEqual(type(false & 0), int)
593 self.assertEqual(false & 0, 0)
594 self.assertEqual(type(false & 2), int)
595 self.assertEqual(false & 2, 0)
596 self.assertEqual(type(unknown & 0), int)
597 self.assertEqual(unknown & 0, 0)
598 self.assertEqual(unknown & 2, unknown)
599
600 t = true
601 t &= true
602 self.assertEqual(t is true, True)
603 t = true
604 t &= false
605 self.assertEqual(t is false, True)
606 f = false
607 f &= true
608 self.assertEqual(f is false, True)
609 f = false
610 f &= false
611 self.assertEqual(f is false, True)
612 t = true
613 t &= unknown
614 self.assertEqual(t is unknown, True)
615 f = false
616 f &= unknown
617 self.assertEqual(f is false, True)
618 u = unknown
619 u &= true
620 self.assertEqual(u is unknown, True)
621 u = unknown
622 u &= false
623 self.assertEqual(u is false, True)
624 u = unknown
625 u &= unknown
626 self.assertEqual(u is unknown, True)
627 t = true
628 t &= True
629 self.assertEqual(t is true, True)
630 t = true
631 t &= False
632 self.assertEqual(t is false, True)
633 f = false
634 f &= True
635 self.assertEqual(f is false, True)
636 f = false
637 f &= False
638 self.assertEqual(f is false, True)
639 t = true
640 t &= None
641 self.assertEqual(t is unknown, True)
642 f = false
643 f &= None
644 self.assertEqual(f is false, True)
645 u = unknown
646 u &= True
647 self.assertEqual(u is unknown, True)
648 u = unknown
649 u &= False
650 self.assertEqual(u is false, True)
651 u = unknown
652 u &= None
653 self.assertEqual(u is unknown, True)
654 t = True
655 t &= true
656 self.assertEqual(t is true, True)
657 t = True
658 t &= false
659 self.assertEqual(t is false, True)
660 f = False
661 f &= true
662 self.assertEqual(f is false, True)
663 f = False
664 f &= false
665 self.assertEqual(f is false, True)
666 t = True
667 t &= unknown
668 self.assertEqual(t is unknown, True)
669 f = False
670 f &= unknown
671 self.assertEqual(f is false, True)
672 u = None
673 u &= true
674 self.assertEqual(u is unknown, True)
675 u = None
676 u &= false
677 self.assertEqual(u is false, True)
678 u = None
679 u &= unknown
680 self.assertEqual(u is unknown, True)
681 t = true
682 t &= 0
683 self.assertEqual(type(true & 0), int)
684 t = true
685 t &= 0
686 self.assertEqual(true & 0, 0)
687 t = true
688 t &= 3
689 self.assertEqual(type(true & 3), int)
690 t = true
691 t &= 3
692 self.assertEqual(true & 3, 1)
693 f = false
694 f &= 0
695 self.assertEqual(type(false & 0), int)
696 f = false
697 f &= 0
698 self.assertEqual(false & 0, 0)
699 f = false
700 f &= 2
701 self.assertEqual(type(false & 2), int)
702 f = false
703 f &= 2
704 self.assertEqual(false & 2, 0)
705 u = unknown
706 u &= 0
707 self.assertEqual(type(unknown & 0), int)
708 u = unknown
709 u &= 0
710 self.assertEqual(unknown & 0, 0)
711 u = unknown
712 u &= 2
713 self.assertEqual(unknown & 2, unknown)
714
716 "or"
717 true = Logical(True)
718 false = Logical(False)
719 unknown = Logical(None)
720 self.assertEqual((true | true) is true, True)
721 self.assertEqual((true | false) is true, True)
722 self.assertEqual((false | true) is true, True)
723 self.assertEqual((false | false) is false, True)
724 self.assertEqual((true | unknown) is true, True)
725 self.assertEqual((false | unknown) is unknown, True)
726 self.assertEqual((unknown | true) is true, True)
727 self.assertEqual((unknown | false) is unknown, True)
728 self.assertEqual((unknown | unknown) is unknown, True)
729 self.assertEqual((true | True) is true, True)
730 self.assertEqual((true | False) is true, True)
731 self.assertEqual((false | True) is true, True)
732 self.assertEqual((false | False) is false, True)
733 self.assertEqual((true | None) is true, True)
734 self.assertEqual((false | None) is unknown, True)
735 self.assertEqual((unknown | True) is true, True)
736 self.assertEqual((unknown | False) is unknown, True)
737 self.assertEqual((unknown | None) is unknown, True)
738 self.assertEqual((True | true) is true, True)
739 self.assertEqual((True | false) is true, True)
740 self.assertEqual((False | true) is true, True)
741 self.assertEqual((False | false) is false, True)
742 self.assertEqual((True | unknown) is true, True)
743 self.assertEqual((False | unknown) is unknown, True)
744 self.assertEqual((None | true) is true, True)
745 self.assertEqual((None | false) is unknown, True)
746 self.assertEqual((None | unknown) is unknown, True)
747 self.assertEqual(type(true | 0), int)
748 self.assertEqual(true | 0, 1)
749 self.assertEqual(type(true | 2), int)
750 self.assertEqual(true | 2, 3)
751 self.assertEqual(type(false | 0), int)
752 self.assertEqual(false | 0, 0)
753 self.assertEqual(type(false | 2), int)
754 self.assertEqual(false | 2, 2)
755 self.assertEqual(unknown | 0, unknown)
756 self.assertEqual(unknown | 2, unknown)
757
758 t = true
759 t |= true
760 self.assertEqual(t is true, True)
761 t = true
762 t |= false
763 self.assertEqual(t is true, True)
764 f = false
765 f |= true
766 self.assertEqual(f is true, True)
767 f = false
768 f |= false
769 self.assertEqual(f is false, True)
770 t = true
771 t |= unknown
772 self.assertEqual(t is true, True)
773 f = false
774 f |= unknown
775 self.assertEqual(f is unknown, True)
776 u = unknown
777 u |= true
778 self.assertEqual(u is true, True)
779 u = unknown
780 u |= false
781 self.assertEqual(u is unknown, True)
782 u = unknown
783 u |= unknown
784 self.assertEqual(u is unknown, True)
785 t = true
786 t |= True
787 self.assertEqual(t is true, True)
788 t = true
789 t |= False
790 self.assertEqual(t is true, True)
791 f = false
792 f |= True
793 self.assertEqual(f is true, True)
794 f = false
795 f |= False
796 self.assertEqual(f is false, True)
797 t = true
798 t |= None
799 self.assertEqual(t is true, True)
800 f = false
801 f |= None
802 self.assertEqual(f is unknown, True)
803 u = unknown
804 u |= True
805 self.assertEqual(u is true, True)
806 u = unknown
807 u |= False
808 self.assertEqual(u is unknown, True)
809 u = unknown
810 u |= None
811 self.assertEqual(u is unknown, True)
812 t = True
813 t |= true
814 self.assertEqual(t is true, True)
815 t = True
816 t |= false
817 self.assertEqual(t is true, True)
818 f = False
819 f |= true
820 self.assertEqual(f is true, True)
821 f = False
822 f |= false
823 self.assertEqual(f is false, True)
824 t = True
825 t |= unknown
826 self.assertEqual(t is true, True)
827 f = False
828 f |= unknown
829 self.assertEqual(f is unknown, True)
830 u = None
831 u |= true
832 self.assertEqual(u is true, True)
833 u = None
834 u |= false
835 self.assertEqual(u is unknown, True)
836 u = None
837 u |= unknown
838 self.assertEqual(u is unknown, True)
839 t = true
840 t |= 0
841 self.assertEqual(type(t), int)
842 t = true
843 t |= 0
844 self.assertEqual(t, 1)
845 t = true
846 t |= 2
847 self.assertEqual(type(t), int)
848 t = true
849 t |= 2
850 self.assertEqual(t, 3)
851 f = false
852 f |= 0
853 self.assertEqual(type(f), int)
854 f = false
855 f |= 0
856 self.assertEqual(f, 0)
857 f = false
858 f |= 2
859 self.assertEqual(type(f), int)
860 f = false
861 f |= 2
862 self.assertEqual(f, 2)
863 u = unknown
864 u |= 0
865 self.assertEqual(u, unknown)
866
868 "xor"
869 true = Logical(True)
870 false = Logical(False)
871 unknown = Logical(None)
872 self.assertEqual((true ^ true) is false, True)
873 self.assertEqual((true ^ false) is true, True)
874 self.assertEqual((false ^ true) is true, True)
875 self.assertEqual((false ^ false) is false, True)
876 self.assertEqual((true ^ unknown) is unknown, True)
877 self.assertEqual((false ^ unknown) is unknown, True)
878 self.assertEqual((unknown ^ true) is unknown, True)
879 self.assertEqual((unknown ^ false) is unknown, True)
880 self.assertEqual((unknown ^ unknown) is unknown, True)
881 self.assertEqual((true ^ True) is false, True)
882 self.assertEqual((true ^ False) is true, True)
883 self.assertEqual((false ^ True) is true, True)
884 self.assertEqual((false ^ False) is false, True)
885 self.assertEqual((true ^ None) is unknown, True)
886 self.assertEqual((false ^ None) is unknown, True)
887 self.assertEqual((unknown ^ True) is unknown, True)
888 self.assertEqual((unknown ^ False) is unknown, True)
889 self.assertEqual((unknown ^ None) is unknown, True)
890 self.assertEqual((True ^ true) is false, True)
891 self.assertEqual((True ^ false) is true, True)
892 self.assertEqual((False ^ true) is true, True)
893 self.assertEqual((False ^ false) is false, True)
894 self.assertEqual((True ^ unknown) is unknown, True)
895 self.assertEqual((False ^ unknown) is unknown, True)
896 self.assertEqual((None ^ true) is unknown, True)
897 self.assertEqual((None ^ false) is unknown, True)
898 self.assertEqual((None ^ unknown) is unknown, True)
899 self.assertEqual(type(true ^ 2), int)
900 self.assertEqual(true ^ 2, 3)
901 self.assertEqual(type(true ^ 0), int)
902 self.assertEqual(true ^ 0, 1)
903 self.assertEqual(type(false ^ 0), int)
904 self.assertEqual(false ^ 0, 0)
905 self.assertEqual(type(false ^ 2), int)
906 self.assertEqual(false ^ 2, 2)
907 self.assertEqual(unknown ^ 0, unknown)
908 self.assertEqual(unknown ^ 2, unknown)
909
910 t = true
911 t ^= true
912 self.assertEqual(t is false, True)
913 t = true
914 t ^= false
915 self.assertEqual(t is true, True)
916 f = false
917 f ^= true
918 self.assertEqual(f is true, True)
919 f = false
920 f ^= false
921 self.assertEqual(f is false, True)
922 t = true
923 t ^= unknown
924 self.assertEqual(t is unknown, True)
925 f = false
926 f ^= unknown
927 self.assertEqual(f is unknown, True)
928 u = unknown
929 u ^= true
930 self.assertEqual(u is unknown, True)
931 u = unknown
932 u ^= false
933 self.assertEqual(u is unknown, True)
934 u = unknown
935 u ^= unknown
936 self.assertEqual(u is unknown, True)
937 t = true
938 t ^= True
939 self.assertEqual(t is false, True)
940 t = true
941 t ^= False
942 self.assertEqual(t is true, True)
943 f = false
944 f ^= True
945 self.assertEqual(f is true, True)
946 f = false
947 f ^= False
948 self.assertEqual(f is false, True)
949 t = true
950 t ^= None
951 self.assertEqual(t is unknown, True)
952 f = false
953 f ^= None
954 self.assertEqual(f is unknown, True)
955 u = unknown
956 u ^= True
957 self.assertEqual(u is unknown, True)
958 u = unknown
959 u ^= False
960 self.assertEqual(u is unknown, True)
961 u = unknown
962 u ^= None
963 self.assertEqual(u is unknown, True)
964 t = True
965 t ^= true
966 self.assertEqual(t is false, True)
967 t = True
968 t ^= false
969 self.assertEqual(t is true, True)
970 f = False
971 f ^= true
972 self.assertEqual(f is true, True)
973 f = False
974 f ^= false
975 self.assertEqual(f is false, True)
976 t = True
977 t ^= unknown
978 self.assertEqual(t is unknown, True)
979 f = False
980 f ^= unknown
981 self.assertEqual(f is unknown, True)
982 u = None
983 u ^= true
984 self.assertEqual(u is unknown, True)
985 u = None
986 u ^= false
987 self.assertEqual(u is unknown, True)
988 u = None
989 u ^= unknown
990 self.assertEqual(u is unknown, True)
991 t = true
992 t ^= 0
993 self.assertEqual(type(true ^ 0), int)
994 t = true
995 t ^= 0
996 self.assertEqual(true ^ 0, 1)
997 t = true
998 t ^= 2
999 self.assertEqual(type(true ^ 2), int)
1000 t = true
1001 t ^= 2
1002 self.assertEqual(true ^ 2, 3)
1003 f = false
1004 f ^= 0
1005 self.assertEqual(type(false ^ 0), int)
1006 f = false
1007 f ^= 0
1008 self.assertEqual(false ^ 0, 0)
1009 f = false
1010 f ^= 2
1011 self.assertEqual(type(false ^ 2), int)
1012 f = false
1013 f ^= 2
1014 self.assertEqual(false ^ 2, 2)
1015 u = unknown
1016 u ^= 0
1017 self.assertEqual(unknown ^ 0, unknown)
1018 u = unknown
1019 u ^= 2
1020 self.assertEqual(unknown ^ 2, unknown)
1021
1054
1056 "complex"
1057 true = Logical(True)
1058 false = Logical(False)
1059 none = Logical(None)
1060 self.assertEqual(complex(true), complex(1))
1061 self.assertEqual(complex(false), complex(0))
1062 self.assertRaises(ValueError, complex, none)
1063
1072
1073 if py_ver < (3, 0):
1082
1091
1100
1109
1111 "addition"
1112 true = Logical(True)
1113 false = Logical(False)
1114 unknown = Logical(None)
1115 self.assertEqual(true + true, 2)
1116 self.assertEqual(true + false, 1)
1117 self.assertEqual(false + true, 1)
1118 self.assertEqual(false + false, 0)
1119 self.assertEqual(true + unknown, unknown)
1120 self.assertEqual(false + unknown, unknown)
1121 self.assertEqual(unknown + true, unknown)
1122 self.assertEqual(unknown + false, unknown)
1123 self.assertEqual(unknown + unknown, unknown)
1124 self.assertEqual(true + True, 2)
1125 self.assertEqual(true + False, 1)
1126 self.assertEqual(false + True, 1)
1127 self.assertEqual(false + False, 0)
1128 self.assertEqual(true + None, unknown)
1129 self.assertEqual(false + None, unknown)
1130 self.assertEqual(unknown + True, unknown)
1131 self.assertEqual(unknown + False, unknown)
1132 self.assertEqual(unknown + None, unknown)
1133 self.assertEqual(True + true, 2)
1134 self.assertEqual(True + false, 1)
1135 self.assertEqual(False + true, 1)
1136 self.assertEqual(False + false, 0)
1137 self.assertEqual(True + unknown, unknown)
1138 self.assertEqual(False + unknown, unknown)
1139 self.assertEqual(None + true, unknown)
1140 self.assertEqual(None + false, unknown)
1141 self.assertEqual(None + unknown, unknown)
1142
1143 t = true
1144 t += true
1145 self.assertEqual(t, 2)
1146 t = true
1147 t += false
1148 self.assertEqual(t, 1)
1149 f = false
1150 f += true
1151 self.assertEqual(f, 1)
1152 f = false
1153 f += false
1154 self.assertEqual(f, 0)
1155 t = true
1156 t += unknown
1157 self.assertEqual(t, unknown)
1158 f = false
1159 f += unknown
1160 self.assertEqual(f, unknown)
1161 u = unknown
1162 u += true
1163 self.assertEqual(u, unknown)
1164 u = unknown
1165 u += false
1166 self.assertEqual(u, unknown)
1167 u = unknown
1168 u += unknown
1169 self.assertEqual(u, unknown)
1170 t = true
1171 t += True
1172 self.assertEqual(t, 2)
1173 t = true
1174 t += False
1175 self.assertEqual(t, 1)
1176 f = false
1177 f += True
1178 self.assertEqual(f, 1)
1179 f = false
1180 f += False
1181 self.assertEqual(f, 0)
1182 t = true
1183 t += None
1184 self.assertEqual(t, unknown)
1185 f = false
1186 f += None
1187 self.assertEqual(f, unknown)
1188 u = unknown
1189 u += True
1190 self.assertEqual(u, unknown)
1191 u = unknown
1192 u += False
1193 self.assertEqual(u, unknown)
1194 u = unknown
1195 u += None
1196 self.assertEqual(u, unknown)
1197 t = True
1198 t += true
1199 self.assertEqual(t, 2)
1200 t = True
1201 t += false
1202 self.assertEqual(t, 1)
1203 f = False
1204 f += true
1205 self.assertEqual(f, 1)
1206 f = False
1207 f += false
1208 self.assertEqual(f, 0)
1209 t = True
1210 t += unknown
1211 self.assertEqual(t, unknown)
1212 f = False
1213 f += unknown
1214 self.assertEqual(f, unknown)
1215 u = None
1216 u += true
1217 self.assertEqual(u, unknown)
1218 u = None
1219 u += false
1220 self.assertEqual(u, unknown)
1221 u = None
1222 u += unknown
1223 self.assertEqual(u, unknown)
1224
1226 "multiplication"
1227 true = Logical(True)
1228 false = Logical(False)
1229 unknown = Logical(None)
1230 self.assertEqual(true * true, 1)
1231 self.assertEqual(true * false, 0)
1232 self.assertEqual(false * true, 0)
1233 self.assertEqual(false * false, 0)
1234 self.assertEqual(true * unknown, unknown)
1235 self.assertEqual(false * unknown, 0)
1236 self.assertEqual(unknown * true, unknown)
1237 self.assertEqual(unknown * false, 0)
1238 self.assertEqual(unknown * unknown, unknown)
1239 self.assertEqual(true * True, 1)
1240 self.assertEqual(true * False, 0)
1241 self.assertEqual(false * True, 0)
1242 self.assertEqual(false * False, 0)
1243 self.assertEqual(true * None, unknown)
1244 self.assertEqual(false * None, 0)
1245 self.assertEqual(unknown * True, unknown)
1246 self.assertEqual(unknown * False, 0)
1247 self.assertEqual(unknown * None, unknown)
1248 self.assertEqual(True * true, 1)
1249 self.assertEqual(True * false, 0)
1250 self.assertEqual(False * true, 0)
1251 self.assertEqual(False * false, 0)
1252 self.assertEqual(True * unknown, unknown)
1253 self.assertEqual(False * unknown, 0)
1254 self.assertEqual(None * true, unknown)
1255 self.assertEqual(None * false, 0)
1256 self.assertEqual(None * unknown, unknown)
1257
1258 t = true
1259 t *= true
1260 self.assertEqual(t, 1)
1261 t = true
1262 t *= false
1263 self.assertEqual(t, 0)
1264 f = false
1265 f *= true
1266 self.assertEqual(f, 0)
1267 f = false
1268 f *= false
1269 self.assertEqual(f, 0)
1270 t = true
1271 t *= unknown
1272 self.assertEqual(t, unknown)
1273 f = false
1274 f *= unknown
1275 self.assertEqual(f, 0)
1276 u = unknown
1277 u *= true
1278 self.assertEqual(u, unknown)
1279 u = unknown
1280 u *= false
1281 self.assertEqual(u, 0)
1282 u = unknown
1283 u *= unknown
1284 self.assertEqual(u, unknown)
1285 t = true
1286 t *= True
1287 self.assertEqual(t, 1)
1288 t = true
1289 t *= False
1290 self.assertEqual(t, 0)
1291 f = false
1292 f *= True
1293 self.assertEqual(f, 0)
1294 f = false
1295 f *= False
1296 self.assertEqual(f, 0)
1297 t = true
1298 t *= None
1299 self.assertEqual(t, unknown)
1300 f = false
1301 f *= None
1302 self.assertEqual(f, 0)
1303 u = unknown
1304 u *= True
1305 self.assertEqual(u, unknown)
1306 u = unknown
1307 u *= False
1308 self.assertEqual(u, 0)
1309 u = unknown
1310 u *= None
1311 self.assertEqual(u, unknown)
1312 t = True
1313 t *= true
1314 self.assertEqual(t, 1)
1315 t = True
1316 t *= false
1317 self.assertEqual(t, 0)
1318 f = False
1319 f *= true
1320 self.assertEqual(f, 0)
1321 f = False
1322 f *= false
1323 self.assertEqual(f, 0)
1324 t = True
1325 t *= unknown
1326 self.assertEqual(t, unknown)
1327 f = False
1328 f *= unknown
1329 self.assertEqual(f, 0)
1330 u = None
1331 u *= true
1332 self.assertEqual(u, unknown)
1333 u = None
1334 u *= false
1335 self.assertEqual(u, 0)
1336 u = None
1337 u *= unknown
1338 self.assertEqual(u, unknown)
1340 "subtraction"
1341 true = Logical(True)
1342 false = Logical(False)
1343 unknown = Logical(None)
1344 self.assertEqual(true - true, 0)
1345 self.assertEqual(true - false, 1)
1346 self.assertEqual(false - true, -1)
1347 self.assertEqual(false - false, 0)
1348 self.assertEqual(true - unknown, unknown)
1349 self.assertEqual(false - unknown, unknown)
1350 self.assertEqual(unknown - true, unknown)
1351 self.assertEqual(unknown - false, unknown)
1352 self.assertEqual(unknown - unknown, unknown)
1353 self.assertEqual(true - True, 0)
1354 self.assertEqual(true - False, 1)
1355 self.assertEqual(false - True, -1)
1356 self.assertEqual(false - False, 0)
1357 self.assertEqual(true - None, unknown)
1358 self.assertEqual(false - None, unknown)
1359 self.assertEqual(unknown - True, unknown)
1360 self.assertEqual(unknown - False, unknown)
1361 self.assertEqual(unknown - None, unknown)
1362 self.assertEqual(True - true, 0)
1363 self.assertEqual(True - false, 1)
1364 self.assertEqual(False - true, -1)
1365 self.assertEqual(False - false, 0)
1366 self.assertEqual(True - unknown, unknown)
1367 self.assertEqual(False - unknown, unknown)
1368 self.assertEqual(None - true, unknown)
1369 self.assertEqual(None - false, unknown)
1370 self.assertEqual(None - unknown, unknown)
1371
1372 t = true
1373 t -= true
1374 self.assertEqual(t, 0)
1375 t = true
1376 t -= false
1377 self.assertEqual(t, 1)
1378 f = false
1379 f -= true
1380 self.assertEqual(f, -1)
1381 f = false
1382 f -= false
1383 self.assertEqual(f, 0)
1384 t = true
1385 t -= unknown
1386 self.assertEqual(t, unknown)
1387 f = false
1388 f -= unknown
1389 self.assertEqual(f, unknown)
1390 u = unknown
1391 u -= true
1392 self.assertEqual(u, unknown)
1393 u = unknown
1394 u -= false
1395 self.assertEqual(u, unknown)
1396 u = unknown
1397 u -= unknown
1398 self.assertEqual(u, unknown)
1399 t = true
1400 t -= True
1401 self.assertEqual(t, 0)
1402 t = true
1403 t -= False
1404 self.assertEqual(t, 1)
1405 f = false
1406 f -= True
1407 self.assertEqual(f, -1)
1408 f = false
1409 f -= False
1410 self.assertEqual(f, 0)
1411 t = true
1412 t -= None
1413 self.assertEqual(t, unknown)
1414 f = false
1415 f -= None
1416 self.assertEqual(f, unknown)
1417 u = unknown
1418 u -= True
1419 self.assertEqual(u, unknown)
1420 u = unknown
1421 u -= False
1422 self.assertEqual(u, unknown)
1423 u = unknown
1424 u -= None
1425 self.assertEqual(u, unknown)
1426 t = True
1427 t -= true
1428 self.assertEqual(t, 0)
1429 t = True
1430 t -= false
1431 self.assertEqual(t, 1)
1432 f = False
1433 f -= true
1434 self.assertEqual(f, -1)
1435 f = False
1436 f -= false
1437 self.assertEqual(f, 0)
1438 t = True
1439 t -= unknown
1440 self.assertEqual(t, unknown)
1441 f = False
1442 f -= unknown
1443 self.assertEqual(f, unknown)
1444 u = None
1445 u -= true
1446 self.assertEqual(u, unknown)
1447 u = None
1448 u -= false
1449 self.assertEqual(u, unknown)
1450 u = None
1451 u -= unknown
1452 self.assertEqual(u, unknown)
1453
1455 "division"
1456 true = Logical(True)
1457 false = Logical(False)
1458 unknown = Logical(None)
1459 self.assertEqual(true / true, 1)
1460 self.assertEqual(true / false, unknown)
1461 self.assertEqual(false / true, 0)
1462 self.assertEqual(false / false, unknown)
1463 self.assertEqual(true / unknown, unknown)
1464 self.assertEqual(false / unknown, unknown)
1465 self.assertEqual(unknown / true, unknown)
1466 self.assertEqual(unknown / false, unknown)
1467 self.assertEqual(unknown / unknown, unknown)
1468 self.assertEqual(true / True, 1)
1469 self.assertEqual(true / False, unknown)
1470 self.assertEqual(false / True, 0)
1471 self.assertEqual(false / False, unknown)
1472 self.assertEqual(true / None, unknown)
1473 self.assertEqual(false / None, unknown)
1474 self.assertEqual(unknown / True, unknown)
1475 self.assertEqual(unknown / False, unknown)
1476 self.assertEqual(unknown / None, unknown)
1477 self.assertEqual(True / true, 1)
1478 self.assertEqual(True / false, unknown)
1479 self.assertEqual(False / true, 0)
1480 self.assertEqual(False / false, unknown)
1481 self.assertEqual(True / unknown, unknown)
1482 self.assertEqual(False / unknown, unknown)
1483 self.assertEqual(None / true, unknown)
1484 self.assertEqual(None / false, unknown)
1485 self.assertEqual(None / unknown, unknown)
1486
1487 t = true
1488 t /= true
1489 self.assertEqual(t, 1)
1490 t = true
1491 t /= false
1492 self.assertEqual(t, unknown)
1493 f = false
1494 f /= true
1495 self.assertEqual(f, 0)
1496 f = false
1497 f /= false
1498 self.assertEqual(f, unknown)
1499 t = true
1500 t /= unknown
1501 self.assertEqual(t, unknown)
1502 f = false
1503 f /= unknown
1504 self.assertEqual(f, unknown)
1505 u = unknown
1506 u /= true
1507 self.assertEqual(u, unknown)
1508 u = unknown
1509 u /= false
1510 self.assertEqual(u, unknown)
1511 u = unknown
1512 u /= unknown
1513 self.assertEqual(u, unknown)
1514 t = true
1515 t /= True
1516 self.assertEqual(t, 1)
1517 t = true
1518 t /= False
1519 self.assertEqual(t, unknown)
1520 f = false
1521 f /= True
1522 self.assertEqual(f, 0)
1523 f = false
1524 f /= False
1525 self.assertEqual(f, unknown)
1526 t = true
1527 t /= None
1528 self.assertEqual(t, unknown)
1529 f = false
1530 f /= None
1531 self.assertEqual(f, unknown)
1532 u = unknown
1533 u /= True
1534 self.assertEqual(u, unknown)
1535 u = unknown
1536 u /= False
1537 self.assertEqual(u, unknown)
1538 u = unknown
1539 u /= None
1540 self.assertEqual(u, unknown)
1541 t = True
1542 t /= true
1543 self.assertEqual(t, 1)
1544 t = True
1545 t /= false
1546 self.assertEqual(t, unknown)
1547 f = False
1548 f /= true
1549 self.assertEqual(f, 0)
1550 f = False
1551 f /= false
1552 self.assertEqual(f, unknown)
1553 t = True
1554 t /= unknown
1555 self.assertEqual(t, unknown)
1556 f = False
1557 f /= unknown
1558 self.assertEqual(f, unknown)
1559 u = None
1560 u /= true
1561 self.assertEqual(u, unknown)
1562 u = None
1563 u /= false
1564 self.assertEqual(u, unknown)
1565 u = None
1566 u /= unknown
1567 self.assertEqual(u, unknown)
1568
1569
1570 self.assertEqual(true // true, 1)
1571 self.assertEqual(true // false, unknown)
1572 self.assertEqual(false // true, 0)
1573 self.assertEqual(false // false, unknown)
1574 self.assertEqual(true // unknown, unknown)
1575 self.assertEqual(false // unknown, unknown)
1576 self.assertEqual(unknown // true, unknown)
1577 self.assertEqual(unknown // false, unknown)
1578 self.assertEqual(unknown // unknown, unknown)
1579 self.assertEqual(true // True, 1)
1580 self.assertEqual(true // False, unknown)
1581 self.assertEqual(false // True, 0)
1582 self.assertEqual(false // False, unknown)
1583 self.assertEqual(true // None, unknown)
1584 self.assertEqual(false // None, unknown)
1585 self.assertEqual(unknown // True, unknown)
1586 self.assertEqual(unknown // False, unknown)
1587 self.assertEqual(unknown // None, unknown)
1588 self.assertEqual(True // true, 1)
1589 self.assertEqual(True // false, unknown)
1590 self.assertEqual(False // true, 0)
1591 self.assertEqual(False // false, unknown)
1592 self.assertEqual(True // unknown, unknown)
1593 self.assertEqual(False // unknown, unknown)
1594 self.assertEqual(None // true, unknown)
1595 self.assertEqual(None // false, unknown)
1596 self.assertEqual(None // unknown, unknown)
1597
1598 t = true
1599 t //= true
1600 self.assertEqual(t, 1)
1601 t = true
1602 t //= false
1603 self.assertEqual(t, unknown)
1604 f = false
1605 f //= true
1606 self.assertEqual(f, 0)
1607 f = false
1608 f //= false
1609 self.assertEqual(f, unknown)
1610 t = true
1611 t //= unknown
1612 self.assertEqual(t, unknown)
1613 f = false
1614 f //= unknown
1615 self.assertEqual(f, unknown)
1616 u = unknown
1617 u //= true
1618 self.assertEqual(u, unknown)
1619 u = unknown
1620 u //= false
1621 self.assertEqual(u, unknown)
1622 u = unknown
1623 u //= unknown
1624 self.assertEqual(u, unknown)
1625 t = true
1626 t //= True
1627 self.assertEqual(t, 1)
1628 t = true
1629 t //= False
1630 self.assertEqual(t, unknown)
1631 f = false
1632 f //= True
1633 self.assertEqual(f, 0)
1634 f = false
1635 f //= False
1636 self.assertEqual(f, unknown)
1637 t = true
1638 t //= None
1639 self.assertEqual(t, unknown)
1640 f = false
1641 f //= None
1642 self.assertEqual(f, unknown)
1643 u = unknown
1644 u //= True
1645 self.assertEqual(u, unknown)
1646 u = unknown
1647 u //= False
1648 self.assertEqual(u, unknown)
1649 u = unknown
1650 u //= None
1651 self.assertEqual(u, unknown)
1652 t = True
1653 t //= true
1654 self.assertEqual(t, 1)
1655 t = True
1656 t //= false
1657 self.assertEqual(t, unknown)
1658 f = False
1659 f //= true
1660 self.assertEqual(f, 0)
1661 f = False
1662 f //= false
1663 self.assertEqual(f, unknown)
1664 t = True
1665 t //= unknown
1666 self.assertEqual(t, unknown)
1667 f = False
1668 f //= unknown
1669 self.assertEqual(f, unknown)
1670 u = None
1671 u //= true
1672 self.assertEqual(u, unknown)
1673 u = None
1674 u //= false
1675 self.assertEqual(u, unknown)
1676 u = None
1677 u //= unknown
1678 self.assertEqual(u, unknown)
1680 "<< and >>"
1681 true = Logical(True)
1682 false = Logical(False)
1683 unknown = Logical(None)
1684
1685 self.assertEqual(true >> true, 0)
1686 self.assertEqual(true >> false, 1)
1687 self.assertEqual(false >> true, 0)
1688 self.assertEqual(false >> false, 0)
1689 self.assertEqual(true >> unknown, unknown)
1690 self.assertEqual(false >> unknown, unknown)
1691 self.assertEqual(unknown >> true, unknown)
1692 self.assertEqual(unknown >> false, unknown)
1693 self.assertEqual(unknown >> unknown, unknown)
1694 self.assertEqual(true >> True, 0)
1695 self.assertEqual(true >> False, 1)
1696 self.assertEqual(false >> True, 0)
1697 self.assertEqual(false >> False, 0)
1698 self.assertEqual(true >> None, unknown)
1699 self.assertEqual(false >> None, unknown)
1700 self.assertEqual(unknown >> True, unknown)
1701 self.assertEqual(unknown >> False, unknown)
1702 self.assertEqual(unknown >> None, unknown)
1703 self.assertEqual(True >> true, 0)
1704 self.assertEqual(True >> false, 1)
1705 self.assertEqual(False >> true, 0)
1706 self.assertEqual(False >> false, 0)
1707 self.assertEqual(True >> unknown, unknown)
1708 self.assertEqual(False >> unknown, unknown)
1709 self.assertEqual(None >> true, unknown)
1710 self.assertEqual(None >> false, unknown)
1711 self.assertEqual(None >> unknown, unknown)
1712
1713 self.assertEqual(true << true, 2)
1714 self.assertEqual(true << false, 1)
1715 self.assertEqual(false << true, 0)
1716 self.assertEqual(false << false, 0)
1717 self.assertEqual(true << unknown, unknown)
1718 self.assertEqual(false << unknown, unknown)
1719 self.assertEqual(unknown << true, unknown)
1720 self.assertEqual(unknown << false, unknown)
1721 self.assertEqual(unknown << unknown, unknown)
1722 self.assertEqual(true << True, 2)
1723 self.assertEqual(true << False, 1)
1724 self.assertEqual(false << True, 0)
1725 self.assertEqual(false << False, 0)
1726 self.assertEqual(true << None, unknown)
1727 self.assertEqual(false << None, unknown)
1728 self.assertEqual(unknown << True, unknown)
1729 self.assertEqual(unknown << False, unknown)
1730 self.assertEqual(unknown << None, unknown)
1731 self.assertEqual(True << true, 2)
1732 self.assertEqual(True << false, 1)
1733 self.assertEqual(False << true, 0)
1734 self.assertEqual(False << false, 0)
1735 self.assertEqual(True << unknown, unknown)
1736 self.assertEqual(False << unknown, unknown)
1737 self.assertEqual(None << true, unknown)
1738 self.assertEqual(None << false, unknown)
1739 self.assertEqual(None << unknown, unknown)
1740
1741 t = true
1742 t >>= true
1743 self.assertEqual(t, 0)
1744 t = true
1745 t >>= false
1746 self.assertEqual(t, 1)
1747 f = false
1748 f >>= true
1749 self.assertEqual(f, 0)
1750 f = false
1751 f >>= false
1752 self.assertEqual(f, 0)
1753 t = true
1754 t >>= unknown
1755 self.assertEqual(t, unknown)
1756 f = false
1757 f >>= unknown
1758 self.assertEqual(f, unknown)
1759 u = unknown
1760 u >>= true
1761 self.assertEqual(u, unknown)
1762 u = unknown
1763 u >>= false
1764 self.assertEqual(u, unknown)
1765 u = unknown
1766 u >>= unknown
1767 self.assertEqual(u, unknown)
1768 t = true
1769 t >>= True
1770 self.assertEqual(t, 0)
1771 t = true
1772 t >>= False
1773 self.assertEqual(t, 1)
1774 f = false
1775 f >>= True
1776 self.assertEqual(f, 0)
1777 f = false
1778 f >>= False
1779 self.assertEqual(f, 0)
1780 t = true
1781 t >>= None
1782 self.assertEqual(t, unknown)
1783 f = false
1784 f >>= None
1785 self.assertEqual(f, unknown)
1786 u = unknown
1787 u >>= True
1788 self.assertEqual(u, unknown)
1789 u = unknown
1790 u >>= False
1791 self.assertEqual(u, unknown)
1792 u = unknown
1793 u >>= None
1794 self.assertEqual(u, unknown)
1795 t = True
1796 t >>= true
1797 self.assertEqual(t, 0)
1798 t = True
1799 t >>= false
1800 self.assertEqual(t, 1)
1801 f = False
1802 f >>= true
1803 self.assertEqual(f, 0)
1804 f = False
1805 f >>= false
1806 self.assertEqual(f, 0)
1807 t = True
1808 t >>= unknown
1809 self.assertEqual(t, unknown)
1810 f = False
1811 f >>= unknown
1812 self.assertEqual(f, unknown)
1813 u = None
1814 u >>= true
1815 self.assertEqual(u, unknown)
1816 u = None
1817 u >>= false
1818 self.assertEqual(u, unknown)
1819 u = None
1820 u >>= unknown
1821 self.assertEqual(u, unknown)
1822
1823 t = true
1824 t <<= true
1825 self.assertEqual(t, 2)
1826 t = true
1827 t <<= false
1828 self.assertEqual(t, 1)
1829 f = false
1830 f <<= true
1831 self.assertEqual(f, 0)
1832 f = false
1833 f <<= false
1834 self.assertEqual(f, 0)
1835 t = true
1836 t <<= unknown
1837 self.assertEqual(t, unknown)
1838 f = false
1839 f <<= unknown
1840 self.assertEqual(f, unknown)
1841 u = unknown
1842 u <<= true
1843 self.assertEqual(u, unknown)
1844 u = unknown
1845 u <<= false
1846 self.assertEqual(u, unknown)
1847 u = unknown
1848 u <<= unknown
1849 self.assertEqual(u, unknown)
1850 t = true
1851 t <<= True
1852 self.assertEqual(t, 2)
1853 t = true
1854 t <<= False
1855 self.assertEqual(t, 1)
1856 f = false
1857 f <<= True
1858 self.assertEqual(f, 0)
1859 f = false
1860 f <<= False
1861 self.assertEqual(f, 0)
1862 t = true
1863 t <<= None
1864 self.assertEqual(t, unknown)
1865 f = false
1866 f <<= None
1867 self.assertEqual(f, unknown)
1868 u = unknown
1869 u <<= True
1870 self.assertEqual(u, unknown)
1871 u = unknown
1872 u <<= False
1873 self.assertEqual(u, unknown)
1874 u = unknown
1875 u <<= None
1876 self.assertEqual(u, unknown)
1877 t = True
1878 t <<= true
1879 self.assertEqual(t, 2)
1880 t = True
1881 t <<= false
1882 self.assertEqual(t, 1)
1883 f = False
1884 f <<= true
1885 self.assertEqual(f, 0)
1886 f = False
1887 f <<= false
1888 self.assertEqual(f, 0)
1889 t = True
1890 t <<= unknown
1891 self.assertEqual(t, unknown)
1892 f = False
1893 f <<= unknown
1894 self.assertEqual(f, unknown)
1895 u = None
1896 u <<= true
1897 self.assertEqual(u, unknown)
1898 u = None
1899 u <<= false
1900 self.assertEqual(u, unknown)
1901 u = None
1902 u <<= unknown
1903 self.assertEqual(u, unknown)
1904
1906 "**"
1907 true = Logical(True)
1908 false = Logical(False)
1909 unknown = Logical(None)
1910
1911 self.assertEqual(true ** true, 1)
1912 self.assertEqual(true ** false, 1)
1913 self.assertEqual(false ** true, 0)
1914 self.assertEqual(false ** false, 1)
1915 self.assertEqual(true ** unknown, unknown)
1916 self.assertEqual(false ** unknown, unknown)
1917 self.assertEqual(unknown ** true, unknown)
1918 self.assertEqual(unknown ** false, 1)
1919 self.assertEqual(unknown ** unknown, unknown)
1920 self.assertEqual(true ** True, 1)
1921 self.assertEqual(true ** False, 1)
1922 self.assertEqual(false ** True, 0)
1923 self.assertEqual(false ** False, 1)
1924 self.assertEqual(true ** None, unknown)
1925 self.assertEqual(false ** None, unknown)
1926 self.assertEqual(unknown ** True, unknown)
1927 self.assertEqual(unknown ** False, 1)
1928 self.assertEqual(unknown ** None, unknown)
1929 self.assertEqual(True ** true, 1)
1930 self.assertEqual(True ** false, 1)
1931 self.assertEqual(False ** true, 0)
1932 self.assertEqual(False ** false, 1)
1933 self.assertEqual(True ** unknown, unknown)
1934 self.assertEqual(False ** unknown, unknown)
1935 self.assertEqual(None ** true, unknown)
1936 self.assertEqual(None ** false, 1)
1937 self.assertEqual(None ** unknown, unknown)
1938
1939 t = true
1940 t **= true
1941 self.assertEqual(t, 1)
1942 t = true
1943 t **= false
1944 self.assertEqual(t, 1)
1945 f = false
1946 f **= true
1947 self.assertEqual(f, 0)
1948 f = false
1949 f **= false
1950 self.assertEqual(f, 1)
1951 t = true
1952 t **= unknown
1953 self.assertEqual(t, unknown)
1954 f = false
1955 f **= unknown
1956 self.assertEqual(f, unknown)
1957 u = unknown
1958 u **= true
1959 self.assertEqual(u, unknown)
1960 u = unknown
1961 u **= false
1962 self.assertEqual(u, 1)
1963 u = unknown
1964 u **= unknown
1965 self.assertEqual(u, unknown)
1966 t = true
1967 t **= True
1968 self.assertEqual(t, 1)
1969 t = true
1970 t **= False
1971 self.assertEqual(t, 1)
1972 f = false
1973 f **= True
1974 self.assertEqual(f, 0)
1975 f = false
1976 f **= False
1977 self.assertEqual(f, 1)
1978 t = true
1979 t **= None
1980 self.assertEqual(t, unknown)
1981 f = false
1982 f **= None
1983 self.assertEqual(f, unknown)
1984 u = unknown
1985 u **= True
1986 self.assertEqual(u, unknown)
1987 u = unknown
1988 u **= False
1989 self.assertEqual(u, 1)
1990 u = unknown
1991 u **= None
1992 self.assertEqual(u, unknown)
1993 t = True
1994 t **= true
1995 self.assertEqual(t, 1)
1996 t = True
1997 t **= false
1998 self.assertEqual(t, 1)
1999 f = False
2000 f **= true
2001 self.assertEqual(f, 0)
2002 f = False
2003 f **= false
2004 self.assertEqual(f, 1)
2005 t = True
2006 t **= unknown
2007 self.assertEqual(t, unknown)
2008 f = False
2009 f **= unknown
2010 self.assertEqual(f, unknown)
2011 u = None
2012 u **= true
2013 self.assertEqual(u, unknown)
2014 u = None
2015 u **= false
2016 self.assertEqual(u, 1)
2017 u = None
2018 u **= unknown
2019 self.assertEqual(u, unknown)
2020
2022 "%"
2023 true = Logical(True)
2024 false = Logical(False)
2025 unknown = Logical(None)
2026
2027 self.assertEqual(true % true, 0)
2028 self.assertEqual(true % false, unknown)
2029 self.assertEqual(false % true, 0)
2030 self.assertEqual(false % false, unknown)
2031 self.assertEqual(true % unknown, unknown)
2032 self.assertEqual(false % unknown, unknown)
2033 self.assertEqual(unknown % true, unknown)
2034 self.assertEqual(unknown % false, unknown)
2035 self.assertEqual(unknown % unknown, unknown)
2036 self.assertEqual(true % True, 0)
2037 self.assertEqual(true % False, unknown)
2038 self.assertEqual(false % True, 0)
2039 self.assertEqual(false % False, unknown)
2040 self.assertEqual(true % None, unknown)
2041 self.assertEqual(false % None, unknown)
2042 self.assertEqual(unknown % True, unknown)
2043 self.assertEqual(unknown % False, unknown)
2044 self.assertEqual(unknown % None, unknown)
2045 self.assertEqual(True % true, 0)
2046 self.assertEqual(True % false, unknown)
2047 self.assertEqual(False % true, 0)
2048 self.assertEqual(False % false, unknown)
2049 self.assertEqual(True % unknown, unknown)
2050 self.assertEqual(False % unknown, unknown)
2051 self.assertEqual(None % true, unknown)
2052 self.assertEqual(None % false, unknown)
2053 self.assertEqual(None % unknown, unknown)
2054
2055 t = true
2056 t %= true
2057 self.assertEqual(t, 0)
2058 t = true
2059 t %= false
2060 self.assertEqual(t, unknown)
2061 f = false
2062 f %= true
2063 self.assertEqual(f, 0)
2064 f = false
2065 f %= false
2066 self.assertEqual(f, unknown)
2067 t = true
2068 t %= unknown
2069 self.assertEqual(t, unknown)
2070 f = false
2071 f %= unknown
2072 self.assertEqual(f, unknown)
2073 u = unknown
2074 u %= true
2075 self.assertEqual(u, unknown)
2076 u = unknown
2077 u %= false
2078 self.assertEqual(u, unknown)
2079 u = unknown
2080 u %= unknown
2081 self.assertEqual(u, unknown)
2082 t = true
2083 t %= True
2084 self.assertEqual(t, 0)
2085 t = true
2086 t %= False
2087 self.assertEqual(t, unknown)
2088 f = false
2089 f %= True
2090 self.assertEqual(f, 0)
2091 f = false
2092 f %= False
2093 self.assertEqual(f, unknown)
2094 t = true
2095 t %= None
2096 self.assertEqual(t, unknown)
2097 f = false
2098 f %= None
2099 self.assertEqual(f, unknown)
2100 u = unknown
2101 u %= True
2102 self.assertEqual(u, unknown)
2103 u = unknown
2104 u %= False
2105 self.assertEqual(u, unknown)
2106 u = unknown
2107 u %= None
2108 self.assertEqual(u, unknown)
2109 t = True
2110 t %= true
2111 self.assertEqual(t, 0)
2112 t = True
2113 t %= false
2114 self.assertEqual(t, unknown)
2115 f = False
2116 f %= true
2117 self.assertEqual(f, 0)
2118 f = False
2119 f %= false
2120 self.assertEqual(f, unknown)
2121 t = True
2122 t %= unknown
2123 self.assertEqual(t, unknown)
2124 f = False
2125 f %= unknown
2126 self.assertEqual(f, unknown)
2127 u = None
2128 u %= true
2129 self.assertEqual(u, unknown)
2130 u = None
2131 u %= false
2132 self.assertEqual(u, unknown)
2133 u = None
2134 u %= unknown
2135 self.assertEqual(u, unknown)
2136
2138 "divmod()"
2139 true = Logical(True)
2140 false = Logical(False)
2141 unknown = Logical(None)
2142
2143 self.assertEqual(divmod(true, true), (1, 0))
2144 self.assertEqual(divmod(true, false), (unknown, unknown))
2145 self.assertEqual(divmod(false, true), (0, 0))
2146 self.assertEqual(divmod(false, false), (unknown, unknown))
2147 self.assertEqual(divmod(true, unknown), (unknown, unknown))
2148 self.assertEqual(divmod(false, unknown), (unknown, unknown))
2149 self.assertEqual(divmod(unknown, true), (unknown, unknown))
2150 self.assertEqual(divmod(unknown, false), (unknown, unknown))
2151 self.assertEqual(divmod(unknown, unknown), (unknown, unknown))
2152 self.assertEqual(divmod(true, True), (1, 0))
2153 self.assertEqual(divmod(true, False), (unknown, unknown))
2154 self.assertEqual(divmod(false, True), (0, 0))
2155 self.assertEqual(divmod(false, False), (unknown, unknown))
2156 self.assertEqual(divmod(true, None), (unknown, unknown))
2157 self.assertEqual(divmod(false, None), (unknown, unknown))
2158 self.assertEqual(divmod(unknown, True), (unknown, unknown))
2159 self.assertEqual(divmod(unknown, False), (unknown, unknown))
2160 self.assertEqual(divmod(unknown, None), (unknown, unknown))
2161 self.assertEqual(divmod(True, true), (1, 0))
2162 self.assertEqual(divmod(True, false), (unknown, unknown))
2163 self.assertEqual(divmod(False, true), (0, 0))
2164 self.assertEqual(divmod(False, false), (unknown, unknown))
2165 self.assertEqual(divmod(True, unknown), (unknown, unknown))
2166 self.assertEqual(divmod(False, unknown), (unknown, unknown))
2167 self.assertEqual(divmod(None, true), (unknown, unknown))
2168 self.assertEqual(divmod(None, false), (unknown, unknown))
2169 self.assertEqual(divmod(None, unknown), (unknown, unknown))
2170
2172 "Testing Quantum"
2174 "errors"
2175 self.assertRaises(ValueError, Quantum, 'wrong')
2176 if py_ver >= (2, 5):
2177 self.assertRaises(TypeError, lambda : (0, 1, 2)[On])
2178 self.assertRaises(TypeError, lambda : (0, 1, 2)[Off])
2179 self.assertRaises(TypeError, lambda : (0, 1, 2)[Other])
2180
2182 "Other"
2183 huh = unknown = Quantum('')
2184 self.assertEqual(huh is dbf.Other, True)
2185 self.assertEqual((huh != huh) is unknown, True)
2186 self.assertEqual((huh != True) is unknown, True)
2187 self.assertEqual((huh != False) is unknown, True)
2188
2189 huh = Quantum('?')
2190 self.assertEqual(huh is dbf.Other, True)
2191 self.assertEqual((huh != huh) is unknown, True)
2192 self.assertEqual((huh != True) is unknown, True)
2193 self.assertEqual((huh != False) is unknown, True)
2194
2195 huh = Quantum(' ')
2196 self.assertEqual(huh is dbf.Other, True)
2197 self.assertEqual((huh != huh) is unknown, True)
2198 self.assertEqual((huh != True) is unknown, True)
2199 self.assertEqual((huh != False) is unknown, True)
2200
2201 huh = Quantum(None)
2202 self.assertEqual(huh is dbf.Other, True)
2203 self.assertEqual((huh != huh) is unknown, True)
2204 self.assertEqual((huh != True) is unknown, True)
2205 self.assertEqual((huh != False) is unknown, True)
2206
2207 huh = Quantum(Null())
2208 self.assertEqual(huh is dbf.Other, True)
2209 self.assertEqual((huh != huh) is unknown, True)
2210 self.assertEqual((huh != True) is unknown, True)
2211 self.assertEqual((huh != False) is unknown, True)
2212
2213 huh = Quantum(Other)
2214 self.assertEqual(huh is dbf.Other, True)
2215 self.assertEqual((huh != huh) is unknown, True)
2216 self.assertEqual((huh != True) is unknown, True)
2217 self.assertEqual((huh != False) is unknown, True)
2218
2219 huh = Quantum(Unknown)
2220 self.assertEqual(huh is dbf.Other, True)
2221 self.assertEqual((huh != huh) is unknown, True)
2222 self.assertEqual((huh != True) is unknown, True)
2223 self.assertEqual((huh != False) is unknown, True)
2224
2226 "true"
2227 huh = Quantum('True')
2228 unknown = Quantum('?')
2229 self.assertEqual(huh, True)
2230 self.assertNotEqual(huh, False)
2231 self.assertEqual((huh != None) is unknown, True)
2232
2233 huh = Quantum('yes')
2234 unknown = Quantum('?')
2235 self.assertEqual(huh, True)
2236 self.assertNotEqual(huh, False)
2237 self.assertEqual((huh != None) is unknown, True)
2238
2239 huh = Quantum('t')
2240 unknown = Quantum('?')
2241 self.assertEqual(huh, True)
2242 self.assertNotEqual(huh, False)
2243 self.assertEqual((huh != None) is unknown, True)
2244
2245 huh = Quantum('Y')
2246 unknown = Quantum('?')
2247 self.assertEqual(huh, True)
2248 self.assertNotEqual(huh, False)
2249 self.assertEqual((huh != None) is unknown, True)
2250
2251 huh = Quantum(7)
2252 unknown = Quantum('?')
2253 self.assertEqual(huh, True)
2254 self.assertNotEqual(huh, False)
2255 self.assertEqual((huh != None) is unknown, True)
2256
2257 huh = Quantum(['blah'])
2258 unknown = Quantum('?')
2259 self.assertEqual(huh, True)
2260 self.assertNotEqual(huh, False)
2261 self.assertEqual((huh != None) is unknown, True)
2262
2264 "false"
2265 huh = Quantum('false')
2266 unknown = Quantum('?')
2267 self.assertEqual(huh, False)
2268 self.assertNotEqual(huh, True)
2269 self.assertEqual((huh != None) is unknown, True)
2270
2271 huh = Quantum('No')
2272 unknown = Quantum('?')
2273 self.assertEqual(huh, False)
2274 self.assertNotEqual(huh, True)
2275 self.assertEqual((huh != None) is unknown, True)
2276
2277 huh = Quantum('F')
2278 unknown = Quantum('?')
2279 self.assertEqual(huh, False)
2280 self.assertNotEqual(huh, True)
2281 self.assertEqual((huh != None) is unknown, True)
2282
2283 huh = Quantum('n')
2284 unknown = Quantum('?')
2285 self.assertEqual(huh, False)
2286 self.assertNotEqual(huh, True)
2287 self.assertEqual((huh != None) is unknown, True)
2288
2289 huh = Quantum(0)
2290 unknown = Quantum('?')
2291 self.assertEqual(huh, False)
2292 self.assertNotEqual(huh, True)
2293 self.assertEqual((huh != None) is unknown, True)
2294
2295 huh = Quantum([])
2296 unknown = Quantum('?')
2297 self.assertEqual(huh, False)
2298 self.assertNotEqual(huh, True)
2299 self.assertEqual((huh != None) is unknown, True)
2300
2302 "singletons"
2303 heh = Quantum(True)
2304 hah = Quantum('Yes')
2305 ick = Quantum(False)
2306 ack = Quantum([])
2307 unk = Quantum('?')
2308 bla = Quantum(None)
2309 self.assertEqual(heh is hah, True)
2310 self.assertEqual(ick is ack, True)
2311 self.assertEqual(unk is bla, True)
2312
2314 "or"
2315 true = Quantum(True)
2316 false = Quantum(False)
2317 unknown = Quantum(None)
2318 self.assertEqual(true + true, true)
2319 self.assertEqual(true + false, true)
2320 self.assertEqual(false + true, true)
2321 self.assertEqual(false + false, false)
2322 self.assertEqual(true + unknown, true)
2323 self.assertEqual(false + unknown is unknown, True)
2324 self.assertEqual(unknown + unknown is unknown, True)
2325 self.assertEqual(true | true, true)
2326 self.assertEqual(true | false, true)
2327 self.assertEqual(false | true, true)
2328 self.assertEqual(false | false, false)
2329 self.assertEqual(true | unknown, true)
2330 self.assertEqual(false | unknown is unknown, True)
2331 self.assertEqual(unknown | unknown is unknown, True)
2332 self.assertEqual(true + True, true)
2333 self.assertEqual(true + False, true)
2334 self.assertEqual(false + True, true)
2335 self.assertEqual(false + False, false)
2336 self.assertEqual(true + None, true)
2337 self.assertEqual(false + None is unknown, True)
2338 self.assertEqual(unknown + None is unknown, True)
2339 self.assertEqual(true | True, true)
2340 self.assertEqual(true | False, true)
2341 self.assertEqual(false | True, true)
2342 self.assertEqual(false | False, false)
2343 self.assertEqual(true | None, true)
2344 self.assertEqual(false | None is unknown, True)
2345 self.assertEqual(unknown | None is unknown, True)
2346 self.assertEqual(True + true, true)
2347 self.assertEqual(True + false, true)
2348 self.assertEqual(False + true, true)
2349 self.assertEqual(False + false, false)
2350 self.assertEqual(True + unknown, true)
2351 self.assertEqual(False + unknown is unknown, True)
2352 self.assertEqual(None + unknown is unknown, True)
2353 self.assertEqual(True | true, true)
2354 self.assertEqual(True | false, true)
2355 self.assertEqual(False | true, true)
2356 self.assertEqual(False | false, false)
2357 self.assertEqual(True | unknown, true)
2358 self.assertEqual(False | unknown is unknown, True)
2359 self.assertEqual(None | unknown is unknown, True)
2361 "and"
2362 true = Quantum(True)
2363 false = Quantum(False)
2364 unknown = Quantum(None)
2365 self.assertEqual(true * true, true)
2366 self.assertEqual(true * false, false)
2367 self.assertEqual(false * true, false)
2368 self.assertEqual(false * false, false)
2369 self.assertEqual(true * unknown is unknown, True)
2370 self.assertEqual(false * unknown, false)
2371 self.assertEqual(unknown * unknown is unknown, True)
2372 self.assertEqual(true & true, true)
2373 self.assertEqual(true & false, false)
2374 self.assertEqual(false & true, false)
2375 self.assertEqual(false & false, false)
2376 self.assertEqual(true & unknown is unknown, True)
2377 self.assertEqual(false & unknown, false)
2378 self.assertEqual(unknown & unknown is unknown, True)
2379 self.assertEqual(true * True, true)
2380 self.assertEqual(true * False, false)
2381 self.assertEqual(false * True, false)
2382 self.assertEqual(false * False, false)
2383 self.assertEqual(true * None is unknown, True)
2384 self.assertEqual(false * None, false)
2385 self.assertEqual(unknown * None is unknown, True)
2386 self.assertEqual(true & True, true)
2387 self.assertEqual(true & False, false)
2388 self.assertEqual(false & True, false)
2389 self.assertEqual(false & False, false)
2390 self.assertEqual(true & None is unknown, True)
2391 self.assertEqual(false & None, false)
2392 self.assertEqual(unknown & None is unknown, True)
2393 self.assertEqual(True * true, true)
2394 self.assertEqual(True * false, false)
2395 self.assertEqual(False * true, false)
2396 self.assertEqual(False * false, false)
2397 self.assertEqual(True * unknown is unknown, True)
2398 self.assertEqual(False * unknown, false)
2399 self.assertEqual(None * unknown is unknown, True)
2400 self.assertEqual(True & true, true)
2401 self.assertEqual(True & false, false)
2402 self.assertEqual(False & true, false)
2403 self.assertEqual(False & false, false)
2404 self.assertEqual(True & unknown is unknown, True)
2405 self.assertEqual(False & unknown, false)
2406 self.assertEqual(None & unknown is unknown, True)
2408 "xor"
2409 true = Quantum(True)
2410 false = Quantum(False)
2411 unknown = Quantum(None)
2412 self.assertEqual(true ^ true, false)
2413 self.assertEqual(true ^ false, true)
2414 self.assertEqual(false ^ true, true)
2415 self.assertEqual(false ^ false, false)
2416 self.assertEqual(true ^ unknown is unknown, True)
2417 self.assertEqual(false ^ unknown is unknown, True)
2418 self.assertEqual(unknown ^ unknown is unknown, True)
2419 self.assertEqual(true ^ True, false)
2420 self.assertEqual(true ^ False, true)
2421 self.assertEqual(false ^ True, true)
2422 self.assertEqual(false ^ False, false)
2423 self.assertEqual(true ^ None is unknown, True)
2424 self.assertEqual(false ^ None is unknown, True)
2425 self.assertEqual(unknown ^ None is unknown, True)
2426 self.assertEqual(True ^ true, false)
2427 self.assertEqual(True ^ false, true)
2428 self.assertEqual(False ^ true, true)
2429 self.assertEqual(False ^ false, false)
2430 self.assertEqual(True ^ unknown is unknown, True)
2431 self.assertEqual(False ^ unknown is unknown, True)
2432 self.assertEqual(None ^ unknown is unknown, True)
2434 "implication, material"
2435 true = Quantum(True)
2436 false = Quantum(False)
2437 unknown = Quantum(None)
2438 self.assertEqual(true >> true, true)
2439 self.assertEqual(true >> false, false)
2440 self.assertEqual(false >> true, true)
2441 self.assertEqual(false >> false, true)
2442 self.assertEqual(true >> unknown is unknown, True)
2443 self.assertEqual(false >> unknown, true)
2444 self.assertEqual(unknown >> unknown is unknown, True)
2445 self.assertEqual(true >> True, true)
2446 self.assertEqual(true >> False, false)
2447 self.assertEqual(false >> True, true)
2448 self.assertEqual(false >> False, true)
2449 self.assertEqual(true >> None is unknown, True)
2450 self.assertEqual(false >> None, true)
2451 self.assertEqual(unknown >> None is unknown, True)
2452 self.assertEqual(True >> true, true)
2453 self.assertEqual(True >> false, false)
2454 self.assertEqual(False >> true, true)
2455 self.assertEqual(False >> false, true)
2456 self.assertEqual(True >> unknown is unknown, True)
2457 self.assertEqual(False >> unknown, true)
2458 self.assertEqual(None >> unknown is unknown, True)
2460 "implication, relevant"
2461 true = Quantum(True)
2462 false = Quantum(False)
2463 unknown = Quantum(None)
2464 Quantum.set_implication('relevant')
2465 self.assertEqual(true >> true, true)
2466 self.assertEqual(true >> false, false)
2467 self.assertEqual(false >> true is unknown, True)
2468 self.assertEqual(false >> false is unknown, True)
2469 self.assertEqual(true >> unknown is unknown, True)
2470 self.assertEqual(false >> unknown is unknown, True)
2471 self.assertEqual(unknown >> unknown is unknown, True)
2472 self.assertEqual(true >> True, true)
2473 self.assertEqual(true >> False, false)
2474 self.assertEqual(false >> True is unknown, True)
2475 self.assertEqual(false >> False is unknown, True)
2476 self.assertEqual(true >> None is unknown, True)
2477 self.assertEqual(false >> None is unknown, True)
2478 self.assertEqual(unknown >> None is unknown, True)
2479 self.assertEqual(True >> true, true)
2480 self.assertEqual(True >> false, false)
2481 self.assertEqual(False >> true is unknown, True)
2482 self.assertEqual(False >> false is unknown, True)
2483 self.assertEqual(True >> unknown is unknown, True)
2484 self.assertEqual(False >> unknown is unknown, True)
2485 self.assertEqual(None >> unknown is unknown, True)
2487 "negative and"
2488 true = Quantum(True)
2489 false = Quantum(False)
2490 unknown = Quantum(None)
2491 self.assertEqual(true.D(true), false)
2492 self.assertEqual(true.D(false), true)
2493 self.assertEqual(false.D(true), true)
2494 self.assertEqual(false.D(false), true)
2495 self.assertEqual(true.D(unknown) is unknown, True)
2496 self.assertEqual(false.D(unknown), true)
2497 self.assertEqual(unknown.D(unknown) is unknown, True)
2498 self.assertEqual(true.D(True), false)
2499 self.assertEqual(true.D(False), true)
2500 self.assertEqual(false.D(True), true)
2501 self.assertEqual(false.D(False), true)
2502 self.assertEqual(true.D(None) is unknown, True)
2503 self.assertEqual(false.D(None), true)
2504 self.assertEqual(unknown.D(None) is unknown, True)
2513
2516 self.tempdir = tempfile.mkdtemp()
2517
2519 shutil.rmtree(self.tempdir, True)
2520
2522 self.assertRaises(FieldSpecError, Table, 'blah', 'age N(3,2)', on_disk=False)
2523 self.assertRaises(FieldSpecError, Table, 'blah', 'name C(300)', on_disk=False)
2524 self.assertRaises(FieldSpecError, Table, 'blah', 'born L(9)', on_disk=False)
2525 self.assertRaises(FieldSpecError, Table, 'blah', 'married D(12)', on_disk=False)
2526 self.assertRaises(FieldSpecError, Table, 'blah', 'desc M(1)', on_disk=False)
2527
2535
2543
2545 fields = []
2546 for i in range(254):
2547 fields.append('a%03d C(10) null' % i)
2548 table = Table(':test:', ';'.join(fields), dbf_type='vfp', on_disk=False)
2549 table.open()
2550 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)')
2551 fields = []
2552 for i in range(254):
2553 fields.append('a%03d C(10) NULL' % i)
2554 table = Table(':test:', ';'.join(fields), dbf_type='vfp', on_disk=False)
2555 table.open()
2556 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)')
2557
2559 "skipped -- test takes waaaaaaay too long"
2560
2568
2570 table = Table(':blah:', 'name C(50)', on_disk=False)
2571 self.assertRaises(DbfError, table.add_fields, 'name C(10)')
2572
2576
2578 table = Table(':ummm:', 'name C(3); age N(3,0)', on_disk=False)
2579 table.open()
2580 for person in (('me', 25), ('you', 35), ('her', 29)):
2581 table.append(person)
2582 record = table[1]
2583 dbf.delete(record)
2584 table.pack()
2585 self.assertEqual(('you', 35), record)
2586 self.assertRaises(DbfError, dbf.write, record, **{'age':33})
2592 table = Table(os.path.join(self.tempdir, 'temptable'), 'name C(377); thesis C(20179)', dbf_type='clp')
2593 self.assertRaises(BadDataError, Table, os.path.join(self.tempdir, 'temptable'))
2594
2602
2605 self.tempdir = tempfile.mkdtemp()
2606
2608 shutil.rmtree(self.tempdir, True)
2609
2610 "Testing table creation..."
2612 "dbf tables in memory"
2613 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 'weight F(7,3)']
2614 for i in range(1, len(fields)+1):
2615 for fieldlist in combinate(fields, i):
2616 table = Table(':memory:', fieldlist, dbf_type='db3', on_disk=False)
2617 actualFields = table.structure()
2618 self.assertEqual(fieldlist, actualFields)
2619 self.assertTrue(all([type(x) is unicode for x in table.field_names]))
2621 "dbf table on disk"
2622 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 'weight F(7,3)']
2623 for i in range(1, len(fields)+1):
2624 for fieldlist in combinate(fields, i):
2625 table = Table(os.path.join(self.tempdir, 'temptable'), ';'.join(fieldlist), dbf_type='db3')
2626 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3')
2627 actualFields = table.structure()
2628 self.assertEqual(fieldlist, actualFields)
2629 table = open(table.filename, 'rb')
2630 try:
2631 last_byte = table.read()[-1]
2632 finally:
2633 table.close()
2634 self.assertEqual(last_byte, EOF)
2636 "clp tables in memory"
2637 fields = ['name C(10977)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 'weight F(7,3)']
2638 for i in range(1, len(fields)+1):
2639 for fieldlist in combinate(fields, i):
2640 table = Table(':memory:', fieldlist, dbf_type='clp', on_disk=False)
2641 actualFields = table.structure()
2642 self.assertEqual(fieldlist, actualFields)
2643 self.assertTrue(all([type(x) is unicode for x in table.field_names]))
2645 "clp table on disk"
2646 table = Table(os.path.join(self.tempdir, 'temptable'), 'name C(377); thesis C(20179)', dbf_type='clp')
2647 self.assertEqual(table.record_length, 20557)
2648 fields = ['name C(10977)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 'weight F(7,3)']
2649 for i in range(1, len(fields)+1):
2650 for fieldlist in combinate(fields, i):
2651 table = Table(os.path.join(self.tempdir, 'temptable'), ';'.join(fieldlist), dbf_type='clp')
2652 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='clp')
2653 actualFields = table.structure()
2654 self.assertEqual(fieldlist, actualFields)
2655 table = open(table.filename, 'rb')
2656 try:
2657 last_byte = table.read()[-1]
2658 finally:
2659 table.close()
2660 self.assertEqual(last_byte, EOF)
2662 "fp tables in memory"
2663 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)',
2664 'litres F(11,5)', 'blob G', 'graphic P', 'weight F(7,3)']
2665 for i in range(1, len(fields)+1):
2666 for fieldlist in combinate(fields, i):
2667 table = Table(':memory:', ';'.join(fieldlist), dbf_type='vfp', on_disk=False)
2668 actualFields = table.structure()
2669 self.assertEqual(fieldlist, actualFields)
2671 "fp tables on disk"
2672 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)',
2673 'litres F(11,5)', 'blob G', 'graphic P', 'weight F(7,3)']
2674 for i in range(1, len(fields)+1):
2675 for fieldlist in combinate(fields, i):
2676 table = Table(os.path.join(self.tempdir, 'tempfp'), ';'.join(fieldlist), dbf_type='vfp')
2677 table = Table(os.path.join(self.tempdir, 'tempfp'), dbf_type='vfp')
2678 actualFields = table.structure()
2679 self.assertEqual(fieldlist, actualFields)
2681 "vfp tables in memory"
2682 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)',
2683 'mass B', 'litres F(11,5)', 'int I', 'birth T', 'blob G', 'graphic P',
2684 'menu C(50) binary', 'graduated L null', 'fired D null', 'cipher C(50) nocptrans null',
2685 'weight F(7,3)']
2686 for i in range(1, len(fields)+1):
2687 for fieldlist in combinate(fields, i):
2688 table = Table(':memory:', ';'.join(fieldlist), dbf_type='vfp', on_disk=False)
2689 actualFields = table.structure()
2690 fieldlist = [f.replace('nocptrans','binary') for f in fieldlist]
2691 self.assertEqual(fieldlist, actualFields)
2693 "vfp tables on disk"
2694 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)',
2695 'mass B', 'litres F(11,5)', 'int I', 'birth T', 'blob G', 'graphic P',
2696 'menu C(50) binary', 'graduated L null', 'fired D null', 'cipher C(50) nocptrans null',
2697 'weight F(7,3)']
2698 for i in range(1, len(fields)+1):
2699 for fieldlist in combinate(fields, i):
2700 table = Table(os.path.join(self.tempdir, 'tempvfp'), ';'.join(fieldlist), dbf_type='vfp')
2701 table = Table(os.path.join(self.tempdir, 'tempvfp'), dbf_type='vfp')
2702 actualFields = table.structure()
2703 fieldlist = [f.replace('nocptrans','binary') for f in fieldlist]
2704 self.assertEqual(fieldlist, actualFields)
2705 - def test_codepage(self):
2706 table = Table(os.path.join(self.tempdir, 'tempvfp'), 'name C(25); male L; fired D null', dbf_type='vfp')
2707 self.assertEqual(dbf.default_codepage, 'ascii')
2708 self.assertEqual(table.codepage, dbf.CodePage('ascii'))
2709 table.close()
2710 table.open()
2711 table.close()
2712 table = Table(os.path.join(self.tempdir, 'tempvfp'), 'name C(25); male L; fired D null', dbf_type='vfp', codepage='cp850')
2713 self.assertEqual(table.codepage, dbf.CodePage('cp850'))
2714
2715 newtable = table.new('tempvfp2', codepage='cp437')
2716 self.assertEqual(newtable.codepage, dbf.CodePage('cp437'))
2717 newtable.open()
2718 newtable.create_backup()
2719 newtable.close()
2720 bckup = Table(os.path.join(self.tempdir, newtable.backup))
2721 self.assertEqual(bckup.codepage, newtable.codepage)
2723 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='db3').open()
2724 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!'))
2725 table.close()
2726 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='db3', ignore_memos=True)
2727 table.open()
2728 try:
2729 self.assertEqual(table[0].wisdom, '')
2730 finally:
2731 table.close()
2733 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='fp').open()
2734 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!'))
2735 table.close()
2736 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='fp', ignore_memos=True)
2737 table.open()
2738 try:
2739 self.assertEqual(table[0].wisdom, '')
2740 finally:
2741 table.close()
2743 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='vfp').open()
2744 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!'))
2745 table.close()
2746 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='vfp', ignore_memos=True)
2747 table.open()
2748 try:
2749 self.assertEqual(table[0].wisdom, '')
2750 finally:
2751 table.close()
2753 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='clp').open()
2754 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!'))
2755 table.close()
2756 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='clp', ignore_memos=True)
2757 table.open()
2758 try:
2759 self.assertEqual(table[0].wisdom, '')
2760 finally:
2761 table.close()
2762
2764 "Testing records"
2765
2767 self.tempdir = tempfile.mkdtemp()
2768 self.dbf_table = Table(
2769 os.path.join(self.tempdir, 'dbf_table'),
2770 'name C(25); paid L; qty N(11,5); orderdate D; desc M',
2771 dbf_type='db3',
2772 )
2773 self.vfp_table = Table(
2774 os.path.join(self.tempdir, 'vfp_table'),
2775 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' +
2776 ' weight F(18,3); age I; meeting T; misc G; photo P; price Y',
2777 dbf_type='vfp',
2778 )
2779
2781 self.dbf_table.close()
2782 self.vfp_table.close()
2783 shutil.rmtree(self.tempdir, True)
2784
2786 table = self.dbf_table
2787 table.open()
2788 table.append(('myself', True, 5.97, dbf.Date(2012, 5, 21), 'really cool'))
2789 self.assertEqual(table.first_record['name':'qty'], table[0][:3])
2791 "dbf table: adding records"
2792 table = self.dbf_table
2793 table.open()
2794 namelist = []
2795 paidlist = []
2796 qtylist = []
2797 orderlist = []
2798 desclist = []
2799 for i in range(len(floats)):
2800 name = words[i]
2801 paid = len(words[i]) % 3 == 0
2802 qty = floats[i]
2803 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
2804 desc = ' '.join(words[i:i+50])
2805 namelist.append(name)
2806 paidlist.append(paid)
2807 qtylist.append(qty)
2808 orderlist.append(orderdate)
2809 desclist.append(desc)
2810 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc})
2811 record = table[-1]
2812
2813 t = open(table.filename, 'rb')
2814 last_byte = t.read()[-1]
2815 t.close()
2816 self.assertEqual(last_byte, EOF)
2817 self.assertEqual(record.name.strip(), name)
2818 self.assertEqual(record.paid, paid)
2819 self.assertEqual(record.qty, round(qty, 5))
2820 self.assertEqual(record.orderdate, orderdate)
2821 self.assertEqual(record.desc.strip(), desc)
2822
2823 namelist.append('')
2824 paidlist.append(None)
2825 qtylist.append(None)
2826 orderlist.append(None)
2827 desclist.append('')
2828 table.append()
2829 self.assertEqual(len(table), len(floats)+1)
2830 for field in table.field_names:
2831 self.assertEqual(1, table.field_names.count(field))
2832 table.close()
2833 t = open(table.filename, 'rb')
2834 last_byte = t.read()[-1]
2835 t.close()
2836 self.assertEqual(last_byte, EOF)
2837 table = Table(table.filename, dbf_type='db3')
2838 table.open()
2839 self.assertEqual(len(table), len(floats)+1)
2840 for field in table.field_names:
2841 self.assertEqual(1, table.field_names.count(field))
2842 i = 0
2843 for record in table[:-1]:
2844 self.assertEqual(dbf.recno(record), i)
2845 self.assertEqual(table[i].name.strip(), namelist[i])
2846 self.assertEqual(record.name.strip(), namelist[i])
2847 self.assertEqual(table[i].paid, paidlist[i])
2848 self.assertEqual(record.paid, paidlist[i])
2849 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
2850 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
2851 self.assertEqual(table[i].orderdate, orderlist[i])
2852 self.assertEqual(record.orderdate, orderlist[i])
2853 self.assertEqual(table[i].desc.strip(), desclist[i])
2854 self.assertEqual(record.desc.strip(), desclist[i])
2855 i += 1
2856 record = table[-1]
2857 self.assertEqual(dbf.recno(record), i)
2858 self.assertEqual(table[i].name.strip(), namelist[i])
2859 self.assertEqual(record.name.strip(), namelist[i])
2860 self.assertEqual(table[i].paid, paidlist[i])
2861 self.assertEqual(record.paid, paidlist[i])
2862 self.assertEqual(table[i].qty, qtylist[i])
2863 self.assertEqual(record.qty, qtylist[i])
2864 self.assertEqual(table[i].orderdate, orderlist[i])
2865 self.assertEqual(record.orderdate, orderlist[i])
2866 self.assertEqual(table[i].desc, desclist[i])
2867 self.assertEqual(record.desc, desclist[i])
2868 i += 1
2869 self.assertEqual(i, len(table))
2871 "vfp table: adding records"
2872 table = self.vfp_table
2873 table.open()
2874 namelist = []
2875 paidlist = []
2876 qtylist = []
2877 orderlist = []
2878 desclist = []
2879 masslist = []
2880 weightlist = []
2881 agelist = []
2882 meetlist = []
2883 misclist = []
2884 photolist = []
2885 pricelist = []
2886 for i in range(len(floats)):
2887 name = words[i]
2888 paid = len(words[i]) % 3 == 0
2889 qty = floats[i]
2890 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
2891 desc = ' '.join(words[i:i+50])
2892 mass = floats[i] * floats[i] / 2.0
2893 weight = floats[i] * 3
2894 age = numbers[i]
2895 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \
2896 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
2897 misc = (' '.join(words[i:i+50:3])).encode('ascii')
2898 photo = (' '.join(words[i:i+50:7])).encode('ascii')
2899 price = Decimal(round(floats[i] * 2.182737, 4))
2900 namelist.append(name)
2901 paidlist.append(paid)
2902 qtylist.append(qty)
2903 orderlist.append(orderdate)
2904 desclist.append(desc)
2905 masslist.append(mass)
2906 weightlist.append(weight)
2907 agelist.append(age)
2908 meetlist.append(meeting)
2909 misclist.append(misc)
2910 photolist.append(photo)
2911 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc, \
2912 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo})
2913 record = table[-1]
2914 self.assertEqual(record.name.strip(), name)
2915 self.assertEqual(record.paid, paid)
2916 self.assertEqual(record.qty, round(qty, 5))
2917 self.assertEqual(record.orderdate, orderdate)
2918 self.assertEqual(record.desc.strip(), desc)
2919 self.assertEqual(record.mass, mass)
2920 self.assertEqual(record.weight, round(weight, 3))
2921 self.assertEqual(record.age, age)
2922 self.assertEqual(record.meeting, meeting)
2923 self.assertEqual(record.misc, misc)
2924 self.assertEqual(record.photo, photo)
2925
2926 namelist.append('')
2927 paidlist.append(Unknown)
2928 qtylist.append(None)
2929 orderlist.append(NullDate)
2930 desclist.append('')
2931 masslist.append(0.0)
2932 weightlist.append(None)
2933 agelist.append(0)
2934 meetlist.append(NullDateTime)
2935 misclist.append(''.encode('ascii'))
2936 photolist.append(''.encode('ascii'))
2937 pricelist.append(Decimal('0.0'))
2938 table.append()
2939 table.close()
2940 table = Table(table.filename, dbf_type='vfp')
2941 table.open()
2942 self.assertEqual(len(table), len(floats)+1)
2943 i = 0
2944 for record in table[:-1]:
2945 self.assertEqual(dbf.recno(record), i)
2946 self.assertEqual(table[i].name.strip(), namelist[i])
2947 self.assertEqual(record.name.strip(), namelist[i])
2948 self.assertEqual(table[i].paid, paidlist[i])
2949 self.assertEqual(record.paid, paidlist[i])
2950 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
2951 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
2952 self.assertEqual(table[i].orderdate, orderlist[i])
2953 self.assertEqual(record.orderdate, orderlist[i])
2954 self.assertEqual(table[i].desc.strip(), desclist[i])
2955 self.assertEqual(record.desc.strip(), desclist[i])
2956 self.assertEqual(record.mass, masslist[i])
2957 self.assertEqual(table[i].mass, masslist[i])
2958 self.assertEqual(record.weight, round(weightlist[i], 3))
2959 self.assertEqual(table[i].weight, round(weightlist[i], 3))
2960 self.assertEqual(record.age, agelist[i])
2961 self.assertEqual(table[i].age, agelist[i])
2962 self.assertEqual(record.meeting, meetlist[i])
2963 self.assertEqual(table[i].meeting, meetlist[i])
2964 self.assertEqual(record.misc, misclist[i])
2965 self.assertEqual(table[i].misc, misclist[i])
2966 self.assertEqual(record.photo, photolist[i])
2967 self.assertEqual(table[i].photo, photolist[i])
2968 i += 1
2969 record = table[-1]
2970 self.assertEqual(dbf.recno(record), i)
2971 self.assertEqual(table[i].name.strip(), namelist[i])
2972 self.assertEqual(record.name.strip(), namelist[i])
2973 self.assertEqual(table[i].paid is None, True)
2974 self.assertEqual(record.paid is None, True)
2975 self.assertEqual(table[i].qty, None)
2976 self.assertEqual(record.qty, None)
2977 self.assertEqual(table[i].orderdate, orderlist[i])
2978 self.assertEqual(record.orderdate, orderlist[i])
2979 self.assertEqual(table[i].desc, desclist[i])
2980 self.assertEqual(record.desc, desclist[i])
2981 self.assertEqual(record.mass, masslist[i])
2982 self.assertEqual(table[i].mass, masslist[i])
2983 self.assertEqual(record.weight, weightlist[i])
2984 self.assertEqual(table[i].weight, weightlist[i])
2985 self.assertEqual(record.age, agelist[i])
2986 self.assertEqual(table[i].age, agelist[i])
2987 self.assertEqual(record.meeting, meetlist[i])
2988 self.assertEqual(table[i].meeting, meetlist[i])
2989 self.assertEqual(record.misc, misclist[i])
2990 self.assertEqual(table[i].misc, misclist[i])
2991 self.assertEqual(record.photo, photolist[i])
2992 self.assertEqual(table[i].photo, photolist[i])
2993 i += 1
2994
2996 "check character fields return type"
2997 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp', on_disk=False)
2998 table.open()
2999 table.append(('another one bites the dust', "and another one's gone, and another one's gone..."))
3000 table.append()
3001 for record in table:
3002 self.assertTrue(type(record.text) is unicode)
3003 self.assertTrue(type(record.memo) is unicode)
3004
3005 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp',
3006 default_data_types=dict(C=Char, M=Char), on_disk=False)
3007 table.open()
3008 table.append(('another one bites the dust', "and another one's gone, and another one's gone..."))
3009 table.append()
3010 for record in table:
3011 self.assertTrue(type(record.text) is Char)
3012 self.assertTrue(type(record.memo) is Char)
3013
3014 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp',
3015 default_data_types=dict(C=(Char, NoneType), M=(Char, NoneType)), on_disk=False)
3016 table.open()
3017 table.append(('another one bites the dust', "and another one's gone, and another one's gone..."))
3018 table.append()
3019 record = table[0]
3020 self.assertTrue(type(record.text) is Char)
3021 self.assertTrue(type(record.memo) is Char)
3022 record = table[1]
3023 self.assertTrue(type(record.text) is NoneType)
3024 self.assertTrue(type(record.memo) is NoneType)
3026 "empty and None values"
3027 table = Table(':memory:', 'name C(20); born L; married D; appt T; wisdom M', dbf_type='vfp', on_disk=False)
3028 table.open()
3029 table.append()
3030 record = table[-1]
3031 self.assertTrue(record.born is None)
3032 self.assertTrue(record.married is None)
3033 self.assertTrue(record.appt is None)
3034 self.assertEqual(record.wisdom, '')
3035 appt = DateTime.now()
3036 dbf.write(
3037 record,
3038 born = True,
3039 married = Date(1992, 6, 27),
3040 appt = appt,
3041 wisdom = 'Choose Python',
3042 )
3043 self.assertTrue(record.born)
3044 self.assertEqual(record.married, Date(1992, 6, 27))
3045 self.assertEqual(record.appt, appt)
3046 self.assertEqual(record.wisdom, 'Choose Python')
3047 dbf.write(
3048 record,
3049 born = Unknown,
3050 married = NullDate,
3051 appt = NullDateTime,
3052 wisdom = '',
3053 )
3054 self.assertTrue(record.born is None)
3055 self.assertTrue(record.married is None)
3056 self.assertTrue(record.appt is None)
3057 self.assertEqual(record.wisdom, '')
3059 "custom data types"
3060 table = Table(
3061 filename=':memory:',
3062 field_specs='name C(20); born L; married D; appt T; wisdom M',
3063 field_data_types=dict(name=Char, born=Logical, married=Date, appt=DateTime, wisdom=Char,),
3064 dbf_type='vfp',
3065 on_disk=False,
3066 )
3067 table.open()
3068 table.append()
3069 record = table[-1]
3070 self.assertTrue(type(record.name) is Char, "record.name is %r, not Char" % type(record.name))
3071 self.assertTrue(type(record.born) is Logical, "record.born is %r, not Logical" % type(record.born))
3072 self.assertTrue(type(record.married) is Date, "record.married is %r, not Date" % type(record.married))
3073 self.assertTrue(type(record.appt) is DateTime, "record.appt is %r, not DateTime" % type(record.appt))
3074 self.assertTrue(type(record.wisdom) is Char, "record.wisdom is %r, not Char" % type(record.wisdom))
3075 self.assertEqual(record.name, ' ' * 20)
3076 self.assertTrue(record.born is Unknown, "record.born is %r, not Unknown" % record.born)
3077 self.assertTrue(record.married is NullDate, "record.married is %r, not NullDate" % record.married)
3078 self.assertEqual(record.married, None)
3079 self.assertTrue(record.appt is NullDateTime, "record.appt is %r, not NullDateTime" % record.appt)
3080 self.assertEqual(record.appt, None)
3081 appt = DateTime.now()
3082 dbf.write(
3083 record,
3084 name = 'Ethan ',
3085 born = True,
3086 married = Date(1992, 6, 27),
3087 appt = appt,
3088 wisdom = 'Choose Python',
3089 )
3090 self.assertEqual(type(record.name), Char, "record.wisdom is %r, but should be Char" % record.wisdom)
3091 self.assertTrue(record.born is Truth)
3092 self.assertEqual(record.married, Date(1992, 6, 27))
3093 self.assertEqual(record.appt, appt)
3094 self.assertEqual(type(record.wisdom), Char, "record.wisdom is %r, but should be Char" % record.wisdom)
3095 self.assertEqual(record.wisdom, 'Choose Python')
3096 dbf.write(record, born=Falsth)
3097 self.assertEqual(record.born, False)
3098 dbf.write(record, born=None, married=None, appt=None, wisdom=None)
3099 self.assertTrue(record.born is Unknown)
3100 self.assertTrue(record.married is NullDate)
3101 self.assertTrue(record.appt is NullDateTime)
3102 self.assertTrue(type(record.wisdom) is Char, "record.wisdom is %r, but should be Char" % type(record.wisdom))
3104 "field_types with normal data type but None on empty"
3105 table = Table(
3106 filename=':memory:',
3107 field_specs='name C(20); born L; married D; wisdom M',
3108 field_data_types=dict(name=(str, NoneType), born=(bool, bool)),
3109 dbf_type='db3',
3110 on_disk=False,
3111 )
3112 table.open()
3113 table.append()
3114 record = table[-1]
3115 self.assertTrue(type(record.name) is type(None), "record.name is %r, not None" % type(record.name))
3116 self.assertTrue(type(record.born) is bool, "record.born is %r, not bool" % type(record.born))
3117 self.assertTrue(record.name is None)
3118 self.assertTrue(record.born is False, "record.born is %r, not False" % record.born)
3119 dbf.write(record, name='Ethan ', born=True)
3120 self.assertEqual(type(record.name), str, "record.name is %r, but should be Char" % record.wisdom)
3121 self.assertTrue(record.born is True)
3122 dbf.write(record, born=False)
3123 self.assertEqual(record.born, False)
3124 dbf.write(
3125 record,
3126 name = None,
3127 born = None,
3128 )
3129 self.assertTrue(record.name is None)
3130 self.assertTrue(record.born is False)
3132 "NullType"
3133 from pprint import pprint
3134 table = Table(
3135 filename=':memory:',
3136 field_specs='name C(20) null; born L null; married D null; appt T null; wisdom M null',
3137 default_data_types=dict(
3138 C=(Char, NoneType, NullType),
3139 L=(Logical, NoneType, NullType),
3140 D=(Date, NoneType, NullType),
3141 T=(DateTime, NoneType, NullType),
3142 M=(Char, NoneType, NullType),
3143 ),
3144 dbf_type='vfp',
3145 on_disk=False,
3146 )
3147 table.open()
3148 table.append()
3149 record = table[-1]
3150 self.assertEqual(record.name, None)
3151 self.assertEqual(record.born, None)
3152 self.assertEqual(record.married, None)
3153 self.assertEqual(record.appt, None)
3154 self.assertEqual(record.wisdom, None)
3155 appt = datetime.datetime(2012, 12, 15, 9, 37, 11)
3156 dbf.write(
3157 record,
3158 name = 'Ethan ',
3159 born = True,
3160 married = datetime.date(2001, 6, 27),
3161 appt = appt,
3162 wisdom = 'timing is everything',
3163 )
3164 self.assertEqual(record.name, 'Ethan')
3165 self.assertEqual(type(record.name), Char)
3166 self.assertTrue(record.born)
3167 self.assertTrue(record.born is Truth)
3168 self.assertEqual(record.married, datetime.date(2001, 6, 27))
3169 self.assertEqual(type(record.married), Date)
3170 self.assertEqual(record.appt, datetime.datetime(2012, 12, 15, 9, 37, 11))
3171 self.assertEqual(type(record.appt), DateTime)
3172 self.assertEqual(record.wisdom, 'timing is everything')
3173 self.assertEqual(type(record.wisdom), Char)
3174 dbf.write(record, name=Null, born=Null, married=Null, appt=Null, wisdom=Null)
3175 self.assertTrue(record.name is Null)
3176 self.assertTrue(record.born is Null)
3177 self.assertTrue(record.born is Null)
3178 self.assertTrue(record.married is Null)
3179 self.assertTrue(record.appt is Null)
3180 self.assertTrue(record.wisdom is Null)
3181 dbf.write(
3182 record,
3183 name = None,
3184 born = None,
3185 married = None,
3186 appt = None,
3187 wisdom = None,
3188 )
3189 self.assertTrue(record.name is None)
3190 self.assertTrue(record.born is None)
3191 self.assertTrue(record.married is None)
3192 self.assertTrue(record.appt is None)
3193 self.assertTrue(record.wisdom is None)
3194
3196 "check non-ascii text to unicode"
3197 table = Table(':memory:', 'data C(50); memo M', codepage='cp437', dbf_type='vfp', on_disk=False)
3198 table.open()
3199 decoder = codecs.getdecoder('cp437')
3200 if py_ver < (3, 0):
3201 high_ascii = decoder(''.join(chr(c) for c in range(128, 128+50)))[0]
3202 else:
3203 high_ascii = bytes(range(128, 128+50)).decode('cp437')
3204 table.append(dict(data=high_ascii, memo=high_ascii))
3205 self.assertEqual(table[0].data, high_ascii)
3206 self.assertEqual(table[0].memo, high_ascii)
3207 table.close()
3208
3210 "check non-ascii text to bytes"
3211 table = Table(':memory:', 'bindata C(50) binary; binmemo M binary', codepage='cp1252', dbf_type='vfp', on_disk=False)
3212 table.open()
3213 if py_ver < (3, 0):
3214 high_ascii = ''.join(chr(c) for c in range(128, 128+50))
3215 else:
3216 high_ascii = bytes(range(128, 128+50))
3217 table.append(dict(bindata=high_ascii, binmemo=high_ascii))
3218 self.assertEqual(table[0].bindata, high_ascii)
3219 self.assertEqual(table[0].binmemo, high_ascii)
3220 table.close()
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3234 "adding a null field to an existing table"
3235 table = Table(
3236 self.vfp_table.filename,
3237 'name C(50); age N(3,0)',
3238 dbf_type='vfp',
3239 )
3240 table.open()
3241 def _50(text):
3242 return text + ' ' * (50 - len(text))
3243 data = ( (_50('Ethan'), 29), (_50('Joseph'), 33), (_50('Michael'), 54), )
3244 for datum in data:
3245 table.append(datum)
3246 for datum, recordnum in zip(data, table):
3247 self.assertEqual(datum, tuple(recordnum))
3248 table.add_fields('fired D null')
3249 for datum, recordnum in zip(data, table):
3250 self.assertEqual(datum, tuple(recordnum)[:2])
3251 data += ((_50('Daniel'), 44, Null), )
3252 table.append(('Daniel', 44, Null))
3253 for datum, recordnum in zip(data, table):
3254 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3255 self.assertTrue(datum[2] is recordnum[2])
3256 table.close()
3257 table = Table(table.filename)
3258 table.open()
3259 for datum, recordnum in zip(data, table):
3260 self.assertEqual(datum[0:2], tuple(recordnum)[:2])
3261 self.assertTrue(datum[2] is recordnum[2])
3262 table.close()
3263
3265 "removing null fields from an existing table"
3266 table = Table(
3267 self.vfp_table.filename,
3268 'name C(50); age N(3,0); fired D null',
3269 dbf_type='vfp',
3270 )
3271 table.open()
3272 def _50(text):
3273 return text + ' ' * (50 - len(text))
3274 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 5, 3)))
3275 for datum in data:
3276 table.append(datum)
3277 for datum, recordnum in zip(data, table):
3278 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3279 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3280 table.delete_fields('fired')
3281 for datum, recordnum in zip(data, table):
3282 self.assertEqual(datum[:2], tuple(recordnum))
3283 data += ((_50('Daniel'), 44), )
3284 table.append(('Daniel', 44))
3285 for datum, recordnum in zip(data, table):
3286 self.assertEqual(datum[:2], tuple(recordnum))
3287 table.close()
3288 table = Table(table.filename)
3289 table.open()
3290 for datum, recordnum in zip(data, table):
3291 self.assertEqual(datum[:2], tuple(recordnum))
3292 table.close()
3293
3295 "making an existing field nullable (or not)"
3296 table = self.vfp_table
3297 table.open()
3298 namelist = []
3299 paidlist = []
3300 qtylist = []
3301 orderlist = []
3302 desclist = []
3303 for i in range(10):
3304 name = words[i]
3305 paid = len(words[i]) % 3 == 0
3306 qty = floats[i]
3307 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
3308 desc = ' '.join(words[i:i+50])
3309 namelist.append(name)
3310 paidlist.append(paid)
3311 qtylist.append(qty)
3312 orderlist.append(orderdate)
3313 desclist.append(desc)
3314 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc})
3315
3316 namelist.append('')
3317 paidlist.append(None)
3318 qtylist.append(None)
3319 orderlist.append(None)
3320 desclist.append('')
3321 table.append()
3322 for field in table.field_names:
3323 self.assertEqual(table.nullable_field(field), False)
3324 self.assertRaises(FieldMissingError, table.allow_nulls, 'not_here')
3325 table.allow_nulls('name, qty')
3326 for field in table.field_names:
3327 if field in 'name qty'.split():
3328 self.assertEqual(table.nullable_field(field), True)
3329 else:
3330 self.assertEqual(table.nullable_field(field), False)
3331 dbf.write(table[0], name=Null, qty=Null)
3332 self.assertTrue(table[0].name is Null)
3333 self.assertTrue(table[0].qty is Null)
3334 self.assertRaises(FieldMissingError, table.disallow_nulls, 'not_here')
3335 table.disallow_nulls('qty')
3336 for field in table.field_names:
3337 if field in 'name'.split():
3338 self.assertEqual(table.nullable_field(field), True)
3339 else:
3340 self.assertEqual(table.nullable_field(field), False)
3341 table.disallow_nulls('name')
3342 for field in table.field_names:
3343 self.assertEqual(table.nullable_field(field), False)
3344 table.close()
3345
3347 "adding a normal field to a table with null fields"
3348 table = Table(
3349 self.vfp_table.filename,
3350 'name C(50); age N(3,0); fired D null',
3351 dbf_type='vfp',
3352 )
3353 table.open()
3354 def _50(text):
3355 return text + ' ' * (50 - len(text))
3356 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 7, 4)), )
3357 for datum in data:
3358 table.append(datum)
3359 for datum, recordnum in zip(data, table):
3360 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3361 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3362 table.add_fields('tenure N(3,0)')
3363 for datum, recordnum in zip(data, table):
3364 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3365 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3366 data += ((_50('Daniel'), 44, Date(2005, 1, 31), 15 ), )
3367 table.append(('Daniel', 44, Date(2005, 1, 31), 15))
3368 for datum, recordnum in zip(data, table):
3369 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3370 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3371 self.assertEqual(datum[3], recordnum[3])
3372 table.close()
3373 table = Table(table.filename)
3374 table.open()
3375 for datum, recordnum in zip(data, table):
3376 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3377 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3378 self.assertEqual(datum[3], recordnum[3])
3379 table.close()
3380
3382 "removing a normal field from a table with null fields"
3383 mfd = self.vfp_table._meta.mfd
3384 mfd = None
3385 table = Table(
3386 self.vfp_table.filename,
3387 'name C(50); age N(3,0); fired D null',
3388 dbf_type='vfp',
3389 )
3390 table.open()
3391 def _50(text):
3392 return text + ' ' * (50 - len(text))
3393 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 7, 4)), )
3394 for datum in data:
3395 table.append(datum)
3396 for datum, recordnum in zip(data, table):
3397 self.assertEqual(datum[:2], tuple(recordnum)[:2])
3398 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2])
3399 table.delete_fields('age')
3400 for datum, recordnum in zip(data, table):
3401 self.assertEqual(datum[0], recordnum[0])
3402 self.assertTrue(datum[-1] is recordnum[1] or datum[-1] == recordnum[1])
3403 data += ((_50('Daniel'), Date(2001, 11, 13)), )
3404 table.append(('Daniel', Date(2001, 11, 13)))
3405 for datum, recordnum in zip(data, table):
3406 self.assertEqual(datum[0], recordnum[0])
3407 self.assertTrue(datum[-1] is recordnum[1] or datum[-1] == recordnum[1])
3408 table.close()
3409 table = Table(table.filename)
3410 table.open()
3411 for datum, recordnum in zip(data, table):
3412 self.assertEqual(datum[0], recordnum[0])
3413 self.assertTrue(datum[-1] is recordnum[-1] or datum[-1] == recordnum[-1], "name = %s; datum[-1] = %r; recordnum[-1] = %r" % (datum[0], datum[-1], recordnum[-1]))
3414 table.close()
3416 "commit and rollback of flux record (implementation detail)"
3417 table = self.dbf_table
3418 table.open()
3419 table.append(('dbf master', True, 77, Date(2012, 5, 20), "guru of some things dbf-y"))
3420 record = table[-1]
3421 old_data = dbf.scatter(record)
3422 record._start_flux()
3423 record.name = 'novice'
3424 record.paid = False
3425 record.qty = 69
3426 record.orderdate = Date(2011, 1, 1)
3427 record.desc = 'master of all he surveys'
3428 self.assertEqual(
3429 dbf.scatter(record),
3430 dict(
3431 name=unicode('novice '),
3432 paid=False,
3433 qty=69,
3434 orderdate=datetime.date(2011, 1, 1),
3435 desc='master of all he surveys',
3436 ))
3437 record._rollback_flux()
3438 self.assertEqual(old_data, dbf.scatter(record))
3439 record._start_flux()
3440 record.name = 'novice'
3441 record.paid = False
3442 record.qty = 69
3443 record.orderdate = Date(2011, 1, 1)
3444 record._commit_flux()
3445 self.assertEqual(
3446 dbf.scatter(record),
3447 dict(
3448 name=unicode('novice '),
3449 paid=False,
3450 qty=69,
3451 orderdate=datetime.date(2011, 1, 1),
3452 desc='guru of some things dbf-y',
3453 ))
3454 self.assertNotEqual(old_data, dbf.scatter(record))
3455
3457 "Testing records"
3459 self.tempdir = tempfile.mkdtemp()
3460 self.dbf_table = Table(
3461 os.path.join(self.tempdir, 'dbf_table'),
3462 'name C(25); paid L; qty N(11,5); orderdate D; desc M',
3463 dbf_type='db3',
3464 )
3465 self.vfp_table = Table(
3466 os.path.join(self.tempdir, 'vfp_table'),
3467 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' +
3468 ' weight F(18,3); age I; meeting T; misc G; photo P; price Y',
3469 dbf_type='vfp',
3470 )
3471
3473 self.dbf_table.close()
3474 self.vfp_table.close()
3475 shutil.rmtree(self.tempdir, True)
3476
3478 table = self.dbf_table
3479 table.open()
3480 record = table.create_template()
3481 record.name = 'Stoneleaf'
3482 record.paid = True
3483 record.qty = 1
3484 record.orderdate = Date.today()
3485 record.desc = 'some Python dude'
3486 table.append(record)
3487
3489 table = self.vfp_table
3490 table.open()
3491 record = table.create_template()
3492 record.name = 'Stoneleaf'
3493 record.paid = True
3494 record.qty = 1
3495 record.orderdate = Date.today()
3496 record.desc = 'some Python dude'
3497 record.mass = 251.9287
3498 record.weight = 971204.39
3499 record.age = 29
3500 record.meeting = DateTime.now()
3501 record.misc = MISC
3502 record.photo = PHOTO
3503 record.price = 19.99
3504 table.append(record)
3505
3508 self.tempdir = tempfile.mkdtemp()
3509 "create a dbf and vfp table"
3510 self.dbf_table = table = Table(
3511 os.path.join(self.tempdir, 'temptable'),
3512 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3'
3513 )
3514 table.open()
3515 namelist = self.dbf_namelist = []
3516 paidlist = self.dbf_paidlist = []
3517 qtylist = self.dbf_qtylist = []
3518 orderlist = self.dbf_orderlist = []
3519 desclist = self.dbf_desclist = []
3520 for i in range(len(floats)):
3521 name = '%-25s' % words[i]
3522 paid = len(words[i]) % 3 == 0
3523 qty = floats[i]
3524 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
3525 desc = ' '.join(words[i:i+50])
3526 namelist.append(name)
3527 paidlist.append(paid)
3528 qtylist.append(qty)
3529 orderlist.append(orderdate)
3530 desclist.append(desc)
3531 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc})
3532 table.close()
3533
3534 self.vfp_table = table = Table(
3535 os.path.join(self.tempdir, 'tempvfp'),
3536 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;'
3537 ' weight F(18,3); age I; meeting T; misc G; photo P',
3538 dbf_type='vfp',
3539 )
3540 table.open()
3541 namelist = self.vfp_namelist = []
3542 paidlist = self.vfp_paidlist = []
3543 qtylist = self.vfp_qtylist = []
3544 orderlist = self.vfp_orderlist = []
3545 desclist = self.vfp_desclist = []
3546 masslist = self.vfp_masslist = []
3547 weightlist = self.vfp_weightlist = []
3548 agelist = self.vfp_agelist = []
3549 meetlist = self.vfp_meetlist = []
3550 misclist = self.vfp_misclist = []
3551 photolist = self.vfp_photolist = []
3552 for i in range(len(floats)):
3553 name = words[i]
3554 paid = len(words[i]) % 3 == 0
3555 qty = floats[i]
3556 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
3557 desc = ' '.join(words[i:i+50])
3558 mass = floats[i] * floats[i] / 2.0
3559 weight = round(floats[i] * 3, 3)
3560 age = numbers[i]
3561 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \
3562 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
3563 misc = ' '.join(words[i:i+50:3]).encode('latin1')
3564 photo = ' '.join(words[i:i+50:7]).encode('latin1')
3565 namelist.append('%-25s' % name)
3566 paidlist.append(paid)
3567 qtylist.append(qty)
3568 orderlist.append(orderdate)
3569 desclist.append(desc)
3570 masslist.append(mass)
3571 weightlist.append(weight)
3572 agelist.append(age)
3573 meetlist.append(meeting)
3574 misclist.append(misc)
3575 photolist.append(photo)
3576 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1,
3577 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
3578 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc,
3579 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo})
3580 table.close()
3582 self.dbf_table.close()
3583 self.vfp_table.close()
3584 shutil.rmtree(self.tempdir, True)
3585
3587 "dbf table: adding and deleting fields"
3588 table = self.dbf_table
3589 table.open()
3590 dbf._debug = True
3591 namelist = self.dbf_namelist
3592 paidlist = self.dbf_paidlist
3593 qtylist = self.dbf_qtylist
3594 orderlist = self.dbf_orderlist
3595 desclist = self.dbf_desclist
3596 table.delete_fields('name')
3597 table.close()
3598 table = Table(table.filename, dbf_type='db3')
3599 table.open()
3600 for field in table.field_names:
3601 self.assertEqual(1, table.field_names.count(field))
3602 i = 0
3603 for record in table:
3604 self.assertEqual(dbf.recno(record), i)
3605
3606 self.assertEqual(table[i].paid, paidlist[i])
3607 self.assertEqual(record.paid, paidlist[i])
3608 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3609 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3610 self.assertEqual(table[i].orderdate, orderlist[i])
3611 self.assertEqual(record.orderdate, orderlist[i])
3612 self.assertEqual(table[i].desc, desclist[i])
3613 self.assertEqual(record.desc, desclist[i])
3614 i += 1
3615 first, middle, last = table[0], table[len(table)//2], table[-1]
3616 table.delete_fields('paid, orderdate')
3617 for field in table.field_names:
3618 self.assertEqual(1, table.field_names.count(field))
3619 i = 0
3620 for record in table:
3621 self.assertEqual(dbf.recno(record), i)
3622 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3623 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3624 self.assertEqual(table[i].desc, desclist[i])
3625 self.assertEqual(record.desc, desclist[i])
3626 i += 1
3627 self.assertEqual(i, len(table))
3628 self.assertTrue('paid' not in dbf.field_names(first))
3629 self.assertTrue('orderdate' not in dbf.field_names(first))
3630 table.add_fields('name C(25); paid L; orderdate D')
3631 for field in table.field_names:
3632 self.assertEqual(1, table.field_names.count(field))
3633 self.assertEqual(i, len(table))
3634 i = 0
3635 for i, record in enumerate(table):
3636 self.assertEqual(record.name, ' ' * 25)
3637 self.assertEqual(record.paid, None)
3638 self.assertEqual(record.orderdate, None)
3639 self.assertEqual(record.desc, desclist[i])
3640 i += 1
3641 self.assertEqual(i, len(table))
3642 i = 0
3643 for record in table:
3644 data = dict()
3645 data['name'] = namelist[dbf.recno(record)]
3646 data['paid'] = paidlist[dbf.recno(record)]
3647 data['orderdate'] = orderlist[dbf.recno(record)]
3648 dbf.gather(record, data)
3649 i += 1
3650 self.assertEqual(i, len(table))
3651 i = 0
3652 for record in table:
3653 self.assertEqual(dbf.recno(record), i)
3654 self.assertEqual(table[i].name, namelist[i])
3655 self.assertEqual(record.name, namelist[i])
3656 self.assertEqual(table[i].paid, paidlist[i])
3657 self.assertEqual(record.paid, paidlist[i])
3658 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3659 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3660 self.assertEqual(table[i].orderdate, orderlist[i])
3661 self.assertEqual(record.orderdate, orderlist[i])
3662 self.assertEqual(table[i].desc, desclist[i])
3663 self.assertEqual(record.desc, desclist[i])
3664 i += 1
3665 table.close()
3667 "vfp table: adding and deleting fields"
3668 table = self.vfp_table
3669 table.open()
3670 namelist = self.vfp_namelist
3671 paidlist = self.vfp_paidlist
3672 qtylist = self.vfp_qtylist
3673 orderlist = self.vfp_orderlist
3674 desclist = self.vfp_desclist
3675 masslist = self.vfp_masslist
3676 weightlist = self.vfp_weightlist
3677 agelist = self.vfp_agelist
3678 meetlist = self.vfp_meetlist
3679 misclist = self.vfp_misclist
3680 photolist = self.vfp_photolist
3681 self.assertEqual(len(table), len(floats))
3682 i = 0
3683 for record in table:
3684 self.assertEqual(dbf.recno(record), i)
3685 self.assertEqual(table[i].name, namelist[i])
3686 self.assertEqual(record.name, namelist[i])
3687 self.assertEqual(table[i].paid, paidlist[i])
3688 self.assertEqual(record.paid, paidlist[i])
3689 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3690 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3691 self.assertEqual(table[i].orderdate, orderlist[i])
3692 self.assertEqual(record.orderdate, orderlist[i])
3693 self.assertEqual(table[i].desc, desclist[i])
3694 self.assertEqual(record.desc, desclist[i])
3695 self.assertEqual(record.mass, masslist[i])
3696 self.assertEqual(table[i].mass, masslist[i])
3697 self.assertEqual(record.weight, weightlist[i])
3698 self.assertEqual(table[i].weight, weightlist[i])
3699 self.assertEqual(record.age, agelist[i])
3700 self.assertEqual(table[i].age, agelist[i])
3701 self.assertEqual(record.meeting, meetlist[i])
3702 self.assertEqual(table[i].meeting, meetlist[i])
3703 self.assertEqual(record.misc, misclist[i])
3704 self.assertEqual(table[i].misc, misclist[i])
3705 self.assertEqual(record.photo, photolist[i])
3706 self.assertEqual(table[i].photo, photolist[i])
3707 i += 1
3708 table.delete_fields('desc')
3709 i = 0
3710 for record in table:
3711 self.assertEqual(dbf.recno(record), i)
3712 self.assertEqual(table[i].name, namelist[i])
3713 self.assertEqual(record.name, namelist[i])
3714 self.assertEqual(table[i].paid, paidlist[i])
3715 self.assertEqual(record.paid, paidlist[i])
3716 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3717 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3718 self.assertEqual(table[i].orderdate, orderlist[i])
3719 self.assertEqual(record.orderdate, orderlist[i])
3720 self.assertEqual(record.weight, weightlist[i])
3721 self.assertEqual(table[i].weight, weightlist[i])
3722 self.assertEqual(record.age, agelist[i])
3723 self.assertEqual(table[i].age, agelist[i])
3724 self.assertEqual(record.meeting, meetlist[i])
3725 self.assertEqual(table[i].meeting, meetlist[i])
3726 self.assertEqual(record.misc, misclist[i])
3727 self.assertEqual(table[i].misc, misclist[i])
3728 self.assertEqual(record.photo, photolist[i])
3729 self.assertEqual(table[i].photo, photolist[i])
3730 self.assertEqual(record.mass, masslist[i])
3731 self.assertEqual(table[i].mass, masslist[i])
3732 i += 1
3733 table.delete_fields('paid, mass')
3734 i = 0
3735 for record in table:
3736 self.assertEqual(dbf.recno(record), i)
3737 self.assertEqual(table[i].name, namelist[i])
3738 self.assertEqual(record.name, namelist[i])
3739 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3740 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3741 self.assertEqual(table[i].orderdate, orderlist[i])
3742 self.assertEqual(record.orderdate, orderlist[i])
3743 self.assertEqual(record.weight, weightlist[i])
3744 self.assertEqual(table[i].weight, weightlist[i])
3745 self.assertEqual(record.age, agelist[i])
3746 self.assertEqual(table[i].age, agelist[i])
3747 self.assertEqual(record.meeting, meetlist[i])
3748 self.assertEqual(table[i].meeting, meetlist[i])
3749 self.assertEqual(record.misc, misclist[i])
3750 self.assertEqual(table[i].misc, misclist[i])
3751 self.assertEqual(record.photo, photolist[i])
3752 self.assertEqual(table[i].photo, photolist[i])
3753 i += 1
3754 table.add_fields('desc M; paid L; mass B')
3755 i = 0
3756 for record in table:
3757 self.assertEqual(record.desc, unicode(''))
3758 self.assertEqual(record.paid is None, True)
3759 self.assertEqual(record.mass, 0.0)
3760 i += 1
3761 self.assertEqual(i, len(table))
3762 i = 0
3763 for record in Process(table):
3764 record.desc = desclist[dbf.recno(record)]
3765 record.paid = paidlist[dbf.recno(record)]
3766 record.mass = masslist[dbf.recno(record)]
3767 i += 1
3768 self.assertEqual(i, len(table))
3769 i = 0
3770 for record in table:
3771 self.assertEqual(dbf.recno(record), i)
3772 self.assertEqual(table[i].name, namelist[i])
3773 self.assertEqual(record.name, namelist[i])
3774 self.assertEqual(table[i].paid, paidlist[i])
3775 self.assertEqual(record.paid, paidlist[i])
3776 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True)
3777 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True)
3778 self.assertEqual(table[i].orderdate, orderlist[i])
3779 self.assertEqual(record.orderdate, orderlist[i])
3780 self.assertEqual(table[i].desc, desclist[i])
3781 self.assertEqual(record.desc, desclist[i])
3782 self.assertEqual(record.mass, masslist[i])
3783 self.assertEqual(table[i].mass, masslist[i])
3784 self.assertEqual(record.weight, weightlist[i])
3785 self.assertEqual(table[i].weight, weightlist[i])
3786 self.assertEqual(record.age, agelist[i])
3787 self.assertEqual(table[i].age, agelist[i])
3788 self.assertEqual(record.meeting, meetlist[i])
3789 self.assertEqual(table[i].meeting, meetlist[i])
3790 self.assertEqual(record.misc, misclist[i])
3791 self.assertEqual(table[i].misc, misclist[i])
3792 self.assertEqual(record.photo, photolist[i])
3793 self.assertEqual(table[i].photo, photolist[i])
3794 i += 1
3795 table.close()
3797 "basic function tests - len, contains & iterators"
3798 table = self.dbf_table
3799 table.open()
3800 namelist = self.dbf_namelist
3801 paidlist = self.dbf_paidlist
3802 qtylist = self.dbf_qtylist
3803 orderlist = self.dbf_orderlist
3804 desclist = self.dbf_desclist
3805 for field in table.field_names:
3806 self.assertEqual(1, table.field_names.count(field))
3807 length = sum([1 for rec in table])
3808 self.assertEqual(length, len(table))
3809 i = 0
3810 for record in table:
3811 self.assertEqual(record, table[i])
3812 self.assertTrue(record in table)
3813 self.assertTrue(tuple(record) in table)
3814 self.assertTrue(scatter(record) in table)
3815 self.assertTrue(create_template(record) in table)
3816 i += 1
3817 self.assertEqual(i, len(table))
3818 table.close()
3819
3821 "delete, undelete"
3822 table = Table(':memory:', 'name C(10)', dbf_type='db3', on_disk=False)
3823 table.open()
3824 table.append()
3825 self.assertEqual(table.next_record, table[0])
3826 table = Table(':memory:', 'name C(10)', dbf_type='db3', on_disk=False)
3827 table.open()
3828 table.append(multiple=10)
3829 self.assertEqual(table.next_record, table[0])
3830 table = self.dbf_table
3831 table.open()
3832 total = len(table)
3833 table.bottom()
3834 self.assertEqual(dbf.recno(table.current_record), total)
3835 table.top()
3836 self.assertEqual(dbf.recno(table.current_record), -1)
3837 table.goto(27)
3838 self.assertEqual(dbf.recno(table.current_record), 27)
3839 table.goto(total-1)
3840 self.assertEqual(dbf.recno(table.current_record), total-1)
3841 table.goto(0)
3842 self.assertEqual(dbf.recno(table.current_record), 0)
3843 self.assertRaises(IndexError, table.goto, total)
3844 self.assertRaises(IndexError, table.goto, -len(table)-1)
3845 table.top()
3846 self.assertRaises(dbf.Bof, table.skip, -1)
3847 table.bottom()
3848 self.assertRaises(Eof, table.skip)
3849 for record in table:
3850 dbf.delete(record)
3851 active_records = table.create_index(active)
3852 active_records.top()
3853 self.assertRaises(Eof, active_records.skip)
3854 dbf._debug = True
3855 active_records.bottom()
3856 self.assertRaises(Bof, active_records.skip, -1)
3857 for record in table:
3858 dbf.undelete(record)
3859
3860
3861 i = 0
3862 for record in table:
3863 self.assertEqual(dbf.recno(record), i)
3864 if i % 3 == 0:
3865 dbf.delete(record)
3866 i += 1
3867 i = 0
3868
3869 for record in table:
3870 self.assertEqual(dbf.is_deleted(record), i%3==0)
3871 self.assertEqual(dbf.is_deleted(table[i]), i%3==0)
3872 i += 1
3873
3874
3875 table.close()
3876 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3')
3877 table.open()
3878 active_records = table.create_index(active)
3879 i = 0
3880 for record in table:
3881 self.assertEqual(dbf.is_deleted(record), i%3==0)
3882 self.assertEqual(dbf.is_deleted(table[i]), i%3==0)
3883 i += 1
3884
3885
3886 i = 0
3887 for record in table:
3888 self.assertEqual(dbf.recno(record), i)
3889 i += 1
3890
3891
3892 i = 0
3893 for record in active_records:
3894 self.assertNotEqual(dbf.recno(record)%3, 0)
3895 active_records.goto(1)
3896 active_records.skip()
3897 self.assertEqual(dbf.recno(active_records.current_record), 4)
3898 active_records.skip(-1)
3899 self.assertEqual(dbf.recno(active_records.current_record), 2)
3900
3901
3902 list_of_records = active_records[3:6]
3903 self.assertEqual(len(list_of_records), 3)
3904 self.assertEqual(dbf.recno(list_of_records[0]), 5)
3905 self.assertEqual(dbf.recno(list_of_records[1]), 7)
3906 self.assertEqual(dbf.recno(list_of_records[2]), 8)
3907
3908
3909 for record in table:
3910 dbf.delete(record)
3911 active_records.bottom()
3912 self.assertRaises(Eof, active_records.skip)
3913 self.assertEqual(active_records.eof, True)
3914 active_records.top()
3915 self.assertRaises(Bof, active_records.skip, -1)
3916 self.assertEqual(active_records.bof, True)
3917
3918
3919 deleted_records = table.create_index(inactive)
3920 i = 0
3921 for record in deleted_records:
3922 self.assertEqual(dbf.recno(record), i)
3923 i += 1
3924
3925
3926 for record in table:
3927 dbf.delete(record)
3928 self.assertTrue(dbf.is_deleted(record))
3929 for i, record in enumerate(table):
3930 dbf.undelete(table[i])
3931 self.assertEqual(dbf.is_deleted(record), False)
3932 self.assertEqual(dbf.is_deleted(table[i]), False)
3933 self.assertFalse(record in deleted_records)
3934
3935
3936 self.assertEqual(len(active_records), len(table))
3937 self.assertEqual(len(deleted_records), 0)
3938 table.close()
3939
3941 "finding, ordering, searching"
3942 table = self.dbf_table
3943 table.open()
3944 namelist = self.dbf_namelist
3945 paidlist = self.dbf_paidlist
3946 qtylist = self.dbf_qtylist
3947 orderlist = self.dbf_orderlist
3948 desclist = self.dbf_desclist
3949
3950
3951 unordered = []
3952 for record in table:
3953 unordered.append(record.name)
3954 for word in unordered:
3955
3956
3957 records = [rec for rec in table if rec.name == word]
3958 self.assertEqual(len(records), unordered.count(word))
3959
3960
3961 ordered = unordered[:]
3962 ordered.sort()
3963 name_index = table.create_index(lambda rec: rec.name)
3964 self.assertEqual(list(name_index[::-1]), list(reversed(name_index)))
3965 i = 0
3966 for record in name_index:
3967 self.assertEqual(record.name, ordered[i])
3968 i += 1
3969
3970
3971 for word in unordered:
3972 records = name_index.search(match=word)
3973 self.assertEqual(len(records), unordered.count(word), "num records: %d\nnum words: %d\nfailure with %r" % (len(records), unordered.count(word), word))
3974
3975
3976
3977
3978
3979
3980 ordered = unordered[:]
3981 ordered.sort()
3982 nd_index = table.create_index(lambda rec: (rec.name, rec.desc))
3983 self.assertEqual(list(nd_index[::-1]), list(reversed(nd_index)))
3984 i = 0
3985 for record in nd_index:
3986 self.assertEqual(record.name, ordered[i])
3987 i += 1
3988
3989
3990 for word in unordered:
3991 records = nd_index.search(match=(word, ), partial=True)
3992 ucount = sum([1 for wrd in unordered if wrd.startswith(word)])
3993 self.assertEqual(len(records), ucount)
3994
3995 for record in table[::2]:
3996 dbf.write(record, qty=-record.qty)
3997 unordered = []
3998 for record in table:
3999 unordered.append(record.qty)
4000 ordered = unordered[:]
4001 ordered.sort()
4002 qty_index = table.create_index(lambda rec: rec.qty)
4003 self.assertEqual(list(qty_index[::-1]), list(reversed(qty_index)))
4004 i = 0
4005 for record in qty_index:
4006 self.assertEqual(record.qty, ordered[i])
4007 i += 1
4008 for number in unordered:
4009 records = qty_index.search(match=(number, ))
4010 self.assertEqual(len(records), unordered.count(number))
4011
4012 table.close()
4014 "scattering and gathering fields, and new()"
4015 table = self.dbf_table
4016 table.open()
4017 namelist = self.dbf_namelist
4018 paidlist = self.dbf_paidlist
4019 qtylist = self.dbf_qtylist
4020 orderlist = self.dbf_orderlist
4021 desclist = self.dbf_desclist
4022 table2 = table.new(os.path.join(self.tempdir, 'temptable2'))
4023 table2.open()
4024 for record in table:
4025 table2.append()
4026 newrecord = table2[-1]
4027 testdict = dbf.scatter(record)
4028 for key in field_names(testdict):
4029 self.assertEqual(testdict[key], record[key])
4030 dbf.gather(newrecord, dbf.scatter(record))
4031 for field in dbf.field_names(record):
4032 self.assertEqual(newrecord[field], record[field])
4033 table2.close()
4034 table2 = None
4035 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3')
4036 table2.open()
4037 for i in range(len(table)):
4038 temp1 = dbf.scatter(table[i])
4039 temp2 = dbf.scatter(table2[i])
4040 for key in field_names(temp1):
4041 self.assertEqual(temp1[key], temp2[key])
4042 for key in field_names(temp2):
4043 self.assertEqual(temp1[key], temp2[key])
4044 table2.close()
4045 table3 = table.new(':memory:', on_disk=False)
4046 table3.open()
4047 for record in table:
4048 table3.append(record)
4049 table4 = self.vfp_table
4050 table4.open()
4051 table5 = table4.new(':memory:', on_disk=False)
4052 table5.open()
4053 for record in table4:
4054 table5.append(record)
4055 table.close()
4056 table3.close()
4057 table4.close()
4058 table5.close()
4060 "renaming fields, __contains__, has_key"
4061 table = self.dbf_table
4062 table.open()
4063 namelist = self.dbf_namelist
4064 paidlist = self.dbf_paidlist
4065 qtylist = self.dbf_qtylist
4066 orderlist = self.dbf_orderlist
4067 desclist = self.dbf_desclist
4068 for field in table.field_names:
4069 oldfield = field
4070 table.rename_field(oldfield, 'newfield')
4071 self.assertEqual(oldfield in table.field_names, False)
4072 self.assertEqual('newfield' in table.field_names, True)
4073 table.close()
4074 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3')
4075 table.open()
4076 self.assertEqual(oldfield in table.field_names, False)
4077 self.assertEqual('newfield' in table.field_names, True)
4078 table.rename_field('newfield', oldfield)
4079 self.assertEqual(oldfield in table.field_names, True)
4080 self.assertEqual('newfield' in table.field_names, False)
4081 table.close()
4082
4084 "kamikaze"
4085 table = self.dbf_table
4086 table.open()
4087 namelist = self.dbf_namelist
4088 paidlist = self.dbf_paidlist
4089 qtylist = self.dbf_qtylist
4090 orderlist = self.dbf_orderlist
4091 desclist = self.dbf_desclist
4092 table2 = table.new(os.path.join(self.tempdir, 'temptable2'))
4093 table2.open()
4094 for record in table:
4095 table2.append(record)
4096 newrecord = table2[-1]
4097 for key in table.field_names:
4098 if key not in table.memo_types:
4099 self.assertEqual(newrecord[key], record[key])
4100 for field in dbf.field_names(newrecord):
4101 if key not in table2.memo_types:
4102 self.assertEqual(newrecord[field], record[field])
4103 table2.close()
4104 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3')
4105 table2.open()
4106 for i in range(len(table)):
4107 dict1 = dbf.scatter(table[i], as_type=dict)
4108 dict2 = dbf.scatter(table2[i], as_type=dict)
4109 for key in dict1.keys():
4110 if key not in table.memo_types:
4111 self.assertEqual(dict1[key], dict2[key])
4112 for key in dict2.keys():
4113 if key not in table2.memo_types:
4114 self.assertEqual(dict1[key], dict2[key])
4115 for i in range(len(table)):
4116 template1 = dbf.scatter(table[i])
4117 template2 = dbf.scatter(table2[i])
4118 for key in dbf.field_names(template1):
4119 if key not in table.memo_types:
4120 self.assertEqual(template1[key], template2[key])
4121 for key in dbf.field_names(template2):
4122 if key not in table2.memo_types:
4123 self.assertEqual(template1[key], template2[key])
4124 table.close()
4125 table2.close()
4126
4128 "multiple append"
4129 table = self.dbf_table
4130 table.open()
4131 namelist = self.dbf_namelist
4132 paidlist = self.dbf_paidlist
4133 qtylist = self.dbf_qtylist
4134 orderlist = self.dbf_orderlist
4135 desclist = self.dbf_desclist
4136 table2 = table.new(os.path.join(self.tempdir, 'temptable2'))
4137 table2.open()
4138 record = table.next_record
4139 table2.append(dbf.scatter(record), multiple=100)
4140 for samerecord in table2:
4141 for field in dbf.field_names(record):
4142 self.assertEqual(record[field], samerecord[field])
4143 table2.close()
4144 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3')
4145 table2.open()
4146 for samerecord in table2:
4147 for field in dbf.field_names(record):
4148 self.assertEqual(record[field], samerecord[field])
4149 table2.close()
4150 table3 = table.new(os.path.join(self.tempdir, 'temptable3'))
4151 table3.open()
4152 record = table.next_record
4153 table3.append(record, multiple=100)
4154 for samerecord in table3:
4155 for field in dbf.field_names(record):
4156 self.assertEqual(record[field], samerecord[field])
4157 table3.close()
4158 table3 = Table(os.path.join(self.tempdir, 'temptable3'), dbf_type='db3')
4159 table3.open()
4160 for samerecord in table3:
4161 for field in dbf.field_names(record):
4162 self.assertEqual(record[field], samerecord[field])
4163 table3.close()
4164 table.close()
4166 "slices"
4167 table = self.dbf_table
4168 table.open()
4169 namelist = self.dbf_namelist
4170 paidlist = self.dbf_paidlist
4171 qtylist = self.dbf_qtylist
4172 orderlist = self.dbf_orderlist
4173 desclist = self.dbf_desclist
4174 slice1 = [table[0], table[1], table[2]]
4175 self.assertEqual(slice1, list(table[:3]))
4176 slice2 = [table[-3], table[-2], table[-1]]
4177 self.assertEqual(slice2, list(table[-3:]))
4178 slice3 = [record for record in table]
4179 self.assertEqual(slice3, list(table[:]))
4180 slice4 = [table[9]]
4181 self.assertEqual(slice4, list(table[9:10]))
4182 slice5 = [table[15], table[16], table[17], table[18]]
4183 self.assertEqual(slice5, list(table[15:19]))
4184 slice6 = [table[0], table[2], table[4], table[6], table[8]]
4185 self.assertEqual(slice6, list(table[:9:2]))
4186 slice7 = [table[-1], table[-2], table[-3]]
4187 self.assertEqual(slice7, list(table[-1:-4:-1]))
4188 table.close()
4190 "reset record"
4191 table = self.dbf_table
4192 table.open()
4193 namelist = self.dbf_namelist
4194 paidlist = self.dbf_paidlist
4195 qtylist = self.dbf_qtylist
4196 orderlist = self.dbf_orderlist
4197 desclist = self.dbf_desclist
4198 for record in table:
4199 dbf.reset(record)
4200 dbf.write(record)
4201 self.assertEqual(table[0].name, table[1].name)
4202 dbf.write(table[0], name='Python rocks!')
4203 self.assertNotEqual(table[0].name, table[1].name)
4204 table.close()
4206 "adding memos to existing records"
4207 table = Table(':memory:', 'name C(50); age N(3,0)', dbf_type='db3', on_disk=False)
4208 table.open()
4209 table.append(('user', 0))
4210 table.add_fields('motto M')
4211 dbf.write(table[0], motto='Are we there yet??')
4212 self.assertEqual(table[0].motto, 'Are we there yet??')
4213 table.close()
4214 table = Table(os.path.join(self.tempdir, 'temptable4'), 'name C(50); age N(3,0)', dbf_type='db3')
4215 table.open()
4216 table.append(('user', 0))
4217 table.close()
4218 table.open()
4219 table.close()
4220 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='db3')
4221 table.open()
4222 table.add_fields('motto M')
4223 dbf.write(table[0], motto='Are we there yet??')
4224 self.assertEqual(table[0].motto, 'Are we there yet??')
4225 table.close()
4226 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='db3')
4227 table.open()
4228 self.assertEqual(table[0].motto, 'Are we there yet??')
4229 table.close()
4230 table = Table(os.path.join(self.tempdir, 'temptable4'), 'name C(50); age N(3,0)', dbf_type='vfp')
4231 table.open()
4232 table.append(('user', 0))
4233 table.close()
4234 table.open()
4235 table.close()
4236 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='vfp')
4237 table.open()
4238 table.add_fields('motto M')
4239 dbf.write(table[0], motto='Are we there yet??')
4240 self.assertEqual(table[0].motto, 'Are we there yet??')
4241 table.close()
4242 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='vfp')
4243 table.open()
4244 self.assertEqual(table[0].motto, 'Are we there yet??')
4245 table.close()
4247 "from_csv"
4248 table = self.dbf_table
4249 table.open()
4250 namelist = self.dbf_namelist
4251 paidlist = self.dbf_paidlist
4252 qtylist = self.dbf_qtylist
4253 orderlist = self.dbf_orderlist
4254 desclist = self.dbf_desclist
4255 dbf.export(table, table.filename, header=False)
4256 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'))
4257 csvtable.open()
4258 for i in index(table):
4259 for j in index(table.field_names):
4260 self.assertEqual(str(table[i][j]), csvtable[i][j])
4261 csvtable.close()
4262 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), to_disk=True, filename=os.path.join(self.tempdir, 'temptable5'))
4263 csvtable.open()
4264 for i in index(table):
4265 for j in index(table.field_names):
4266 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip())
4267 csvtable.close()
4268 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), field_names=['field1','field2'])
4269 csvtable.open()
4270 for i in index(table):
4271 for j in index(table.field_names):
4272 self.assertEqual(str(table[i][j]), csvtable[i][j])
4273 csvtable.close()
4274 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), field_names=['field1','field2'], to_disk=True, filename=os.path.join(self.tempdir, 'temptable5'))
4275 csvtable.open()
4276 for i in index(table):
4277 for j in index(table.field_names):
4278 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip())
4279 csvtable.close()
4280 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), extra_fields=['count N(5,0)','id C(10)'])
4281 csvtable.open()
4282 for i in index(table):
4283 for j in index(table.field_names):
4284 self.assertEqual(str(table[i][j]), csvtable[i][j])
4285 csvtable.close()
4286 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), extra_fields=['count N(5,0)','id C(10)'], to_disk=True, filename=os.path.join(self.tempdir, 'temptable5'))
4287 csvtable.open()
4288 for i in index(table):
4289 for j in index(table.field_names):
4290 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip())
4291 csvtable.close()
4292 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), field_names=['name','qty','paid','desc'], extra_fields='test1 C(15);test2 L'.split(';'))
4293 csvtable.open()
4294 for i in index(table):
4295 for j in index(table.field_names):
4296 self.assertEqual(str(table[i][j]), csvtable[i][j])
4297 csvtable.close()
4298 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), field_names=['name','qty','paid','desc'], extra_fields='test1 C(15);test2 L'.split(';'), to_disk=True, filename=os.path.join(self.tempdir, 'temptable5'))
4299 csvtable.open()
4300 for i in index(table):
4301 for j in index(table.field_names):
4302 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip())
4303
4305 "resize"
4306 table = self.dbf_table
4307 table.open()
4308 test_record = dbf.scatter(table[5])
4309 namelist = self.dbf_namelist
4310 paidlist = self.dbf_paidlist
4311 qtylist = self.dbf_qtylist
4312 orderlist = self.dbf_orderlist
4313 desclist = self.dbf_desclist
4314 test_record = dbf.scatter(table[5])
4315 table.resize_field('name', 40)
4316 new_record = dbf.scatter(table[5])
4317 self.assertEqual(test_record['orderdate'], new_record['orderdate'])
4318 table.close()
4320 "memos available after close/open"
4321 table = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3', default_data_types=dict(C=Char))
4322 table.open()
4323 table.append(('Author','dashing, debonair, delightful'))
4324 table.close()
4325 table.open()
4326 self.assertEqual(tuple(table[0]), ('Author','dashing, debonair, delightful'))
4327 table.close()
4328 table2 = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3')
4329 table2.open()
4330 table2.append(('Benedict', 'brilliant, bombastic, bothered'))
4331 table2.close()
4332 table.open()
4333 self.assertEqual(table[0].name, 'Benedict')
4334 self.assertEqual(table[0].desc, 'brilliant, bombastic, bothered')
4335 table.close()
4337 "table.type(field) == ('C', Char)"
4338 table = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3', default_data_types=dict(C=Char))
4339 table.open()
4340 field_info = table.field_info('name')
4341 if py_ver < (3, 0):
4342 self.assertEqual(field_info, ('C', 20, 0, Char))
4343 self.assertEqual(field_info.field_type, 'C')
4344 else:
4345 self.assertEqual(field_info, (dbf.FieldType.CHAR, 20, 0, Char))
4346 self.assertEqual(field_info.field_type, dbf.FieldType.CHAR)
4347 self.assertEqual(field_info.length, 20)
4348 self.assertEqual(field_info.decimal, 0)
4349 self.assertEqual(field_info.py_type, Char)
4350 table.close()
4351
4365 "Process loop commits changes"
4366 table = self.dbf_table
4367 table.open()
4368 for record in Process(table):
4369 record.name = '!BRAND NEW NAME!'
4370 for record in table:
4371 self.assertEqual(record.name, '!BRAND NEW NAME! ')
4372 table.close()
4374 for table in self.dbf_table, self.vfp_table:
4375 table.open()
4376 dbf.export(table, filename='test_export.csv')
4378 table = Table("unordered", "icao C(20)", default_data_types=dict(C=Char), on_disk=False).open()
4379 icao = ("kilo charlie echo golf papa hotel delta tango india sierra juliet lima zulu mike "
4380 "bravo november alpha oscar quebec romeo uniform victor whiskey x-ray yankee foxtrot".split())
4381 for alpha in icao:
4382 table.append((alpha,))
4383 sorted = table.create_index(lambda rec: rec.icao)
4384 self.assertTrue(sorted.index_search('alpha'))
4385 self.assertTrue(sorted.index_search('bravo'))
4386 self.assertTrue(sorted.index_search('charlie'))
4387 self.assertTrue(sorted.index_search('delta'))
4388 self.assertTrue(sorted.index_search('echo'))
4389 self.assertTrue(sorted.index_search('foxtrot'))
4390 self.assertTrue(sorted.index_search('golf'))
4391 self.assertTrue(sorted.index_search('hotel'))
4392 self.assertTrue(sorted.index_search('india'))
4393 self.assertTrue(sorted.index_search('juliet'))
4394 self.assertTrue(sorted.index_search('kilo'))
4395 self.assertTrue(sorted.index_search('lima'))
4396 self.assertTrue(sorted.index_search('mike'))
4397 self.assertTrue(sorted.index_search('november'))
4398 self.assertTrue(sorted.index_search('oscar'))
4399 self.assertTrue(sorted.index_search('papa'))
4400 self.assertTrue(sorted.index_search('quebec'))
4401 self.assertTrue(sorted.index_search('romeo'))
4402 self.assertTrue(sorted.index_search('sierra'))
4403 self.assertTrue(sorted.index_search('tango'))
4404 self.assertTrue(sorted.index_search('uniform'))
4405 self.assertTrue(sorted.index_search('victor'))
4406 self.assertTrue(sorted.index_search('whiskey'))
4407 self.assertTrue(sorted.index_search('x-ray'))
4408 self.assertTrue(sorted.index_search('yankee'))
4409 self.assertTrue(sorted.index_search('zulu'))
4410 self.assertEqual(sorted.index_search('alpha'), 0)
4411 self.assertEqual(sorted.index_search('bravo'), 1)
4412 self.assertEqual(sorted.index_search('charlie'), 2)
4413 self.assertEqual(sorted.index_search('delta'), 3)
4414 self.assertEqual(sorted.index_search('echo'), 4)
4415 self.assertEqual(sorted.index_search('foxtrot'), 5)
4416 self.assertEqual(sorted.index_search('golf'), 6)
4417 self.assertEqual(sorted.index_search('hotel'), 7)
4418 self.assertEqual(sorted.index_search('india'), 8)
4419 self.assertEqual(sorted.index_search('juliet'), 9)
4420 self.assertEqual(sorted.index_search('kilo'), 10)
4421 self.assertEqual(sorted.index_search('lima'), 11)
4422 self.assertEqual(sorted.index_search('mike'), 12)
4423 self.assertEqual(sorted.index_search('november'), 13)
4424 self.assertEqual(sorted.index_search('oscar'), 14)
4425 self.assertEqual(sorted.index_search('papa'), 15)
4426 self.assertEqual(sorted.index_search('quebec'), 16)
4427 self.assertEqual(sorted.index_search('romeo'), 17)
4428 self.assertEqual(sorted.index_search('sierra'), 18)
4429 self.assertEqual(sorted.index_search('tango'), 19)
4430 self.assertEqual(sorted.index_search('uniform'), 20)
4431 self.assertEqual(sorted.index_search('victor'), 21)
4432 self.assertEqual(sorted.index_search('whiskey'), 22)
4433 self.assertEqual(sorted.index_search('x-ray'), 23)
4434 self.assertEqual(sorted.index_search('yankee'), 24)
4435 self.assertEqual(sorted.index_search('zulu'), 25)
4436 self.assertRaises(NotFoundError, sorted.index_search, 'john')
4437 self.assertRaises(NotFoundError, sorted.index_search, 'john', partial=True)
4438 self.assertEqual(sorted.index_search('able', nearest=True), 0)
4439 self.assertFalse(sorted.index_search('able', nearest=True))
4440 self.assertEqual(sorted.index_search('alp', partial=True), 0)
4441 self.assertTrue(sorted.index_search('alp', partial=True))
4442 self.assertEqual(sorted.index_search('john', nearest=True), 9)
4443 self.assertFalse(sorted.index_search('john', nearest=True))
4444 self.assertEqual(sorted.index_search('jul', partial=True), 9)
4445 self.assertTrue(sorted.index_search('jul', partial=True))
4446
4449 self.tempdir = tempfile.mkdtemp()
4450 "create a dbf and vfp table"
4451 self.dbf_table = table = Table(
4452 os.path.join(self.tempdir, 'temptable'),
4453 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3'
4454 )
4455 table.open()
4456 namelist = self.dbf_namelist = []
4457 paidlist = self.dbf_paidlist = []
4458 qtylist = self.dbf_qtylist = []
4459 orderlist = self.dbf_orderlist = []
4460 desclist = self.dbf_desclist = []
4461 for i in range(len(floats)):
4462 name = '%-25s' % words[i]
4463 paid = len(words[i]) % 3 == 0
4464 qty = floats[i]
4465 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
4466 desc = ' '.join(words[i:i+50])
4467 namelist.append(name)
4468 paidlist.append(paid)
4469 qtylist.append(qty)
4470 orderlist.append(orderdate)
4471 desclist.append(desc)
4472 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc})
4473 table.close()
4474
4475 self.vfp_table = table = Table(
4476 os.path.join(self.tempdir, 'tempvfp'),
4477 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;'
4478 ' weight F(18,3); age I; meeting T; misc G; photo P',
4479 dbf_type='vfp',
4480 )
4481 table.open()
4482 namelist = self.vfp_namelist = []
4483 paidlist = self.vfp_paidlist = []
4484 qtylist = self.vfp_qtylist = []
4485 orderlist = self.vfp_orderlist = []
4486 desclist = self.vfp_desclist = []
4487 masslist = self.vfp_masslist = []
4488 weightlist = self.vfp_weightlist = []
4489 agelist = self.vfp_agelist = []
4490 meetlist = self.vfp_meetlist = []
4491 misclist = self.vfp_misclist = []
4492 photolist = self.vfp_photolist = []
4493 for i in range(len(floats)):
4494 name = words[i]
4495 paid = len(words[i]) % 3 == 0
4496 qty = floats[i]
4497 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
4498 desc = ' '.join(words[i:i+50])
4499 mass = floats[i] * floats[i] / 2.0
4500 weight = floats[i] * 3
4501 age = numbers[i]
4502 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \
4503 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
4504 misc = ' '.join(words[i:i+50:3]).encode('ascii')
4505 photo = ' '.join(words[i:i+50:7]).encode('ascii')
4506 namelist.append('%-25s' % name)
4507 paidlist.append(paid)
4508 qtylist.append(qty)
4509 orderlist.append(orderdate)
4510 desclist.append(desc)
4511 masslist.append(mass)
4512 weightlist.append(weight)
4513 agelist.append(age)
4514 meetlist.append(meeting)
4515 misclist.append(misc)
4516 photolist.append(photo)
4517 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1,
4518 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
4519 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc,
4520 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo})
4521 table.close()
4523 self.dbf_table.close()
4524 self.vfp_table.close()
4525 shutil.rmtree(self.tempdir, True)
4526
4528 "top, current in Tables, Lists, and Indexes"
4529 table = self.dbf_table
4530 table.open()
4531 list = List(table)
4532 index = Index(table, key=lambda rec: dbf.recno(rec))
4533 total = len(table)
4534 mid = total // 2
4535 table.goto(mid)
4536 list.goto(mid)
4537 index.goto(mid)
4538 self.assertTrue(table.current != -1)
4539 self.assertTrue(list.current != -1)
4540 self.assertTrue(index.current != -1)
4541 table.top()
4542 list.top()
4543 index.top()
4544 self.assertEqual(table.current, -1)
4545 self.assertEqual(list.current, -1)
4546 self.assertEqual(index.current, -1)
4547
4568
4570 "goto, current in Tables, Lists, and Indexes"
4571 table = self.dbf_table
4572 table.open()
4573 list = List(table)
4574 index = Index(table, key=lambda rec: dbf.recno(rec))
4575 total = len(table)
4576 mid = total // 2
4577 table.goto(mid)
4578 list.goto(mid)
4579 index.goto(mid)
4580 self.assertEqual(table.current, mid)
4581 self.assertEqual(list.current, mid)
4582 self.assertEqual(index.current, mid)
4583 table.goto('top')
4584 list.goto('top')
4585 index.goto('top')
4586 self.assertEqual(table.current, -1)
4587 self.assertEqual(list.current, -1)
4588 self.assertEqual(index.current, -1)
4589 table.goto('bottom')
4590 list.goto('bottom')
4591 index.goto('bottom')
4592 self.assertEqual(table.current, total)
4593 self.assertEqual(list.current, total)
4594 self.assertEqual(index.current, total)
4595 dbf.delete(table[10])
4596 self.assertTrue(dbf.is_deleted(list[10]))
4597 self.assertTrue(dbf.is_deleted(index[10]))
4598 table.goto(10)
4599 list.goto(10)
4600 index.goto(10)
4601 self.assertEqual(table.current, 10)
4602 self.assertEqual(list.current, 10)
4603 self.assertEqual(index.current, 10)
4604 table.close()
4605
4607 "skip, current in Tables, Lists, and Indexes"
4608 table = self.dbf_table
4609 table.open()
4610 list = List(table)
4611 index = Index(table, key=lambda rec: dbf.recno(rec))
4612 total = len(table)
4613 mid = total // 2
4614 self.assertEqual(table.current, -1)
4615 self.assertEqual(list.current, -1)
4616 self.assertEqual(index.current, -1)
4617 table.skip(1)
4618 list.skip(1)
4619 index.skip(1)
4620 self.assertEqual(table.current, 0)
4621 self.assertEqual(list.current, 0)
4622 self.assertEqual(index.current, 0)
4623 table.skip(10)
4624 list.skip(10)
4625 index.skip(10)
4626 self.assertEqual(table.current, 10)
4627 self.assertEqual(list.current, 10)
4628 self.assertEqual(index.current, 10)
4629 table.close()
4630
4632 "first_record in Tables, Lists, and Indexes"
4633 table = self.dbf_table
4634 table.open()
4635 list = List(table)
4636 index = Index(table, key=lambda rec: dbf.recno(rec))
4637 total = len(table)
4638 mid = total // 2
4639 self.assertTrue(table[0] is list[0])
4640 self.assertTrue(table[0] is index[0])
4641 self.assertTrue(table.first_record is table[0])
4642 self.assertTrue(list.first_record is table[0])
4643 self.assertTrue(index.first_record is table[0])
4644 table.close()
4645
4675
4703
4733
4735 "last_record in Tables, Lists, and Indexes"
4736 table = self.dbf_table
4737 table.open()
4738 list = List(table)
4739 index = Index(table, key=lambda rec: dbf.recno(rec))
4740 total = len(table)
4741 mid = total // 2
4742 self.assertTrue(table[-1] is list[-1])
4743 self.assertTrue(table[-1] is index[-1])
4744 self.assertTrue(table.last_record is table[-1])
4745 self.assertTrue(list.last_record is table[-1])
4746 self.assertTrue(index.last_record is table[-1])
4747 table.close()
4748
4750 "DbfList tests"
4752 self.tempdir = tempfile.mkdtemp()
4753 "create a dbf table"
4754 self.dbf_table = table = Table(
4755 os.path.join(self.tempdir, 'temptable'),
4756 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3'
4757 )
4758 table.open()
4759 records = []
4760 for i in range(len(floats)):
4761 name = words[i]
4762 paid = len(words[i]) % 3 == 0
4763 qty = round(floats[i], 5)
4764 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
4765 desc = ' '.join(words[i:i+50])
4766 data = {'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}
4767 table.append(data)
4768 records.append(data)
4769 table.close()
4770 table.open()
4771 for trec, drec in zip(table, records):
4772 self.assertEqual(trec.name.strip(), drec['name'])
4773 self.assertEqual(trec.paid, drec['paid'])
4774 self.assertEqual(trec.qty, drec['qty'])
4775 self.assertEqual(trec.orderdate, drec['orderdate'])
4776 self.assertEqual(trec.desc, drec['desc'])
4777 table.close()
4779 self.dbf_table.close()
4780 shutil.rmtree(self.tempdir, True)
4782 table = self.dbf_table
4783 table.open()
4784 list = table[::5]
4785 record = table[5]
4786 dbf.delete(record)
4787 self.assertTrue(list[0] is table[0])
4788 self.assertTrue(record in list)
4789 self.assertRaises(TypeError, list.__contains__, 'some string')
4790 self.assertRaises(TypeError, list.__getitem__, 'some string')
4791 self.assertRaises(TypeError, list.__delitem__, 'some string')
4792 self.assertRaises(TypeError, list.remove, 'some string')
4793 self.assertRaises(TypeError, list.index, 'some string')
4794 self.assertRaises(IndexError, list.__getitem__, 100)
4795 self.assertRaises(IndexError, list.pop, 1000)
4796 self.assertRaises(IndexError, list.goto, 1000)
4797 list.top()
4798 self.assertRaises(Bof, list.skip, -1)
4799 list.bottom()
4800 self.assertRaises(Eof, list.skip)
4801 table.pack()
4802 self.assertRaises(DbfError, list.__contains__, record)
4803
4804 list = List()
4805 self.assertRaises(IndexError, list.goto, 0)
4806 self.assertRaises(Bof, list.skip, -1)
4807 self.assertRaises(Eof, list.skip)
4808 self.assertRaises(ValueError, list.remove, table[0])
4809 self.assertRaises(ValueError, list.index, table[1])
4810
4812 "addition and subtraction"
4813 table1 = self.dbf_table
4814 table1.open()
4815 list1 = table1[::2]
4816 list2 = table1[::3]
4817 list3 = table1[:] - list1 - list2
4818 self.assertEqual(100, len(table1))
4819 self.assertEqual(list1[0], list2[0])
4820 self.assertEqual(list1[3], list2[2])
4821 self.assertEqual(50, len(list1))
4822 self.assertEqual(34, len(list2))
4823 self.assertEqual(33, len(list3))
4824 self.assertEqual(117, len(list1) + len(list2) + len(list3))
4825 self.assertEqual(len(table1), len(list1 + list2 + list3))
4826 self.assertEqual(67, len(list1 + list2))
4827 self.assertEqual(33, len(list1 - list2))
4828 self.assertEqual(17, len(list2 - list1))
4829 table1.close()
4831 "appending and extending"
4832 table1 = self.dbf_table
4833 table1.open()
4834 list1 = table1[::2]
4835 list2 = table1[::3]
4836 list3 = table1[:] - list1 - list2
4837 list1.extend(list2)
4838 list2.append(table1[1])
4839 self.assertEqual(67, len(list1))
4840 self.assertEqual(35, len(list2))
4841 list1.append(table1[1])
4842 list2.extend(list3)
4843 self.assertEqual(68, len(list1))
4844 self.assertEqual(67, len(list2))
4845 table1.close()
4847 "indexing"
4848 table1 = self.dbf_table
4849 table1.open()
4850 list1 = table1[::2]
4851 list2 = table1[::3]
4852 list3 = table1[:] - list1 - list2
4853 for i, rec in enumerate(list1):
4854 self.assertEqual(i, list1.index(rec))
4855 for rec in list3:
4856 self.assertRaises(ValueError, list1.index, rec )
4857 table1.close()
4859 "sorting"
4860 table1 = self.dbf_table
4861 table1.open()
4862 list1 = table1[::2]
4863 list2 = table1[::3]
4864 list3 = table1[:] - list1 - list2
4865 list4 = table1[:]
4866 index = table1.create_index(key = lambda rec: rec.name )
4867 list4.sort(key=lambda rec: rec.name)
4868 for trec, lrec in zip(index, list4):
4869 self.assertEqual(dbf.recno(trec), dbf.recno(lrec))
4870 table1.close()
4872 "keys"
4873 table1 = self.dbf_table
4874 table1.open()
4875 field = table1.field_names[0]
4876 list1 = List(table1, key=lambda rec: rec[field])
4877 unique = set()
4878 for rec in table1:
4879 if rec[field] not in unique:
4880 unique.add(rec[field])
4881 else:
4882 self.assertRaises(NotFoundError, list1.index, rec)
4883 self.assertFalse(rec in list1)
4884 self.assertTrue(rec[field] in unique)
4885 self.assertEqual(len(unique), len(list1))
4886 table1.close()
4888 table = self.dbf_table
4889 table.open()
4890 list = List(table)
4891 i = 0
4892 for record in list:
4893 self.assertEqual(record, list[i])
4894 self.assertTrue(record in list)
4895 self.assertTrue(tuple(record) in list)
4896 self.assertTrue(scatter(record) in list)
4897 self.assertTrue(create_template(record) in list)
4898 i += 1
4899 self.assertEqual(i, len(list))
4900 table.close()
4901
4903 "move tests here to run one at a time while debugging"
4905 self.tempdir = tempfile.mkdtemp()
4906 "create a dbf and vfp table"
4907 self.dbf_table = table = Table(
4908 os.path.join(self.tempdir, 'temptable'),
4909 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3'
4910 )
4911 table.open()
4912 namelist = self.dbf_namelist = []
4913 paidlist = self.dbf_paidlist = []
4914 qtylist = self.dbf_qtylist = []
4915 orderlist = self.dbf_orderlist = []
4916 desclist = self.dbf_desclist = []
4917 for i in range(len(floats)):
4918 name = '%-25s' % words[i]
4919 paid = len(words[i]) % 3 == 0
4920 qty = round(floats[i], 5)
4921 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
4922 desc = ' '.join(words[i:i+50])
4923 namelist.append(name)
4924 paidlist.append(paid)
4925 qtylist.append(qty)
4926 orderlist.append(orderdate)
4927 desclist.append(desc)
4928 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc})
4929 table.close()
4930
4931 self.vfp_table = table = Table(
4932 os.path.join(self.tempdir, 'tempvfp'),
4933 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;'
4934 ' weight F(18,3); age I; meeting T; misc G; photo P',
4935 dbf_type='vfp',
4936 )
4937 table.open()
4938 namelist = self.vfp_namelist = []
4939 paidlist = self.vfp_paidlist = []
4940 qtylist = self.vfp_qtylist = []
4941 orderlist = self.vfp_orderlist = []
4942 desclist = self.vfp_desclist = []
4943 masslist = self.vfp_masslist = []
4944 weightlist = self.vfp_weightlist = []
4945 agelist = self.vfp_agelist = []
4946 meetlist = self.vfp_meetlist = []
4947 misclist = self.vfp_misclist = []
4948 photolist = self.vfp_photolist = []
4949 for i in range(len(floats)):
4950 name = words[i]
4951 paid = len(words[i]) % 3 == 0
4952 qty = round(floats[i], 5)
4953 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1)
4954 desc = ' '.join(words[i:i+50])
4955 mass = floats[i] * floats[i] / 2.0
4956 weight = round(floats[i] * 3, 3)
4957 age = numbers[i]
4958 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \
4959 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
4960 misc = ' '.join(words[i:i+50:3]).encode('ascii')
4961 photo = ' '.join(words[i:i+50:7]).encode('ascii')
4962 namelist.append('%-25s' % name)
4963 paidlist.append(paid)
4964 qtylist.append(qty)
4965 orderlist.append(orderdate)
4966 desclist.append(desc)
4967 masslist.append(mass)
4968 weightlist.append(weight)
4969 agelist.append(age)
4970 meetlist.append(meeting)
4971 misclist.append(misc)
4972 photolist.append(photo)
4973 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1,
4974 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60)
4975 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc,
4976 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo})
4977 table.close()
4979 self.dbf_table.close()
4980 self.vfp_table.close()
4981 shutil.rmtree(self.tempdir, True)
4982
4983 if __name__ == '__main__':
4984 unittest.main()
4985