<!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>
