Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion .github/workflows/actions.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: Build
name: Build and Test

on:
push:
branches: [ master ]
Expand All @@ -19,3 +20,33 @@ jobs:
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew build

instrumented-tests:
needs: build
runs-on: ubuntu-latest
strategy:
matrix:
locale: ['en-US', 'de-DE', 'es-ES', 'ar-EG']
steps:
- name: checkout
uses: actions/checkout@v4

- name: Set locale properties
id: locale_props
run: |
echo "language=$(echo ${{ matrix.locale }} | cut -d'-' -f1)" >> $GITHUB_OUTPUT
echo "country=$(echo ${{ matrix.locale }} | cut -d'-' -f2)" >> $GITHUB_OUTPUT

- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Run Instrumented Tests for ${{ matrix.locale }}
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 33
arch: x86_64
emulator-options: "-no-window -no-snapshot -prop persist.sys.language=${{ steps.locale_props.outputs.language }} -prop persist.sys.country=${{ steps.locale_props.outputs.country }}"
script: ./gradlew connectedAndroidTest
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package atorch.statspuzzles;

import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.espresso.Espresso;
import androidx.test.espresso.assertion.ViewAssertions;
import androidx.test.espresso.matcher.ViewMatchers;
import static androidx.test.espresso.action.ViewActions.click;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class PuzzleSelectionTest {

@Rule
public ActivityScenarioRule<PuzzleSelection> activityRule =
new ActivityScenarioRule<>(PuzzleSelection.class);

@Test
public void mainActivityLoads() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Espresso.onView(ViewMatchers.withText(context.getString(R.string.app_name)))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
}

@Test
public void easyPuzzlesButton_loadsEasyPuzzles() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Espresso.onView(ViewMatchers.withText(context.getString(R.string.button_level_0))).perform(click());
Espresso.onView(ViewMatchers.withText(context.getString(R.string.puzzle, 1)))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<string name="okay_button">Okay</string>
<string name="ok_button">OK</string>

<string name="solved">%d/%d gelöst</string>
<string name="solved">%1$d/%2$d gelöst</string>

<string name="action_share">Teilen</string>
<string name="action_settings">Einstellungen</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
<string name="okay_button">De acuerdo</string>
<string name="ok_button">OK</string>

<string name="solved">Resueltos %d / %d</string>
<string name="solved">Resueltos %1$d / %2$d</string>

<string name="action_share">Compartir</string>
<string name="action_settings">Configuración</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
<string name="okay_button">Okay</string>
<string name="ok_button">OK</string>

<string name="solved">solved %d / %d</string>
<string name="solved">solved %1$d / %2$d</string>

<string name="action_share">Share</string>
<string name="action_settings">Settings</string>
Expand Down
8 changes: 8 additions & 0 deletions app/src/test/java/atorch/statspuzzles/AnswerCheckerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ public class AnswerCheckerTest {
public void testCorrectAnswer() {
assertEquals(AnswerChecker.Result.CORRECT, AnswerChecker.checkAnswer("2+2", "4"));
assertEquals(AnswerChecker.Result.CORRECT, AnswerChecker.checkAnswer("1/2", "0.5"));
assertEquals(AnswerChecker.Result.CORRECT, AnswerChecker.checkAnswer("3!", "6.0"));
// Note that we have a Result.INACCURATE version of this test as well
assertEquals(AnswerChecker.Result.CORRECT, AnswerChecker.checkAnswer("1/3", "0.33333333333333"));
assertEquals(AnswerChecker.Result.CORRECT, AnswerChecker.checkAnswer("C(5, 3)", "10"));
}

@Test
Expand All @@ -19,11 +23,15 @@ public void testInaccurateAnswer() {
@Test
public void testIncorrectAnswer() {
assertEquals(AnswerChecker.Result.INCORRECT, AnswerChecker.checkAnswer("1", "2"));
// The user's answer is not close enough to be considered merely inaccurate.
assertEquals(AnswerChecker.Result.INCORRECT, AnswerChecker.checkAnswer("1/3", "0.33"));
}

@Test
public void testInvalidAnswer() {
assertEquals(AnswerChecker.Result.INVALID, AnswerChecker.checkAnswer("1", "abc"));
assertEquals(AnswerChecker.Result.INVALID, AnswerChecker.checkAnswer("1", ""));
// Imbalanced parentheses
assertEquals(AnswerChecker.Result.INVALID, AnswerChecker.checkAnswer("( 1 + 5", ""));
}
}