diff --git a/anki/sched.py b/anki/sched.py index 8e4905ae9..bcceae499 100644 --- a/anki/sched.py +++ b/anki/sched.py @@ -746,15 +746,17 @@ did = ? and queue = 2 and due <= ? limit ?""", def _rescheduleLapse(self, card): conf = self._lapseConf(card) - card.lapses += 1 card.lastIvl = card.ivl - card.ivl = self._nextLapseIvl(card, conf) - card.factor = max(1300, card.factor-200) - card.due = self.today + card.ivl + if self._resched(card): + card.lapses += 1 + card.ivl = self._nextLapseIvl(card, conf) + card.factor = max(1300, card.factor-200) + card.due = self.today + card.ivl # put back in the learn queue? delay = 0 if conf['delays']: - card.odue = card.due + if not card.odue: + card.odue = card.due delay = self._delayForGrade(conf, 0) card.due = int(delay + time.time()) card.left = len(conf['delays']) @@ -772,10 +774,13 @@ did = ? and queue = 2 and due <= ? limit ?""", def _rescheduleRev(self, card, ease): # update interval card.lastIvl = card.ivl - self._updateRevIvl(card, ease) - # then the rest - card.factor = max(1300, card.factor+[-150, 0, 150][ease-2]) - card.due = self.today + card.ivl + if self._resched(card): + self._updateRevIvl(card, ease) + # then the rest + card.factor = max(1300, card.factor+[-150, 0, 150][ease-2]) + card.due = self.today + card.ivl + else: + card.due = card.odue if card.odid: card.did = card.odid card.odid = 0 diff --git a/tests/test_sched.py b/tests/test_sched.py index 3b9499199..b70d27b50 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -689,7 +689,42 @@ def test_cram_resched(): c.load() assert c.ivl == 100 assert c.due == d.sched.today + 25 - # due cards + # due cards - pass + c = cardcopy + c.due = -25 + c.flush() + d.sched.rebuildDyn(did) + d.reset() + c = d.sched.getCard() + d.sched.answerCard(c, 3) + d.sched.emptyDyn(did) + c.load() + assert c.ivl == 100 + assert c.due == -25 + # fail + c = cardcopy + c.due = -25 + c.flush() + d.sched.rebuildDyn(did) + d.reset() + c = d.sched.getCard() + d.sched.answerCard(c, 1) + d.sched.emptyDyn(did) + c.load() + assert c.ivl == 100 + assert c.due == -25 + # fail with normal grad + c = cardcopy + c.due = -25 + c.flush() + d.sched.rebuildDyn(did) + d.reset() + c = d.sched.getCard() + d.sched.answerCard(c, 1) + d.sched.answerCard(c, 3) + c.load() + assert c.ivl == 100 + assert c.due == -25 def test_adjIvl(): d = getEmptyDeck()