1package com.peachpasswords23import java.io.File4import javax.xml.parsers.DocumentBuilderFactory5import org.junit.Assert.assertEquals6import org.junit.Assert.assertTrue7import org.junit.Test8import org.w3c.dom.Element910class MainActivityManifestTest {11 @Test12 fun main_activity_declares_only_the_launcher_filter() {13 val manifest = manifestFile()14 val document = DocumentBuilderFactory.newInstance().apply {15 isNamespaceAware = true16 }.newDocumentBuilder().parse(manifest)17 val activities = document.getElementsByTagName("activity")18 val mainActivity = (0 until activities.length)19 .mapNotNull { activities.item(it) as? Element }20 .single { it.getAttributeNS(ANDROID_NAMESPACE, "name") == ".MainActivity" }2122 val filters = mainActivity.getElementsByTagName("intent-filter")23 assertEquals("MainActivity must have only its launcher filter", 1, filters.length)24 val filter = filters.item(0) as Element25 val actions = filter.getElementsByTagName("action")26 val categories = filter.getElementsByTagName("category")27 assertEquals(1, actions.length)28 assertEquals(29 "android.intent.action.MAIN",30 (actions.item(0) as Element).getAttributeNS(ANDROID_NAMESPACE, "name"),31 )32 assertEquals(1, categories.length)33 assertEquals(34 "android.intent.category.LAUNCHER",35 (categories.item(0) as Element).getAttributeNS(ANDROID_NAMESPACE, "name"),36 )37 assertTrue(38 "MainActivity must not declare a custom peach URI handler",39 filter.getElementsByTagName("data").length == 0,40 )41 }4243 private fun manifestFile(): File = File("src/main/AndroidManifest.xml")44 .takeIf { it.isFile }45 ?: File("app/src/main/AndroidManifest.xml")4647 private companion object {48 const val ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android"49 }50}