Skip to content

Commit

Permalink
Merge pull request #33 from PeterNaggschga/dev
Browse files Browse the repository at this point in the history
v2.1.0
  • Loading branch information
PeterNaggschga authored Dec 29, 2024
2 parents f0c21be + a1d8ff5 commit 1ec6043
Show file tree
Hide file tree
Showing 29 changed files with 383 additions and 208 deletions.
22 changes: 11 additions & 11 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ android {
defaultConfig {
applicationId 'com.peternaggschga.gwint'
minSdk 24
targetSdkVersion 34
versionCode 21
versionName '2.0'
targetSdkVersion 35
versionCode 22
versionName '2.1'

testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
versionNameSuffix '.0'
Expand All @@ -33,17 +33,17 @@ android {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
implementation 'androidx.preference:preference:1.2.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.7'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
testImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.ext:truth:1.5.0'
testImplementation 'androidx.test.ext:truth:1.5.0'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
testImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation 'androidx.test.ext:truth:1.6.0'
testImplementation 'androidx.test.ext:truth:1.6.0'

// RxJava
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.IntStream;

import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
Expand Down Expand Up @@ -138,13 +140,61 @@ public void insertUnitAssertsNonNegativeDamage() {
}

@Test
public void insertUnitAllowsZeroDamage() {
public void insertUnitAllowsBoundedDamage() {
for (int damage = 0; damage <= UnitEntity.NON_EPIC_DAMAGE_VALUES_UPPER_BOUND; damage++) {
try {
repository.insertUnit(false, damage, Ability.NONE, null, RowType.MELEE, 1)
.andThen(repository.insertUnit(false, damage, Ability.NONE, null, RowType.MELEE, 5))
.blockingAwait();
} catch (Exception ignored) {
fail();
}
}
}

@Test
public void insertUnitAssertsTooHighDamage() {
try {
repository.insertUnit(false, 0, Ability.NONE, null, RowType.MELEE, 1)
.andThen(repository.insertUnit(false, 0, Ability.NONE, null, RowType.MELEE, 5))
.blockingAwait();
} catch (Exception ignored) {
repository.insertUnit(false, UnitEntity.NON_EPIC_DAMAGE_VALUES_UPPER_BOUND + 1, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
fail();
} catch (IllegalArgumentException ignored) {
}
try {
repository.insertUnit(false, UnitEntity.NON_EPIC_DAMAGE_VALUES_UPPER_BOUND + 1, Ability.NONE, null, RowType.MELEE, 5).blockingAwait();
fail();
} catch (IllegalArgumentException ignored) {
}
}

@Test
public void insertUnitAssertsNonEpicDamage() {
int[] nonEpicDamage = IntStream.range(0, UnitEntity.NON_EPIC_DAMAGE_VALUES_UPPER_BOUND + 1)
.filter(damage -> Arrays.stream(UnitEntity.EPIC_DAMAGE_VALUES).noneMatch(integer -> damage == integer))
.toArray();
for (int damage : nonEpicDamage) {
try {
repository.insertUnit(true, damage, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
fail();
} catch (IllegalArgumentException ignored) {
}
try {
repository.insertUnit(true, damage, Ability.NONE, null, RowType.MELEE, 5).blockingAwait();
fail();
} catch (IllegalArgumentException ignored) {
}
}
}

@Test
public void insertUnitAllowsEpicDamage() {
for (int damage : UnitEntity.EPIC_DAMAGE_VALUES) {
try {
repository.insertUnit(true, damage, Ability.NONE, null, RowType.MELEE, 1)
.andThen(repository.insertUnit(true, damage, Ability.NONE, null, RowType.MELEE, 5))
.blockingAwait();
} catch (Exception ignored) {
fail();
}
}
}

Expand Down Expand Up @@ -599,8 +649,8 @@ public void hasNonEpicUnitsFlowableIsDistinctUntilChanged() {
fail();
}
}));
repository.insertUnit(true, 5, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
repository.insertUnit(true, 5, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
repository.insertUnit(true, 10, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
repository.insertUnit(true, 10, Ability.NONE, null, RowType.MELEE, 1).blockingAwait();
disposables.dispose();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.peternaggschga.gwent.data.UnitRepository;
import com.peternaggschga.gwent.ui.sounds.SoundManager;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.util.Collections;

Expand All @@ -21,6 +23,8 @@
@RunWith(AndroidJUnit4.class)
public class BurnDialogUseCaseUnitTest {
private UnitRepository repository;
@Mock
private SoundManager soundManager;

@Before
public void initMocks() {
Expand All @@ -31,7 +35,7 @@ public void initMocks() {
@Test
public void burnReturnsFalseForEmptyBoard() {
when(repository.getUnits()).thenReturn(Single.just(Collections.emptyList()));
BurnDialogUseCase.burn(ApplicationProvider.getApplicationContext(), repository)
BurnDialogUseCase.burn(ApplicationProvider.getApplicationContext(), repository, soundManager)
.test()
.assertValue(false)
.dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
import com.peternaggschga.gwent.data.Ability;
import com.peternaggschga.gwent.data.UnitEntity;
import com.peternaggschga.gwent.data.UnitRepository;
import com.peternaggschga.gwent.ui.sounds.SoundManager;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -30,6 +32,8 @@ public class RemoveUnitsUseCaseUnitTest {
private static final int TESTING_DEPTH = 50;
private UnitRepository mockRepository;
private UnitEntity mockEntity;
@Mock
private SoundManager soundManager;

@Before
public void initMocks() {
Expand All @@ -52,7 +56,7 @@ public void removeCollectionThrowsNullPointerExceptionWhenNullIsInCollection() {
Collection<UnitEntity> units = getUnitMockList(numberOfUnits);
units.add(null);
try {
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, units);
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, units, soundManager);
fail();
} catch (NullPointerException ignored) {
verify(mockRepository, never()).delete(any());
Expand All @@ -64,7 +68,7 @@ public void removeCollectionThrowsNullPointerExceptionWhenNullIsInCollection() {
public void removeCollectionCallsDeleteOnRepositoryWithoutRevengeUnits() {
for (int numberOfUnits = 0; numberOfUnits < TESTING_DEPTH; numberOfUnits++) {
Collection<UnitEntity> units = getUnitMockList(numberOfUnits);
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, units);
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, units, soundManager);
verify(mockRepository, atLeastOnce()).delete(units);
}
}
Expand All @@ -74,6 +78,6 @@ public void removeCallsDeleteOnRepositoryIfNotRevengeUnit() {
UnitEntity mockUnit = mock(UnitEntity.class);
when(mockUnit.getAbility()).thenReturn(Ability.NONE);
when(mockRepository.getUnit(anyInt())).thenReturn(Single.just(mockUnit));
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, 0);
RemoveUnitsUseCase.remove(ApplicationProvider.getApplicationContext(), mockRepository, 0, soundManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@

import com.peternaggschga.gwent.R;
import com.peternaggschga.gwent.data.UnitRepository;
import com.peternaggschga.gwent.ui.sounds.SoundManager;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.util.Collections;

Expand All @@ -27,6 +29,8 @@
@RunWith(AndroidJUnit4.class)
public class ResetDialogUseCaseUnitTest {
private UnitRepository repository;
@Mock
private SoundManager soundManager;

@Before
public void initMocks() {
Expand All @@ -47,7 +51,8 @@ public void resetCallsResetOnRepository() {
.apply();
ResetDialogUseCase.reset(ApplicationProvider.getApplicationContext(),
repository,
ResetDialogUseCase.Trigger.BUTTON_CLICK)
ResetDialogUseCase.Trigger.BUTTON_CLICK,
soundManager)
.blockingSubscribe();
verify(repository, atLeastOnce()).reset(null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
import com.peternaggschga.gwent.data.Ability;
import com.peternaggschga.gwent.data.UnitEntity;
import com.peternaggschga.gwent.data.UnitRepository;
import com.peternaggschga.gwent.ui.sounds.SoundManager;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -32,6 +34,8 @@ public class ResetRepositoryUseCaseUnitTest {
private static final int TESTING_DEPTH = 50;
private UnitRepository mockRepository;
private UnitEntity mockEntity;
@Mock
private SoundManager soundManager;

@Before
public void initMocks() {
Expand All @@ -52,7 +56,7 @@ public List<UnitEntity> getUnitMockList(int numberOfUnits) {
@Test
public void resetNoUnitCallsResetNullUnit() {
when(mockRepository.getUnits()).thenReturn(Single.just(Collections.emptyList()));
ResetRepositoryUseCase.reset(ApplicationProvider.getApplicationContext(), mockRepository).blockingAwait();
ResetRepositoryUseCase.reset(ApplicationProvider.getApplicationContext(), mockRepository, soundManager).blockingAwait();
verify(mockRepository, atLeastOnce()).reset(null);
}

Expand All @@ -61,7 +65,7 @@ public void resetCallsResetRepositoryWithNoRevengeUnits() {
Context context = ApplicationProvider.getApplicationContext();
for (int numberOfUnits = 0; numberOfUnits < TESTING_DEPTH; numberOfUnits++) {
when(mockRepository.getUnits()).thenReturn(Single.just(getUnitMockList(numberOfUnits)));
ResetRepositoryUseCase.reset(context, mockRepository).blockingAwait();
ResetRepositoryUseCase.reset(context, mockRepository, soundManager).blockingAwait();
verify(mockRepository, atLeast(numberOfUnits + 1)).reset(null);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,34 @@
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.os.Looper;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.peternaggschga.gwent.data.UnitRepository;
import com.peternaggschga.gwent.ui.sounds.SoundManager;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import io.reactivex.rxjava3.core.Completable;

@RunWith(AndroidJUnit4.class)
public class RevengeAlertDialogBuilderAdapterUnitTest {
private static final int TESTING_DEPTH = 50;
@Mock
private SoundManager soundManager;

@Test
public void insertAvengersInsertsUnits() {
UnitRepository repository = mock(UnitRepository.class);
when(repository.insertUnit(anyBoolean(), anyInt(), any(), any(), any(), anyInt())).thenReturn(Completable.complete());
for (int numberOfAvengers = 0; numberOfAvengers < TESTING_DEPTH; numberOfAvengers++) {
RevengeAlertDialogBuilderAdapter.insertAvengers(repository, numberOfAvengers);
RevengeAlertDialogBuilderAdapter.insertAvengers(repository, numberOfAvengers, soundManager);
verify(repository, atLeastOnce()).insertUnit(anyBoolean(), anyInt(), any(), any(), any(), eq(numberOfAvengers));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public void getDelayedOnValueChangeListenerDelays500Milliseconds() throws Interr
OnValueChangeListener delayed = CardNumberPickerAdapter.getDelayedOnValueChangeListener(mockListener);
delayed.onValueChange(mockPicker, 0, NUMBER_PICKER_VALUE);
verify(mockListener, never()).onValueChange(any(), anyInt(), anyInt());
TimeUnit.MILLISECONDS.sleep(501);
TimeUnit.MILLISECONDS.sleep(600);
verify(mockListener).onValueChange(mockPicker, 0, NUMBER_PICKER_VALUE);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ interface UnitDao {
* @return A Completable tracking operation status.
*/
@Query("INSERT INTO units (epic, damage, ability, squad, `row`) VALUES (:epic, :damage, :ability, :squad, :row)")
Completable insertUnit(boolean epic, @IntRange(from = 0) int damage, @NonNull Ability ability, @IntRange(from = 0) @Nullable Integer squad, @NonNull RowType row);
Completable insertUnit(boolean epic, @IntRange(from = 0, to = UnitEntity.NON_EPIC_DAMAGE_VALUES_UPPER_BOUND) int damage, @NonNull Ability ability, @IntRange(from = 1) @Nullable Integer squad, @NonNull RowType row);

/**
* Deletes the UnitEntity object with the given id from `units`.
Expand Down
19 changes: 15 additions & 4 deletions app/src/main/java/com/peternaggschga/gwent/data/UnitEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ public class UnitEntity {
*/
private int damage;

/**
* Integer array containing every damage value an epic unit may have.
*/
@NonNull
public static final Integer[] EPIC_DAMAGE_VALUES = new Integer[]{0, 7, 8, 10, 11, 15};

/**
* Integer defining what the maximum damage of a non-epic UnitEntity can be.
*/
public static final int NON_EPIC_DAMAGE_VALUES_UPPER_BOUND = 20;

/**
* Defines the Ability of the represented card.
* Is set to Ability#NONE by default.
Expand Down Expand Up @@ -199,15 +210,15 @@ public static String collectionToString(@NonNull Context context, @NonNull Colle
public String toString(@NonNull Context context) {
String row;
switch (getRow()) {
case MELEE:
default:
row = context.getString(R.string.unit_toString_melee);
break;
case RANGE:
row = context.getString(R.string.unit_toString_range);
break;
case SIEGE:
row = context.getString(R.string.unit_toString_siege);
break;
case MELEE:
default:
row = context.getString(R.string.unit_toString_melee);
}
String epic = isEpic() ? context.getString(R.string.unit_toString_epic) : context.getString(R.string.unit_toString_unit);
String ability;
Expand Down
Loading

0 comments on commit 1ec6043

Please sign in to comment.