Package dbf :: Module tests
[hide private]
[frames] | no frames]

Source Code for Module dbf.tests

   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  # Walker in Leaves -- by Scot Noel -- http://www.scienceandfantasyfiction.com/sciencefiction/Walker-in-Leaves/walker-in-leaves.htm
 
  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  # data
 
  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 
104 105 -def permutate(Xs, N):
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 # don't allow duplicates 112 for item in result: 113 if result.count(item) > 1: 114 break 115 else: 116 yield result
117
118 -def combinate(Xs, N):
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
127 -def index(sequence):
128 "returns integers 0 - len(sequence)" 129 for i in xrange(len(sequence)): 130 yield i
131
132 # tests 133 -def active(rec):
134 if is_deleted(rec): 135 return DoNotIndex 136 return dbf.recno(rec)
137 -def inactive(rec):
138 if is_deleted(rec): 139 return recno(rec) 140 return DoNotIndex
141
142 -class TestChar(unittest.TestCase):
143 - def test_exceptions(self):
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)
152 - def test_bools_and_none(self):
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))
160 - def test_equality(self):
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)
170 - def test_inequality(self):
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)
180 - def test_less_than(self):
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)
194 - def test_less_than_equal(self):
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)
208 - def test_greater_than(self):
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)
222 - def test_greater_than_equal(self):
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
237 -class TestDateTime(unittest.TestCase):
238 "Testing Date"
239 - def test_date_creation(self):
240 "Date creation" 241 date0 = Date() 242 date1 = Date() 243 date2 = Date.fromymd(' ') 244 date5 = Date.fromordinal(0) 245 date6 = Date.today() 246 date7 = Date.max 247 date8 = Date.min 248 self.assertRaises(ValueError, Date.fromymd, '00000') 249 self.assertRaises(ValueError, Date.fromymd, '00000000') 250 self.assertRaises(ValueError, Date, 0, 0, 0)
251 - def test_date_compare(self):
252 "Date comparisons" 253 nodate1 = Date() 254 nodate2 = Date() 255 date1 = Date.fromordinal(1000) 256 date2 = Date.fromordinal(2000) 257 date3 = Date.fromordinal(3000) 258 self.compareTimes(nodate1, nodate2, date1, date2, date3)
259
260 - def test_datetime_creation(self):
261 "DateTime creation" 262 datetime0 = DateTime() 263 datetime1 = DateTime() 264 datetime5 = DateTime.fromordinal(0) 265 datetime6 = DateTime.today() 266 datetime7 = DateTime.max 267 datetime8 = DateTime.min
268 - def test_datetime_compare(self):
269 "DateTime comparisons" 270 nodatetime1 = DateTime() 271 nodatetime2 = DateTime() 272 datetime1 = Date.fromordinal(1000) 273 datetime2 = Date.fromordinal(20000) 274 datetime3 = Date.fromordinal(300000) 275 self.compareTimes(nodatetime1, nodatetime2, datetime1, datetime2, datetime3)
276
277 - def test_datetime_replace(self):
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
295 - def test_time_creation(self):
296 "Time creation" 297 time0 = Time() 298 time1 = Time() 299 time7 = Time.max 300 time8 = Time.min
301 - def test_time_compare(self):
302 "Time comparisons" 303 notime1 = Time() 304 notime2 = Time() 305 time1 = Date.fromordinal(1000) 306 time2 = Date.fromordinal(2000) 307 time3 = Date.fromordinal(3000) 308 self.compareTimes(notime1, notime2, time1, time2, time3)
309 - def test_arithmetic(self):
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)
326 - def test_none_compare(self):
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)
334 - def test_singletons(self):
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)
342 - def test_boolean_value(self):
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)
356 - def compareTimes(self, empty1, empty2, uno, dos, tres):
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
397 -class TestNull(unittest.TestCase):
398 - def test_all(self):
399 null = Null = dbf.Null() 400 self.assertTrue(null is dbf.Null()) 401 402 self.assertTrue(null + 1 is Null) 403 self.assertTrue(1 + null is Null) 404 null += 4 405 self.assertTrue(null is Null) 406 value = 5 407 value += null 408 self.assertTrue(value is Null) 409 410 self.assertTrue(null - 2 is Null) 411 self.assertTrue(2 - null is Null) 412 null -= 5 413 self.assertTrue(null is Null) 414 value = 6 415 value -= null 416 self.assertTrue(value is Null) 417 418 self.assertTrue(null / 0 is Null) 419 self.assertTrue(3 / null is Null) 420 null /= 6 421 self.assertTrue(null is Null) 422 value = 7 423 value /= null 424 self.assertTrue(value is Null) 425 426 self.assertTrue(null * -3 is Null) 427 self.assertTrue(4 * null is Null) 428 null *= 7 429 self.assertTrue(null is Null) 430 value = 8 431 value *= null 432 self.assertTrue(value is Null) 433 434 self.assertTrue(null % 1 is Null) 435 self.assertTrue(7 % null is Null) 436 null %= 1 437 self.assertTrue(null is Null) 438 value = 9 439 value %= null 440 self.assertTrue(value is Null) 441 442 self.assertTrue(null ** 2 is Null) 443 self.assertTrue(4 ** null is Null) 444 null **= 3 445 self.assertTrue(null is Null) 446 value = 9 447 value **= null 448 self.assertTrue(value is Null) 449 450 self.assertTrue(null & 1 is Null) 451 self.assertTrue(1 & null is Null) 452 null &= 1 453 self.assertTrue(null is Null) 454 value = 1 455 value &= null 456 self.assertTrue(value is Null) 457 458 self.assertTrue(null ^ 1 is Null) 459 self.assertTrue(1 ^ null is Null) 460 null ^= 1 461 self.assertTrue(null is Null) 462 value = 1 463 value ^= null 464 self.assertTrue(value is Null) 465 466 self.assertTrue(null | 1 is Null) 467 self.assertTrue(1 | null is Null) 468 null |= 1 469 self.assertTrue(null is Null) 470 value = 1 471 value |= null 472 self.assertTrue(value is Null) 473 474 self.assertTrue(str(divmod(null, 1)) == '(<null>, <null>)') 475 self.assertTrue(str(divmod(1, null)) == '(<null>, <null>)') 476 477 self.assertTrue(null << 1 is Null) 478 self.assertTrue(2 << null is Null) 479 null <<=3 480 self.assertTrue(null is Null) 481 value = 9 482 value <<= null 483 self.assertTrue(value is Null) 484 485 self.assertTrue(null >> 1 is Null) 486 self.assertTrue(2 >> null is Null) 487 null >>= 3 488 self.assertTrue(null is Null) 489 value = 9 490 value >>= null 491 self.assertTrue(value is Null) 492 493 self.assertTrue(-null is Null) 494 self.assertTrue(+null is Null) 495 self.assertTrue(abs(null) is Null) 496 self.assertTrue(~null is Null) 497 498 self.assertTrue(null.attr is Null) 499 self.assertTrue(null() is Null) 500 self.assertTrue(getattr(null, 'fake') is Null) 501 502 self.assertRaises(TypeError, hash, null)
503
504 -class TestLogical(unittest.TestCase):
505 "Testing Logical"
506 - def test_unknown(self):
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])
518 - def test_true(self):
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)
530 - def test_false(self):
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)
542 - def test_singletons(self):
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)
553 - def test_error(self):
554 "errors" 555 self.assertRaises(ValueError, Logical, 'wrong')
556 - def test_and(self):
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
715 - def test_or(self):
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
867 - def test_xor(self):
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
1022 - def test_negation(self):
1023 "negation" 1024 true = Logical(True) 1025 false = Logical(False) 1026 none = Logical(None) 1027 self.assertEqual(-true, -1) 1028 self.assertEqual(-false, 0) 1029 self.assertEqual(-none, none)
1030 - def test_posation(self):
1031 "posation" 1032 true = Logical(True) 1033 false = Logical(False) 1034 none = Logical(None) 1035 self.assertEqual(+true, 1) 1036 self.assertEqual(+false, 0) 1037 self.assertEqual(+none, none)
1038 - def test_abs(self):
1039 "abs()" 1040 true = Logical(True) 1041 false = Logical(False) 1042 none = Logical(None) 1043 self.assertEqual(abs(true), 1) 1044 self.assertEqual(abs(false), 0) 1045 self.assertEqual(abs(none), none)
1046 - def test_invert(self):
1047 "~ operator" 1048 true = Logical(True) 1049 false = Logical(False) 1050 none = Logical(None) 1051 self.assertEqual(~true, -2) 1052 self.assertEqual(~false, -1) 1053 self.assertEqual(~none, none)
1054
1055 - def test_complex(self):
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
1064 - def test_int(self):
1065 "int" 1066 true = Logical(True) 1067 false = Logical(False) 1068 none = Logical(None) 1069 self.assertEqual(int(true), 1) 1070 self.assertEqual(int(false), 0) 1071 self.assertRaises(ValueError, int, none)
1072 1073 if py_ver < (3, 0):
1074 - def test_long(self):
1075 "long" 1076 true = Logical(True) 1077 false = Logical(False) 1078 none = Logical(None) 1079 self.assertEqual(long(true), long(1)) 1080 self.assertEqual(long(false), long(0)) 1081 self.assertRaises(ValueError, long, none)
1082
1083 - def test_float(self):
1084 "float" 1085 true = Logical(True) 1086 false = Logical(False) 1087 none = Logical(None) 1088 self.assertEqual(float(true), 1.0) 1089 self.assertEqual(float(false), 0.0) 1090 self.assertRaises(ValueError, float, none)
1091
1092 - def test_oct(self):
1093 "oct" 1094 true = Logical(True) 1095 false = Logical(False) 1096 none = Logical(None) 1097 self.assertEqual(oct(true), oct(1)) 1098 self.assertEqual(oct(false), oct(0)) 1099 self.assertRaises(ValueError, oct, none)
1100
1101 - def test_hex(self):
1102 "hex" 1103 true = Logical(True) 1104 false = Logical(False) 1105 none = Logical(None) 1106 self.assertEqual(hex(true), hex(1)) 1107 self.assertEqual(hex(false), hex(0)) 1108 self.assertRaises(ValueError, hex, none)
1109
1110 - def test_addition(self):
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
1225 - def test_multiplication(self):
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)
1339 - def test_subtraction(self):
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
1454 - def test_division(self):
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)
1679 - def test_shift(self):
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
1905 - def test_pow(self):
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
2021 - def test_mod(self):
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
2137 - def test_divmod(self):
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
2171 -class TestQuantum(unittest.TestCase):
2172 "Testing Quantum"
2173 - def test_exceptions(self):
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
2181 - def test_other(self):
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
2225 - def test_true(self):
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
2263 - def test_false(self):
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
2301 - def test_singletons(self):
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
2313 - def test_or(self):
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)
2360 - def test_and(self):
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)
2407 - def test_xor(self):
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)
2433 - def test_implication_material(self):
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)
2459 - def test_implication_relevant(self):
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)
2486 - def test_nand(self):
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)
2505 - def test_negation(self):
2506 "negation" 2507 true = Quantum(True) 2508 false = Quantum(False) 2509 none = Quantum(None) 2510 self.assertEqual(-true, false) 2511 self.assertEqual(-false, true) 2512 self.assertEqual(-none is none, True)
2513
2514 -class TestExceptions(unittest.TestCase):
2515 - def setUp(self):
2516 self.tempdir = tempfile.mkdtemp()
2517
2518 - def tearDown(self):
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
2529 fields = [] 2530 for i in range(255): 2531 fields.append('a%03d C(10)' % i) 2532 Table(':test:', ';'.join(fields), on_disk=False) 2533 fields.append('a255 C(10)') 2534 self.assertRaises(DbfError, Table, ':test:', ';'.join(fields), on_disk=False)
2535
2537 fields = [] 2538 for i in range(255): 2539 fields.append('a%03d C(10)' % i) 2540 table = Table(':test:', ';'.join(fields), on_disk=False) 2541 table.open() 2542 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)')
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
2562 fields = [] 2563 for i in range(255): 2564 fields.append('a%03d C(10)' % i) 2565 table = Table(':test:', ';'.join(fields), on_disk=False) 2566 table.open() 2567 self.assertRaises(DbfError, table.allow_nulls, 'a001')
2568
2570 table = Table(':blah:', 'name C(50)', on_disk=False) 2571 self.assertRaises(DbfError, table.add_fields, 'name C(10)')
2572
2574 table = Table(':bleh:', 'name C(25)', on_disk=False) 2575 self.assertRaises(DbfError, table.delete_fields, 'age')
2576
2577 - def test_modify_packed_record(self):
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})
2587 - def test_read_only(self):
2588 table = Table(':ahhh:', 'name C(10)', on_disk=False) 2589 table.open(mode=dbf.READ_ONLY) 2590 self.assertRaises(DbfError, table.append, dict(name='uh uh!'))
2591 - def test_clipper(self):
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
2595 -class TestIndexLocation(unittest.TestCase):
2596 - def test_false(self):
2597 self.assertFalse(IndexLocation(0, False)) 2598 self.assertFalse(IndexLocation(42, False))
2599 - def test_true(self):
2600 self.assertTrue(IndexLocation(0, True)) 2601 self.assertTrue(IndexLocation(42, True))
2602
2603 -class TestDbfCreation(unittest.TestCase):
2604 - def setUp(self):
2605 self.tempdir = tempfile.mkdtemp()
2606
2607 - def tearDown(self):
2608 shutil.rmtree(self.tempdir, True)
2609 2610 "Testing table creation..."
2611 - def test_db3_memory_tables(self):
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]))
2620 - def test_db3_disk_tables(self):
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)
2635 - def test_clp_memory_tables(self):
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]))
2644 - def test_clp_disk_tables(self):
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)
2661 - def test_fp_memory_tables(self):
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)
2670 - def test_fp_disk_tables(self):
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)
2680 - def test_vfp_memory_tables(self):
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)
2692 - def test_vfp_disk_tables(self):
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)
2722 - def test_db3_ignore_memos(self):
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()
2732 - def test_fp_ignore_memos(self):
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()
2742 - def test_vfp_ignore_memos(self):
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()
2752 - def test_clp_ignore_memos(self):
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
2763 -class TestDbfRecords(unittest.TestCase):
2764 "Testing records" 2765
2766 - def setUp(self):
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
2780 - def tearDown(self):
2781 self.dbf_table.close() 2782 self.vfp_table.close() 2783 shutil.rmtree(self.tempdir, True)
2784
2785 - def test_slicing(self):
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])
2790 - def test_dbf_adding_records(self):
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 # plus a blank record 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))
2870 - def test_vfp_adding_records(self):
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 # plus a blank record 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
2995 - def test_char_memo_return_type(self):
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)
3025 - def test_empty_is_none(self):
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, '')
3058 - def test_custom_data_type(self):
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))
3103 - def test_datatypes_param(self):
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)
3131 - def test_null_type(self):
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
3195 - def test_nonascii_text_cptrans(self):
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 # def test_backup_of_different_codepage(self): 3223 # "check backups work when different codepage specified" 3224 # table = Table(':memory:', 'string M', dbf_type='db3', on_disk=False, codepage='utf8') 3225 # table.open() 3226 # weird = ''.join(chr(i) for i in range(256)) 3227 # if py_ver < (3, 0): 3228 # weird = weird.decode('latin-1') 3229 # table.append((weird,)) 3230 # table.codepage = CodePage('cp437') 3231 # self.assertRaises(UnicodeDecodeError, table.__getitem__, 0) 3232
3233 - def test_add_null_field(self):
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
3264 - def test_remove_null_field(self):
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
3294 - def test_change_null_field(self):
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 # plus a blank record 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
3346 - def test_add_field_to_null(self):
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
3381 - def test_remove_field_from_null(self):
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()
3415 - def test_flux_internal(self):
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
3456 -class TestDbfRecordTemplates(unittest.TestCase):
3457 "Testing records"
3458 - def setUp(self):
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
3472 - def tearDown(self):
3473 self.dbf_table.close() 3474 self.vfp_table.close() 3475 shutil.rmtree(self.tempdir, True)
3476
3477 - def test_dbf_storage(self):
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
3488 - def test_vfp_storage(self):
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
3506 -class TestDbfFunctions(unittest.TestCase):
3507 - def setUp(self):
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()
3581 - def tearDown(self):
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()
3796 - def test_len_contains_iter(self):
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
3820 - def test_undelete(self):
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 # Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3') 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 # delete every third record 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 # and verify 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 # check that deletes were saved to disk.. 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 # verify record numbers 3886 i = 0 3887 for record in table: 3888 self.assertEqual(dbf.recno(record), i) 3889 i += 1 3890 3891 # verify that deleted records are skipped 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 # verify that deleted records are skipped in slices 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 # verify behavior when all records are deleted 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 # verify deleted records are seen with active record index 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 # verify undelete using table[index] 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 # verify all records have been undeleted (recalled) 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 # find (brute force) 3951 unordered = [] 3952 for record in table: 3953 unordered.append(record.name) 3954 for word in unordered: # returns records 3955 # records = table.query("select * where name == %r" % word) 3956 # self.assertEqual(len(records), unordered.count(word)) 3957 records = [rec for rec in table if rec.name == word] 3958 self.assertEqual(len(records), unordered.count(word)) 3959 3960 # ordering by one field 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 # search (binary) 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 # records = table.query("select * where name == %r" % word) 3975 # self.assertEqual(len(records), unordered.count(word)) 3976 # records = dbf.pql(table, "select * where name == %r" % word) 3977 # self.assertEqual(len(records), unordered.count(word)) 3978 3979 # ordering by two fields 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 # search (binary) 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()
4013 - def test_scatter_gather_new(self):
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
4083 - def test_dbf_record_kamikaze(self):
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
4127 - def test_multiple_append(self):
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()
4165 - def test_slices(self):
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()
4189 - def test_record_reset(self):
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()
4205 - def test_adding_memos(self):
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()
4246 - def test_from_csv(self):
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
4304 - def test_resize(self):
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()
4319 - def test_memos_after_close(self):
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()
4336 - def test_field_type(self):
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
4352 - def test_memo_after_backup(self):
4353 "memo fields accessible after .backup()" 4354 table = self.dbf_table 4355 table.open() 4356 table.create_backup() 4357 backup = dbf.Table(table.backup) 4358 backup.open() 4359 desclist = self.dbf_desclist 4360 for i in range(len(desclist)): 4361 self.assertEqual(desclist[i], backup[i].desc) 4362 backup.close() 4363 table.close()
4364 - def test_write_loop(self):
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()
4373 - def test_export(self):
4374 for table in self.dbf_table, self.vfp_table: 4375 table.open() 4376 dbf.export(table, filename='test_export.csv')
4377 - def test_index_search(self):
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
4447 -class TestDbfNavigation(unittest.TestCase):
4448 - def setUp(self):
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()
4522 - def tearDown(self):
4523 self.dbf_table.close() 4524 self.vfp_table.close() 4525 shutil.rmtree(self.tempdir, True)
4526
4527 - def test_top(self):
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
4548 - def test_bottom(self):
4549 "bottom, current in Tables, Lists, and Indexes" 4550 table = self.dbf_table 4551 table.open() 4552 list = List(table) 4553 index = Index(table, key=lambda rec: dbf.recno(rec)) 4554 total = len(table) 4555 mid = total // 2 4556 table.goto(mid) 4557 list.goto(mid) 4558 index.goto(mid) 4559 self.assertTrue(table.current != -1) 4560 self.assertTrue(list.current != -1) 4561 self.assertTrue(index.current != -1) 4562 table.bottom() 4563 list.bottom() 4564 index.bottom() 4565 self.assertEqual(table.current, total) 4566 self.assertEqual(list.current, total) 4567 self.assertEqual(index.current, total)
4568
4569 - def test_goto(self):
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
4606 - def test_skip(self):
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
4631 - def test_first_record(self):
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
4646 - def test_prev_record(self):
4647 "prev_record in Tables, Lists, and Indexes" 4648 table = self.dbf_table 4649 table.open() 4650 list = List(table) 4651 index = Index(table, key=lambda rec: dbf.recno(rec)) 4652 total = len(table) 4653 mid = total // 2 4654 self.assertTrue(table[0] is list[0]) 4655 self.assertTrue(table[0] is index[0]) 4656 table.top() 4657 list.top() 4658 index.top() 4659 self.assertTrue(isinstance(table.prev_record, dbf.RecordVaporWare)) 4660 self.assertTrue(isinstance(list.prev_record, dbf.RecordVaporWare)) 4661 self.assertTrue(isinstance(index.prev_record, dbf.RecordVaporWare)) 4662 table.skip() 4663 list.skip() 4664 index.skip() 4665 self.assertTrue(isinstance(table.prev_record, dbf.RecordVaporWare)) 4666 self.assertTrue(isinstance(list.prev_record, dbf.RecordVaporWare)) 4667 self.assertTrue(isinstance(index.prev_record, dbf.RecordVaporWare)) 4668 table.skip() 4669 list.skip() 4670 index.skip() 4671 self.assertTrue(table.prev_record is table[0]) 4672 self.assertTrue(list.prev_record is table[0]) 4673 self.assertTrue(index.prev_record is table[0]) 4674 table.close()
4675
4676 - def test_current_record(self):
4677 "current_record in Tables, Lists, and Indexes" 4678 table = self.dbf_table 4679 table.open() 4680 list = List(table) 4681 index = Index(table, key=lambda rec: dbf.recno(rec)) 4682 total = len(table) 4683 mid = total // 2 4684 table.top() 4685 list.top() 4686 index.top() 4687 self.assertTrue(isinstance(table.current_record, dbf.RecordVaporWare)) 4688 self.assertTrue(isinstance(list.current_record, dbf.RecordVaporWare)) 4689 self.assertTrue(isinstance(index.current_record, dbf.RecordVaporWare)) 4690 table.bottom() 4691 list.bottom() 4692 index.bottom() 4693 self.assertTrue(isinstance(table.current_record, dbf.RecordVaporWare)) 4694 self.assertTrue(isinstance(list.current_record, dbf.RecordVaporWare)) 4695 self.assertTrue(isinstance(index.current_record, dbf.RecordVaporWare)) 4696 table.goto(mid) 4697 list.goto(mid) 4698 index.goto(mid) 4699 self.assertTrue(table.current_record is table[mid]) 4700 self.assertTrue(list.current_record is table[mid]) 4701 self.assertTrue(index.current_record is table[mid]) 4702 table.close()
4703
4704 - def test_next_record(self):
4705 "prev_record in Tables, Lists, and Indexes" 4706 table = self.dbf_table 4707 table.open() 4708 list = List(table) 4709 index = Index(table, key=lambda rec: dbf.recno(rec)) 4710 total = len(table) 4711 mid = total // 2 4712 self.assertTrue(table[0] is list[0]) 4713 self.assertTrue(table[0] is index[0]) 4714 table.bottom() 4715 list.bottom() 4716 index.bottom() 4717 self.assertTrue(isinstance(table.next_record, dbf.RecordVaporWare)) 4718 self.assertTrue(isinstance(list.next_record, dbf.RecordVaporWare)) 4719 self.assertTrue(isinstance(index.next_record, dbf.RecordVaporWare)) 4720 table.skip(-1) 4721 list.skip(-1) 4722 index.skip(-1) 4723 self.assertTrue(isinstance(table.next_record, dbf.RecordVaporWare)) 4724 self.assertTrue(isinstance(list.next_record, dbf.RecordVaporWare)) 4725 self.assertTrue(isinstance(index.next_record, dbf.RecordVaporWare)) 4726 table.skip(-1) 4727 list.skip(-1) 4728 index.skip(-1) 4729 self.assertTrue(table.next_record is table[-1]) 4730 self.assertTrue(list.next_record is table[-1]) 4731 self.assertTrue(index.next_record is table[-1]) 4732 table.close()
4733
4734 - def test_last_record(self):
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
4749 -class TestDbfLists(unittest.TestCase):
4750 "DbfList tests"
4751 - def setUp(self):
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()
4778 - def tearDown(self):
4779 self.dbf_table.close() 4780 shutil.rmtree(self.tempdir, True)
4781 - def test_exceptions(self):
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
4811 - def test_add_subtract(self):
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()
4830 - def test_append_extend(self):
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()
4846 - def test_index(self):
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()
4858 - def test_sort(self):
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()
4871 - def test_keys(self):
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()
4887 - def test_contains(self):
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
4902 -class TestWhatever(unittest.TestCase):
4903 "move tests here to run one at a time while debugging"
4904 - def setUp(self):
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()
4978 - def tearDown(self):
4979 self.dbf_table.close() 4980 self.vfp_table.close() 4981 shutil.rmtree(self.tempdir, True)
4982 # main 4983 if __name__ == '__main__': 4984 unittest.main() 4985