/*
 * Copyright 2019-2022 Mamoe Technologies and contributors.
 *
 * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
 * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
 *
 * https://github.com/mamoe/mirai/blob/dev/LICENSE
 */

package net.mamoe.mirai.console.intellij.creator.tasks

import net.mamoe.mirai.console.intellij.diagnostics.adjustToClassName
import net.mamoe.mirai.console.intellij.diagnostics.isValidPackageName
import net.mamoe.mirai.console.intellij.diagnostics.isValidQualifiedClassName
import net.mamoe.mirai.console.intellij.diagnostics.isValidSimpleClassName
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

internal class TaskUtilsKtTest {

    private fun useClassNameCases(mustBeTrue: (String) -> Boolean) {
        val success = listOf("A", "A_B", "A0", "A_0", "A_B0")
        val failure = listOf("", "0", "_", "-", ".", "/", "A/", "A.", "A.")

        success.forEach { assertEquals(true, mustBeTrue(it), it) }
        failure.forEach { assertEquals(false, mustBeTrue(it), it) }
    }

    @Test
    fun isValidPackageName() {
        useClassNameCases { it.isValidPackageName() }
    }

    @Test
    fun isValidClassName() {
        useClassNameCases { it.isValidSimpleClassName() }
    }

    @Test
    fun adjustToClassName() {
        assertEquals("Test", "Test".adjustToClassName())
        assertEquals("TeSt", "Te_st".adjustToClassName())
        assertEquals("TeSt", "Te_St".adjustToClassName())
        assertEquals("TeSt", "Te-st".adjustToClassName())
        assertEquals("TeSt", "Te-St".adjustToClassName())

        assertEquals("TestAA", "Test//!@#$%^&*()AA".adjustToClassName())

        assertEquals(null, "0".adjustToClassName())
        assertEquals(null, "_0".adjustToClassName())
        assertEquals(null, "_0A".adjustToClassName())
        assertEquals("A1", "A1".adjustToClassName())

        assertEquals("A1", "A_1".adjustToClassName())
        assertEquals("A1", "A-1".adjustToClassName())

        assertEquals("MiraiConsoleExample", "mirai-console-example".adjustToClassName())
    }

    @Test
    fun qualifiedClassname() {
        useClassNameCases { it.isValidQualifiedClassName() }
        assertTrue { "a.b.c".isValidQualifiedClassName() }
    }
}