| <!doctype html> |
| <title>Calc rounds to integer</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <link rel=author title="Tab Atkins-Bittner" href="https://www.xanthir.com/contact/"> |
| <link rel="help" href="https://drafts.csswg.org/css-values/#calc-range"> |
| <link rel="help" href="https://drafts.csswg.org/css-easing/#funcdef-step-easing-function-steps"> |
| <link rel="help" href="https://drafts.csswg.org/css-multicol-2/#column-span"> |
| <link rel="help" href="https://drafts.csswg.org/css-lists/#propdef-counter-reset"> |
| <link rel="help" href="https://drafts.csswg.org/css-lists/#propdef-counter-increment"> |
| <link rel="help" href="https://drafts.csswg.org/css-lists/#propdef-counter-set"> |
| <link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-feature-settings-prop"> |
| <link rel="help" href="https://drafts.csswg.org/css-grid/#propdef-grid-template-rows"> |
| <link rel="help" href="https://drafts.csswg.org/css-grid/#propdef-grid-row"> |
| <link rel="help" href="https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars"> |
| <link rel="help" href="https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-lines"> |
| <link rel="help" href="https://drafts.csswg.org/css-inline-3/#propdef-initial-letter"> |
| <link rel="help" href="https://drafts.csswg.org/css-overflow-4/#propdef-max-lines"> |
| <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#propdef-order"> |
| <link rel="help" href="https://drafts.csswg.org/css-break-4/#propdef-orphans"> |
| <link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#propdef-text-combine-upright"> |
| <link rel="help" href="https://drafts.csswg.org/css-break-4/#propdef-widows"> |
| <link rel="help" href="https://drafts.csswg.org/css2/#propdef-z-index"> |
| <!-- |
| Verifying that, per V&U, a calc() that results in a non-integer value |
| gets rounded to the nearest integer |
| when used in a place that requires <integer> specifically. |
| This tests both straight-up decimal-point values, |
| and scinot, which is defined to parse as <number-token>. |
| --> |
| <body> |
| |
| <script> |
| |
| runTests("animation-timing-function", "steps(xxx)"); |
| runTests("column-span"); |
| runTests("counter-increment", "foo xxx"); |
| runTests("counter-reset", "foo xxx"); |
| runTests("counter-set", "foo xxx"); |
| runTests("font-feature-settings", '"fooo" xxx'); |
| runTests("grid-row"); |
| runTests("grid-template-rows", "repeat(xxx, 10px)"); |
| runTests("hyphenate-limit-chars"); |
| runTests("hyphenate-limit-lines"); |
| runTests("initial-letter", "1.1 xxx"); |
| runTests("max-lines"); |
| runTests("order"); |
| runTests("orphans"); |
| runTests("text-combine-upright", "digits xxx"); |
| runTests("transition-timing-function", "steps(xxx)"); |
| runTests("widows"); |
| runTests("z-index"); |
| |
| |
| function runTests(prop, valPattern="xxx") { |
| const el = document.body; |
| |
| // Don't spuriously fail bc the prop or val isn't supported. |
| if(!verifySupport(el, prop, valPattern)) return; |
| |
| const validValues = [ |
| "10", |
| "calc(10)", |
| "calc(10.1)", |
| "calc(1e1)", |
| "calc(1.1e1)", |
| ]; |
| const invalidValues = [ |
| "1e1", |
| "1.1e1", |
| "10.1", |
| ]; |
| for(let testVal of validValues) { |
| testInt(el, prop, testVal, valPattern); |
| } |
| for(let testVal of invalidValues) { |
| testIntInvalid(el, prop, testVal, valPattern); |
| } |
| } |
| |
| function verifySupport(el, prop, valPattern) { |
| let testVal = "10"; |
| if(valPattern !== undefined) { |
| testVal = valPattern.replace("xxx", testVal); |
| } |
| el.removeAttribute("style"); |
| const nullVal = getComputedStyle(el)[prop]; |
| el.style.setProperty(prop, testVal); |
| return getComputedStyle(el)[prop] != nullVal; |
| } |
| |
| function testInt(el, prop, testVal, valPattern) { |
| // to avoid needing to specify serialization, |
| // just test whether it parses at all |
| if(valPattern !== undefined) { |
| testVal = valPattern.replace("xxx", testVal); |
| } |
| test(()=>{ |
| el.removeAttribute("style"); |
| const nullVal = getComputedStyle(el)[prop]; |
| el.style.setProperty(prop, testVal); |
| assert_not_equals(getComputedStyle(el)[prop], nullVal); |
| }, `${prop} should accept "${testVal}"`) |
| } |
| |
| function testIntInvalid(el, prop, testVal, valPattern) { |
| // similarly, just verify it doesn't parse at all |
| if(valPattern !== undefined) { |
| testVal = valPattern.replace("xxx", testVal); |
| } |
| test(()=>{ |
| el.removeAttribute("style"); |
| const nullVal = getComputedStyle(el)[prop]; |
| el.style.setProperty(prop, testVal); |
| assert_equals(getComputedStyle(el)[prop], nullVal); |
| }, `${prop} should not accept "${testVal}"`) |
| } |
| |
| </script> |