97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
# Copyright: Ankitects Pty Ltd and contributors
|
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
import time
|
|
|
|
from anki.consts import *
|
|
from tests.shared import getEmptyCol as getEmptyColOrig
|
|
|
|
|
|
def getEmptyCol():
|
|
col = getEmptyColOrig()
|
|
col.upgrade_to_v2_scheduler()
|
|
return col
|
|
|
|
|
|
def test_op():
|
|
col = getEmptyCol()
|
|
col.set_v3_scheduler(False)
|
|
# should have no undo by default
|
|
assert not col.undo_status().undo
|
|
# let's adjust a study option
|
|
col.save("studyopts")
|
|
col.conf["abc"] = 5
|
|
# it should be listed as undoable
|
|
assert col.undo_status().undo == "studyopts"
|
|
# with about 5 minutes until it's clobbered
|
|
assert time.time() - col._last_checkpoint_at < 1
|
|
# undoing should restore the old value
|
|
col.undo_legacy()
|
|
assert not col.undo_status().undo
|
|
assert "abc" not in col.conf
|
|
# an (auto)save will clear the undo
|
|
col.save("foo")
|
|
assert col.undo_status().undo == "foo"
|
|
col.save()
|
|
assert not col.undo_status().undo
|
|
# and a review will, too
|
|
col.save("add")
|
|
note = col.newNote()
|
|
note["Front"] = "one"
|
|
col.addNote(note)
|
|
col.reset()
|
|
assert "add" in col.undo_status().undo.lower()
|
|
c = col.sched.getCard()
|
|
col.sched.answerCard(c, 2)
|
|
assert col.undo_status().undo == "Review"
|
|
|
|
|
|
def test_review():
|
|
col = getEmptyCol()
|
|
col.set_v3_scheduler(False)
|
|
col.conf["counts"] = COUNT_REMAINING
|
|
note = col.newNote()
|
|
note["Front"] = "one"
|
|
col.addNote(note)
|
|
note = col.newNote()
|
|
note["Front"] = "two"
|
|
col.addNote(note)
|
|
col.reset()
|
|
# answer
|
|
assert col.sched.counts() == (2, 0, 0)
|
|
c = col.sched.getCard()
|
|
assert c.queue == QUEUE_TYPE_NEW
|
|
col.sched.answerCard(c, 3)
|
|
assert c.left % 1000 == 1
|
|
assert col.sched.counts() == (1, 1, 0)
|
|
assert c.queue == QUEUE_TYPE_LRN
|
|
# undo
|
|
assert col.undo_status().undo
|
|
col.undo_legacy()
|
|
col.reset()
|
|
assert col.sched.counts() == (2, 0, 0)
|
|
c.load()
|
|
assert c.queue == QUEUE_TYPE_NEW
|
|
assert c.left % 1000 != 1
|
|
assert not col.undo_status().undo
|
|
# we should be able to undo multiple answers too
|
|
c = col.sched.getCard()
|
|
col.sched.answerCard(c, 3)
|
|
c = col.sched.getCard()
|
|
col.sched.answerCard(c, 3)
|
|
assert col.sched.counts() == (0, 2, 0)
|
|
col.undo_legacy()
|
|
col.reset()
|
|
assert col.sched.counts() == (1, 1, 0)
|
|
col.undo_legacy()
|
|
col.reset()
|
|
assert col.sched.counts() == (2, 0, 0)
|
|
# performing a normal op will clear the review queue
|
|
c = col.sched.getCard()
|
|
col.sched.answerCard(c, 3)
|
|
assert col.undo_status().undo == "Review"
|
|
col.save("foo")
|
|
assert col.undo_status().undo == "foo"
|
|
col.undo_legacy()
|
|
assert not col.undo_status().undo
|