<!DOCTYPE html>
<meta charset="UTF-8">
<title>font-variation-settings interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings">
<meta name="assert" content="font-variation-settings supports animation pairwise by 'like' properties">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/interpolation-testcommon.js"></script>
<style>
.parent {
font-variation-settings: "test" 30;
}
.target {
font-variation-settings: "test" 10;
}
</style>
<body></body>
<script>
// Because font-variation-settings is specced as a map rather than a list
// (https://github.com/w3c/csswg-drafts/issues/1959), browsers are allowed to
// reorder the output as they see fit.
function compareFontVariationSettings(actual, expected) {
// This is not perfect, but should serve as a reasonable comparison. We split
// the inputs into arrays and trim each characteristic, then sort the array
// and compare them.
const actual_arr = actual.split(',').map(x => x.trim()).sort();
const expected_arr = expected.split(',').map(x => x.trim()).sort();
assert_array_equals(actual_arr, expected_arr);
}
test_interpolation({
property: 'font-variation-settings',
from: neutralKeyframe,
to: '"test" 20',
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'test' 5"},
{at: 0, expect: "'test' 10"},
{at: 0.3, expect: "'test' 13"},
{at: 0.7, expect: "'test' 17"},
{at: 1, expect: "'test' 20"},
{at: 1.5, expect: "'test' 25"},
]);
test_no_interpolation({
property: 'font-variation-settings',
from: 'initial',
to: "'test' 50",
});
test_interpolation({
property: 'font-variation-settings',
from: 'inherit',
to: "'test' 20",
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'test' 35"},
{at: 0, expect: "'test' 30"},
{at: 0.3, expect: "'test' 27"},
{at: 0.7, expect: "'test' 23"},
{at: 1, expect: "'test' 20"},
{at: 1.5, expect: "'test' 15"},
]);
test_interpolation({
property: 'font-variation-settings',
from: 'unset',
to: "'test' 20",
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'test' 35"},
{at: 0, expect: "'test' 30"},
{at: 0.3, expect: "'test' 27"},
{at: 0.7, expect: "'test' 23"},
{at: 1, expect: "'test' 20"},
{at: 1.5, expect: "'test' 15"},
]);
test_no_interpolation({
property: 'font-variation-settings',
from: "'test' 20",
to: "normal",
});
test_interpolation({
property: 'font-variation-settings',
from: "'test' 20",
to: "'test' 30",
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'test' 15"},
{at: 0, expect: "'test' 20"},
{at: 0.3, expect: "'test' 23"},
{at: 0.7, expect: "'test' 27"},
{at: 1, expect: "'test' 30"},
{at: 1.5, expect: "'test' 35"},
]);
test_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'aaaa' -5, 'bbbb' 5, 'cccc' 15"},
{at: 0, expect: "'aaaa' 0, 'bbbb' 10, 'cccc' 20"},
{at: 0.3, expect: "'aaaa' 3, 'bbbb' 13, 'cccc' 23"},
{at: 0.7, expect: "'aaaa' 7, 'bbbb' 17, 'cccc' 27"},
{at: 1, expect: "'aaaa' 10, 'bbbb' 20, 'cccc' 30"},
{at: 1.5, expect: "'aaaa' 15, 'bbbb' 25, 'cccc' 35"},
]);
// font-variation-settings is a map, so any order works.
test_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
to: "'cccc' 10, 'bbbb' 20, 'aaaa' 30",
comparisonFunction: compareFontVariationSettings,
}, [
{at: -0.5, expect: "'aaaa' -15, 'bbbb' 5, 'cccc' 25"},
{at: 0, expect: "'aaaa' 0, 'bbbb' 10, 'cccc' 20"},
{at: 0.3, expect: "'aaaa' 9, 'bbbb' 13, 'cccc' 17"},
{at: 0.7, expect: "'aaaa' 21, 'bbbb' 17, 'cccc' 13"},
{at: 1, expect: "'aaaa' 30, 'bbbb' 20, 'cccc' 10"},
{at: 1.5, expect: "'aaaa' 45, 'bbbb' 25, 'cccc' 5"},
]);
test_no_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 0, 'bbbb' 10",
to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
});
test_no_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 10, 'bbbb' 20, 'cccc' 30",
to: "'aaaa' 0, 'bbbb' 10",
});
test_no_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20",
to: "'dddd' 10, 'eeee' 20, 'ffff' 30",
});
// crbug.com/910118: Test that ApplyStandardPropertyValue doesn't overflow.
test_interpolation({
property: 'font-variation-settings',
from: "'aaaa' 30, 'bbbb' 20",
to: "'aaaa' 20, 'bbbb' 30",
comparisonFunction: compareFontVariationSettings,
}, [
{at: 3.40282e+38, expect: "'aaaa' -3.40282e+38, 'bbbb' 3.40282e+38"},
]);
</script>