diff --git a/src/AngleSharp.Css.Tests/Declarations/CssFlexProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssFlexProperty.cs index 624113e..16268a4 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssFlexProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssFlexProperty.cs @@ -95,6 +95,36 @@ public void CssFlexShorthandGrowAndShrinkLegal() Assert.AreEqual("1 2", property.Value); } + [Test] + public void CssFlexShorthandWithZeroPercentBasisLegal() + { + var snippet = "flex: 1 1 0%"; + var property = ParseDeclaration(snippet); + Assert.AreEqual("flex", property.Name); + Assert.IsTrue(property.HasValue); + Assert.AreEqual("1 1 0%", property.Value); + } + + [Test] + public void CssFlexBasisZeroPercentLegal() + { + var snippet = "flex-basis: 0%"; + var property = ParseDeclaration(snippet); + Assert.AreEqual("flex-basis", property.Name); + Assert.IsTrue(property.HasValue); + Assert.AreEqual("0%", property.Value); + } + + [Test] + public void CssFlexBasisZeroPxSerializesWithoutUnit() + { + var snippet = "flex-basis: 0px"; + var property = ParseDeclaration(snippet); + Assert.AreEqual("flex-basis", property.Name); + Assert.IsTrue(property.HasValue); + Assert.AreEqual("0", property.Value); + } + [Test] public void CssFlexWrapLegal() { diff --git a/src/AngleSharp.Css.Tests/Declarations/CssObjectSizing.cs b/src/AngleSharp.Css.Tests/Declarations/CssObjectSizing.cs index 300312d..d46c868 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssObjectSizing.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssObjectSizing.cs @@ -131,7 +131,7 @@ public void CssObjectPositionLeft30Legal() Assert.IsTrue(property.IsAnimatable); Assert.IsFalse(property.IsInherited); Assert.IsTrue(property.HasValue); - Assert.AreEqual("0 30px", property.Value); + Assert.AreEqual("0% 30px", property.Value); } } } diff --git a/src/AngleSharp.Css.Tests/Declarations/CssTransformProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssTransformProperty.cs index c86216d..2d22a62 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssTransformProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssTransformProperty.cs @@ -230,7 +230,7 @@ public void CssTransformOriginYOffsetXKeywordLegal() Assert.IsFalse(property.IsImportant); Assert.IsFalse(property.IsInherited); Assert.IsTrue(property.HasValue); - Assert.AreEqual("0 2px", property.Value); + Assert.AreEqual("0% 2px", property.Value); } [Test] @@ -242,7 +242,7 @@ public void CssTransformOriginXKeywordYOffsetLegal() Assert.IsFalse(property.IsImportant); Assert.IsFalse(property.IsInherited); Assert.IsTrue(property.HasValue); - Assert.AreEqual("0 2px", property.Value); + Assert.AreEqual("0% 2px", property.Value); } [Test] @@ -290,7 +290,7 @@ public void CssTransformOriginYXKeywordZLegal() Assert.IsFalse(property.IsImportant); Assert.IsFalse(property.IsInherited); Assert.IsTrue(property.HasValue); - Assert.AreEqual("0 2px 10px", property.Value); + Assert.AreEqual("0% 2px 10px", property.Value); } [Test] @@ -302,7 +302,7 @@ public void CssTransformOriginXKeywordYZLegal() Assert.IsFalse(property.IsImportant); Assert.IsFalse(property.IsInherited); Assert.IsTrue(property.HasValue); - Assert.AreEqual("0 5px -3px", property.Value); + Assert.AreEqual("0% 5px -3px", property.Value); } [Test] diff --git a/src/AngleSharp.Css/Values/Primitives/CssLengthValue.cs b/src/AngleSharp.Css/Values/Primitives/CssLengthValue.cs index cffee8d..f63e9ce 100644 --- a/src/AngleSharp.Css/Values/Primitives/CssLengthValue.cs +++ b/src/AngleSharp.Css/Values/Primitives/CssLengthValue.cs @@ -107,7 +107,9 @@ public String CssText } else { - var unit = _value == 0.0 ? String.Empty : UnitString; + // Per CSS spec, 0 is valid without a unit for lengths, + // but 0% is a percentage (relative to context) and must keep its unit. + var unit = _value == 0.0 && _unit != Unit.Percent ? String.Empty : UnitString; var val = _value.CssStringify(); return String.Concat(val, unit); }