MimeType: add class with tests, woah!

This commit is contained in:
dece 2022-02-15 17:08:39 +01:00
parent 1fbfc38d6f
commit cd1732c599
2 changed files with 75 additions and 0 deletions

View file

@ -0,0 +1,37 @@
package dev.lowrespalmtree.comet
class MimeType(
val main: String,
val sub: String,
val params: Map<String, String>
) {
val short: String get() = "${main.ifEmpty { "*" }}/${sub.ifEmpty { "*" }}"
val charset: String get() = params.getOrDefault("charset", DEFAULT_CHARSET)
companion object {
const val DEFAULT_CHARSET = "utf-8"
val DEFAULT = MimeType("text", "gemini", mapOf("charset" to DEFAULT_CHARSET))
fun from(string: String): MimeType? {
val typeString: String
val params: Map<String, String>
if (";" in string) {
val elements = string.split(";")
typeString = elements[0]
params = mutableMapOf<String, String>()
elements.subList(1, elements.size)
.map { it.trim().lowercase() }
.map { p -> if (p.count { it == '=' } != 1) return@from null else p }
.map { it.split('=') }
.forEach { params[it[0]] = it[1] }
} else {
typeString = string.trim()
params = mapOf()
}
if (typeString.count { it == '/' } != 1)
return null
val (main, sub) = typeString.split('/').map { it.trim() }
return MimeType(main, sub, params)
}
}
}

View file

@ -0,0 +1,38 @@
package dev.lowrespalmtree.comet
import org.junit.Assert.*
import org.junit.Test
class MimeTypeTests {
@Test
fun from() {
assertNull(MimeType.from(""))
assertNull(MimeType.from("dumb"))
assertNull(MimeType.from("dumb;dumber"))
assertNull(MimeType.from("123456"))
MimeType.from("a/b")?.run {
assertEquals("a", main)
assertEquals("b", sub)
assertEquals(mapOf<String, String>(), params)
} ?: fail()
MimeType.from("text/gemini")?.run {
assertEquals("text", main)
assertEquals("gemini", sub)
assertEquals(mapOf<String, String>(), params)
} ?: fail()
MimeType.from("text/gemini;lang=en")?.run {
assertEquals("text", main)
assertEquals("gemini", sub)
assertEquals(mapOf("lang" to "en"), params)
} ?: fail()
MimeType.from("text/gemini ;lang=en")?.run {
assertEquals("text", main)
assertEquals("gemini", sub)
assertEquals(mapOf("lang" to "en"), params)
} ?: fail()
}
}