blob: 985cf5975a817892d663efdb47fb8e1528a96d33 [file] [log] [blame]
<!doctype html>
<meta charset="utf-8">
<title>Arithmetic operations on CSSNumericValue tests</title>
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-add">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-sub">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-mul">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-div">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-min">
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-cssnumericvalue-max">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../resources/testhelper.js"></script>
<script>
'use strict';
const gArithmeticOps = [
{ methodName: 'add', mathType: CSSMathSum },
{ methodName: 'sub', mathType: CSSMathSum },
{ methodName: 'mul', mathType: CSSMathProduct },
{ methodName: 'div', mathType: CSSMathProduct },
{ methodName: 'min', mathType: CSSMathMin },
{ methodName: 'max', mathType: CSSMathMax },
];
for (const {methodName, mathType} of gArithmeticOps) {
test(() => {
const result = CSS.number(1)[methodName]();
assert_style_value_equals(result, CSS.number(1));
}, 'Calling CSSUnitValue.' + methodName + ' with no arguments returns itself');
test(() => {
// Use an arithmetic expression that can't be simplified to a CSSUnitValue
const mathValue = new mathType(CSS.px(1), CSS.percent(1));
const result = mathValue[methodName]();
assert_style_value_equals(result, mathValue);
}, 'Calling CSSMathValue.' + methodName + ' with no arguments returns itself');
test(() => {
const result = CSS.px(1)[methodName](CSS.percent(1));
assert_equals(result.constructor.name, mathType.name);
}, 'Calling CSSNumericValue.' + methodName + ' with a single CSSNumericValue returns correct type');
test(() => {
const result = new mathType(CSS.px(1))[methodName](CSS.percent(1));
assert_equals(result.constructor.name, mathType.name);
}, 'Calling CSSMathValue.' + methodName + ' with a single CSSNumericValue returns correct type');
test(() => {
const result = CSS.percent(1)[methodName](CSS.px(1), CSS.px(2), CSS.px(3));
assert_equals(result.constructor.name, mathType.name);
}, 'Calling CSSNumericValue.' + methodName + ' with more than one number CSSNumericValues returns correct type');
test(() => {
const result = CSS.number(1)[methodName](1, CSS.number(2), 3);
assert_equals(result.constructor.name, CSSUnitValue.name);
}, 'Calling CSSNumericValue.' + methodName + ' can take numberish values');
test(() => {
const result = new mathType(CSS.number(1))[methodName](CSS.number(2), CSS.number(3));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.unit, 'number');
}, 'Calling ' + mathType.name + '.' + methodName + ' with number CSSUnitValues simplifies to a CSSUnitValue');
test(() => {
assert_throws(new TypeError(), () => new CSS.px(0)[methodName](CSS.px(1), CSS.s(2)));
}, 'Calling CSSNumericValue.' + methodName + ' with incompatible types throws TypeError');
}
test(() => {
const result = CSS.px(10).add(CSS.px(5), CSS.px(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 17);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.add with CSSUnitValues with same unit simplifies to a CSSUnitValue');
test(() => {
const result = CSS.px(10).sub(CSS.px(5), CSS.px(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 3);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.sub with CSSUnitValues with same unit simplifies to a CSSUnitValue');
test(() => {
const result = CSS.number(10).mul(CSS.number(5), CSS.number(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 100);
assert_equals(result.unit, 'number');
}, 'Calling CSSUnitValue.mul with all numbers simplifies to a CSSUnitValue');
test(() => {
const result = CSS.number(10).mul(CSS.px(5), CSS.number(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 100);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.mul with only one non-number simplifies to a CSSUnitValue');
test(() => {
const result = CSS.number(10).mul(CSS.px(5), CSS.px(2));
assert_equals(result.constructor.name, CSSMathProduct.name);
}, 'Calling CSSUnitValue.mul with more than one non-number does not simplify to a CSSUnitValue');
test(() => {
const result = CSS.number(10).div(CSS.number(5), CSS.number(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 1);
assert_equals(result.unit, 'number');
}, 'Calling CSSUnitValue.div with all numbers simplifies to a CSSUnitValue');
test(() => {
const result = CSS.px(10).div(CSS.number(5), CSS.number(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 1);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.div on a non-number value simplifies to a CSSUnitValue');
test(() => {
const result = CSS.number(10).div(CSS.px(5), CSS.number(2));
assert_equals(result.constructor.name, CSSMathProduct.name);
}, 'Calling CSSUnitValue.div with a non-number value in the arguments does not simplify to a CSSUnitValue');
test(() => {
const result = CSS.px(10).min(CSS.px(5), CSS.px(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 2);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.min with CSSUnitValues with same unit simplifies to a CSSUnitValue');
test(() => {
const result = CSS.px(10).max(CSS.px(5), CSS.px(2));
assert_equals(result.constructor.name, CSSUnitValue.name);
assert_equals(result.value, 10);
assert_equals(result.unit, 'px');
}, 'Calling CSSUnitValue.max with CSSUnitValues with same unit simplifies to a CSSUnitValue');
test(() => {
const result = CSS.number(1).sub(CSS.number(1), new CSSMathNegate(1), new CSSMathSum(1));
assert_style_value_equals(result,
new CSSMathSum(CSS.number(1), CSS.number(-1), CSS.number(1), new CSSMathNegate(new CSSMathSum(1))));
}, 'Calling CSSNumericValue.sub negates all argument values');
test(() => {
const result = CSS.number(2).div(CSS.number(2), CSS.px(2), new CSSMathInvert(2), new CSSMathSum(2));
assert_style_value_equals(result,
new CSSMathProduct(CSS.number(2), CSS.number(0.5), new CSSMathInvert(CSS.px(2)), CSS.number(2), new CSSMathInvert(new CSSMathSum(2))));
}, 'Calling CSSNumericValue.div inverts all argument values');
</script>