Anki/tests/test_deck.py
2008-09-27 23:50:03 +09:00

139 lines
3.5 KiB
Python

# coding: utf-8
import nose, os
from tests.shared import assertException
from anki.errors import *
from anki import DeckStorage
from anki.db import *
from anki.models import FieldModel
from anki.stdmodels import JapaneseModel, BasicModel
newPath = None
newModified = None
## opening/closing
def test_new():
deck = DeckStorage.Deck()
assert deck.path
assert deck.engine
assert deck.modified
# for attachOld()
global newPath, newModified
newPath = deck.path
deck.save()
newModified = deck.modified
deck.close()
def test_attachNew():
path = "/tmp/test_attachNew"
try:
os.unlink(path)
except OSError:
pass
deck = DeckStorage.Deck(path)
deck.close()
del deck
os.unlink(path)
def test_attachOld():
deck = DeckStorage.Deck(newPath)
assert deck.modified == newModified
deck.close()
def test_attachReadOnly():
# non-writeable dir
assertException(DeckAccessError,
lambda: DeckStorage.Deck("/attachroot"))
# reuse tmp file from before, test non-writeable file
os.chmod(newPath, 0)
assertException(DeckAccessError,
lambda: DeckStorage.Deck(newPath))
os.chmod(newPath, 0666)
os.unlink(newPath)
def test_saveAs():
path = "/tmp/test_saveAs"
try:
os.unlink(path)
except OSError:
pass
deck = DeckStorage.Deck()
deck.addModel(BasicModel())
# add a card
f = deck.newFact()
f['Front'] = u"foo"; f['Back'] = u"bar"
deck.addFact(f)
# save in new deck
newDeck = deck.saveAs(path)
assert newDeck.cardCount() == 1
newDeck.close()
deck.close()
def test_factAddDelete():
deck = DeckStorage.Deck()
deck.addModel(BasicModel())
# set rollback point
deck.s.commit()
f = deck.newFact()
# empty fields
try:
deck.addFact(f)
except Exception, e:
pass
assert e.data['type'] == 'fieldEmpty'
# add a fact
f['Front'] = u"one"; f['Back'] = u"two"
deck.addFact(f)
assert len(f.cards) == 1
deck.rollback()
# try with two cards
f = deck.newFact()
f['Front'] = u"one"; f['Back'] = u"two"
f.model.cardModels[1].active = True
deck.addFact(f)
assert len(f.cards) == 2
# ensure correct order
c0 = [c for c in f.cards if c.ordinal == 0][0]
assert c0.question == u"one"
# now let's make a duplicate
f2 = deck.newFact()
f2['Front'] = u"one"; f2['Back'] = u"three"
try:
deck.addFact(f2)
except Exception, e:
pass
assert e.data['type'] == 'fieldNotUnique'
# try delete the first card
deck.deleteCard(f.cards[0].id)
# and the second should clear the fact
deck.deleteCard(f.cards[1].id)
def test_cardOrder():
deck = DeckStorage.Deck()
deck.addModel(JapaneseModel())
f = deck.newFact()
f['Expression'] = u'1'
f['Meaning'] = u'2'
deck.addFact(f)
card = deck.getCard()
# production should come first
assert card.cardModel.name == u"Production"
# if we rebuild the queue, it should be the same
deck.rebuildQueue()
card = deck.getCard()
assert card.cardModel.name == u"Production"
def test_modelAddDelete():
deck = DeckStorage.Deck()
deck.addModel(JapaneseModel())
deck.addModel(JapaneseModel())
f = deck.newFact()
f['Expression'] = u'1'
f['Meaning'] = u'2'
deck.addFact(f)
assert deck.cardCount() == 2
deck.deleteModel(deck.currentModel)
assert deck.cardCount() == 0
deck.s.refresh(deck)