### Question:
DefaultStorIOSQLite extends StorIOSQLite { @NonNull @Override public LowLevel lowLevel() { return lowLevel; } protected  DefaultStorIOSQLite(
            @NonNull SQLiteOpenHelper sqLiteOpenHelper,
            @NonNull TypeMappingFinder typeMappingFinder,
            @Nullable Scheduler defaultRxScheduler,
            @NonNull List<Interceptor> interceptors); @NonNull @Override Flowable<Changes> observeChanges(@NonNull BackpressureStrategy backpressureStrategy); @Override @NonNull Flowable<Changes> observeChangesInTables(@NonNull final Set<String> tables, @NonNull BackpressureStrategy backpressureStrategy); @Override @NonNull Flowable<Changes> observeChangesOfTags(@NonNull final Set<String> tags, @NonNull BackpressureStrategy backpressureStrategy); @Override Scheduler defaultRxScheduler(); @NonNull @Override LowLevel lowLevel(); @NonNull @Override List<Interceptor> interceptors(); @Override void close(); @NonNull static Builder builder();  }### Answer:
@Test public void lowLevelReturnsSameInstanceOfSQLiteOpenHelper() { assertThat(storIOSQLite.lowLevel().sqliteOpenHelper()).isSameAs(sqLiteOpenHelper); }
@Test public void nestedTransactionShouldWorkNormally() { storIOSQLite.lowLevel().beginTransaction(); try { try { storIOSQLite.lowLevel().beginTransaction(); storIOSQLite .lowLevel() .notifyAboutChanges(Changes.newInstance("table1")); storIOSQLite .lowLevel() .notifyAboutChanges(Changes.newInstance("table2")); storIOSQLite.lowLevel().setTransactionSuccessful(); } finally { storIOSQLite.lowLevel().endTransaction(); } storIOSQLite.lowLevel().setTransactionSuccessful(); } finally { storIOSQLite.lowLevel().endTransaction(); } }
@Test public void notifyAboutChangesShouldNotAcceptNullAsChanges() { StorIOSQLite.LowLevel lowLevel = storIOSQLite.lowLevel(); assertThat(lowLevel).isNotNull(); expectedException.expect(NullPointerException.class); expectedException.expectMessage("Changes can not be null"); expectedException.expectCause(nullValue(Throwable.class)); lowLevel.notifyAboutChanges(null); }
@Test public void observeChangesInTable() { TestSubscriber<Changes> testSubscriber = new TestSubscriber<Changes>(); storIOSQLite .observeChangesInTable("table1", LATEST) .subscribe(testSubscriber); testSubscriber.assertNoValues(); Changes changes1 = Changes.newInstance("table2"); storIOSQLite .lowLevel() .notifyAboutChanges(changes1); testSubscriber.assertNoValues(); Changes changes2 = Changes.newInstance("table1"); storIOSQLite .lowLevel() .notifyAboutChanges(changes2); testSubscriber.assertValue(changes2); Changes changes3 = Changes.newInstance("table3"); storIOSQLite .lowLevel() .notifyAboutChanges(changes3); testSubscriber.assertValue(changes2); testSubscriber.assertNoErrors(); testSubscriber.dispose(); }