Skip to content

Commit 87caf6d

Browse files
authored
Addition of tests for asin,acos,atan,and atan2 Co-authored-by: Nikos Mouchtaris <[email protected]>
1 parent d625d30 commit 87caf6d

File tree

4 files changed

+192
-2
lines changed

4 files changed

+192
-2
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<!DOCTYPE html>
2+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
3+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#numbers">
4+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
5+
<link rel="author" title="Apple Inc">
6+
<script src="/resources/testharness.js"></script>
7+
<script src="/resources/testharnessreport.js"></script>
8+
<script src="../support/numeric-testcommon.js"></script>
9+
<div id="target"></div>
10+
<script>
11+
function test_angle_equals(value, expected) {
12+
test_math_used(`rotate(${value})`, `rotate(${expected})`,
13+
{prop:'transform', base:'none',
14+
msg: `${value} should be used-value-equivalent to ${expected}`});
15+
}
16+
// Simple tests
17+
test_angle_equals('acos(1)', '0deg');
18+
test_angle_equals('atan(0)', '0deg');
19+
test_angle_equals('asin(0)', '0deg');
20+
test_angle_equals('atan2(0,0)', '0deg');
21+
22+
// Test pi
23+
test_math_used('calc(asin(sin(pi/2)))', '90deg', {type:'angle', approx:0.1});
24+
test_math_used('calc(acos(cos(pi - 3.14159265358979323846)))', '0deg', {type:'angle', approx:0.1});
25+
26+
// Test e
27+
test_math_used('calc(atan(e - 2.7182818284590452354) )', '0deg', {type:'angle', approx:0.1});
28+
29+
// General calculations
30+
test_math_used('calc(asin(sin(30deg + 1.0471967rad ) ))', '90deg', {type:'angle', approx:0.1});
31+
test_math_used('calc(acos(cos(30deg - 0.523599rad ) ))', '0deg'), {type:'angle', approx:0.1};
32+
test_math_used('calc(asin(sin(3.14159 / 2 + 1 - 1) ))', '90deg', {type:'angle', approx:0.1});
33+
test_math_used('calc(asin(sin(100grad) ))', '90deg', {type:'angle', approx:0.1});
34+
test_math_used('calc(acos(cos(0 / 2 + 1 - 1) ))', '0deg', {type:'angle', approx:0.1});
35+
test_math_used('calc(atan(tan(30deg + 0.261799rad ) ))', '45deg', {type:'angle', approx:0.1});
36+
test_math_used('calc(atan(tan(0.7853975rad ) ))', '45deg', {type:'angle', approx:0.1});
37+
test_math_used('calc(atan(tan(3.14159 / 4 + 1 - 1) ))', '45deg', {type:'angle', approx:0.1});
38+
test_math_used('calc(asin(sin(0.25turn)) )', '90deg', {type:'angle', approx:0.1});
39+
test_math_used('calc(atan2(0,1))', '0deg', {type:'angle', approx:0.1});
40+
test_math_used('calc(atan2(0,-1))', '-180deg', {type:'angle', approx:0.1});
41+
test_math_used('calc(atan2(1,-1))', '135deg', {type:'angle', approx:0.1});
42+
test_math_used('calc(atan2(-1,1))', '-45deg', {type:'angle', approx:0.1});
43+
44+
// Test nesting
45+
test_math_used('calc(cos(sin(acos(cos(pi)))))', '1', {type:'number', approx:0.1});
46+
test_math_used('calc(sin(atan(tan(pi/2))))', '1', {type:'number', approx:0.1});
47+
48+
// Test types for atan2
49+
test_math_used('atan2(1px, -1px)', '135deg', {type:'angle', approx:0.1});
50+
test_math_used('atan2(1cm, -1cm)', '135deg', {type:'angle', approx:0.1});
51+
test_math_used('atan2(1mm, -1mm)', '135deg', {type:'angle', approx:0.1});
52+
test_math_used('atan2(1Q, -1Q)', '135deg', {type:'angle', approx:0.1});
53+
test_math_used('atan2(1in, -1in)', '135deg', {type:'angle', approx:0.1});
54+
test_math_used('atan2(1pc, -1pc)', '135deg', {type:'angle', approx:0.1});
55+
test_math_used('atan2(1pt, -1pt)', '135deg', {type:'angle', approx:0.1});
56+
test_math_used('atan2(1em, -1em)', '135deg', {type:'angle', approx:0.1});
57+
test_math_used('atan2(1ex, -1ex)', '135deg', {type:'angle', approx:0.1});
58+
test_math_used('atan2(1ch, -1ch)', '135deg', {type:'angle', approx:0.1});
59+
test_math_used('atan2(1rem, -1rem)', '135deg', {type:'angle', approx:0.1});
60+
test_math_used('atan2(1vh, -1vh)', '135deg', {type:'angle', approx:0.1});
61+
test_math_used('atan2(1vw, -1vw)', '135deg', {type:'angle', approx:0.1});
62+
test_math_used('atan2(1deg, -1deg)', '135deg', {type:'angle', approx:0.1});
63+
test_math_used('atan2(1grad, -1grad)', '135deg', {type:'angle', approx:0.1});
64+
test_math_used('atan2(1turn, -1turn)', '135deg', {type:'angle', approx:0.1});
65+
test_math_used('atan2(1rad, -1rad)', '135deg', {type:'angle', approx:0.1});
66+
test_math_used('atan2(1s, -1s)', '135deg', {type:'angle', approx:0.1});
67+
test_math_used('atan2(1ms, -1ms)', '135deg', {type:'angle', approx:0.1});
68+
69+
</script>
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<!DOCTYPE html>
2+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
3+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#angles">
4+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking">
5+
<link rel="author" title="Apple Inc">
6+
<script src="/resources/testharness.js"></script>
7+
<script src="/resources/testharnessreport.js"></script>
8+
<script src="../support/parsing-testcommon.js"></script>
9+
<script>
10+
function test_invalid_angle(value) {
11+
test_invalid_value('transform', `rotate(${value})`);
12+
}
13+
14+
// Syntax checking
15+
test_invalid_angle('asin()');
16+
test_invalid_angle('asin( )');
17+
test_invalid_angle('asin(,)');
18+
test_invalid_angle('asin(1dag)');
19+
test_invalid_angle('asin(1deg, )');
20+
test_invalid_angle('asin(, 1deg)');
21+
test_invalid_angle('asin(1deg + )');
22+
test_invalid_angle('asin(1deg - )');
23+
test_invalid_angle('asin(1deg * )');
24+
test_invalid_angle('asin(1deg / )');
25+
test_invalid_angle('asin(1deg 2deg)');
26+
test_invalid_angle('asin(1deg, , 2deg)');
27+
test_invalid_angle('acos()');
28+
test_invalid_angle('acos( )');
29+
test_invalid_angle('acos(,)');
30+
test_invalid_angle('acos(1dag)');
31+
test_invalid_angle('acos(1deg, )');
32+
test_invalid_angle('acos(, 1deg)');
33+
test_invalid_angle('acos(1deg + )');
34+
test_invalid_angle('acos(1deg - )');
35+
test_invalid_angle('acos(1deg * )');
36+
test_invalid_angle('acos(1deg / )');
37+
test_invalid_angle('acos(1deg 2deg)');
38+
test_invalid_angle('acos(1deg, , 2deg)');
39+
test_invalid_angle('atan()');
40+
test_invalid_angle('atan( )');
41+
test_invalid_angle('atan(,)');
42+
test_invalid_angle('atan(1dag)');
43+
test_invalid_angle('atan(1deg, )');
44+
test_invalid_angle('atan(, 1deg)');
45+
test_invalid_angle('atan(1deg + )');
46+
test_invalid_angle('atan(1deg - )');
47+
test_invalid_angle('atan(1deg * )');
48+
test_invalid_angle('atan(1deg / )');
49+
test_invalid_angle('atan(1deg 2deg)');
50+
test_invalid_angle('atan(1deg, , 2deg)');
51+
test_invalid_angle('asin(90px)');
52+
test_invalid_angle('asin(30deg + 1.0471967rad, 0)');
53+
test_invalid_angle('acos( 0 ,)');
54+
test_invalid_angle('acos( () 30deg - 0.523599rad )');
55+
test_invalid_angle('atan(45deg )');
56+
test_invalid_angle('atan(30deg, + 0.261799rad)');
57+
test_invalid_angle('atan2()');
58+
test_invalid_angle('atan2( )');
59+
test_invalid_angle('atan2(,)');
60+
test_invalid_angle('atan2(1dag)');
61+
test_invalid_angle('atan2(1deg, )');
62+
test_invalid_angle('atan2(, 1deg)');
63+
test_invalid_angle('atan2(1deg + )');
64+
test_invalid_angle('atan2(1deg - )');
65+
test_invalid_angle('atan2(1deg * )');
66+
test_invalid_angle('atan2(1deg / )');
67+
test_invalid_angle('atan2(1deg 2deg)');
68+
test_invalid_angle('atan2(1deg, , 2deg)');
69+
test_invalid_angle('atan2(90px)');
70+
test_invalid_angle('atan2(30deg + 1.0471967rad, 0)');
71+
test_invalid_angle('atan2( 0 ,)');
72+
test_invalid_angle('atan2( () 30deg - 0.523599rad )');
73+
test_invalid_angle('atan2(45deg )');
74+
test_invalid_angle('atan2(30deg, + 0.261799rad)');
75+
</script>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<!DOCTYPE html>
2+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func">
3+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#angles">
4+
<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-serialize">
5+
<link rel="author" title="Apple Inc">
6+
<script src="/resources/testharness.js"></script>
7+
<script src="/resources/testharnessreport.js"></script>
8+
<script src="../support/serialize-testcommon.js"></script>
9+
<div id=target></div>
10+
<script>
11+
function test_serialization(t,s,c,u, {prop="transform"}={}) {
12+
t = `rotate(${t})`;
13+
test_specified_serialization(prop, t, `rotate(${s})`);
14+
test_computed_serialization(prop, t, c);
15+
if(u) test_used_serialization(prop, t, u);
16+
}
17+
18+
// Browsers aren't perfectly interoperable about how a 90deg rotation is serialized,
19+
// but that's not the focus of this test,
20+
// so just capture *whatever* the browser does and expect that.
21+
const rotateMatrix = (()=>{
22+
const el = document.querySelector("#target");
23+
el.style.transform = "rotate(90deg)";
24+
const ret = getComputedStyle(el).transform;
25+
el.removeAttribute('style');
26+
return ret;
27+
})();
28+
29+
test_serialization(
30+
'acos(0)',
31+
'calc(90deg)',
32+
rotateMatrix);
33+
test_serialization(
34+
'asin(1)',
35+
'calc(90deg)',
36+
rotateMatrix);
37+
38+
test_serialization(
39+
'calc(acos(pi - pi))',
40+
'calc(90deg)',
41+
rotateMatrix);
42+
test_serialization(
43+
'calc(asin(pi - pi + 1))',
44+
'calc(90deg)',
45+
rotateMatrix);
46+
</script>

css/support/numeric-testcommon.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,12 @@ function _test_math({stage, testEl, testString, expectedString, type, approx, ms
184184
testEl.style[prop] = e;
185185
const expectedValue = getComputedStyle(testEl)[prop];
186186
assert_not_equals(expectedValue, '', `${expectedString} isn't valid in '${prop}'; got the default value instead.`)
187-
if(approx && type == "number"){
187+
if(approx && (type == "number" || type == "angle")){
188188
let parsedUsed = usedValue.split('(')[1].split(')')[0].split(',').map(parseFloat);
189189
let parsedExpected = expectedValue.split('(')[1].split(')')[0].split(',').map(parseFloat);
190190
assert_array_approx_equals(parsedUsed, parsedExpected, approx, `${testString} and ${expectedString} ${approx} serialize to the same thing in ${stage} values.`);
191191
} else {
192192
assert_equals(usedValue, expectedValue, `${testString} and ${expectedString} serialize to the same thing in ${stage} values.`);
193193
}
194194
}, msg || `${testString} should be ${stage}-value-equivalent to ${expectedString}`);
195-
}
195+
}

0 commit comments

Comments
 (0)