diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/TLE.kt b/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/TLE.kt index 53a9b7d7..3ed9827e 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/TLE.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/TLE.kt @@ -48,41 +48,43 @@ data class TLE( companion object { - fun parseArray(array: Array): TLE? { - if (array.size != 3) return null + fun parseStream(stream: InputStream): List { + val itemParams = mutableListOf(String(), String(), String()) + val importedItems = mutableListOf() + var lineIndex = 0 + stream.bufferedReader().forEachLine { line -> + itemParams[lineIndex] = line + if (lineIndex < 2) { + lineIndex++ + } else { + val isLineOneValid = itemParams[1].substring(0, 1) == "1" + val isLineTwoValid = itemParams[2].substring(0, 1) == "2" + if (!isLineOneValid && !isLineTwoValid) return@forEachLine + parseParams(itemParams)?.let { tle -> importedItems.add(tle) } + lineIndex = 0 + } + } + return importedItems + } + + private fun parseParams(params: List): TLE? { + if (params[1].substring(0, 1) != "1" && params[2].substring(0, 1) != "2") return null try { - val name: String = array[0].trim() - val epoch: Double = array[1].substring(18, 32).toDouble() - val meanmo: Double = array[2].substring(52, 63).toDouble() - val eccn: Double = 1.0e-07 * array[2].substring(26, 33).toDouble() - val incl: Double = array[2].substring(8, 16).toDouble() - val raan: Double = array[2].substring(17, 25).toDouble() - val argper: Double = array[2].substring(34, 42).toDouble() - val meanan: Double = array[2].substring(43, 51).toDouble() - val catnum: Int = array[1].substring(2, 7).trim().toInt() - val bstar: Double = 1.0e-5 * array[1].substring(53, 59).toDouble() / - 10.0.pow(array[1].substring(60, 61).toDouble()) + val name: String = params[0].trim() + val epoch: Double = params[1].substring(18, 32).toDouble() + val meanmo: Double = params[2].substring(52, 63).toDouble() + val eccn: Double = 1.0e-07 * params[2].substring(26, 33).toDouble() + val incl: Double = params[2].substring(8, 16).toDouble() + val raan: Double = params[2].substring(17, 25).toDouble() + val argper: Double = params[2].substring(34, 42).toDouble() + val meanan: Double = params[2].substring(43, 51).toDouble() + val catnum: Int = params[1].substring(2, 7).trim().toInt() + val bstar: Double = 1.0e-5 * params[1].substring(53, 59).toDouble() / + 10.0.pow(params[1].substring(60, 61).toDouble()) return TLE(name, epoch, meanmo, eccn, incl, raan, argper, meanan, catnum, bstar) } catch (exception: Exception) { return null } } - - fun parseStream(stream: InputStream): List { - val elementArray = arrayOf(String(), String(), String()) - val importedElements = mutableListOf() - var line = 0 - stream.bufferedReader().forEachLine { - if (line != 2) { - elementArray[line] = it - line++ - } else { - elementArray[line] = it - parseArray(elementArray)?.let { tle -> importedElements.add(tle) } - line = 0 - } - } - return importedElements - } } } diff --git a/core/src/test/java/com/rtbishop/look4sat/Look4SatTest.kt b/core/src/test/java/com/rtbishop/look4sat/Look4SatTest.kt index 1ad4bec8..c490f322 100644 --- a/core/src/test/java/com/rtbishop/look4sat/Look4SatTest.kt +++ b/core/src/test/java/com/rtbishop/look4sat/Look4SatTest.kt @@ -5,22 +5,35 @@ import org.junit.Test class Look4SatTest { + private val validParamsStream = """ + ISS (ZARYA) + 1 25544U 98067A 21255.21005818 -.00120443 00000-0 -22592-2 0 9998 + 2 25544 51.6451 272.4173 0002526 27.1693 64.4213 15.48396490302085 + SHENZHOU-12 + 1 48852U 21053A 21254.65783594 .00009779 00000-0 11349-3 0 9992 + 2 48852 41.4714 115.4555 0001945 272.0324 187.3218 15.61782249 21227 + PROGRESS-MS 17 + 1 48869U 21057A 21254.57379002 .00002620 00000-0 56399-4 0 9993 + 2 48869 51.6436 275.5624 0003404 23.4371 118.9508 15.48629868301984 + """.trimIndent().byteInputStream() + private val invalidParamsStream = """ + 1 25544U 98067A 21255.21005818 -.00120443 00000-0 -22592-2 0 9998 + 2 25544 51.6451 272.4173 0002526 27.1693 64.4213 15.48396490302085 + 1 48852U 21053A 21254.65783594 .00009779 00000-0 11349-3 0 9992 + 2 48852 41.4714 115.4555 0001945 272.0324 187.3218 15.61782249 21227 + 1 48869U 21057A 21254.57379002 .00002620 00000-0 56399-4 0 9993 + 2 48869 51.6436 275.5624 0003404 23.4371 118.9508 15.48629868301984 + """.trimIndent().byteInputStream() + @Test - fun `Given correct TLE array returns Satellite`() { - val tleArray = arrayOf( - "ISS (ZARYA)", - "1 25544U 98067A 21242.56000419 .00070558 00000-0 12956-2 0 9996", - "2 25544 51.6433 334.9559 0003020 334.9496 106.9882 15.48593918300128" - ) - assert(TLE.parseArray(tleArray)?.createSat() != null) + fun `Given valid params stream returns valid data`() { + val parsedList = TLE.parseStream(validParamsStream) + assert(parsedList[2].catnum == 48869) } @Test - fun `Given incorrect TLE array returns null`() { - val tleArray = arrayOf( - "1 25544U 98067A 21242.56000419 .00070558 00000-0 12956-2 0 9996", - "2 25544 51.6433 334.9559 0003020 334.9496 106.9882 15.48593918300128" - ) - assert(TLE.parseArray(tleArray)?.createSat() == null) + fun `Given invalid params stream returns empty list`() { + val parsedList = TLE.parseStream(invalidParamsStream) + assert(parsedList.isEmpty()) } }