svg_conform 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +23 -0
- data/.github/workflows/svgcheck-compatibility.yml +135 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/.rubocop_todo.yml +183 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Gemfile +14 -0
- data/README.adoc +1384 -0
- data/Rakefile +15 -0
- data/config/profiles/base.yml +34 -0
- data/config/profiles/lucid_fix.yml +37 -0
- data/config/profiles/metanorma.yml +212 -0
- data/config/profiles/no_external_css.yml +20 -0
- data/config/profiles/svg_1_2_rfc.yml +284 -0
- data/config/profiles/svg_1_2_rfc_with_rdf.yml +145 -0
- data/config/svgcheck_mapping.yml +180 -0
- data/docs/profiles.adoc +547 -0
- data/docs/rdf_metadata_support.adoc +212 -0
- data/docs/remediation.adoc +732 -0
- data/docs/requirements.adoc +709 -0
- data/examples/demo.rb +116 -0
- data/examples/requirements_demo.rb +240 -0
- data/exe/svg_conform +7 -0
- data/lib/svg_conform/batch_report.rb +70 -0
- data/lib/svg_conform/cli.rb +107 -0
- data/lib/svg_conform/commands/check.rb +390 -0
- data/lib/svg_conform/commands/profiles.rb +118 -0
- data/lib/svg_conform/commands/svgcheck.rb +90 -0
- data/lib/svg_conform/commands/svgcheck_compare.rb +92 -0
- data/lib/svg_conform/commands/svgcheck_compatibility.rb +43 -0
- data/lib/svg_conform/commands/svgcheck_generate.rb +262 -0
- data/lib/svg_conform/compatibility/analysis_context.rb +68 -0
- data/lib/svg_conform/compatibility/comparison_result.rb +147 -0
- data/lib/svg_conform/compatibility/compatibility_analyzer.rb +85 -0
- data/lib/svg_conform/compatibility/file_processor.rb +109 -0
- data/lib/svg_conform/compatibility/pattern_discovery.rb +319 -0
- data/lib/svg_conform/compatibility/report_formatter.rb +359 -0
- data/lib/svg_conform/compatibility/svg_analysis_engine.rb +316 -0
- data/lib/svg_conform/compatibility/validity_analysis.rb +252 -0
- data/lib/svg_conform/compatibility/xml_analysis_engine.rb +198 -0
- data/lib/svg_conform/compatibility_analyzer.rb +285 -0
- data/lib/svg_conform/conformance_report.rb +267 -0
- data/lib/svg_conform/constants.rb +199 -0
- data/lib/svg_conform/css_color.rb +262 -0
- data/lib/svg_conform/document.rb +203 -0
- data/lib/svg_conform/external_checkers/svgcheck/compatibility_engine.rb +166 -0
- data/lib/svg_conform/external_checkers/svgcheck/output_generator.rb +101 -0
- data/lib/svg_conform/external_checkers/svgcheck/parser.rb +200 -0
- data/lib/svg_conform/external_checkers/svgcheck/report_comparator.rb +175 -0
- data/lib/svg_conform/external_checkers/svgcheck/report_generator.rb +82 -0
- data/lib/svg_conform/external_checkers/svgcheck/validation_pipeline.rb +249 -0
- data/lib/svg_conform/external_checkers/svgcheck.rb +56 -0
- data/lib/svg_conform/external_checkers.rb +34 -0
- data/lib/svg_conform/fixer.rb +56 -0
- data/lib/svg_conform/profile.rb +164 -0
- data/lib/svg_conform/profiles.rb +60 -0
- data/lib/svg_conform/remediation_engine.rb +92 -0
- data/lib/svg_conform/remediation_result.rb +36 -0
- data/lib/svg_conform/remediation_runner.rb +225 -0
- data/lib/svg_conform/remediations/base_remediation.rb +165 -0
- data/lib/svg_conform/remediations/color_remediation.rb +226 -0
- data/lib/svg_conform/remediations/font_embedding_remediation.rb +145 -0
- data/lib/svg_conform/remediations/font_remediation.rb +122 -0
- data/lib/svg_conform/remediations/image_embedding_remediation.rb +154 -0
- data/lib/svg_conform/remediations/invalid_id_references_remediation.rb +129 -0
- data/lib/svg_conform/remediations/namespace_attribute_remediation.rb +244 -0
- data/lib/svg_conform/remediations/namespace_remediation.rb +151 -0
- data/lib/svg_conform/remediations/no_external_css_remediation.rb +192 -0
- data/lib/svg_conform/remediations/style_promotion_remediation.rb +93 -0
- data/lib/svg_conform/remediations/viewbox_remediation.rb +127 -0
- data/lib/svg_conform/remediations.rb +40 -0
- data/lib/svg_conform/report_comparator.rb +772 -0
- data/lib/svg_conform/requirements/allowed_elements_requirement.rb +367 -0
- data/lib/svg_conform/requirements/base_requirement.rb +98 -0
- data/lib/svg_conform/requirements/color_restrictions_requirement.rb +126 -0
- data/lib/svg_conform/requirements/element_requirement_config.rb +75 -0
- data/lib/svg_conform/requirements/font_family_requirement.rb +133 -0
- data/lib/svg_conform/requirements/forbidden_content_requirement.rb +60 -0
- data/lib/svg_conform/requirements/id_reference_requirement.rb +133 -0
- data/lib/svg_conform/requirements/invalid_id_references_requirement.rb +132 -0
- data/lib/svg_conform/requirements/link_validation_requirement.rb +55 -0
- data/lib/svg_conform/requirements/namespace_attributes_requirement.rb +211 -0
- data/lib/svg_conform/requirements/namespace_requirement.rb +294 -0
- data/lib/svg_conform/requirements/no_external_css_requirement.rb +132 -0
- data/lib/svg_conform/requirements/no_external_fonts_requirement.rb +121 -0
- data/lib/svg_conform/requirements/no_external_images_requirement.rb +91 -0
- data/lib/svg_conform/requirements/style_promotion_requirement.rb +72 -0
- data/lib/svg_conform/requirements/style_requirement.rb +226 -0
- data/lib/svg_conform/requirements/viewbox_required_requirement.rb +96 -0
- data/lib/svg_conform/requirements.rb +49 -0
- data/lib/svg_conform/semantic_comparator.rb +829 -0
- data/lib/svg_conform/validation_context.rb +408 -0
- data/lib/svg_conform/validation_result.rb +146 -0
- data/lib/svg_conform/validator.rb +91 -0
- data/lib/svg_conform/version.rb +5 -0
- data/lib/svg_conform.rb +68 -0
- data/lib/tasks/fixtures.rake +321 -0
- data/lib/tasks/svgcheck.rake +111 -0
- data/reference-docs/SVG-1.2-RFC.rnc.txt +1676 -0
- data/reference-docs/Scalable Vector Graphics (SVG) 1.1 (Second Edition).html +40764 -0
- data/reference-docs/Scalable Vector Graphics (SVG) Tiny 1.2 Specification.html +44591 -0
- data/reference-docs/rfc7996.txt +2971 -0
- data/sig/svg_conform.rbs +4 -0
- data/spec/fixtures/allowed_elements/inputs/basic_violations.svg +21 -0
- data/spec/fixtures/allowed_elements/repair/basic_violations.svg +18 -0
- data/spec/fixtures/color_restrictions/inputs/basic_violations.svg +23 -0
- data/spec/fixtures/color_restrictions/repair/basic_violations.svg +23 -0
- data/spec/fixtures/comprehensive/inputs/multiple_violations.svg +21 -0
- data/spec/fixtures/comprehensive/repair/multiple_violations.svg +16 -0
- data/spec/fixtures/font_family/inputs/basic_violations.svg +17 -0
- data/spec/fixtures/font_family/repair/basic_violations.svg +17 -0
- data/spec/fixtures/forbidden_content/inputs/basic_violations.svg +27 -0
- data/spec/fixtures/forbidden_content/repair/basic_violations.svg +19 -0
- data/spec/fixtures/id_reference/inputs/basic_violations.svg +17 -0
- data/spec/fixtures/id_reference/repair/basic_violations.svg +15 -0
- data/spec/fixtures/link_validation/inputs/basic_violations.svg +20 -0
- data/spec/fixtures/link_validation/repair/basic_violations.svg +16 -0
- data/spec/fixtures/lucid/inputs/simple.svg +67 -0
- data/spec/fixtures/lucid/repair/simple.svg +63 -0
- data/spec/fixtures/namespace/inputs/basic_violations.svg +20 -0
- data/spec/fixtures/namespace/repair/basic_violations.svg +17 -0
- data/spec/fixtures/namespace_attributes/inputs/basic_violations.svg +16 -0
- data/spec/fixtures/namespace_attributes/repair/basic_violations.svg +15 -0
- data/spec/fixtures/no_external_css/inputs/basic_violations.svg +20 -0
- data/spec/fixtures/no_external_css/repair/basic_violations.svg +18 -0
- data/spec/fixtures/style/inputs/basic_violations.svg +22 -0
- data/spec/fixtures/style/repair/basic_violations.svg +22 -0
- data/spec/fixtures/style_promotion/inputs/basic_test.svg +15 -0
- data/spec/fixtures/style_promotion/repair/basic_test.svg +15 -0
- data/spec/fixtures/svg_1_2_rfc/inputs/allowed_elements_violations.svg +18 -0
- data/spec/fixtures/svg_1_2_rfc/inputs/color_restrictions_violations.svg +23 -0
- data/spec/fixtures/svgcheck/check/DrawBerry-sample-2.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/DrawBerry-sample-2.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/DrawBerry-sample-2.svg.out +23 -0
- data/spec/fixtures/svgcheck/check/IETF-test.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/IETF-test.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/IETF-test.svg.out +20 -0
- data/spec/fixtures/svgcheck/check/circle.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/circle.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/circle.svg.out +2 -0
- data/spec/fixtures/svgcheck/check/colors.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/colors.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/colors.svg.out +13 -0
- data/spec/fixtures/svgcheck/check/dia-sample-svg.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/dia-sample-svg.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/dia-sample-svg.svg.out +76 -0
- data/spec/fixtures/svgcheck/check/example-dot.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/example-dot.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/example-dot.svg.out +11 -0
- data/spec/fixtures/svgcheck/check/full-tiny.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/full-tiny.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/full-tiny.svg.out +5835 -0
- data/spec/fixtures/svgcheck/check/good.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/good.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/good.svg.out +1 -0
- data/spec/fixtures/svgcheck/check/httpbis-proxy20-fig6.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/httpbis-proxy20-fig6.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/httpbis-proxy20-fig6.svg.out +5 -0
- data/spec/fixtures/svgcheck/check/malformed.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/malformed.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/malformed.svg.out +8 -0
- data/spec/fixtures/svgcheck/check/rfc-svg.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/rfc-svg.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/rfc-svg.svg.out +1 -0
- data/spec/fixtures/svgcheck/check/rfc.xml.code +1 -0
- data/spec/fixtures/svgcheck/check/rfc.xml.err +0 -0
- data/spec/fixtures/svgcheck/check/rfc.xml.out +2 -0
- data/spec/fixtures/svgcheck/check/rgb.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/rgb.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/rgb.svg.out +9 -0
- data/spec/fixtures/svgcheck/check/svg-wordle.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/svg-wordle.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/svg-wordle.svg.out +508 -0
- data/spec/fixtures/svgcheck/check/threshold.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/threshold.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/threshold.svg.out +20 -0
- data/spec/fixtures/svgcheck/check/utf8.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/utf8.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/utf8.svg.out +162 -0
- data/spec/fixtures/svgcheck/check/viewBox-both.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/viewBox-both.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/viewBox-both.svg.out +4 -0
- data/spec/fixtures/svgcheck/check/viewBox-height.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/viewBox-height.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/viewBox-height.svg.out +3 -0
- data/spec/fixtures/svgcheck/check/viewBox-none.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/viewBox-none.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/viewBox-none.svg.out +3 -0
- data/spec/fixtures/svgcheck/check/viewBox-width.svg.code +1 -0
- data/spec/fixtures/svgcheck/check/viewBox-width.svg.err +0 -0
- data/spec/fixtures/svgcheck/check/viewBox-width.svg.out +3 -0
- data/spec/fixtures/svgcheck/inputs/DrawBerry-sample-2.svg +28 -0
- data/spec/fixtures/svgcheck/inputs/IETF-test.svg +28 -0
- data/spec/fixtures/svgcheck/inputs/circle.svg +3 -0
- data/spec/fixtures/svgcheck/inputs/colors.svg +18 -0
- data/spec/fixtures/svgcheck/inputs/dia-sample-svg.svg +47 -0
- data/spec/fixtures/svgcheck/inputs/example-dot.svg +75 -0
- data/spec/fixtures/svgcheck/inputs/full-tiny.svg +16194 -0
- data/spec/fixtures/svgcheck/inputs/good.svg +19 -0
- data/spec/fixtures/svgcheck/inputs/httpbis-proxy20-fig6.svg +2 -0
- data/spec/fixtures/svgcheck/inputs/malformed.svg +11 -0
- data/spec/fixtures/svgcheck/inputs/rfc-svg.svg +1028 -0
- data/spec/fixtures/svgcheck/inputs/rfc.xml +37 -0
- data/spec/fixtures/svgcheck/inputs/rgb.svg +9 -0
- data/spec/fixtures/svgcheck/inputs/svg-wordle.svg +330 -0
- data/spec/fixtures/svgcheck/inputs/threshold.svg +26 -0
- data/spec/fixtures/svgcheck/inputs/utf8.svg +448 -0
- data/spec/fixtures/svgcheck/inputs/viewBox-both.svg +3 -0
- data/spec/fixtures/svgcheck/inputs/viewBox-height.svg +3 -0
- data/spec/fixtures/svgcheck/inputs/viewBox-none.svg +3 -0
- data/spec/fixtures/svgcheck/inputs/viewBox-width.svg +3 -0
- data/spec/fixtures/svgcheck/repair/DrawBerry-sample-2.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/DrawBerry-sample-2.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/DrawBerry-sample-2.svg.file +0 -0
- data/spec/fixtures/svgcheck/repair/DrawBerry-sample-2.svg.out +23 -0
- data/spec/fixtures/svgcheck/repair/IETF-test.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/IETF-test.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/IETF-test.svg.file +29 -0
- data/spec/fixtures/svgcheck/repair/IETF-test.svg.out +20 -0
- data/spec/fixtures/svgcheck/repair/circle.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/circle.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/circle.svg.file +4 -0
- data/spec/fixtures/svgcheck/repair/circle.svg.out +2 -0
- data/spec/fixtures/svgcheck/repair/colors.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/colors.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/colors.svg.file +19 -0
- data/spec/fixtures/svgcheck/repair/colors.svg.out +13 -0
- data/spec/fixtures/svgcheck/repair/dia-sample-svg.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/dia-sample-svg.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/dia-sample-svg.svg.file +47 -0
- data/spec/fixtures/svgcheck/repair/dia-sample-svg.svg.out +76 -0
- data/spec/fixtures/svgcheck/repair/example-dot.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/example-dot.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/example-dot.svg.file +69 -0
- data/spec/fixtures/svgcheck/repair/example-dot.svg.out +11 -0
- data/spec/fixtures/svgcheck/repair/good.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/good.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/good.svg.file +0 -0
- data/spec/fixtures/svgcheck/repair/good.svg.out +1 -0
- data/spec/fixtures/svgcheck/repair/httpbis-proxy20-fig6.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/httpbis-proxy20-fig6.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/httpbis-proxy20-fig6.svg.file +73 -0
- data/spec/fixtures/svgcheck/repair/httpbis-proxy20-fig6.svg.out +5 -0
- data/spec/fixtures/svgcheck/repair/malformed.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/malformed.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/malformed.svg.file +9 -0
- data/spec/fixtures/svgcheck/repair/malformed.svg.out +8 -0
- data/spec/fixtures/svgcheck/repair/rfc-svg.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/rfc-svg.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/rfc-svg.svg.file +0 -0
- data/spec/fixtures/svgcheck/repair/rfc-svg.svg.out +1 -0
- data/spec/fixtures/svgcheck/repair/rfc.xml.code +1 -0
- data/spec/fixtures/svgcheck/repair/rfc.xml.err +0 -0
- data/spec/fixtures/svgcheck/repair/rfc.xml.file +37 -0
- data/spec/fixtures/svgcheck/repair/rfc.xml.out +2 -0
- data/spec/fixtures/svgcheck/repair/rgb.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/rgb.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/rgb.svg.file +10 -0
- data/spec/fixtures/svgcheck/repair/rgb.svg.out +9 -0
- data/spec/fixtures/svgcheck/repair/svg-wordle.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/svg-wordle.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/svg-wordle.svg.file +112 -0
- data/spec/fixtures/svgcheck/repair/svg-wordle.svg.out +508 -0
- data/spec/fixtures/svgcheck/repair/threshold.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/threshold.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/threshold.svg.file +27 -0
- data/spec/fixtures/svgcheck/repair/threshold.svg.out +20 -0
- data/spec/fixtures/svgcheck/repair/utf8.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/utf8.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/utf8.svg.file +381 -0
- data/spec/fixtures/svgcheck/repair/utf8.svg.out +162 -0
- data/spec/fixtures/svgcheck/repair/viewBox-both.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/viewBox-both.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/viewBox-both.svg.file +4 -0
- data/spec/fixtures/svgcheck/repair/viewBox-both.svg.out +4 -0
- data/spec/fixtures/svgcheck/repair/viewBox-height.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/viewBox-height.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/viewBox-height.svg.file +4 -0
- data/spec/fixtures/svgcheck/repair/viewBox-height.svg.out +3 -0
- data/spec/fixtures/svgcheck/repair/viewBox-none.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/viewBox-none.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/viewBox-none.svg.file +4 -0
- data/spec/fixtures/svgcheck/repair/viewBox-none.svg.out +3 -0
- data/spec/fixtures/svgcheck/repair/viewBox-width.svg.code +1 -0
- data/spec/fixtures/svgcheck/repair/viewBox-width.svg.err +0 -0
- data/spec/fixtures/svgcheck/repair/viewBox-width.svg.file +4 -0
- data/spec/fixtures/svgcheck/repair/viewBox-width.svg.out +3 -0
- data/spec/fixtures/viewbox_required/inputs/missing_viewbox.svg +10 -0
- data/spec/fixtures/viewbox_required/repair/missing_viewbox.svg +10 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/svg_conform/batch_report_spec.rb +99 -0
- data/spec/svg_conform/commands/check_command_spec.rb +90 -0
- data/spec/svg_conform/commands/profiles_command_spec.rb +20 -0
- data/spec/svg_conform/commands/svgcheck_compare_command_spec.rb +13 -0
- data/spec/svg_conform/commands/svgcheck_compatibility_command_spec.rb +13 -0
- data/spec/svg_conform/commands/svgcheck_generate_command_spec.rb +14 -0
- data/spec/svg_conform/profiles/base_profile_spec.rb +42 -0
- data/spec/svg_conform/profiles/lucid_fix_profile_spec.rb +46 -0
- data/spec/svg_conform/profiles/lucid_profile_spec.rb +84 -0
- data/spec/svg_conform/profiles/metanorma_profile_spec.rb +62 -0
- data/spec/svg_conform/profiles/no_external_css_profile_spec.rb +66 -0
- data/spec/svg_conform/profiles/svg_1_2_rfc_profile_spec.rb +200 -0
- data/spec/svg_conform/profiles/svg_1_2_rfc_with_rdf_profile_spec.rb +81 -0
- data/spec/svg_conform/remediations/color_remediation_spec.rb +95 -0
- data/spec/svg_conform/remediations/font_embedding_remediation_spec.rb +20 -0
- data/spec/svg_conform/remediations/font_remediation_spec.rb +95 -0
- data/spec/svg_conform/remediations/image_embedding_remediation_spec.rb +20 -0
- data/spec/svg_conform/remediations/invalid_id_references_remediation_spec.rb +97 -0
- data/spec/svg_conform/remediations/namespace_attribute_remediation_spec.rb +97 -0
- data/spec/svg_conform/remediations/namespace_remediation_spec.rb +95 -0
- data/spec/svg_conform/remediations/no_external_css_remediation_spec.rb +97 -0
- data/spec/svg_conform/remediations/style_promotion_remediation_spec.rb +97 -0
- data/spec/svg_conform/remediations/viewbox_remediation_spec.rb +95 -0
- data/spec/svg_conform/requirements/allowed_elements_requirement_spec.rb +118 -0
- data/spec/svg_conform/requirements/color_restrictions_requirement_spec.rb +168 -0
- data/spec/svg_conform/requirements/font_family_requirement_spec.rb +188 -0
- data/spec/svg_conform/requirements/forbidden_content_requirement_spec.rb +195 -0
- data/spec/svg_conform/requirements/id_reference_requirement_spec.rb +78 -0
- data/spec/svg_conform/requirements/invalid_id_references_requirement_spec.rb +78 -0
- data/spec/svg_conform/requirements/link_validation_requirement_spec.rb +78 -0
- data/spec/svg_conform/requirements/namespace_attributes_requirement_spec.rb +86 -0
- data/spec/svg_conform/requirements/namespace_requirement_spec.rb +184 -0
- data/spec/svg_conform/requirements/no_external_css_requirement_spec.rb +78 -0
- data/spec/svg_conform/requirements/no_external_fonts_requirement_spec.rb +20 -0
- data/spec/svg_conform/requirements/no_external_images_requirement_spec.rb +20 -0
- data/spec/svg_conform/requirements/style_promotion_requirement_spec.rb +78 -0
- data/spec/svg_conform/requirements/style_requirement_spec.rb +76 -0
- data/spec/svg_conform/requirements/viewbox_required_requirement_spec.rb +165 -0
- data/spec/svg_conform_spec.rb +32 -0
- data/spec/svgcheck_compatibility_spec.rb +355 -0
- data/svg_conform.gemspec +35 -0
- metadata +436 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Remediations::NamespaceAttributeRemediation do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/namespace_attribute" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/namespace_attribute/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/namespace_attribute/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) do
|
|
20
|
+
"spec/fixtures/namespace_attribute/inputs/#{fixture_name}.svg"
|
|
21
|
+
end
|
|
22
|
+
let(:expected_output_file) do
|
|
23
|
+
"spec/fixtures/namespace_attribute/repair/#{fixture_name}.svg"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "applies remediation and produces expected output" do
|
|
27
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
28
|
+
skip "Expected output file not found" unless File.exist?(expected_output_file)
|
|
29
|
+
|
|
30
|
+
document = SvgConform::Document.from_file(input_file)
|
|
31
|
+
remediation = described_class.new(
|
|
32
|
+
id: "namespace_attribute_fix",
|
|
33
|
+
description: "Test namespace attribute remediation",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Apply the remediation
|
|
37
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
38
|
+
changes = remediation.apply(document, context)
|
|
39
|
+
|
|
40
|
+
# Verify changes were made
|
|
41
|
+
expect(changes).to be_an(Array)
|
|
42
|
+
puts "Applied #{changes.count} changes in #{fixture_name}" if changes.any?
|
|
43
|
+
|
|
44
|
+
# Get the remediated XML
|
|
45
|
+
actual_xml = document.to_xml
|
|
46
|
+
expected_xml = File.read(expected_output_file)
|
|
47
|
+
|
|
48
|
+
# Use canon matcher for XML equivalence
|
|
49
|
+
expect(actual_xml).to be_analogous_with(expected_xml)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "produces valid XML after remediation" do
|
|
53
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
54
|
+
|
|
55
|
+
document = SvgConform::Document.from_file(input_file)
|
|
56
|
+
remediation = described_class.new(
|
|
57
|
+
id: "namespace_attribute_fix",
|
|
58
|
+
description: "Test namespace attribute remediation",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Apply the remediation
|
|
62
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
63
|
+
remediation.apply(document, context)
|
|
64
|
+
|
|
65
|
+
# Get the remediated XML
|
|
66
|
+
actual_xml = document.to_xml
|
|
67
|
+
|
|
68
|
+
# Basic XML validity check
|
|
69
|
+
expect(actual_xml).to include("<svg")
|
|
70
|
+
expect(actual_xml).to include("</svg>")
|
|
71
|
+
expect do
|
|
72
|
+
SvgConform::Document.from_content(actual_xml)
|
|
73
|
+
end.not_to raise_error
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "configuration" do
|
|
79
|
+
it "can be instantiated with basic parameters" do
|
|
80
|
+
remediation = described_class.new(
|
|
81
|
+
id: "test_namespace_attribute_fix",
|
|
82
|
+
description: "Test remediation",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
expect(remediation).to be_a(described_class)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "responds to apply method" do
|
|
89
|
+
remediation = described_class.new(
|
|
90
|
+
id: "test_namespace_attribute_fix",
|
|
91
|
+
description: "Test remediation",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
expect(remediation).to respond_to(:apply)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Remediations::NamespaceRemediation do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/namespace" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/namespace/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/namespace/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) { "spec/fixtures/namespace/inputs/#{fixture_name}.svg" }
|
|
20
|
+
let(:expected_output_file) do
|
|
21
|
+
"spec/fixtures/namespace/repair/#{fixture_name}.svg"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "applies remediation and produces expected output" do
|
|
25
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
26
|
+
skip "Expected output file not found" unless File.exist?(expected_output_file)
|
|
27
|
+
|
|
28
|
+
document = SvgConform::Document.from_file(input_file)
|
|
29
|
+
remediation = described_class.new(
|
|
30
|
+
id: "namespace_fix",
|
|
31
|
+
description: "Test namespace remediation",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Apply the remediation
|
|
35
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
36
|
+
changes = remediation.apply(document, context)
|
|
37
|
+
|
|
38
|
+
# Verify changes were made
|
|
39
|
+
expect(changes).to be_an(Array)
|
|
40
|
+
puts "Applied #{changes.count} changes in #{fixture_name}" if changes.any?
|
|
41
|
+
|
|
42
|
+
# Get the remediated XML
|
|
43
|
+
actual_xml = document.to_xml
|
|
44
|
+
expected_xml = File.read(expected_output_file)
|
|
45
|
+
|
|
46
|
+
# Use canon matcher for XML equivalence
|
|
47
|
+
expect(actual_xml).to be_analogous_with(expected_xml)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "produces valid XML after remediation" do
|
|
51
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
52
|
+
|
|
53
|
+
document = SvgConform::Document.from_file(input_file)
|
|
54
|
+
remediation = described_class.new(
|
|
55
|
+
id: "namespace_fix",
|
|
56
|
+
description: "Test namespace remediation",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Apply the remediation
|
|
60
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
61
|
+
remediation.apply(document, context)
|
|
62
|
+
|
|
63
|
+
# Get the remediated XML
|
|
64
|
+
actual_xml = document.to_xml
|
|
65
|
+
|
|
66
|
+
# Basic XML validity check
|
|
67
|
+
expect(actual_xml).to include("<svg")
|
|
68
|
+
expect(actual_xml).to include("</svg>")
|
|
69
|
+
expect do
|
|
70
|
+
SvgConform::Document.from_content(actual_xml)
|
|
71
|
+
end.not_to raise_error
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "configuration" do
|
|
77
|
+
it "can be instantiated with basic parameters" do
|
|
78
|
+
remediation = described_class.new(
|
|
79
|
+
id: "test_namespace_fix",
|
|
80
|
+
description: "Test remediation",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
expect(remediation).to be_a(described_class)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "responds to apply method" do
|
|
87
|
+
remediation = described_class.new(
|
|
88
|
+
id: "test_namespace_fix",
|
|
89
|
+
description: "Test remediation",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
expect(remediation).to respond_to(:apply)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Remediations::NoExternalCssRemediation do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/no_external_css" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/no_external_css/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/no_external_css/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) do
|
|
20
|
+
"spec/fixtures/no_external_css/inputs/#{fixture_name}.svg"
|
|
21
|
+
end
|
|
22
|
+
let(:expected_output_file) do
|
|
23
|
+
"spec/fixtures/no_external_css/repair/#{fixture_name}.svg"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "applies remediation and produces expected output" do
|
|
27
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
28
|
+
skip "Expected output file not found" unless File.exist?(expected_output_file)
|
|
29
|
+
|
|
30
|
+
document = SvgConform::Document.from_file(input_file)
|
|
31
|
+
remediation = described_class.new(
|
|
32
|
+
id: "no_external_css_fix",
|
|
33
|
+
description: "Test no external css remediation",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Apply the remediation
|
|
37
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
38
|
+
changes = remediation.apply(document, context)
|
|
39
|
+
|
|
40
|
+
# Verify changes were made
|
|
41
|
+
expect(changes).to be_an(Array)
|
|
42
|
+
puts "Applied #{changes.count} changes in #{fixture_name}" if changes.any?
|
|
43
|
+
|
|
44
|
+
# Get the remediated XML
|
|
45
|
+
actual_xml = document.to_xml
|
|
46
|
+
expected_xml = File.read(expected_output_file)
|
|
47
|
+
|
|
48
|
+
# Use canon matcher for XML equivalence
|
|
49
|
+
expect(actual_xml).to be_analogous_with(expected_xml)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "produces valid XML after remediation" do
|
|
53
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
54
|
+
|
|
55
|
+
document = SvgConform::Document.from_file(input_file)
|
|
56
|
+
remediation = described_class.new(
|
|
57
|
+
id: "no_external_css_fix",
|
|
58
|
+
description: "Test no external css remediation",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Apply the remediation
|
|
62
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
63
|
+
remediation.apply(document, context)
|
|
64
|
+
|
|
65
|
+
# Get the remediated XML
|
|
66
|
+
actual_xml = document.to_xml
|
|
67
|
+
|
|
68
|
+
# Basic XML validity check
|
|
69
|
+
expect(actual_xml).to include("<svg")
|
|
70
|
+
expect(actual_xml).to include("</svg>")
|
|
71
|
+
expect do
|
|
72
|
+
SvgConform::Document.from_content(actual_xml)
|
|
73
|
+
end.not_to raise_error
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "configuration" do
|
|
79
|
+
it "can be instantiated with basic parameters" do
|
|
80
|
+
remediation = described_class.new(
|
|
81
|
+
id: "test_no_external_css_fix",
|
|
82
|
+
description: "Test remediation",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
expect(remediation).to be_a(described_class)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "responds to apply method" do
|
|
89
|
+
remediation = described_class.new(
|
|
90
|
+
id: "test_no_external_css_fix",
|
|
91
|
+
description: "Test remediation",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
expect(remediation).to respond_to(:apply)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Remediations::StylePromotionRemediation do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/style_promotion" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/style_promotion/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/style_promotion/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) do
|
|
20
|
+
"spec/fixtures/style_promotion/inputs/#{fixture_name}.svg"
|
|
21
|
+
end
|
|
22
|
+
let(:expected_output_file) do
|
|
23
|
+
"spec/fixtures/style_promotion/repair/#{fixture_name}.svg"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "applies remediation and produces expected output" do
|
|
27
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
28
|
+
skip "Expected output file not found" unless File.exist?(expected_output_file)
|
|
29
|
+
|
|
30
|
+
document = SvgConform::Document.from_file(input_file)
|
|
31
|
+
remediation = described_class.new(
|
|
32
|
+
id: "style_promotion_fix",
|
|
33
|
+
description: "Test style promotion remediation",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Apply the remediation
|
|
37
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
38
|
+
changes = remediation.apply(document, context)
|
|
39
|
+
|
|
40
|
+
# Verify changes were made
|
|
41
|
+
expect(changes).to be_an(Array)
|
|
42
|
+
puts "Applied #{changes.count} changes in #{fixture_name}" if changes.any?
|
|
43
|
+
|
|
44
|
+
# Get the remediated XML
|
|
45
|
+
actual_xml = document.to_xml
|
|
46
|
+
expected_xml = File.read(expected_output_file)
|
|
47
|
+
|
|
48
|
+
# Use canon matcher for XML equivalence
|
|
49
|
+
expect(actual_xml).to be_analogous_with(expected_xml)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "produces valid XML after remediation" do
|
|
53
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
54
|
+
|
|
55
|
+
document = SvgConform::Document.from_file(input_file)
|
|
56
|
+
remediation = described_class.new(
|
|
57
|
+
id: "style_promotion_fix",
|
|
58
|
+
description: "Test style promotion remediation",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Apply the remediation
|
|
62
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
63
|
+
remediation.apply(document, context)
|
|
64
|
+
|
|
65
|
+
# Get the remediated XML
|
|
66
|
+
actual_xml = document.to_xml
|
|
67
|
+
|
|
68
|
+
# Basic XML validity check
|
|
69
|
+
expect(actual_xml).to include("<svg")
|
|
70
|
+
expect(actual_xml).to include("</svg>")
|
|
71
|
+
expect do
|
|
72
|
+
SvgConform::Document.from_content(actual_xml)
|
|
73
|
+
end.not_to raise_error
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "configuration" do
|
|
79
|
+
it "can be instantiated with basic parameters" do
|
|
80
|
+
remediation = described_class.new(
|
|
81
|
+
id: "test_style_promotion_fix",
|
|
82
|
+
description: "Test remediation",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
expect(remediation).to be_a(described_class)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "responds to apply method" do
|
|
89
|
+
remediation = described_class.new(
|
|
90
|
+
id: "test_style_promotion_fix",
|
|
91
|
+
description: "Test remediation",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
expect(remediation).to respond_to(:apply)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Remediations::ViewboxRemediation do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/viewbox" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/viewbox/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/viewbox/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) { "spec/fixtures/viewbox/inputs/#{fixture_name}.svg" }
|
|
20
|
+
let(:expected_output_file) do
|
|
21
|
+
"spec/fixtures/viewbox/repair/#{fixture_name}.svg"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "applies remediation and produces expected output" do
|
|
25
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
26
|
+
skip "Expected output file not found" unless File.exist?(expected_output_file)
|
|
27
|
+
|
|
28
|
+
document = SvgConform::Document.from_file(input_file)
|
|
29
|
+
remediation = described_class.new(
|
|
30
|
+
id: "viewbox_fix",
|
|
31
|
+
description: "Test viewbox remediation",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Apply the remediation
|
|
35
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
36
|
+
changes = remediation.apply(document, context)
|
|
37
|
+
|
|
38
|
+
# Verify changes were made
|
|
39
|
+
expect(changes).to be_an(Array)
|
|
40
|
+
puts "Applied #{changes.count} changes in #{fixture_name}" if changes.any?
|
|
41
|
+
|
|
42
|
+
# Get the remediated XML
|
|
43
|
+
actual_xml = document.to_xml
|
|
44
|
+
expected_xml = File.read(expected_output_file)
|
|
45
|
+
|
|
46
|
+
# Use canon matcher for XML equivalence
|
|
47
|
+
expect(actual_xml).to be_analogous_with(expected_xml)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "produces valid XML after remediation" do
|
|
51
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
52
|
+
|
|
53
|
+
document = SvgConform::Document.from_file(input_file)
|
|
54
|
+
remediation = described_class.new(
|
|
55
|
+
id: "viewbox_fix",
|
|
56
|
+
description: "Test viewbox remediation",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Apply the remediation
|
|
60
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
61
|
+
remediation.apply(document, context)
|
|
62
|
+
|
|
63
|
+
# Get the remediated XML
|
|
64
|
+
actual_xml = document.to_xml
|
|
65
|
+
|
|
66
|
+
# Basic XML validity check
|
|
67
|
+
expect(actual_xml).to include("<svg")
|
|
68
|
+
expect(actual_xml).to include("</svg>")
|
|
69
|
+
expect do
|
|
70
|
+
SvgConform::Document.from_content(actual_xml)
|
|
71
|
+
end.not_to raise_error
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "configuration" do
|
|
77
|
+
it "can be instantiated with basic parameters" do
|
|
78
|
+
remediation = described_class.new(
|
|
79
|
+
id: "test_viewbox_fix",
|
|
80
|
+
description: "Test remediation",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
expect(remediation).to be_a(described_class)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "responds to apply method" do
|
|
87
|
+
remediation = described_class.new(
|
|
88
|
+
id: "test_viewbox_fix",
|
|
89
|
+
description: "Test remediation",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
expect(remediation).to respond_to(:apply)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "canon"
|
|
5
|
+
|
|
6
|
+
RSpec.describe SvgConform::Requirements::AllowedElementsRequirement do
|
|
7
|
+
let(:fixtures_dir) { "spec/fixtures/allowed_elements" }
|
|
8
|
+
|
|
9
|
+
# Get all fixture files that have both input and expected repair versions
|
|
10
|
+
fixture_files = Dir.glob("spec/fixtures/allowed_elements/inputs/*.svg").select do |input_file|
|
|
11
|
+
basename = File.basename(input_file)
|
|
12
|
+
File.exist?("spec/fixtures/allowed_elements/repair/#{basename}")
|
|
13
|
+
end.map do |f|
|
|
14
|
+
File.basename(f, ".svg")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
fixture_files.each do |fixture_name|
|
|
18
|
+
describe "fixture: #{fixture_name}" do
|
|
19
|
+
let(:input_file) do
|
|
20
|
+
"spec/fixtures/allowed_elements/inputs/#{fixture_name}.svg"
|
|
21
|
+
end
|
|
22
|
+
let(:expected_output_file) do
|
|
23
|
+
"spec/fixtures/allowed_elements/repair/#{fixture_name}.svg"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "validates input file and identifies violations" do
|
|
27
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
28
|
+
|
|
29
|
+
document = SvgConform::Document.from_file(input_file)
|
|
30
|
+
requirement = described_class.new(
|
|
31
|
+
id: "allowed_elements",
|
|
32
|
+
description: "Test allowed elements requirement",
|
|
33
|
+
disallowed_elements: %w[script audio video animate animateColor
|
|
34
|
+
clipPath marker],
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
38
|
+
requirement.validate_document(document, context)
|
|
39
|
+
|
|
40
|
+
expect(context.errors).not_to be_empty
|
|
41
|
+
puts "Found #{context.errors.count} violations in #{fixture_name}"
|
|
42
|
+
|
|
43
|
+
context.errors.each do |error|
|
|
44
|
+
expect(error.requirement_id).to eq("allowed_elements")
|
|
45
|
+
expect(error.message).to be_a(String)
|
|
46
|
+
expect(error.message).not_to be_empty
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "correctly identifies specific violations" do
|
|
51
|
+
skip "Input file not found" unless File.exist?(input_file)
|
|
52
|
+
|
|
53
|
+
document = SvgConform::Document.from_file(input_file)
|
|
54
|
+
requirement = described_class.new(
|
|
55
|
+
id: "allowed_elements",
|
|
56
|
+
description: "Test allowed elements requirement",
|
|
57
|
+
disallowed_elements: %w[script audio video animate animateColor
|
|
58
|
+
clipPath marker],
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
62
|
+
requirement.validate_document(document, context)
|
|
63
|
+
|
|
64
|
+
# Check that errors are specific to disallowed elements or attributes
|
|
65
|
+
context.errors.each do |error|
|
|
66
|
+
expect(error.message).to match(/Element .* is not allowed|Attribute .* is not allowed/)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "passes validation for documents with only allowed elements" do
|
|
71
|
+
# Create a simple valid document for testing
|
|
72
|
+
allowed_svg = <<~SVG
|
|
73
|
+
<?xml version="1.0"?>
|
|
74
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
75
|
+
<g>
|
|
76
|
+
<rect x="10" y="10" width="20" height="20" fill="black"/>
|
|
77
|
+
<circle cx="50" cy="50" r="10" fill="black"/>
|
|
78
|
+
<text x="10" y="80">Test</text>
|
|
79
|
+
</g>
|
|
80
|
+
</svg>
|
|
81
|
+
SVG
|
|
82
|
+
|
|
83
|
+
document = SvgConform::Document.from_content(allowed_svg)
|
|
84
|
+
requirement = described_class.new(
|
|
85
|
+
id: "allowed_elements",
|
|
86
|
+
description: "Test allowed elements requirement",
|
|
87
|
+
disallowed_elements: %w[], # No disallowed elements, so it should pass
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
context = SvgConform::ValidationContext.new(document, nil)
|
|
91
|
+
requirement.validate_document(document, context)
|
|
92
|
+
|
|
93
|
+
expect(context.errors).to be_empty
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe "configuration" do
|
|
99
|
+
it "accepts custom allowed elements list" do
|
|
100
|
+
requirement = described_class.new(
|
|
101
|
+
id: "test_allowed_elements",
|
|
102
|
+
description: "Test with custom elements",
|
|
103
|
+
disallowed_elements: %w[script iframe embed],
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
expect(requirement.disallowed_elements).to eq(%w[script iframe embed])
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "can be instantiated with basic parameters" do
|
|
110
|
+
requirement = described_class.new(
|
|
111
|
+
id: "test_allowed_elements",
|
|
112
|
+
description: "Test requirement",
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
expect(requirement).to be_a(described_class)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|