diff --git a/.gitignore b/.gitignore
index fa4dabd..9b05c9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,7 @@
.idea/
.gradle/
build/
-data/*.html
-data/alfio/*.html
+data/compiled/*.html
*.iml
*.ipr
*.iws
diff --git a/data/attributes.mjml b/data/base/attributes.mjml
similarity index 100%
rename from data/attributes.mjml
rename to data/base/attributes.mjml
diff --git a/data/base.mjml b/data/base/base.mjml
similarity index 100%
rename from data/base.mjml
rename to data/base/base.mjml
diff --git a/data/body-width-override.mjml b/data/base/body-width-override.mjml
similarity index 100%
rename from data/body-width-override.mjml
rename to data/base/body-width-override.mjml
diff --git a/data/empty-column-empty-node-social.mjml b/data/base/column-empty-node-social-empty.mjml
similarity index 100%
rename from data/empty-column-empty-node-social.mjml
rename to data/base/column-empty-node-social-empty.mjml
diff --git a/data/column-gutter.mjml b/data/base/column-gutter.mjml
similarity index 100%
rename from data/column-gutter.mjml
rename to data/base/column-gutter.mjml
diff --git a/data/entities-escaping.mjml b/data/base/entities-escaping.mjml
similarity index 100%
rename from data/entities-escaping.mjml
rename to data/base/entities-escaping.mjml
diff --git a/data/raw-special.mjml b/data/base/raw-special.mjml
similarity index 100%
rename from data/raw-special.mjml
rename to data/base/raw-special.mjml
diff --git a/data/bug-mj-column-inner-border.mjml b/data/bugs/mj-column-inner-border.mjml
similarity index 100%
rename from data/bug-mj-column-inner-border.mjml
rename to data/bugs/mj-column-inner-border.mjml
diff --git a/data/bug-mj-social.mjml b/data/bugs/mj-social.mjml
similarity index 87%
rename from data/bug-mj-social.mjml
rename to data/bugs/mj-social.mjml
index a3d0199..69cda42 100644
--- a/data/bug-mj-social.mjml
+++ b/data/bugs/mj-social.mjml
@@ -1,3 +1,4 @@
+
diff --git a/data/bugs/section-border-none.mjml b/data/bugs/section-border-none.mjml
new file mode 100644
index 0000000..e1b492a
--- /dev/null
+++ b/data/bugs/section-border-none.mjml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+ This section should have no border.
+
+
+
+
+
+
+ This section should have left and right borders.
+
+
+
+
+
\ No newline at end of file
diff --git a/data/bugs/social-inner-padding.mjml b/data/bugs/social-inner-padding.mjml
new file mode 100644
index 0000000..c973dd5
--- /dev/null
+++ b/data/bugs/social-inner-padding.mjml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/compiled/.keep b/data/compiled/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/data/amario.mjml b/data/complex/amario.mjml
similarity index 100%
rename from data/amario.mjml
rename to data/complex/amario.mjml
diff --git a/data/arturia.mjml b/data/complex/arturia.mjml
similarity index 100%
rename from data/arturia.mjml
rename to data/complex/arturia.mjml
diff --git a/data/basic.mjml b/data/complex/basic.mjml
similarity index 100%
rename from data/basic.mjml
rename to data/complex/basic.mjml
diff --git a/data/black-friday.mjml b/data/complex/black-friday.mjml
similarity index 100%
rename from data/black-friday.mjml
rename to data/complex/black-friday.mjml
diff --git a/data/card.mjml b/data/complex/card.mjml
similarity index 100%
rename from data/card.mjml
rename to data/complex/card.mjml
diff --git a/data/christmas.mjml b/data/complex/christmas.mjml
similarity index 100%
rename from data/christmas.mjml
rename to data/complex/christmas.mjml
diff --git a/data/newsletter.mjml b/data/complex/newsletter.mjml
similarity index 100%
rename from data/newsletter.mjml
rename to data/complex/newsletter.mjml
diff --git a/data/onepage.mjml b/data/complex/onepage.mjml
similarity index 100%
rename from data/onepage.mjml
rename to data/complex/onepage.mjml
diff --git a/data/proof.mjml b/data/complex/proof.mjml
similarity index 100%
rename from data/proof.mjml
rename to data/complex/proof.mjml
diff --git a/data/racoon.mjml b/data/complex/racoon.mjml
similarity index 100%
rename from data/racoon.mjml
rename to data/complex/racoon.mjml
diff --git a/data/reactivation-email.mjml b/data/complex/reactivation-email.mjml
similarity index 100%
rename from data/reactivation-email.mjml
rename to data/complex/reactivation-email.mjml
diff --git a/data/real-estate.mjml b/data/complex/real-estate.mjml
similarity index 100%
rename from data/real-estate.mjml
rename to data/complex/real-estate.mjml
diff --git a/data/receipt-email.mjml b/data/complex/receipt-email.mjml
similarity index 100%
rename from data/receipt-email.mjml
rename to data/complex/receipt-email.mjml
diff --git a/data/referral-email.mjml b/data/complex/referral-email.mjml
similarity index 100%
rename from data/referral-email.mjml
rename to data/complex/referral-email.mjml
diff --git a/data/sphero-droids.mjml b/data/complex/sphero-droids.mjml
similarity index 100%
rename from data/sphero-droids.mjml
rename to data/complex/sphero-droids.mjml
diff --git a/data/sphero-mini.mjml b/data/complex/sphero-mini.mjml
similarity index 100%
rename from data/sphero-mini.mjml
rename to data/complex/sphero-mini.mjml
diff --git a/data/ticketshop.mjml b/data/complex/ticketshop.mjml
similarity index 100%
rename from data/ticketshop.mjml
rename to data/complex/ticketshop.mjml
diff --git a/data/welcome-email.mjml b/data/complex/welcome-email.mjml
similarity index 100%
rename from data/welcome-email.mjml
rename to data/complex/welcome-email.mjml
diff --git a/data/wordly.mjml b/data/complex/wordly.mjml
similarity index 100%
rename from data/wordly.mjml
rename to data/complex/wordly.mjml
diff --git a/data/accordion-attrs-all.mjml b/data/components/accordion-attrs-all.mjml
similarity index 100%
rename from data/accordion-attrs-all.mjml
rename to data/components/accordion-attrs-all.mjml
diff --git a/data/accordion-attrs.mjml b/data/components/accordion-attrs.mjml
similarity index 100%
rename from data/accordion-attrs.mjml
rename to data/components/accordion-attrs.mjml
diff --git a/data/accordion-permutation.mjml b/data/components/accordion-permutation.mjml
similarity index 100%
rename from data/accordion-permutation.mjml
rename to data/components/accordion-permutation.mjml
diff --git a/data/accordion.mjml b/data/components/accordion.mjml
similarity index 100%
rename from data/accordion.mjml
rename to data/components/accordion.mjml
diff --git a/data/breakpoint.mjml b/data/components/breakpoint.mjml
similarity index 100%
rename from data/breakpoint.mjml
rename to data/components/breakpoint.mjml
diff --git a/data/button.mjml b/data/components/button.mjml
similarity index 100%
rename from data/button.mjml
rename to data/components/button.mjml
diff --git a/data/carousel.mjml b/data/components/carousel.mjml
similarity index 100%
rename from data/carousel.mjml
rename to data/components/carousel.mjml
diff --git a/data/mj-divider-mj-all.mjml b/data/components/divider-all.mjml
similarity index 100%
rename from data/mj-divider-mj-all.mjml
rename to data/components/divider-all.mjml
diff --git a/data/divider.mjml b/data/components/divider.mjml
similarity index 100%
rename from data/divider.mjml
rename to data/components/divider.mjml
diff --git a/data/font.mjml b/data/components/font.mjml
similarity index 100%
rename from data/font.mjml
rename to data/components/font.mjml
diff --git a/data/group.mjml b/data/components/group.mjml
similarity index 100%
rename from data/group.mjml
rename to data/components/group.mjml
diff --git a/data/hero-divider.mjml b/data/components/hero-divider.mjml
similarity index 100%
rename from data/hero-divider.mjml
rename to data/components/hero-divider.mjml
diff --git a/data/hero-fluid-height-button.mjml b/data/components/hero-fluid-height-button.mjml
similarity index 100%
rename from data/hero-fluid-height-button.mjml
rename to data/components/hero-fluid-height-button.mjml
diff --git a/data/image.mjml b/data/components/image.mjml
similarity index 100%
rename from data/image.mjml
rename to data/components/image.mjml
diff --git a/data/import-2-import.mjml b/data/components/include-2-include.mjml
similarity index 100%
rename from data/import-2-import.mjml
rename to data/components/include-2-include.mjml
diff --git a/data/include-about.mjml b/data/components/include-about.mjml
similarity index 100%
rename from data/include-about.mjml
rename to data/components/include-about.mjml
diff --git a/data/import-head.mjml b/data/components/include-head.mjml
similarity index 100%
rename from data/import-head.mjml
rename to data/components/include-head.mjml
diff --git a/data/include-index.mjml b/data/components/include-index.mjml
similarity index 85%
rename from data/include-index.mjml
rename to data/components/include-index.mjml
index 6625c3e..382ec08 100644
--- a/data/include-index.mjml
+++ b/data/components/include-index.mjml
@@ -1,3 +1,4 @@
+
diff --git a/data/include-type-css.mjml b/data/components/include-type-css.mjml
similarity index 100%
rename from data/include-type-css.mjml
rename to data/components/include-type-css.mjml
diff --git a/data/include-type-html.mjml b/data/components/include-type-html.mjml
similarity index 100%
rename from data/include-type-html.mjml
rename to data/components/include-type-html.mjml
diff --git a/data/include/footer.mjml b/data/components/include/footer.mjml
similarity index 100%
rename from data/include/footer.mjml
rename to data/components/include/footer.mjml
diff --git a/data/include/header.mjml b/data/components/include/header.mjml
similarity index 100%
rename from data/include/header.mjml
rename to data/components/include/header.mjml
diff --git a/data/include/import-head-styles.mjml b/data/components/include/import-head-styles.mjml
similarity index 100%
rename from data/include/import-head-styles.mjml
rename to data/components/include/import-head-styles.mjml
diff --git a/data/include/styling.mjml b/data/components/include/styling.mjml
similarity index 100%
rename from data/include/styling.mjml
rename to data/components/include/styling.mjml
diff --git a/data/include/test-partial-two.mjml b/data/components/include/test-partial-two.mjml
similarity index 100%
rename from data/include/test-partial-two.mjml
rename to data/components/include/test-partial-two.mjml
diff --git a/data/include/test-partial.mjml b/data/components/include/test-partial.mjml
similarity index 100%
rename from data/include/test-partial.mjml
rename to data/components/include/test-partial.mjml
diff --git a/data/include/type.css b/data/components/include/type.css
similarity index 100%
rename from data/include/type.css
rename to data/components/include/type.css
diff --git a/data/include/type.html b/data/components/include/type.html
similarity index 100%
rename from data/include/type.html
rename to data/components/include/type.html
diff --git a/data/include/type2.css b/data/components/include/type2.css
similarity index 100%
rename from data/include/type2.css
rename to data/components/include/type2.css
diff --git a/data/navbar.mjml b/data/components/navbar.mjml
similarity index 100%
rename from data/navbar.mjml
rename to data/components/navbar.mjml
diff --git a/data/preview.mjml b/data/components/preview.mjml
similarity index 100%
rename from data/preview.mjml
rename to data/components/preview.mjml
diff --git a/data/section-background-image.mjml b/data/components/section-background-image.mjml
similarity index 100%
rename from data/section-background-image.mjml
rename to data/components/section-background-image.mjml
diff --git a/data/section-column-column-divider.mjml b/data/components/section-column-column-divider.mjml
similarity index 100%
rename from data/section-column-column-divider.mjml
rename to data/components/section-column-column-divider.mjml
diff --git a/data/section-column-column-section-column-column-divider.mjml b/data/components/section-column-column-section-column-column-divider.mjml
similarity index 100%
rename from data/section-column-column-section-column-column-divider.mjml
rename to data/components/section-column-column-section-column-column-divider.mjml
diff --git a/data/mj-section-column-precision-2.mjml b/data/components/section-column-precision-2.mjml
similarity index 100%
rename from data/mj-section-column-precision-2.mjml
rename to data/components/section-column-precision-2.mjml
diff --git a/data/section-column-precision.mjml b/data/components/section-column-precision.mjml
similarity index 100%
rename from data/section-column-precision.mjml
rename to data/components/section-column-precision.mjml
diff --git a/data/empty-section.mjml b/data/components/section-empty.mjml
similarity index 100%
rename from data/empty-section.mjml
rename to data/components/section-empty.mjml
diff --git a/data/section-group-column-text.mjml b/data/components/section-group-column-text.mjml
similarity index 100%
rename from data/section-group-column-text.mjml
rename to data/components/section-group-column-text.mjml
diff --git a/data/mj-section-with-background-url.mjml b/data/components/section-with-background-url.mjml
similarity index 100%
rename from data/mj-section-with-background-url.mjml
rename to data/components/section-with-background-url.mjml
diff --git a/data/mj-section-with-background.mjml b/data/components/section-with-background.mjml
similarity index 100%
rename from data/mj-section-with-background.mjml
rename to data/components/section-with-background.mjml
diff --git a/data/mj-section-with-css-class.mjml b/data/components/section-with-css-class.mjml
similarity index 100%
rename from data/mj-section-with-css-class.mjml
rename to data/components/section-with-css-class.mjml
diff --git a/data/mj-section-with-full-width.mjml b/data/components/section-with-full-width.mjml
similarity index 100%
rename from data/mj-section-with-full-width.mjml
rename to data/components/section-with-full-width.mjml
diff --git a/data/mj-section-with-mj-class.mjml b/data/components/section-with-mj-class.mjml
similarity index 100%
rename from data/mj-section-with-mj-class.mjml
rename to data/components/section-with-mj-class.mjml
diff --git a/data/test-section-with-size.mjml b/data/components/section-with-size.mjml
similarity index 100%
rename from data/test-section-with-size.mjml
rename to data/components/section-with-size.mjml
diff --git a/data/section.mjml b/data/components/section.mjml
similarity index 100%
rename from data/section.mjml
rename to data/components/section.mjml
diff --git a/data/social-vertical.mjml b/data/components/social-vertical.mjml
similarity index 99%
rename from data/social-vertical.mjml
rename to data/components/social-vertical.mjml
index 9360302..2744792 100644
--- a/data/social-vertical.mjml
+++ b/data/components/social-vertical.mjml
@@ -19,4 +19,4 @@
-
\ No newline at end of file
+
diff --git a/data/social.mjml b/data/components/social.mjml
similarity index 100%
rename from data/social.mjml
rename to data/components/social.mjml
diff --git a/data/spacer.mjml b/data/components/spacer.mjml
similarity index 100%
rename from data/spacer.mjml
rename to data/components/spacer.mjml
diff --git a/data/style.mjml b/data/components/style.mjml
similarity index 100%
rename from data/style.mjml
rename to data/components/style.mjml
diff --git a/data/table.mjml b/data/components/table.mjml
similarity index 100%
rename from data/table.mjml
rename to data/components/table.mjml
diff --git a/data/color-text.mjml b/data/components/text-color.mjml
similarity index 100%
rename from data/color-text.mjml
rename to data/components/text-color.mjml
diff --git a/data/text.mjml b/data/components/text.mjml
similarity index 100%
rename from data/text.mjml
rename to data/components/text.mjml
diff --git a/data/title.mjml b/data/components/title.mjml
similarity index 100%
rename from data/title.mjml
rename to data/components/title.mjml
diff --git a/data/wrapper.mjml b/data/components/wrapper.mjml
similarity index 100%
rename from data/wrapper.mjml
rename to data/components/wrapper.mjml
diff --git a/data/circular/circular-1.mjml b/data/invalid/circular/circular-1.mjml
similarity index 100%
rename from data/circular/circular-1.mjml
rename to data/invalid/circular/circular-1.mjml
diff --git a/data/circular/circular-2.mjml b/data/invalid/circular/circular-2.mjml
similarity index 100%
rename from data/circular/circular-2.mjml
rename to data/invalid/circular/circular-2.mjml
diff --git a/data/circular/include-circular.mjml b/data/invalid/circular/include-circular.mjml
similarity index 83%
rename from data/circular/include-circular.mjml
rename to data/invalid/circular/include-circular.mjml
index 059629a..a340d2a 100644
--- a/data/circular/include-circular.mjml
+++ b/data/invalid/circular/include-circular.mjml
@@ -9,6 +9,6 @@
-
+
\ No newline at end of file
diff --git a/data/invalid/readme.txt b/data/invalid/readme.txt
new file mode 100644
index 0000000..3ec039f
--- /dev/null
+++ b/data/invalid/readme.txt
@@ -0,0 +1,2 @@
+Put any mjml files that are not expected to compile in this directory so that they can be skipped by the nodejs
+mjml compiler
\ No newline at end of file
diff --git a/data/accordion-font-family.mjml b/data/upstream/accordion-font-family.mjml
similarity index 100%
rename from data/accordion-font-family.mjml
rename to data/upstream/accordion-font-family.mjml
diff --git a/data/accordion-padding.mjml b/data/upstream/accordion-padding.mjml
similarity index 100%
rename from data/accordion-padding.mjml
rename to data/upstream/accordion-padding.mjml
diff --git a/data/accordionTitle-fontWeight.mjml b/data/upstream/accordionTitle-fontWeight.mjml
similarity index 100%
rename from data/accordionTitle-fontWeight.mjml
rename to data/upstream/accordionTitle-fontWeight.mjml
diff --git a/data/carousel-hoverSupported.mjml b/data/upstream/carousel-hoverSupported.mjml
similarity index 100%
rename from data/carousel-hoverSupported.mjml
rename to data/upstream/carousel-hoverSupported.mjml
diff --git a/data/column-border-radius.mjml b/data/upstream/column-border-radius.mjml
similarity index 100%
rename from data/column-border-radius.mjml
rename to data/upstream/column-border-radius.mjml
diff --git a/data/html-comments.mjml b/data/upstream/html-comments.mjml
similarity index 100%
rename from data/html-comments.mjml
rename to data/upstream/html-comments.mjml
diff --git a/data/navbar-ico-padding.mjml b/data/upstream/navbar-ico-padding.mjml
similarity index 100%
rename from data/navbar-ico-padding.mjml
rename to data/upstream/navbar-ico-padding.mjml
diff --git a/data/social-align.mjml b/data/upstream/social-align.mjml
similarity index 100%
rename from data/social-align.mjml
rename to data/upstream/social-align.mjml
diff --git a/data/social-icon-height.mjml b/data/upstream/social-icon-height.mjml
similarity index 100%
rename from data/social-icon-height.mjml
rename to data/upstream/social-icon-height.mjml
diff --git a/data/table-cellspacing.mjml b/data/upstream/table-cellspacing.mjml
similarity index 100%
rename from data/table-cellspacing.mjml
rename to data/upstream/table-cellspacing.mjml
diff --git a/data/tableWidth.mjml b/data/upstream/tableWidth.mjml
similarity index 100%
rename from data/tableWidth.mjml
rename to data/upstream/tableWidth.mjml
diff --git a/data/wrapper-border-radius.mjml b/data/upstream/wrapper-border-radius.mjml
similarity index 100%
rename from data/wrapper-border-radius.mjml
rename to data/upstream/wrapper-border-radius.mjml
diff --git a/data/wrapper-gap.mjml b/data/upstream/wrapper-gap.mjml
similarity index 100%
rename from data/wrapper-gap.mjml
rename to data/upstream/wrapper-gap.mjml
diff --git a/package.json b/package.json
index 51530df..8c706b0 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,6 @@
"mjml": "4.18.0"
},
"scripts": {
- "build": "mjml data/*.mjml --config.beautify false -o data/"
+ "build":"mjml data/**/*.mjml --config.beautify false -o data/compiled/"
}
}
diff --git a/pom.xml b/pom.xml
index c37b769..16e93eb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,12 @@
6.0.1
test
+
+ org.junit.jupiter
+ junit-jupiter-params
+ 6.0.1
+ test
+
org.graalvm.polyglot
polyglot
diff --git a/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java b/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java
index 9f5979f..267a96c 100644
--- a/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java
+++ b/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java
@@ -303,20 +303,17 @@ CssBoxModel getBoxModel() {
double getShorthandBorderValue(String attributeName, String direction) {
var mjAttributeDirection = getAttribute(attributeName + "-" + direction);
var mjAttribute = getAttribute(attributeName);
-
if (!Utils.isNullOrWhiteSpace(mjAttributeDirection)) {
- return CssUnitParser.parse(mjAttributeDirection).value();
- }
-
- if (Utils.isNullOrWhiteSpace(mjAttribute)) {
+ return borderParser(mjAttributeDirection);
+ } else if (!Utils.isNullOrWhiteSpace(mjAttribute)) {
+ return borderParser(mjAttribute);
+ } else {
return 0;
}
+ }
- // MERGED borderParser:
- // https://github.com/mjmlio/mjml/blob/d4c6ea0744e05c928044108c3117c16a9c4110fe/packages/mjml-core/src/helpers/shorthandParser.js#L3
- // return CssUnitParser.Parse(mjAttribute).Value;
-
- var match = PATTERN_SHORTHAND_BORDER_VALUE.matcher(mjAttribute);
+ double borderParser(String borderValue) {
+ var match = PATTERN_SHORTHAND_BORDER_VALUE.matcher(borderValue);
if (!match.find()) return 0;
diff --git a/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java b/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java
index 5134a08..55524ee 100644
--- a/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java
+++ b/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java
@@ -6,7 +6,6 @@
import ch.digitalfondue.mjml4j.AttributeValueType.AttributeType;
import java.util.LinkedHashMap;
-import java.util.Set;
import org.w3c.dom.Element;
class MjmlComponentSocial extends BaseComponent.BodyComponent {
@@ -58,9 +57,11 @@ StringBuilder renderMjml(HtmlRenderer renderer) {
: renderVertical(renderer);
}
- private static final Set INHERITING_ATTRIBUTES =
- Set.of(
- "border-radius",
+ @Override
+ String getInheritingAttribute(String attributeName) {
+ return switch (attributeName) {
+ case "padding" -> getAttribute("inner-padding");
+ case "border-radius",
"color",
"font-family",
"font-size",
@@ -69,17 +70,12 @@ StringBuilder renderMjml(HtmlRenderer renderer) {
"icon-height",
"icon-padding",
"icon-size",
- "padding",
"line-height",
"text-padding",
- "text-decoration");
-
- @Override
- String getInheritingAttribute(String attributeName) {
- if ("padding".equals(attributeName)) {
- attributeName = "inner-padding";
- }
- return INHERITING_ATTRIBUTES.contains(attributeName) ? getAttribute(attributeName) : null;
+ "text-decoration" ->
+ getAttribute(attributeName);
+ default -> null;
+ };
}
private StringBuilder renderVertical(HtmlRenderer renderer) {
diff --git a/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java b/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java
deleted file mode 100644
index e6da02d..0000000
--- a/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package ch.digitalfondue.mjml4j;
-
-import static ch.digitalfondue.mjml4j.Helpers.testTemplate;
-
-import org.junit.jupiter.api.Test;
-
-/** Unit test for base cases. */
-class BaseComponentTests {
-
- @Test
- void testBase() {
- testTemplate("base");
- }
-
- @Test
- void testImage() {
- testTemplate("image");
- }
-
- @Test
- void testDivider() {
- testTemplate("divider");
- }
-
- @Test
- void testButton() {
- testTemplate("button");
- }
-
- @Test
- void testHeroDivider() {
- testTemplate("hero-divider");
- }
-
- @Test
- void testSpacer() {
- testTemplate("spacer");
- }
-
- @Test
- void testPreview() {
- testTemplate("preview");
- }
-
- @Test
- void testHeroFluidHeightButton() {
- testTemplate("hero-fluid-height-button");
- }
-
- @Test
- void testSection() {
- testTemplate("section");
- }
-
- @Test
- void testSectionColumnColumnDivider() {
- testTemplate("section-column-column-divider");
- }
-
- @Test
- void testSectionColumnColumnSectionColumnColumnDivider() {
- testTemplate("section-column-column-section-column-column-divider");
- }
-
- @Test
- void testSectionGroupColumnText() {
- testTemplate("section-group-column-text");
- }
-
- @Test
- void testNavbar() {
- testTemplate("navbar");
- }
-
- @Test
- void testNavbarIcoPadding() {
- testTemplate("navbar-ico-padding");
- }
-
- @Test
- void testSocial() {
- testTemplate("social");
- }
-
- @Test
- void testSocialAlign() {
- testTemplate("social-align");
- }
-
- @Test
- void testSocialIconHeight() {
- testTemplate("social-icon-height");
- }
-
- @Test
- void testText() {
- testTemplate("text");
- }
-
- @Test
- void testFont() {
- testTemplate("font");
- }
-
- @Test
- void testBreakpoint() {
- testTemplate("breakpoint");
- }
-
- @Test
- void testTitle() {
- testTemplate("title");
- }
-
- @Test
- void testStyle() {
- testTemplate("style");
- }
-
- @Test
- void testGroup() {
- testTemplate("group");
- }
-
- @Test
- void testWrapper() {
- testTemplate("wrapper");
- }
-
- @Test
- void testWrapperBorderRadius() {
- testTemplate("wrapper-border-radius");
- }
-
- @Test
- void testWrapperGap() {
- testTemplate("wrapper-gap");
- }
-
- @Test
- void testAttributes() {
- testTemplate("attributes");
- }
-
- @Test
- void testSectionWithSize() {
- testTemplate("test-section-with-size");
- }
-
- @Test
- void testTable() {
- testTemplate("table");
- }
-
- @Test
- void testTableCellSpacing() {
- testTemplate("table-cellspacing");
- }
-
- @Test
- void testTableWidth() {
- testTemplate("tableWidth");
- }
-
- @Test
- void testAccordion() {
- testTemplate("accordion");
- }
-
- @Test
- void testAccordionAttrs() {
- testTemplate("accordion-attrs");
- }
-
- @Test
- void testAccordionAttrsAll() {
- testTemplate("accordion-attrs-all");
- }
-
- @Test
- void testAccordionFontFamily() {
- testTemplate("accordion-font-family");
- }
-
- @Test
- void testAccordionPadding() {
- testTemplate("accordion-padding");
- }
-
- @Test
- void testAccordionTitleFontWeight() {
- testTemplate("accordionTitle-fontWeight");
- }
-
- @Test
- void colorText() {
- testTemplate("color-text");
- }
-
- @Test
- void testAccordionPermutation() {
- testTemplate("accordion-permutation");
- }
-
- @Test
- void testCarousel() {
- testTemplate("carousel");
- }
-
- @Test
- void testCarouselHoverSupported() {
- testTemplate("carousel-hoverSupported");
- }
-
- @Test
- void testRawSpecial() {
- testTemplate("raw-special");
- }
-
- @Test
- void testColumnGutter() {
- testTemplate("column-gutter");
- }
-
- @Test
- void testColumnBorderRadius() {
- testTemplate("column-border-radius");
- }
-
- @Test
- void testSocialVertical() {
- testTemplate("social-vertical");
- }
-
- @Test
- void testSectionBackgroundImage() {
- testTemplate("section-background-image");
- }
-
- @Test
- void testEntitiesEscaping() {
- testTemplate("entities-escaping");
- }
-
- @Test
- void testSectionMisc() {
- testTemplate("mj-section-with-background");
- testTemplate("mj-section-with-background-url");
- testTemplate("mj-section-with-css-class");
- testTemplate("mj-section-with-full-width");
- testTemplate("mj-section-with-mj-class");
- }
-
- @Test
- void testSectionColumnPrecision() {
- testTemplate("section-column-precision");
- }
-
- @Test
- void testSectionColumnPrecision2() {
- testTemplate("mj-section-column-precision-2");
- }
-
- @Test
- void testEmptyColumnEmptyNodeSocial() {
- testTemplate("empty-column-empty-node-social");
- }
-
- @Test
- void testBodyWidthOverride() {
- testTemplate("body-width-override");
- }
-
- @Test
- void testEmptySection() {
- testTemplate("empty-section");
- }
-
- @Test
- void testImportHead() {
- testTemplate("import-head");
- }
-
- @Test
- void test2Import() {
- testTemplate("import-2-import");
- }
-}
diff --git a/src/test/java/ch/digitalfondue/mjml4j/BugTests.java b/src/test/java/ch/digitalfondue/mjml4j/BugTests.java
deleted file mode 100644
index 0b0dd3b..0000000
--- a/src/test/java/ch/digitalfondue/mjml4j/BugTests.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package ch.digitalfondue.mjml4j;
-
-import static ch.digitalfondue.mjml4j.Helpers.testTemplate;
-
-import org.junit.jupiter.api.Test;
-
-class BugTests {
-
- // see https://github.com/digitalfondue/mjml4j/issues/7
- @Test
- void checkMjSocialNpe() {
- testTemplate("bug-mj-social");
- }
-
- @Test
- void checkMjColumnInnerBorderNfe() {
- testTemplate("bug-mj-column-inner-border");
- }
-}
diff --git a/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java b/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java
deleted file mode 100644
index 1fc8439..0000000
--- a/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package ch.digitalfondue.mjml4j;
-
-import static ch.digitalfondue.mjml4j.Helpers.testTemplate;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-class ComplexTemplateTests {
-
- @Test
- void testWordly() {
- testTemplate("wordly");
- }
-
- @Test
- void testTicketshop() {
- testTemplate("ticketshop");
- }
-
- @Test
- void testWelcomeEmail() {
- testTemplate("welcome-email");
- }
-
- @Test
- void testSpheroMini() {
- testTemplate("sphero-mini");
- }
-
- @Test
- void testAmario() {
- testTemplate("amario");
- }
-
- @Test
- void testArturia() {
- testTemplate("arturia");
- }
-
- @Test
- void testBasic() {
- testTemplate("basic");
- }
-
- @Test
- void testBlackFriday() {
- testTemplate("black-friday");
- }
-
- @Test
- void testCard() {
- testTemplate("card");
- }
-
- @Test
- void testChristmas() {
- testTemplate("christmas");
- }
-
- @Test
- void testNewsletter() {
- testTemplate("newsletter");
- }
-
- @Test
- void testOnepage() {
- testTemplate("onepage");
- }
-
- @Test
- void testProof() {
- testTemplate("proof");
- }
-
- @Test
- void testRacoon() {
- testTemplate("racoon");
- }
-
- @Test
- void testReactivationEmail() {
- testTemplate("reactivation-email");
- }
-
- @Test
- void testRealEstate() {
- testTemplate("real-estate");
- }
-
- @Test
- void testReceiptEmail() {
- testTemplate("receipt-email");
- }
-
- @Test
- void testReferralEmail() {
- testTemplate("referral-email");
- }
-
- @Test
- void testSpheroDroids() {
- testTemplate("sphero-droids");
- }
-
- @Test
- void testIncludeHtml() {
- testTemplate("include-type-html");
- }
-
- @Test
- void testIncludeCss() {
- testTemplate("include-type-css");
- }
-
- // imported from issue https://github.com/SebastianStehle/mjml-net/issues/177
- @Test
- void testIncludeIndex() {
- testTemplate("include-index");
- }
-
- @Test
- void testIncludeAbout() {
- testTemplate("include-about");
- }
-
- @Test
- void testDividerAttributeAll() {
- testTemplate("mj-divider-mj-all");
- }
-
- @Test
- void testCircularInclude() {
- var t =
- Assertions.assertThrows(
- IllegalStateException.class, () -> testTemplate("circular/include-circular"));
- Assertions.assertTrue(t.getMessage().startsWith("Circular inclusion detected on file"));
- }
-}
diff --git a/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java b/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java
new file mode 100644
index 0000000..99c36d4
--- /dev/null
+++ b/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java
@@ -0,0 +1,50 @@
+package ch.digitalfondue.mjml4j;
+
+import static ch.digitalfondue.mjml4j.testutils.Helpers.testTemplate;
+
+import ch.digitalfondue.mjml4j.testutils.MjmlDirectory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+
+/** Unit test for base cases. */
+class RenderingTests {
+ @ParameterizedTest
+ @MjmlDirectory("base")
+ void testBaseTemplates(String name) {
+ testTemplate("base", name);
+ }
+
+ @ParameterizedTest
+ @MjmlDirectory("components")
+ void testComponentTemplates(String name) {
+ testTemplate("components", name);
+ }
+
+ @ParameterizedTest
+ @MjmlDirectory("complex")
+ void testComplexTemplates(String name) {
+ testTemplate("complex", name);
+ }
+
+ @ParameterizedTest
+ @MjmlDirectory("upstream")
+ void testUpstreamTemplates(String name) {
+ testTemplate("upstream", name);
+ }
+
+ @ParameterizedTest
+ @MjmlDirectory("bugs")
+ void testBugsTemplates(String name) {
+ testTemplate("bugs", name);
+ }
+
+ @Test
+ void testCircularInclude() {
+ var t =
+ Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> testTemplate("invalid/circular", "include-circular"));
+ Assertions.assertTrue(t.getMessage().startsWith("Circular inclusion detected on file"));
+ }
+}
diff --git a/src/test/java/ch/digitalfondue/mjml4j/Helpers.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java
similarity index 81%
rename from src/test/java/ch/digitalfondue/mjml4j/Helpers.java
rename to src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java
index d903dcd..64a58cf 100644
--- a/src/test/java/ch/digitalfondue/mjml4j/Helpers.java
+++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java
@@ -1,5 +1,6 @@
-package ch.digitalfondue.mjml4j;
+package ch.digitalfondue.mjml4j.testutils;
+import ch.digitalfondue.mjml4j.Mjml4j;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -13,9 +14,8 @@
import org.graalvm.polyglot.io.IOAccess;
import org.junit.jupiter.api.Assertions;
-class Helpers {
-
- static String beautifyHtml(String html) throws IOException {
+public class Helpers {
+ private static String beautifyHtml(String html) throws IOException {
System.getProperties().setProperty("polyglot.engine.WarnInterpreterOnly", "false");
var options = new HashMap();
@@ -51,14 +51,14 @@ static String beautifyHtml(String html) throws IOException {
}
}
- static String simplifyBrTags(String input) {
+ private static String simplifyBrTags(String input) {
return input.replaceAll("
", "
");
}
// align all values defined in ids -> mjml use random strings, for coherence reason we find all
// id="...." and replace them with
// a sequence. this allows to align id=".." and for=".."
- static String alignIdFor(String input) {
+ private static String alignIdFor(String input) {
var findIds =
Pattern.compile(
"id=\"[^\"]*([0-9a-f]{16})[^\"]*\"", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
@@ -76,18 +76,15 @@ static String alignIdFor(String input) {
return res;
}
- static void testTemplate(String name) {
- testTemplate(name, new Mjml4j.FileSystemResolver(Path.of("data")));
- }
-
- static void testTemplate(String name, Mjml4j.IncludeResolver resolver) {
+ public static void testTemplate(String directory, String name) {
+ var resolver = new Mjml4j.FileSystemResolver(Path.of("data", directory));
try {
var template =
- Files.readString(new File("data/" + name + ".mjml").toPath(), StandardCharsets.UTF_8);
+ Files.readString(Path.of("data", directory, name + ".mjml"), StandardCharsets.UTF_8);
var conf = new Mjml4j.Configuration("und", Mjml4j.TextDirection.AUTO, resolver);
var res = Mjml4j.render(template, conf);
var comparison =
- Files.readString(new File("data/" + name + ".html").toPath(), StandardCharsets.UTF_8);
+ Files.readString(Path.of("data", "compiled", name + ".html"), StandardCharsets.UTF_8);
Assertions.assertEquals(
simplifyBrTags(alignIdFor(beautifyHtml(comparison))), alignIdFor(beautifyHtml(res)));
} catch (IOException e) {
diff --git a/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java
new file mode 100644
index 0000000..26eabc4
--- /dev/null
+++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java
@@ -0,0 +1,15 @@
+package ch.digitalfondue.mjml4j.testutils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@ArgumentsSource(MjmlListArgumentsProvider.class)
+public @interface MjmlDirectory {
+ /** The directory to scan for MJML test files. */
+ String value();
+}
diff --git a/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java
new file mode 100644
index 0000000..f0eaed1
--- /dev/null
+++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java
@@ -0,0 +1,24 @@
+package ch.digitalfondue.mjml4j.testutils;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Stream;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.AnnotationBasedArgumentsProvider;
+import org.junit.jupiter.params.provider.Arguments;
+
+public class MjmlListArgumentsProvider extends AnnotationBasedArgumentsProvider {
+ @Override
+ protected Stream extends Arguments> provideArguments(
+ ExtensionContext context, MjmlDirectory annotation) {
+ try {
+ return Files.list(Path.of("data", annotation.value()))
+ .filter(p -> p.toString().endsWith(".mjml"))
+ .map(p -> p.getFileName().toString().replace(".mjml", ""))
+ .map(Arguments::of);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/test/java/module-info.java b/src/test/java/module-info.java
new file mode 100644
index 0000000..46f507d
--- /dev/null
+++ b/src/test/java/module-info.java
@@ -0,0 +1,17 @@
+module ch.digitalfondue.mjml4j {
+ requires ch.digitalfondue.jfiveparse;
+ requires java.xml;
+
+ exports ch.digitalfondue.mjml4j;
+
+ // Test extensions
+ requires org.junit.jupiter.api;
+ requires org.junit.jupiter.params;
+ requires org.graalvm.polyglot;
+
+ opens ch.digitalfondue.mjml4j to
+ org.junit.platform.commons;
+
+ exports ch.digitalfondue.mjml4j.testutils to
+ org.junit.platform.commons;
+}