private void doSoftAssertions(final SoftAssertions softAssertions,
                                  final FunctionDef functionDef,
                                  final String className) {
        softAssertions.assertThat(functionDef.name())
                .withFailMessage(
                        "Function " + className + " needs a name")
                .isNotEmpty();

        assertMaxOneItemInArray(
                softAssertions,
                className,
                "FunctionDef.commonCategory",
                functionDef.commonCategory());

        assertMaxOneItemInArray(
                softAssertions,
                className,
                "FunctionDef.commonReturnType",
                functionDef.commonReturnType());

        softAssertions.assertThat(functionDef.signatures())
                .withFailMessage(
                        "Function " + className + " needs at least one @FunctionSignature")
                .isNotNull();

        softAssertions.assertThat(functionDef.signatures())
                .withFailMessage(
                        "Function " + className + " needs at least one @FunctionSignature")
                .isNotEmpty();

        for (int i = 0; i < functionDef.signatures().length; i++) {
            doSignatureAssertions(
                    softAssertions,
                    functionDef,
                    className,
                    functionDef.signatures()[i],
                    i);
        }
    }
This ia more of a QA to ensure all the annotations are set correctly for the functions
stroom-query/stroom-query-language/src/test/java/stroom/query/language/functions/TestFunctionFactory.java