use of com.ichi2.utils.JSONException in project AnkiChinaAndroid by ankichinateam.
the class ClozeTest method testCloze.
@Test
public void testCloze() {
final Context context = ApplicationProvider.getApplicationContext();
Collection d = getCol();
Note f = d.newNote(d.getModels().byName("Cloze"));
try {
String name = f.model().getString("name");
assertEquals("Cloze", name);
} catch (JSONException e) {
fail();
}
// a cloze model with no clozes is not empty
f.setItem("Text", "nothing");
assertThat(d.addNote(f), is(greaterThan(0)));
// try with one cloze
f = d.newNote(d.getModels().byName("Cloze"));
f.setItem("Text", "hello {{c1::world}}");
assertEquals(1, d.addNote(f));
assertThat(f.firstCard().q(), containsString("hello <span class=cloze>[...]</span>"));
assertThat(f.firstCard().a(), containsString("hello <span class=cloze>world</span>"));
// and with a comment
f = d.newNote(d.getModels().byName("Cloze"));
f.setItem("Text", "hello {{c1::world::typical}}");
assertEquals(1, d.addNote(f));
assertThat(f.firstCard().q(), containsString("<span class=cloze>[typical]</span>"));
assertThat(f.firstCard().a(), containsString("<span class=cloze>world</span>"));
// and with two clozes
f = d.newNote(d.getModels().byName("Cloze"));
f.setItem("Text", "hello {{c1::world}} {{c2::bar}}");
assertEquals(2, d.addNote(f));
Card c1 = f.firstCard();
Card c2 = f.cards().get(1);
assertThat(c1.q(), containsString("<span class=cloze>[...]</span> bar"));
assertThat(c1.a(), containsString("<span class=cloze>world</span> bar"));
assertThat(c2.q(), containsString("world <span class=cloze>[...]</span>"));
assertThat(c2.a(), containsString("world <span class=cloze>bar</span>"));
// if there are multiple answers for a single cloze, they are given in a
// list
f = d.newNote(d.getModels().byName("Cloze"));
f.setItem("Text", "a {{c1::b}} {{c1::c}}");
assertEquals(1, d.addNote(f));
assertThat(f.firstCard().a(), containsString("<span class=cloze>b</span> <span class=cloze>c</span>"));
// if we add another cloze, a card should be generated
int cnt = d.cardCount();
f.setItem("Text", "{{c2::hello}} {{c1::foo}}");
f.flush();
assertEquals(cnt + 1, d.cardCount());
// 0 or negative indices are not supported
f.setItem("Text", "{{c0::zero}} {{c-1:foo}}");
f.flush();
assertEquals(2, f.cards().size());
// Try a multiline cloze
f.setItem("Text", "Cloze with {{c1::multi-line\n" + "string}}");
f.flush();
assertEquals(1, d.addNote(f));
String a = f.firstCard().q();
String b = f.firstCard().a();
assertThat(f.firstCard().q(), containsString("Cloze with <span class=cloze>[...]</span>"));
assertThat(f.firstCard().a(), containsString("Cloze with <span class=cloze>multi-line\nstring</span>"));
// try a multiline cloze in p tag
f.setItem("Text", "<p>Cloze in html tag with {{c1::multi-line\n" + "string}}</p>");
f.flush();
assertEquals(1, d.addNote(f));
assertThat(f.firstCard().q(), containsString("<p>Cloze in html tag with <span class=cloze>[...]</span>"));
assertThat(f.firstCard().a(), containsString("<p>Cloze in html tag with <span class=cloze>multi-line\nstring</span>"));
// make sure multiline cloze things aren't too greedy
f.setItem("Text", "<p>Cloze in html tag with {{c1::multi-line\n" + "string}} and then {{c2:another\n" + "one}}</p>");
f.flush();
assertEquals(1, d.addNote(f));
assertThat(f.firstCard().q(), containsString("<p>Cloze in html tag with <span class=cloze>[...]</span> and then {{c2:another\n" + "one}}</p>"));
assertThat(f.firstCard().a(), containsString("<p>Cloze in html tag with <span class=cloze>multi-line\n" + "string</span> and then {{c2:another\n" + "one}}</p>"));
}
use of com.ichi2.utils.JSONException in project Anki-Android by ankidroid.
the class Sched method _updateRevIvl.
@Override
protected void _updateRevIvl(@NonNull Card card, @Consts.BUTTON_TYPE int ease) {
try {
int idealIvl = _nextRevIvl(card, ease);
JSONObject conf = _revConf(card);
card.setIvl(Math.min(Math.max(_adjRevIvl(card, idealIvl), card.getIvl() + 1), conf.getInt("maxIvl")));
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
use of com.ichi2.utils.JSONException in project Anki-Android by ankidroid.
the class Collection method fixIntegrity.
/**
* Fix possible problems and rebuild caches.
*/
public CheckDatabaseResult fixIntegrity(TaskManager.ProgressCallback<String> progressCallback) {
File file = new File(mPath);
CheckDatabaseResult result = new CheckDatabaseResult(file.length());
final int[] currentTask = { 1 };
// a few fixes are in all-models loops, the rest are one-offs
int totalTasks = (getModels().all().size() * 4) + 27;
Runnable notifyProgress = () -> fixIntegrityProgress(progressCallback, currentTask[0]++, totalTasks);
Consumer<FunctionalInterfaces.FunctionThrowable<Runnable, List<String>, JSONException>> executeIntegrityTask = function -> {
// DEFECT: notifyProgress will lag if an exception is thrown.
try {
mDb.getDatabase().beginTransaction();
result.addAll(function.apply(notifyProgress));
mDb.getDatabase().setTransactionSuccessful();
} catch (Exception e) {
Timber.e(e, "Failed to execute integrity check");
AnkiDroidApp.sendExceptionReport(e, "fixIntegrity");
} finally {
try {
mDb.getDatabase().endTransaction();
} catch (Exception e) {
Timber.e(e, "Failed to end integrity check transaction");
AnkiDroidApp.sendExceptionReport(e, "fixIntegrity - endTransaction");
}
}
};
try {
mDb.getDatabase().beginTransaction();
save();
notifyProgress.run();
if (!mDb.getDatabase().isDatabaseIntegrityOk()) {
return result.markAsFailed();
}
mDb.getDatabase().setTransactionSuccessful();
} catch (SQLiteDatabaseLockedException ex) {
Timber.w(ex, "doInBackgroundCheckDatabase - Database locked");
return result.markAsLocked();
} catch (RuntimeException e) {
Timber.e(e, "doInBackgroundCheckDatabase - RuntimeException on marking card");
AnkiDroidApp.sendExceptionReport(e, "doInBackgroundCheckDatabase");
return result.markAsFailed();
} finally {
// if the database was locked, we never got the transaction.
if (mDb.getDatabase().inTransaction()) {
mDb.getDatabase().endTransaction();
}
}
executeIntegrityTask.accept(this::deleteNotesWithMissingModel);
// for each model
for (Model m : getModels().all()) {
executeIntegrityTask.accept((callback) -> deleteCardsWithInvalidModelOrdinals(callback, m));
executeIntegrityTask.accept((callback) -> deleteNotesWithWrongFieldCounts(callback, m));
}
executeIntegrityTask.accept(this::deleteNotesWithMissingCards);
executeIntegrityTask.accept(this::deleteCardsWithMissingNotes);
executeIntegrityTask.accept(this::removeOriginalDuePropertyWhereInvalid);
executeIntegrityTask.accept(this::removeDynamicPropertyFromNonDynamicDecks);
executeIntegrityTask.accept(this::removeDeckOptionsFromDynamicDecks);
executeIntegrityTask.accept(this::resetInvalidDeckOptions);
executeIntegrityTask.accept(this::rebuildTags);
executeIntegrityTask.accept(this::updateFieldCache);
executeIntegrityTask.accept(this::fixNewCardDuePositionOverflow);
executeIntegrityTask.accept(this::resetNewCardInsertionPosition);
executeIntegrityTask.accept(this::fixExcessiveReviewDueDates);
// v2 sched had a bug that could create decimal intervals
executeIntegrityTask.accept(this::fixDecimalCardsData);
executeIntegrityTask.accept(this::fixDecimalRevLogData);
executeIntegrityTask.accept(this::restoreMissingDatabaseIndices);
executeIntegrityTask.accept(this::ensureModelsAreNotEmpty);
executeIntegrityTask.accept((progressNotifier) -> this.ensureCardsHaveHomeDeck(progressNotifier, result));
// and finally, optimize (unable to be done inside transaction).
try {
optimize(notifyProgress);
} catch (Exception e) {
Timber.e(e, "optimize");
AnkiDroidApp.sendExceptionReport(e, "fixIntegrity - optimize");
}
file = new File(mPath);
long newSize = file.length();
result.setNewSize(newSize);
// if any problems were found, force a full sync
if (result.hasProblems()) {
modSchemaNoCheck();
}
logProblems(result.getProblems());
return result;
}
use of com.ichi2.utils.JSONException in project Anki-Android by ankidroid.
the class Collection method nextID.
/**
* Utils ******************************************************************** ***************************
*/
public int nextID(String type) {
type = "next" + Character.toUpperCase(type.charAt(0)) + type.substring(1);
int id;
try {
id = get_config_int(type);
} catch (JSONException e) {
Timber.w(e);
id = 1;
}
set_config(type, id + 1);
return id;
}
use of com.ichi2.utils.JSONException in project Anki-Android by ankidroid.
the class Utils method ids2str.
/**
* Given a list of integers, return a string '(int1,int2,...)'.
*/
public static String ids2str(JSONArray ids) {
StringBuilder str = new StringBuilder(512);
str.append("(");
if (ids != null) {
int len = ids.length();
for (int i = 0; i < len; i++) {
try {
if (i == (len - 1)) {
str.append(ids.getLong(i));
} else {
str.append(ids.getLong(i)).append(",");
}
} catch (JSONException e) {
Timber.e(e, "ids2str :: JSONException");
}
}
}
str.append(")");
return str.toString();
}
Aggregations