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  else: 
  19      unicode = str 
  20      xrange = range 
  21      dbf.LatinByte.export_to(module) 
  22  
 
  23  
 
  24  print("\nTesting dbf version %d.%02d.%03d on %s with Python %s\n" % (
 
  25      dbf.version + (sys.platform, sys.version) )) 
  26  
 
  27  
 
  28  # Walker in Leaves -- by Scot Noel -- http://www.scienceandfantasyfiction.com/sciencefiction/Walker-in-Leaves/walker-in-leaves.htm
 
  29  
 
  30  words = """
 
  31  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.
 
  32  Still one statue, not of stone, holds its lines against the passing years.
 
  33  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.
 
  34  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.
 
  35  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.
 
  36  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.
 
  37  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.
 
  38  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.
 
  39  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?
 
  40  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.
 
  41  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.
 
  42  How long ago was it that the floor was dry? The exactitude of such time, vast time, escapes her.
 
  43  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.
 
  44  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.
 
  45  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.
 
  46  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.
 
  47  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.
 
  48  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.
 
  49  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.
 
  50  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.
 
  51  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?
 
  52  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.
 
  53  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.
 
  54  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.
 
  55  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.
 
  56  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.
 
  57  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.
 
  58  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.
 
  59  To the west rise groves of oaks and grassland plains, beyond them, mountains that shrugged off civilization more easily than the rest.
 
  60  Where is the voyager in those leaves?
 
  61  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.
 
  62  "Walker!" she calls out. "Your love is dying. She mourns your absence."
 
  63  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.
 
  64  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.
 
  65  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.
 
  66  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.
 
  67  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.
 
  68  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.
 
  69  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.
 
  70  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.
 
  71  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?
 
  72  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.
 
  73  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.
 
  74  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.
 
  75  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.
 
  76  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.
 
  77  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.
 
  78  All this time, Maya s thoughts remain clear, and the giving of comfort comforts her as well.
 
  79  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.
 
  80  "I ll take it easy like, an  stay around de house this winter," her father said. "There s carpenter work for me to do."
 
  81  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.
 
  82  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.
 
  83  It s good to be home, she thinks at first, then: where is the walker in those leaves?
 
  84  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.
 
  85  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.
 
  86  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.
 
  87  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.
 
  88  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.
 
  89  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.
 
  90  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.
 
  91  THE END""".split() 
  92  
 
  93  # data
 
  94  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] 
  95  floats = [] 
  96  last = 1 
  97  for number in numbers: 
  98      floats.append(float(number ** 2 / last)) 
  99      last = number 
100 101 -def permutate(Xs, N):
102 if N <= 0: 103 yield [] 104 return 105 for x in Xs: 106 for sub in permutate(Xs, N-1): 107 result = [x]+sub # don't allow duplicates 108 for item in result: 109 if result.count(item) > 1: 110 break 111 else: 112 yield result
113
114 -def combinate(Xs, N):
115 """Generate combinations of N items from list Xs""" 116 if N == 0: 117 yield [] 118 return 119 for i in xrange(len(Xs)-N+1): 120 for r in combinate(Xs[i+1:], N-1): 121 yield [Xs[i]] + r
122
123 -def index(sequence):
124 "returns integers 0 - len(sequence)" 125 for i in xrange(len(sequence)): 126 yield i
127
128 # tests 129 -def active(rec):
130 if is_deleted(rec): 131 return DoNotIndex 132 return dbf.recno(rec)
133 -def inactive(rec):
134 if is_deleted(rec): 135 return recno(rec) 136 return DoNotIndex
137
138 -class TestChar(unittest.TestCase):
139 - def test_exceptions(self):
140 "exceptions" 141 self.assertRaises(ValueError, Char, 7) 142 self.assertRaises(ValueError, Char, ['nope']) 143 self.assertRaises(ValueError, Char, True) 144 self.assertRaises(ValueError, Char, False) 145 self.assertRaises(ValueError, Char, type) 146 self.assertRaises(ValueError, Char, str) 147 self.assertRaises(ValueError, Char, None)
148 - def test_bools_and_none(self):
149 "booleans and None" 150 empty = Char() 151 self.assertFalse(bool(empty)) 152 one = Char(' ') 153 self.assertFalse(bool(one)) 154 actual = Char('1') 155 self.assertTrue(bool(actual))
156 - def test_equality(self):
157 "equality" 158 a1 = Char('a') 159 a2 = 'a ' 160 self.assertEqual(a1, a2) 161 self.assertEqual(a2, a1) 162 a3 = 'a ' 163 a4 = Char('a ') 164 self.assertEqual(a3, a4) 165 self.assertEqual(a4, a3)
166 - def test_inequality(self):
167 "inequality" 168 a1 = Char('ab ') 169 a2 = 'a b' 170 self.assertNotEqual(a1, a2) 171 self.assertNotEqual(a2, a1) 172 a3 = 'ab ' 173 a4 = Char('a b') 174 self.assertNotEqual(a3, a4) 175 self.assertNotEqual(a4, a3)
176 - def test_less_than(self):
177 "less-than" 178 a1 = Char('a') 179 a2 = 'a ' 180 self.assertFalse(a1 < a2) 181 self.assertFalse(a2 < a1) 182 a3 = 'a ' 183 a4 = Char('a ') 184 self.assertFalse(a3 < a4) 185 self.assertFalse(a4 < a3) 186 a5 = 'abcd' 187 a6 = 'abce' 188 self.assertTrue(a5 < a6) 189 self.assertFalse(a6 < a5)
190 - def test_less_than_equal(self):
191 "less-than or equal" 192 a1 = Char('a') 193 a2 = 'a ' 194 self.assertTrue(a1 <= a2) 195 self.assertTrue(a2 <= a1) 196 a3 = 'a ' 197 a4 = Char('a ') 198 self.assertTrue(a3 <= a4) 199 self.assertTrue(a4 <= a3) 200 a5 = 'abcd' 201 a6 = 'abce' 202 self.assertTrue(a5 <= a6) 203 self.assertFalse(a6 <= a5)
204 - def test_greater_than(self):
205 "greater-than or equal" 206 a1 = Char('a') 207 a2 = 'a ' 208 self.assertTrue(a1 >= a2) 209 self.assertTrue(a2 >= a1) 210 a3 = 'a ' 211 a4 = Char('a ') 212 self.assertTrue(a3 >= a4) 213 self.assertTrue(a4 >= a3) 214 a5 = 'abcd' 215 a6 = 'abce' 216 self.assertFalse(a5 >= a6) 217 self.assertTrue(a6 >= a5)
218 - def test_greater_than_equal(self):
219 "greater-than" 220 a1 = Char('a') 221 a2 = 'a ' 222 self.assertFalse(a1 > a2) 223 self.assertFalse(a2 > a1) 224 a3 = 'a ' 225 a4 = Char('a ') 226 self.assertFalse(a3 > a4) 227 self.assertFalse(a4 > a3) 228 a5 = 'abcd' 229 a6 = 'abce' 230 self.assertFalse(a5 > a6) 231 self.assertTrue(a6 > a5)
232
233 -class TestDateTime(unittest.TestCase):
234 "Testing Date"
235 - def test_date_creation(self):
236 "Date creation" 237 date0 = Date() 238 date1 = Date() 239 date2 = Date.fromymd(' ') 240 date5 = Date.fromordinal(0) 241 date6 = Date.today() 242 date7 = Date.max 243 date8 = Date.min 244 self.assertRaises(ValueError, Date.fromymd, '00000') 245 self.assertRaises(ValueError, Date.fromymd, '00000000') 246 self.assertRaises(ValueError, Date, 0, 0, 0)
247 - def test_date_compare(self):
248 "Date comparisons" 249 nodate1 = Date() 250 nodate2 = Date() 251 date1 = Date.fromordinal(1000) 252 date2 = Date.fromordinal(2000) 253 date3 = Date.fromordinal(3000) 254 self.compareTimes(nodate1, nodate2, date1, date2, date3)
255
256 - def test_datetime_creation(self):
257 "DateTime creation" 258 datetime0 = DateTime() 259 datetime1 = DateTime() 260 datetime5 = DateTime.fromordinal(0) 261 datetime6 = DateTime.today() 262 datetime7 = DateTime.max 263 datetime8 = DateTime.min
264 - def test_datetime_compare(self):
265 "DateTime comparisons" 266 nodatetime1 = DateTime() 267 nodatetime2 = DateTime() 268 datetime1 = Date.fromordinal(1000) 269 datetime2 = Date.fromordinal(20000) 270 datetime3 = Date.fromordinal(300000) 271 self.compareTimes(nodatetime1, nodatetime2, datetime1, datetime2, datetime3)
272
273 - def test_datetime_replace(self):
274 "DateTime replacements" 275 datetime_target = DateTime(2001, 5, 31, 23, 59, 59, 999000) 276 datetime1 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999230) 277 datetime2 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999500) 278 datetime3 = datetime.datetime(2001, 5, 31, 23, 59, 59, 999728) 279 original_datetime = datetime.datetime 280 for dt in (datetime1, datetime2, datetime3): 281 class DateTimeNow(datetime.datetime): 282 @classmethod 283 def now(self): 284 datetime.datetime = original_datetime 285 return dt
286 datetime.datetime = DateTimeNow 287 result = DateTime.now() 288 self.assertEqual(result, datetime_target, 'in: %r out: %r desired: %r' % (dt, result, datetime_target)) 289 290
291 - def test_time_creation(self):
292 "Time creation" 293 time0 = Time() 294 time1 = Time() 295 time7 = Time.max 296 time8 = Time.min
297 - def test_time_compare(self):
298 "Time comparisons" 299 notime1 = Time() 300 notime2 = Time() 301 time1 = Date.fromordinal(1000) 302 time2 = Date.fromordinal(2000) 303 time3 = Date.fromordinal(3000) 304 self.compareTimes(notime1, notime2, time1, time2, time3)
305 - def test_arithmetic(self):
306 "Date, DateTime, & Time Arithmetic" 307 one_day = datetime.timedelta(1) 308 a_day = Date(1970, 5, 20) 309 self.assertEqual(a_day + one_day, Date(1970, 5, 21)) 310 self.assertEqual(a_day - one_day, Date(1970, 5, 19)) 311 self.assertEqual(datetime.date(1970, 5, 21) - a_day, one_day) 312 a_time = Time(12) 313 one_second = datetime.timedelta(0, 1, 0) 314 self.assertEqual(a_time + one_second, Time(12, 0, 1)) 315 self.assertEqual(a_time - one_second, Time(11, 59, 59)) 316 self.assertEqual(datetime.time(12, 0, 1) - a_time, one_second) 317 an_appt = DateTime(2012, 4, 15, 12, 30, 00) 318 displacement = datetime.timedelta(1, 60*60*2+60*15) 319 self.assertEqual(an_appt + displacement, DateTime(2012, 4, 16, 14, 45, 0)) 320 self.assertEqual(an_appt - displacement, DateTime(2012, 4, 14, 10, 15, 0)) 321 self.assertEqual(datetime.datetime(2012, 4, 16, 14, 45, 0) - an_appt, displacement)
322 - def test_none_compare(self):
323 "comparisons to None" 324 empty_date = Date() 325 empty_time = Time() 326 empty_datetime = DateTime() 327 self.assertEqual(empty_date, None) 328 self.assertEqual(empty_time, None) 329 self.assertEqual(empty_datetime, None)
330 - def test_singletons(self):
331 "singletons" 332 empty_date = Date() 333 empty_time = Time() 334 empty_datetime = DateTime() 335 self.assertTrue(empty_date is NullDate) 336 self.assertTrue(empty_time is NullTime) 337 self.assertTrue(empty_datetime is NullDateTime)
338 - def test_boolean_value(self):
339 "boolean evaluation" 340 empty_date = Date() 341 empty_time = Time() 342 empty_datetime = DateTime() 343 self.assertEqual(bool(empty_date), False) 344 self.assertEqual(bool(empty_time), False) 345 self.assertEqual(bool(empty_datetime), False) 346 actual_date = Date.today() 347 actual_time = Time.now() 348 actual_datetime = DateTime.now() 349 self.assertEqual(bool(actual_date), True) 350 self.assertEqual(bool(actual_time), True) 351 self.assertEqual(bool(actual_datetime), True)
352 - def compareTimes(self, empty1, empty2, uno, dos, tres):
353 self.assertEqual(empty1, empty2) 354 self.assertEqual(uno < dos, True) 355 self.assertEqual(uno <= dos, True) 356 self.assertEqual(dos <= dos, True) 357 self.assertEqual(dos <= tres, True) 358 self.assertEqual(dos < tres, True) 359 self.assertEqual(tres <= tres, True) 360 self.assertEqual(uno == uno, True) 361 self.assertEqual(dos == dos, True) 362 self.assertEqual(tres == tres, True) 363 self.assertEqual(uno != dos, True) 364 self.assertEqual(dos != tres, True) 365 self.assertEqual(tres != uno, True) 366 self.assertEqual(tres >= tres, True) 367 self.assertEqual(tres > dos, True) 368 self.assertEqual(dos >= dos, True) 369 self.assertEqual(dos >= uno, True) 370 self.assertEqual(dos > uno, True) 371 self.assertEqual(uno >= uno, True) 372 self.assertEqual(uno >= dos, False) 373 self.assertEqual(uno >= tres, False) 374 self.assertEqual(dos >= tres, False) 375 self.assertEqual(tres <= dos, False) 376 self.assertEqual(tres <= uno, False) 377 self.assertEqual(tres < tres, False) 378 self.assertEqual(tres < dos, False) 379 self.assertEqual(tres < uno, False) 380 self.assertEqual(dos < dos, False) 381 self.assertEqual(dos < uno, False) 382 self.assertEqual(uno < uno, False) 383 self.assertEqual(uno == dos, False) 384 self.assertEqual(uno == tres, False) 385 self.assertEqual(dos == uno, False) 386 self.assertEqual(dos == tres, False) 387 self.assertEqual(tres == uno, False) 388 self.assertEqual(tres == dos, False) 389 self.assertEqual(uno != uno, False) 390 self.assertEqual(dos != dos, False) 391 self.assertEqual(tres != tres, False)
392
393 -class TestNull(unittest.TestCase):
394 - def test_all(self):
395 null = Null = dbf.Null() 396 self.assertTrue(null is dbf.Null()) 397 398 self.assertTrue(null + 1 is Null) 399 self.assertTrue(1 + null is Null) 400 null += 4 401 self.assertTrue(null is Null) 402 value = 5 403 value += null 404 self.assertTrue(value is Null) 405 406 self.assertTrue(null - 2 is Null) 407 self.assertTrue(2 - null is Null) 408 null -= 5 409 self.assertTrue(null is Null) 410 value = 6 411 value -= null 412 self.assertTrue(value is Null) 413 414 self.assertTrue(null / 0 is Null) 415 self.assertTrue(3 / null is Null) 416 null /= 6 417 self.assertTrue(null is Null) 418 value = 7 419 value /= null 420 self.assertTrue(value is Null) 421 422 self.assertTrue(null * -3 is Null) 423 self.assertTrue(4 * null is Null) 424 null *= 7 425 self.assertTrue(null is Null) 426 value = 8 427 value *= null 428 self.assertTrue(value is Null) 429 430 self.assertTrue(null % 1 is Null) 431 self.assertTrue(7 % null is Null) 432 null %= 1 433 self.assertTrue(null is Null) 434 value = 9 435 value %= null 436 self.assertTrue(value is Null) 437 438 self.assertTrue(null ** 2 is Null) 439 self.assertTrue(4 ** null is Null) 440 null **= 3 441 self.assertTrue(null is Null) 442 value = 9 443 value **= null 444 self.assertTrue(value is Null) 445 446 self.assertTrue(null & 1 is Null) 447 self.assertTrue(1 & null is Null) 448 null &= 1 449 self.assertTrue(null is Null) 450 value = 1 451 value &= null 452 self.assertTrue(value is Null) 453 454 self.assertTrue(null ^ 1 is Null) 455 self.assertTrue(1 ^ null is Null) 456 null ^= 1 457 self.assertTrue(null is Null) 458 value = 1 459 value ^= null 460 self.assertTrue(value is Null) 461 462 self.assertTrue(null | 1 is Null) 463 self.assertTrue(1 | null is Null) 464 null |= 1 465 self.assertTrue(null is Null) 466 value = 1 467 value |= null 468 self.assertTrue(value is Null) 469 470 self.assertTrue(str(divmod(null, 1)) == '(<null>, <null>)') 471 self.assertTrue(str(divmod(1, null)) == '(<null>, <null>)') 472 473 self.assertTrue(null << 1 is Null) 474 self.assertTrue(2 << null is Null) 475 null <<=3 476 self.assertTrue(null is Null) 477 value = 9 478 value <<= null 479 self.assertTrue(value is Null) 480 481 self.assertTrue(null >> 1 is Null) 482 self.assertTrue(2 >> null is Null) 483 null >>= 3 484 self.assertTrue(null is Null) 485 value = 9 486 value >>= null 487 self.assertTrue(value is Null) 488 489 self.assertTrue(-null is Null) 490 self.assertTrue(+null is Null) 491 self.assertTrue(abs(null) is Null) 492 self.assertTrue(~null is Null) 493 494 self.assertTrue(null.attr is Null) 495 self.assertTrue(null() is Null) 496 self.assertTrue(getattr(null, 'fake') is Null) 497 498 self.assertRaises(TypeError, hash, null)
499
500 -class TestLogical(unittest.TestCase):
501 "Testing Logical"
502 - def test_unknown(self):
503 "Unknown" 504 for unk in '', '?', ' ', None, Null, Unknown, Other: 505 huh = unknown = Logical(unk) 506 self.assertEqual(huh == None, True, "huh is %r from %r, which is not None" % (huh, unk)) 507 self.assertEqual(huh != None, False, "huh is %r from %r, which is not None" % (huh, unk)) 508 self.assertEqual(huh != True, True, "huh is %r from %r, which is not None" % (huh, unk)) 509 self.assertEqual(huh == True, False, "huh is %r from %r, which is not None" % (huh, unk)) 510 self.assertEqual(huh != False, True, "huh is %r from %r, which is not None" % (huh, unk)) 511 self.assertEqual(huh == False, False, "huh is %r from %r, which is not None" % (huh, unk)) 512 if py_ver >= (2, 5): 513 self.assertRaises(ValueError, lambda : (0, 1, 2)[huh])
514 - def test_true(self):
515 "true" 516 for true in 'True', 'yes', 't', 'Y', 7, ['blah']: 517 huh = Logical(true) 518 self.assertEqual(huh == True, True) 519 self.assertEqual(huh != True, False) 520 self.assertEqual(huh == False, False, "%r is not True" % true) 521 self.assertEqual(huh != False, True) 522 self.assertEqual(huh == None, False) 523 self.assertEqual(huh != None, True) 524 if py_ver >= (2, 5): 525 self.assertEqual((0, 1, 2)[huh], 1)
526 - def test_false(self):
527 "false" 528 for false in 'false', 'No', 'F', 'n', 0, []: 529 huh = Logical(false) 530 self.assertEqual(huh != False, False) 531 self.assertEqual(huh == False, True) 532 self.assertEqual(huh != True, True) 533 self.assertEqual(huh == True, False) 534 self.assertEqual(huh != None, True) 535 self.assertEqual(huh == None, False) 536 if py_ver >= (2, 5): 537 self.assertEqual((0, 1, 2)[huh], 0)
538 - def test_singletons(self):
539 "singletons" 540 heh = Logical(True) 541 hah = Logical('Yes') 542 ick = Logical(False) 543 ack = Logical([]) 544 unk = Logical('?') 545 bla = Logical(None) 546 self.assertEqual(heh is hah, True) 547 self.assertEqual(ick is ack, True) 548 self.assertEqual(unk is bla, True)
549 - def test_error(self):
550 "errors" 551 self.assertRaises(ValueError, Logical, 'wrong')
552 - def test_and(self):
553 "and" 554 true = Logical(True) 555 false = Logical(False) 556 unknown = Logical(None) 557 self.assertEqual((true & true) is true, True) 558 self.assertEqual((true & false) is false, True) 559 self.assertEqual((false & true) is false, True) 560 self.assertEqual((false & false) is false, True) 561 self.assertEqual((true & unknown) is unknown, True) 562 self.assertEqual((false & unknown) is false, True) 563 self.assertEqual((unknown & true) is unknown, True) 564 self.assertEqual((unknown & false) is false, True) 565 self.assertEqual((unknown & unknown) is unknown, True) 566 self.assertEqual((true & True) is true, True) 567 self.assertEqual((true & False) is false, True) 568 self.assertEqual((false & True) is false, True) 569 self.assertEqual((false & False) is false, True) 570 self.assertEqual((true & None) is unknown, True) 571 self.assertEqual((false & None) is false, True) 572 self.assertEqual((unknown & True) is unknown, True) 573 self.assertEqual((unknown & False) is false, True) 574 self.assertEqual((unknown & None) is unknown, True) 575 self.assertEqual((True & true) is true, True) 576 self.assertEqual((True & false) is false, True) 577 self.assertEqual((False & true) is false, True) 578 self.assertEqual((False & false) is false, True) 579 self.assertEqual((True & unknown) is unknown, True) 580 self.assertEqual((False & unknown) is false, True) 581 self.assertEqual((None & true) is unknown, True) 582 self.assertEqual((None & false) is false, True) 583 self.assertEqual((None & unknown) is unknown, True) 584 self.assertEqual(type(true & 0), int) 585 self.assertEqual(true & 0, 0) 586 self.assertEqual(type(true & 3), int) 587 self.assertEqual(true & 3, 1) 588 self.assertEqual(type(false & 0), int) 589 self.assertEqual(false & 0, 0) 590 self.assertEqual(type(false & 2), int) 591 self.assertEqual(false & 2, 0) 592 self.assertEqual(type(unknown & 0), int) 593 self.assertEqual(unknown & 0, 0) 594 self.assertEqual(unknown & 2, unknown) 595 596 t = true 597 t &= true 598 self.assertEqual(t is true, True) 599 t = true 600 t &= false 601 self.assertEqual(t is false, True) 602 f = false 603 f &= true 604 self.assertEqual(f is false, True) 605 f = false 606 f &= false 607 self.assertEqual(f is false, True) 608 t = true 609 t &= unknown 610 self.assertEqual(t is unknown, True) 611 f = false 612 f &= unknown 613 self.assertEqual(f is false, True) 614 u = unknown 615 u &= true 616 self.assertEqual(u is unknown, True) 617 u = unknown 618 u &= false 619 self.assertEqual(u is false, True) 620 u = unknown 621 u &= unknown 622 self.assertEqual(u is unknown, True) 623 t = true 624 t &= True 625 self.assertEqual(t is true, True) 626 t = true 627 t &= False 628 self.assertEqual(t is false, True) 629 f = false 630 f &= True 631 self.assertEqual(f is false, True) 632 f = false 633 f &= False 634 self.assertEqual(f is false, True) 635 t = true 636 t &= None 637 self.assertEqual(t is unknown, True) 638 f = false 639 f &= None 640 self.assertEqual(f is false, True) 641 u = unknown 642 u &= True 643 self.assertEqual(u is unknown, True) 644 u = unknown 645 u &= False 646 self.assertEqual(u is false, True) 647 u = unknown 648 u &= None 649 self.assertEqual(u is unknown, True) 650 t = True 651 t &= true 652 self.assertEqual(t is true, True) 653 t = True 654 t &= false 655 self.assertEqual(t is false, True) 656 f = False 657 f &= true 658 self.assertEqual(f is false, True) 659 f = False 660 f &= false 661 self.assertEqual(f is false, True) 662 t = True 663 t &= unknown 664 self.assertEqual(t is unknown, True) 665 f = False 666 f &= unknown 667 self.assertEqual(f is false, True) 668 u = None 669 u &= true 670 self.assertEqual(u is unknown, True) 671 u = None 672 u &= false 673 self.assertEqual(u is false, True) 674 u = None 675 u &= unknown 676 self.assertEqual(u is unknown, True) 677 t = true 678 t &= 0 679 self.assertEqual(type(true & 0), int) 680 t = true 681 t &= 0 682 self.assertEqual(true & 0, 0) 683 t = true 684 t &= 3 685 self.assertEqual(type(true & 3), int) 686 t = true 687 t &= 3 688 self.assertEqual(true & 3, 1) 689 f = false 690 f &= 0 691 self.assertEqual(type(false & 0), int) 692 f = false 693 f &= 0 694 self.assertEqual(false & 0, 0) 695 f = false 696 f &= 2 697 self.assertEqual(type(false & 2), int) 698 f = false 699 f &= 2 700 self.assertEqual(false & 2, 0) 701 u = unknown 702 u &= 0 703 self.assertEqual(type(unknown & 0), int) 704 u = unknown 705 u &= 0 706 self.assertEqual(unknown & 0, 0) 707 u = unknown 708 u &= 2 709 self.assertEqual(unknown & 2, unknown)
710
711 - def test_or(self):
712 "or" 713 true = Logical(True) 714 false = Logical(False) 715 unknown = Logical(None) 716 self.assertEqual((true | true) is true, True) 717 self.assertEqual((true | false) is true, True) 718 self.assertEqual((false | true) is true, True) 719 self.assertEqual((false | false) is false, True) 720 self.assertEqual((true | unknown) is true, True) 721 self.assertEqual((false | unknown) is unknown, True) 722 self.assertEqual((unknown | true) is true, True) 723 self.assertEqual((unknown | false) is unknown, True) 724 self.assertEqual((unknown | unknown) is unknown, True) 725 self.assertEqual((true | True) is true, True) 726 self.assertEqual((true | False) is true, True) 727 self.assertEqual((false | True) is true, True) 728 self.assertEqual((false | False) is false, True) 729 self.assertEqual((true | None) is true, True) 730 self.assertEqual((false | None) is unknown, True) 731 self.assertEqual((unknown | True) is true, True) 732 self.assertEqual((unknown | False) is unknown, True) 733 self.assertEqual((unknown | None) is unknown, True) 734 self.assertEqual((True | true) is true, True) 735 self.assertEqual((True | false) is true, True) 736 self.assertEqual((False | true) is true, True) 737 self.assertEqual((False | false) is false, True) 738 self.assertEqual((True | unknown) is true, True) 739 self.assertEqual((False | unknown) is unknown, True) 740 self.assertEqual((None | true) is true, True) 741 self.assertEqual((None | false) is unknown, True) 742 self.assertEqual((None | unknown) is unknown, True) 743 self.assertEqual(type(true | 0), int) 744 self.assertEqual(true | 0, 1) 745 self.assertEqual(type(true | 2), int) 746 self.assertEqual(true | 2, 3) 747 self.assertEqual(type(false | 0), int) 748 self.assertEqual(false | 0, 0) 749 self.assertEqual(type(false | 2), int) 750 self.assertEqual(false | 2, 2) 751 self.assertEqual(unknown | 0, unknown) 752 self.assertEqual(unknown | 2, unknown) 753 754 t = true 755 t |= true 756 self.assertEqual(t is true, True) 757 t = true 758 t |= false 759 self.assertEqual(t is true, True) 760 f = false 761 f |= true 762 self.assertEqual(f is true, True) 763 f = false 764 f |= false 765 self.assertEqual(f is false, True) 766 t = true 767 t |= unknown 768 self.assertEqual(t is true, True) 769 f = false 770 f |= unknown 771 self.assertEqual(f is unknown, True) 772 u = unknown 773 u |= true 774 self.assertEqual(u is true, True) 775 u = unknown 776 u |= false 777 self.assertEqual(u is unknown, True) 778 u = unknown 779 u |= unknown 780 self.assertEqual(u is unknown, True) 781 t = true 782 t |= True 783 self.assertEqual(t is true, True) 784 t = true 785 t |= False 786 self.assertEqual(t is true, True) 787 f = false 788 f |= True 789 self.assertEqual(f is true, True) 790 f = false 791 f |= False 792 self.assertEqual(f is false, True) 793 t = true 794 t |= None 795 self.assertEqual(t is true, True) 796 f = false 797 f |= None 798 self.assertEqual(f is unknown, True) 799 u = unknown 800 u |= True 801 self.assertEqual(u is true, True) 802 u = unknown 803 u |= False 804 self.assertEqual(u is unknown, True) 805 u = unknown 806 u |= None 807 self.assertEqual(u is unknown, True) 808 t = True 809 t |= true 810 self.assertEqual(t is true, True) 811 t = True 812 t |= false 813 self.assertEqual(t is true, True) 814 f = False 815 f |= true 816 self.assertEqual(f is true, True) 817 f = False 818 f |= false 819 self.assertEqual(f is false, True) 820 t = True 821 t |= unknown 822 self.assertEqual(t is true, True) 823 f = False 824 f |= unknown 825 self.assertEqual(f is unknown, True) 826 u = None 827 u |= true 828 self.assertEqual(u is true, True) 829 u = None 830 u |= false 831 self.assertEqual(u is unknown, True) 832 u = None 833 u |= unknown 834 self.assertEqual(u is unknown, True) 835 t = true 836 t |= 0 837 self.assertEqual(type(t), int) 838 t = true 839 t |= 0 840 self.assertEqual(t, 1) 841 t = true 842 t |= 2 843 self.assertEqual(type(t), int) 844 t = true 845 t |= 2 846 self.assertEqual(t, 3) 847 f = false 848 f |= 0 849 self.assertEqual(type(f), int) 850 f = false 851 f |= 0 852 self.assertEqual(f, 0) 853 f = false 854 f |= 2 855 self.assertEqual(type(f), int) 856 f = false 857 f |= 2 858 self.assertEqual(f, 2) 859 u = unknown 860 u |= 0 861 self.assertEqual(u, unknown)
862
863 - def test_xor(self):
864 "xor" 865 true = Logical(True) 866 false = Logical(False) 867 unknown = Logical(None) 868 self.assertEqual((true ^ true) is false, True) 869 self.assertEqual((true ^ false) is true, True) 870 self.assertEqual((false ^ true) is true, True) 871 self.assertEqual((false ^ false) is false, True) 872 self.assertEqual((true ^ unknown) is unknown, True) 873 self.assertEqual((false ^ unknown) is unknown, True) 874 self.assertEqual((unknown ^ true) is unknown, True) 875 self.assertEqual((unknown ^ false) is unknown, True) 876 self.assertEqual((unknown ^ unknown) is unknown, True) 877 self.assertEqual((true ^ True) is false, True) 878 self.assertEqual((true ^ False) is true, True) 879 self.assertEqual((false ^ True) is true, True) 880 self.assertEqual((false ^ False) is false, True) 881 self.assertEqual((true ^ None) is unknown, True) 882 self.assertEqual((false ^ None) is unknown, True) 883 self.assertEqual((unknown ^ True) is unknown, True) 884 self.assertEqual((unknown ^ False) is unknown, True) 885 self.assertEqual((unknown ^ None) is unknown, True) 886 self.assertEqual((True ^ true) is false, True) 887 self.assertEqual((True ^ false) is true, True) 888 self.assertEqual((False ^ true) is true, True) 889 self.assertEqual((False ^ false) is false, True) 890 self.assertEqual((True ^ unknown) is unknown, True) 891 self.assertEqual((False ^ unknown) is unknown, True) 892 self.assertEqual((None ^ true) is unknown, True) 893 self.assertEqual((None ^ false) is unknown, True) 894 self.assertEqual((None ^ unknown) is unknown, True) 895 self.assertEqual(type(true ^ 2), int) 896 self.assertEqual(true ^ 2, 3) 897 self.assertEqual(type(true ^ 0), int) 898 self.assertEqual(true ^ 0, 1) 899 self.assertEqual(type(false ^ 0), int) 900 self.assertEqual(false ^ 0, 0) 901 self.assertEqual(type(false ^ 2), int) 902 self.assertEqual(false ^ 2, 2) 903 self.assertEqual(unknown ^ 0, unknown) 904 self.assertEqual(unknown ^ 2, unknown) 905 906 t = true 907 t ^= true 908 self.assertEqual(t is false, True) 909 t = true 910 t ^= false 911 self.assertEqual(t is true, True) 912 f = false 913 f ^= true 914 self.assertEqual(f is true, True) 915 f = false 916 f ^= false 917 self.assertEqual(f is false, True) 918 t = true 919 t ^= unknown 920 self.assertEqual(t is unknown, True) 921 f = false 922 f ^= unknown 923 self.assertEqual(f is unknown, True) 924 u = unknown 925 u ^= true 926 self.assertEqual(u is unknown, True) 927 u = unknown 928 u ^= false 929 self.assertEqual(u is unknown, True) 930 u = unknown 931 u ^= unknown 932 self.assertEqual(u is unknown, True) 933 t = true 934 t ^= True 935 self.assertEqual(t is false, True) 936 t = true 937 t ^= False 938 self.assertEqual(t is true, True) 939 f = false 940 f ^= True 941 self.assertEqual(f is true, True) 942 f = false 943 f ^= False 944 self.assertEqual(f is false, True) 945 t = true 946 t ^= None 947 self.assertEqual(t is unknown, True) 948 f = false 949 f ^= None 950 self.assertEqual(f is unknown, True) 951 u = unknown 952 u ^= True 953 self.assertEqual(u is unknown, True) 954 u = unknown 955 u ^= False 956 self.assertEqual(u is unknown, True) 957 u = unknown 958 u ^= None 959 self.assertEqual(u is unknown, True) 960 t = True 961 t ^= true 962 self.assertEqual(t is false, True) 963 t = True 964 t ^= false 965 self.assertEqual(t is true, True) 966 f = False 967 f ^= true 968 self.assertEqual(f is true, True) 969 f = False 970 f ^= false 971 self.assertEqual(f is false, True) 972 t = True 973 t ^= unknown 974 self.assertEqual(t is unknown, True) 975 f = False 976 f ^= unknown 977 self.assertEqual(f is unknown, True) 978 u = None 979 u ^= true 980 self.assertEqual(u is unknown, True) 981 u = None 982 u ^= false 983 self.assertEqual(u is unknown, True) 984 u = None 985 u ^= unknown 986 self.assertEqual(u is unknown, True) 987 t = true 988 t ^= 0 989 self.assertEqual(type(true ^ 0), int) 990 t = true 991 t ^= 0 992 self.assertEqual(true ^ 0, 1) 993 t = true 994 t ^= 2 995 self.assertEqual(type(true ^ 2), int) 996 t = true 997 t ^= 2 998 self.assertEqual(true ^ 2, 3) 999 f = false 1000 f ^= 0 1001 self.assertEqual(type(false ^ 0), int) 1002 f = false 1003 f ^= 0 1004 self.assertEqual(false ^ 0, 0) 1005 f = false 1006 f ^= 2 1007 self.assertEqual(type(false ^ 2), int) 1008 f = false 1009 f ^= 2 1010 self.assertEqual(false ^ 2, 2) 1011 u = unknown 1012 u ^= 0 1013 self.assertEqual(unknown ^ 0, unknown) 1014 u = unknown 1015 u ^= 2 1016 self.assertEqual(unknown ^ 2, unknown)
1017
1018 - def test_negation(self):
1019 "negation" 1020 true = Logical(True) 1021 false = Logical(False) 1022 none = Logical(None) 1023 self.assertEqual(-true, -1) 1024 self.assertEqual(-false, 0) 1025 self.assertEqual(-none, none)
1026 - def test_posation(self):
1027 "posation" 1028 true = Logical(True) 1029 false = Logical(False) 1030 none = Logical(None) 1031 self.assertEqual(+true, 1) 1032 self.assertEqual(+false, 0) 1033 self.assertEqual(+none, none)
1034 - def test_abs(self):
1035 "abs()" 1036 true = Logical(True) 1037 false = Logical(False) 1038 none = Logical(None) 1039 self.assertEqual(abs(true), 1) 1040 self.assertEqual(abs(false), 0) 1041 self.assertEqual(abs(none), none)
1042 - def test_invert(self):
1043 "~ operator" 1044 true = Logical(True) 1045 false = Logical(False) 1046 none = Logical(None) 1047 self.assertEqual(~true, -2) 1048 self.assertEqual(~false, -1) 1049 self.assertEqual(~none, none)
1050
1051 - def test_complex(self):
1052 "complex" 1053 true = Logical(True) 1054 false = Logical(False) 1055 none = Logical(None) 1056 self.assertEqual(complex(true), complex(1)) 1057 self.assertEqual(complex(false), complex(0)) 1058 self.assertRaises(ValueError, complex, none)
1059
1060 - def test_int(self):
1061 "int" 1062 true = Logical(True) 1063 false = Logical(False) 1064 none = Logical(None) 1065 self.assertEqual(int(true), 1) 1066 self.assertEqual(int(false), 0) 1067 self.assertRaises(ValueError, int, none)
1068 1069 if py_ver < (3, 0):
1070 - def test_long(self):
1071 "long" 1072 true = Logical(True) 1073 false = Logical(False) 1074 none = Logical(None) 1075 self.assertEqual(long(true), long(1)) 1076 self.assertEqual(long(false), long(0)) 1077 self.assertRaises(ValueError, long, none)
1078
1079 - def test_float(self):
1080 "float" 1081 true = Logical(True) 1082 false = Logical(False) 1083 none = Logical(None) 1084 self.assertEqual(float(true), 1.0) 1085 self.assertEqual(float(false), 0.0) 1086 self.assertRaises(ValueError, float, none)
1087
1088 - def test_oct(self):
1089 "oct" 1090 true = Logical(True) 1091 false = Logical(False) 1092 none = Logical(None) 1093 self.assertEqual(oct(true), oct(1)) 1094 self.assertEqual(oct(false), oct(0)) 1095 self.assertRaises(ValueError, oct, none)
1096
1097 - def test_hex(self):
1098 "hex" 1099 true = Logical(True) 1100 false = Logical(False) 1101 none = Logical(None) 1102 self.assertEqual(hex(true), hex(1)) 1103 self.assertEqual(hex(false), hex(0)) 1104 self.assertRaises(ValueError, hex, none)
1105
1106 - def test_addition(self):
1107 "addition" 1108 true = Logical(True) 1109 false = Logical(False) 1110 unknown = Logical(None) 1111 self.assertEqual(true + true, 2) 1112 self.assertEqual(true + false, 1) 1113 self.assertEqual(false + true, 1) 1114 self.assertEqual(false + false, 0) 1115 self.assertEqual(true + unknown, unknown) 1116 self.assertEqual(false + unknown, unknown) 1117 self.assertEqual(unknown + true, unknown) 1118 self.assertEqual(unknown + false, unknown) 1119 self.assertEqual(unknown + unknown, unknown) 1120 self.assertEqual(true + True, 2) 1121 self.assertEqual(true + False, 1) 1122 self.assertEqual(false + True, 1) 1123 self.assertEqual(false + False, 0) 1124 self.assertEqual(true + None, unknown) 1125 self.assertEqual(false + None, unknown) 1126 self.assertEqual(unknown + True, unknown) 1127 self.assertEqual(unknown + False, unknown) 1128 self.assertEqual(unknown + None, unknown) 1129 self.assertEqual(True + true, 2) 1130 self.assertEqual(True + false, 1) 1131 self.assertEqual(False + true, 1) 1132 self.assertEqual(False + false, 0) 1133 self.assertEqual(True + unknown, unknown) 1134 self.assertEqual(False + unknown, unknown) 1135 self.assertEqual(None + true, unknown) 1136 self.assertEqual(None + false, unknown) 1137 self.assertEqual(None + unknown, unknown) 1138 1139 t = true 1140 t += true 1141 self.assertEqual(t, 2) 1142 t = true 1143 t += false 1144 self.assertEqual(t, 1) 1145 f = false 1146 f += true 1147 self.assertEqual(f, 1) 1148 f = false 1149 f += false 1150 self.assertEqual(f, 0) 1151 t = true 1152 t += unknown 1153 self.assertEqual(t, unknown) 1154 f = false 1155 f += unknown 1156 self.assertEqual(f, unknown) 1157 u = unknown 1158 u += true 1159 self.assertEqual(u, unknown) 1160 u = unknown 1161 u += false 1162 self.assertEqual(u, unknown) 1163 u = unknown 1164 u += unknown 1165 self.assertEqual(u, unknown) 1166 t = true 1167 t += True 1168 self.assertEqual(t, 2) 1169 t = true 1170 t += False 1171 self.assertEqual(t, 1) 1172 f = false 1173 f += True 1174 self.assertEqual(f, 1) 1175 f = false 1176 f += False 1177 self.assertEqual(f, 0) 1178 t = true 1179 t += None 1180 self.assertEqual(t, unknown) 1181 f = false 1182 f += None 1183 self.assertEqual(f, unknown) 1184 u = unknown 1185 u += True 1186 self.assertEqual(u, unknown) 1187 u = unknown 1188 u += False 1189 self.assertEqual(u, unknown) 1190 u = unknown 1191 u += None 1192 self.assertEqual(u, unknown) 1193 t = True 1194 t += true 1195 self.assertEqual(t, 2) 1196 t = True 1197 t += false 1198 self.assertEqual(t, 1) 1199 f = False 1200 f += true 1201 self.assertEqual(f, 1) 1202 f = False 1203 f += false 1204 self.assertEqual(f, 0) 1205 t = True 1206 t += unknown 1207 self.assertEqual(t, unknown) 1208 f = False 1209 f += unknown 1210 self.assertEqual(f, unknown) 1211 u = None 1212 u += true 1213 self.assertEqual(u, unknown) 1214 u = None 1215 u += false 1216 self.assertEqual(u, unknown) 1217 u = None 1218 u += unknown 1219 self.assertEqual(u, unknown)
1220
1221 - def test_multiplication(self):
1222 "multiplication" 1223 true = Logical(True) 1224 false = Logical(False) 1225 unknown = Logical(None) 1226 self.assertEqual(true * true, 1) 1227 self.assertEqual(true * false, 0) 1228 self.assertEqual(false * true, 0) 1229 self.assertEqual(false * false, 0) 1230 self.assertEqual(true * unknown, unknown) 1231 self.assertEqual(false * unknown, 0) 1232 self.assertEqual(unknown * true, unknown) 1233 self.assertEqual(unknown * false, 0) 1234 self.assertEqual(unknown * unknown, unknown) 1235 self.assertEqual(true * True, 1) 1236 self.assertEqual(true * False, 0) 1237 self.assertEqual(false * True, 0) 1238 self.assertEqual(false * False, 0) 1239 self.assertEqual(true * None, unknown) 1240 self.assertEqual(false * None, 0) 1241 self.assertEqual(unknown * True, unknown) 1242 self.assertEqual(unknown * False, 0) 1243 self.assertEqual(unknown * None, unknown) 1244 self.assertEqual(True * true, 1) 1245 self.assertEqual(True * false, 0) 1246 self.assertEqual(False * true, 0) 1247 self.assertEqual(False * false, 0) 1248 self.assertEqual(True * unknown, unknown) 1249 self.assertEqual(False * unknown, 0) 1250 self.assertEqual(None * true, unknown) 1251 self.assertEqual(None * false, 0) 1252 self.assertEqual(None * unknown, unknown) 1253 1254 t = true 1255 t *= true 1256 self.assertEqual(t, 1) 1257 t = true 1258 t *= false 1259 self.assertEqual(t, 0) 1260 f = false 1261 f *= true 1262 self.assertEqual(f, 0) 1263 f = false 1264 f *= false 1265 self.assertEqual(f, 0) 1266 t = true 1267 t *= unknown 1268 self.assertEqual(t, unknown) 1269 f = false 1270 f *= unknown 1271 self.assertEqual(f, 0) 1272 u = unknown 1273 u *= true 1274 self.assertEqual(u, unknown) 1275 u = unknown 1276 u *= false 1277 self.assertEqual(u, 0) 1278 u = unknown 1279 u *= unknown 1280 self.assertEqual(u, unknown) 1281 t = true 1282 t *= True 1283 self.assertEqual(t, 1) 1284 t = true 1285 t *= False 1286 self.assertEqual(t, 0) 1287 f = false 1288 f *= True 1289 self.assertEqual(f, 0) 1290 f = false 1291 f *= False 1292 self.assertEqual(f, 0) 1293 t = true 1294 t *= None 1295 self.assertEqual(t, unknown) 1296 f = false 1297 f *= None 1298 self.assertEqual(f, 0) 1299 u = unknown 1300 u *= True 1301 self.assertEqual(u, unknown) 1302 u = unknown 1303 u *= False 1304 self.assertEqual(u, 0) 1305 u = unknown 1306 u *= None 1307 self.assertEqual(u, unknown) 1308 t = True 1309 t *= true 1310 self.assertEqual(t, 1) 1311 t = True 1312 t *= false 1313 self.assertEqual(t, 0) 1314 f = False 1315 f *= true 1316 self.assertEqual(f, 0) 1317 f = False 1318 f *= false 1319 self.assertEqual(f, 0) 1320 t = True 1321 t *= unknown 1322 self.assertEqual(t, unknown) 1323 f = False 1324 f *= unknown 1325 self.assertEqual(f, 0) 1326 u = None 1327 u *= true 1328 self.assertEqual(u, unknown) 1329 u = None 1330 u *= false 1331 self.assertEqual(u, 0) 1332 u = None 1333 u *= unknown 1334 self.assertEqual(u, unknown)
1335 - def test_subtraction(self):
1336 "subtraction" 1337 true = Logical(True) 1338 false = Logical(False) 1339 unknown = Logical(None) 1340 self.assertEqual(true - true, 0) 1341 self.assertEqual(true - false, 1) 1342 self.assertEqual(false - true, -1) 1343 self.assertEqual(false - false, 0) 1344 self.assertEqual(true - unknown, unknown) 1345 self.assertEqual(false - unknown, unknown) 1346 self.assertEqual(unknown - true, unknown) 1347 self.assertEqual(unknown - false, unknown) 1348 self.assertEqual(unknown - unknown, unknown) 1349 self.assertEqual(true - True, 0) 1350 self.assertEqual(true - False, 1) 1351 self.assertEqual(false - True, -1) 1352 self.assertEqual(false - False, 0) 1353 self.assertEqual(true - None, unknown) 1354 self.assertEqual(false - None, unknown) 1355 self.assertEqual(unknown - True, unknown) 1356 self.assertEqual(unknown - False, unknown) 1357 self.assertEqual(unknown - None, unknown) 1358 self.assertEqual(True - true, 0) 1359 self.assertEqual(True - false, 1) 1360 self.assertEqual(False - true, -1) 1361 self.assertEqual(False - false, 0) 1362 self.assertEqual(True - unknown, unknown) 1363 self.assertEqual(False - unknown, unknown) 1364 self.assertEqual(None - true, unknown) 1365 self.assertEqual(None - false, unknown) 1366 self.assertEqual(None - unknown, unknown) 1367 1368 t = true 1369 t -= true 1370 self.assertEqual(t, 0) 1371 t = true 1372 t -= false 1373 self.assertEqual(t, 1) 1374 f = false 1375 f -= true 1376 self.assertEqual(f, -1) 1377 f = false 1378 f -= false 1379 self.assertEqual(f, 0) 1380 t = true 1381 t -= unknown 1382 self.assertEqual(t, unknown) 1383 f = false 1384 f -= unknown 1385 self.assertEqual(f, unknown) 1386 u = unknown 1387 u -= true 1388 self.assertEqual(u, unknown) 1389 u = unknown 1390 u -= false 1391 self.assertEqual(u, unknown) 1392 u = unknown 1393 u -= unknown 1394 self.assertEqual(u, unknown) 1395 t = true 1396 t -= True 1397 self.assertEqual(t, 0) 1398 t = true 1399 t -= False 1400 self.assertEqual(t, 1) 1401 f = false 1402 f -= True 1403 self.assertEqual(f, -1) 1404 f = false 1405 f -= False 1406 self.assertEqual(f, 0) 1407 t = true 1408 t -= None 1409 self.assertEqual(t, unknown) 1410 f = false 1411 f -= None 1412 self.assertEqual(f, unknown) 1413 u = unknown 1414 u -= True 1415 self.assertEqual(u, unknown) 1416 u = unknown 1417 u -= False 1418 self.assertEqual(u, unknown) 1419 u = unknown 1420 u -= None 1421 self.assertEqual(u, unknown) 1422 t = True 1423 t -= true 1424 self.assertEqual(t, 0) 1425 t = True 1426 t -= false 1427 self.assertEqual(t, 1) 1428 f = False 1429 f -= true 1430 self.assertEqual(f, -1) 1431 f = False 1432 f -= false 1433 self.assertEqual(f, 0) 1434 t = True 1435 t -= unknown 1436 self.assertEqual(t, unknown) 1437 f = False 1438 f -= unknown 1439 self.assertEqual(f, unknown) 1440 u = None 1441 u -= true 1442 self.assertEqual(u, unknown) 1443 u = None 1444 u -= false 1445 self.assertEqual(u, unknown) 1446 u = None 1447 u -= unknown 1448 self.assertEqual(u, unknown)
1449
1450 - def test_division(self):
1451 "division" 1452 true = Logical(True) 1453 false = Logical(False) 1454 unknown = Logical(None) 1455 self.assertEqual(true / true, 1) 1456 self.assertEqual(true / false, unknown) 1457 self.assertEqual(false / true, 0) 1458 self.assertEqual(false / false, unknown) 1459 self.assertEqual(true / unknown, unknown) 1460 self.assertEqual(false / unknown, unknown) 1461 self.assertEqual(unknown / true, unknown) 1462 self.assertEqual(unknown / false, unknown) 1463 self.assertEqual(unknown / unknown, unknown) 1464 self.assertEqual(true / True, 1) 1465 self.assertEqual(true / False, unknown) 1466 self.assertEqual(false / True, 0) 1467 self.assertEqual(false / False, unknown) 1468 self.assertEqual(true / None, unknown) 1469 self.assertEqual(false / None, unknown) 1470 self.assertEqual(unknown / True, unknown) 1471 self.assertEqual(unknown / False, unknown) 1472 self.assertEqual(unknown / None, unknown) 1473 self.assertEqual(True / true, 1) 1474 self.assertEqual(True / false, unknown) 1475 self.assertEqual(False / true, 0) 1476 self.assertEqual(False / false, unknown) 1477 self.assertEqual(True / unknown, unknown) 1478 self.assertEqual(False / unknown, unknown) 1479 self.assertEqual(None / true, unknown) 1480 self.assertEqual(None / false, unknown) 1481 self.assertEqual(None / unknown, unknown) 1482 1483 t = true 1484 t /= true 1485 self.assertEqual(t, 1) 1486 t = true 1487 t /= false 1488 self.assertEqual(t, unknown) 1489 f = false 1490 f /= true 1491 self.assertEqual(f, 0) 1492 f = false 1493 f /= false 1494 self.assertEqual(f, unknown) 1495 t = true 1496 t /= unknown 1497 self.assertEqual(t, unknown) 1498 f = false 1499 f /= unknown 1500 self.assertEqual(f, unknown) 1501 u = unknown 1502 u /= true 1503 self.assertEqual(u, unknown) 1504 u = unknown 1505 u /= false 1506 self.assertEqual(u, unknown) 1507 u = unknown 1508 u /= unknown 1509 self.assertEqual(u, unknown) 1510 t = true 1511 t /= True 1512 self.assertEqual(t, 1) 1513 t = true 1514 t /= False 1515 self.assertEqual(t, unknown) 1516 f = false 1517 f /= True 1518 self.assertEqual(f, 0) 1519 f = false 1520 f /= False 1521 self.assertEqual(f, unknown) 1522 t = true 1523 t /= None 1524 self.assertEqual(t, unknown) 1525 f = false 1526 f /= None 1527 self.assertEqual(f, unknown) 1528 u = unknown 1529 u /= True 1530 self.assertEqual(u, unknown) 1531 u = unknown 1532 u /= False 1533 self.assertEqual(u, unknown) 1534 u = unknown 1535 u /= None 1536 self.assertEqual(u, unknown) 1537 t = True 1538 t /= true 1539 self.assertEqual(t, 1) 1540 t = True 1541 t /= false 1542 self.assertEqual(t, unknown) 1543 f = False 1544 f /= true 1545 self.assertEqual(f, 0) 1546 f = False 1547 f /= false 1548 self.assertEqual(f, unknown) 1549 t = True 1550 t /= unknown 1551 self.assertEqual(t, unknown) 1552 f = False 1553 f /= unknown 1554 self.assertEqual(f, unknown) 1555 u = None 1556 u /= true 1557 self.assertEqual(u, unknown) 1558 u = None 1559 u /= false 1560 self.assertEqual(u, unknown) 1561 u = None 1562 u /= unknown 1563 self.assertEqual(u, unknown) 1564 1565 1566 self.assertEqual(true // true, 1) 1567 self.assertEqual(true // false, unknown) 1568 self.assertEqual(false // true, 0) 1569 self.assertEqual(false // false, unknown) 1570 self.assertEqual(true // unknown, unknown) 1571 self.assertEqual(false // unknown, unknown) 1572 self.assertEqual(unknown // true, unknown) 1573 self.assertEqual(unknown // false, unknown) 1574 self.assertEqual(unknown // unknown, unknown) 1575 self.assertEqual(true // True, 1) 1576 self.assertEqual(true // False, unknown) 1577 self.assertEqual(false // True, 0) 1578 self.assertEqual(false // False, unknown) 1579 self.assertEqual(true // None, unknown) 1580 self.assertEqual(false // None, unknown) 1581 self.assertEqual(unknown // True, unknown) 1582 self.assertEqual(unknown // False, unknown) 1583 self.assertEqual(unknown // None, unknown) 1584 self.assertEqual(True // true, 1) 1585 self.assertEqual(True // false, unknown) 1586 self.assertEqual(False // true, 0) 1587 self.assertEqual(False // false, unknown) 1588 self.assertEqual(True // unknown, unknown) 1589 self.assertEqual(False // unknown, unknown) 1590 self.assertEqual(None // true, unknown) 1591 self.assertEqual(None // false, unknown) 1592 self.assertEqual(None // unknown, unknown) 1593 1594 t = true 1595 t //= true 1596 self.assertEqual(t, 1) 1597 t = true 1598 t //= false 1599 self.assertEqual(t, unknown) 1600 f = false 1601 f //= true 1602 self.assertEqual(f, 0) 1603 f = false 1604 f //= false 1605 self.assertEqual(f, unknown) 1606 t = true 1607 t //= unknown 1608 self.assertEqual(t, unknown) 1609 f = false 1610 f //= unknown 1611 self.assertEqual(f, unknown) 1612 u = unknown 1613 u //= true 1614 self.assertEqual(u, unknown) 1615 u = unknown 1616 u //= false 1617 self.assertEqual(u, unknown) 1618 u = unknown 1619 u //= unknown 1620 self.assertEqual(u, unknown) 1621 t = true 1622 t //= True 1623 self.assertEqual(t, 1) 1624 t = true 1625 t //= False 1626 self.assertEqual(t, unknown) 1627 f = false 1628 f //= True 1629 self.assertEqual(f, 0) 1630 f = false 1631 f //= False 1632 self.assertEqual(f, unknown) 1633 t = true 1634 t //= None 1635 self.assertEqual(t, unknown) 1636 f = false 1637 f //= None 1638 self.assertEqual(f, unknown) 1639 u = unknown 1640 u //= True 1641 self.assertEqual(u, unknown) 1642 u = unknown 1643 u //= False 1644 self.assertEqual(u, unknown) 1645 u = unknown 1646 u //= None 1647 self.assertEqual(u, unknown) 1648 t = True 1649 t //= true 1650 self.assertEqual(t, 1) 1651 t = True 1652 t //= false 1653 self.assertEqual(t, unknown) 1654 f = False 1655 f //= true 1656 self.assertEqual(f, 0) 1657 f = False 1658 f //= false 1659 self.assertEqual(f, unknown) 1660 t = True 1661 t //= unknown 1662 self.assertEqual(t, unknown) 1663 f = False 1664 f //= unknown 1665 self.assertEqual(f, unknown) 1666 u = None 1667 u //= true 1668 self.assertEqual(u, unknown) 1669 u = None 1670 u //= false 1671 self.assertEqual(u, unknown) 1672 u = None 1673 u //= unknown 1674 self.assertEqual(u, unknown)
1675 - def test_shift(self):
1676 "<< and >>" 1677 true = Logical(True) 1678 false = Logical(False) 1679 unknown = Logical(None) 1680 1681 self.assertEqual(true >> true, 0) 1682 self.assertEqual(true >> false, 1) 1683 self.assertEqual(false >> true, 0) 1684 self.assertEqual(false >> false, 0) 1685 self.assertEqual(true >> unknown, unknown) 1686 self.assertEqual(false >> unknown, unknown) 1687 self.assertEqual(unknown >> true, unknown) 1688 self.assertEqual(unknown >> false, unknown) 1689 self.assertEqual(unknown >> unknown, unknown) 1690 self.assertEqual(true >> True, 0) 1691 self.assertEqual(true >> False, 1) 1692 self.assertEqual(false >> True, 0) 1693 self.assertEqual(false >> False, 0) 1694 self.assertEqual(true >> None, unknown) 1695 self.assertEqual(false >> None, unknown) 1696 self.assertEqual(unknown >> True, unknown) 1697 self.assertEqual(unknown >> False, unknown) 1698 self.assertEqual(unknown >> None, unknown) 1699 self.assertEqual(True >> true, 0) 1700 self.assertEqual(True >> false, 1) 1701 self.assertEqual(False >> true, 0) 1702 self.assertEqual(False >> false, 0) 1703 self.assertEqual(True >> unknown, unknown) 1704 self.assertEqual(False >> unknown, unknown) 1705 self.assertEqual(None >> true, unknown) 1706 self.assertEqual(None >> false, unknown) 1707 self.assertEqual(None >> unknown, unknown) 1708 1709 self.assertEqual(true << true, 2) 1710 self.assertEqual(true << false, 1) 1711 self.assertEqual(false << true, 0) 1712 self.assertEqual(false << false, 0) 1713 self.assertEqual(true << unknown, unknown) 1714 self.assertEqual(false << unknown, unknown) 1715 self.assertEqual(unknown << true, unknown) 1716 self.assertEqual(unknown << false, unknown) 1717 self.assertEqual(unknown << unknown, unknown) 1718 self.assertEqual(true << True, 2) 1719 self.assertEqual(true << False, 1) 1720 self.assertEqual(false << True, 0) 1721 self.assertEqual(false << False, 0) 1722 self.assertEqual(true << None, unknown) 1723 self.assertEqual(false << None, unknown) 1724 self.assertEqual(unknown << True, unknown) 1725 self.assertEqual(unknown << False, unknown) 1726 self.assertEqual(unknown << None, unknown) 1727 self.assertEqual(True << true, 2) 1728 self.assertEqual(True << false, 1) 1729 self.assertEqual(False << true, 0) 1730 self.assertEqual(False << false, 0) 1731 self.assertEqual(True << unknown, unknown) 1732 self.assertEqual(False << unknown, unknown) 1733 self.assertEqual(None << true, unknown) 1734 self.assertEqual(None << false, unknown) 1735 self.assertEqual(None << unknown, unknown) 1736 1737 t = true 1738 t >>= true 1739 self.assertEqual(t, 0) 1740 t = true 1741 t >>= false 1742 self.assertEqual(t, 1) 1743 f = false 1744 f >>= true 1745 self.assertEqual(f, 0) 1746 f = false 1747 f >>= false 1748 self.assertEqual(f, 0) 1749 t = true 1750 t >>= unknown 1751 self.assertEqual(t, unknown) 1752 f = false 1753 f >>= unknown 1754 self.assertEqual(f, unknown) 1755 u = unknown 1756 u >>= true 1757 self.assertEqual(u, unknown) 1758 u = unknown 1759 u >>= false 1760 self.assertEqual(u, unknown) 1761 u = unknown 1762 u >>= unknown 1763 self.assertEqual(u, unknown) 1764 t = true 1765 t >>= True 1766 self.assertEqual(t, 0) 1767 t = true 1768 t >>= False 1769 self.assertEqual(t, 1) 1770 f = false 1771 f >>= True 1772 self.assertEqual(f, 0) 1773 f = false 1774 f >>= False 1775 self.assertEqual(f, 0) 1776 t = true 1777 t >>= None 1778 self.assertEqual(t, unknown) 1779 f = false 1780 f >>= None 1781 self.assertEqual(f, unknown) 1782 u = unknown 1783 u >>= True 1784 self.assertEqual(u, unknown) 1785 u = unknown 1786 u >>= False 1787 self.assertEqual(u, unknown) 1788 u = unknown 1789 u >>= None 1790 self.assertEqual(u, unknown) 1791 t = True 1792 t >>= true 1793 self.assertEqual(t, 0) 1794 t = True 1795 t >>= false 1796 self.assertEqual(t, 1) 1797 f = False 1798 f >>= true 1799 self.assertEqual(f, 0) 1800 f = False 1801 f >>= false 1802 self.assertEqual(f, 0) 1803 t = True 1804 t >>= unknown 1805 self.assertEqual(t, unknown) 1806 f = False 1807 f >>= unknown 1808 self.assertEqual(f, unknown) 1809 u = None 1810 u >>= true 1811 self.assertEqual(u, unknown) 1812 u = None 1813 u >>= false 1814 self.assertEqual(u, unknown) 1815 u = None 1816 u >>= unknown 1817 self.assertEqual(u, unknown) 1818 1819 t = true 1820 t <<= true 1821 self.assertEqual(t, 2) 1822 t = true 1823 t <<= false 1824 self.assertEqual(t, 1) 1825 f = false 1826 f <<= true 1827 self.assertEqual(f, 0) 1828 f = false 1829 f <<= false 1830 self.assertEqual(f, 0) 1831 t = true 1832 t <<= unknown 1833 self.assertEqual(t, unknown) 1834 f = false 1835 f <<= unknown 1836 self.assertEqual(f, unknown) 1837 u = unknown 1838 u <<= true 1839 self.assertEqual(u, unknown) 1840 u = unknown 1841 u <<= false 1842 self.assertEqual(u, unknown) 1843 u = unknown 1844 u <<= unknown 1845 self.assertEqual(u, unknown) 1846 t = true 1847 t <<= True 1848 self.assertEqual(t, 2) 1849 t = true 1850 t <<= False 1851 self.assertEqual(t, 1) 1852 f = false 1853 f <<= True 1854 self.assertEqual(f, 0) 1855 f = false 1856 f <<= False 1857 self.assertEqual(f, 0) 1858 t = true 1859 t <<= None 1860 self.assertEqual(t, unknown) 1861 f = false 1862 f <<= None 1863 self.assertEqual(f, unknown) 1864 u = unknown 1865 u <<= True 1866 self.assertEqual(u, unknown) 1867 u = unknown 1868 u <<= False 1869 self.assertEqual(u, unknown) 1870 u = unknown 1871 u <<= None 1872 self.assertEqual(u, unknown) 1873 t = True 1874 t <<= true 1875 self.assertEqual(t, 2) 1876 t = True 1877 t <<= false 1878 self.assertEqual(t, 1) 1879 f = False 1880 f <<= true 1881 self.assertEqual(f, 0) 1882 f = False 1883 f <<= false 1884 self.assertEqual(f, 0) 1885 t = True 1886 t <<= unknown 1887 self.assertEqual(t, unknown) 1888 f = False 1889 f <<= unknown 1890 self.assertEqual(f, unknown) 1891 u = None 1892 u <<= true 1893 self.assertEqual(u, unknown) 1894 u = None 1895 u <<= false 1896 self.assertEqual(u, unknown) 1897 u = None 1898 u <<= unknown 1899 self.assertEqual(u, unknown)
1900
1901 - def test_pow(self):
1902 "**" 1903 true = Logical(True) 1904 false = Logical(False) 1905 unknown = Logical(None) 1906 1907 self.assertEqual(true ** true, 1) 1908 self.assertEqual(true ** false, 1) 1909 self.assertEqual(false ** true, 0) 1910 self.assertEqual(false ** false, 1) 1911 self.assertEqual(true ** unknown, unknown) 1912 self.assertEqual(false ** unknown, unknown) 1913 self.assertEqual(unknown ** true, unknown) 1914 self.assertEqual(unknown ** false, 1) 1915 self.assertEqual(unknown ** unknown, unknown) 1916 self.assertEqual(true ** True, 1) 1917 self.assertEqual(true ** False, 1) 1918 self.assertEqual(false ** True, 0) 1919 self.assertEqual(false ** False, 1) 1920 self.assertEqual(true ** None, unknown) 1921 self.assertEqual(false ** None, unknown) 1922 self.assertEqual(unknown ** True, unknown) 1923 self.assertEqual(unknown ** False, 1) 1924 self.assertEqual(unknown ** None, unknown) 1925 self.assertEqual(True ** true, 1) 1926 self.assertEqual(True ** false, 1) 1927 self.assertEqual(False ** true, 0) 1928 self.assertEqual(False ** false, 1) 1929 self.assertEqual(True ** unknown, unknown) 1930 self.assertEqual(False ** unknown, unknown) 1931 self.assertEqual(None ** true, unknown) 1932 self.assertEqual(None ** false, 1) 1933 self.assertEqual(None ** unknown, unknown) 1934 1935 t = true 1936 t **= true 1937 self.assertEqual(t, 1) 1938 t = true 1939 t **= false 1940 self.assertEqual(t, 1) 1941 f = false 1942 f **= true 1943 self.assertEqual(f, 0) 1944 f = false 1945 f **= false 1946 self.assertEqual(f, 1) 1947 t = true 1948 t **= unknown 1949 self.assertEqual(t, unknown) 1950 f = false 1951 f **= unknown 1952 self.assertEqual(f, unknown) 1953 u = unknown 1954 u **= true 1955 self.assertEqual(u, unknown) 1956 u = unknown 1957 u **= false 1958 self.assertEqual(u, 1) 1959 u = unknown 1960 u **= unknown 1961 self.assertEqual(u, unknown) 1962 t = true 1963 t **= True 1964 self.assertEqual(t, 1) 1965 t = true 1966 t **= False 1967 self.assertEqual(t, 1) 1968 f = false 1969 f **= True 1970 self.assertEqual(f, 0) 1971 f = false 1972 f **= False 1973 self.assertEqual(f, 1) 1974 t = true 1975 t **= None 1976 self.assertEqual(t, unknown) 1977 f = false 1978 f **= None 1979 self.assertEqual(f, unknown) 1980 u = unknown 1981 u **= True 1982 self.assertEqual(u, unknown) 1983 u = unknown 1984 u **= False 1985 self.assertEqual(u, 1) 1986 u = unknown 1987 u **= None 1988 self.assertEqual(u, unknown) 1989 t = True 1990 t **= true 1991 self.assertEqual(t, 1) 1992 t = True 1993 t **= false 1994 self.assertEqual(t, 1) 1995 f = False 1996 f **= true 1997 self.assertEqual(f, 0) 1998 f = False 1999 f **= false 2000 self.assertEqual(f, 1) 2001 t = True 2002 t **= unknown 2003 self.assertEqual(t, unknown) 2004 f = False 2005 f **= unknown 2006 self.assertEqual(f, unknown) 2007 u = None 2008 u **= true 2009 self.assertEqual(u, unknown) 2010 u = None 2011 u **= false 2012 self.assertEqual(u, 1) 2013 u = None 2014 u **= unknown 2015 self.assertEqual(u, unknown)
2016
2017 - def test_mod(self):
2018 "%" 2019 true = Logical(True) 2020 false = Logical(False) 2021 unknown = Logical(None) 2022 2023 self.assertEqual(true % true, 0) 2024 self.assertEqual(true % false, unknown) 2025 self.assertEqual(false % true, 0) 2026 self.assertEqual(false % false, unknown) 2027 self.assertEqual(true % unknown, unknown) 2028 self.assertEqual(false % unknown, unknown) 2029 self.assertEqual(unknown % true, unknown) 2030 self.assertEqual(unknown % false, unknown) 2031 self.assertEqual(unknown % unknown, unknown) 2032 self.assertEqual(true % True, 0) 2033 self.assertEqual(true % False, unknown) 2034 self.assertEqual(false % True, 0) 2035 self.assertEqual(false % False, unknown) 2036 self.assertEqual(true % None, unknown) 2037 self.assertEqual(false % None, unknown) 2038 self.assertEqual(unknown % True, unknown) 2039 self.assertEqual(unknown % False, unknown) 2040 self.assertEqual(unknown % None, unknown) 2041 self.assertEqual(True % true, 0) 2042 self.assertEqual(True % false, unknown) 2043 self.assertEqual(False % true, 0) 2044 self.assertEqual(False % false, unknown) 2045 self.assertEqual(True % unknown, unknown) 2046 self.assertEqual(False % unknown, unknown) 2047 self.assertEqual(None % true, unknown) 2048 self.assertEqual(None % false, unknown) 2049 self.assertEqual(None % unknown, unknown) 2050 2051 t = true 2052 t %= true 2053 self.assertEqual(t, 0) 2054 t = true 2055 t %= false 2056 self.assertEqual(t, unknown) 2057 f = false 2058 f %= true 2059 self.assertEqual(f, 0) 2060 f = false 2061 f %= false 2062 self.assertEqual(f, unknown) 2063 t = true 2064 t %= unknown 2065 self.assertEqual(t, unknown) 2066 f = false 2067 f %= unknown 2068 self.assertEqual(f, unknown) 2069 u = unknown 2070 u %= true 2071 self.assertEqual(u, unknown) 2072 u = unknown 2073 u %= false 2074 self.assertEqual(u, unknown) 2075 u = unknown 2076 u %= unknown 2077 self.assertEqual(u, unknown) 2078 t = true 2079 t %= True 2080 self.assertEqual(t, 0) 2081 t = true 2082 t %= False 2083 self.assertEqual(t, unknown) 2084 f = false 2085 f %= True 2086 self.assertEqual(f, 0) 2087 f = false 2088 f %= False 2089 self.assertEqual(f, unknown) 2090 t = true 2091 t %= None 2092 self.assertEqual(t, unknown) 2093 f = false 2094 f %= None 2095 self.assertEqual(f, unknown) 2096 u = unknown 2097 u %= True 2098 self.assertEqual(u, unknown) 2099 u = unknown 2100 u %= False 2101 self.assertEqual(u, unknown) 2102 u = unknown 2103 u %= None 2104 self.assertEqual(u, unknown) 2105 t = True 2106 t %= true 2107 self.assertEqual(t, 0) 2108 t = True 2109 t %= false 2110 self.assertEqual(t, unknown) 2111 f = False 2112 f %= true 2113 self.assertEqual(f, 0) 2114 f = False 2115 f %= false 2116 self.assertEqual(f, unknown) 2117 t = True 2118 t %= unknown 2119 self.assertEqual(t, unknown) 2120 f = False 2121 f %= unknown 2122 self.assertEqual(f, unknown) 2123 u = None 2124 u %= true 2125 self.assertEqual(u, unknown) 2126 u = None 2127 u %= false 2128 self.assertEqual(u, unknown) 2129 u = None 2130 u %= unknown 2131 self.assertEqual(u, unknown)
2132
2133 - def test_divmod(self):
2134 "divmod()" 2135 true = Logical(True) 2136 false = Logical(False) 2137 unknown = Logical(None) 2138 2139 self.assertEqual(divmod(true, true), (1, 0)) 2140 self.assertEqual(divmod(true, false), (unknown, unknown)) 2141 self.assertEqual(divmod(false, true), (0, 0)) 2142 self.assertEqual(divmod(false, false), (unknown, unknown)) 2143 self.assertEqual(divmod(true, unknown), (unknown, unknown)) 2144 self.assertEqual(divmod(false, unknown), (unknown, unknown)) 2145 self.assertEqual(divmod(unknown, true), (unknown, unknown)) 2146 self.assertEqual(divmod(unknown, false), (unknown, unknown)) 2147 self.assertEqual(divmod(unknown, unknown), (unknown, unknown)) 2148 self.assertEqual(divmod(true, True), (1, 0)) 2149 self.assertEqual(divmod(true, False), (unknown, unknown)) 2150 self.assertEqual(divmod(false, True), (0, 0)) 2151 self.assertEqual(divmod(false, False), (unknown, unknown)) 2152 self.assertEqual(divmod(true, None), (unknown, unknown)) 2153 self.assertEqual(divmod(false, None), (unknown, unknown)) 2154 self.assertEqual(divmod(unknown, True), (unknown, unknown)) 2155 self.assertEqual(divmod(unknown, False), (unknown, unknown)) 2156 self.assertEqual(divmod(unknown, None), (unknown, unknown)) 2157 self.assertEqual(divmod(True, true), (1, 0)) 2158 self.assertEqual(divmod(True, false), (unknown, unknown)) 2159 self.assertEqual(divmod(False, true), (0, 0)) 2160 self.assertEqual(divmod(False, false), (unknown, unknown)) 2161 self.assertEqual(divmod(True, unknown), (unknown, unknown)) 2162 self.assertEqual(divmod(False, unknown), (unknown, unknown)) 2163 self.assertEqual(divmod(None, true), (unknown, unknown)) 2164 self.assertEqual(divmod(None, false), (unknown, unknown)) 2165 self.assertEqual(divmod(None, unknown), (unknown, unknown))
2166
2167 -class TestQuantum(unittest.TestCase):
2168 "Testing Quantum"
2169 - def test_exceptions(self):
2170 "errors" 2171 self.assertRaises(ValueError, Quantum, 'wrong') 2172 if py_ver >= (2, 5): 2173 self.assertRaises(TypeError, lambda : (0, 1, 2)[On]) 2174 self.assertRaises(TypeError, lambda : (0, 1, 2)[Off]) 2175 self.assertRaises(TypeError, lambda : (0, 1, 2)[Other])
2176
2177 - def test_other(self):
2178 "Other" 2179 huh = unknown = Quantum('') 2180 self.assertEqual(huh is dbf.Other, True) 2181 self.assertEqual((huh != huh) is unknown, True) 2182 self.assertEqual((huh != True) is unknown, True) 2183 self.assertEqual((huh != False) is unknown, True) 2184 2185 huh = Quantum('?') 2186 self.assertEqual(huh is dbf.Other, True) 2187 self.assertEqual((huh != huh) is unknown, True) 2188 self.assertEqual((huh != True) is unknown, True) 2189 self.assertEqual((huh != False) is unknown, True) 2190 2191 huh = Quantum(' ') 2192 self.assertEqual(huh is dbf.Other, True) 2193 self.assertEqual((huh != huh) is unknown, True) 2194 self.assertEqual((huh != True) is unknown, True) 2195 self.assertEqual((huh != False) is unknown, True) 2196 2197 huh = Quantum(None) 2198 self.assertEqual(huh is dbf.Other, True) 2199 self.assertEqual((huh != huh) is unknown, True) 2200 self.assertEqual((huh != True) is unknown, True) 2201 self.assertEqual((huh != False) is unknown, True) 2202 2203 huh = Quantum(Null()) 2204 self.assertEqual(huh is dbf.Other, True) 2205 self.assertEqual((huh != huh) is unknown, True) 2206 self.assertEqual((huh != True) is unknown, True) 2207 self.assertEqual((huh != False) is unknown, True) 2208 2209 huh = Quantum(Other) 2210 self.assertEqual(huh is dbf.Other, True) 2211 self.assertEqual((huh != huh) is unknown, True) 2212 self.assertEqual((huh != True) is unknown, True) 2213 self.assertEqual((huh != False) is unknown, True) 2214 2215 huh = Quantum(Unknown) 2216 self.assertEqual(huh is dbf.Other, True) 2217 self.assertEqual((huh != huh) is unknown, True) 2218 self.assertEqual((huh != True) is unknown, True) 2219 self.assertEqual((huh != False) is unknown, True)
2220
2221 - def test_true(self):
2222 "true" 2223 huh = Quantum('True') 2224 unknown = Quantum('?') 2225 self.assertEqual(huh, True) 2226 self.assertNotEqual(huh, False) 2227 self.assertEqual((huh != None) is unknown, True) 2228 2229 huh = Quantum('yes') 2230 unknown = Quantum('?') 2231 self.assertEqual(huh, True) 2232 self.assertNotEqual(huh, False) 2233 self.assertEqual((huh != None) is unknown, True) 2234 2235 huh = Quantum('t') 2236 unknown = Quantum('?') 2237 self.assertEqual(huh, True) 2238 self.assertNotEqual(huh, False) 2239 self.assertEqual((huh != None) is unknown, True) 2240 2241 huh = Quantum('Y') 2242 unknown = Quantum('?') 2243 self.assertEqual(huh, True) 2244 self.assertNotEqual(huh, False) 2245 self.assertEqual((huh != None) is unknown, True) 2246 2247 huh = Quantum(7) 2248 unknown = Quantum('?') 2249 self.assertEqual(huh, True) 2250 self.assertNotEqual(huh, False) 2251 self.assertEqual((huh != None) is unknown, True) 2252 2253 huh = Quantum(['blah']) 2254 unknown = Quantum('?') 2255 self.assertEqual(huh, True) 2256 self.assertNotEqual(huh, False) 2257 self.assertEqual((huh != None) is unknown, True)
2258
2259 - def test_false(self):
2260 "false" 2261 huh = Quantum('false') 2262 unknown = Quantum('?') 2263 self.assertEqual(huh, False) 2264 self.assertNotEqual(huh, True) 2265 self.assertEqual((huh != None) is unknown, True) 2266 2267 huh = Quantum('No') 2268 unknown = Quantum('?') 2269 self.assertEqual(huh, False) 2270 self.assertNotEqual(huh, True) 2271 self.assertEqual((huh != None) is unknown, True) 2272 2273 huh = Quantum('F') 2274 unknown = Quantum('?') 2275 self.assertEqual(huh, False) 2276 self.assertNotEqual(huh, True) 2277 self.assertEqual((huh != None) is unknown, True) 2278 2279 huh = Quantum('n') 2280 unknown = Quantum('?') 2281 self.assertEqual(huh, False) 2282 self.assertNotEqual(huh, True) 2283 self.assertEqual((huh != None) is unknown, True) 2284 2285 huh = Quantum(0) 2286 unknown = Quantum('?') 2287 self.assertEqual(huh, False) 2288 self.assertNotEqual(huh, True) 2289 self.assertEqual((huh != None) is unknown, True) 2290 2291 huh = Quantum([]) 2292 unknown = Quantum('?') 2293 self.assertEqual(huh, False) 2294 self.assertNotEqual(huh, True) 2295 self.assertEqual((huh != None) is unknown, True)
2296
2297 - def test_singletons(self):
2298 "singletons" 2299 heh = Quantum(True) 2300 hah = Quantum('Yes') 2301 ick = Quantum(False) 2302 ack = Quantum([]) 2303 unk = Quantum('?') 2304 bla = Quantum(None) 2305 self.assertEqual(heh is hah, True) 2306 self.assertEqual(ick is ack, True) 2307 self.assertEqual(unk is bla, True)
2308
2309 - def test_or(self):
2310 "or" 2311 true = Quantum(True) 2312 false = Quantum(False) 2313 unknown = Quantum(None) 2314 self.assertEqual(true + true, true) 2315 self.assertEqual(true + false, true) 2316 self.assertEqual(false + true, true) 2317 self.assertEqual(false + false, false) 2318 self.assertEqual(true + unknown, true) 2319 self.assertEqual(false + unknown is unknown, True) 2320 self.assertEqual(unknown + unknown is unknown, True) 2321 self.assertEqual(true | true, true) 2322 self.assertEqual(true | false, true) 2323 self.assertEqual(false | true, true) 2324 self.assertEqual(false | false, false) 2325 self.assertEqual(true | unknown, true) 2326 self.assertEqual(false | unknown is unknown, True) 2327 self.assertEqual(unknown | unknown is unknown, True) 2328 self.assertEqual(true + True, true) 2329 self.assertEqual(true + False, true) 2330 self.assertEqual(false + True, true) 2331 self.assertEqual(false + False, false) 2332 self.assertEqual(true + None, true) 2333 self.assertEqual(false + None is unknown, True) 2334 self.assertEqual(unknown + None is unknown, True) 2335 self.assertEqual(true | True, true) 2336 self.assertEqual(true | False, true) 2337 self.assertEqual(false | True, true) 2338 self.assertEqual(false | False, false) 2339 self.assertEqual(true | None, true) 2340 self.assertEqual(false | None is unknown, True) 2341 self.assertEqual(unknown | None is unknown, True) 2342 self.assertEqual(True + true, true) 2343 self.assertEqual(True + false, true) 2344 self.assertEqual(False + true, true) 2345 self.assertEqual(False + false, false) 2346 self.assertEqual(True + unknown, true) 2347 self.assertEqual(False + unknown is unknown, True) 2348 self.assertEqual(None + unknown is unknown, True) 2349 self.assertEqual(True | true, true) 2350 self.assertEqual(True | false, true) 2351 self.assertEqual(False | true, true) 2352 self.assertEqual(False | false, false) 2353 self.assertEqual(True | unknown, true) 2354 self.assertEqual(False | unknown is unknown, True) 2355 self.assertEqual(None | unknown is unknown, True)
2356 - def test_and(self):
2357 "and" 2358 true = Quantum(True) 2359 false = Quantum(False) 2360 unknown = Quantum(None) 2361 self.assertEqual(true * true, true) 2362 self.assertEqual(true * false, false) 2363 self.assertEqual(false * true, false) 2364 self.assertEqual(false * false, false) 2365 self.assertEqual(true * unknown is unknown, True) 2366 self.assertEqual(false * unknown, false) 2367 self.assertEqual(unknown * unknown is unknown, True) 2368 self.assertEqual(true & true, true) 2369 self.assertEqual(true & false, false) 2370 self.assertEqual(false & true, false) 2371 self.assertEqual(false & false, false) 2372 self.assertEqual(true & unknown is unknown, True) 2373 self.assertEqual(false & unknown, false) 2374 self.assertEqual(unknown & unknown is unknown, True) 2375 self.assertEqual(true * True, true) 2376 self.assertEqual(true * False, false) 2377 self.assertEqual(false * True, false) 2378 self.assertEqual(false * False, false) 2379 self.assertEqual(true * None is unknown, True) 2380 self.assertEqual(false * None, false) 2381 self.assertEqual(unknown * None is unknown, True) 2382 self.assertEqual(true & True, true) 2383 self.assertEqual(true & False, false) 2384 self.assertEqual(false & True, false) 2385 self.assertEqual(false & False, false) 2386 self.assertEqual(true & None is unknown, True) 2387 self.assertEqual(false & None, false) 2388 self.assertEqual(unknown & None is unknown, True) 2389 self.assertEqual(True * true, true) 2390 self.assertEqual(True * false, false) 2391 self.assertEqual(False * true, false) 2392 self.assertEqual(False * false, false) 2393 self.assertEqual(True * unknown is unknown, True) 2394 self.assertEqual(False * unknown, false) 2395 self.assertEqual(None * unknown is unknown, True) 2396 self.assertEqual(True & true, true) 2397 self.assertEqual(True & false, false) 2398 self.assertEqual(False & true, false) 2399 self.assertEqual(False & false, false) 2400 self.assertEqual(True & unknown is unknown, True) 2401 self.assertEqual(False & unknown, false) 2402 self.assertEqual(None & unknown is unknown, True)
2403 - def test_xor(self):
2404 "xor" 2405 true = Quantum(True) 2406 false = Quantum(False) 2407 unknown = Quantum(None) 2408 self.assertEqual(true ^ true, false) 2409 self.assertEqual(true ^ false, true) 2410 self.assertEqual(false ^ true, true) 2411 self.assertEqual(false ^ false, false) 2412 self.assertEqual(true ^ unknown is unknown, True) 2413 self.assertEqual(false ^ unknown is unknown, True) 2414 self.assertEqual(unknown ^ unknown is unknown, True) 2415 self.assertEqual(true ^ True, false) 2416 self.assertEqual(true ^ False, true) 2417 self.assertEqual(false ^ True, true) 2418 self.assertEqual(false ^ False, false) 2419 self.assertEqual(true ^ None is unknown, True) 2420 self.assertEqual(false ^ None is unknown, True) 2421 self.assertEqual(unknown ^ None is unknown, True) 2422 self.assertEqual(True ^ true, false) 2423 self.assertEqual(True ^ false, true) 2424 self.assertEqual(False ^ true, true) 2425 self.assertEqual(False ^ false, false) 2426 self.assertEqual(True ^ unknown is unknown, True) 2427 self.assertEqual(False ^ unknown is unknown, True) 2428 self.assertEqual(None ^ unknown is unknown, True)
2429 - def test_implication_material(self):
2430 "implication, material" 2431 true = Quantum(True) 2432 false = Quantum(False) 2433 unknown = Quantum(None) 2434 self.assertEqual(true >> true, true) 2435 self.assertEqual(true >> false, false) 2436 self.assertEqual(false >> true, true) 2437 self.assertEqual(false >> false, true) 2438 self.assertEqual(true >> unknown is unknown, True) 2439 self.assertEqual(false >> unknown, true) 2440 self.assertEqual(unknown >> unknown is unknown, True) 2441 self.assertEqual(true >> True, true) 2442 self.assertEqual(true >> False, false) 2443 self.assertEqual(false >> True, true) 2444 self.assertEqual(false >> False, true) 2445 self.assertEqual(true >> None is unknown, True) 2446 self.assertEqual(false >> None, true) 2447 self.assertEqual(unknown >> None is unknown, True) 2448 self.assertEqual(True >> true, true) 2449 self.assertEqual(True >> false, false) 2450 self.assertEqual(False >> true, true) 2451 self.assertEqual(False >> false, true) 2452 self.assertEqual(True >> unknown is unknown, True) 2453 self.assertEqual(False >> unknown, true) 2454 self.assertEqual(None >> unknown is unknown, True)
2455 - def test_implication_relevant(self):
2456 "implication, relevant" 2457 true = Quantum(True) 2458 false = Quantum(False) 2459 unknown = Quantum(None) 2460 Quantum.set_implication('relevant') 2461 self.assertEqual(true >> true, true) 2462 self.assertEqual(true >> false, false) 2463 self.assertEqual(false >> true is unknown, True) 2464 self.assertEqual(false >> false is unknown, True) 2465 self.assertEqual(true >> unknown is unknown, True) 2466 self.assertEqual(false >> unknown is unknown, True) 2467 self.assertEqual(unknown >> unknown is unknown, True) 2468 self.assertEqual(true >> True, true) 2469 self.assertEqual(true >> False, false) 2470 self.assertEqual(false >> True is unknown, True) 2471 self.assertEqual(false >> False is unknown, True) 2472 self.assertEqual(true >> None is unknown, True) 2473 self.assertEqual(false >> None is unknown, True) 2474 self.assertEqual(unknown >> None is unknown, True) 2475 self.assertEqual(True >> true, true) 2476 self.assertEqual(True >> false, false) 2477 self.assertEqual(False >> true is unknown, True) 2478 self.assertEqual(False >> false is unknown, True) 2479 self.assertEqual(True >> unknown is unknown, True) 2480 self.assertEqual(False >> unknown is unknown, True) 2481 self.assertEqual(None >> unknown is unknown, True)
2482 - def test_nand(self):
2483 "negative and" 2484 true = Quantum(True) 2485 false = Quantum(False) 2486 unknown = Quantum(None) 2487 self.assertEqual(true.D(true), false) 2488 self.assertEqual(true.D(false), true) 2489 self.assertEqual(false.D(true), true) 2490 self.assertEqual(false.D(false), true) 2491 self.assertEqual(true.D(unknown) is unknown, True) 2492 self.assertEqual(false.D(unknown), true) 2493 self.assertEqual(unknown.D(unknown) is unknown, True) 2494 self.assertEqual(true.D(True), false) 2495 self.assertEqual(true.D(False), true) 2496 self.assertEqual(false.D(True), true) 2497 self.assertEqual(false.D(False), true) 2498 self.assertEqual(true.D(None) is unknown, True) 2499 self.assertEqual(false.D(None), true) 2500 self.assertEqual(unknown.D(None) is unknown, True)
2501 - def test_negation(self):
2502 "negation" 2503 true = Quantum(True) 2504 false = Quantum(False) 2505 none = Quantum(None) 2506 self.assertEqual(-true, false) 2507 self.assertEqual(-false, true) 2508 self.assertEqual(-none is none, True)
2509
2510 -class TestExceptions(unittest.TestCase):
2511 - def setUp(self):
2512 self.tempdir = tempfile.mkdtemp()
2513
2514 - def tearDown(self):
2515 shutil.rmtree(self.tempdir, True)
2516
2518 self.assertRaises(FieldSpecError, Table, 'blah', 'age N(3,2)', on_disk=False) 2519 self.assertRaises(FieldSpecError, Table, 'blah', 'name C(300)', on_disk=False) 2520 self.assertRaises(FieldSpecError, Table, 'blah', 'born L(9)', on_disk=False) 2521 self.assertRaises(FieldSpecError, Table, 'blah', 'married D(12)', on_disk=False) 2522 self.assertRaises(FieldSpecError, Table, 'blah', 'desc M(1)', on_disk=False)
2523
2525 fields = [] 2526 for i in range(255): 2527 fields.append('a%03d C(10)' % i) 2528 Table(':test:', ';'.join(fields), on_disk=False) 2529 fields.append('a255 C(10)') 2530 self.assertRaises(DbfError, Table, ':test:', ';'.join(fields), on_disk=False)
2531
2533 fields = [] 2534 for i in range(255): 2535 fields.append('a%03d C(10)' % i) 2536 table = Table(':test:', ';'.join(fields), on_disk=False) 2537 table.open() 2538 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)')
2539
2541 fields = [] 2542 for i in range(254): 2543 fields.append('a%03d C(10) null' % i) 2544 table = Table(':test:', ';'.join(fields), dbf_type='vfp', on_disk=False) 2545 table.open() 2546 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)') 2547 fields = [] 2548 for i in range(254): 2549 fields.append('a%03d C(10) NULL' % i) 2550 table = Table(':test:', ';'.join(fields), dbf_type='vfp', on_disk=False) 2551 table.open() 2552 self.assertRaises(DbfError, table.add_fields, 'a255 C(10)')
2553
2555 "skipped -- test takes waaaaaaay too long"
2556
2558 fields = [] 2559 for i in range(255): 2560 fields.append('a%03d C(10)' % i) 2561 table = Table(':test:', ';'.join(fields), on_disk=False) 2562 table.open() 2563 self.assertRaises(DbfError, table.allow_nulls, 'a001')
2564
2566 table = Table(':blah:', 'name C(50)', on_disk=False) 2567 self.assertRaises(DbfError, table.add_fields, 'name C(10)')
2568
2570 table = Table(':bleh:', 'name C(25)', on_disk=False) 2571 self.assertRaises(DbfError, table.delete_fields, 'age')
2572
2573 - def test_modify_packed_record(self):
2574 table = Table(':ummm:', 'name C(3); age N(3,0)', on_disk=False) 2575 table.open() 2576 for person in (('me', 25), ('you', 35), ('her', 29)): 2577 table.append(person) 2578 record = table[1] 2579 dbf.delete(record) 2580 table.pack() 2581 self.assertEqual(('you', 35), record) 2582 self.assertRaises(DbfError, dbf.write, record, **{'age':33})
2583 - def test_read_only(self):
2584 table = Table(':ahhh:', 'name C(10)', on_disk=False) 2585 table.open(mode=dbf.READ_ONLY) 2586 self.assertRaises(DbfError, table.append, dict(name='uh uh!'))
2587 - def test_clipper(self):
2588 table = Table(os.path.join(self.tempdir, 'temptable'), 'name C(377); thesis C(20179)', dbf_type='clp') 2589 self.assertRaises(BadDataError, Table, os.path.join(self.tempdir, 'temptable'))
2590
2591 -class TestIndexLocation(unittest.TestCase):
2592 - def test_false(self):
2593 self.assertFalse(IndexLocation(0, False)) 2594 self.assertFalse(IndexLocation(42, False))
2595 - def test_true(self):
2596 self.assertTrue(IndexLocation(0, True)) 2597 self.assertTrue(IndexLocation(42, True))
2598
2599 -class TestDbfCreation(unittest.TestCase):
2600 - def setUp(self):
2601 self.tempdir = tempfile.mkdtemp()
2602
2603 - def tearDown(self):
2604 shutil.rmtree(self.tempdir, True)
2605 2606 "Testing table creation..."
2607 - def test_db3_memory_tables(self):
2608 "dbf tables in memory" 2609 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)'] 2610 for i in range(1, len(fields)+1): 2611 for fieldlist in combinate(fields, i): 2612 table = Table(':memory:', fieldlist, dbf_type='db3', on_disk=False) 2613 actualFields = table.structure() 2614 self.assertEqual(fieldlist, actualFields) 2615 self.assertTrue(all([type(x) is unicode for x in table.field_names]))
2616 - def test_db3_disk_tables(self):
2617 "dbf table on disk" 2618 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)'] 2619 for i in range(1, len(fields)+1): 2620 for fieldlist in combinate(fields, i): 2621 table = Table(os.path.join(self.tempdir, 'temptable'), ';'.join(fieldlist), dbf_type='db3') 2622 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3') 2623 actualFields = table.structure() 2624 self.assertEqual(fieldlist, actualFields) 2625 table = open(table.filename, 'rb') 2626 try: 2627 last_byte = table.read()[-1] 2628 finally: 2629 table.close() 2630 self.assertEqual(last_byte, EOF)
2631 - def test_clp_memory_tables(self):
2632 "clp tables in memory" 2633 fields = ['name C(10977)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)'] 2634 for i in range(1, len(fields)+1): 2635 for fieldlist in combinate(fields, i): 2636 table = Table(':memory:', fieldlist, dbf_type='clp', on_disk=False) 2637 actualFields = table.structure() 2638 self.assertEqual(fieldlist, actualFields) 2639 self.assertTrue(all([type(x) is unicode for x in table.field_names]))
2640 - def test_clp_disk_tables(self):
2641 "clp table on disk" 2642 table = Table(os.path.join(self.tempdir, 'temptable'), 'name C(377); thesis C(20179)', dbf_type='clp') 2643 self.assertEqual(table.record_length, 20557) 2644 fields = ['name C(10977)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)'] 2645 for i in range(1, len(fields)+1): 2646 for fieldlist in combinate(fields, i): 2647 table = Table(os.path.join(self.tempdir, 'temptable'), ';'.join(fieldlist), dbf_type='clp') 2648 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='clp') 2649 actualFields = table.structure() 2650 self.assertEqual(fieldlist, actualFields) 2651 table = open(table.filename, 'rb') 2652 try: 2653 last_byte = table.read()[-1] 2654 finally: 2655 table.close() 2656 self.assertEqual(last_byte, EOF)
2657 - def test_fp_memory_tables(self):
2658 "fp tables in memory" 2659 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 2660 'litres F(11,5)', 'blob G', 'graphic P'] 2661 for i in range(1, len(fields)+1): 2662 for fieldlist in combinate(fields, i): 2663 table = Table(':memory:', ';'.join(fieldlist), dbf_type='vfp', on_disk=False) 2664 actualFields = table.structure() 2665 self.assertEqual(fieldlist, actualFields)
2666 - def test_fp_disk_tables(self):
2667 "fp tables on disk" 2668 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 2669 'litres F(11,5)', 'blob G', 'graphic P'] 2670 for i in range(1, len(fields)+1): 2671 for fieldlist in combinate(fields, i): 2672 table = Table(os.path.join(self.tempdir, 'tempfp'), ';'.join(fieldlist), dbf_type='vfp') 2673 table = Table(os.path.join(self.tempdir, 'tempfp'), dbf_type='vfp') 2674 actualFields = table.structure() 2675 self.assertEqual(fieldlist, actualFields)
2676 - def test_vfp_memory_tables(self):
2677 "vfp tables in memory" 2678 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 2679 'weight B', 'litres F(11,5)', 'int I', 'birth T', 'blob G', 'graphic P', 2680 'menu C(50) binary', 'graduated L null', 'fired D null', 'cipher C(50) nocptrans null', 2681 ] 2682 for i in range(1, len(fields)+1): 2683 for fieldlist in combinate(fields, i): 2684 table = Table(':memory:', ';'.join(fieldlist), dbf_type='vfp', on_disk=False) 2685 actualFields = table.structure() 2686 fieldlist = [f.replace('nocptrans','binary') for f in fieldlist] 2687 self.assertEqual(fieldlist, actualFields)
2688 - def test_vfp_disk_tables(self):
2689 "vfp tables on disk" 2690 fields = ['name C(25)', 'hiredate D', 'male L', 'wisdom M', 'qty N(3,0)', 2691 'weight B', 'litres F(11,5)', 'int I', 'birth T', 'blob G', 'graphic P', 2692 'menu C(50) binary', 'graduated L null', 'fired D null', 'cipher C(50) nocptrans null', 2693 ] 2694 for i in range(1, len(fields)+1): 2695 for fieldlist in combinate(fields, i): 2696 table = Table(os.path.join(self.tempdir, 'tempvfp'), ';'.join(fieldlist), dbf_type='vfp') 2697 table = Table(os.path.join(self.tempdir, 'tempvfp'), dbf_type='vfp') 2698 actualFields = table.structure() 2699 fieldlist = [f.replace('nocptrans','binary') for f in fieldlist] 2700 self.assertEqual(fieldlist, actualFields)
2701 - def test_codepage(self):
2702 table = Table(os.path.join(self.tempdir, 'tempvfp'), 'name C(25); male L; fired D null', dbf_type='vfp') 2703 self.assertEqual(dbf.default_codepage, 'ascii') 2704 self.assertEqual(table.codepage, dbf.CodePage('ascii')) 2705 table.close() 2706 table.open() 2707 table.close() 2708 table = Table(os.path.join(self.tempdir, 'tempvfp'), 'name C(25); male L; fired D null', dbf_type='vfp', codepage='cp850') 2709 self.assertEqual(table.codepage, dbf.CodePage('cp850')) 2710 2711 newtable = table.new('tempvfp2', codepage='cp437') 2712 self.assertEqual(newtable.codepage, dbf.CodePage('cp437')) 2713 newtable.open() 2714 newtable.create_backup() 2715 newtable.close() 2716 bckup = Table(os.path.join(self.tempdir, newtable.backup)) 2717 self.assertEqual(bckup.codepage, newtable.codepage)
2718 - def test_db3_ignore_memos(self):
2719 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='db3').open() 2720 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!')) 2721 table.close() 2722 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='db3', ignore_memos=True) 2723 table.open() 2724 try: 2725 self.assertEqual(table[0].wisdom, '') 2726 finally: 2727 table.close()
2728 - def test_fp_ignore_memos(self):
2729 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='fp').open() 2730 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!')) 2731 table.close() 2732 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='fp', ignore_memos=True) 2733 table.open() 2734 try: 2735 self.assertEqual(table[0].wisdom, '') 2736 finally: 2737 table.close()
2738 - def test_vfp_ignore_memos(self):
2739 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='vfp').open() 2740 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!')) 2741 table.close() 2742 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='vfp', ignore_memos=True) 2743 table.open() 2744 try: 2745 self.assertEqual(table[0].wisdom, '') 2746 finally: 2747 table.close()
2748 - def test_clp_ignore_memos(self):
2749 table = Table(os.path.join(self.tempdir, 'tempdb3'), 'name C(25); wisdom M', dbf_type='clp').open() 2750 table.append(('QC Tester', 'check it twice! check it thrice! check it . . . uh . . . again!')) 2751 table.close() 2752 table = Table(os.path.join(self.tempdir, 'tempdb3'), dbf_type='clp', ignore_memos=True) 2753 table.open() 2754 try: 2755 self.assertEqual(table[0].wisdom, '') 2756 finally: 2757 table.close()
2758
2759 -class TestDbfRecords(unittest.TestCase):
2760 "Testing records" 2761
2762 - def setUp(self):
2763 self.tempdir = tempfile.mkdtemp() 2764 self.dbf_table = Table( 2765 os.path.join(self.tempdir, 'dbf_table'), 2766 'name C(25); paid L; qty N(11,5); orderdate D; desc M', 2767 dbf_type='db3', 2768 ) 2769 self.vfp_table = Table( 2770 os.path.join(self.tempdir, 'vfp_table'), 2771 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' + 2772 ' weight F(18,3); age I; meeting T; misc G; photo P; price Y', 2773 dbf_type='vfp', 2774 )
2775
2776 - def tearDown(self):
2777 self.dbf_table.close() 2778 self.vfp_table.close() 2779 shutil.rmtree(self.tempdir, True)
2780
2781 - def test_slicing(self):
2782 table = self.dbf_table 2783 table.open() 2784 table.append(('myself', True, 5.97, dbf.Date(2012, 5, 21), 'really cool')) 2785 self.assertEqual(table.first_record['name':'qty'], table[0][:3])
2786 - def test_dbf_adding_records(self):
2787 "dbf table: adding records" 2788 table = self.dbf_table 2789 table.open() 2790 namelist = [] 2791 paidlist = [] 2792 qtylist = [] 2793 orderlist = [] 2794 desclist = [] 2795 for i in range(len(floats)): 2796 name = words[i] 2797 paid = len(words[i]) % 3 == 0 2798 qty = floats[i] 2799 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 2800 desc = ' '.join(words[i:i+50]) 2801 namelist.append(name) 2802 paidlist.append(paid) 2803 qtylist.append(qty) 2804 orderlist.append(orderdate) 2805 desclist.append(desc) 2806 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}) 2807 record = table[-1] 2808 2809 t = open(table.filename, 'rb') 2810 last_byte = t.read()[-1] 2811 t.close() 2812 self.assertEqual(last_byte, EOF) 2813 self.assertEqual(record.name.strip(), name) 2814 self.assertEqual(record.paid, paid) 2815 self.assertEqual(record.qty, round(qty, 5)) 2816 self.assertEqual(record.orderdate, orderdate) 2817 self.assertEqual(record.desc.strip(), desc) 2818 # plus a blank record 2819 namelist.append('') 2820 paidlist.append(None) 2821 qtylist.append(None) 2822 orderlist.append(None) 2823 desclist.append('') 2824 table.append() 2825 self.assertEqual(len(table), len(floats)+1) 2826 for field in table.field_names: 2827 self.assertEqual(1, table.field_names.count(field)) 2828 table.close() 2829 t = open(table.filename, 'rb') 2830 last_byte = t.read()[-1] 2831 t.close() 2832 self.assertEqual(last_byte, EOF) 2833 table = Table(table.filename, dbf_type='db3') 2834 table.open() 2835 self.assertEqual(len(table), len(floats)+1) 2836 for field in table.field_names: 2837 self.assertEqual(1, table.field_names.count(field)) 2838 i = 0 2839 for record in table[:-1]: 2840 self.assertEqual(dbf.recno(record), i) 2841 self.assertEqual(table[i].name.strip(), namelist[i]) 2842 self.assertEqual(record.name.strip(), namelist[i]) 2843 self.assertEqual(table[i].paid, paidlist[i]) 2844 self.assertEqual(record.paid, paidlist[i]) 2845 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 2846 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 2847 self.assertEqual(table[i].orderdate, orderlist[i]) 2848 self.assertEqual(record.orderdate, orderlist[i]) 2849 self.assertEqual(table[i].desc.strip(), desclist[i]) 2850 self.assertEqual(record.desc.strip(), desclist[i]) 2851 i += 1 2852 record = table[-1] 2853 self.assertEqual(dbf.recno(record), i) 2854 self.assertEqual(table[i].name.strip(), namelist[i]) 2855 self.assertEqual(record.name.strip(), namelist[i]) 2856 self.assertEqual(table[i].paid, paidlist[i]) 2857 self.assertEqual(record.paid, paidlist[i]) 2858 self.assertEqual(table[i].qty, qtylist[i]) 2859 self.assertEqual(record.qty, qtylist[i]) 2860 self.assertEqual(table[i].orderdate, orderlist[i]) 2861 self.assertEqual(record.orderdate, orderlist[i]) 2862 self.assertEqual(table[i].desc, desclist[i]) 2863 self.assertEqual(record.desc, desclist[i]) 2864 i += 1 2865 self.assertEqual(i, len(table))
2866 - def test_vfp_adding_records(self):
2867 "vfp table: adding records" 2868 table = self.vfp_table 2869 table.open() 2870 namelist = [] 2871 paidlist = [] 2872 qtylist = [] 2873 orderlist = [] 2874 desclist = [] 2875 masslist = [] 2876 weightlist = [] 2877 agelist = [] 2878 meetlist = [] 2879 misclist = [] 2880 photolist = [] 2881 pricelist = [] 2882 for i in range(len(floats)): 2883 name = words[i] 2884 paid = len(words[i]) % 3 == 0 2885 qty = floats[i] 2886 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 2887 desc = ' '.join(words[i:i+50]) 2888 mass = floats[i] * floats[i] / 2.0 2889 weight = floats[i] * 3 2890 age = numbers[i] 2891 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \ 2892 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 2893 misc = (' '.join(words[i:i+50:3])).encode('ascii') 2894 photo = (' '.join(words[i:i+50:7])).encode('ascii') 2895 price = Decimal(round(floats[i] * 2.182737, 4)) 2896 namelist.append(name) 2897 paidlist.append(paid) 2898 qtylist.append(qty) 2899 orderlist.append(orderdate) 2900 desclist.append(desc) 2901 masslist.append(mass) 2902 weightlist.append(weight) 2903 agelist.append(age) 2904 meetlist.append(meeting) 2905 misclist.append(misc) 2906 photolist.append(photo) 2907 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc, \ 2908 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo}) 2909 record = table[-1] 2910 self.assertEqual(record.name.strip(), name) 2911 self.assertEqual(record.paid, paid) 2912 self.assertEqual(record.qty, round(qty, 5)) 2913 self.assertEqual(record.orderdate, orderdate) 2914 self.assertEqual(record.desc.strip(), desc) 2915 self.assertEqual(record.mass, mass) 2916 self.assertEqual(record.weight, round(weight, 3)) 2917 self.assertEqual(record.age, age) 2918 self.assertEqual(record.meeting, meeting) 2919 self.assertEqual(record.misc, misc) 2920 self.assertEqual(record.photo, photo) 2921 # plus a blank record 2922 namelist.append('') 2923 paidlist.append(Unknown) 2924 qtylist.append(None) 2925 orderlist.append(NullDate) 2926 desclist.append('') 2927 masslist.append(0.0) 2928 weightlist.append(None) 2929 agelist.append(0) 2930 meetlist.append(NullDateTime) 2931 misclist.append(''.encode('ascii')) 2932 photolist.append(''.encode('ascii')) 2933 pricelist.append(Decimal('0.0')) 2934 table.append() 2935 table.close() 2936 table = Table(table.filename, dbf_type='vfp') 2937 table.open() 2938 self.assertEqual(len(table), len(floats)+1) 2939 i = 0 2940 for record in table[:-1]: 2941 self.assertEqual(dbf.recno(record), i) 2942 self.assertEqual(table[i].name.strip(), namelist[i]) 2943 self.assertEqual(record.name.strip(), namelist[i]) 2944 self.assertEqual(table[i].paid, paidlist[i]) 2945 self.assertEqual(record.paid, paidlist[i]) 2946 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 2947 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 2948 self.assertEqual(table[i].orderdate, orderlist[i]) 2949 self.assertEqual(record.orderdate, orderlist[i]) 2950 self.assertEqual(table[i].desc.strip(), desclist[i]) 2951 self.assertEqual(record.desc.strip(), desclist[i]) 2952 self.assertEqual(record.mass, masslist[i]) 2953 self.assertEqual(table[i].mass, masslist[i]) 2954 self.assertEqual(record.weight, round(weightlist[i], 3)) 2955 self.assertEqual(table[i].weight, round(weightlist[i], 3)) 2956 self.assertEqual(record.age, agelist[i]) 2957 self.assertEqual(table[i].age, agelist[i]) 2958 self.assertEqual(record.meeting, meetlist[i]) 2959 self.assertEqual(table[i].meeting, meetlist[i]) 2960 self.assertEqual(record.misc, misclist[i]) 2961 self.assertEqual(table[i].misc, misclist[i]) 2962 self.assertEqual(record.photo, photolist[i]) 2963 self.assertEqual(table[i].photo, photolist[i]) 2964 i += 1 2965 record = table[-1] 2966 self.assertEqual(dbf.recno(record), i) 2967 self.assertEqual(table[i].name.strip(), namelist[i]) 2968 self.assertEqual(record.name.strip(), namelist[i]) 2969 self.assertEqual(table[i].paid is None, True) 2970 self.assertEqual(record.paid is None, True) 2971 self.assertEqual(table[i].qty, None) 2972 self.assertEqual(record.qty, None) 2973 self.assertEqual(table[i].orderdate, orderlist[i]) 2974 self.assertEqual(record.orderdate, orderlist[i]) 2975 self.assertEqual(table[i].desc, desclist[i]) 2976 self.assertEqual(record.desc, desclist[i]) 2977 self.assertEqual(record.mass, masslist[i]) 2978 self.assertEqual(table[i].mass, masslist[i]) 2979 self.assertEqual(record.weight, weightlist[i]) 2980 self.assertEqual(table[i].weight, weightlist[i]) 2981 self.assertEqual(record.age, agelist[i]) 2982 self.assertEqual(table[i].age, agelist[i]) 2983 self.assertEqual(record.meeting, meetlist[i]) 2984 self.assertEqual(table[i].meeting, meetlist[i]) 2985 self.assertEqual(record.misc, misclist[i]) 2986 self.assertEqual(table[i].misc, misclist[i]) 2987 self.assertEqual(record.photo, photolist[i]) 2988 self.assertEqual(table[i].photo, photolist[i]) 2989 i += 1
2990
2991 - def test_char_memo_return_type(self):
2992 "check character fields return type" 2993 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp', on_disk=False) 2994 table.open() 2995 table.append(('another one bites the dust', "and another one's gone, and another one's gone...")) 2996 table.append() 2997 for record in table: 2998 self.assertTrue(type(record.text) is unicode) 2999 self.assertTrue(type(record.memo) is unicode) 3000 3001 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp', 3002 default_data_types=dict(C=Char, M=Char), on_disk=False) 3003 table.open() 3004 table.append(('another one bites the dust', "and another one's gone, and another one's gone...")) 3005 table.append() 3006 for record in table: 3007 self.assertTrue(type(record.text) is Char) 3008 self.assertTrue(type(record.memo) is Char) 3009 3010 table = Table(':memory:', 'text C(50); memo M', codepage='cp1252', dbf_type='vfp', 3011 default_data_types=dict(C=(Char, NoneType), M=(Char, NoneType)), on_disk=False) 3012 table.open() 3013 table.append(('another one bites the dust', "and another one's gone, and another one's gone...")) 3014 table.append() 3015 record = table[0] 3016 self.assertTrue(type(record.text) is Char) 3017 self.assertTrue(type(record.memo) is Char) 3018 record = table[1] 3019 self.assertTrue(type(record.text) is NoneType) 3020 self.assertTrue(type(record.memo) is NoneType)
3021 - def test_empty_is_none(self):
3022 "empty and None values" 3023 table = Table(':memory:', 'name C(20); born L; married D; appt T; wisdom M', dbf_type='vfp', on_disk=False) 3024 table.open() 3025 table.append() 3026 record = table[-1] 3027 self.assertTrue(record.born is None) 3028 self.assertTrue(record.married is None) 3029 self.assertTrue(record.appt is None) 3030 self.assertEqual(record.wisdom, '') 3031 appt = DateTime.now() 3032 dbf.write( 3033 record, 3034 born = True, 3035 married = Date(1992, 6, 27), 3036 appt = appt, 3037 wisdom = 'Choose Python', 3038 ) 3039 self.assertTrue(record.born) 3040 self.assertEqual(record.married, Date(1992, 6, 27)) 3041 self.assertEqual(record.appt, appt) 3042 self.assertEqual(record.wisdom, 'Choose Python') 3043 dbf.write( 3044 record, 3045 born = Unknown, 3046 married = NullDate, 3047 appt = NullDateTime, 3048 wisdom = '', 3049 ) 3050 self.assertTrue(record.born is None) 3051 self.assertTrue(record.married is None) 3052 self.assertTrue(record.appt is None) 3053 self.assertEqual(record.wisdom, '')
3054 - def test_custom_data_type(self):
3055 "custom data types" 3056 table = Table( 3057 filename=':memory:', 3058 field_specs='name C(20); born L; married D; appt T; wisdom M', 3059 field_data_types=dict(name=Char, born=Logical, married=Date, appt=DateTime, wisdom=Char,), 3060 dbf_type='vfp', 3061 on_disk=False, 3062 ) 3063 table.open() 3064 table.append() 3065 record = table[-1] 3066 self.assertTrue(type(record.name) is Char, "record.name is %r, not Char" % type(record.name)) 3067 self.assertTrue(type(record.born) is Logical, "record.born is %r, not Logical" % type(record.born)) 3068 self.assertTrue(type(record.married) is Date, "record.married is %r, not Date" % type(record.married)) 3069 self.assertTrue(type(record.appt) is DateTime, "record.appt is %r, not DateTime" % type(record.appt)) 3070 self.assertTrue(type(record.wisdom) is Char, "record.wisdom is %r, not Char" % type(record.wisdom)) 3071 self.assertEqual(record.name, ' ' * 20) 3072 self.assertTrue(record.born is Unknown, "record.born is %r, not Unknown" % record.born) 3073 self.assertTrue(record.married is NullDate, "record.married is %r, not NullDate" % record.married) 3074 self.assertEqual(record.married, None) 3075 self.assertTrue(record.appt is NullDateTime, "record.appt is %r, not NullDateTime" % record.appt) 3076 self.assertEqual(record.appt, None) 3077 appt = DateTime.now() 3078 dbf.write( 3079 record, 3080 name = 'Ethan ', 3081 born = True, 3082 married = Date(1992, 6, 27), 3083 appt = appt, 3084 wisdom = 'Choose Python', 3085 ) 3086 self.assertEqual(type(record.name), Char, "record.wisdom is %r, but should be Char" % record.wisdom) 3087 self.assertTrue(record.born is Truth) 3088 self.assertEqual(record.married, Date(1992, 6, 27)) 3089 self.assertEqual(record.appt, appt) 3090 self.assertEqual(type(record.wisdom), Char, "record.wisdom is %r, but should be Char" % record.wisdom) 3091 self.assertEqual(record.wisdom, 'Choose Python') 3092 dbf.write(record, born=Falsth) 3093 self.assertEqual(record.born, False) 3094 dbf.write(record, born=None, married=None, appt=None, wisdom=None) 3095 self.assertTrue(record.born is Unknown) 3096 self.assertTrue(record.married is NullDate) 3097 self.assertTrue(record.appt is NullDateTime) 3098 self.assertTrue(type(record.wisdom) is Char, "record.wisdom is %r, but should be Char" % type(record.wisdom))
3099 - def test_datatypes_param(self):
3100 "field_types with normal data type but None on empty" 3101 table = Table( 3102 filename=':memory:', 3103 field_specs='name C(20); born L; married D; wisdom M', 3104 field_data_types=dict(name=(str, NoneType), born=(bool, bool)), 3105 dbf_type='db3', 3106 on_disk=False, 3107 ) 3108 table.open() 3109 table.append() 3110 record = table[-1] 3111 self.assertTrue(type(record.name) is type(None), "record.name is %r, not None" % type(record.name)) 3112 self.assertTrue(type(record.born) is bool, "record.born is %r, not bool" % type(record.born)) 3113 self.assertTrue(record.name is None) 3114 self.assertTrue(record.born is False, "record.born is %r, not False" % record.born) 3115 dbf.write(record, name='Ethan ', born=True) 3116 self.assertEqual(type(record.name), str, "record.name is %r, but should be Char" % record.wisdom) 3117 self.assertTrue(record.born is True) 3118 dbf.write(record, born=False) 3119 self.assertEqual(record.born, False) 3120 dbf.write( 3121 record, 3122 name = None, 3123 born = None, 3124 ) 3125 self.assertTrue(record.name is None) 3126 self.assertTrue(record.born is False)
3127 - def test_null_type(self):
3128 "NullType" 3129 from pprint import pprint 3130 table = Table( 3131 filename=':memory:', 3132 field_specs='name C(20) null; born L null; married D null; appt T null; wisdom M null', 3133 default_data_types=dict( 3134 C=(Char, NoneType, NullType), 3135 L=(Logical, NoneType, NullType), 3136 D=(Date, NoneType, NullType), 3137 T=(DateTime, NoneType, NullType), 3138 M=(Char, NoneType, NullType), 3139 ), 3140 dbf_type='vfp', 3141 on_disk=False, 3142 ) 3143 table.open() 3144 table.append() 3145 record = table[-1] 3146 self.assertEqual(record.name, None) 3147 self.assertEqual(record.born, None) 3148 self.assertEqual(record.married, None) 3149 self.assertEqual(record.appt, None) 3150 self.assertEqual(record.wisdom, None) 3151 appt = datetime.datetime(2012, 12, 15, 9, 37, 11) 3152 dbf.write( 3153 record, 3154 name = 'Ethan ', 3155 born = True, 3156 married = datetime.date(2001, 6, 27), 3157 appt = appt, 3158 wisdom = 'timing is everything', 3159 ) 3160 self.assertEqual(record.name, 'Ethan') 3161 self.assertEqual(type(record.name), Char) 3162 self.assertTrue(record.born) 3163 self.assertTrue(record.born is Truth) 3164 self.assertEqual(record.married, datetime.date(2001, 6, 27)) 3165 self.assertEqual(type(record.married), Date) 3166 self.assertEqual(record.appt, datetime.datetime(2012, 12, 15, 9, 37, 11)) 3167 self.assertEqual(type(record.appt), DateTime) 3168 self.assertEqual(record.wisdom, 'timing is everything') 3169 self.assertEqual(type(record.wisdom), Char) 3170 dbf.write(record, name=Null, born=Null, married=Null, appt=Null, wisdom=Null) 3171 self.assertTrue(record.name is Null) 3172 self.assertTrue(record.born is Null) 3173 self.assertTrue(record.born is Null) 3174 self.assertTrue(record.married is Null) 3175 self.assertTrue(record.appt is Null) 3176 self.assertTrue(record.wisdom is Null) 3177 dbf.write( 3178 record, 3179 name = None, 3180 born = None, 3181 married = None, 3182 appt = None, 3183 wisdom = None, 3184 ) 3185 self.assertTrue(record.name is None) 3186 self.assertTrue(record.born is None) 3187 self.assertTrue(record.married is None) 3188 self.assertTrue(record.appt is None) 3189 self.assertTrue(record.wisdom is None)
3190
3191 - def test_nonascii_text_cptrans(self):
3192 "check non-ascii text to unicode" 3193 table = Table(':memory:', 'data C(50); memo M', codepage='cp437', dbf_type='vfp', on_disk=False) 3194 table.open() 3195 decoder = codecs.getdecoder('cp437') 3196 if py_ver < (3, 0): 3197 high_ascii = decoder(''.join(chr(c) for c in range(128, 128+50)))[0] 3198 else: 3199 high_ascii = bytes(range(128, 128+50)).decode('cp437') 3200 table.append(dict(data=high_ascii, memo=high_ascii)) 3201 self.assertEqual(table[0].data, high_ascii) 3202 self.assertEqual(table[0].memo, high_ascii) 3203 table.close()
3204
3206 "check non-ascii text to bytes" 3207 table = Table(':memory:', 'bindata C(50) binary; binmemo M binary', codepage='cp1252', dbf_type='vfp', on_disk=False) 3208 table.open() 3209 if py_ver < (3, 0): 3210 high_ascii = ''.join(chr(c) for c in range(128, 128+50)) 3211 else: 3212 high_ascii = bytes(range(128, 128+50)) 3213 table.append(dict(bindata=high_ascii, binmemo=high_ascii)) 3214 self.assertEqual(table[0].bindata, high_ascii) 3215 self.assertEqual(table[0].binmemo, high_ascii) 3216 table.close()
3217
3218 - def test_add_null_field(self):
3219 "adding a null field to an existing table" 3220 table = Table( 3221 self.vfp_table.filename, 3222 'name C(50); age N(3,0)', 3223 dbf_type='vfp', 3224 ) 3225 table.open() 3226 def _50(text): 3227 return text + ' ' * (50 - len(text))
3228 data = ( (_50('Ethan'), 29), (_50('Joseph'), 33), (_50('Michael'), 54), ) 3229 for datum in data: 3230 table.append(datum) 3231 for datum, recordnum in zip(data, table): 3232 self.assertEqual(datum, tuple(recordnum)) 3233 table.add_fields('fired D null') 3234 for datum, recordnum in zip(data, table): 3235 self.assertEqual(datum, tuple(recordnum)[:2]) 3236 data += ((_50('Daniel'), 44, Null), ) 3237 table.append(('Daniel', 44, Null)) 3238 for datum, recordnum in zip(data, table): 3239 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3240 self.assertTrue(datum[2] is recordnum[2]) 3241 table.close() 3242 table = Table(table.filename) 3243 table.open() 3244 for datum, recordnum in zip(data, table): 3245 self.assertEqual(datum[0:2], tuple(recordnum)[:2]) 3246 self.assertTrue(datum[2] is recordnum[2]) 3247 table.close()
3248
3249 - def test_remove_null_field(self):
3250 "removing null fields from an existing table" 3251 table = Table( 3252 self.vfp_table.filename, 3253 'name C(50); age N(3,0); fired D null', 3254 dbf_type='vfp', 3255 ) 3256 table.open() 3257 def _50(text): 3258 return text + ' ' * (50 - len(text))
3259 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 5, 3))) 3260 for datum in data: 3261 table.append(datum) 3262 for datum, recordnum in zip(data, table): 3263 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3264 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3265 table.delete_fields('fired') 3266 for datum, recordnum in zip(data, table): 3267 self.assertEqual(datum[:2], tuple(recordnum)) 3268 data += ((_50('Daniel'), 44), ) 3269 table.append(('Daniel', 44)) 3270 for datum, recordnum in zip(data, table): 3271 self.assertEqual(datum[:2], tuple(recordnum)) 3272 table.close() 3273 table = Table(table.filename) 3274 table.open() 3275 for datum, recordnum in zip(data, table): 3276 self.assertEqual(datum[:2], tuple(recordnum)) 3277 table.close() 3278
3279 - def test_change_null_field(self):
3280 "making an existing field nullable (or not)" 3281 table = self.vfp_table 3282 table.open() 3283 namelist = [] 3284 paidlist = [] 3285 qtylist = [] 3286 orderlist = [] 3287 desclist = [] 3288 for i in range(10): 3289 name = words[i] 3290 paid = len(words[i]) % 3 == 0 3291 qty = floats[i] 3292 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 3293 desc = ' '.join(words[i:i+50]) 3294 namelist.append(name) 3295 paidlist.append(paid) 3296 qtylist.append(qty) 3297 orderlist.append(orderdate) 3298 desclist.append(desc) 3299 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}) 3300 # plus a blank record 3301 namelist.append('') 3302 paidlist.append(None) 3303 qtylist.append(None) 3304 orderlist.append(None) 3305 desclist.append('') 3306 table.append() 3307 for field in table.field_names: 3308 self.assertEqual(table.nullable_field(field), False) 3309 self.assertRaises(FieldMissingError, table.allow_nulls, 'not_here') 3310 table.allow_nulls('name, qty') 3311 for field in table.field_names: 3312 if field in 'name qty'.split(): 3313 self.assertEqual(table.nullable_field(field), True) 3314 else: 3315 self.assertEqual(table.nullable_field(field), False) 3316 dbf.write(table[0], name=Null, qty=Null) 3317 self.assertTrue(table[0].name is Null) 3318 self.assertTrue(table[0].qty is Null) 3319 self.assertRaises(FieldMissingError, table.disallow_nulls, 'not_here') 3320 table.disallow_nulls('qty') 3321 for field in table.field_names: 3322 if field in 'name'.split(): 3323 self.assertEqual(table.nullable_field(field), True) 3324 else: 3325 self.assertEqual(table.nullable_field(field), False) 3326 table.disallow_nulls('name') 3327 for field in table.field_names: 3328 self.assertEqual(table.nullable_field(field), False) 3329 table.close()
3330
3331 - def test_add_field_to_null(self):
3332 "adding a normal field to a table with null fields" 3333 table = Table( 3334 self.vfp_table.filename, 3335 'name C(50); age N(3,0); fired D null', 3336 dbf_type='vfp', 3337 ) 3338 table.open() 3339 def _50(text): 3340 return text + ' ' * (50 - len(text))
3341 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 7, 4)), ) 3342 for datum in data: 3343 table.append(datum) 3344 for datum, recordnum in zip(data, table): 3345 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3346 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3347 table.add_fields('tenure N(3,0)') 3348 for datum, recordnum in zip(data, table): 3349 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3350 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3351 data += ((_50('Daniel'), 44, Date(2005, 1, 31), 15 ), ) 3352 table.append(('Daniel', 44, Date(2005, 1, 31), 15)) 3353 for datum, recordnum in zip(data, table): 3354 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3355 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3356 self.assertEqual(datum[3], recordnum[3]) 3357 table.close() 3358 table = Table(table.filename) 3359 table.open() 3360 for datum, recordnum in zip(data, table): 3361 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3362 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3363 self.assertEqual(datum[3], recordnum[3]) 3364 table.close() 3365
3366 - def test_remove_field_from_null(self):
3367 "removing a normal field from a table with null fields" 3368 mfd = self.vfp_table._meta.mfd 3369 mfd = None 3370 table = Table( 3371 self.vfp_table.filename, 3372 'name C(50); age N(3,0); fired D null', 3373 dbf_type='vfp', 3374 ) 3375 table.open() 3376 def _50(text): 3377 return text + ' ' * (50 - len(text))
3378 data = ( (_50('Ethan'), 29, Null), (_50('Joseph'), 33, Null), (_50('Michael'), 54, Date(2010, 7, 4)), ) 3379 for datum in data: 3380 table.append(datum) 3381 for datum, recordnum in zip(data, table): 3382 self.assertEqual(datum[:2], tuple(recordnum)[:2]) 3383 self.assertTrue(datum[2] is recordnum[2] or datum[2] == recordnum[2]) 3384 table.delete_fields('age') 3385 for datum, recordnum in zip(data, table): 3386 self.assertEqual(datum[0], recordnum[0]) 3387 self.assertTrue(datum[-1] is recordnum[1] or datum[-1] == recordnum[1]) 3388 data += ((_50('Daniel'), Date(2001, 11, 13)), ) 3389 table.append(('Daniel', Date(2001, 11, 13))) 3390 for datum, recordnum in zip(data, table): 3391 self.assertEqual(datum[0], recordnum[0]) 3392 self.assertTrue(datum[-1] is recordnum[1] or datum[-1] == recordnum[1]) 3393 table.close() 3394 table = Table(table.filename) 3395 table.open() 3396 for datum, recordnum in zip(data, table): 3397 self.assertEqual(datum[0], recordnum[0]) 3398 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])) 3399 table.close()
3400 - def test_flux_internal(self):
3401 "commit and rollback of flux record (implementation detail)" 3402 table = self.dbf_table 3403 table.open() 3404 table.append(('dbf master', True, 77, Date(2012, 5, 20), "guru of some things dbf-y")) 3405 record = table[-1] 3406 old_data = dbf.scatter(record) 3407 record._start_flux() 3408 record.name = 'novice' 3409 record.paid = False 3410 record.qty = 69 3411 record.orderdate = Date(2011, 1, 1) 3412 record.desc = 'master of all he surveys' 3413 self.assertEqual( 3414 dbf.scatter(record), 3415 dict( 3416 name=unicode('novice '), 3417 paid=False, 3418 qty=69, 3419 orderdate=datetime.date(2011, 1, 1), 3420 desc='master of all he surveys', 3421 )) 3422 record._rollback_flux() 3423 self.assertEqual(old_data, dbf.scatter(record)) 3424 record._start_flux() 3425 record.name = 'novice' 3426 record.paid = False 3427 record.qty = 69 3428 record.orderdate = Date(2011, 1, 1) 3429 record._commit_flux() 3430 self.assertEqual( 3431 dbf.scatter(record), 3432 dict( 3433 name=unicode('novice '), 3434 paid=False, 3435 qty=69, 3436 orderdate=datetime.date(2011, 1, 1), 3437 desc='guru of some things dbf-y', 3438 )) 3439 self.assertNotEqual(old_data, dbf.scatter(record))
3440
3441 -class TestDbfFunctions(unittest.TestCase):
3442 - def setUp(self):
3443 self.tempdir = tempfile.mkdtemp() 3444 "create a dbf and vfp table" 3445 self.dbf_table = table = Table( 3446 os.path.join(self.tempdir, 'temptable'), 3447 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3' 3448 ) 3449 table.open() 3450 namelist = self.dbf_namelist = [] 3451 paidlist = self.dbf_paidlist = [] 3452 qtylist = self.dbf_qtylist = [] 3453 orderlist = self.dbf_orderlist = [] 3454 desclist = self.dbf_desclist = [] 3455 for i in range(len(floats)): 3456 name = '%-25s' % words[i] 3457 paid = len(words[i]) % 3 == 0 3458 qty = floats[i] 3459 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 3460 desc = ' '.join(words[i:i+50]) 3461 namelist.append(name) 3462 paidlist.append(paid) 3463 qtylist.append(qty) 3464 orderlist.append(orderdate) 3465 desclist.append(desc) 3466 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}) 3467 table.close() 3468 3469 self.vfp_table = table = Table( 3470 os.path.join(self.tempdir, 'tempvfp'), 3471 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' 3472 ' weight F(18,3); age I; meeting T; misc G; photo P', 3473 dbf_type='vfp', 3474 ) 3475 table.open() 3476 namelist = self.vfp_namelist = [] 3477 paidlist = self.vfp_paidlist = [] 3478 qtylist = self.vfp_qtylist = [] 3479 orderlist = self.vfp_orderlist = [] 3480 desclist = self.vfp_desclist = [] 3481 masslist = self.vfp_masslist = [] 3482 weightlist = self.vfp_weightlist = [] 3483 agelist = self.vfp_agelist = [] 3484 meetlist = self.vfp_meetlist = [] 3485 misclist = self.vfp_misclist = [] 3486 photolist = self.vfp_photolist = [] 3487 for i in range(len(floats)): 3488 name = words[i] 3489 paid = len(words[i]) % 3 == 0 3490 qty = floats[i] 3491 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 3492 desc = ' '.join(words[i:i+50]) 3493 mass = floats[i] * floats[i] / 2.0 3494 weight = round(floats[i] * 3, 3) 3495 age = numbers[i] 3496 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \ 3497 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 3498 misc = ' '.join(words[i:i+50:3]).encode('latin1') 3499 photo = ' '.join(words[i:i+50:7]).encode('latin1') 3500 namelist.append('%-25s' % name) 3501 paidlist.append(paid) 3502 qtylist.append(qty) 3503 orderlist.append(orderdate) 3504 desclist.append(desc) 3505 masslist.append(mass) 3506 weightlist.append(weight) 3507 agelist.append(age) 3508 meetlist.append(meeting) 3509 misclist.append(misc) 3510 photolist.append(photo) 3511 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, 3512 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 3513 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc, 3514 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo}) 3515 table.close()
3516 - def tearDown(self):
3517 self.dbf_table.close() 3518 self.vfp_table.close() 3519 shutil.rmtree(self.tempdir, True)
3520
3522 "dbf table: adding and deleting fields" 3523 table = self.dbf_table 3524 table.open() 3525 dbf._debug = True 3526 namelist = self.dbf_namelist 3527 paidlist = self.dbf_paidlist 3528 qtylist = self.dbf_qtylist 3529 orderlist = self.dbf_orderlist 3530 desclist = self.dbf_desclist 3531 table.delete_fields('name') 3532 table.close() 3533 table = Table(table.filename, dbf_type='db3') 3534 table.open() 3535 for field in table.field_names: 3536 self.assertEqual(1, table.field_names.count(field)) 3537 i = 0 3538 for record in table: 3539 self.assertEqual(dbf.recno(record), i) 3540 3541 self.assertEqual(table[i].paid, paidlist[i]) 3542 self.assertEqual(record.paid, paidlist[i]) 3543 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3544 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3545 self.assertEqual(table[i].orderdate, orderlist[i]) 3546 self.assertEqual(record.orderdate, orderlist[i]) 3547 self.assertEqual(table[i].desc, desclist[i]) 3548 self.assertEqual(record.desc, desclist[i]) 3549 i += 1 3550 first, middle, last = table[0], table[len(table)//2], table[-1] 3551 table.delete_fields('paid, orderdate') 3552 for field in table.field_names: 3553 self.assertEqual(1, table.field_names.count(field)) 3554 i = 0 3555 for record in table: 3556 self.assertEqual(dbf.recno(record), i) 3557 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3558 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3559 self.assertEqual(table[i].desc, desclist[i]) 3560 self.assertEqual(record.desc, desclist[i]) 3561 i += 1 3562 self.assertEqual(i, len(table)) 3563 self.assertTrue('paid' not in dbf.field_names(first)) 3564 self.assertTrue('orderdate' not in dbf.field_names(first)) 3565 table.add_fields('name C(25); paid L; orderdate D') 3566 for field in table.field_names: 3567 self.assertEqual(1, table.field_names.count(field)) 3568 self.assertEqual(i, len(table)) 3569 i = 0 3570 for i, record in enumerate(table): 3571 self.assertEqual(record.name, ' ' * 25) 3572 self.assertEqual(record.paid, None) 3573 self.assertEqual(record.orderdate, None) 3574 self.assertEqual(record.desc, desclist[i]) 3575 i += 1 3576 self.assertEqual(i, len(table)) 3577 i = 0 3578 for record in table: 3579 data = dict() 3580 data['name'] = namelist[dbf.recno(record)] 3581 data['paid'] = paidlist[dbf.recno(record)] 3582 data['orderdate'] = orderlist[dbf.recno(record)] 3583 dbf.gather(record, data) 3584 i += 1 3585 self.assertEqual(i, len(table)) 3586 i = 0 3587 for record in table: 3588 self.assertEqual(dbf.recno(record), i) 3589 self.assertEqual(table[i].name, namelist[i]) 3590 self.assertEqual(record.name, namelist[i]) 3591 self.assertEqual(table[i].paid, paidlist[i]) 3592 self.assertEqual(record.paid, paidlist[i]) 3593 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3594 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3595 self.assertEqual(table[i].orderdate, orderlist[i]) 3596 self.assertEqual(record.orderdate, orderlist[i]) 3597 self.assertEqual(table[i].desc, desclist[i]) 3598 self.assertEqual(record.desc, desclist[i]) 3599 i += 1 3600 table.close()
3602 "vfp table: adding and deleting fields" 3603 table = self.vfp_table 3604 table.open() 3605 namelist = self.vfp_namelist 3606 paidlist = self.vfp_paidlist 3607 qtylist = self.vfp_qtylist 3608 orderlist = self.vfp_orderlist 3609 desclist = self.vfp_desclist 3610 masslist = self.vfp_masslist 3611 weightlist = self.vfp_weightlist 3612 agelist = self.vfp_agelist 3613 meetlist = self.vfp_meetlist 3614 misclist = self.vfp_misclist 3615 photolist = self.vfp_photolist 3616 self.assertEqual(len(table), len(floats)) 3617 i = 0 3618 for record in table: 3619 self.assertEqual(dbf.recno(record), i) 3620 self.assertEqual(table[i].name, namelist[i]) 3621 self.assertEqual(record.name, namelist[i]) 3622 self.assertEqual(table[i].paid, paidlist[i]) 3623 self.assertEqual(record.paid, paidlist[i]) 3624 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3625 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3626 self.assertEqual(table[i].orderdate, orderlist[i]) 3627 self.assertEqual(record.orderdate, orderlist[i]) 3628 self.assertEqual(table[i].desc, desclist[i]) 3629 self.assertEqual(record.desc, desclist[i]) 3630 self.assertEqual(record.mass, masslist[i]) 3631 self.assertEqual(table[i].mass, masslist[i]) 3632 self.assertEqual(record.weight, weightlist[i]) 3633 self.assertEqual(table[i].weight, weightlist[i]) 3634 self.assertEqual(record.age, agelist[i]) 3635 self.assertEqual(table[i].age, agelist[i]) 3636 self.assertEqual(record.meeting, meetlist[i]) 3637 self.assertEqual(table[i].meeting, meetlist[i]) 3638 self.assertEqual(record.misc, misclist[i]) 3639 self.assertEqual(table[i].misc, misclist[i]) 3640 self.assertEqual(record.photo, photolist[i]) 3641 self.assertEqual(table[i].photo, photolist[i]) 3642 i += 1 3643 table.delete_fields('desc') 3644 i = 0 3645 for record in table: 3646 self.assertEqual(dbf.recno(record), i) 3647 self.assertEqual(table[i].name, namelist[i]) 3648 self.assertEqual(record.name, namelist[i]) 3649 self.assertEqual(table[i].paid, paidlist[i]) 3650 self.assertEqual(record.paid, paidlist[i]) 3651 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3652 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3653 self.assertEqual(table[i].orderdate, orderlist[i]) 3654 self.assertEqual(record.orderdate, orderlist[i]) 3655 self.assertEqual(record.weight, weightlist[i]) 3656 self.assertEqual(table[i].weight, weightlist[i]) 3657 self.assertEqual(record.age, agelist[i]) 3658 self.assertEqual(table[i].age, agelist[i]) 3659 self.assertEqual(record.meeting, meetlist[i]) 3660 self.assertEqual(table[i].meeting, meetlist[i]) 3661 self.assertEqual(record.misc, misclist[i]) 3662 self.assertEqual(table[i].misc, misclist[i]) 3663 self.assertEqual(record.photo, photolist[i]) 3664 self.assertEqual(table[i].photo, photolist[i]) 3665 self.assertEqual(record.mass, masslist[i]) 3666 self.assertEqual(table[i].mass, masslist[i]) 3667 i += 1 3668 table.delete_fields('paid, mass') 3669 i = 0 3670 for record in table: 3671 self.assertEqual(dbf.recno(record), i) 3672 self.assertEqual(table[i].name, namelist[i]) 3673 self.assertEqual(record.name, namelist[i]) 3674 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3675 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3676 self.assertEqual(table[i].orderdate, orderlist[i]) 3677 self.assertEqual(record.orderdate, orderlist[i]) 3678 self.assertEqual(record.weight, weightlist[i]) 3679 self.assertEqual(table[i].weight, weightlist[i]) 3680 self.assertEqual(record.age, agelist[i]) 3681 self.assertEqual(table[i].age, agelist[i]) 3682 self.assertEqual(record.meeting, meetlist[i]) 3683 self.assertEqual(table[i].meeting, meetlist[i]) 3684 self.assertEqual(record.misc, misclist[i]) 3685 self.assertEqual(table[i].misc, misclist[i]) 3686 self.assertEqual(record.photo, photolist[i]) 3687 self.assertEqual(table[i].photo, photolist[i]) 3688 i += 1 3689 table.add_fields('desc M; paid L; mass B') 3690 i = 0 3691 for record in table: 3692 self.assertEqual(record.desc, unicode('')) 3693 self.assertEqual(record.paid is None, True) 3694 self.assertEqual(record.mass, 0.0) 3695 i += 1 3696 self.assertEqual(i, len(table)) 3697 i = 0 3698 for record in Process(table): 3699 record.desc = desclist[dbf.recno(record)] 3700 record.paid = paidlist[dbf.recno(record)] 3701 record.mass = masslist[dbf.recno(record)] 3702 i += 1 3703 self.assertEqual(i, len(table)) 3704 i = 0 3705 for record in table: 3706 self.assertEqual(dbf.recno(record), i) 3707 self.assertEqual(table[i].name, namelist[i]) 3708 self.assertEqual(record.name, namelist[i]) 3709 self.assertEqual(table[i].paid, paidlist[i]) 3710 self.assertEqual(record.paid, paidlist[i]) 3711 self.assertEqual(abs(table[i].qty - qtylist[i]) < .00001, True) 3712 self.assertEqual(abs(record.qty - qtylist[i]) < .00001, True) 3713 self.assertEqual(table[i].orderdate, orderlist[i]) 3714 self.assertEqual(record.orderdate, orderlist[i]) 3715 self.assertEqual(table[i].desc, desclist[i]) 3716 self.assertEqual(record.desc, desclist[i]) 3717 self.assertEqual(record.mass, masslist[i]) 3718 self.assertEqual(table[i].mass, masslist[i]) 3719 self.assertEqual(record.weight, weightlist[i]) 3720 self.assertEqual(table[i].weight, weightlist[i]) 3721 self.assertEqual(record.age, agelist[i]) 3722 self.assertEqual(table[i].age, agelist[i]) 3723 self.assertEqual(record.meeting, meetlist[i]) 3724 self.assertEqual(table[i].meeting, meetlist[i]) 3725 self.assertEqual(record.misc, misclist[i]) 3726 self.assertEqual(table[i].misc, misclist[i]) 3727 self.assertEqual(record.photo, photolist[i]) 3728 self.assertEqual(table[i].photo, photolist[i]) 3729 i += 1 3730 table.close()
3731 - def test_len_contains_iter(self):
3732 "basic function tests - len, contains & iterators" 3733 table = self.dbf_table 3734 table.open() 3735 namelist = self.dbf_namelist 3736 paidlist = self.dbf_paidlist 3737 qtylist = self.dbf_qtylist 3738 orderlist = self.dbf_orderlist 3739 desclist = self.dbf_desclist 3740 for field in table.field_names: 3741 self.assertEqual(1, table.field_names.count(field)) 3742 length = sum([1 for rec in table]) 3743 self.assertEqual(length, len(table)) 3744 i = 0 3745 for record in table: 3746 self.assertEqual(record, table[i]) 3747 self.assertTrue(record in table) 3748 self.assertTrue(tuple(record) in table) 3749 self.assertTrue(scatter(record) in table) 3750 self.assertTrue(create_template(record) in table) 3751 i += 1 3752 self.assertEqual(i, len(table)) 3753 table.close()
3754
3755 - def test_undelete(self):
3756 "delete, undelete" 3757 table = Table(':memory:', 'name C(10)', dbf_type='db3', on_disk=False) 3758 table.open() 3759 table.append() 3760 self.assertEqual(table.next_record, table[0]) 3761 table = Table(':memory:', 'name C(10)', dbf_type='db3', on_disk=False) 3762 table.open() 3763 table.append(multiple=10) 3764 self.assertEqual(table.next_record, table[0]) 3765 table = self.dbf_table # Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3') 3766 table.open() 3767 total = len(table) 3768 table.bottom() 3769 self.assertEqual(dbf.recno(table.current_record), total) 3770 table.top() 3771 self.assertEqual(dbf.recno(table.current_record), -1) 3772 table.goto(27) 3773 self.assertEqual(dbf.recno(table.current_record), 27) 3774 table.goto(total-1) 3775 self.assertEqual(dbf.recno(table.current_record), total-1) 3776 table.goto(0) 3777 self.assertEqual(dbf.recno(table.current_record), 0) 3778 self.assertRaises(IndexError, table.goto, total) 3779 self.assertRaises(IndexError, table.goto, -len(table)-1) 3780 table.top() 3781 self.assertRaises(dbf.Bof, table.skip, -1) 3782 table.bottom() 3783 self.assertRaises(Eof, table.skip) 3784 for record in table: 3785 dbf.delete(record) 3786 active_records = table.create_index(active) 3787 active_records.top() 3788 self.assertRaises(Eof, active_records.skip) 3789 dbf._debug = True 3790 active_records.bottom() 3791 self.assertRaises(Bof, active_records.skip, -1) 3792 for record in table: 3793 dbf.undelete(record) 3794 3795 # delete every third record 3796 i = 0 3797 for record in table: 3798 self.assertEqual(dbf.recno(record), i) 3799 if i % 3 == 0: 3800 dbf.delete(record) 3801 i += 1 3802 i = 0 3803 # and verify 3804 for record in table: 3805 self.assertEqual(dbf.is_deleted(record), i%3==0) 3806 self.assertEqual(dbf.is_deleted(table[i]), i%3==0) 3807 i += 1 3808 3809 # check that deletes were saved to disk.. 3810 table.close() 3811 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3') 3812 table.open() 3813 active_records = table.create_index(active) 3814 i = 0 3815 for record in table: 3816 self.assertEqual(dbf.is_deleted(record), i%3==0) 3817 self.assertEqual(dbf.is_deleted(table[i]), i%3==0) 3818 i += 1 3819 3820 # verify record numbers 3821 i = 0 3822 for record in table: 3823 self.assertEqual(dbf.recno(record), i) 3824 i += 1 3825 3826 # verify that deleted records are skipped 3827 i = 0 3828 for record in active_records: 3829 self.assertNotEqual(dbf.recno(record)%3, 0) 3830 active_records.goto(1) 3831 active_records.skip() 3832 self.assertEqual(dbf.recno(active_records.current_record), 4) 3833 active_records.skip(-1) 3834 self.assertEqual(dbf.recno(active_records.current_record), 2) 3835 3836 # verify that deleted records are skipped in slices 3837 list_of_records = active_records[3:6] 3838 self.assertEqual(len(list_of_records), 3) 3839 self.assertEqual(dbf.recno(list_of_records[0]), 5) 3840 self.assertEqual(dbf.recno(list_of_records[1]), 7) 3841 self.assertEqual(dbf.recno(list_of_records[2]), 8) 3842 3843 # verify behavior when all records are deleted 3844 for record in table: 3845 dbf.delete(record) 3846 active_records.bottom() 3847 self.assertRaises(Eof, active_records.skip) 3848 self.assertEqual(active_records.eof, True) 3849 active_records.top() 3850 self.assertRaises(Bof, active_records.skip, -1) 3851 self.assertEqual(active_records.bof, True) 3852 3853 # verify deleted records are seen with active record index 3854 deleted_records = table.create_index(inactive) 3855 i = 0 3856 for record in deleted_records: 3857 self.assertEqual(dbf.recno(record), i) 3858 i += 1 3859 3860 # verify undelete using table[index] 3861 for record in table: 3862 dbf.delete(record) 3863 self.assertTrue(dbf.is_deleted(record)) 3864 for i, record in enumerate(table): 3865 dbf.undelete(table[i]) 3866 self.assertEqual(dbf.is_deleted(record), False) 3867 self.assertEqual(dbf.is_deleted(table[i]), False) 3868 self.assertFalse(record in deleted_records) 3869 3870 # verify all records have been undeleted (recalled) 3871 self.assertEqual(len(active_records), len(table)) 3872 self.assertEqual(len(deleted_records), 0) 3873 table.close()
3874
3876 "finding, ordering, searching" 3877 table = self.dbf_table 3878 table.open() 3879 namelist = self.dbf_namelist 3880 paidlist = self.dbf_paidlist 3881 qtylist = self.dbf_qtylist 3882 orderlist = self.dbf_orderlist 3883 desclist = self.dbf_desclist 3884 3885 # find (brute force) 3886 unordered = [] 3887 for record in table: 3888 unordered.append(record.name) 3889 for word in unordered: # returns records 3890 # records = table.query("select * where name == %r" % word) 3891 # self.assertEqual(len(records), unordered.count(word)) 3892 records = [rec for rec in table if rec.name == word] 3893 self.assertEqual(len(records), unordered.count(word)) 3894 3895 # ordering by one field 3896 ordered = unordered[:] 3897 ordered.sort() 3898 name_index = table.create_index(lambda rec: rec.name) 3899 self.assertEqual(list(name_index[::-1]), list(reversed(name_index))) 3900 i = 0 3901 for record in name_index: 3902 self.assertEqual(record.name, ordered[i]) 3903 i += 1 3904 3905 # search (binary) 3906 for word in unordered: 3907 records = name_index.search(match=word) 3908 self.assertEqual(len(records), unordered.count(word), "num records: %d\nnum words: %d\nfailure with %r" % (len(records), unordered.count(word), word)) 3909 # records = table.query("select * where name == %r" % word) 3910 # self.assertEqual(len(records), unordered.count(word)) 3911 # records = dbf.pql(table, "select * where name == %r" % word) 3912 # self.assertEqual(len(records), unordered.count(word)) 3913 3914 # ordering by two fields 3915 ordered = unordered[:] 3916 ordered.sort() 3917 nd_index = table.create_index(lambda rec: (rec.name, rec.desc)) 3918 self.assertEqual(list(nd_index[::-1]), list(reversed(nd_index))) 3919 i = 0 3920 for record in nd_index: 3921 self.assertEqual(record.name, ordered[i]) 3922 i += 1 3923 3924 # search (binary) 3925 for word in unordered: 3926 records = nd_index.search(match=(word, ), partial=True) 3927 ucount = sum([1 for wrd in unordered if wrd.startswith(word)]) 3928 self.assertEqual(len(records), ucount) 3929 3930 for record in table[::2]: 3931 dbf.write(record, qty=-record.qty) 3932 unordered = [] 3933 for record in table: 3934 unordered.append(record.qty) 3935 ordered = unordered[:] 3936 ordered.sort() 3937 qty_index = table.create_index(lambda rec: rec.qty) 3938 self.assertEqual(list(qty_index[::-1]), list(reversed(qty_index))) 3939 i = 0 3940 for record in qty_index: 3941 self.assertEqual(record.qty, ordered[i]) 3942 i += 1 3943 for number in unordered: 3944 records = qty_index.search(match=(number, )) 3945 self.assertEqual(len(records), unordered.count(number)) 3946 3947 table.close()
3948 - def test_scatter_gather_new(self):
3949 "scattering and gathering fields, and new()" 3950 table = self.dbf_table 3951 table.open() 3952 namelist = self.dbf_namelist 3953 paidlist = self.dbf_paidlist 3954 qtylist = self.dbf_qtylist 3955 orderlist = self.dbf_orderlist 3956 desclist = self.dbf_desclist 3957 table2 = table.new(os.path.join(self.tempdir, 'temptable2')) 3958 table2.open() 3959 for record in table: 3960 table2.append() 3961 newrecord = table2[-1] 3962 testdict = dbf.scatter(record) 3963 for key in field_names(testdict): 3964 self.assertEqual(testdict[key], record[key]) 3965 dbf.gather(newrecord, dbf.scatter(record)) 3966 for field in dbf.field_names(record): 3967 self.assertEqual(newrecord[field], record[field]) 3968 table2.close() 3969 table2 = None 3970 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3') 3971 table2.open() 3972 for i in range(len(table)): 3973 temp1 = dbf.scatter(table[i]) 3974 temp2 = dbf.scatter(table2[i]) 3975 for key in field_names(temp1): 3976 self.assertEqual(temp1[key], temp2[key]) 3977 for key in field_names(temp2): 3978 self.assertEqual(temp1[key], temp2[key]) 3979 table2.close() 3980 table3 = table.new(':memory:', on_disk=False) 3981 table3.open() 3982 for record in table: 3983 table3.append(record) 3984 table4 = self.vfp_table 3985 table4.open() 3986 table5 = table4.new(':memory:', on_disk=False) 3987 table5.open() 3988 for record in table4: 3989 table5.append(record) 3990 table.close() 3991 table3.close() 3992 table4.close() 3993 table5.close()
3995 "renaming fields, __contains__, has_key" 3996 table = self.dbf_table 3997 table.open() 3998 namelist = self.dbf_namelist 3999 paidlist = self.dbf_paidlist 4000 qtylist = self.dbf_qtylist 4001 orderlist = self.dbf_orderlist 4002 desclist = self.dbf_desclist 4003 for field in table.field_names: 4004 oldfield = field 4005 table.rename_field(oldfield, 'newfield') 4006 self.assertEqual(oldfield in table.field_names, False) 4007 self.assertEqual('newfield' in table.field_names, True) 4008 table.close() 4009 table = Table(os.path.join(self.tempdir, 'temptable'), dbf_type='db3') 4010 table.open() 4011 self.assertEqual(oldfield in table.field_names, False) 4012 self.assertEqual('newfield' in table.field_names, True) 4013 table.rename_field('newfield', oldfield) 4014 self.assertEqual(oldfield in table.field_names, True) 4015 self.assertEqual('newfield' in table.field_names, False) 4016 table.close()
4017
4018 - def test_dbf_record_kamikaze(self):
4019 "kamikaze" 4020 table = self.dbf_table 4021 table.open() 4022 namelist = self.dbf_namelist 4023 paidlist = self.dbf_paidlist 4024 qtylist = self.dbf_qtylist 4025 orderlist = self.dbf_orderlist 4026 desclist = self.dbf_desclist 4027 table2 = table.new(os.path.join(self.tempdir, 'temptable2')) 4028 table2.open() 4029 for record in table: 4030 table2.append(record) 4031 newrecord = table2[-1] 4032 for key in table.field_names: 4033 if key not in table.memo_types: 4034 self.assertEqual(newrecord[key], record[key]) 4035 for field in dbf.field_names(newrecord): 4036 if key not in table2.memo_types: 4037 self.assertEqual(newrecord[field], record[field]) 4038 table2.close() 4039 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3') 4040 table2.open() 4041 for i in range(len(table)): 4042 dict1 = dbf.scatter(table[i], as_type=dict) 4043 dict2 = dbf.scatter(table2[i], as_type=dict) 4044 for key in dict1.keys(): 4045 if key not in table.memo_types: 4046 self.assertEqual(dict1[key], dict2[key]) 4047 for key in dict2.keys(): 4048 if key not in table2.memo_types: 4049 self.assertEqual(dict1[key], dict2[key]) 4050 for i in range(len(table)): 4051 template1 = dbf.scatter(table[i]) 4052 template2 = dbf.scatter(table2[i]) 4053 for key in dbf.field_names(template1): 4054 if key not in table.memo_types: 4055 self.assertEqual(template1[key], template2[key]) 4056 for key in dbf.field_names(template2): 4057 if key not in table2.memo_types: 4058 self.assertEqual(template1[key], template2[key]) 4059 table.close() 4060 table2.close()
4061
4062 - def test_multiple_append(self):
4063 "multiple append" 4064 table = self.dbf_table 4065 table.open() 4066 namelist = self.dbf_namelist 4067 paidlist = self.dbf_paidlist 4068 qtylist = self.dbf_qtylist 4069 orderlist = self.dbf_orderlist 4070 desclist = self.dbf_desclist 4071 table2 = table.new(os.path.join(self.tempdir, 'temptable2')) 4072 table2.open() 4073 record = table.next_record 4074 table2.append(dbf.scatter(record), multiple=100) 4075 for samerecord in table2: 4076 for field in dbf.field_names(record): 4077 self.assertEqual(record[field], samerecord[field]) 4078 table2.close() 4079 table2 = Table(os.path.join(self.tempdir, 'temptable2'), dbf_type='db3') 4080 table2.open() 4081 for samerecord in table2: 4082 for field in dbf.field_names(record): 4083 self.assertEqual(record[field], samerecord[field]) 4084 table2.close() 4085 table3 = table.new(os.path.join(self.tempdir, 'temptable3')) 4086 table3.open() 4087 record = table.next_record 4088 table3.append(record, multiple=100) 4089 for samerecord in table3: 4090 for field in dbf.field_names(record): 4091 self.assertEqual(record[field], samerecord[field]) 4092 table3.close() 4093 table3 = Table(os.path.join(self.tempdir, 'temptable3'), dbf_type='db3') 4094 table3.open() 4095 for samerecord in table3: 4096 for field in dbf.field_names(record): 4097 self.assertEqual(record[field], samerecord[field]) 4098 table3.close() 4099 table.close()
4100 - def test_slices(self):
4101 "slices" 4102 table = self.dbf_table 4103 table.open() 4104 namelist = self.dbf_namelist 4105 paidlist = self.dbf_paidlist 4106 qtylist = self.dbf_qtylist 4107 orderlist = self.dbf_orderlist 4108 desclist = self.dbf_desclist 4109 slice1 = [table[0], table[1], table[2]] 4110 self.assertEqual(slice1, list(table[:3])) 4111 slice2 = [table[-3], table[-2], table[-1]] 4112 self.assertEqual(slice2, list(table[-3:])) 4113 slice3 = [record for record in table] 4114 self.assertEqual(slice3, list(table[:])) 4115 slice4 = [table[9]] 4116 self.assertEqual(slice4, list(table[9:10])) 4117 slice5 = [table[15], table[16], table[17], table[18]] 4118 self.assertEqual(slice5, list(table[15:19])) 4119 slice6 = [table[0], table[2], table[4], table[6], table[8]] 4120 self.assertEqual(slice6, list(table[:9:2])) 4121 slice7 = [table[-1], table[-2], table[-3]] 4122 self.assertEqual(slice7, list(table[-1:-4:-1])) 4123 table.close()
4124 - def test_record_reset(self):
4125 "reset record" 4126 table = self.dbf_table 4127 table.open() 4128 namelist = self.dbf_namelist 4129 paidlist = self.dbf_paidlist 4130 qtylist = self.dbf_qtylist 4131 orderlist = self.dbf_orderlist 4132 desclist = self.dbf_desclist 4133 for record in table: 4134 dbf.reset(record) 4135 dbf.write(record) 4136 self.assertEqual(table[0].name, table[1].name) 4137 dbf.write(table[0], name='Python rocks!') 4138 self.assertNotEqual(table[0].name, table[1].name) 4139 table.close()
4140 - def test_adding_memos(self):
4141 "adding memos to existing records" 4142 table = Table(':memory:', 'name C(50); age N(3,0)', dbf_type='db3', on_disk=False) 4143 table.open() 4144 table.append(('user', 0)) 4145 table.add_fields('motto M') 4146 dbf.write(table[0], motto='Are we there yet??') 4147 self.assertEqual(table[0].motto, 'Are we there yet??') 4148 table.close() 4149 table = Table(os.path.join(self.tempdir, 'temptable4'), 'name C(50); age N(3,0)', dbf_type='db3') 4150 table.open() 4151 table.append(('user', 0)) 4152 table.close() 4153 table.open() 4154 table.close() 4155 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='db3') 4156 table.open() 4157 table.add_fields('motto M') 4158 dbf.write(table[0], motto='Are we there yet??') 4159 self.assertEqual(table[0].motto, 'Are we there yet??') 4160 table.close() 4161 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='db3') 4162 table.open() 4163 self.assertEqual(table[0].motto, 'Are we there yet??') 4164 table.close() 4165 table = Table(os.path.join(self.tempdir, 'temptable4'), 'name C(50); age N(3,0)', dbf_type='vfp') 4166 table.open() 4167 table.append(('user', 0)) 4168 table.close() 4169 table.open() 4170 table.close() 4171 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='vfp') 4172 table.open() 4173 table.add_fields('motto M') 4174 dbf.write(table[0], motto='Are we there yet??') 4175 self.assertEqual(table[0].motto, 'Are we there yet??') 4176 table.close() 4177 table = Table(os.path.join(self.tempdir, 'temptable4'), dbf_type='vfp') 4178 table.open() 4179 self.assertEqual(table[0].motto, 'Are we there yet??') 4180 table.close()
4181 - def test_from_csv(self):
4182 "from_csv" 4183 table = self.dbf_table 4184 table.open() 4185 namelist = self.dbf_namelist 4186 paidlist = self.dbf_paidlist 4187 qtylist = self.dbf_qtylist 4188 orderlist = self.dbf_orderlist 4189 desclist = self.dbf_desclist 4190 dbf.export(table, table.filename, header=False) 4191 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv')) 4192 csvtable.open() 4193 for i in index(table): 4194 for j in index(table.field_names): 4195 self.assertEqual(str(table[i][j]), csvtable[i][j]) 4196 csvtable.close() 4197 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), to_disk=True, filename=os.path.join(self.tempdir, 'temptable5')) 4198 csvtable.open() 4199 for i in index(table): 4200 for j in index(table.field_names): 4201 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip()) 4202 csvtable.close() 4203 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), field_names=['field1','field2']) 4204 csvtable.open() 4205 for i in index(table): 4206 for j in index(table.field_names): 4207 self.assertEqual(str(table[i][j]), csvtable[i][j]) 4208 csvtable.close() 4209 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')) 4210 csvtable.open() 4211 for i in index(table): 4212 for j in index(table.field_names): 4213 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip()) 4214 csvtable.close() 4215 csvtable = dbf.from_csv(os.path.join(self.tempdir, 'temptable.csv'), extra_fields=['count N(5,0)','id C(10)']) 4216 csvtable.open() 4217 for i in index(table): 4218 for j in index(table.field_names): 4219 self.assertEqual(str(table[i][j]), csvtable[i][j]) 4220 csvtable.close() 4221 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')) 4222 csvtable.open() 4223 for i in index(table): 4224 for j in index(table.field_names): 4225 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip()) 4226 csvtable.close() 4227 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(';')) 4228 csvtable.open() 4229 for i in index(table): 4230 for j in index(table.field_names): 4231 self.assertEqual(str(table[i][j]), csvtable[i][j]) 4232 csvtable.close() 4233 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')) 4234 csvtable.open() 4235 for i in index(table): 4236 for j in index(table.field_names): 4237 self.assertEqual(str(table[i][j]).strip(), csvtable[i][j].strip())
4238
4239 - def test_resize(self):
4240 "resize" 4241 table = self.dbf_table 4242 table.open() 4243 test_record = dbf.scatter(table[5]) 4244 namelist = self.dbf_namelist 4245 paidlist = self.dbf_paidlist 4246 qtylist = self.dbf_qtylist 4247 orderlist = self.dbf_orderlist 4248 desclist = self.dbf_desclist 4249 test_record = dbf.scatter(table[5]) 4250 table.resize_field('name', 40) 4251 new_record = dbf.scatter(table[5]) 4252 self.assertEqual(test_record['orderdate'], new_record['orderdate']) 4253 table.close()
4254 - def test_memos_after_close(self):
4255 "memos available after close/open" 4256 table = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3', default_data_types=dict(C=Char)) 4257 table.open() 4258 table.append(('Author','dashing, debonair, delightful')) 4259 table.close() 4260 table.open() 4261 self.assertEqual(tuple(table[0]), ('Author','dashing, debonair, delightful')) 4262 table.close() 4263 table2 = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3') 4264 table2.open() 4265 table2.append(('Benedict', 'brilliant, bombastic, bothered')) 4266 table2.close() 4267 table.open() 4268 self.assertEqual(table[0].name, 'Benedict') 4269 self.assertEqual(table[0].desc, 'brilliant, bombastic, bothered') 4270 table.close()
4271 - def test_field_type(self):
4272 "table.type(field) == ('C', Char)" 4273 table = dbf.Table('tempy', 'name C(20); desc M', dbf_type='db3', default_data_types=dict(C=Char)) 4274 table.open() 4275 field_info = table.field_info('name') 4276 if py_ver < (3, 0): 4277 self.assertEqual(field_info, ('C', 20, 0, Char)) 4278 self.assertEqual(field_info.field_type, 'C') 4279 else: 4280 self.assertEqual(field_info, (dbf.FieldType.CHAR, 20, 0, Char)) 4281 self.assertEqual(field_info.field_type, dbf.FieldType.CHAR) 4282 self.assertEqual(field_info.length, 20) 4283 self.assertEqual(field_info.decimal, 0) 4284 self.assertEqual(field_info.py_type, Char) 4285 table.close()
4286
4287 - def test_memo_after_backup(self):
4288 "memo fields accessible after .backup()" 4289 table = self.dbf_table 4290 table.open() 4291 table.create_backup() 4292 backup = dbf.Table(table.backup) 4293 backup.open() 4294 desclist = self.dbf_desclist 4295 for i in range(len(desclist)): 4296 self.assertEqual(desclist[i], backup[i].desc) 4297 backup.close() 4298 table.close()
4299 - def test_write_loop(self):
4300 "Process loop commits changes" 4301 table = self.dbf_table 4302 table.open() 4303 for record in Process(table): 4304 record.name = '!BRAND NEW NAME!' 4305 for record in table: 4306 self.assertEqual(record.name, '!BRAND NEW NAME! ') 4307 table.close()
4308 - def test_export(self):
4309 for table in self.dbf_table, self.vfp_table: 4310 table.open() 4311 dbf.export(table, filename='test_export.csv')
4312 - def test_index_search(self):
4313 table = Table("unordered", "icao C(20)", default_data_types=dict(C=Char), on_disk=False).open() 4314 icao = ("kilo charlie echo golf papa hotel delta tango india sierra juliet lima zulu mike " 4315 "bravo november alpha oscar quebec romeo uniform victor whiskey x-ray yankee foxtrot".split()) 4316 for alpha in icao: 4317 table.append((alpha,)) 4318 sorted = table.create_index(lambda rec: rec.icao) 4319 self.assertTrue(sorted.index_search('alpha')) 4320 self.assertTrue(sorted.index_search('bravo')) 4321 self.assertTrue(sorted.index_search('charlie')) 4322 self.assertTrue(sorted.index_search('delta')) 4323 self.assertTrue(sorted.index_search('echo')) 4324 self.assertTrue(sorted.index_search('foxtrot')) 4325 self.assertTrue(sorted.index_search('golf')) 4326 self.assertTrue(sorted.index_search('hotel')) 4327 self.assertTrue(sorted.index_search('india')) 4328 self.assertTrue(sorted.index_search('juliet')) 4329 self.assertTrue(sorted.index_search('kilo')) 4330 self.assertTrue(sorted.index_search('lima')) 4331 self.assertTrue(sorted.index_search('mike')) 4332 self.assertTrue(sorted.index_search('november')) 4333 self.assertTrue(sorted.index_search('oscar')) 4334 self.assertTrue(sorted.index_search('papa')) 4335 self.assertTrue(sorted.index_search('quebec')) 4336 self.assertTrue(sorted.index_search('romeo')) 4337 self.assertTrue(sorted.index_search('sierra')) 4338 self.assertTrue(sorted.index_search('tango')) 4339 self.assertTrue(sorted.index_search('uniform')) 4340 self.assertTrue(sorted.index_search('victor')) 4341 self.assertTrue(sorted.index_search('whiskey')) 4342 self.assertTrue(sorted.index_search('x-ray')) 4343 self.assertTrue(sorted.index_search('yankee')) 4344 self.assertTrue(sorted.index_search('zulu')) 4345 self.assertEqual(sorted.index_search('alpha'), 0) 4346 self.assertEqual(sorted.index_search('bravo'), 1) 4347 self.assertEqual(sorted.index_search('charlie'), 2) 4348 self.assertEqual(sorted.index_search('delta'), 3) 4349 self.assertEqual(sorted.index_search('echo'), 4) 4350 self.assertEqual(sorted.index_search('foxtrot'), 5) 4351 self.assertEqual(sorted.index_search('golf'), 6) 4352 self.assertEqual(sorted.index_search('hotel'), 7) 4353 self.assertEqual(sorted.index_search('india'), 8) 4354 self.assertEqual(sorted.index_search('juliet'), 9) 4355 self.assertEqual(sorted.index_search('kilo'), 10) 4356 self.assertEqual(sorted.index_search('lima'), 11) 4357 self.assertEqual(sorted.index_search('mike'), 12) 4358 self.assertEqual(sorted.index_search('november'), 13) 4359 self.assertEqual(sorted.index_search('oscar'), 14) 4360 self.assertEqual(sorted.index_search('papa'), 15) 4361 self.assertEqual(sorted.index_search('quebec'), 16) 4362 self.assertEqual(sorted.index_search('romeo'), 17) 4363 self.assertEqual(sorted.index_search('sierra'), 18) 4364 self.assertEqual(sorted.index_search('tango'), 19) 4365 self.assertEqual(sorted.index_search('uniform'), 20) 4366 self.assertEqual(sorted.index_search('victor'), 21) 4367 self.assertEqual(sorted.index_search('whiskey'), 22) 4368 self.assertEqual(sorted.index_search('x-ray'), 23) 4369 self.assertEqual(sorted.index_search('yankee'), 24) 4370 self.assertEqual(sorted.index_search('zulu'), 25) 4371 self.assertRaises(NotFoundError, sorted.index_search, 'john') 4372 self.assertRaises(NotFoundError, sorted.index_search, 'john', partial=True) 4373 self.assertEqual(sorted.index_search('able', nearest=True), 0) 4374 self.assertFalse(sorted.index_search('able', nearest=True)) 4375 self.assertEqual(sorted.index_search('alp', partial=True), 0) 4376 self.assertTrue(sorted.index_search('alp', partial=True)) 4377 self.assertEqual(sorted.index_search('john', nearest=True), 9) 4378 self.assertFalse(sorted.index_search('john', nearest=True)) 4379 self.assertEqual(sorted.index_search('jul', partial=True), 9) 4380 self.assertTrue(sorted.index_search('jul', partial=True))
4381
4382 -class TestDbfNavigation(unittest.TestCase):
4383 - def setUp(self):
4384 self.tempdir = tempfile.mkdtemp() 4385 "create a dbf and vfp table" 4386 self.dbf_table = table = Table( 4387 os.path.join(self.tempdir, 'temptable'), 4388 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3' 4389 ) 4390 table.open() 4391 namelist = self.dbf_namelist = [] 4392 paidlist = self.dbf_paidlist = [] 4393 qtylist = self.dbf_qtylist = [] 4394 orderlist = self.dbf_orderlist = [] 4395 desclist = self.dbf_desclist = [] 4396 for i in range(len(floats)): 4397 name = '%-25s' % words[i] 4398 paid = len(words[i]) % 3 == 0 4399 qty = floats[i] 4400 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 4401 desc = ' '.join(words[i:i+50]) 4402 namelist.append(name) 4403 paidlist.append(paid) 4404 qtylist.append(qty) 4405 orderlist.append(orderdate) 4406 desclist.append(desc) 4407 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}) 4408 table.close() 4409 4410 self.vfp_table = table = Table( 4411 os.path.join(self.tempdir, 'tempvfp'), 4412 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' 4413 ' weight F(18,3); age I; meeting T; misc G; photo P', 4414 dbf_type='vfp', 4415 ) 4416 table.open() 4417 namelist = self.vfp_namelist = [] 4418 paidlist = self.vfp_paidlist = [] 4419 qtylist = self.vfp_qtylist = [] 4420 orderlist = self.vfp_orderlist = [] 4421 desclist = self.vfp_desclist = [] 4422 masslist = self.vfp_masslist = [] 4423 weightlist = self.vfp_weightlist = [] 4424 agelist = self.vfp_agelist = [] 4425 meetlist = self.vfp_meetlist = [] 4426 misclist = self.vfp_misclist = [] 4427 photolist = self.vfp_photolist = [] 4428 for i in range(len(floats)): 4429 name = words[i] 4430 paid = len(words[i]) % 3 == 0 4431 qty = floats[i] 4432 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 4433 desc = ' '.join(words[i:i+50]) 4434 mass = floats[i] * floats[i] / 2.0 4435 weight = floats[i] * 3 4436 age = numbers[i] 4437 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \ 4438 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 4439 misc = ' '.join(words[i:i+50:3]).encode('ascii') 4440 photo = ' '.join(words[i:i+50:7]).encode('ascii') 4441 namelist.append('%-25s' % name) 4442 paidlist.append(paid) 4443 qtylist.append(qty) 4444 orderlist.append(orderdate) 4445 desclist.append(desc) 4446 masslist.append(mass) 4447 weightlist.append(weight) 4448 agelist.append(age) 4449 meetlist.append(meeting) 4450 misclist.append(misc) 4451 photolist.append(photo) 4452 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, 4453 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 4454 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc, 4455 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo}) 4456 table.close()
4457 - def tearDown(self):
4458 self.dbf_table.close() 4459 self.vfp_table.close() 4460 shutil.rmtree(self.tempdir, True)
4461
4462 - def test_top(self):
4463 "top, current in Tables, Lists, and Indexes" 4464 table = self.dbf_table 4465 table.open() 4466 list = List(table) 4467 index = Index(table, key=lambda rec: dbf.recno(rec)) 4468 total = len(table) 4469 mid = total // 2 4470 table.goto(mid) 4471 list.goto(mid) 4472 index.goto(mid) 4473 self.assertTrue(table.current != -1) 4474 self.assertTrue(list.current != -1) 4475 self.assertTrue(index.current != -1) 4476 table.top() 4477 list.top() 4478 index.top() 4479 self.assertEqual(table.current, -1) 4480 self.assertEqual(list.current, -1) 4481 self.assertEqual(index.current, -1)
4482
4483 - def test_bottom(self):
4484 "bottom, current in Tables, Lists, and Indexes" 4485 table = self.dbf_table 4486 table.open() 4487 list = List(table) 4488 index = Index(table, key=lambda rec: dbf.recno(rec)) 4489 total = len(table) 4490 mid = total // 2 4491 table.goto(mid) 4492 list.goto(mid) 4493 index.goto(mid) 4494 self.assertTrue(table.current != -1) 4495 self.assertTrue(list.current != -1) 4496 self.assertTrue(index.current != -1) 4497 table.bottom() 4498 list.bottom() 4499 index.bottom() 4500 self.assertEqual(table.current, total) 4501 self.assertEqual(list.current, total) 4502 self.assertEqual(index.current, total)
4503
4504 - def test_goto(self):
4505 "goto, current in Tables, Lists, and Indexes" 4506 table = self.dbf_table 4507 table.open() 4508 list = List(table) 4509 index = Index(table, key=lambda rec: dbf.recno(rec)) 4510 total = len(table) 4511 mid = total // 2 4512 table.goto(mid) 4513 list.goto(mid) 4514 index.goto(mid) 4515 self.assertEqual(table.current, mid) 4516 self.assertEqual(list.current, mid) 4517 self.assertEqual(index.current, mid) 4518 table.goto('top') 4519 list.goto('top') 4520 index.goto('top') 4521 self.assertEqual(table.current, -1) 4522 self.assertEqual(list.current, -1) 4523 self.assertEqual(index.current, -1) 4524 table.goto('bottom') 4525 list.goto('bottom') 4526 index.goto('bottom') 4527 self.assertEqual(table.current, total) 4528 self.assertEqual(list.current, total) 4529 self.assertEqual(index.current, total) 4530 dbf.delete(table[10]) 4531 self.assertTrue(dbf.is_deleted(list[10])) 4532 self.assertTrue(dbf.is_deleted(index[10])) 4533 table.goto(10) 4534 list.goto(10) 4535 index.goto(10) 4536 self.assertEqual(table.current, 10) 4537 self.assertEqual(list.current, 10) 4538 self.assertEqual(index.current, 10) 4539 table.close()
4540
4541 - def test_skip(self):
4542 "skip, current in Tables, Lists, and Indexes" 4543 table = self.dbf_table 4544 table.open() 4545 list = List(table) 4546 index = Index(table, key=lambda rec: dbf.recno(rec)) 4547 total = len(table) 4548 mid = total // 2 4549 self.assertEqual(table.current, -1) 4550 self.assertEqual(list.current, -1) 4551 self.assertEqual(index.current, -1) 4552 table.skip(1) 4553 list.skip(1) 4554 index.skip(1) 4555 self.assertEqual(table.current, 0) 4556 self.assertEqual(list.current, 0) 4557 self.assertEqual(index.current, 0) 4558 table.skip(10) 4559 list.skip(10) 4560 index.skip(10) 4561 self.assertEqual(table.current, 10) 4562 self.assertEqual(list.current, 10) 4563 self.assertEqual(index.current, 10) 4564 table.close()
4565
4566 - def test_first_record(self):
4567 "first_record in Tables, Lists, and Indexes" 4568 table = self.dbf_table 4569 table.open() 4570 list = List(table) 4571 index = Index(table, key=lambda rec: dbf.recno(rec)) 4572 total = len(table) 4573 mid = total // 2 4574 self.assertTrue(table[0] is list[0]) 4575 self.assertTrue(table[0] is index[0]) 4576 self.assertTrue(table.first_record is table[0]) 4577 self.assertTrue(list.first_record is table[0]) 4578 self.assertTrue(index.first_record is table[0]) 4579 table.close()
4580
4581 - def test_prev_record(self):
4582 "prev_record in Tables, Lists, and Indexes" 4583 table = self.dbf_table 4584 table.open() 4585 list = List(table) 4586 index = Index(table, key=lambda rec: dbf.recno(rec)) 4587 total = len(table) 4588 mid = total // 2 4589 self.assertTrue(table[0] is list[0]) 4590 self.assertTrue(table[0] is index[0]) 4591 table.top() 4592 list.top() 4593 index.top() 4594 self.assertTrue(isinstance(table.prev_record, dbf.RecordVaporWare)) 4595 self.assertTrue(isinstance(list.prev_record, dbf.RecordVaporWare)) 4596 self.assertTrue(isinstance(index.prev_record, dbf.RecordVaporWare)) 4597 table.skip() 4598 list.skip() 4599 index.skip() 4600 self.assertTrue(isinstance(table.prev_record, dbf.RecordVaporWare)) 4601 self.assertTrue(isinstance(list.prev_record, dbf.RecordVaporWare)) 4602 self.assertTrue(isinstance(index.prev_record, dbf.RecordVaporWare)) 4603 table.skip() 4604 list.skip() 4605 index.skip() 4606 self.assertTrue(table.prev_record is table[0]) 4607 self.assertTrue(list.prev_record is table[0]) 4608 self.assertTrue(index.prev_record is table[0]) 4609 table.close()
4610
4611 - def test_current_record(self):
4612 "current_record in Tables, Lists, and Indexes" 4613 table = self.dbf_table 4614 table.open() 4615 list = List(table) 4616 index = Index(table, key=lambda rec: dbf.recno(rec)) 4617 total = len(table) 4618 mid = total // 2 4619 table.top() 4620 list.top() 4621 index.top() 4622 self.assertTrue(isinstance(table.current_record, dbf.RecordVaporWare)) 4623 self.assertTrue(isinstance(list.current_record, dbf.RecordVaporWare)) 4624 self.assertTrue(isinstance(index.current_record, dbf.RecordVaporWare)) 4625 table.bottom() 4626 list.bottom() 4627 index.bottom() 4628 self.assertTrue(isinstance(table.current_record, dbf.RecordVaporWare)) 4629 self.assertTrue(isinstance(list.current_record, dbf.RecordVaporWare)) 4630 self.assertTrue(isinstance(index.current_record, dbf.RecordVaporWare)) 4631 table.goto(mid) 4632 list.goto(mid) 4633 index.goto(mid) 4634 self.assertTrue(table.current_record is table[mid]) 4635 self.assertTrue(list.current_record is table[mid]) 4636 self.assertTrue(index.current_record is table[mid]) 4637 table.close()
4638
4639 - def test_next_record(self):
4640 "prev_record in Tables, Lists, and Indexes" 4641 table = self.dbf_table 4642 table.open() 4643 list = List(table) 4644 index = Index(table, key=lambda rec: dbf.recno(rec)) 4645 total = len(table) 4646 mid = total // 2 4647 self.assertTrue(table[0] is list[0]) 4648 self.assertTrue(table[0] is index[0]) 4649 table.bottom() 4650 list.bottom() 4651 index.bottom() 4652 self.assertTrue(isinstance(table.next_record, dbf.RecordVaporWare)) 4653 self.assertTrue(isinstance(list.next_record, dbf.RecordVaporWare)) 4654 self.assertTrue(isinstance(index.next_record, dbf.RecordVaporWare)) 4655 table.skip(-1) 4656 list.skip(-1) 4657 index.skip(-1) 4658 self.assertTrue(isinstance(table.next_record, dbf.RecordVaporWare)) 4659 self.assertTrue(isinstance(list.next_record, dbf.RecordVaporWare)) 4660 self.assertTrue(isinstance(index.next_record, dbf.RecordVaporWare)) 4661 table.skip(-1) 4662 list.skip(-1) 4663 index.skip(-1) 4664 self.assertTrue(table.next_record is table[-1]) 4665 self.assertTrue(list.next_record is table[-1]) 4666 self.assertTrue(index.next_record is table[-1]) 4667 table.close()
4668
4669 - def test_last_record(self):
4670 "last_record in Tables, Lists, and Indexes" 4671 table = self.dbf_table 4672 table.open() 4673 list = List(table) 4674 index = Index(table, key=lambda rec: dbf.recno(rec)) 4675 total = len(table) 4676 mid = total // 2 4677 self.assertTrue(table[-1] is list[-1]) 4678 self.assertTrue(table[-1] is index[-1]) 4679 self.assertTrue(table.last_record is table[-1]) 4680 self.assertTrue(list.last_record is table[-1]) 4681 self.assertTrue(index.last_record is table[-1]) 4682 table.close()
4683
4684 -class TestDbfLists(unittest.TestCase):
4685 "DbfList tests"
4686 - def setUp(self):
4687 self.tempdir = tempfile.mkdtemp() 4688 "create a dbf table" 4689 self.dbf_table = table = Table( 4690 os.path.join(self.tempdir, 'temptable'), 4691 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3' 4692 ) 4693 table.open() 4694 records = [] 4695 for i in range(len(floats)): 4696 name = words[i] 4697 paid = len(words[i]) % 3 == 0 4698 qty = round(floats[i], 5) 4699 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 4700 desc = ' '.join(words[i:i+50]) 4701 data = {'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc} 4702 table.append(data) 4703 records.append(data) 4704 table.close() 4705 table.open() 4706 for trec, drec in zip(table, records): 4707 self.assertEqual(trec.name.strip(), drec['name']) 4708 self.assertEqual(trec.paid, drec['paid']) 4709 self.assertEqual(trec.qty, drec['qty']) 4710 self.assertEqual(trec.orderdate, drec['orderdate']) 4711 self.assertEqual(trec.desc, drec['desc']) 4712 table.close()
4713 - def tearDown(self):
4714 self.dbf_table.close() 4715 shutil.rmtree(self.tempdir, True)
4716 - def test_exceptions(self):
4717 table = self.dbf_table 4718 table.open() 4719 list = table[::5] 4720 record = table[5] 4721 dbf.delete(record) 4722 self.assertTrue(list[0] is table[0]) 4723 self.assertTrue(record in list) 4724 self.assertRaises(TypeError, list.__contains__, 'some string') 4725 self.assertRaises(TypeError, list.__getitem__, 'some string') 4726 self.assertRaises(TypeError, list.__delitem__, 'some string') 4727 self.assertRaises(TypeError, list.remove, 'some string') 4728 self.assertRaises(TypeError, list.index, 'some string') 4729 self.assertRaises(IndexError, list.__getitem__, 100) 4730 self.assertRaises(IndexError, list.pop, 1000) 4731 self.assertRaises(IndexError, list.goto, 1000) 4732 list.top() 4733 self.assertRaises(Bof, list.skip, -1) 4734 list.bottom() 4735 self.assertRaises(Eof, list.skip) 4736 table.pack() 4737 self.assertRaises(DbfError, list.__contains__, record) 4738 4739 list = List() 4740 self.assertRaises(IndexError, list.goto, 0) 4741 self.assertRaises(Bof, list.skip, -1) 4742 self.assertRaises(Eof, list.skip) 4743 self.assertRaises(ValueError, list.remove, table[0]) 4744 self.assertRaises(ValueError, list.index, table[1])
4745
4746 - def test_add_subtract(self):
4747 "addition and subtraction" 4748 table1 = self.dbf_table 4749 table1.open() 4750 list1 = table1[::2] 4751 list2 = table1[::3] 4752 list3 = table1[:] - list1 - list2 4753 self.assertEqual(100, len(table1)) 4754 self.assertEqual(list1[0], list2[0]) 4755 self.assertEqual(list1[3], list2[2]) 4756 self.assertEqual(50, len(list1)) 4757 self.assertEqual(34, len(list2)) 4758 self.assertEqual(33, len(list3)) 4759 self.assertEqual(117, len(list1) + len(list2) + len(list3)) 4760 self.assertEqual(len(table1), len(list1 + list2 + list3)) 4761 self.assertEqual(67, len(list1 + list2)) 4762 self.assertEqual(33, len(list1 - list2)) 4763 self.assertEqual(17, len(list2 - list1)) 4764 table1.close()
4765 - def test_append_extend(self):
4766 "appending and extending" 4767 table1 = self.dbf_table 4768 table1.open() 4769 list1 = table1[::2] 4770 list2 = table1[::3] 4771 list3 = table1[:] - list1 - list2 4772 list1.extend(list2) 4773 list2.append(table1[1]) 4774 self.assertEqual(67, len(list1)) 4775 self.assertEqual(35, len(list2)) 4776 list1.append(table1[1]) 4777 list2.extend(list3) 4778 self.assertEqual(68, len(list1)) 4779 self.assertEqual(67, len(list2)) 4780 table1.close()
4781 - def test_index(self):
4782 "indexing" 4783 table1 = self.dbf_table 4784 table1.open() 4785 list1 = table1[::2] 4786 list2 = table1[::3] 4787 list3 = table1[:] - list1 - list2 4788 for i, rec in enumerate(list1): 4789 self.assertEqual(i, list1.index(rec)) 4790 for rec in list3: 4791 self.assertRaises(ValueError, list1.index, rec ) 4792 table1.close()
4793 - def test_sort(self):
4794 "sorting" 4795 table1 = self.dbf_table 4796 table1.open() 4797 list1 = table1[::2] 4798 list2 = table1[::3] 4799 list3 = table1[:] - list1 - list2 4800 list4 = table1[:] 4801 index = table1.create_index(key = lambda rec: rec.name ) 4802 list4.sort(key=lambda rec: rec.name) 4803 for trec, lrec in zip(index, list4): 4804 self.assertEqual(dbf.recno(trec), dbf.recno(lrec)) 4805 table1.close()
4806 - def test_keys(self):
4807 "keys" 4808 table1 = self.dbf_table 4809 table1.open() 4810 field = table1.field_names[0] 4811 list1 = List(table1, key=lambda rec: rec[field]) 4812 unique = set() 4813 for rec in table1: 4814 if rec[field] not in unique: 4815 unique.add(rec[field]) 4816 else: 4817 self.assertRaises(NotFoundError, list1.index, rec) 4818 self.assertFalse(rec in list1) 4819 self.assertTrue(rec[field] in unique) 4820 self.assertEqual(len(unique), len(list1)) 4821 table1.close()
4822 - def test_contains(self):
4823 table = self.dbf_table 4824 table.open() 4825 list = List(table) 4826 i = 0 4827 for record in list: 4828 self.assertEqual(record, list[i]) 4829 self.assertTrue(record in list) 4830 self.assertTrue(tuple(record) in list) 4831 self.assertTrue(scatter(record) in list) 4832 self.assertTrue(create_template(record) in list) 4833 i += 1 4834 self.assertEqual(i, len(list)) 4835 table.close()
4836
4837 -class TestWhatever(unittest.TestCase):
4838 "move tests here to run one at a time while debugging"
4839 - def setUp(self):
4840 self.tempdir = tempfile.mkdtemp() 4841 "create a dbf and vfp table" 4842 self.dbf_table = table = Table( 4843 os.path.join(self.tempdir, 'temptable'), 4844 'name C(25); paid L; qty N(11,5); orderdate D; desc M', dbf_type='db3' 4845 ) 4846 table.open() 4847 namelist = self.dbf_namelist = [] 4848 paidlist = self.dbf_paidlist = [] 4849 qtylist = self.dbf_qtylist = [] 4850 orderlist = self.dbf_orderlist = [] 4851 desclist = self.dbf_desclist = [] 4852 for i in range(len(floats)): 4853 name = '%-25s' % words[i] 4854 paid = len(words[i]) % 3 == 0 4855 qty = round(floats[i], 5) 4856 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 4857 desc = ' '.join(words[i:i+50]) 4858 namelist.append(name) 4859 paidlist.append(paid) 4860 qtylist.append(qty) 4861 orderlist.append(orderdate) 4862 desclist.append(desc) 4863 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc}) 4864 table.close() 4865 4866 self.vfp_table = table = Table( 4867 os.path.join(self.tempdir, 'tempvfp'), 4868 'name C(25); paid L; qty N(11,5); orderdate D; desc M; mass B;' 4869 ' weight F(18,3); age I; meeting T; misc G; photo P', 4870 dbf_type='vfp', 4871 ) 4872 table.open() 4873 namelist = self.vfp_namelist = [] 4874 paidlist = self.vfp_paidlist = [] 4875 qtylist = self.vfp_qtylist = [] 4876 orderlist = self.vfp_orderlist = [] 4877 desclist = self.vfp_desclist = [] 4878 masslist = self.vfp_masslist = [] 4879 weightlist = self.vfp_weightlist = [] 4880 agelist = self.vfp_agelist = [] 4881 meetlist = self.vfp_meetlist = [] 4882 misclist = self.vfp_misclist = [] 4883 photolist = self.vfp_photolist = [] 4884 for i in range(len(floats)): 4885 name = words[i] 4886 paid = len(words[i]) % 3 == 0 4887 qty = round(floats[i], 5) 4888 orderdate = datetime.date((numbers[i] + 1) * 2, (numbers[i] % 12) +1, (numbers[i] % 27) + 1) 4889 desc = ' '.join(words[i:i+50]) 4890 mass = floats[i] * floats[i] / 2.0 4891 weight = round(floats[i] * 3, 3) 4892 age = numbers[i] 4893 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, \ 4894 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 4895 misc = ' '.join(words[i:i+50:3]).encode('ascii') 4896 photo = ' '.join(words[i:i+50:7]).encode('ascii') 4897 namelist.append('%-25s' % name) 4898 paidlist.append(paid) 4899 qtylist.append(qty) 4900 orderlist.append(orderdate) 4901 desclist.append(desc) 4902 masslist.append(mass) 4903 weightlist.append(weight) 4904 agelist.append(age) 4905 meetlist.append(meeting) 4906 misclist.append(misc) 4907 photolist.append(photo) 4908 meeting = datetime.datetime((numbers[i] + 2000), (numbers[i] % 12)+1, (numbers[i] % 28)+1, 4909 (numbers[i] % 24), numbers[i] % 60, (numbers[i] * 3) % 60) 4910 table.append({'name':name, 'paid':paid, 'qty':qty, 'orderdate':orderdate, 'desc':desc, 4911 'mass':mass, 'weight':weight, 'age':age, 'meeting':meeting, 'misc':misc, 'photo':photo}) 4912 table.close()
4913 - def tearDown(self):
4914 self.dbf_table.close() 4915 self.vfp_table.close() 4916 shutil.rmtree(self.tempdir, True)
4917 # main 4918 if __name__ == '__main__': 4919 unittest.main() 4920