From f12873fe00d3a4e97a89a7b76d47560d396ace69 Mon Sep 17 00:00:00 2001 From: Jannik Seiler Date: Sun, 30 Aug 2020 01:38:45 +0200 Subject: [PATCH] sort grades from cache by semester --- .../controller/GradesController.kt | 41 ++++++++++++++ .../projectlaogai/controller/QISPOSParser.kt | 2 +- .../controller/cache/CacheController.kt | 32 ++++++----- .../projectlaogai/GradesControllerTest.kt | 53 +++++++++++++++++++ app/src/test/resources/grades_diff.json | 16 ++++++ app/src/test/resources/grades_orig.json | 14 +++++ 6 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/controller/GradesController.kt create mode 100644 app/src/test/java/org/mosad/seil0/projectlaogai/GradesControllerTest.kt create mode 100644 app/src/test/resources/grades_diff.json create mode 100644 app/src/test/resources/grades_orig.json diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/GradesController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/GradesController.kt new file mode 100644 index 0000000..04ad443 --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/GradesController.kt @@ -0,0 +1,41 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + +package org.mosad.seil0.projectlaogai.controller + +import org.mosad.seil0.projectlaogai.util.GradeSubject + +class GradesController { + + /** + * show the difference between 2 grades sets + */ + fun diffGrades(mapA: HashMap>, mapB: HashMap>): Int { + // TODO compare + // TODO return diff + + return 1 + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt index c8c8c2d..180580d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt @@ -110,10 +110,10 @@ class QISPOSParser(val context: Context) { } - // return the sorted map return gradesMap.toSortedMap(compareBy{ val oText = it.substringAfter(" ") + // if WS, substring before / and add 0.5 to compareBy if (oText.contains("/")) { oText.substringBefore("/").toInt() + 0.5 } else { diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/cache/CacheController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/cache/CacheController.kt index 530e8a1..9481817 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/cache/CacheController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/cache/CacheController.kt @@ -315,7 +315,7 @@ class CacheController(cont: Context) { } coursesList = FileReader(file).use { - GsonBuilder().create().fromJson(BufferedReader(it).readLine(), CoursesList().javaClass).courses + GsonBuilder().create().fromJson(it, CoursesList().javaClass).courses } } @@ -333,7 +333,7 @@ class CacheController(cont: Context) { } mensaMenu = FileReader(file).use { - GsonBuilder().create().fromJson(BufferedReader(it).readLine(), MensaMenu().javaClass) + GsonBuilder().create().fromJson(it, MensaMenu().javaClass) } } @@ -394,14 +394,14 @@ class CacheController(cont: Context) { FileReader(fileLessons).use { TimetableController.lessonMap.putAll( GsonBuilder().create() - .fromJson(BufferedReader(it).readLine(), object : TypeToken>() {}.type) + .fromJson(it, object : TypeToken>() {}.type) ) } FileReader(fileSubjects).use { TimetableController.subjectMap.putAll( GsonBuilder().create() - .fromJson(BufferedReader(it).readLine(), HashMap>().javaClass) + .fromJson(it, HashMap>().javaClass) ) } @@ -415,9 +415,9 @@ class CacheController(cont: Context) { /** * read the encrypted grades file, don't keep them * in CacheController for security reasons - * @return the grades as HashMap if the file exists, else a empty HashMap + * @return the grades as SortedMap if the file exists, else a empty SortedMap */ - fun readGrades(): HashMap> { + fun readGrades(): SortedMap> { val file = File(context.filesDir, "grades_encrypted") // if the file does not exit, try creating it @@ -436,16 +436,24 @@ class CacheController(cont: Context) { EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() - return encryptedFile.openFileInput().bufferedReader().use { + val map: HashMap> = encryptedFile.openFileInput().bufferedReader().use { GsonBuilder().create() - .fromJson( - it.readLine(), - object : TypeToken>>() {}.type - ) + .fromJson(it, object : TypeToken>>() {}.type) } + + // same sorting as qispos parser + return map.toSortedMap(compareBy{ + val oText = it.substringAfter(" ") + + if (oText.contains("/")) { + oText.substringBefore("/").toInt() + 0.5 + } else { + oText.toDouble() + } + }.thenBy { it }) } - return HashMap() + return sortedMapOf() } } \ No newline at end of file diff --git a/app/src/test/java/org/mosad/seil0/projectlaogai/GradesControllerTest.kt b/app/src/test/java/org/mosad/seil0/projectlaogai/GradesControllerTest.kt new file mode 100644 index 0000000..903ccaf --- /dev/null +++ b/app/src/test/java/org/mosad/seil0/projectlaogai/GradesControllerTest.kt @@ -0,0 +1,53 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + +package org.mosad.seil0.projectlaogai + +import com.google.gson.GsonBuilder +import com.google.gson.reflect.TypeToken +import org.junit.Assert +import org.junit.Test +import org.mosad.seil0.projectlaogai.controller.GradesController +import org.mosad.seil0.projectlaogai.util.GradeSubject +import java.io.File +import java.io.FileReader + +class GradesControllerTest { + + @Test + fun diffGrades_isCorrect() { + val origFile = File(GradesControllerTest::class.java.getResource("/grades_orig.json")?.path!!) + val diffFile = File(GradesControllerTest::class.java.getResource("/grades_diff.json")?.path!!) + + val mapA: HashMap> = FileReader(origFile).use { + GsonBuilder().create().fromJson(it, object : TypeToken>>() {}.type) + } + + val mapB: HashMap> = FileReader(diffFile).use { + GsonBuilder().create().fromJson(it, object : TypeToken>>() {}.type) + } + + val ret = GradesController().diffGrades(mapA, mapB) + + Assert.assertEquals(1, ret) + } +} \ No newline at end of file diff --git a/app/src/test/resources/grades_diff.json b/app/src/test/resources/grades_diff.json new file mode 100644 index 0000000..7a51aa2 --- /dev/null +++ b/app/src/test/resources/grades_diff.json @@ -0,0 +1,16 @@ +{ + "WiSe 17/18":[ + {"credits":"4,0","grade":"1,0","id":"AI-1020","name":"Grundlagen der Elektronik","semester":"WiSe 17/18"}, + {"credits":"2,0","grade":"2,3","id":"AI-1040","name":"Prozedurale Programmierung","semester":"WiSe 17/18"} + ], + "SoSe 18":[ + {"credits":"4,0","grade":"1,7","id":"AI-2010","name":"Technische Informatik","semester":"SoSe 18"}, + {"credits":"1,0","grade":"bestanden","id":"AI-2015","name":"Praktikum Technische Informatik","semester":"SoSe 18"} + ], + "WiSe 18/19":[ + {"credits":"2,0","grade":"2,7","id":"AI-3010","name":"Computernetze","semester":"WiSe 18/19"}, + {"credits":"3,0","grade":"bestanden","id":"AI-3015","name":"Praktikum Computernetze","semester":"WiSe 18/19"}, + {"credits":"2,0","grade":"1,7","id":"AI-3020","name":"Datenbanksysteme 1","semester":"WiSe 18/19"}, + {"credits":"3,0","grade":"bestanden","id":"AI-3025","name":"Praktikum Datenbanksysteme","semester":"WiSe 18/19"} + ] +} diff --git a/app/src/test/resources/grades_orig.json b/app/src/test/resources/grades_orig.json new file mode 100644 index 0000000..7f3b533 --- /dev/null +++ b/app/src/test/resources/grades_orig.json @@ -0,0 +1,14 @@ +{ + "WiSe 17/18":[ + {"credits":"4,0","grade":"1,0","id":"AI-1020","name":"Grundlagen der Elektronik","semester":"WiSe 17/18"}, + {"credits":"2,0","grade":"2,3","id":"AI-1040","name":"Prozedurale Programmierung","semester":"WiSe 17/18"} + ], + "SoSe 18":[ + {"credits":"4,0","grade":"1,7","id":"AI-2010","name":"Technische Informatik","semester":"SoSe 18"}, + {"credits":"1,0","grade":"bestanden","id":"AI-2015","name":"Praktikum Technische Informatik","semester":"SoSe 18"} + ], + "WiSe 18/19":[ + {"credits":"2,0","grade":"2,7","id":"AI-3010","name":"Computernetze","semester":"WiSe 18/19"}, + {"credits":"3,0","grade":"bestanden","id":"AI-3015","name":"Praktikum Computernetze","semester":"WiSe 18/19"} + ] +}