EN · DE · RU · FR · ES

#347: SourceFileCheckerTest.kt

projectforge-application/src/test/kotlin/org/projectforge/development/SourceFileCheckerTest.kt Тип: Kotlin · Роль: Тест · Исходник: projectforge-application/src/test/kotlin/org/projectforge/development/SourceFileCheckerTest.kt 82 строки · 43 кода · 34 комментария · 5 пустых
Модульный/интеграционный тест для SourceFileChecker. Проверяет корректность поведения соответствующего производственного класса.

Структура кода

Аннотации: author, Test, Throws

Классы: SourceFileCheckerTest, should

Функции (1): checkLoggerDeclarations

Свойства (2): loggerRegex, supportedExtensions

Импорты: 6 пакетов

Пакет: org.projectforge.development

Исходный код (сокращён)

package org.projectforge.development

import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.slf4j.LoggerFactory
import java.io.File
import java.io.IOException
import java.nio.charset.StandardCharsets

/**
 * Различные проверки исходных файлов.
 * @author Kai Reinhard
 */
class SourceFileCheckerTest {
    /**
     * Проверяет все исходники Kotlin и Java на корректное объявление LoggerFactory.getLogger(SourceFileCheckerTest::class.java). Если какое-либо
     * объявление Logger отличается от имени исходного файла, тест завершается неудачей.
     * Пример: Foo.java: private final Logger log = LoggerFactory.getLogger(Bar.class); // Bar.class должно быть Foo.class.
     */
    @Test
    @Throws(IOException::class)
    fun checkLoggerDeclarations() {
        var baseDir = File(System.getProperty("user.dir"))
        if (!baseDir.exists() || !baseDir.isDirectory) return
        if (baseDir.name == "projectforge-common") {
            // Проверяем родительскую директорию для проверки всех остальных модулей ProjectForge.
            baseDir = baseDir.parentFile
        }
        log.info("Проверка директории '${baseDir.absolutePath}...")
        var processedKotlinFiles = 0
        var processedJavaFiles = 0
        val errorFiles = mutableListOf<String>()
        baseDir.walkTopDown().filter { supportedExtensions.contains(it.extension) }.forEach { file ->
            if (file.extension == "kt") {
                ++processedKotlinFiles
            } else {
                ++processedJavaFiles
            }
            val content = file.readText(StandardCharsets.UTF_8)
            val matchResult = loggerRegex.find(content)
            val loggerClass = matchResult?.groups?.get(1)?.value?.trim()
            if (loggerClass != null && file.nameWithoutExtension != loggerClass) {
                errorFiles.add(file.path)
                log.warn("$file объявляет чужой класс логгера: '$loggerClass'")
            }
        }
        log.info("Проверено $processedKotlinFiles файлов Kotlin и $processedJavaFiles файлов Java на объявление Logger.")
        Assertions.assertTrue( errorFiles.isEmpty(), "Найдены исходные файлы с несоответствующими классами логгера: ${errorFiles.joinToString { it }}")
    }

    companion object {
        private val loggerRegex = """LoggerFactory\s*.\s*getLogger\s*\(\s*(.*)\s*(\.class|:{2}class)""".toRegex()
        private val supportedExtensions = arrayOf("kt", "java")

        // Kotlin:
        private val log = LoggerFactory.getLogger(SourceFileCheckerTest::class.java)
        // Java: private static final Logger log = LoggerFactory.getLogger(SourceFileCheckerTest.class);
    }
}

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.
5e563fb80 EnsureSourceHeadersAndI18nMain теперь вызывает SourceFileHeadersMain, SortAndCheckI18nPropertiesMain и I18nKeysUsage(create). Вызывайте этот main перед каждым релизом.