use of com.ichi2.anki.CardBrowser.Column.CARD in project AnkiChinaAndroid by ankichinateam.
the class CardTemplateEditorTest method testDeleteTemplateWithSelectivelyGeneratedCards.
/**
* In a model with two card templates using different fields, some notes may only use card 1,
* and some may only use card 2. If you delete the 2nd template,
* it will cause the notes that only use card 2 to disappear.
*
* So the unit test would then be to make a model like the "basic (optional reverse card)"
* with two fields Enable1 and Enable2, and two templates "card 1" and "card 2".
* Both cards use selective generation, so they're empty unless the corresponding field is set.
*
* So then in the unit test you make the model, add the two templates, then you add two notes,
* with Enable1 and Enable2 respectively set to "y".
* Then you try to delete one of the templates and it should fail
*
* (question: but I thought deleting one should work - still one card left to maintain the note,
* and second template delete should fail since we finally get to a place where no cards are left?
* I am having trouble creating selectively generated cards though - I can do one optional field but not 2 ugh)
*/
@Test
public void testDeleteTemplateWithSelectivelyGeneratedCards() {
String modelName = "Basic (optional reversed card)";
Model collectionBasicModelOriginal = getCurrentDatabaseModelCopy(modelName);
// Start the CardTemplateEditor with a specific model, and make sure the model starts unchanged
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("modelId", collectionBasicModelOriginal.getLong("id"));
ActivityController<CardTemplateEditor> templateEditorController = Robolectric.buildActivity(CardTemplateEditor.class, intent).create().start().resume().visible();
saveControllerForCleanup(templateEditorController);
CardTemplateEditor testEditor = (CardTemplateEditor) templateEditorController.get();
Assert.assertFalse("Model should not have changed yet", testEditor.modelHasChanged());
Assert.assertEquals("Model should have 2 templates now", 2, testEditor.getTempModel().getTemplateCount());
Assert.assertFalse("Ordinal pending add?", TemporaryModel.isOrdinalPendingAdd(testEditor.getTempModel(), 0));
Assert.assertFalse("Ordinal pending add?", TemporaryModel.isOrdinalPendingAdd(testEditor.getTempModel(), 1));
// Try to delete Card 1 template - click delete, check confirm for card delete popup indicating it was possible, then dismiss it
ShadowActivity shadowTestEditor = shadowOf(testEditor);
Assert.assertTrue("Unable to click?", shadowTestEditor.clickMenuItem(R.id.action_delete));
advanceRobolectricLooper();
Assert.assertEquals("Wrong dialog shown?", "Delete the “Card 1” card type, and its 0 cards?", getDialogText(true));
clickDialogButton(DialogAction.NEGATIVE, true);
advanceRobolectricLooper();
Assert.assertFalse("Model should not have changed", testEditor.modelHasChanged());
// Create note with forward and back info, Add Reverse is empty, so should only be one card
Note selectiveGeneratedNote = getCol().newNote(collectionBasicModelOriginal);
selectiveGeneratedNote.setField(0, "TestFront");
selectiveGeneratedNote.setField(1, "TestBack");
String[] fields = selectiveGeneratedNote.getFields();
for (String field : fields) {
Timber.d("Got a field: %s", field);
}
getCol().addNote(selectiveGeneratedNote);
Assert.assertEquals("selective generation should result in one card", 1, getModelCardCount(collectionBasicModelOriginal));
// Try to delete the template again, but there's selective generation means it would orphan the note
Assert.assertTrue("Unable to click?", shadowTestEditor.clickMenuItem(R.id.action_delete));
advanceRobolectricLooper();
Assert.assertEquals("Did not show dialog about deleting only card?", getResourceString(R.string.card_template_editor_would_delete_note), getDialogText(true));
clickDialogButton(DialogAction.POSITIVE, true);
advanceRobolectricLooper();
Assert.assertNull("Can delete used template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 0 }));
Assert.assertEquals("Change already in database?", collectionBasicModelOriginal.toString().trim(), getCurrentDatabaseModelCopy(modelName).toString().trim());
Assert.assertFalse("Ordinal pending add?", TemporaryModel.isOrdinalPendingAdd(testEditor.getTempModel(), 0));
Assert.assertEquals("Change incorrectly added to list?", 0, testEditor.getTempModel().getTemplateChanges().size());
// Assert can delete 'Card 2'
Assert.assertNotNull("Cannot delete unused template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 1 }));
// Edit note to have Add Reverse set to 'y' so we get a second card
selectiveGeneratedNote.setField(2, "y");
selectiveGeneratedNote.flush();
// - assert two cards
Assert.assertEquals("should be two cards now", 2, getModelCardCount(collectionBasicModelOriginal));
// - assert can delete either Card template but not both
Assert.assertNotNull("Cannot delete template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 0 }));
Assert.assertNotNull("Cannot delete template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 1 }));
Assert.assertNull("Can delete both templates?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 0, 1 }));
// A couple more notes to make sure things are okay
Note secondNote = getCol().newNote(collectionBasicModelOriginal);
secondNote.setField(0, "TestFront2");
secondNote.setField(1, "TestBack2");
secondNote.setField(2, "y");
getCol().addNote(secondNote);
// - assert can delete either Card template but not both
Assert.assertNotNull("Cannot delete template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 0 }));
Assert.assertNotNull("Cannot delete template?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 1 }));
Assert.assertNull("Can delete both templates?", getCol().getModels().getCardIdsForModel(collectionBasicModelOriginal.getLong("id"), new int[] { 0, 1 }));
}
use of com.ichi2.anki.CardBrowser.Column.CARD in project AnkiChinaAndroid by ankichinateam.
the class ReviewerTest method jsTime4ShouldBeBlankIfButtonUnavailable.
@Test
public void jsTime4ShouldBeBlankIfButtonUnavailable() {
// #6623 - easy should be blank when displaying a card with 3 buttons (after displaying a review)
Note firstNote = addNoteUsingBasicModel("Hello", "World");
moveToReviewQueue(firstNote.firstCard());
addNoteUsingBasicModel("Hello", "World2");
Reviewer reviewer = startReviewer();
JavaScriptFunction javaScriptFunction = reviewer.javaScriptFunction();
// The answer needs to be displayed to be able to get the time.
displayAnswer(reviewer);
assertThat("4 buttons should be displayed", reviewer.getAnswerButtonCount(), is(4));
String nextTime = javaScriptFunction.ankiGetNextTime4();
assertThat(nextTime, not(isEmptyString()));
// Display the next answer
reviewer.answerCard(EASE_4);
displayAnswer(reviewer);
if (schedVersion == 1) {
assertThat("The 4th button should not be visible", reviewer.getAnswerButtonCount(), is(3));
String learnTime = javaScriptFunction.ankiGetNextTime4();
assertThat("If the 4th button is not visible, there should be no time4 in JS", learnTime, isEmptyString());
}
}
use of com.ichi2.anki.CardBrowser.Column.CARD in project AnkiChinaAndroid by ankichinateam.
the class CardTest method test_genrem.
@Test
public void test_genrem() {
Collection col = getCol();
Note note = col.newNote();
note.setItem("Front", "1");
note.setItem("Back", "");
col.addNote(note);
assertEquals(1, note.numberOfCards());
Model m = col.getModels().current();
Models mm = col.getModels();
// adding a new template should automatically create cards
JSONObject t = Models.newTemplate("rev");
t.put("qfmt", "{{Front}}");
t.put("afmt", "");
mm.addTemplateModChanged(m, t);
mm.save(m, true);
assertEquals(2, note.numberOfCards());
// if the template is changed to remove cards, they'll be removed
t = m.getJSONArray("tmpls").getJSONObject(1);
t.put("qfmt", "{{Back}}");
mm.save(m, true);
List<Long> rep = col.emptyCids();
col.remCards(rep);
assertEquals(1, note.numberOfCards());
// if we add to the note, a card should be automatically generated
note.load();
note.setItem("Back", "1");
note.flush();
assertEquals(2, note.numberOfCards());
}
use of com.ichi2.anki.CardBrowser.Column.CARD in project AnkiChinaAndroid by ankichinateam.
the class CollectionTest method test_noteAddDelete.
/**
*****************
** autogenerated from https://github.com/ankitects/anki/blob/2c73dcb2e547c44d9e02c20a00f3c52419dc277b/pylib/tests/test_cards.py *
******************
*/
/*TODO
@Test
public void test_create_open(){
(fd, path) = tempfile.mkstemp(suffix=".anki2", prefix="test_attachNew");
try {
os.close(fd);
os.unlink(path);
} catch (OSError) {
}
Collection col = aopen(path);
// for open()
String newPath = col.getPath();
long newMod = col.getMod();
col.close();
// reopen
col = aopen(newPath);
assertEquals(newMod, col.getMod());
col.close();
// non-writeable dir
if (isWin) {
String dir = "c:\root.anki2";
} else {
String dir = "/attachroot.anki2";
}
assertException(Exception, lambda: aopen(dir));
// reuse tmp file from before, test non-writeable file
os.chmod(newPath, 0);
assertException(Exception, lambda: aopen(newPath));
os.chmod(newPath, 0o666);
os.unlink(newPath);
} */
@Test
public void test_noteAddDelete() {
Collection col = getCol();
// add a note
Note note = col.newNote();
note.setItem("Front", "one");
note.setItem("Back", "two");
int n = col.addNote(note);
assertEquals(1, n);
// test multiple cards - add another template
Model m = col.getModels().current();
Models mm = col.getModels();
JSONObject t = Models.newTemplate("Reverse");
t.put("qfmt", "{{Back}}");
t.put("afmt", "{{Front}}");
mm.addTemplateModChanged(m, t);
// todo: remove true which is not upstream
mm.save(m, true);
assertEquals(2, col.cardCount());
// creating new notes should use both cards
note = col.newNote();
note.setItem("Front", "three");
note.setItem("Back", "four");
n = col.addNote(note);
assertEquals(2, n);
assertEquals(4, col.cardCount());
// check q/a generation
Card c0 = note.cards().get(0);
assertThat(c0.q(), containsString("three"));
// it should not be a duplicate
assertEquals(note.dupeOrEmpty(), Note.DupeOrEmpty.CORRECT);
// now let's make a duplicate
Note note2 = col.newNote();
note2.setItem("Front", "one");
note2.setItem("Back", "");
assertNotEquals(note2.dupeOrEmpty(), Note.DupeOrEmpty.CORRECT);
// empty first field should not be permitted either
note2.setItem("Front", " ");
assertNotEquals(note2.dupeOrEmpty(), Note.DupeOrEmpty.CORRECT);
}
use of com.ichi2.anki.CardBrowser.Column.CARD in project AnkiChinaAndroid by ankichinateam.
the class MathJaxClozeTest method verifyComplicatedMathJaxCloze.
@Test
public void verifyComplicatedMathJaxCloze() {
final Context context = ApplicationProvider.getApplicationContext();
Collection c = getCol();
Note f = c.newNote(c.getModels().byName("Cloze"));
f.setItem("Text", "the \\((\\){{c1::\\(x\\)}}\\()\\) is {{c2::\\(y\\)}} but not {{c1::\\(z\\)}} or {{c2::\\(\\lambda\\)}}");
c.addNote(f);
ArrayList<Card> cards = f.cards();
Card c2 = cards.get(0);
String q = c2.q();
String a = c2.a();
assertThat(q, endsWith("</style>the \\((\\)<span class=cloze>[...]</span>\\()\\) is \\(y\\) but not <span class=cloze>[...]</span> or \\(\\lambda\\)"));
assertThat(a, endsWith("</style>the \\((\\)<span class=cloze>\\(x\\)</span>\\()\\) is \\(y\\) but not <span class=cloze>\\(z\\)</span> or \\(\\lambda\\)<br>\n"));
}
Aggregations