From 59c4e644cc35dd5279d6b6cde3453a0004482703 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 2 Nov 2025 19:07:50 +0100 Subject: [PATCH 01/24] chore: spotless plugin configuration and editorconfig aligned --- .editorconfig | 372 +++++++++++++++++++++++++++++++++++++++++++--- pom.xml | 3 + spotless.xml | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 760 insertions(+), 19 deletions(-) create mode 100644 spotless.xml diff --git a/.editorconfig b/.editorconfig index eded3ad8..d651afb9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,36 +1,370 @@ -root = true - [*] +charset = utf-8 end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space indent_size = 4 -charset = utf-8 +indent_style = space +insert_final_newline = true +max_line_length = 180 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = 180 +ij_wrap_on_typing = false [*.java] -ij_visual_guides = 180 +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_deconstruction_list_components = true +ij_java_align_multiline_extends_list = true +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = true +ij_java_align_multiline_text_blocks = true ij_java_align_multiline_throws_list = true -ij_java_align_multiline_annotation_parameters = true +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_align_types_in_multi_catch = true ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = off +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = off +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_add_space = false +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = off +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line ij_java_class_count_to_use_import_on_demand = 5 -ij_java_names_count_to_use_import_on_demand = 5 -ij_java_imports_layout = static java.**,static javax.**,$*,|,java.**,javax.**,* +ij_java_class_names_in_javadoc = 3 +ij_java_deconstruction_list_wrap = normal +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_while_brace_force = always +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = true +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = false +ij_java_doc_align_param_comments = false +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = true +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_enum_constants_wrap = split_into_lines +ij_java_enum_field_annotation_wrap = split_into_lines +ij_java_extends_keyword_wrap = off +ij_java_extends_list_wrap = off +ij_java_field_annotation_wrap = split_into_lines +ij_java_field_name_prefix = +ij_java_field_name_suffix = +ij_java_finally_on_new_line = false +ij_java_for_brace_force = always +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = true +ij_java_generate_final_parameters = true +ij_java_if_brace_force = always +ij_java_imports_layout = $*, |, java.**, javax.**, |, * +ij_java_indent_case_from_switch = true ij_java_insert_inner_class_imports = true -ij_java_layout_static_imports_separately = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = false +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_add_space_on_reformat = false +ij_java_line_comment_at_first_column = true +ij_java_local_variable_name_prefix = +ij_java_local_variable_name_suffix = +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line ij_java_method_call_chain_wrap = off +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = off +ij_java_modifier_list_wrap = false +ij_java_multi_catch_types_wrap = normal +ij_java_names_count_to_use_import_on_demand = 5 +ij_java_new_line_after_lparen_in_annotation = false +ij_java_new_line_after_lparen_in_deconstruction_pattern = true +ij_java_new_line_after_lparen_in_record_header = false +ij_java_new_line_when_body_is_presented = false +ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.* +ij_java_parameter_annotation_wrap = off +ij_java_parameter_name_prefix = +ij_java_parameter_name_suffix = +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = true +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_annotation = false +ij_java_rparen_on_new_line_in_deconstruction_pattern = true +ij_java_rparen_on_new_line_in_record_header = false +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = false +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_deconstruction_list = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_annotation_eq = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_deconstruction_list = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_static_field_name_prefix = +ij_java_static_field_name_suffix = +ij_java_subclass_name_prefix = +ij_java_subclass_name_suffix = Impl +ij_java_switch_expressions_wrap = normal +ij_java_ternary_operation_signs_on_next_line = true +ij_java_ternary_operation_wrap = normal +ij_java_test_name_prefix = +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off ij_java_throws_list_wrap = off -ij_java_block_comment_at_first_column = false -ij_java_line_comment_at_first_column = false -ij_java_line_comment_add_space = true +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = split_into_lines +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = true +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = true +ij_java_wrap_semicolon_after_call_chain = false + +[*.properties] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[*.xml] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false + +[*.html] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[*.md] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true -[{*.yml,*.yaml}] +[{*.yaml,*.yml}] indent_size = 2 -ij_continuation_indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true ij_yaml_keep_indents_on_empty_lines = false ij_yaml_keep_line_breaks = true -ij_any_block_comment_at_first_column = false -ij_java_line_comment_at_first_column = false -ij_java_line_comment_add_space = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true diff --git a/pom.xml b/pom.xml index b8bd7798..73a28af8 100644 --- a/pom.xml +++ b/pom.xml @@ -321,6 +321,9 @@ java,javax,ch,com,io,net,lombok,org + + /Users/giulio/workspace/spectrum/spotless.xml + diff --git a/spotless.xml b/spotless.xml new file mode 100644 index 00000000..6b41b2fa --- /dev/null +++ b/spotless.xml @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8ba50c6dc0784aca1b38af828b89fe10007aca0f Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Fri, 7 Nov 2025 15:55:52 +0100 Subject: [PATCH 02/24] chore: aligning .editorconfig and spotless.xml --- .editorconfig | 391 ++++++++++++++++-- .../it_testbook/TestBookSessionListener.java | 6 +- .../it_testbook/tests/LoginFormIT.java | 3 +- .../giulong/spectrum/it/tests/FakerIT.java | 3 +- .../spectrum/it/tests/LoginFormIT.java | 3 +- .../giulong/spectrum/SpectrumEntity.java | 73 ++-- .../github/giulong/spectrum/SpectrumPage.java | 21 +- .../spectrum/SpectrumSessionListener.java | 6 +- .../github/giulong/spectrum/SpectrumTest.java | 6 +- .../extensions/resolvers/DataResolver.java | 3 +- .../extensions/resolvers/DriverResolver.java | 3 +- .../giulong/spectrum/utils/FileUtils.java | 4 +- .../spectrum/utils/FixedSizeQueue.java | 2 +- .../file_providers/ClientFileProvider.java | 3 +- .../file_providers/InternalFileProvider.java | 3 +- .../github/giulong/spectrum/utils/js/Js.java | 84 ++-- .../tests_comparators/StatusComparator.java | 16 +- .../giulong/spectrum/SpectrumEntityTest.java | 15 +- .../giulong/spectrum/SpectrumPageTest.java | 3 +- .../spectrum/SpectrumSessionListenerTest.java | 9 +- .../interceptors/SpectrumInterceptorTest.java | 3 +- .../resolvers/DataResolverTest.java | 3 +- .../StatefulExtentTestResolverTest.java | 3 +- .../BiDiTypeBasedParameterResolverTest.java | 3 +- .../watchers/EventsWatcherTest.java | 3 +- .../spectrum/interfaces/BiDiDriverTest.java | 3 +- .../internals/ColoredConverterTest.java | 3 +- .../deserializers/DriverDeserializerTest.java | 3 +- .../EnvironmentDeserializerTest.java | 3 +- .../InterpolatedBooleanDeserializerTest.java | 3 +- .../InterpolatedObjectDeserializerTest.java | 6 +- .../InterpolatedStringDeserializerTest.java | 3 +- .../LogbackLogLevelDeserializerTest.java | 3 +- .../EventsWebDriverListenerTest.java | 6 +- .../SpectrumWebDriverListenerTest.java | 3 +- .../spectrum/utils/ContextManagerTest.java | 8 +- .../spectrum/utils/ExtentReporterTest.java | 3 +- .../giulong/spectrum/utils/FileUtilsTest.java | 9 +- .../spectrum/utils/FixedSizeQueueTest.java | 3 +- .../spectrum/utils/ReflectionsTest.java | 6 +- .../giulong/spectrum/utils/RetentionTest.java | 3 +- .../giulong/spectrum/utils/SummaryTest.java | 3 +- .../giulong/spectrum/utils/YamlUtilsTest.java | 8 +- .../utils/events/DriverConsumerTest.java | 3 +- .../utils/events/EventsConsumerTest.java | 23 +- .../utils/events/MailConsumerTest.java | 2 +- .../events/video/VideoBaseConsumerTest.java | 3 +- .../utils/events/video/VideoConsumerTest.java | 8 +- .../ClientFileProviderTest.java | 7 +- .../InternalFileProviderTest.java | 4 +- .../giulong/spectrum/utils/js/JsTest.java | 9 +- .../utils/testbook/TestBookUnitTest.java | 9 +- .../tests_comparators/NameComparatorTest.java | 3 +- .../StatusComparatorTest.java | 3 +- .../spectrum/utils/video/VideoTest.java | 9 +- .../TestStepBuilderConsumerTest.java | 3 +- .../TestStepsConsumerTest.java | 3 +- spotless.xml | 30 +- .../verify_browsers/unit/ItVerifierTest.java | 20 +- .../FailsafeReportsVerifier.java | 18 +- 60 files changed, 624 insertions(+), 284 deletions(-) diff --git a/.editorconfig b/.editorconfig index d651afb9..3c21b467 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,6 +15,7 @@ ij_visual_guides = 180 ij_wrap_on_typing = false [*.java] +ij_visual_guides = ij_java_align_consecutive_assignments = false ij_java_align_consecutive_variable_declarations = false ij_java_align_group_field_declarations = false @@ -22,7 +23,7 @@ ij_java_align_multiline_annotation_parameters = false ij_java_align_multiline_array_initializer_expression = false ij_java_align_multiline_assignment = false ij_java_align_multiline_binary_operation = false -ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_chained_methods = true ij_java_align_multiline_deconstruction_list_components = true ij_java_align_multiline_extends_list = true ij_java_align_multiline_for = true @@ -30,9 +31,9 @@ ij_java_align_multiline_method_parentheses = false ij_java_align_multiline_parameters = true ij_java_align_multiline_parameters_in_calls = false ij_java_align_multiline_parenthesized_expression = false -ij_java_align_multiline_records = true +ij_java_align_multiline_records = false ij_java_align_multiline_resources = true -ij_java_align_multiline_ternary_operation = true +ij_java_align_multiline_ternary_operation = false ij_java_align_multiline_text_blocks = true ij_java_align_multiline_throws_list = true ij_java_align_subsequent_simple_methods = false @@ -64,10 +65,10 @@ ij_java_blank_lines_before_package = 0 ij_java_block_brace_style = end_of_line ij_java_block_comment_add_space = false ij_java_block_comment_at_first_column = true -ij_java_builder_methods = +ij_java_builder_methods = ij_java_call_parameters_new_line_after_left_paren = false ij_java_call_parameters_right_paren_on_new_line = false -ij_java_call_parameters_wrap = off +ij_java_call_parameters_wrap = normal ij_java_case_statement_on_separate_line = true ij_java_catch_on_new_line = false ij_java_class_annotation_wrap = split_into_lines @@ -81,21 +82,21 @@ ij_java_do_not_wrap_after_single_annotation_in_parameter = false ij_java_do_while_brace_force = always ij_java_doc_add_blank_line_after_description = true ij_java_doc_add_blank_line_after_param_comments = true -ij_java_doc_add_blank_line_after_return = false -ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_add_blank_line_after_return = true +ij_java_doc_add_p_tag_on_empty_lines = false ij_java_doc_align_exception_comments = false ij_java_doc_align_param_comments = false ij_java_doc_do_not_wrap_if_one_line = false ij_java_doc_enable_formatting = true ij_java_doc_enable_leading_asterisks = true -ij_java_doc_indent_on_continuation = true +ij_java_doc_indent_on_continuation = false ij_java_doc_keep_empty_lines = true ij_java_doc_keep_empty_parameter_tag = true ij_java_doc_keep_empty_return_tag = true ij_java_doc_keep_empty_throws_tag = true -ij_java_doc_keep_invalid_tags = true +ij_java_doc_keep_invalid_tags = false ij_java_doc_param_description_on_new_line = false -ij_java_doc_preserve_line_breaks = false +ij_java_doc_preserve_line_breaks = true ij_java_doc_use_throws_not_exception_tag = true ij_java_else_on_new_line = false ij_java_enum_constants_wrap = split_into_lines @@ -103,8 +104,8 @@ ij_java_enum_field_annotation_wrap = split_into_lines ij_java_extends_keyword_wrap = off ij_java_extends_list_wrap = off ij_java_field_annotation_wrap = split_into_lines -ij_java_field_name_prefix = -ij_java_field_name_suffix = +ij_java_field_name_prefix = +ij_java_field_name_suffix = ij_java_finally_on_new_line = false ij_java_for_brace_force = always ij_java_for_statement_new_line_after_left_paren = false @@ -113,7 +114,7 @@ ij_java_for_statement_wrap = off ij_java_generate_final_locals = true ij_java_generate_final_parameters = true ij_java_if_brace_force = always -ij_java_imports_layout = $*, |, java.**, javax.**, |, * +ij_java_imports_layout = $*,|,java.**,javax.**,|,* ij_java_indent_case_from_switch = true ij_java_insert_inner_class_imports = true ij_java_insert_override_annotation = true @@ -138,11 +139,11 @@ ij_java_layout_static_imports_separately = true ij_java_line_comment_add_space = false ij_java_line_comment_add_space_on_reformat = false ij_java_line_comment_at_first_column = true -ij_java_local_variable_name_prefix = -ij_java_local_variable_name_suffix = +ij_java_local_variable_name_prefix = +ij_java_local_variable_name_suffix = ij_java_method_annotation_wrap = split_into_lines ij_java_method_brace_style = end_of_line -ij_java_method_call_chain_wrap = off +ij_java_method_call_chain_wrap = normal ij_java_method_parameters_new_line_after_left_paren = false ij_java_method_parameters_right_paren_on_new_line = false ij_java_method_parameters_wrap = off @@ -153,16 +154,17 @@ ij_java_new_line_after_lparen_in_annotation = false ij_java_new_line_after_lparen_in_deconstruction_pattern = true ij_java_new_line_after_lparen_in_record_header = false ij_java_new_line_when_body_is_presented = false -ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.* +ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.* ij_java_parameter_annotation_wrap = off -ij_java_parameter_name_prefix = -ij_java_parameter_name_suffix = +ij_java_parameter_name_prefix = +ij_java_parameter_name_suffix = ij_java_parentheses_expression_new_line_after_left_paren = false ij_java_parentheses_expression_right_paren_on_new_line = false ij_java_place_assignment_sign_on_next_line = false ij_java_prefer_longer_names = true ij_java_prefer_parameters_wrap = false ij_java_record_components_wrap = normal +ij_java_repeat_annotations = ij_java_repeat_synchronized = true ij_java_replace_instanceof_and_cast = true ij_java_replace_null_check = true @@ -252,14 +254,14 @@ ij_java_spaces_within_synchronized_parentheses = false ij_java_spaces_within_try_parentheses = false ij_java_spaces_within_while_parentheses = false ij_java_special_else_if_treatment = true -ij_java_static_field_name_prefix = -ij_java_static_field_name_suffix = -ij_java_subclass_name_prefix = +ij_java_static_field_name_prefix = +ij_java_static_field_name_suffix = +ij_java_subclass_name_prefix = ij_java_subclass_name_suffix = Impl ij_java_switch_expressions_wrap = normal ij_java_ternary_operation_signs_on_next_line = true ij_java_ternary_operation_wrap = normal -ij_java_test_name_prefix = +ij_java_test_name_prefix = ij_java_test_name_suffix = Test ij_java_throws_keyword_wrap = off ij_java_throws_list_wrap = off @@ -272,17 +274,19 @@ ij_java_visibility = public ij_java_while_brace_force = never ij_java_while_on_new_line = false ij_java_wrap_comments = true -ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_first_method_in_call_chain = true ij_java_wrap_long_lines = true ij_java_wrap_semicolon_after_call_chain = false [*.properties] +ij_visual_guides = ij_properties_align_group_field_declarations = false ij_properties_keep_blank_lines = false ij_properties_key_value_delimiter = equals ij_properties_spaces_around_key_value_delimiter = false [.editorconfig] +ij_visual_guides = ij_editorconfig_align_group_field_declarations = false ij_editorconfig_space_after_colon = false ij_editorconfig_space_after_comma = true @@ -290,7 +294,8 @@ ij_editorconfig_space_before_colon = false ij_editorconfig_space_before_comma = false ij_editorconfig_spaces_around_assignment_operators = true -[*.xml] +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.jspx,*.pom,*.rng,*.tagx,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_visual_guides = ij_xml_align_attributes = true ij_xml_align_text = false ij_xml_attribute_wrap = normal @@ -310,24 +315,254 @@ ij_xml_space_inside_empty_tag = false ij_xml_text_wrap = normal ij_xml_use_custom_settings = false -[*.html] -ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +[{*.asproject,*.bazelproject,*.blazeproject}] +ij_visual_guides = + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_visual_guides = +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.bzl,*.sky,*.star,BUILD,BUILD.bazel,MODULE.bazel,WORKSPACE,WORKSPACE.bazel,WORKSPACE.bzlmod}] +ij_continuation_indent_size = 4 +ij_visual_guides = +ij_build_keep_indents_on_empty_lines = false + +[{*.gant,*.groovy,*.gy}] +ij_visual_guides = +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_add_space = false +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enable_groovydoc_formatting = true +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_ginq_general_clause_wrap_policy = 2 +ij_groovy_ginq_having_wrap_policy = 1 +ij_groovy_ginq_indent_having_clause = true +ij_groovy_ginq_indent_on_clause = true +ij_groovy_ginq_on_wrap_policy = 1 +ij_groovy_ginq_space_after_keyword = true +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *,|,javax.**,java.**,|,$* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_add_space_on_reformat = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.* +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_record_parentheses = false +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_chain_calls_after_dot = false +ij_groovy_wrap_long_lines = false + +[{*.har,*.json,*.jsonc}] +indent_size = 2 +ij_visual_guides = +ij_json_array_wrapping = split_into_lines +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = split_into_lines +ij_json_property_alignment = do_not_align +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = false +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.sht,*.shtm,*.shtml}] +ij_visual_guides = +ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 ij_html_align_attributes = true ij_html_align_text = false ij_html_attribute_wrap = normal ij_html_block_comment_add_space = false ij_html_block_comment_at_first_column = true ij_html_do_not_align_children_of_min_lines = 0 -ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p -ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p +ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot ij_html_enforce_quotes = false -ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var ij_html_keep_blank_lines = 2 ij_html_keep_indents_on_empty_lines = false ij_html_keep_line_breaks = true ij_html_keep_line_breaks_in_text = true ij_html_keep_whitespaces = false -ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_keep_whitespaces_inside = span,pre,textarea ij_html_line_comment_at_first_column = true ij_html_new_line_after_last_attribute = never ij_html_new_line_before_first_attribute = never @@ -338,7 +573,94 @@ ij_html_space_around_equality_in_attribute = false ij_html_space_inside_empty_tag = false ij_html_text_wrap = normal -[*.md] +[{*.kt,*.kts}] +ij_visual_guides = +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = normal +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = true +ij_kotlin_call_parameters_right_paren_on_new_line = true +ij_kotlin_call_parameters_wrap = on_every_item +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL +ij_kotlin_continuation_indent_for_chained_calls = false +ij_kotlin_continuation_indent_for_expression_bodies = false +ij_kotlin_continuation_indent_in_argument_lists = false +ij_kotlin_continuation_indent_in_elvis = false +ij_kotlin_continuation_indent_in_if_conditions = false +ij_kotlin_continuation_indent_in_parameter_lists = false +ij_kotlin_continuation_indent_in_supertype_lists = false +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = normal +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = true +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_break_after_multiline_when_entry = true +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_add_space_on_reformat = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = normal +ij_kotlin_method_parameters_new_line_after_left_paren = true +ij_kotlin_method_parameters_right_paren_on_new_line = true +ij_kotlin_method_parameters_wrap = on_every_item +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 1 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.markdown,*.md}] +ij_visual_guides = ij_markdown_force_one_space_after_blockquote_symbol = true ij_markdown_force_one_space_after_header_symbol = true ij_markdown_force_one_space_after_list_bullet = true @@ -356,8 +678,13 @@ ij_markdown_min_lines_between_paragraphs = 1 ij_markdown_wrap_text_if_long = true ij_markdown_wrap_text_inside_blockquotes = true +[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] +ij_visual_guides = +ij_toml_keep_indents_on_empty_lines = false + [{*.yaml,*.yml}] indent_size = 2 +ij_visual_guides = ij_yaml_align_values_properties = do_not_align ij_yaml_autoinsert_sequence_marker = true ij_yaml_block_mapping_on_new_line = false diff --git a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java index 6ece60b4..03fe62c2 100644 --- a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java +++ b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java @@ -176,7 +176,7 @@ public void launcherSessionClosed(LauncherSession session) { private void createExtentFiles(final List fileNames, final Path directory) { for (String fileName : fileNames) { assertTrue(Files.createFile(directory.resolve(fileUtils.removeExtensionFrom(fileName)).resolve(fileName)).toFile().exists()); - Thread.sleep(1000); // just to be sure files have different creation dates + Thread.sleep(1000); // just to be sure files have different creation dates } } @@ -184,7 +184,7 @@ private void createExtentFiles(final List fileNames, final Path director private void createFiles(final List fileNames, final Path directory) { for (String fileName : fileNames) { assertTrue(Files.createFile(directory.resolve(fileName)).toFile().exists()); - Thread.sleep(1000); // just to be sure files have different creation dates + Thread.sleep(1000); // just to be sure files have different creation dates } } @@ -192,7 +192,7 @@ private void createFiles(final List fileNames, final Path directory) { private void createDirectories(final List directoryNames, final Path parentDirectory) { for (String fileName : directoryNames) { assertTrue(Files.createDirectories(parentDirectory.resolve(fileName)).toFile().exists()); - Thread.sleep(1000); // just to be sure files have different creation dates + Thread.sleep(1000); // just to be sure files have different creation dates } } diff --git a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/LoginFormIT.java b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/LoginFormIT.java index e352852b..d69209c7 100644 --- a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/LoginFormIT.java +++ b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/LoginFormIT.java @@ -51,7 +51,6 @@ void shouldRunSuccessfully(final String userName, final boolean expected, final static Stream valuesProvider() { return Stream.of( arguments("tom", true, "/secure"), - arguments("giulio", false, "/login") - ); + arguments("giulio", false, "/login")); } } diff --git a/it/src/test/java/io/github/giulong/spectrum/it/tests/FakerIT.java b/it/src/test/java/io/github/giulong/spectrum/it/tests/FakerIT.java index 1affa607..0484565b 100644 --- a/it/src/test/java/io/github/giulong/spectrum/it/tests/FakerIT.java +++ b/it/src/test/java/io/github/giulong/spectrum/it/tests/FakerIT.java @@ -82,7 +82,6 @@ void inputsWithProvider(final String number) { static Stream valuesProvider() { return Stream.of( arguments(faker.numerify("##")), - arguments(faker.numerify("###")) - ); + arguments(faker.numerify("###"))); } } diff --git a/it/src/test/java/io/github/giulong/spectrum/it/tests/LoginFormIT.java b/it/src/test/java/io/github/giulong/spectrum/it/tests/LoginFormIT.java index 7ec2def9..414234f9 100644 --- a/it/src/test/java/io/github/giulong/spectrum/it/tests/LoginFormIT.java +++ b/it/src/test/java/io/github/giulong/spectrum/it/tests/LoginFormIT.java @@ -65,8 +65,7 @@ void shouldRunSuccessfully(final String userName, final boolean expected, final static Stream valuesProvider() { return Stream.of( arguments("tom", true, "/secure"), - arguments("giulio", false, "/login") - ); + arguments("giulio", false, "/login")); } @Test diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java index 12b43301..d49ecaa6 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java @@ -120,6 +120,7 @@ public abstract class SpectrumEntity, Data> { * Hovers on the provided WebElement, leveraging the {@code actions} field * * @param webElement the WebElement on which to hover + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -142,9 +143,11 @@ public T screenshot() { } /** - * Adds a screenshot with the provided message and INFO status to the current test in the Extent Report + * Adds a screenshot with the provided message and INFO status to the current + * test in the Extent Report * * @param msg the message to log + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -155,9 +158,11 @@ public T screenshotInfo(final String msg) { } /** - * Adds a screenshot status with the provided message and WARN to the current test in the Extent Report + * Adds a screenshot status with the provided message and WARN to the current + * test in the Extent Report * * @param msg the message to log + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -168,9 +173,11 @@ public T screenshotWarning(final String msg) { } /** - * Adds a screenshot with the provided message and FAIL status to the current test in the Extent Report + * Adds a screenshot with the provided message and FAIL status to the current + * test in the Extent Report * * @param msg the message to log + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -181,9 +188,10 @@ public T screenshotFail(final String msg) { } /** - * Adds a screenshot with the provided message and the provided status to the current test in the Extent Report + * Adds a screenshot with the provided message and the provided status to the + * current test in the Extent Report * - * @param msg the message to log + * @param msg the message to log * @param status the log's status */ public void addScreenshotToReport(final String msg, final Status status) { @@ -209,16 +217,19 @@ public void addScreenshotToReport(final String msg, final Status status) { } /** - * Deletes the download folder (its path is provided in the {@code configuration*.yaml}) + * Deletes the download folder (its path is provided in the + * {@code configuration*.yaml}) */ public void deleteDownloadsFolder() { fileUtils.deleteContentOf(Path.of(configuration.getRuntime().getDownloadsFolder())); } /** - * Leverages the configurable {@code downloadWait} to check fluently if the file at the provided path is fully downloaded + * Leverages the configurable {@code downloadWait} to check fluently if the file + * at the provided path is fully downloaded * * @param path the path to the downloaded file to wait for + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -232,10 +243,12 @@ public T waitForDownloadOf(final Path path) { } /** - * Leverages the {@code waitForDownloadOf} method and then compares the checksums of the two files provided. + * Leverages the {@code waitForDownloadOf} method and then compares the + * checksums of the two files provided. * * @param downloadedFileName name of the downloaded file - * @param fileToCheckName name of the static file to be used as comparison + * @param fileToCheckName name of the static file to be used as comparison + * * @return true if the files are equal */ public boolean checkDownloadedFile(final String downloadedFileName, final String fileToCheckName) { @@ -246,17 +259,20 @@ public boolean checkDownloadedFile(final String downloadedFileName, final String waitForDownloadOf(downloadedFile); log.info(""" - Checking if these files are the same: - {} - {} - """, downloadedFile, fileToCheck); + Checking if these files are the same: + {} + {} + """, downloadedFile, fileToCheck); return Arrays.equals(sha256Of(downloadedFile), sha256Of(fileToCheck)); } /** - * Leverages the {@code waitForDownloadOf} method and then compares the checksums of the file provided. + * Leverages the {@code waitForDownloadOf} method and then compares the + * checksums of the file provided. + * + * @param file name of both the downloaded file and the static one to be used as + * comparison * - * @param file name of both the downloaded file and the static one to be used as comparison * @return true if the files are equal */ public boolean checkDownloadedFile(final String file) { @@ -264,10 +280,12 @@ public boolean checkDownloadedFile(final String file) { } /** - * Helper method to call Selenium's {@code clear} and {@code sendKeys} on the provided WebElement, which is then returned + * Helper method to call Selenium's {@code clear} and {@code sendKeys} on the + * provided WebElement, which is then returned * * @param webElement target WebElement * @param keysToSend keys to send + * * @return the target WebElement passed as argument */ public WebElement clearAndSendKeys(final WebElement webElement, final CharSequence keysToSend) { @@ -278,11 +296,13 @@ public WebElement clearAndSendKeys(final WebElement webElement, final CharSequen } /** - * Uploads to the provided WebElement (usually an input field with {@code type="file"}) the file with the provided name, taken from the + * Uploads to the provided WebElement (usually an input field with + * {@code type="file"}) the file with the provided name, taken from the * configurable {@code runtime.filesFolder}. * * @param webElement target WebElement - * @param fileName name of the file to be uploaded + * @param fileName name of the file to be uploaded + * * @return the calling SpectrumEntity instance */ @SuppressWarnings("unchecked") @@ -295,9 +315,11 @@ public T upload(final WebElement webElement, final String fileName) { } /** - * Checks if the WebElement with the provided {@code by} is present in the current page + * Checks if the WebElement with the provided {@code by} is present in the + * current page * * @param by the WebElement's selector + * * @return true if the WebElement is found */ public boolean isPresent(final By by) { @@ -307,9 +329,11 @@ public boolean isPresent(final By by) { } /** - * Checks if no WebElement with the provided {@code by} is present in the current page + * Checks if no WebElement with the provided {@code by} is present in the + * current page * * @param by the WebElement's selector + * * @return true if the WebElement is not found */ public boolean isNotPresent(final By by) { @@ -320,7 +344,8 @@ public boolean isNotPresent(final By by) { * Checks if the provided WebElement has the provided css class * * @param webElement the WebElement to check - * @param className the css class to look for + * @param className the css class to look for + * * @return true if the WebElement has the provided css class */ public boolean hasClass(final WebElement webElement, final String className) { @@ -330,10 +355,12 @@ public boolean hasClass(final WebElement webElement, final String className) { } /** - * Checks if the provided WebElement has all the provided css classes + * Checks if the provided WebElement has all the provided css + * classes * * @param webElement the WebElement to check - * @param classes the css classes to look for + * @param classes the css classes to look for + * * @return true if the WebElement has all the provided css classes */ public boolean hasClasses(final WebElement webElement, final String... classes) { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumPage.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumPage.java index ab36eb17..9440ba87 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumPage.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumPage.java @@ -27,9 +27,11 @@ public abstract class SpectrumPage, Data> extend private String endpoint; /** - * Opens the web page at the URL made by the concatenation of the {@code baseUrl} provided in the {@code configuration.yaml} - * and the value of the {@code @Endpoint} annotation on the calling SpectrumPage. - * It also calls the {@link SpectrumPage#waitForPageLoading()} waitForPageLoading} before returning + * Opens the web page at the URL made by the concatenation of the + * {@code baseUrl} provided in the {@code configuration.yaml} and the value of + * the {@code @Endpoint} annotation on the calling SpectrumPage. It also calls + * the {@link SpectrumPage#waitForPageLoading()} waitForPageLoading} before + * returning * * @return the calling SpectrumPage instance */ @@ -44,9 +46,10 @@ public T open() { } /** - * This is a method that by default just logs a warning. If you need to check for custom conditions before considering - * a page fully loaded, you should override this method, so that calling {@link SpectrumPage#open() open} - * on pages will call your implementation automatically + * This is a method that by default just logs a warning. If you need to check + * for custom conditions before considering a page fully loaded, you should + * override this method, so that calling {@link SpectrumPage#open() open} on + * pages will call your implementation automatically * * @return the calling SpectrumPage instance */ @@ -58,7 +61,8 @@ public T waitForPageLoading() { } /** - * Checks whether the SpectrumPage instance on which this is called is fully loaded + * Checks whether the SpectrumPage instance on which this is called is fully + * loaded * * @return true if the SpectrumPage is loaded */ @@ -97,7 +101,8 @@ void injectJsWebElementProxyInto(final Field field) { if (value instanceof List) { log.debug("Field {} is a list. Cannot build proxy eagerly", field.getName()); - @SuppressWarnings("unchecked") final Object webElementProxy = Proxy.newProxyInstance( + @SuppressWarnings("unchecked") + final Object webElementProxy = Proxy.newProxyInstance( List.class.getClassLoader(), new Class[]{List.class}, JsWebElementListInvocationHandler diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java index 2046ddb6..51cd20ed 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java @@ -86,9 +86,9 @@ void parseConfiguration() { List parseProfiles() { return Arrays.stream(Optional - .ofNullable(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)) - .orElse(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)) - .split(",")) + .ofNullable(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)) + .orElse(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)) + .split(",")) .filter(not(String::isBlank)) .toList(); } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumTest.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumTest.java index 34150ad0..906388fc 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumTest.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumTest.java @@ -162,7 +162,8 @@ void beforeEach(final TestContext testContext, final TestData testData, final St @SneakyThrows SpectrumPage injectPageInto(final Field field) { - @SuppressWarnings("unchecked") final SpectrumPage spectrumPage = (SpectrumPage) field.getType().getDeclaredConstructor().newInstance(); + @SuppressWarnings("unchecked") + final SpectrumPage spectrumPage = (SpectrumPage) field.getType().getDeclaredConstructor().newInstance(); Reflections.setField(field, this, spectrumPage); return spectrumPage; @@ -186,7 +187,8 @@ void injectDataIn(final List> spectrumPages) { final Type type = Reflections.getGenericSuperclassOf(dataSpectrumPages.getFirst().getClass(), SpectrumPage.class).getActualTypeArguments()[1]; final String typeName = type.getTypeName(); - @SuppressWarnings("unchecked") final Class dataClass = (Class) type; + @SuppressWarnings("unchecked") + final Class dataClass = (Class) type; final Data data = yamlUtils.readClient(String.format("%s/data.yaml", configuration.getData().getFolder()), dataClass); dataSpectrumPages diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DataResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DataResolver.java index 5186263a..06460be7 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DataResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DataResolver.java @@ -37,7 +37,8 @@ public Data resolveParameter(@NonNull final ParameterContext parameterContext, f return null; } - @SuppressWarnings("unchecked") final Class dataClass = (Class) type; + @SuppressWarnings("unchecked") + final Class dataClass = (Class) type; final ExtensionContext.Store rootStore = context.getRoot().getStore(GLOBAL); return rootStore.computeIfAbsent(DATA, e -> { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java index 86db60d9..fa170ea7 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java @@ -111,7 +111,8 @@ public WebDriver resolveParameter(@NonNull final ParameterContext parameterConte .build()); final WebDriver decoratedDriver = new EventFiringDecorator<>(webDriverListeners.toArray(new WebDriverListener[0])).decorate(driver); - @SuppressWarnings("unchecked") final WebDriver originalDriver = ((Decorated) decoratedDriver).getOriginal(); + @SuppressWarnings("unchecked") + final WebDriver originalDriver = ((Decorated) decoratedDriver).getOriginal(); store.put(TEST_STEP_BUILDER_CONSUMER, testStepBuilderConsumer); store.put(DRIVER, decoratedDriver); diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index 183d1fbf..e1740943 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -29,8 +29,8 @@ public final class FileUtils { private static final String DEFAULT_TIMESTAMP_PATTERN = "dd-MM-yyyy_HH-mm-ss"; private static final String TIMESTAMP_TO_REPLACE = "\\$\\{timestamp:?(?.*)}"; private static final Pattern TIMESTAMP_PATTERN = Pattern.compile(".*\\$\\{timestamp:(?.*)}.*"); - private static final int[] ILLEGAL_CHARS = - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 42, 47, 58, 60, 62, 63, 92, 124}; + private static final int[] ILLEGAL_CHARS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 42, 47, + 58, 60, 62, 63, 92, 124}; public static FileUtils getInstance() { return INSTANCE; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FixedSizeQueue.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FixedSizeQueue.java index e2757972..20da030e 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FixedSizeQueue.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FixedSizeQueue.java @@ -27,7 +27,7 @@ public FixedSizeQueue shrinkTo(final int maxSize) { final int currentSize = size(); log.debug("Shrinking queue. Current size: {}, max size: {}", currentSize, maxSize); - for (int i = 0; i < currentSize - maxSize; i++) { // shrinking the queue to the proper size + for (int i = 0; i < currentSize - maxSize; i++) { // shrinking the queue to the proper size poll(); } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProvider.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProvider.java index 1597185b..b748f87a 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProvider.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProvider.java @@ -27,8 +27,7 @@ public Class getViews() { @Override public InjectableValues getInjectableValues() { - return new InjectableValues - .Std() + return new InjectableValues.Std() .addValue("enabledFromClient", true); } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProvider.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProvider.java index 386ba5e0..69d9c9c9 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProvider.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProvider.java @@ -19,8 +19,7 @@ public Class getViews() { @Override public InjectableValues getInjectableValues() { - return new InjectableValues - .Std() + return new InjectableValues.Std() .addValue("enabledFromClient", false); } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/js/Js.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/js/Js.java index c7c91bdc..cf42f99e 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/js/Js.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/js/Js.java @@ -15,21 +15,25 @@ @SuppressWarnings("checkstyle:MultipleStringLiterals") public class Js { - private static final Map CONVERSION_MAP = new HashMap<>() {{ - put("class", "className"); - put("readonly", "readOnly"); - }}; + private static final Map CONVERSION_MAP = new HashMap<>() { + { + put("class", "className"); + put("readonly", "readOnly"); + } + }; private final StringUtils stringUtils = StringUtils.getInstance(); private JavascriptExecutor driver; /** - * Find the first WebElement using the given method starting from the provided context + * Find the first WebElement using the given method starting from the provided + * context * - * @param context the context where to search the element + * @param context the context where to search the element * @param webElementFinder locating mechanism for finding the WebElement - * @param locatorValue the value used by the locating mechanism + * @param locatorValue the value used by the locating mechanism + * * @return the found WebElement */ public WebElement findElement(final WebElement context, final WebElementFinder webElementFinder, final String locatorValue) { @@ -40,7 +44,8 @@ public WebElement findElement(final WebElement context, final WebElementFinder w * Find the first WebElement using the given method starting from document * * @param webElementFinder the locating mechanism for finding the WebElement - * @param locatorValue the value used by the locating mechanism + * @param locatorValue the value used by the locating mechanism + * * @return the found WebElement */ public WebElement findElement(final WebElementFinder webElementFinder, final String locatorValue) { @@ -48,11 +53,13 @@ public WebElement findElement(final WebElementFinder webElementFinder, final Str } /** - * Find all WebElements using the given method starting from the provided context + * Find all WebElements using the given method starting from the provided + * context * - * @param context the context where to search the elements + * @param context the context where to search the elements * @param webElementFinder the locating mechanism for finding all WebElements - * @param locatorValue the value used by the locating mechanism + * @param locatorValue the value used by the locating mechanism + * * @return the list of found WebElements */ public List findElements(final WebElement context, final WebElementFinder webElementFinder, final String locatorValue) { @@ -60,10 +67,12 @@ public List findElements(final WebElement context, final WebElementF } /** - * Find all WebElements using the given method starting from the provided context + * Find all WebElements using the given method starting from the provided + * context * * @param webElementFinder the locating mechanism for finding all WebElements - * @param locatorValue the value used by the locating mechanism + * @param locatorValue the value used by the locating mechanism + * * @return the list of found WebElements */ public List findElements(final WebElementFinder webElementFinder, final String locatorValue) { @@ -74,6 +83,7 @@ public List findElements(final WebElementFinder webElementFinder, fi * Get the innerText of the provided webElement * * @param webElement the WebElement from which the innerText has to be taken + * * @return the value of the innerText */ public String getText(final WebElement webElement) { @@ -83,8 +93,9 @@ public String getText(final WebElement webElement) { /** * Get the CSS Value of the provided property * - * @param webElement the WebElement from which the tag CSS value is taken + * @param webElement the WebElement from which the tag CSS value is taken * @param cssProperty the CSS property to read + * * @return the value of the CSS property as String */ public String getCssValue(final WebElement webElement, final String cssProperty) { @@ -95,6 +106,7 @@ public String getCssValue(final WebElement webElement, final String cssProperty) * Get the shadowRoot of the provided WebElement * * @param webElement the WebElement from which the shadowRoot is taken + * * @return the shadowRoot of the WebElement */ public SearchContext getShadowRoot(final WebElement webElement) { @@ -105,6 +117,7 @@ public SearchContext getShadowRoot(final WebElement webElement) { * Get the Tag of the provided WebElement * * @param webElement the WebElement from which the tag name is taken + * * @return the tag name of the WebElement */ public String getTagName(final WebElement webElement) { @@ -116,8 +129,9 @@ public String getTagName(final WebElement webElement) { /** * Get the static attribute of the provided WebElement * - * @param webElement the WebElement from which the static attribute is taken + * @param webElement the WebElement from which the static attribute is taken * @param domAttribute the static Attribute to retrieve + * * @return the DOM Attribute of the WebElement or null if there isn't */ public String getDomAttribute(final WebElement webElement, final String domAttribute) { @@ -129,8 +143,9 @@ public String getDomAttribute(final WebElement webElement, final String domAttri /** * Get the property of the provided WebElement * - * @param webElement the webElement from which the property is taken + * @param webElement the webElement from which the property is taken * @param domProperty the property to retrieve + * * @return the DOM property of the WebElement or null if there isn't */ public String getDomProperty(final WebElement webElement, final String domProperty) { @@ -140,10 +155,12 @@ public String getDomProperty(final WebElement webElement, final String domProper } /** - * Get the property of the provided WebElement, if is null tries to take the dom attribute with the same name + * Get the property of the provided WebElement, if is null tries to take the dom + * attribute with the same name * * @param webElement the webElement from which the property is taken - * @param attribute the property/attribute to retrieve + * @param attribute the property/attribute to retrieve + * * @return the attribute/property current value or null if the value is not set. */ public String getAttribute(final WebElement webElement, final String attribute) { @@ -157,6 +174,7 @@ public String getAttribute(final WebElement webElement, final String attribute) * Determine whether the element is selected or not * * @param webElement the webElement to check + * * @return true if element is currently selected/checked, false otherwise */ public boolean isSelected(final WebElement webElement) { @@ -167,6 +185,7 @@ public boolean isSelected(final WebElement webElement) { * Determine whether the element is enabled or not * * @param webElement the webElement to check + * * @return true if element is enabled, false otherwise */ public boolean isEnabled(final WebElement webElement) { @@ -179,23 +198,28 @@ public boolean isEnabled(final WebElement webElement) { * Determine whether the element is displayed or not * * @param webElement the webElement to check + * * @return true if element is displayed, false otherwise */ public boolean isDisplayed(final WebElement webElement) { return (boolean) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect();" + "return arguments[0].checkVisibility({visibilityProperty:true, opacityProperty:true}) && " + - "rectangle.height > 0 && rectangle.width > 0", webElement); + "rectangle.height > 0 && rectangle.width > 0", + webElement); } /** * Get the size of the provided WebElement * * @param webElement the WebElement from which the size is taken + * * @return the rendered Size of the WebElement */ public Dimension getSize(final WebElement webElement) { - @SuppressWarnings("unchecked") final List dimensions = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + - "return [rectangle.width, rectangle.height];", webElement); + @SuppressWarnings("unchecked") + final List dimensions = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + + "return [rectangle.width, rectangle.height];", + webElement); return new Dimension(((Number) dimensions.get(0)).intValue(), ((Number) dimensions.get(1)).intValue()); } @@ -204,11 +228,14 @@ public Dimension getSize(final WebElement webElement) { * Get the location and size of the provided WebElement * * @param webElement the WebElement from which the location and size are taken + * * @return the location and size of the rendered WebElement */ public Rectangle getRect(final WebElement webElement) { - @SuppressWarnings("unchecked") final List rectangle = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + - "return [rectangle.x, rectangle.y, rectangle.width, rectangle.height];", webElement); + @SuppressWarnings("unchecked") + final List rectangle = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + + "return [rectangle.x, rectangle.y, rectangle.width, rectangle.height];", + webElement); final Point point = new Point((rectangle.get(0)).intValue(), (rectangle.get(1)).intValue()); final Dimension dimension = new Dimension((rectangle.get(2)).intValue(), (rectangle.get(3)).intValue()); @@ -220,11 +247,14 @@ public Rectangle getRect(final WebElement webElement) { * Get the location of the provided WebElement * * @param webElement the WebElement from which the location and size are taken + * * @return the top left-hand point of the rendered WebElement */ public Point getLocation(final WebElement webElement) { - @SuppressWarnings("unchecked") final List point = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + - "return [rectangle.x, rectangle.y];", webElement); + @SuppressWarnings("unchecked") + final List point = (List) driver.executeScript("var rectangle = arguments[0].getBoundingClientRect(); " + + "return [rectangle.x, rectangle.y];", + webElement); return new Point(((Number) point.get(0)).intValue(), ((Number) point.get(1)).intValue()); } @@ -233,6 +263,7 @@ public Point getLocation(final WebElement webElement) { * Performs a click with javascript on the provided WebElement * * @param webElement the WebElement to click on + * * @return the calling SpectrumEntity instance */ public Js click(final WebElement webElement) { @@ -246,6 +277,7 @@ public Js click(final WebElement webElement) { * * @param webElement the WebElement to target the send method * @param keysToSend the String to send to webElement + * * @return the calling SpectrumEntity instance */ public Js sendKeys(final WebElement webElement, final CharSequence... keysToSend) { @@ -263,6 +295,7 @@ public Js sendKeys(final WebElement webElement, final CharSequence... keysToSend * Performs a submit action on the provided form * * @param webElement the WebElement to submit + * * @return the calling SpectrumEntity instance */ public Js submit(final WebElement webElement) { @@ -275,6 +308,7 @@ public Js submit(final WebElement webElement) { * Clear input value with javascript on the provided WebElement * * @param webElement the WebElement used to clear the input field + * * @return the calling SpectrumEntity instance */ public Js clear(final WebElement webElement) { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparator.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparator.java index 835c77f8..60907da2 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparator.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparator.java @@ -17,13 +17,15 @@ public class StatusComparator implements TestsComparator { @JsonPropertyDescription("Weights of tests statuses. A lower weight means the test is shown before those with a higher one in the Extent report") - private final Map weights = new HashMap<>() {{ - put(INFO, INFO.getLevel()); - put(PASS, PASS.getLevel()); - put(WARNING, WARNING.getLevel()); - put(SKIP, SKIP.getLevel()); - put(FAIL, FAIL.getLevel()); - }}; + private final Map weights = new HashMap<>() { + { + put(INFO, INFO.getLevel()); + put(PASS, PASS.getLevel()); + put(WARNING, WARNING.getLevel()); + put(SKIP, SKIP.getLevel()); + put(FAIL, FAIL.getLevel()); + } + }; @Override public int compare(final Test test1, final Test test2) { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java index 28196c79..09363ab7 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java @@ -226,8 +226,7 @@ void getSharedFields() { "data", "statefulExtentTest", "testContext", - "jsWebElementProxyBuilder" - ))); + "jsWebElementProxyBuilder"))); } @Test @@ -486,8 +485,7 @@ void isPresent(final List webElements, final boolean expected) { static Stream isPresentProvider() { return Stream.of( arguments(List.of(), false), - arguments(List.of(mock(WebElement.class)), true) - ); + arguments(List.of(mock(WebElement.class)), true)); } @DisplayName("isNotPresent should return true if the element located by the provided By is not in the dom") @@ -502,8 +500,7 @@ void isNotPresent(final List webElements, final boolean expected) { static Stream isNotPresentProvider() { return Stream.of( arguments(List.of(), true), - arguments(List.of(mock(WebElement.class)), false) - ); + arguments(List.of(mock(WebElement.class)), false)); } @DisplayName("hasClass should check if the provided webElement has the provided css class") @@ -520,8 +517,7 @@ static Stream hasClassProvider() { arguments(null, false), arguments("", false), arguments("cssClass", true), - arguments("one cssClass another", true) - ); + arguments("one cssClass another", true)); } @DisplayName("hasClasses should check if the provided webElement has all the provided css class") @@ -538,8 +534,7 @@ static Stream hasClassesProvider() { arguments(null, false), arguments("", false), arguments("cssClass", false), - arguments("one cssClass another", true) - ); + arguments("one cssClass another", true)); } private static final class DummySpectrumEntity extends SpectrumEntity, T> { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumPageTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumPageTest.java index 205c1995..cf938afc 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumPageTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumPageTest.java @@ -142,8 +142,7 @@ static Stream valuesProvider() { return Stream.of( arguments("baseUrl", "/endpoint", "baseUrl/endpoint", true), arguments("baseUrl", "endpoint", "baseUrl/endpoint", true), - arguments("baseUrl", "/endpoint", "nope", false) - ); + arguments("baseUrl", "/endpoint", "nope", false)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java index 4eca27a1..44b6c4a6 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java @@ -255,8 +255,7 @@ static Stream profilesValuesProvider() { arguments("overridden-profile,second", "default-profile", List.of("overridden-profile", "second")), arguments(null, "default-profile", List.of("default-profile")), arguments(null, "default-profile,another", List.of("default-profile", "another")), - arguments(null, " ,,default-profile,another", List.of("default-profile", "another")) - ); + arguments(null, " ,,default-profile,another", List.of("default-profile", "another"))); } @DisplayName("parseVars should put in the VARS map all the variables read from the configuration yaml files") @@ -297,8 +296,7 @@ static Stream varsValuesProvider() { arguments(Map.of("one", "one"), null, null, Map.of("one", "one")), arguments(Map.of("one", "one"), Map.of("two", "two"), null, Map.of("one", "one", "two", "two")), arguments(Map.of("one", "one"), null, Map.of("three", "three"), Map.of("one", "one", "three", "three")), - arguments(Map.of("one", "one"), Map.of("two", "two"), Map.of("three", "three"), Map.of("one", "one", "two", "two", "three", "three")) - ); + arguments(Map.of("one", "one"), Map.of("two", "two"), Map.of("three", "three"), Map.of("one", "one", "two", "two", "three", "three"))); } @DisplayName("isUnix should check the OS") @@ -315,7 +313,6 @@ static Stream isUnixValuesProvider() { arguments("nix", true), arguments("blah", true), arguments("Win", false), - arguments("WiN", false) - ); + arguments("WiN", false)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java index 73dc4f35..4c5b8b58 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java @@ -160,8 +160,7 @@ static Stream valuesProvider() { return Stream.of( arguments(true, true), arguments(true, false), - arguments(false, false) - ); + arguments(false, false)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DataResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DataResolverTest.java index f31946fd..47412c0f 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DataResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DataResolverTest.java @@ -91,8 +91,7 @@ void supportsParameter(final String typeName, final boolean expected) { static Stream valuesProvider() { return Stream.of( arguments("Data", true), - arguments("not-good", false) - ); + arguments("not-good", false)); } @DisplayName("resolveParameter should load the data class from client side and deserialize the data.yaml on it") diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java index 6b52c7e0..d06d0a8d 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java @@ -148,7 +148,6 @@ static Stream noVideoValuesProvider() { return Stream.of( arguments(false, false), arguments(true, false), - arguments(true, true) - ); + arguments(true, true)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/bidi/BiDiTypeBasedParameterResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/bidi/BiDiTypeBasedParameterResolverTest.java index 46e48bac..f8cfab48 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/bidi/BiDiTypeBasedParameterResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/bidi/BiDiTypeBasedParameterResolverTest.java @@ -77,8 +77,7 @@ void supportsParameter(final Class clazz, final boolean expected) { static Stream valuesProvider() { return Stream.of( arguments(String.class, true), - arguments(Object.class, false) - ); + arguments(Object.class, false)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/watchers/EventsWatcherTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/watchers/EventsWatcherTest.java index 4ebfe784..35ada472 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/watchers/EventsWatcherTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/watchers/EventsWatcherTest.java @@ -195,8 +195,7 @@ void isTestFactory(final String methodName, final boolean expected) throws NoSuc static Stream valuesProvider() { return Stream.of( arguments("testFactoryMethod", true), - arguments("testAfterEach", false) - ); + arguments("testAfterEach", false)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/interfaces/BiDiDriverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/interfaces/BiDiDriverTest.java index 1a6d6ef8..df1cb071 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/interfaces/BiDiDriverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/interfaces/BiDiDriverTest.java @@ -51,7 +51,6 @@ static Stream valuesProvider() { arguments(true, true, true), arguments(true, false, true), arguments(false, true, true), - arguments(false, false, false) - ); + arguments(false, false, false)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/ColoredConverterTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/ColoredConverterTest.java index 31bb2ec2..c01acf7c 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/ColoredConverterTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/ColoredConverterTest.java @@ -40,7 +40,6 @@ static Stream valuesProvider() { arguments(WARN, YELLOW_FG), arguments(INFO, BLUE_FG), arguments(TRACE, MAGENTA_FG), - arguments(DEBUG, DEFAULT_FG) - ); + arguments(DEBUG, DEFAULT_FG)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/DriverDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/DriverDeserializerTest.java index 0ae9f065..b132ad93 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/DriverDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/DriverDeserializerTest.java @@ -72,7 +72,6 @@ static Stream valuesProvider() { arguments("xcuiTest", mock(XCUITest.class)), arguments("windows", mock(Windows.class)), arguments("mac2", mock(Mac2.class)), - arguments("appiumGeneric", mock(AppiumGeneric.class)) - ); + arguments("appiumGeneric", mock(AppiumGeneric.class))); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/EnvironmentDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/EnvironmentDeserializerTest.java index 836dd838..e1cfd0db 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/EnvironmentDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/EnvironmentDeserializerTest.java @@ -68,7 +68,6 @@ static Stream valuesProvider() { arguments("${justToTestInterpolation:-local}", mock(LocalEnvironment.class)), arguments("local", mock(LocalEnvironment.class)), arguments("grid", mock(GridEnvironment.class)), - arguments("appium", mock(AppiumEnvironment.class)) - ); + arguments("appium", mock(AppiumEnvironment.class))); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedBooleanDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedBooleanDeserializerTest.java index 49ac62e3..9ebe7749 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedBooleanDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedBooleanDeserializerTest.java @@ -73,7 +73,6 @@ static Stream valuesProvider() { arguments("${varInEnv:-true}", false), arguments("${varInEnv}", false), arguments("${not.set}", false), - arguments("${notSet}", false) - ); + arguments("${notSet}", false)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java index b28cd614..b052189d 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java @@ -265,8 +265,7 @@ static Stream valuesProvider() { arguments("$", 0), arguments("$", 0), arguments("$", Integer.parseInt(VAR_IN_ENV)), - arguments("$", Integer.parseInt(VAR_IN_ENV)) - ); + arguments("$", Integer.parseInt(VAR_IN_ENV))); } @Test @@ -321,7 +320,6 @@ static Stream isNumberValuesProvider() { arguments("-123", true), arguments("-123,5", true), arguments("-123.5", true), - arguments("-", false) - ); + arguments("-", false)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedStringDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedStringDeserializerTest.java index 95fbc9d1..91fb8314 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedStringDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedStringDeserializerTest.java @@ -81,8 +81,7 @@ static Stream valuesProvider() { arguments("${varInEnv}", VAR_IN_ENV), arguments("${varInEnv:-~/local}", VAR_IN_ENV), arguments("${not.set}", "${not.set}"), - arguments("${notSet}", "${notSet}") - ); + arguments("${notSet}", "${notSet}")); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/LogbackLogLevelDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/LogbackLogLevelDeserializerTest.java index 10a910a3..a7d7c7ed 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/LogbackLogLevelDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/LogbackLogLevelDeserializerTest.java @@ -56,7 +56,6 @@ static Stream valuesProvider() { arguments("DEBUG", DEBUG), arguments("INFO", INFO), arguments("WARN", WARN), - arguments("default", DEBUG) - ); + arguments("default", DEBUG)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/EventsWebDriverListenerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/EventsWebDriverListenerTest.java index 3ab25773..533eab3d 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/EventsWebDriverListenerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/EventsWebDriverListenerTest.java @@ -127,8 +127,7 @@ void parse() { s, "null", "css selector: #gettotal -> tag name: button", - "css selector: #get1-.total -> tag name: button" - ); + "css selector: #get1-.total -> tag name: button"); when(webElement1.toString()).thenReturn(webElement1ToString); when(webElement2.toString()).thenReturn(webElement2ToString); @@ -167,8 +166,7 @@ void parseDefault() { s, "null", "css selector: #gettotal -> tag name: button", - "css selector: #get1-.total -> tag name: button" - ); + "css selector: #get1-.total -> tag name: button"); when(webElement1.toString()).thenReturn(webElement1ToString); when(webElement2.toString()).thenReturn(webElement2ToString); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/SpectrumWebDriverListenerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/SpectrumWebDriverListenerTest.java index ce050748..dc12fea5 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/SpectrumWebDriverListenerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/web_driver_listeners/SpectrumWebDriverListenerTest.java @@ -51,8 +51,7 @@ static Stream valuesProvider() { arguments("[[[[ChromeDriver: chrome on WINDOWS (5db9fd1ca57389187f02aa09397ea93c)] -> css selector: #gettotal]] -> tag name: button]", "css selector: #gettotal -> tag name: button"), arguments("[[[[ChromeDriver: chrome on WINDOWS (5db9fd1ca57389187f02aa09397ea93c)] -> css selector: #get1-.total]] -> tag name: button]", - "css selector: #get1-.total -> tag name: button") - ); + "css selector: #get1-.total -> tag name: button")); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ContextManagerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ContextManagerTest.java index 48ba9432..d30fa2e1 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ContextManagerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ContextManagerTest.java @@ -74,9 +74,11 @@ void initForContext() { void initWithParentFor() { final String uniqueId = "uniqueId"; final String parentUniqueId = "parentUniqueId"; - final Map testContexts = new HashMap<>() {{ - put(parentUniqueId, testContext); - }}; + final Map testContexts = new HashMap<>() { + { + put(parentUniqueId, testContext); + } + }; Reflections.setField("testContexts", contextManager, testContexts); when(context.getUniqueId()).thenReturn(uniqueId); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java index 72f72118..5ee2eb16 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java @@ -536,8 +536,7 @@ static Stream valuesProvider() { return Stream.of( arguments(FAIL, RED), arguments(SKIP, AMBER), - arguments(INFO, GREEN) - ); + arguments(INFO, GREEN)); } @DisplayName("logTestEnd should create the test in the report and delegate to finalizeTest") diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java index b1c66a3e..89182299 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java @@ -107,8 +107,7 @@ static Stream fileNamesProvider() { arguments("fileName.html", "fileName.html"), arguments("fileName-${timestamp}.html", "fileName-[0-9]{2}-[0-9]{2}-[0-9]{4}_[0-9]{2}-[0-9]{2}-[0-9]{2}.html"), arguments("fileName-${timestamp:dd-MM-yyyy_HH-mm-ss}.html", "fileName-[0-9]{2}-[0-9]{2}-[0-9]{4}_[0-9]{2}-[0-9]{2}-[0-9]{2}.html"), - arguments("fileName-${timestamp:dd-MM-yyyy}.html", "fileName-[0-9]{2}-[0-9]{2}-[0-9]{4}.html") - ); + arguments("fileName-${timestamp:dd-MM-yyyy}.html", "fileName-[0-9]{2}-[0-9]{2}-[0-9]{4}.html")); } @DisplayName("getExtensionOf should return the extension of the provided fileName") @@ -122,8 +121,7 @@ static Stream getExtensionOfValuesProvider() { return Stream.of( arguments("fileName.abc", "abc"), arguments("fileName", "fileName"), - arguments("fileName.", "") - ); + arguments("fileName.", "")); } @DisplayName("removeExtensionFrom should return the provided fileName without the extension") @@ -137,8 +135,7 @@ static Stream removeExtensionFromValuesProvider() { return Stream.of( arguments("fileName.abc", "fileName"), arguments("fileName", "fileName"), - arguments("fileName.", "fileName") - ); + arguments("fileName.", "fileName")); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FixedSizeQueueTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FixedSizeQueueTest.java index dd1ac549..c284986a 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FixedSizeQueueTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FixedSizeQueueTest.java @@ -55,7 +55,6 @@ static Stream valuesProvider() { return Stream.of( arguments(3, 2, 2), arguments(1, 1, 1), - arguments(1, 2, 1) - ); + arguments(1, 2, 1)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ReflectionsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ReflectionsTest.java index 01a2374b..627d7439 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ReflectionsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ReflectionsTest.java @@ -40,8 +40,7 @@ void getFieldsOf(final Class clazz, final Class limit, final List static Stream valuesProvider() { return Stream.of( arguments(Dummy.class, DummyParent.class, List.of("fieldString", "secured")), - arguments(Dummy.class, Object.class, List.of("fieldString", "secured", "parentField")) - ); + arguments(Dummy.class, Object.class, List.of("fieldString", "secured", "parentField"))); } @Test @@ -95,8 +94,7 @@ void getFieldValueException(final Dummy[] reified) { static Stream getFieldValueExceptionValuesProvider() { return Stream.of( - arguments((Object) new Dummy[]{new Dummy("value")}) - ); + arguments((Object) new Dummy[]{new Dummy("value")})); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/RetentionTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/RetentionTest.java index 686d436e..f8ec7450 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/RetentionTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/RetentionTest.java @@ -502,7 +502,6 @@ static Stream valuesProvider() { return Stream.of( arguments(5L, true), arguments(3L, true), - arguments(0L, false) - ); + arguments(0L, false)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/SummaryTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/SummaryTest.java index 015536e1..07ac3681 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/SummaryTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/SummaryTest.java @@ -184,7 +184,6 @@ void toResult(final boolean successful, final Result expected) { static Stream valuesProvider() { return Stream.of( arguments(true, SUCCESSFUL), - arguments(false, FAILED) - ); + arguments(false, FAILED)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/YamlUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/YamlUtilsTest.java index 6c7547b5..190e0ba1 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/YamlUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/YamlUtilsTest.java @@ -79,8 +79,8 @@ void construction() { "HtmlTestBookReporter", "LogSummaryReporter", "TxtSummaryReporter", - "HtmlSummaryReporter" - ), ((YAMLMapper) Reflections.getFieldValue("yamlMapper", yamlUtils)).getRegisteredModuleIds()); + "HtmlSummaryReporter"), + ((YAMLMapper) Reflections.getFieldValue("yamlMapper", yamlUtils)).getRegisteredModuleIds()); assertEquals(Set.of( "jackson-datatype-jsr310", @@ -88,8 +88,8 @@ void construction() { "String", "boolean", "Level", - "Duration" - ), ((YAMLMapper) Reflections.getFieldValue("dynamicConfYamlMapper", yamlUtils)).getRegisteredModuleIds()); + "Duration"), + ((YAMLMapper) Reflections.getFieldValue("dynamicConfYamlMapper", yamlUtils)).getRegisteredModuleIds()); assertFalse(((ObjectWriter) Reflections.getFieldValue("writer", yamlUtils)).isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)); } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/DriverConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/DriverConsumerTest.java index 2a4f11cd..abffaf89 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/DriverConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/DriverConsumerTest.java @@ -89,8 +89,7 @@ static Stream valuesProvider() { arguments(SUCCESSFUL, true), arguments(FAILED, true), arguments(ABORTED, true), - arguments(DISABLED, false) - ); + arguments(DISABLED, false)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/EventsConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/EventsConsumerTest.java index ca160459..2af2bd97 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/EventsConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/EventsConsumerTest.java @@ -43,8 +43,7 @@ static Stream tagsIntersectProvider() { arguments(Set.of(TEST), null, false), arguments(null, Set.of(TEST), false), arguments(Set.of(SUITE, TEST), Set.of(TEST), true), - arguments(Set.of(TEST), Set.of(SUITE, TEST), true) - ); + arguments(Set.of(TEST), Set.of(SUITE, TEST), true)); } @DisplayName("primaryAndSecondaryIdMatch") @@ -70,8 +69,7 @@ static Stream primaryAndSecondaryIdMatchProvider() { arguments("class", "test", "class", "test", true), arguments("classAAA", "test", "class.*", "test", true), arguments("class", "testAAA", "class", "test.*", true), - arguments("classAAA", "testAAA", "class.*", "test.*", true) - ); + arguments("classAAA", "testAAA", "class.*", "test.*", true)); } @DisplayName("justPrimaryIdMatches") @@ -90,8 +88,7 @@ static Stream justPrimaryIdMatchesProvider() { arguments("class", null, false), arguments("class", "nope", false), arguments("class", "class", true), - arguments("classAAA", "class.*", true) - ); + arguments("classAAA", "class.*", true)); } @DisplayName("reasonMatches") @@ -110,8 +107,7 @@ static Stream reasonMatchesProvider() { arguments(AFTER, null, false), arguments(AFTER, BEFORE, false), arguments(AFTER, AFTER, true), - arguments("afterAAA", "after.*", true) - ); + arguments("afterAAA", "after.*", true)); } @DisplayName("resultMatches") @@ -128,8 +124,7 @@ static Stream resultProvider() { return Stream.of( arguments(null, FAILED, false), arguments(SUCCESSFUL, FAILED, false), - arguments(SUCCESSFUL, SUCCESSFUL, true) - ); + arguments(SUCCESSFUL, SUCCESSFUL, true)); } @DisplayName("findMatchFor") @@ -157,8 +152,7 @@ static Stream findMatchForProvider() { arguments(Event.builder().result(FAILED).primaryId("class").build(), Event.builder().result(FAILED).primaryId("nope").build(), false), arguments(Event.builder().result(FAILED).primaryId("class").build(), Event.builder().result(FAILED).primaryId("class").build(), true), arguments(Event.builder().result(FAILED).tags(Set.of(TEST)).build(), Event.builder().result(FAILED).tags(Set.of(SUITE)).build(), false), - arguments(Event.builder().result(FAILED).tags(Set.of(TEST)).build(), Event.builder().result(FAILED).tags(Set.of(TEST)).build(), true) - ); + arguments(Event.builder().result(FAILED).tags(Set.of(TEST)).build(), Event.builder().result(FAILED).tags(Set.of(TEST)).build(), true)); } @Test @@ -180,7 +174,7 @@ void match() { // we use the getContext method in the consumes of the DummyEventsConsumer below just to verify the interaction verify(firedEvent).getContext(); - verify(matchingEvent, never()).getContext(); // we never consume the user-defined event (as "event"). We consume the fired event + verify(matchingEvent, never()).getContext(); // we never consume the user-defined event (as "event"). We consume the fired event verify(neverMatchingEvent, never()).getContext(); } @@ -216,8 +210,7 @@ private static class DummyEventsConsumer extends EventsConsumer { DummyEventsConsumer() { events = List.of( - Event.builder().reason(BEFORE).primaryId("class").build() - ); + Event.builder().reason(BEFORE).primaryId("class").build()); } @Override diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/MailConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/MailConsumerTest.java index c5ecfb8f..f0df6097 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/MailConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/MailConsumerTest.java @@ -115,7 +115,7 @@ void accept() { when(attachment2.getFile()).thenReturn(file2); final MailConsumer mailConsumer = new MailConsumer(); - assertEquals(List.of(), Reflections.getFieldValue("attachments", mailConsumer)); // to check the default is an empty list + assertEquals(List.of(), Reflections.getFieldValue("attachments", mailConsumer)); // to check the default is an empty list Reflections.setField("attachments", mailConsumer, List.of(attachment1, attachment2)); mailConsumer.accept(event); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java index 5c87f30f..0324bd00 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java @@ -67,8 +67,7 @@ static Stream shouldAcceptValuesProvider() { arguments(DISABLED, true, false), arguments(SUCCESSFUL, true, false), arguments(DISABLED, false, false), - arguments(SUCCESSFUL, false, true) - ); + arguments(SUCCESSFUL, false, true)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java index 6212fe08..d1655297 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java @@ -274,7 +274,7 @@ void chooseDimensionForProvided(final int width, final int height) { reset(video); when(video.getWidth()).thenReturn(width); - if (width >= 1) { // short-circuit + if (width >= 1) { // short-circuit when(video.getHeight()).thenReturn(height); } when(driver.manage()).thenReturn(options); @@ -294,8 +294,7 @@ static Stream dimensionProvider() { return Stream.of( arguments(0, 0), arguments(1, 0), - arguments(0, 1) - ); + arguments(0, 1)); } @DisplayName("makeItEven should increment the provided int if it's odd") @@ -308,8 +307,7 @@ void makeItEven(final int i, final int expected) { static Stream valuesProvider() { return Stream.of( arguments(0, 0), - arguments(1, 2) - ); + arguments(1, 2)); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProviderTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProviderTest.java index e29d948c..1847f815 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProviderTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/ClientFileProviderTest.java @@ -37,8 +37,8 @@ void getViews() { @Test @DisplayName("getInjectableValues should return the client injectables") void getInjectableValues() { - final MockedConstruction mockedConstruction = mockConstruction(InjectableValues.Std.class, (mock, context) -> - when(mock.addValue("enabledFromClient", true)).thenReturn(mock)); + final MockedConstruction mockedConstruction = mockConstruction(InjectableValues.Std.class, + (mock, context) -> when(mock.addValue("enabledFromClient", true)).thenReturn(mock)); final InjectableValues actual = fileProvider.getInjectableValues(); @@ -83,8 +83,7 @@ void findValidPathsFor(final String file, final Stream strings) { static Stream valuesProvider() { return Stream.of( arguments("file", Stream.of("file", "file.yaml", "file.yml")), - arguments("folder/file", Stream.of("folder/file", "folder/file.yaml", "folder/file.yml")) - ); + arguments("folder/file", Stream.of("folder/file", "folder/file.yaml", "folder/file.yml"))); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProviderTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProviderTest.java index 8294c003..8c22d0b1 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProviderTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/file_providers/InternalFileProviderTest.java @@ -27,8 +27,8 @@ void getViews() { @Test @DisplayName("getInjectableValues should return the internal injectables") void getInjectableValues() { - final MockedConstruction mockedConstruction = mockConstruction(InjectableValues.Std.class, (mock, context) -> - when(mock.addValue("enabledFromClient", false)).thenReturn(mock)); + final MockedConstruction mockedConstruction = mockConstruction(InjectableValues.Std.class, + (mock, context) -> when(mock.addValue("enabledFromClient", false)).thenReturn(mock)); final InjectableValues actual = fileProvider.getInjectableValues(); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/js/JsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/js/JsTest.java index dc83f40f..55c4bb8c 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/js/JsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/js/JsTest.java @@ -291,8 +291,7 @@ void testGetSize() { List dimensions = Arrays.asList(200, 100); when(webDriver.executeScript( "var rectangle = arguments[0].getBoundingClientRect(); return [rectangle.width, rectangle.height];", - webElement - )).thenReturn(dimensions); + webElement)).thenReturn(dimensions); Dimension result = js.getSize(webElement); @@ -307,8 +306,7 @@ void testGetRect() { List rectangleValues = Arrays.asList(50, 60, 200, 100); when(webDriver.executeScript( "var rectangle = arguments[0].getBoundingClientRect(); return [rectangle.x, rectangle.y, rectangle.width, rectangle.height];", - webElement - )).thenReturn(rectangleValues); + webElement)).thenReturn(rectangleValues); Rectangle result = js.getRect(webElement); @@ -325,8 +323,7 @@ void testGetLocation() { List pointValues = Arrays.asList(50, 60); when(webDriver.executeScript( "var rectangle = arguments[0].getBoundingClientRect(); return [rectangle.x, rectangle.y];", - webElement - )).thenReturn(pointValues); + webElement)).thenReturn(pointValues); Point result = js.getLocation(webElement); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/testbook/TestBookUnitTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/testbook/TestBookUnitTest.java index 64037a64..512a6ca6 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/testbook/TestBookUnitTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/testbook/TestBookUnitTest.java @@ -179,10 +179,11 @@ void updateGroupedTests(final String className, final Map valuesProvider() { return Stream.of( arguments("className", new HashMap<>()), - arguments("className", new HashMap<>() {{ - put("className", new HashSet<>()); - }}) - ); + arguments("className", new HashMap<>() { + { + put("className", new HashSet<>()); + } + })); } @Test diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/NameComparatorTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/NameComparatorTest.java index 50fb5b75..22da7299 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/NameComparatorTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/NameComparatorTest.java @@ -38,7 +38,6 @@ static Stream valuesProvider() { return Stream.of( arguments("aaa", "bbb", -1), arguments("bbb", "aaa", 1), - arguments("aaa", "aaa", 0) - ); + arguments("aaa", "aaa", 0)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparatorTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparatorTest.java index 7b7c638f..e6cdf9a7 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparatorTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/tests_comparators/StatusComparatorTest.java @@ -42,7 +42,6 @@ static Stream valuesProvider() { return Stream.of( arguments(PASS, FAIL, -1), arguments(FAIL, PASS, 1), - arguments(PASS, PASS, 0) - ); + arguments(PASS, PASS, 0)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java index 509a9d3d..187e317b 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java @@ -39,8 +39,7 @@ void isDisabled(final List frames, final boolean expected) { static Stream valuesProvider() { return Stream.of( arguments(List.of(AUTO_BEFORE), false), - arguments(List.of(), true) - ); + arguments(List.of(), true)); } @DisplayName("shouldRecord should check if the provided frame name should be recorded") @@ -56,8 +55,7 @@ static Stream shouldRecordValuesProvider() { arguments(List.of(AUTO_BEFORE), true), arguments(List.of(MANUAL, AUTO_BEFORE), true), arguments(List.of(MANUAL), false), - arguments(List.of(), false) - ); + arguments(List.of(), false)); } @DisplayName("getAndIncrementFrameNumberFor should return the current frame number and increment it if the provided frame should be recorded, -1 otherwise") @@ -80,7 +78,6 @@ static Stream getAndIncrementFrameNumberForValuesProvider() { arguments(List.of(AUTO_BEFORE), 123, 1, 124), arguments(List.of(MANUAL, AUTO_BEFORE), 123, 1, 124), arguments(List.of(MANUAL), -1, 0, 123), - arguments(List.of(), -1, 0, 123) - ); + arguments(List.of(), -1, 0, 123)); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepBuilderConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepBuilderConsumerTest.java index fe887453..2aadb9c3 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepBuilderConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepBuilderConsumerTest.java @@ -101,7 +101,6 @@ void accept(final int millisPart, final String paddedMillisPart) { static Stream valuesProvider() { return Stream.of( arguments(789, "789"), - arguments(7, "700") - ); + arguments(7, "700")); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java index 925a8a5b..b92548cc 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java @@ -98,8 +98,7 @@ static Stream valuesProvider() { arguments(SUCCESSFUL, true), arguments(FAILED, true), arguments(ABORTED, true), - arguments(DISABLED, false) - ); + arguments(DISABLED, false)); } @Test diff --git a/spotless.xml b/spotless.xml index 6b41b2fa..68c33c59 100644 --- a/spotless.xml +++ b/spotless.xml @@ -24,7 +24,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -90,7 +90,7 @@ - + @@ -125,8 +125,8 @@ - - + + @@ -232,7 +232,7 @@ - + @@ -246,8 +246,8 @@ - - + + @@ -272,7 +272,7 @@ - + @@ -288,7 +288,7 @@ - + @@ -299,10 +299,10 @@ - + - + @@ -317,7 +317,7 @@ - + @@ -337,7 +337,7 @@ - + @@ -362,7 +362,7 @@ - + diff --git a/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItVerifierTest.java b/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItVerifierTest.java index 3ea615c6..aa607b4c 100644 --- a/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItVerifierTest.java +++ b/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItVerifierTest.java @@ -46,19 +46,19 @@ public void logFile() throws FileNotFoundException { // we indirectly check that the log consumer accepted the event with a regex in the primaryId assertTrue(logFile.contains(""" - Class Name: --- - Test Name : --- - Reason : custom-event - Result : --- - Tags : ---""")); + Class Name: --- + Test Name : --- + Reason : custom-event + Result : --- + Tags : ---""")); // we indirectly check that the log consumer accepted the event with a regex in the reason assertTrue(logFile.contains(""" - Class Name: --- - Test Name : --- - Reason : secondReason - Result : --- - Tags : ---""")); + Class Name: --- + Test Name : --- + Reason : secondReason + Result : --- + Tags : ---""")); // we check values sent to @Secured web elements are masked assertTrue(logFile.contains("Sending keys [***] to id: password")); diff --git a/verify-commons/src/main/java/io/github/giulong/spectrum/verify_commons/FailsafeReportsVerifier.java b/verify-commons/src/main/java/io/github/giulong/spectrum/verify_commons/FailsafeReportsVerifier.java index 4aaa2c4f..378e5fe2 100644 --- a/verify-commons/src/main/java/io/github/giulong/spectrum/verify_commons/FailsafeReportsVerifier.java +++ b/verify-commons/src/main/java/io/github/giulong/spectrum/verify_commons/FailsafeReportsVerifier.java @@ -71,15 +71,15 @@ public boolean verifyResultsAre(final String module, final String driver, final log .atLevel(result ? INFO : ERROR) .log(""" - \s - Results for report '{}' are: - \s - {} - {} - {} - {} - {} - """, + \s + Results for report '{}' are: + \s + {} + {} + {} + {} + {} + """, filePath, header, completedLine, From 6f8c873d8b42adfd1b8c0a46aaf356a4aba2bfd8 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Fri, 7 Nov 2025 22:25:49 +0100 Subject: [PATCH 03/24] build: spotless check bound to maven validate phase --- cleanup/pom.xml | 4 ++++ it-appium/pom.xml | 6 +++++- it-bidi/pom.xml | 4 ++++ it-grid/pom.xml | 4 ++++ it-macos/pom.xml | 4 ++++ it-testbook/pom.xml | 4 ++++ it/pom.xml | 4 ++++ pom.xml | 46 ++++++++++++++++++++++++++--------------- spectrum/pom.xml | 4 ++++ verify-appium/pom.xml | 4 ++++ verify-browsers/pom.xml | 4 ++++ verify-commons/pom.xml | 4 ++++ verify-macos/pom.xml | 4 ++++ 13 files changed, 78 insertions(+), 18 deletions(-) diff --git a/cleanup/pom.xml b/cleanup/pom.xml index 57b2abe5..e21562c2 100644 --- a/cleanup/pom.xml +++ b/cleanup/pom.xml @@ -22,6 +22,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-compiler-plugin diff --git a/it-appium/pom.xml b/it-appium/pom.xml index 711605cb..6f7835c9 100644 --- a/it-appium/pom.xml +++ b/it-appium/pom.xml @@ -39,6 +39,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin @@ -86,4 +90,4 @@ - \ No newline at end of file + diff --git a/it-bidi/pom.xml b/it-bidi/pom.xml index a2882fb2..08c65834 100644 --- a/it-bidi/pom.xml +++ b/it-bidi/pom.xml @@ -39,6 +39,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/it-grid/pom.xml b/it-grid/pom.xml index a2c4b8c2..220523e3 100644 --- a/it-grid/pom.xml +++ b/it-grid/pom.xml @@ -48,6 +48,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/it-macos/pom.xml b/it-macos/pom.xml index 9e5395f1..4ab606df 100644 --- a/it-macos/pom.xml +++ b/it-macos/pom.xml @@ -39,6 +39,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/it-testbook/pom.xml b/it-testbook/pom.xml index 578b7e79..63f3ceeb 100644 --- a/it-testbook/pom.xml +++ b/it-testbook/pom.xml @@ -39,6 +39,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/it/pom.xml b/it/pom.xml index 649aab0a..1ca76bd7 100644 --- a/it/pom.xml +++ b/it/pom.xml @@ -39,6 +39,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/pom.xml b/pom.xml index 73a28af8..15d03e01 100644 --- a/pom.xml +++ b/pom.xml @@ -310,23 +310,6 @@ maven-clean-plugin 3.5.0 - - com.diffplug.spotless - spotless-maven-plugin - 3.0.0 - - - - - java,javax,ch,com,io,net,lombok,org - - - - /Users/giulio/workspace/spectrum/spotless.xml - - - - org.apache.maven.plugins maven-checkstyle-plugin @@ -374,6 +357,31 @@ + + com.diffplug.spotless + spotless-maven-plugin + 3.0.0 + + + + + java,javax,ch,com,io,net,lombok,org + + + + ${maven.multiModuleProjectDirectory}/spotless.xml + + + + + + validate + + check + + + + org.apache.maven.plugins maven-compiler-plugin @@ -487,6 +495,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-resources-plugin diff --git a/spectrum/pom.xml b/spectrum/pom.xml index 37981619..60116767 100644 --- a/spectrum/pom.xml +++ b/spectrum/pom.xml @@ -195,6 +195,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/verify-appium/pom.xml b/verify-appium/pom.xml index 350ff8e6..8c908bb0 100644 --- a/verify-appium/pom.xml +++ b/verify-appium/pom.xml @@ -43,6 +43,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/verify-browsers/pom.xml b/verify-browsers/pom.xml index dac04123..6a82a535 100644 --- a/verify-browsers/pom.xml +++ b/verify-browsers/pom.xml @@ -43,6 +43,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/verify-commons/pom.xml b/verify-commons/pom.xml index 099c9001..d362bfa9 100644 --- a/verify-commons/pom.xml +++ b/verify-commons/pom.xml @@ -42,6 +42,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin diff --git a/verify-macos/pom.xml b/verify-macos/pom.xml index a0151829..efa2c021 100644 --- a/verify-macos/pom.xml +++ b/verify-macos/pom.xml @@ -43,6 +43,10 @@ org.apache.maven.plugins maven-checkstyle-plugin + + com.diffplug.spotless + spotless-maven-plugin + org.apache.maven.plugins maven-surefire-plugin From c6d2b64e8d740876524adab9fd88838aef17fb9b Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Fri, 7 Nov 2025 22:31:04 +0100 Subject: [PATCH 04/24] chore: versioning spotless apply run configuration --- .run/spotless_apply.run.xml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .run/spotless_apply.run.xml diff --git a/.run/spotless_apply.run.xml b/.run/spotless_apply.run.xml new file mode 100644 index 00000000..abbc5b55 --- /dev/null +++ b/.run/spotless_apply.run.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file From 5015ec0af784763d4c6269c98b4066957be7106c Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sat, 8 Nov 2025 12:10:37 +0100 Subject: [PATCH 05/24] build: deleting stale-issues gh workflow --- .github/workflows/stale-issues.yml | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 .github/workflows/stale-issues.yml diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml deleted file mode 100644 index 07bef60d..00000000 --- a/.github/workflows/stale-issues.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Close inactive issues -on: - schedule: - - cron: 0 0 1 * * - -jobs: - close-issues: - if: false - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - name: Close Stale Issues - uses: actions/stale@v9.0.0 - with: - days-before-issue-stale: 30 - days-before-issue-close: 14 - stale-issue-label: stale - stale-issue-message: This issue is stale because it has been open for 30 days with no activity. - close-issue-message: This issue was closed because it has been inactive for 14 days since being marked as stale. - days-before-pr-stale: -1 - days-before-pr-close: -1 - repo-token: ${{ secrets.GITHUB_TOKEN }} From 1c360b76352f3ccc02da513da3f44d84791d99a0 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 16:17:17 +0100 Subject: [PATCH 06/24] build: filtering gh build action to not run on certain paths such as docs and non-code files and folders --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bc8796a7..047f5f3b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,9 +3,11 @@ name: Build on: push: branches: [ "develop", "feature/**", "bugfix/**" ] + paths: [ '!.mvn/**', '!mvnw', '!mvnw.cmd', '!.run/**', '!docs/**', '!.editorconfig', '!.gitignore', '!**.md' ] pull_request: branches: [ "develop" ] types: [ opened, reopened, edited ] + paths: [ '!.mvn/**', '!mvnw', '!mvnw.cmd', '!.run/**', '!docs/**', '!.editorconfig', '!.gitignore', '!**.md' ] jobs: build: From 9a0d2976b3b8196e6cb66d95f897f46e8caf3278 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 16:34:38 +0100 Subject: [PATCH 07/24] chore: deleting src folder that contained just a bunch of images. Moved the ones used in the docs folder --- README.md | 10 +++++----- .../images/login-form-it-extent-report.png | Bin .../assets}/images/login-form-it.png | Bin .../assets/images/readme-html-summary.png | Bin .../assets/images/readme-html-testbook.png | Bin src/main/resources/images/github-mark.png | Bin 1040 -> 0 bytes src/main/resources/images/gmail-icon.png | Bin 901 -> 0 bytes src/main/resources/images/spectrum-logo.png | Bin 162172 -> 0 bytes 8 files changed, 5 insertions(+), 5 deletions(-) rename {src/main/resources => docs/assets}/images/login-form-it-extent-report.png (100%) rename {src/main/resources => docs/assets}/images/login-form-it.png (100%) rename src/main/resources/images/html-summary.png => docs/assets/images/readme-html-summary.png (100%) rename src/main/resources/images/html-testbook.png => docs/assets/images/readme-html-testbook.png (100%) delete mode 100644 src/main/resources/images/github-mark.png delete mode 100644 src/main/resources/images/gmail-icon.png delete mode 100644 src/main/resources/images/spectrum-logo.png diff --git a/README.md b/README.md index 26e6cca4..df03e202 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ [![GitHub Discussions](https://img.shields.io/github/discussions/giulong/spectrum)](https://github.com/giulong/spectrum/discussions)
-Spectrum logo +Spectrum logo

@@ -74,14 +74,14 @@ https://github.com/giulong/spectrum/assets/27963644/fecee8f5-f6dc-4b47-81a3-514e > `-Dspectrum.driver=firefox`, `-Dspectrum.driver=edge` or `-Dspectrum.driver=safari` Here's an overview of the project created by the archetype, along with the generated report and video:

-login-formreport +login-formreport https://github.com/giulong/spectrum/assets/27963644/df6b801e-91ca-415b-b510-a45b7392de20 You can also configure Spectrum to produce additional reports, such as summary and coverage:

-summaryhtml testbook +summaryhtml testbook If you like Spectrum, please consider giving it a GitHub Star ⭐ diff --git a/src/main/resources/images/login-form-it-extent-report.png b/docs/assets/images/login-form-it-extent-report.png similarity index 100% rename from src/main/resources/images/login-form-it-extent-report.png rename to docs/assets/images/login-form-it-extent-report.png diff --git a/src/main/resources/images/login-form-it.png b/docs/assets/images/login-form-it.png similarity index 100% rename from src/main/resources/images/login-form-it.png rename to docs/assets/images/login-form-it.png diff --git a/src/main/resources/images/html-summary.png b/docs/assets/images/readme-html-summary.png similarity index 100% rename from src/main/resources/images/html-summary.png rename to docs/assets/images/readme-html-summary.png diff --git a/src/main/resources/images/html-testbook.png b/docs/assets/images/readme-html-testbook.png similarity index 100% rename from src/main/resources/images/html-testbook.png rename to docs/assets/images/readme-html-testbook.png diff --git a/src/main/resources/images/github-mark.png b/src/main/resources/images/github-mark.png deleted file mode 100644 index 75ba73a7d7d9fea227903b6aa82bad0db656a391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmV+r1n>KaP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Yx$WWcEgNitoDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRdDMv7M|nl9zMR_MR}I@xj#opDVPlKiNrCc8y4{f@$9Ch zbKWNov$CWRpA%0QbV1@ruFEdJaV|M5@XWB0P0tgDiN#VE%U#UMhDtm`98pw_@`aqs z3g<1(YPHVV_v9}O7POTN*J+L*fh8o7f(RLPR8WP5D6JYPCepMY_wWxp{uH@na#g^{ zv49#>NRA);4}N!R7N@7&q+lHAeX;G2F(9xDv>LYkeQevU6TtrrTxlJDtqIJ1lHTZO zkt1MW8@RacX!0I#xdRM6>5?HilAoqfECTOm^i6qS@D}J_b9-y=^(Q3o)1^xBvhG4oO5oR5;6plFMroVHCxG_e;ju zrqNoV4Ok@AQJV*iE~FcwB8b$DD@70=E9pj;K5%2Vf-Acb(StHaE7(~Lv0U$6+$(HACX?xLvCjC)ae-Z+KFC+lDcp{yj`MaU z+%I9WFEeyiRmOpC{*Uhn*PU|lQR^YnGP2VL9{{(2t!$1?;8agFksf{qCs@}Up{g-l}c@T2ia`4ON`zL1v)MEVEzQcGlU70qoCUm?qmEXPO0<> zz|J1Z;CZJJ83U3*p1wJ3oJ#Szz)O^~p6{Il`H9L+Ut?}CN&Ofix5Hv!vR0jWX8??E zE&!_$6B$=ak9As_tj!jJ-ABANC;SzK>K1XwXoXR&&Mf*SdIZ=luGD|I(%dWuf!BV- z8!4B|4MJ&Bn=LH#_w5)KVGMW`7I~icN6{CGUi>&$99h3q0R93RrMoMi9fQ^Y0000< KMNUMnLSTaMMbi=h diff --git a/src/main/resources/images/gmail-icon.png b/src/main/resources/images/gmail-icon.png deleted file mode 100644 index f91aa3c6f9677102195c55def2b1b45f97c959b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmV;01A6?4P)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Yx$WWcEgNitoDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRdDMv7M|nl9zMR_MR}I@xj#opDVPlKiNrCc8y4{f@$9Ch zbKWNov$CWRpA%0QbV1@ruFEdJaV|M5@XWB0P0tgDiN#VE%U#UMhDtm`98pw_@`aqs z3g<1(YPHVV_v9}O7POTN*J+L*fh8o7f(RLPR8WP5D6JYPCepMY_wWxp{uH@na#g^{ zv49#>NRA);4}N!R7N@7&q+lHAeX;G2F(9xDv>LYkeQevU6TtrrTxlJDtqIJ1lHTZO zkt1MW8@RacX!0I#xdRM6>5?HilAoqfECTOm^i6qS@D}J_b9-y=^(K1Y5|_qW}N_gGod|R4C7#lD|t^aTLWr_vCBtPuopbn*{ya}q?N7=?g1L`4u>s{uh{ zP*Jo(lf3KD8eW6R;2G~Z=X-yguk5w8ei!s7s>y;Q-}=+(ODaG&Y06vHG7wggIV0#S zP>0B<$78KzBEe`mb0!juKA!qlfKi}MRAUD4y$X!ME6CP$qzfasd>T2O z*qo~UZ(bp+j&*Fv0oZP;pyu+&LnynS^M?(y|& z6RB81P`Agt6<6c#Vd@Xk4Z0zaP)yKH9PPcOwaR7QvXi<|82%TFmeX04eqAMFaRq@b b-jDbT1xI}ENATnQ00000NkvXXu0mjf{cMuk diff --git a/src/main/resources/images/spectrum-logo.png b/src/main/resources/images/spectrum-logo.png deleted file mode 100644 index 6453a549fa830b97c19d5ceb6b9a1ae4527ed6bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162172 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 z 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≶(wapQbX+u3m?Rm^%F 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 z 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�>xuP&0%s*m~zwJ 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 UXQ_rX`40^E+U=`YL+8i;1GQmbXaE2J From f4ecfdd5c1e3ea4fee895436e70d920de8f313ea Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 17:03:44 +0100 Subject: [PATCH 08/24] build: introducing it-windows and verify-windows modules to run less tests in GH build action on Windows workers, since they are too flaky --- .github/workflows/build.yml | 2 +- DEV.md | 6 +- cleanup/pom.xml | 36 +++++++ it-windows/pom.xml | 93 +++++++++++++++++++ .../it_windows/pages/CheckboxPage.java | 35 +++++++ .../it_windows/pages/LandingPage.java | 19 ++++ .../it_windows/tests/WindowsCheckboxIT.java | 48 ++++++++++ it-windows/src/test/resources/banner.txt | 19 ++++ .../src/test/resources/configuration.yml | 10 ++ .../test/resources/filtered/properties.yaml | 3 + .../src/test/resources/logback-test.xml | 25 +++++ pom.xml | 12 +++ verify-macos/pom.xml | 5 - verify-windows/pom.xml | 61 ++++++++++++ .../verify_windows/ItWindowsVerifierTest.java | 28 ++++++ .../src/test/resources/configuration.yaml | 6 ++ 16 files changed, 401 insertions(+), 7 deletions(-) create mode 100644 it-windows/pom.xml create mode 100644 it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/CheckboxPage.java create mode 100644 it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/LandingPage.java create mode 100644 it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java create mode 100644 it-windows/src/test/resources/banner.txt create mode 100644 it-windows/src/test/resources/configuration.yml create mode 100644 it-windows/src/test/resources/filtered/properties.yaml create mode 100644 it-windows/src/test/resources/logback-test.xml create mode 100644 verify-windows/pom.xml create mode 100644 verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java create mode 100644 verify-windows/src/test/resources/configuration.yaml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 047f5f3b..82b94a16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,7 +69,7 @@ jobs: moduleName: it-macos - os: windows-latest profiles: browsers - directives: -DbrowsersTests + directives: -DwindowsTests moduleName: it runs-on: ${{ matrix.os }} env: diff --git a/DEV.md b/DEV.md index f7944287..2e6cefd9 100644 --- a/DEV.md +++ b/DEV.md @@ -13,10 +13,12 @@ client would. So, we build the framework in a dedicated module, and then we incl | [it-bidi](it-bidi) | Runs a bunch of tests with the `webSocketUrl` capability | | [it-testbook](it-testbook) | Runs a bunch of tests with a testbook | | [it-macos](it-macos) | Runs a bunch of tests specific to macOS (Safari) | +| [it-windows](it-windows) | Runs a bunch of tests on Windows (useful for GH actions to reduce flakiness) | | [it-appium](it-appium) | Runs a bunch of tests with Appium | | [verify-commons](verify-commons) | Contains common classes used in other verify modules | | [verify-browsers](verify-browsers) | Verifies results of the `it`, `it-testbook`, `it-grid`, and `it-bidi` modules | | [verify-macos](verify-macos) | Verifies results of the `it-macos` module | +| [verify-windows](verify-windows) | Verifies results of the `it-windows` module | | [verify-appium](verify-appium) | Verifies results of the `it-appium` module | | [cleanup](cleanup) | Cleans each module after the execution | @@ -79,8 +81,10 @@ Where: on [Maven Central](https://central.sonatype.com/artifact/io.github.giulong/spectrum). * the `-DbrowsersTests` property is a shorthand to activate all the profiles needed to run tests on all the browsers. It's equivalent to running with these active profiles: `-P chrome,firefox,edge`. -* the `-DmacosTests` property is a shorthand to activate all the profiles needed to run tests on macOS. It's equivalent to +* the `-DmacosTests` property is a shorthand to activate all the profiles needed to run tests specific to Safari. It's equivalent to running with these active profiles: `-P safari`. +* the `-DwindowsTests` property is a shorthand to activate all the profiles needed to run tests on Windows in GitHub build action. It's equivalent to + running with these active profiles: `-P windows`. NOTE: this is not needed in local: it's meant to just run fewer tests on windows workers in CI builds. * the `-DappiumTests` property is a shorthand to activate all the profiles needed to run tests on Appium. It's equivalent to running with these active profiles: `-P uiAutomator2`. * the `-fae` option is [Maven's](https://maven.apache.org/ref/3.6.3/maven-embedder/cli.html) shorthand for `--fail-at-end`, needed to always run the `cleanup` module. diff --git a/cleanup/pom.xml b/cleanup/pom.xml index e21562c2..dd831896 100644 --- a/cleanup/pom.xml +++ b/cleanup/pom.xml @@ -142,6 +142,42 @@ + + Copy LauncherSessionListener to "it-windows" module's classes + clean + + copy-resources + + + ../it-windows/target/classes/META-INF/services + + + ${spectrumMetaInfServicesFolder} + + ${launcherSessionListener} + + + + + + + Copy LauncherSessionListener to "verify-windows" module's classes + clean + + copy-resources + + + ../verify-windows/target/classes/META-INF/services + + + ${spectrumMetaInfServicesFolder} + + ${launcherSessionListener} + + + + + Copy LauncherSessionListener to "it-appium" module's classes clean diff --git a/it-windows/pom.xml b/it-windows/pom.xml new file mode 100644 index 00000000..f15f50df --- /dev/null +++ b/it-windows/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + + io.github.giulong + spectrum-aggregate + ${revision} + + + it-windows + + + + io.github.giulong + spectrum + ${revision} + test + + + + + + + org.apache.maven.plugins + maven-clean-plugin + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + com.diffplug.spotless + spotless-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + + + + windows + + + windowsTests + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + Chrome IT + + integration-test + + + chrome + + chrome + + target/failsafe-reports/failsafe-chrome.xml + + + + + + + + + diff --git a/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/CheckboxPage.java b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/CheckboxPage.java new file mode 100644 index 00000000..e1b2b7f2 --- /dev/null +++ b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/CheckboxPage.java @@ -0,0 +1,35 @@ +package io.github.giulong.spectrum.it_windows.pages; + +import static org.openqa.selenium.support.ui.ExpectedConditions.*; + +import java.util.List; + +import io.github.giulong.spectrum.SpectrumPage; +import io.github.giulong.spectrum.interfaces.Endpoint; + +import lombok.Getter; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.FindBys; + +@Getter +@Endpoint("checkboxes") +@SuppressWarnings("unused") +public class CheckboxPage extends SpectrumPage { + + @FindBys({ + @FindBy(id = "checkboxes"), + @FindBy(tagName = "input") + }) + private List checkboxes; + + @Override + public CheckboxPage waitForPageLoading() { + pageLoadWait.until(and( + urlToBe("https://the-internet.herokuapp.com/checkboxes"), + visibilityOfAllElements(checkboxes))); + + return this; + } +} diff --git a/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/LandingPage.java b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/LandingPage.java new file mode 100644 index 00000000..7f5e4587 --- /dev/null +++ b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/pages/LandingPage.java @@ -0,0 +1,19 @@ +package io.github.giulong.spectrum.it_windows.pages; + +import io.github.giulong.spectrum.SpectrumPage; + +import lombok.Getter; + +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +@Getter +@SuppressWarnings("unused") +public class LandingPage extends SpectrumPage { + + @FindBy(tagName = "h1") + private WebElement title; + + @FindBy(linkText = "Checkboxes") + private WebElement checkboxLink; +} diff --git a/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java new file mode 100644 index 00000000..e4815198 --- /dev/null +++ b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java @@ -0,0 +1,48 @@ +package io.github.giulong.spectrum.it_windows.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.condition.OS.WINDOWS; + +import io.github.giulong.spectrum.SpectrumTest; +import io.github.giulong.spectrum.it_windows.pages.CheckboxPage; +import io.github.giulong.spectrum.it_windows.pages.LandingPage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.openqa.selenium.WebElement; + +@SuppressWarnings("unused") +@DisplayName("Checkbox Page") +@EnabledOnOs(WINDOWS) +class WindowsCheckboxIT extends SpectrumTest { + + private LandingPage landingPage; + + private CheckboxPage checkboxPage; + + @Test + void testWithNoDisplayName() { + // Open the base url of the application under test + driver.get(configuration.getApplication().getBaseUrl()); + assertEquals("Welcome to the-internet", landingPage.getTitle().getText()); + + extentTest.info("Custom step that should not be highlighted on video playback"); + landingPage.getCheckboxLink().click(); + extentTest.info("Custom step that should not be highlighted on video playback"); + + final WebElement firstCheckbox = checkboxPage.getCheckboxes().getFirst(); + final WebElement secondCheckbox = checkboxPage.getCheckboxes().get(1); + + assertFalse(firstCheckbox.isSelected()); + assertTrue(secondCheckbox.isSelected()); + + extentTest.info("Custom step that should not be highlighted on video playback"); + firstCheckbox.click(); + assertTrue(firstCheckbox.isSelected()); + + // Take a screenshot with a custom message + screenshotInfo("After checking the first checkbox"); + } +} diff --git a/it-windows/src/test/resources/banner.txt b/it-windows/src/test/resources/banner.txt new file mode 100644 index 00000000..db968727 --- /dev/null +++ b/it-windows/src/test/resources/banner.txt @@ -0,0 +1,19 @@ +<#assign length = 19 + name?length> +<#assign pad = length + (54 - length)/2> + +====================================================== + +${"START MODULE ${name?upper_case} TESTS"?left_pad(pad)} + +====================================================== + __________________________________________________ + / ____ _ \ +| / ___| _ __ ___ ___| |_ _ __ _ _ _ __ ___ | +| \___ \| '_ \ / _ \/ __| __| '__| | | | '_ ` _ \ | +| ___) | |_) | __/ (__| |_| | | |_| | | | | | | | +| |____/| .__/ \___|\___|\__|_| \__,_|_| |_| |_| | +| ******|_|${" Version: ${version}"?left_pad(39, "*")} | +| | +| Please consider giving a GitHub star: | +| ${url?right_pad(44)}| + \__________________________________________________/ diff --git a/it-windows/src/test/resources/configuration.yml b/it-windows/src/test/resources/configuration.yml new file mode 100644 index 00000000..915e5c16 --- /dev/null +++ b/it-windows/src/test/resources/configuration.yml @@ -0,0 +1,10 @@ +application: + baseUrl: https://the-internet.herokuapp.com/ + +drivers: + waits: + downloadTimeout: 5 + +extent: + theme: DARK + fileName: report-${spectrum.driver:-chrome}.html diff --git a/it-windows/src/test/resources/filtered/properties.yaml b/it-windows/src/test/resources/filtered/properties.yaml new file mode 100644 index 00000000..b34a324e --- /dev/null +++ b/it-windows/src/test/resources/filtered/properties.yaml @@ -0,0 +1,3 @@ +name: ${project.artifactId} +version: ${project.version} +url: https://github.com/giulong/spectrum diff --git a/it-windows/src/test/resources/logback-test.xml b/it-windows/src/test/resources/logback-test.xml new file mode 100644 index 00000000..f4237533 --- /dev/null +++ b/it-windows/src/test/resources/logback-test.xml @@ -0,0 +1,25 @@ + + + + + + + + + + ${COLOR_PATTERN} + + + + + ${FILE_PATH}/spectrum.log + + ${PATTERN} + + + + + + + + diff --git a/pom.xml b/pom.xml index 15d03e01..b4be75d4 100644 --- a/pom.xml +++ b/pom.xml @@ -68,10 +68,12 @@ it-bidi it-testbook it-macos + it-windows it-appium verify-commons verify-browsers verify-macos + verify-windows verify-appium cleanup @@ -108,6 +110,16 @@ + + windows + + it-windows + verify-commons + verify-windows + cleanup + + + appium diff --git a/verify-macos/pom.xml b/verify-macos/pom.xml index efa2c021..2a61bc62 100644 --- a/verify-macos/pom.xml +++ b/verify-macos/pom.xml @@ -18,11 +18,6 @@ verify-commons ${revision} - - org.hamcrest - hamcrest - test - diff --git a/verify-windows/pom.xml b/verify-windows/pom.xml new file mode 100644 index 00000000..2b59caea --- /dev/null +++ b/verify-windows/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + + io.github.giulong + spectrum-aggregate + ${revision} + + + verify-windows + + + + io.github.giulong + verify-commons + ${revision} + + + + + + + org.apache.maven.plugins + maven-clean-plugin + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + com.diffplug.spotless + spotless-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + -Dfile.encoding=UTF-8 + + + + org.apache.maven.plugins + maven-failsafe-plugin + + true + + + + + diff --git a/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java new file mode 100644 index 00000000..94f83d29 --- /dev/null +++ b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java @@ -0,0 +1,28 @@ +package io.github.giulong.spectrum.verify_windows; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.condition.OS.MAC; + +import io.github.giulong.spectrum.verify_commons.FailsafeReportsVerifier; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; + +@DisplayName("It Windows Module Verifier") +@EnabledOnOs(MAC) +public class ItWindowsVerifierTest { + + private static final FailsafeReportsVerifier FAILSAFE_REPORTS_VERIFIER = FailsafeReportsVerifier.getInstance(); + + private static final int COMPLETED = 1; + private static final int ERRORS = 0; + private static final int FAILURES = 0; + private static final int SKIPPED = 0; + + @Test + @DisplayName("chrome should have run with the correct results") + public void verifyChrome() { + assertTrue(FAILSAFE_REPORTS_VERIFIER.verifyResultsAre("it-windows", "chrome", COMPLETED, ERRORS, FAILURES, SKIPPED), "CHROME"); + } +} diff --git a/verify-windows/src/test/resources/configuration.yaml b/verify-windows/src/test/resources/configuration.yaml new file mode 100644 index 00000000..104ef128 --- /dev/null +++ b/verify-windows/src/test/resources/configuration.yaml @@ -0,0 +1,6 @@ +drivers: + waits: + downloadTimeout: 5 + chrome: + args: + - --headless=new From 7af8ed692a3a37c426a28637372b86c53fed8ae3 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 18:20:30 +0100 Subject: [PATCH 09/24] chore: minor spotless configuration change --- .../giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java | 1 + spotless.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java index e4815198..45a3b7d5 100644 --- a/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java +++ b/it-windows/src/test/java/io/github/giulong/spectrum/it_windows/tests/WindowsCheckboxIT.java @@ -8,6 +8,7 @@ import io.github.giulong.spectrum.SpectrumTest; import io.github.giulong.spectrum.it_windows.pages.CheckboxPage; import io.github.giulong.spectrum.it_windows.pages.LandingPage; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; diff --git a/spotless.xml b/spotless.xml index 68c33c59..55013ac1 100644 --- a/spotless.xml +++ b/spotless.xml @@ -208,7 +208,7 @@ - + From 92d7224a355bced1a6bd4be4fd30470e71869c3c Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 18:26:18 +0100 Subject: [PATCH 10/24] build: removing unused maven plugins in cleanup module --- cleanup/pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/cleanup/pom.xml b/cleanup/pom.xml index dd831896..f6a64cad 100644 --- a/cleanup/pom.xml +++ b/cleanup/pom.xml @@ -18,18 +18,6 @@ - - org.apache.maven.plugins - maven-checkstyle-plugin - - - com.diffplug.spotless - spotless-maven-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - org.apache.maven.plugins maven-resources-plugin From 6ff70af76b1fe40ef9ee37a066d98d988adccc43 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 18:27:13 +0100 Subject: [PATCH 11/24] fix: running ItWindowsVerifierTest on Windows only --- .../spectrum/verify_windows/ItWindowsVerifierTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java index 94f83d29..fd0a1020 100644 --- a/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java +++ b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java @@ -1,16 +1,15 @@ package io.github.giulong.spectrum.verify_windows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.condition.OS.MAC; +import static org.junit.jupiter.api.condition.OS.WINDOWS; import io.github.giulong.spectrum.verify_commons.FailsafeReportsVerifier; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; @DisplayName("It Windows Module Verifier") -@EnabledOnOs(MAC) +@EnabledOnOs(WINDOWS) public class ItWindowsVerifierTest { private static final FailsafeReportsVerifier FAILSAFE_REPORTS_VERIFIER = FailsafeReportsVerifier.getInstance(); From d3ecfe4eeec8ed8a3e521dda75b02c18a935f31a Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 18:30:36 +0100 Subject: [PATCH 12/24] build: switching paths to paths-ignore in gh build action --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82b94a16..37c79ed6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,11 +3,11 @@ name: Build on: push: branches: [ "develop", "feature/**", "bugfix/**" ] - paths: [ '!.mvn/**', '!mvnw', '!mvnw.cmd', '!.run/**', '!docs/**', '!.editorconfig', '!.gitignore', '!**.md' ] + paths-ignore: [ '.mvn/**', 'mvnw', 'mvnw.cmd', '.run/**', 'docs/**', '.editorconfig', '.gitignore', '**.md' ] pull_request: branches: [ "develop" ] types: [ opened, reopened, edited ] - paths: [ '!.mvn/**', '!mvnw', '!mvnw.cmd', '!.run/**', '!docs/**', '!.editorconfig', '!.gitignore', '!**.md' ] + paths-ignore: [ '.mvn/**', 'mvnw', 'mvnw.cmd', '.run/**', 'docs/**', '.editorconfig', '.gitignore', '**.md' ] jobs: build: From 3f6c7be03cb97fe6b23fdab4e48e8e58abb17332 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 18:31:38 +0100 Subject: [PATCH 13/24] fix: applying splotless --- .../giulong/spectrum/verify_windows/ItWindowsVerifierTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java index fd0a1020..850c8739 100644 --- a/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java +++ b/verify-windows/src/test/java/io/github/giulong/spectrum/verify_windows/ItWindowsVerifierTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.condition.OS.WINDOWS; import io.github.giulong.spectrum.verify_commons.FailsafeReportsVerifier; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; From 1c221e97d708d2aa815a1b7c97e3ea97dcd5a0b6 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 9 Nov 2025 19:11:22 +0100 Subject: [PATCH 14/24] fix(build): activating windows profile in build gh action on windows workers --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 37c79ed6..ace89a03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: directives: -DmacosTests moduleName: it-macos - os: windows-latest - profiles: browsers + profiles: windows directives: -DwindowsTests moduleName: it runs-on: ${{ matrix.os }} From 62f55ce0a7ae29c2b12ef526011ceb87cbb556a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:10:08 +0000 Subject: [PATCH 15/24] build(deps): bump com.puppycrawl.tools:checkstyle from 12.1.1 to 12.1.2 Bumps [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) from 12.1.1 to 12.1.2. - [Release notes](https://github.com/checkstyle/checkstyle/releases) - [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-12.1.1...checkstyle-12.1.2) --- updated-dependencies: - dependency-name: com.puppycrawl.tools:checkstyle dependency-version: 12.1.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4be75d4..4f2b9faf 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,7 @@ com.puppycrawl.tools checkstyle - 12.1.1 + 12.1.2 com.github.sevntu-checkstyle From 19045f534950db3ebf0282c80ff1a198b62b02f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:10:18 +0000 Subject: [PATCH 16/24] build(deps): bump ch.qos.logback:logback-classic from 1.5.20 to 1.5.21 Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.20 to 1.5.21. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.20...v_1.5.21) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.5.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4be75d4..ef5e0548 100644 --- a/pom.xml +++ b/pom.xml @@ -207,7 +207,7 @@ ch.qos.logback logback-classic - 1.5.20 + 1.5.21 org.slf4j From a1ff3923a52d7bc4dc17d10de883df6f72cce03a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:10:41 +0000 Subject: [PATCH 17/24] build(deps): bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.2 to 3.5.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.2...maven-jar-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4be75d4..6db4a07d 100644 --- a/pom.xml +++ b/pom.xml @@ -456,7 +456,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.2 + 3.5.0 com.github.victools From 12ba1e1a1ca1a762a23d0624694eed238703003f Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 23 Nov 2025 16:00:03 +0100 Subject: [PATCH 18/24] test: better checking that vars are parsed before the rest, and injected in other configuration keys --- .../github/giulong/spectrum/it_grid/tests/FilesIT.java | 9 +++++++++ .../giulong/spectrum/it_testbook/tests/FilesIT.java | 10 ++++++++++ .../io/github/giulong/spectrum/it/tests/FilesIT.java | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/it-grid/src/test/java/io/github/giulong/spectrum/it_grid/tests/FilesIT.java b/it-grid/src/test/java/io/github/giulong/spectrum/it_grid/tests/FilesIT.java index 0df6cc60..c5a43353 100644 --- a/it-grid/src/test/java/io/github/giulong/spectrum/it_grid/tests/FilesIT.java +++ b/it-grid/src/test/java/io/github/giulong/spectrum/it_grid/tests/FilesIT.java @@ -2,7 +2,9 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOf; import java.io.IOException; @@ -10,8 +12,11 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Scanner; import com.fasterxml.jackson.databind.ObjectMapper; @@ -50,6 +55,10 @@ void download() { downloadPage.getDownloadLinks().getFirst().click(); assertThrows(TimeoutException.class, () -> checkDownloadedFile(FILE_TO_DOWNLOAD)); + + final Path downloadsFolder = Path.of(String.valueOf(configuration.getVars().get("downloadsFolder"))); + assertTrue(Files.exists(downloadsFolder)); + assertNotEquals(0, Objects.requireNonNull(downloadsFolder.toFile().listFiles()).length); } @Test diff --git a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/FilesIT.java b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/FilesIT.java index a2cb6e45..07f47543 100644 --- a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/FilesIT.java +++ b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/tests/FilesIT.java @@ -1,9 +1,15 @@ package io.github.giulong.spectrum.it_testbook.tests; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOf; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + import io.github.giulong.spectrum.SpectrumTest; import io.github.giulong.spectrum.it_testbook.pages.DownloadPage; import io.github.giulong.spectrum.it_testbook.pages.UploadPage; @@ -33,6 +39,10 @@ void download() { downloadPage.getDownloadLinks().getFirst().click(); assertThrows(TimeoutException.class, () -> checkDownloadedFile(FILE_TO_DOWNLOAD)); + + final Path downloadsFolder = Path.of(String.valueOf(configuration.getVars().get("downloadsFolder"))); + assertTrue(Files.exists(downloadsFolder)); + assertNotEquals(0, Objects.requireNonNull(downloadsFolder.toFile().listFiles()).length); } @Test diff --git a/it/src/test/java/io/github/giulong/spectrum/it/tests/FilesIT.java b/it/src/test/java/io/github/giulong/spectrum/it/tests/FilesIT.java index 0f4af17e..9df0e4a2 100644 --- a/it/src/test/java/io/github/giulong/spectrum/it/tests/FilesIT.java +++ b/it/src/test/java/io/github/giulong/spectrum/it/tests/FilesIT.java @@ -3,6 +3,10 @@ import static org.junit.jupiter.api.Assertions.*; import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOf; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + import io.github.giulong.spectrum.SpectrumTest; import io.github.giulong.spectrum.it.pages.DownloadPage; import io.github.giulong.spectrum.it.pages.UploadPage; @@ -42,6 +46,11 @@ void download() { // We call the inherited helper method to check if the downloaded file is the one we expect // This is expected to fail since we're comparing it with a wrong file assertThrows(TimeoutException.class, () -> checkDownloadedFile(FILE_TO_DOWNLOAD)); + + // We still check the driver downloaded files in the right place + final Path downloadsFolder = Path.of(String.valueOf(configuration.getVars().get("downloadsFolder"))); + assertTrue(Files.exists(downloadsFolder)); + assertNotEquals(0, Objects.requireNonNull(downloadsFolder.toFile().listFiles()).length); } @Test From 5587ab85ea48fd7c81762ae1a62938f60ffbc19e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:44:15 +0000 Subject: [PATCH 19/24] build(deps): bump com.diffplug.spotless:spotless-maven-plugin Bumps [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/diffplug/spotless/releases) - [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md) - [Commits](https://github.com/diffplug/spotless/compare/lib/3.0.0...lib/3.1.0) --- updated-dependencies: - dependency-name: com.diffplug.spotless:spotless-maven-plugin dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c790fd5e..6392829b 100644 --- a/pom.xml +++ b/pom.xml @@ -372,7 +372,7 @@ com.diffplug.spotless spotless-maven-plugin - 3.0.0 + 3.1.0 From 3eaf82d28a79160408e26e499e1b09ba69f64666 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Wed, 26 Nov 2025 22:43:29 +0100 Subject: [PATCH 20/24] chore: aligning editorconfig and spotless --- .editorconfig | 67 ++--- spotless.xml | 784 ++++++++++++++++++++++++-------------------------- 2 files changed, 409 insertions(+), 442 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3c21b467..246d03e1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,31 +23,31 @@ ij_java_align_multiline_annotation_parameters = false ij_java_align_multiline_array_initializer_expression = false ij_java_align_multiline_assignment = false ij_java_align_multiline_binary_operation = false -ij_java_align_multiline_chained_methods = true +ij_java_align_multiline_chained_methods = false ij_java_align_multiline_deconstruction_list_components = true -ij_java_align_multiline_extends_list = true -ij_java_align_multiline_for = true +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = false ij_java_align_multiline_method_parentheses = false ij_java_align_multiline_parameters = true ij_java_align_multiline_parameters_in_calls = false ij_java_align_multiline_parenthesized_expression = false ij_java_align_multiline_records = false -ij_java_align_multiline_resources = true +ij_java_align_multiline_resources = false ij_java_align_multiline_ternary_operation = false ij_java_align_multiline_text_blocks = true -ij_java_align_multiline_throws_list = true +ij_java_align_multiline_throws_list = false ij_java_align_subsequent_simple_methods = false ij_java_align_throws_keyword = false -ij_java_align_types_in_multi_catch = true -ij_java_annotation_parameter_wrap = off +ij_java_align_types_in_multi_catch = false +ij_java_annotation_parameter_wrap = normal ij_java_array_initializer_new_line_after_left_brace = false ij_java_array_initializer_right_brace_on_new_line = false -ij_java_array_initializer_wrap = off -ij_java_assert_statement_colon_on_next_line = false -ij_java_assert_statement_wrap = off +ij_java_array_initializer_wrap = normal +ij_java_assert_statement_colon_on_next_line = true +ij_java_assert_statement_wrap = normal ij_java_assignment_wrap = off -ij_java_binary_operation_sign_on_next_line = false -ij_java_binary_operation_wrap = off +ij_java_binary_operation_sign_on_next_line = true +ij_java_binary_operation_wrap = normal ij_java_blank_lines_after_anonymous_class_header = 0 ij_java_blank_lines_after_class_header = 0 ij_java_blank_lines_after_imports = 1 @@ -86,11 +86,11 @@ ij_java_doc_add_blank_line_after_return = true ij_java_doc_add_p_tag_on_empty_lines = false ij_java_doc_align_exception_comments = false ij_java_doc_align_param_comments = false -ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_do_not_wrap_if_one_line = true ij_java_doc_enable_formatting = true ij_java_doc_enable_leading_asterisks = true ij_java_doc_indent_on_continuation = false -ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_lines = false ij_java_doc_keep_empty_parameter_tag = true ij_java_doc_keep_empty_return_tag = true ij_java_doc_keep_empty_throws_tag = true @@ -99,10 +99,10 @@ ij_java_doc_param_description_on_new_line = false ij_java_doc_preserve_line_breaks = true ij_java_doc_use_throws_not_exception_tag = true ij_java_else_on_new_line = false -ij_java_enum_constants_wrap = split_into_lines +ij_java_enum_constants_wrap = on_every_item ij_java_enum_field_annotation_wrap = split_into_lines -ij_java_extends_keyword_wrap = off -ij_java_extends_list_wrap = off +ij_java_extends_keyword_wrap = normal +ij_java_extends_list_wrap = normal ij_java_field_annotation_wrap = split_into_lines ij_java_field_name_prefix = ij_java_field_name_suffix = @@ -114,16 +114,16 @@ ij_java_for_statement_wrap = off ij_java_generate_final_locals = true ij_java_generate_final_parameters = true ij_java_if_brace_force = always -ij_java_imports_layout = $*,|,java.**,javax.**,|,* +ij_java_imports_layout = $*,|,java.**,javax.**,|,*,| ij_java_indent_case_from_switch = true ij_java_insert_inner_class_imports = true ij_java_insert_override_annotation = true -ij_java_keep_blank_lines_before_right_brace = 2 -ij_java_keep_blank_lines_between_package_declaration_and_header = 2 -ij_java_keep_blank_lines_in_code = 2 -ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_blank_lines_before_right_brace = 1 +ij_java_keep_blank_lines_between_package_declaration_and_header = 1 +ij_java_keep_blank_lines_in_code = 1 +ij_java_keep_blank_lines_in_declarations = 1 ij_java_keep_builder_methods_indents = false -ij_java_keep_control_statement_in_one_line = true +ij_java_keep_control_statement_in_one_line = false ij_java_keep_first_column_comment = false ij_java_keep_indents_on_empty_lines = false ij_java_keep_line_breaks = true @@ -146,7 +146,7 @@ ij_java_method_brace_style = end_of_line ij_java_method_call_chain_wrap = normal ij_java_method_parameters_new_line_after_left_paren = false ij_java_method_parameters_right_paren_on_new_line = false -ij_java_method_parameters_wrap = off +ij_java_method_parameters_wrap = normal ij_java_modifier_list_wrap = false ij_java_multi_catch_types_wrap = normal ij_java_names_count_to_use_import_on_demand = 5 @@ -171,7 +171,7 @@ ij_java_replace_null_check = true ij_java_replace_sum_lambda_with_method_ref = true ij_java_resource_list_new_line_after_left_paren = false ij_java_resource_list_right_paren_on_new_line = false -ij_java_resource_list_wrap = off +ij_java_resource_list_wrap = on_every_item ij_java_rparen_on_new_line_in_annotation = false ij_java_rparen_on_new_line_in_deconstruction_pattern = true ij_java_rparen_on_new_line_in_record_header = false @@ -260,11 +260,11 @@ ij_java_subclass_name_prefix = ij_java_subclass_name_suffix = Impl ij_java_switch_expressions_wrap = normal ij_java_ternary_operation_signs_on_next_line = true -ij_java_ternary_operation_wrap = normal +ij_java_ternary_operation_wrap = on_every_item ij_java_test_name_prefix = ij_java_test_name_suffix = Test -ij_java_throws_keyword_wrap = off -ij_java_throws_list_wrap = off +ij_java_throws_keyword_wrap = normal +ij_java_throws_list_wrap = normal ij_java_use_external_annotations = false ij_java_use_fq_class_names = false ij_java_use_relative_indents = false @@ -274,7 +274,7 @@ ij_java_visibility = public ij_java_while_brace_force = never ij_java_while_on_new_line = false ij_java_wrap_comments = true -ij_java_wrap_first_method_in_call_chain = true +ij_java_wrap_first_method_in_call_chain = false ij_java_wrap_long_lines = true ij_java_wrap_semicolon_after_call_chain = false @@ -313,10 +313,6 @@ ij_xml_space_after_tag_name = false ij_xml_space_around_equals_in_attribute = false ij_xml_space_inside_empty_tag = false ij_xml_text_wrap = normal -ij_xml_use_custom_settings = false - -[{*.asproject,*.bazelproject,*.blazeproject}] -ij_visual_guides = [{*.bash,*.sh,*.zsh}] indent_size = 2 @@ -329,11 +325,6 @@ ij_shell_redirect_followed_by_space = false ij_shell_switch_cases_indented = false ij_shell_use_unix_line_separator = true -[{*.bzl,*.sky,*.star,BUILD,BUILD.bazel,MODULE.bazel,WORKSPACE,WORKSPACE.bazel,WORKSPACE.bzlmod}] -ij_continuation_indent_size = 4 -ij_visual_guides = -ij_build_keep_indents_on_empty_lines = false - [{*.gant,*.groovy,*.gy}] ij_visual_guides = ij_groovy_align_group_field_declarations = false diff --git a/spotless.xml b/spotless.xml index 55013ac1..6561179b 100644 --- a/spotless.xml +++ b/spotless.xml @@ -1,404 +1,380 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3239e15396a15c993dfa5feac79a20d8c8e6e12b Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Wed, 26 Nov 2025 22:49:02 +0100 Subject: [PATCH 21/24] fix: reading vars only once --- .../spectrum/SpectrumSessionListener.java | 23 +++++---- .../giulong/spectrum/utils/Reflections.java | 13 ++--- .../giulong/spectrum/utils/YamlUtils.java | 10 ++-- .../spectrum/SpectrumSessionListenerTest.java | 48 +++++++++---------- .../giulong/spectrum/utils/YamlUtilsTest.java | 8 ++-- 5 files changed, 55 insertions(+), 47 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java index 51cd20ed..a2ef02b6 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumSessionListener.java @@ -70,8 +70,7 @@ void parseConfiguration() { .map(profile -> String.format("configuration-%s", profile)) .toList(); - parseVars(CONFIGURATION); - profileConfigurations.forEach(this::parseVars); + parseVars(profileConfigurations); yamlUtils.updateWithInternalFile(configuration, DEFAULT_CONFIGURATION_YAML); if (isUnix()) { @@ -86,23 +85,27 @@ void parseConfiguration() { List parseProfiles() { return Arrays.stream(Optional - .ofNullable(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)) - .orElse(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)) + .ofNullable(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)) + .orElse(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)) .split(",")) .filter(not(String::isBlank)) .toList(); } - @SuppressWarnings("unchecked") - void parseVars(final String profileConfiguration) { - vars.putAll(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)); + void parseVars(final List profileConfigurations) { + vars.putAll(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)); if (isUnix()) { - vars.putAll(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_UNIX_YAML, Map.class)); + vars.putAll(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_UNIX_YAML)); } - vars.putAll(Optional.ofNullable(yamlUtils.readClientNode(VARS_NODE, CONFIGURATION, Map.class)).orElse(new HashMap<>())); - vars.putAll(Optional.ofNullable(yamlUtils.readClientNode(VARS_NODE, profileConfiguration, Map.class)).orElse(new HashMap<>())); + vars.putAll(Optional + .>ofNullable(yamlUtils.readClientNode(VARS_NODE, CONFIGURATION)) + .orElse(new HashMap<>())); + + profileConfigurations.forEach(p -> vars.putAll(Optional + .>ofNullable(yamlUtils.readClientNode(VARS_NODE, p)) + .orElse(new HashMap<>()))); } boolean isUnix() { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/Reflections.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/Reflections.java index 21fa8b8a..abc7e9e8 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/Reflections.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/Reflections.java @@ -61,10 +61,6 @@ public static Field getField(final String fieldName, final Object object) { @SafeVarargs public static T getFieldValue(final String fieldName, final Object object, final T... reified) { - if (reified == null || reified.length > 0) { - throw new IllegalArgumentException("Do not pass arguments as last parameter"); - } - final Object value = getValueOf(getField(fieldName, object), object); return getClassOf(reified).cast(value); } @@ -112,9 +108,14 @@ public static List getAnnotatedFieldsValues(final Object object, final Cl .toList(); } + @SafeVarargs @SuppressWarnings("unchecked") - public static Class getClassOf(final T[] array) { - return (Class) array.getClass().getComponentType(); + public static Class getClassOf(final T... reified) { + if (reified == null || reified.length > 0) { + throw new IllegalArgumentException("Do not pass arguments as last parameter"); + } + + return (Class) reified.getClass().getComponentType(); } @SneakyThrows diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/YamlUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/YamlUtils.java index 196424e8..04c04a82 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/YamlUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/YamlUtils.java @@ -95,12 +95,14 @@ public T readInternal(final String file, final Class clazz) { return read(internalFileProvider, file, clazz); } - public T readClientNode(final String node, final String file, final Class clazz) { - return readNode(clientFileProvider, node, file, clazz); + @SafeVarargs + public final T readClientNode(final String node, final String file, final T... reified) { + return readNode(clientFileProvider, node, file, Reflections.getClassOf(reified)); } - public T readInternalNode(final String node, final String file, final Class clazz) { - return readNode(internalFileProvider, node, file, clazz); + @SafeVarargs + public final T readInternalNode(final String node, final String file, final T... reified) { + return readNode(internalFileProvider, node, file, Reflections.getClassOf(reified)); } public void updateWithClientFile(final T t, final String file) { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java index 44b6c4a6..cc9f4378 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumSessionListenerTest.java @@ -124,9 +124,9 @@ void launcherSessionOpened() { when(yamlUtils.readInternal("properties.yaml", ProjectProperties.class)).thenReturn(projectProperties); when(freeMarkerWrapper.interpolate(banner, projectProperties)).thenReturn(interpolatedBanner); - when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)).thenReturn(profile); - when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)).thenReturn("defaultProfile"); - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)).thenReturn(Map.of("one", "one")); + when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)).thenReturn(profile); + when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn("defaultProfile"); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(Map.of("one", "one")); when(launcherSession.getLauncher()).thenReturn(launcher); when(configuration.getRuntime()).thenReturn(runtime); @@ -180,11 +180,11 @@ void parseConfigurationNoProfile() { System.setProperty("os.name", "Win"); // parseProfile - when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)).thenReturn(""); - when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)).thenReturn("defaultProfile"); + when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)).thenReturn(""); + when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn("defaultProfile"); // parseVars - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)).thenReturn(Map.of("one", "one")); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(Map.of("one", "one")); spectrumSessionListener.parseConfiguration(); @@ -201,11 +201,11 @@ void parseConfiguration() { System.setProperty("os.name", "Win"); // parseProfile - when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)).thenReturn(profile); - when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)).thenReturn("defaultProfile"); + when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)).thenReturn(profile); + when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn("defaultProfile"); // parseVars - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)).thenReturn(Map.of("one", "one")); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(Map.of("one", "one")); spectrumSessionListener.parseConfiguration(); @@ -223,12 +223,12 @@ void parseConfigurationUnix() { System.setProperty("os.name", "nix"); // parseProfile - when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)).thenReturn(profile); - when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)).thenReturn("defaultProfile"); + when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)).thenReturn(profile); + when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn("defaultProfile"); // parseVars - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)).thenReturn(Map.of("one", "one")); - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_UNIX_YAML, Map.class)).thenReturn(Map.of("one", "one")); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(Map.of("one", "one")); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_UNIX_YAML)).thenReturn(Map.of("one", "one")); spectrumSessionListener.parseConfiguration(); @@ -242,8 +242,8 @@ void parseConfigurationUnix() { @ParameterizedTest(name = "with profile {0} and default profile {1} we expect {2}") @MethodSource("profilesValuesProvider") void parseProfiles(final String profile, final String defaultProfile, final List expected) { - when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION, String.class)).thenReturn(profile); - when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML, String.class)).thenReturn(defaultProfile); + when(yamlUtils.readClientNode(PROFILE_NODE, CONFIGURATION)).thenReturn(profile); + when(yamlUtils.readInternalNode(PROFILE_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(defaultProfile); assertEquals(expected, spectrumSessionListener.parseProfiles()); } @@ -266,11 +266,11 @@ void parseVars(final Map defaultVars, final Map System.setProperty("os.name", "Win"); - when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML, Map.class)).thenReturn(defaultVars); - when(yamlUtils.readClientNode(VARS_NODE, CONFIGURATION, Map.class)).thenReturn(vars); - when(yamlUtils.readClientNode(VARS_NODE, profileConfiguration, Map.class)).thenReturn(envVars); + when(yamlUtils.readInternalNode(VARS_NODE, DEFAULT_CONFIGURATION_YAML)).thenReturn(defaultVars); + when(yamlUtils.readClientNode(VARS_NODE, CONFIGURATION)).thenReturn(vars); + when(yamlUtils.readClientNode(VARS_NODE, profileConfiguration)).thenReturn(envVars); - spectrumSessionListener.parseVars(profileConfiguration); + spectrumSessionListener.parseVars(List.of(profileConfiguration)); assertEquals(expected, Vars.getInstance()); } @@ -282,12 +282,12 @@ void parseVarsUnix(final Map defaultVars, final Map Date: Mon, 1 Dec 2025 17:56:01 +0000 Subject: [PATCH 22/24] build(deps): bump org.apache.maven.plugins:maven-source-plugin Bumps [org.apache.maven.plugins:maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-source-plugin/releases) - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.3.1...maven-source-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-source-plugin dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- spectrum/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectrum/pom.xml b/spectrum/pom.xml index 60116767..618fd3b6 100644 --- a/spectrum/pom.xml +++ b/spectrum/pom.xml @@ -315,7 +315,7 @@ org.apache.maven.plugins maven-source-plugin - 3.3.1 + 3.4.0 attach-sources From 59d5fbeb24c8db4b4944d6dc38482680072b3b9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:56:11 +0000 Subject: [PATCH 23/24] build(deps): bump org.apache.maven.plugins:maven-resources-plugin Bumps [org.apache.maven.plugins:maven-resources-plugin](https://github.com/apache/maven-resources-plugin) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-resources-plugin/releases) - [Commits](https://github.com/apache/maven-resources-plugin/compare/maven-resources-plugin-3.3.1...v3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-resources-plugin dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6392829b..76f8d61e 100644 --- a/pom.xml +++ b/pom.xml @@ -409,7 +409,7 @@ org.apache.maven.plugins maven-resources-plugin - 3.3.1 + 3.4.0 UTF-8 From eaf564a2ab10f41ddddabf91a9875da0f6c77acb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:56:15 +0000 Subject: [PATCH 24/24] build(deps): bump com.puppycrawl.tools:checkstyle from 12.1.2 to 12.2.0 Bumps [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) from 12.1.2 to 12.2.0. - [Release notes](https://github.com/checkstyle/checkstyle/releases) - [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-12.1.2...checkstyle-12.2.0) --- updated-dependencies: - dependency-name: com.puppycrawl.tools:checkstyle dependency-version: 12.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6392829b..16e94954 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,7 @@ com.puppycrawl.tools checkstyle - 12.1.2 + 12.2.0 com.github.sevntu-checkstyle