Implement a toggleable setting to count an arithmetic average of grades when all weights are equal to zero (#1186)

This commit is contained in:
Kamil Studziński 2021-03-30 13:59:36 +02:00 committed by GitHub
parent f2130998ec
commit 3071e19584
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 97 additions and 11 deletions

View File

@ -146,6 +146,12 @@ class PreferencesRepository @Inject constructor(
R.bool.pref_default_subjects_without_grades R.bool.pref_default_subjects_without_grades
) )
val isOptionalArithmeticAverage: Boolean
get() = getBoolean(
R.string.pref_key_optional_arithmetic_average,
R.bool.pref_default_optional_arithmetic_average
)
var isKitkatDialogDisabled: Boolean var isKitkatDialogDisabled: Boolean
get() = sharedPref.getBoolean("kitkat_dialog_disabled", false) get() = sharedPref.getBoolean("kitkat_dialog_disabled", false)
set(value) = sharedPref.edit { putBoolean("kitkat_dialog_disabled", value) } set(value) = sharedPref.edit { putBoolean("kitkat_dialog_disabled", value) }

View File

@ -34,6 +34,8 @@ class GradeAverageProvider @Inject constructor(
private val minusModifier get() = preferencesRepository.gradeMinusModifier private val minusModifier get() = preferencesRepository.gradeMinusModifier
private val isOptionalArithmeticAverage get() = preferencesRepository.isOptionalArithmeticAverage
fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean) = fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean) =
flowWithResourceIn { flowWithResourceIn {
val semesters = semesterRepository.getSemesters(student) val semesters = semesterRepository.getSemesters(student)
@ -130,7 +132,7 @@ class GradeAverageProvider @Inject constructor(
val updatedFirstSemesterGrades = val updatedFirstSemesterGrades =
firstSemesterSubject?.grades?.updateModifiers(student).orEmpty() firstSemesterSubject?.grades?.updateModifiers(student).orEmpty()
(updatedSecondSemesterGrades + updatedFirstSemesterGrades).calcAverage() (updatedSecondSemesterGrades + updatedFirstSemesterGrades).calcAverage(isOptionalArithmeticAverage)
} else { } else {
secondSemesterSubject.average secondSemesterSubject.average
} }
@ -146,9 +148,9 @@ class GradeAverageProvider @Inject constructor(
return if (!isAnyVulcanAverage || gradeAverageForceCalc) { return if (!isAnyVulcanAverage || gradeAverageForceCalc) {
val secondSemesterAverage = val secondSemesterAverage =
secondSemesterSubject.grades.updateModifiers(student).calcAverage() secondSemesterSubject.grades.updateModifiers(student).calcAverage(isOptionalArithmeticAverage)
val firstSemesterAverage = firstSemesterSubject?.grades?.updateModifiers(student) val firstSemesterAverage = firstSemesterSubject?.grades?.updateModifiers(student)
?.calcAverage() ?: secondSemesterAverage ?.calcAverage(isOptionalArithmeticAverage) ?: secondSemesterAverage
(secondSemesterAverage + firstSemesterAverage) / divider (secondSemesterAverage + firstSemesterAverage) / divider
} else { } else {
@ -179,7 +181,7 @@ class GradeAverageProvider @Inject constructor(
GradeSubject( GradeSubject(
subject = summary.subject, subject = summary.subject,
average = if (!isAnyAverage || gradeAverageForceCalc) { average = if (!isAnyAverage || gradeAverageForceCalc) {
grades.updateModifiers(student).calcAverage() grades.updateModifiers(student).calcAverage(isOptionalArithmeticAverage)
} else summary.average, } else summary.average,
points = summary.pointsSum, points = summary.pointsSum,
summary = summary, summary = summary,
@ -211,7 +213,7 @@ class GradeAverageProvider @Inject constructor(
proposedPoints = "", proposedPoints = "",
finalPoints = "", finalPoints = "",
pointsSum = "", pointsSum = "",
average = if (calcAverage) details.updateModifiers(student).calcAverage() else .0 average = if (calcAverage) details.updateModifiers(student).calcAverage(isOptionalArithmeticAverage) else .0
) )
} }
} }

View File

@ -3,14 +3,17 @@ package io.github.wulkanowy.utils
import io.github.wulkanowy.R import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.GradeSummary
import io.github.wulkanowy.sdk.scrapper.grades.*
fun List<Grade>.calcAverage(): Double { fun List<Grade>.calcAverage(isOptionalArithmeticAverage: Boolean): Double {
val isArithmeticAverage = isOptionalArithmeticAverage && !any { it.weightValue != .0 }
var counter = 0.0 var counter = 0.0
var denominator = 0.0 var denominator = 0.0
forEach { forEach {
counter += (it.value + it.modifier) * it.weightValue val weight = if (isArithmeticAverage && isGradeValid(it.entry)) 1.0 else it.weightValue
denominator += it.weightValue counter += (it.value + it.modifier) * weight
denominator += weight
} }
return if (denominator != 0.0) counter / denominator else 0.0 return if (denominator != 0.0) counter / denominator else 0.0
} }

View File

@ -24,4 +24,5 @@
<bool name="pref_default_timetable_show_timers">false</bool> <bool name="pref_default_timetable_show_timers">false</bool>
<bool name="pref_default_homework_fullscreen">false</bool> <bool name="pref_default_homework_fullscreen">false</bool>
<bool name="pref_default_subjects_without_grades">false</bool> <bool name="pref_default_subjects_without_grades">false</bool>
<bool name="pref_default_optional_arithmetic_average">false</bool>
</resources> </resources>

View File

@ -26,4 +26,5 @@
<string name="pref_key_timetable_show_timers">timetable_show_timers</string> <string name="pref_key_timetable_show_timers">timetable_show_timers</string>
<string name="pref_key_homework_fullscreen">homework_fullscreen</string> <string name="pref_key_homework_fullscreen">homework_fullscreen</string>
<string name="pref_key_subjects_without_grades">subjects_without_grades</string> <string name="pref_key_subjects_without_grades">subjects_without_grades</string>
<string name="pref_key_optional_arithmetic_average">optional_arithmetic_average</string>
</resources> </resources>

View File

@ -507,6 +507,7 @@
<string name="pref_other_grade_modifier_plus">Value of the plus</string> <string name="pref_other_grade_modifier_plus">Value of the plus</string>
<string name="pref_other_grade_modifier_minus">Value of the minus</string> <string name="pref_other_grade_modifier_minus">Value of the minus</string>
<string name="pref_other_fill_message_content">Reply with message history</string> <string name="pref_other_fill_message_content">Reply with message history</string>
<string name="pref_other_optional_arithmetic_average">Show arithmetic average when no weights provided</string>
<string name="pref_settings_advanced_title">Advanced</string> <string name="pref_settings_advanced_title">Advanced</string>
<string name="pref_settings_appearance_title">Appearance &amp; Behavior</string> <string name="pref_settings_appearance_title">Appearance &amp; Behavior</string>

View File

@ -25,6 +25,12 @@
app:key="@string/pref_key_grade_average_force_calc" app:key="@string/pref_key_grade_average_force_calc"
app:singleLineTitle="false" app:singleLineTitle="false"
app:title="@string/pref_view_grade_average_force_calc" /> app:title="@string/pref_view_grade_average_force_calc" />
<SwitchPreferenceCompat
app:defaultValue="@bool/pref_default_optional_arithmetic_average"
app:iconSpaceReserved="false"
app:key="@string/pref_key_optional_arithmetic_average"
app:singleLineTitle="false"
app:title="@string/pref_other_optional_arithmetic_average" />
<ListPreference <ListPreference
app:defaultValue="@string/pref_default_grade_average_mode" app:defaultValue="@string/pref_default_grade_average_mode"
app:entries="@array/grade_average_mode_entries" app:entries="@array/grade_average_mode_entries"

View File

@ -112,6 +112,21 @@ class GradeAverageProviderTest {
getSummary(24, "Język polski", 3.49) getSummary(24, "Język polski", 3.49)
) )
private val noWeightGrades = listOf(
// standard: 0.0, arithmetic: 4.0
getGrade(22, "Matematyka", 5.0, 0.0, 0.0),
getGrade(22, "Matematyka", 3.0, 0.0, 0.0),
getGrade(22, "Matematyka", 1.0, 0.0, 0.0, "np.")
)
private val noWeightGradesSummary = listOf(
getSummary(23, "Matematyka", 0.0)
)
private val noWeightGradesArithmeticSummary = listOf(
getSummary(23, "Matematyka", 4.0)
)
@Before @Before
fun setUp() { fun setUp() {
MockKAnnotations.init(this) MockKAnnotations.init(this)
@ -124,9 +139,34 @@ class GradeAverageProviderTest {
gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository)
} }
@Test
fun `calc current semester standard average with no weights`() {
every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { noWeightGrades to noWeightGradesSummary }
val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() }
assertEquals(0.0, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 0,0
}
@Test
fun `calc current semester arithmetic average with no weights`() {
every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns true
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { noWeightGrades to noWeightGradesArithmeticSummary }
val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId, true).getResult() }
assertEquals(4.0, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 4,0
}
@Test @Test
fun `calc current semester average with load from cache sequence`() { fun `calc current semester average with load from cache sequence`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { semesterRepository.getSemesters(student) } returns semesters
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flow { coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flow {
@ -156,6 +196,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc all year semester average with delayed emit`(){ fun `calc all year semester average with delayed emit`(){
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { semesterRepository.getSemesters(student) } returns semesters
@ -186,6 +227,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average with grade without grade in second semester`() { fun `calc both semesters average with grade without grade in second semester`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier }
@ -201,6 +243,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average with no grade in second semester but with average in first semester`() { fun `calc both semesters average with no grade in second semester but with average in first semester`() {
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } coEvery { gradeRepository.getGrades(student, semesters[1], false) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier }
@ -214,6 +257,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc average on no grades`() { fun `force calc average on no grades`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { emptyList<Grade>() to emptyList() } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { emptyList<Grade>() to emptyList() }
@ -227,6 +271,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc current semester average with default modifiers in scraper mode`() { fun `force calc current semester average with default modifiers in scraper mode`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { semesterRepository.getSemesters(student) } returns semesters
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGradeWithModifier to secondSummariesWithModifier }
@ -241,6 +286,7 @@ class GradeAverageProviderTest {
val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name)
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeMinusModifier } returns .33 every { preferencesRepository.gradeMinusModifier } returns .33
every { preferencesRepository.gradePlusModifier } returns .33 every { preferencesRepository.gradePlusModifier } returns .33
@ -258,6 +304,7 @@ class GradeAverageProviderTest {
val student = student.copy(loginMode = Sdk.Mode.API.name) val student = student.copy(loginMode = Sdk.Mode.API.name)
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode
every { preferencesRepository.gradePlusModifier } returns .33 every { preferencesRepository.gradePlusModifier } returns .33
@ -275,6 +322,7 @@ class GradeAverageProviderTest {
val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) val student = student.copy(loginMode = Sdk.Mode.HYBRID.name)
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode
every { preferencesRepository.gradePlusModifier } returns .33 every { preferencesRepository.gradePlusModifier } returns .33
@ -290,6 +338,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc current semester average`() { fun `calc current semester average`() {
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries }
@ -303,6 +352,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc current semester average`() { fun `force calc current semester average`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries } coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { secondGrades to secondSummaries }
@ -316,6 +366,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc full year average when current is first`() { fun `force calc full year average when current is first`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries }
@ -329,6 +380,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc full year average when current is first with load from cache sequence`() { fun `calc full year average when current is first with load from cache sequence`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { semesterRepository.getSemesters(student) } returns semesters
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow {
@ -361,6 +413,7 @@ class GradeAverageProviderTest {
fun `calc both semesters average`() { fun `calc both semesters average`() {
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource {
firstGrades to listOf( firstGrades to listOf(
getSummary(22, "Matematyka", 3.0), getSummary(22, "Matematyka", 3.0),
@ -384,6 +437,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average when current is second with load from cache sequence`() { fun `calc both semesters average when current is second with load from cache sequence`() {
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow {
emit(Resource.loading()) emit(Resource.loading())
@ -431,6 +485,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc full year average`() { fun `force calc full year average`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries }
coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource { coEvery { gradeRepository.getGrades(student, semesters[2], true) } returns flowWithResource {
@ -450,6 +505,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc full year average when current is second with load from cache sequence`() { fun `calc full year average when current is second with load from cache sequence`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { semesterRepository.getSemesters(student) } returns semesters coEvery { semesterRepository.getSemesters(student) } returns semesters
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flow {
@ -492,6 +548,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average when no summaries`() { fun `calc both semesters average when no summaries`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() }
@ -507,6 +564,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc full year average when no summaries`() { fun `force calc full year average when no summaries`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to emptyList() }
@ -522,6 +580,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average when missing summaries in both semesters`() { fun `calc both semesters average when missing summaries in both semesters`() {
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource {
@ -545,6 +604,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average when missing summary in second semester`() { fun `calc both semesters average when missing summary in second semester`() {
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries }
@ -560,6 +620,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `calc both semesters average when missing summary in first semester`() { fun `calc both semesters average when missing summary in first semester`() {
every { preferencesRepository.gradeAverageForceCalc } returns false every { preferencesRepository.gradeAverageForceCalc } returns false
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) }
@ -575,6 +636,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc full year average when missing summary in first semester`() { fun `force calc full year average when missing summary in first semester`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) } coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { firstGrades to firstSummaries.dropLast(1) }
@ -591,6 +653,7 @@ class GradeAverageProviderTest {
fun `force calc both semesters average with different average from all grades and from two semesters`() { fun `force calc both semesters average with different average from all grades and from two semesters`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS
every { preferencesRepository.isOptionalArithmeticAverage } returns false
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource {
listOf( listOf(
@ -620,6 +683,7 @@ class GradeAverageProviderTest {
@Test @Test
fun `force calc full year average with different average from all grades and from two semesters`() { fun `force calc full year average with different average from all grades and from two semesters`() {
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR
coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource { coEvery { gradeRepository.getGrades(student, semesters[1], true) } returns flowWithResource {
@ -652,6 +716,7 @@ class GradeAverageProviderTest {
val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name)
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeMinusModifier } returns .33 every { preferencesRepository.gradeMinusModifier } returns .33
every { preferencesRepository.gradePlusModifier } returns .5 every { preferencesRepository.gradePlusModifier } returns .5
@ -688,6 +753,7 @@ class GradeAverageProviderTest {
val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name)
every { preferencesRepository.gradeAverageForceCalc } returns true every { preferencesRepository.gradeAverageForceCalc } returns true
every { preferencesRepository.isOptionalArithmeticAverage } returns false
every { preferencesRepository.gradeMinusModifier } returns .33 every { preferencesRepository.gradeMinusModifier } returns .33
every { preferencesRepository.gradePlusModifier } returns .5 every { preferencesRepository.gradePlusModifier } returns .5
@ -719,7 +785,7 @@ class GradeAverageProviderTest {
assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average() assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average()
} }
private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0, weight: Double = 1.0): Grade { private fun getGrade(semesterId: Int, subject: String, value: Double, modifier: Double = 0.0, weight: Double = 1.0, entry: String = ""): Grade {
return Grade( return Grade(
studentId = 101, studentId = 101,
semesterId = semesterId, semesterId = semesterId,
@ -731,7 +797,7 @@ class GradeAverageProviderTest {
date = now(), date = now(),
weight = "", weight = "",
gradeSymbol = "", gradeSymbol = "",
entry = "", entry = entry,
description = "", description = "",
comment = "", comment = "",
color = "" color = ""

View File

@ -28,7 +28,7 @@ class GradeExtensionTest {
createGrade(4.0, 1.0, 0.0), createGrade(4.0, 1.0, 0.0),
createGrade(1.0, 9.0, 0.5), createGrade(1.0, 9.0, 0.5),
createGrade(0.0, .0, 0.0) createGrade(0.0, .0, 0.0)
).calcAverage(), 0.005) ).calcAverage(false), 0.005)
} }
@Test @Test