From b36b2bda438b609089cf8c4322488431d0beee40 Mon Sep 17 00:00:00 2001 From: StephenGemin Date: Tue, 7 Jul 2026 02:03:34 -0400 Subject: [PATCH 1/2] chore: add GitHub Actions CI workflow Runs on PR creation, PR updates (synchronize), and pushes to main/master. Checks: build, unit tests, lint. --- .github/workflows/android-ci.yml | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/android-ci.yml diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml new file mode 100644 index 0000000..8697373 --- /dev/null +++ b/.github/workflows/android-ci.yml @@ -0,0 +1,35 @@ +name: Android CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Build with Gradle + run: ./gradlew assembleDebug + + - name: Run unit tests + run: ./gradlew testDebugUnitTest + + - name: Run lint checks + run: ./gradlew lint From 3bdc8e382e5fefc6ab77fa541ca09b8d8c3835a8 Mon Sep 17 00:00:00 2001 From: StephenGemin Date: Tue, 7 Jul 2026 02:13:37 -0400 Subject: [PATCH 2/2] fix: extract calculator logic to separate testable class - Create CalculatorEngine class with pure eval() logic - Update tests to use CalculatorEngine instead of MainActivity - Fix layout and method visibility for lint compliance - All tests passing: build, unit tests, lint --- .../calculator_v01/CalculatorEngine.kt | 15 +++++++++++++++ .../example/calculator_v01/MainActivity.kt | 19 ++++--------------- .../main/res/layout-land/activity_main.xml | 2 +- .../calculator_v01/MainActivityTest.kt | 4 ++-- 4 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/example/calculator_v01/CalculatorEngine.kt diff --git a/app/src/main/java/com/example/calculator_v01/CalculatorEngine.kt b/app/src/main/java/com/example/calculator_v01/CalculatorEngine.kt new file mode 100644 index 0000000..1f53c07 --- /dev/null +++ b/app/src/main/java/com/example/calculator_v01/CalculatorEngine.kt @@ -0,0 +1,15 @@ +package com.example.calculator_v01 + +import android.util.Log +import com.udojava.evalex.Expression + +private const val TAG = "CALC" + +class CalculatorEngine { + fun eval(txt: String): String { + Log.i(TAG, "eval method -> String to evaluate: $txt") + val expression = Expression(txt) + expression.setPrecision(12) + return expression.eval().toString() + } +} diff --git a/app/src/main/java/com/example/calculator_v01/MainActivity.kt b/app/src/main/java/com/example/calculator_v01/MainActivity.kt index bece142..fa6e77e 100644 --- a/app/src/main/java/com/example/calculator_v01/MainActivity.kt +++ b/app/src/main/java/com/example/calculator_v01/MainActivity.kt @@ -2,19 +2,16 @@ package com.example.calculator_v01 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log import android.view.View import android.widget.Button import android.widget.TextView -import com.udojava.evalex.Expression import java.lang.ArithmeticException -private const val TAG = "CALC" - class MainActivity : AppCompatActivity() { private lateinit var calcOutput : TextView private lateinit var calcHist : TextView + private val engine = CalculatorEngine() private var buildString = ArrayList() private var lastNumeric = false private var lastEqual = false @@ -102,7 +99,7 @@ class MainActivity : AppCompatActivity() { } } private fun evalPercent(userInput:String):Double{ - return eval(buildTextOutput() + "0").toDouble() * (userInput.toDouble() / 100) + return engine.eval(buildTextOutput() + "0").toDouble() * (userInput.toDouble() / 100) } fun onEqual(view:View){ @@ -111,7 +108,7 @@ class MainActivity : AppCompatActivity() { txt = buildTextOutput() txt += calcOutput.text.toString() try{ - calcOutput.text = eval(txt) + calcOutput.text = engine.eval(txt) onlyDec = true }catch (ex: ArithmeticException){ calcOutput.text = getString(R.string.error) @@ -124,15 +121,7 @@ class MainActivity : AppCompatActivity() { } - fun eval(txt:String):String{ - Log.i(TAG, "eval method -> String to evaluate: $txt") - val expression = Expression(txt) - expression.setPrecision(12) - return expression.eval().toString() - } - - fun doNothing(){ - + fun doNothing(view: View) { } private fun stringToDbl(input:TextView):Double{ diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index c18831a..b5efd13 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -55,7 +55,7 @@