Search in sources :

Example 66 with Time

use of com.ichi2.libanki.utils.Time in project Anki-Android by ankidroid.

the class SchedTest method testRevLogValues.

@Test
public void testRevLogValues() {
    MutableTime time = new MutableTime(MockTime.timeStamp(2020, 8, 4, 11, 22, 19, 123), 10);
    Collection col = CollectionHelper.getInstance().getCol(getTargetContext(), time);
    addNoteUsingBasicModel("Hello", "World");
    AbstractSched sched = col.getSched();
    Card c = sched.getCard();
    time.setFrozen(true);
    long currentTime = time.getInternalTimeMs();
    sched.answerCard(c, BUTTON_ONE);
    long timeAnswered = col.getDb().queryLongScalar("select id from revlog");
    assertThat(timeAnswered, is(currentTime));
}
Also used : MutableTime(com.ichi2.testutils.MutableTime) Collection(com.ichi2.libanki.Collection) Card(com.ichi2.libanki.Card) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 67 with Time

use of com.ichi2.libanki.utils.Time in project Anki-Android by ankidroid.

the class SchedTest method test_timingV1.

@Test
public void test_timingV1() throws Exception {
    Collection col = getColV1();
    // add a few review cards, due today
    for (int i = 0; i < 5; i++) {
        Note note = col.newNote();
        note.setItem("Front", "num" + i);
        col.addNote(note);
        Card c = note.cards().get(0);
        c.setType(CARD_TYPE_REV);
        c.setQueue(QUEUE_TYPE_REV);
        c.setDue(0);
        c.flush();
    }
    // fail the first one
    col.reset();
    Card c = getCard();
    // set a a fail delay of 4 seconds
    DeckConfig conf = col.getSched()._cardConf(c);
    conf.getJSONObject("lapse").getJSONArray("delays").put(0, 1 / 15.0);
    col.getDecks().save(conf);
    col.getSched().answerCard(c, BUTTON_ONE);
    // the next card should be another review
    c = getCard();
    assertEquals(QUEUE_TYPE_REV, c.getQueue());
/* TODO time
        // but if we wait for a few seconds, the failed card should come back
        orig_time = time.time;

        def adjusted_time():
        return orig_time() + 5;

        time.time = adjusted_time;
        c = getCard();
        assertEquals(QUEUE_TYPE_LRN, c.getQueue());
        time.time = orig_time;

        */
}
Also used : Note(com.ichi2.libanki.Note) Collection(com.ichi2.libanki.Collection) DeckConfig(com.ichi2.libanki.DeckConfig) Card(com.ichi2.libanki.Card) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 68 with Time

use of com.ichi2.libanki.utils.Time in project Anki-Android by ankidroid.

the class SchedTest method test_learnV1.

@Test
public void test_learnV1() throws Exception {
    Collection col = getColV1();
    // add a note
    Note note = col.newNote();
    note.setItem("Front", "one");
    note.setItem("Back", "two");
    col.addNote(note);
    // set as a learn card and rebuild queues
    col.getDb().execute("update cards set queue=0, type=0");
    col.reset();
    // sched.getCard should return it, since it's due in the past
    Card c = getCard();
    assertNotNull(c);
    DeckConfig conf = col.getSched()._cardConf(c);
    conf.getJSONObject("new").put("delays", new JSONArray(new double[] { 0.5, 3, 10 }));
    col.getDecks().save(conf);
    // fail it
    col.getSched().answerCard(c, BUTTON_ONE);
    // it should have three reps left to graduation
    assertEquals(3, c.getLeft() % 1000);
    assertEquals(3, c.getLeft() / 1000);
    // it should be due in 30 seconds
    long t = Math.round(c.getDue() - col.getTime().intTime());
    assertThat(t, is(greaterThanOrEqualTo(25L)));
    assertThat(t, is(lessThanOrEqualTo(40L)));
    // pass it once
    col.getSched().answerCard(c, BUTTON_TWO);
    // it should be due in 3 minutes
    assertEquals(Math.round(c.getDue() - col.getTime().intTime()), 179, 1);
    assertEquals(2, c.getLeft() % 1000);
    assertEquals(2, c.getLeft() / 1000);
    // check log is accurate
    Cursor log = col.getDb().getDatabase().query("select * from revlog order by id desc");
    assertTrue(log.moveToFirst());
    assertEquals(2, log.getInt(3));
    assertEquals(-180, log.getInt(4));
    assertEquals(-30, log.getInt(5));
    // pass again
    col.getSched().answerCard(c, BUTTON_TWO);
    // it should be due in 10 minutes
    assertEquals(c.getDue() - col.getTime().intTime(), 599, 1);
    assertEquals(1, c.getLeft() % 1000);
    assertEquals(1, c.getLeft() / 1000);
    // the next pass should graduate the card
    assertEquals(QUEUE_TYPE_LRN, c.getQueue());
    assertEquals(CARD_TYPE_LRN, c.getType());
    col.getSched().answerCard(c, BUTTON_TWO);
    assertEquals(QUEUE_TYPE_REV, c.getQueue());
    assertEquals(CARD_TYPE_REV, c.getType());
    // should be due tomorrow, with an interval of 1
    assertEquals(col.getSched().getToday() + 1, c.getDue());
    assertEquals(1, c.getIvl());
    // or normal removal
    c.setType(CARD_TYPE_NEW);
    c.setQueue(QUEUE_TYPE_LRN);
    col.getSched().answerCard(c, BUTTON_THREE);
    assertEquals(CARD_TYPE_REV, c.getType());
    assertEquals(QUEUE_TYPE_REV, c.getQueue());
    assertTrue(checkRevIvl(col, c, 4));
    // revlog should have been updated each time
    assertEquals(5, col.getDb().queryScalar("select count() from revlog where type = 0"));
    // now failed card handling
    c.setType(CARD_TYPE_REV);
    c.setQueue(QUEUE_TYPE_LRN);
    c.setODue(123);
    col.getSched().answerCard(c, BUTTON_THREE);
    assertEquals(123, c.getDue());
    assertEquals(CARD_TYPE_REV, c.getType());
    assertEquals(QUEUE_TYPE_REV, c.getQueue());
    // we should be able to remove manually, too
    c.setType(CARD_TYPE_REV);
    c.setQueue(QUEUE_TYPE_LRN);
    c.setODue(321);
    c.flush();
    ((Sched) col.getSched()).removeLrn();
    c.load();
    assertEquals(QUEUE_TYPE_REV, c.getQueue());
    assertEquals(321, c.getDue());
}
Also used : Note(com.ichi2.libanki.Note) JSONArray(com.ichi2.utils.JSONArray) Collection(com.ichi2.libanki.Collection) Cursor(android.database.Cursor) DeckConfig(com.ichi2.libanki.DeckConfig) Card(com.ichi2.libanki.Card) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 69 with Time

use of com.ichi2.libanki.utils.Time in project Anki-Android by ankidroid.

the class AbstractSchedTest method regression_7984.

@Test
public void regression_7984() {
    Collection col = getCol();
    SchedV2 sched = (SchedV2) col.getSched();
    Time time = getCol().getTime();
    Card[] cards = new Card[2];
    for (int i = 0; i < 2; i++) {
        cards[i] = addNoteUsingBasicModel(Integer.toString(i), "").cards().get(0);
        cards[i].setQueue(Consts.QUEUE_TYPE_LRN);
        cards[i].setType(Consts.CARD_TYPE_LRN);
        cards[i].setDue(time.intTime() - 20 * 60 + i);
        cards[i].flush();
    }
    col.reset();
    // Regression test success non deterministically without the sleep
    Card gotten = sched.getCard();
    advanceRobolectricLooperWithSleep();
    assertThat(gotten, is(cards[0]));
    sched.answerCard(gotten, Consts.BUTTON_ONE);
    gotten = sched.getCard();
    assertThat(gotten, is(cards[1]));
    sched.answerCard(gotten, Consts.BUTTON_ONE);
    gotten = sched.getCard();
    assertThat(gotten, is(cards[0]));
}
Also used : Collection(com.ichi2.libanki.Collection) Time(com.ichi2.libanki.utils.Time) Card(com.ichi2.libanki.Card) RobolectricTest(com.ichi2.anki.RobolectricTest) Test(org.junit.Test)

Example 70 with Time

use of com.ichi2.libanki.utils.Time in project Anki-Android by ankidroid.

the class MockTimeTest method DateTest.

@Test
public void DateTest() {
    MockTime time = new MockTime(2020, 7, 7, 7, 0, 0, 0, 0);
    Assert.assertEquals(1596783600000L, time.intTimeMS());
    Assert.assertEquals(1596783600000L, MockTime.timeStamp(2020, 7, 7, 7, 0, 0));
}
Also used : MockTime(com.ichi2.testutils.MockTime) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)27 Collection (com.ichi2.libanki.Collection)26 JSONObject (com.ichi2.utils.JSONObject)26 RobolectricTest (com.ichi2.anki.RobolectricTest)19 Card (com.ichi2.libanki.Card)19 Note (com.ichi2.libanki.Note)15 JSONArray (com.ichi2.utils.JSONArray)15 Deck (com.ichi2.libanki.Deck)11 ArrayList (java.util.ArrayList)11 DeckConfig (com.ichi2.libanki.DeckConfig)10 IOException (java.io.IOException)10 ConfirmModSchemaException (com.ichi2.anki.exception.ConfirmModSchemaException)9 HashMap (java.util.HashMap)9 Cursor (android.database.Cursor)8 Nullable (androidx.annotation.Nullable)8 JSONException (com.ichi2.utils.JSONException)8 SharedPreferences (android.content.SharedPreferences)7 Resources (android.content.res.Resources)7 File (java.io.File)7 View (android.view.View)5