signed-zero.html (5275B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>CSS Values and Units Test: signed zero</title> 4 <link rel="help" href="https://drafts.csswg.org/css-values-4/#math"> 5 <link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-ieee"> 6 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> 7 <meta name="assert" content="Checks that a bunch of calculations produce the correct zero (+0 or -0)"> 8 9 <script src="/resources/testharness.js"></script> 10 <script src="/resources/testharnessreport.js"></script> 11 <script src="../support/numeric-testcommon.js"></script> 12 <div id="target"></div> 13 <script> 14 function test_zero(expression, { is_negative }) { 15 test_math_used(`sign(${expression})`, '0', { type: 'integer' }); 16 // to test zero sign, make it to negative infinity and clamp it between -1 and 1 17 test_math_used( 18 `clamp(-1, 1 / sign(${expression}), 1)`, 19 (is_negative)? '-1' : '1', 20 { type: 'integer' }, 21 ); 22 } 23 24 test_zero('calc(-0)', { is_negative: true }); 25 test_zero('calc( 0)', { is_negative: false }); 26 27 test_zero('calc(-0 * -1)', { is_negative: false }); 28 test_zero('calc(-0 * 1)', { is_negative: true }); 29 test_zero('calc( 0 * -1)', { is_negative: true }); 30 test_zero('calc( 0 * 1)', { is_negative: false }); 31 32 test_zero('calc(-1 / -infinity)', { is_negative: false }); 33 test_zero('calc(-1 / infinity)', { is_negative: true }); 34 test_zero('calc( 1 / -infinity)', { is_negative: true }); 35 test_zero('calc( 1 / infinity)', { is_negative: false }); 36 37 test_zero('calc(-0 + -0)', { is_negative: true }); 38 test_zero('calc(-0 + 0)', { is_negative: false }); 39 test_zero('calc( 0 + -0)', { is_negative: false }); 40 test_zero('calc( 0 + 0)', { is_negative: false }); 41 42 test_zero('calc(-0 - -0)', { is_negative: false }); 43 test_zero('calc(-0 - 0)', { is_negative: true }); 44 test_zero('calc( 0 - -0)', { is_negative: false }); 45 test_zero('calc( 0 - 0)', { is_negative: false }); 46 47 test_zero('min(-0, 0)', { is_negative: true }); 48 test_zero('min( 0, -0)', { is_negative: true }); 49 50 test_zero('max(-0, 0)', { is_negative: false }); 51 test_zero('max( 0, -0)', { is_negative: false }); 52 53 test_zero('clamp(-0, -1, -0)', { is_negative: true }); 54 test_zero('clamp(-0, -0, -0)', { is_negative: true }); 55 test_zero('clamp(-0, 0, -0)', { is_negative: true }); 56 test_zero('clamp(-0, 1, -0)', { is_negative: true }); 57 58 test_zero('clamp(-0, -1, 0)', { is_negative: true }); 59 test_zero('clamp(-0, -0, 0)', { is_negative: true }); 60 test_zero('clamp(-0, 0, 0)', { is_negative: false }); 61 test_zero('clamp(-0, 1, 0)', { is_negative: false }); 62 63 test_zero('clamp(0, -1, -0)', { is_negative: false }); 64 test_zero('clamp(0, -0, -0)', { is_negative: false }); 65 test_zero('clamp(0, 0, -0)', { is_negative: false }); 66 test_zero('clamp(0, 1, -0)', { is_negative: false }); 67 68 test_zero('round(nearest, -1, infinity)', { is_negative: true }); 69 test_zero('round(nearest, -0, infinity)', { is_negative: true }); 70 test_zero('round(nearest, 0, infinity)', { is_negative: false }); 71 test_zero('round(nearest, 1, infinity)', { is_negative: false }); 72 73 test_zero('round(up, -1, infinity)', { is_negative: true }); 74 test_zero('round(up, -0, infinity)', { is_negative: true }); 75 test_zero('round(up, 0, infinity)', { is_negative: false }); 76 77 test_zero('round(down, -0, infinity)', { is_negative: true }); 78 test_zero('round(down, 0, infinity)', { is_negative: false }); 79 test_zero('round(down, 1, infinity)', { is_negative: false }); 80 81 test_zero('mod(-1, -1)', { is_negative: true }); 82 test_zero('mod(-1, 1)', { is_negative: false }); 83 test_zero('mod( 1, -1)', { is_negative: true }); 84 test_zero('mod( 1, 1)', { is_negative: false }); 85 86 test_zero('rem(-1, -1)', { is_negative: true }); 87 test_zero('rem(-1, 1)', { is_negative: true }); 88 test_zero('rem( 1, -1)', { is_negative: false }); 89 test_zero('rem( 1, 1)', { is_negative: false }); 90 91 test_zero('asin(-0)', { is_negative: true }); 92 test_zero('asin( 0)', { is_negative: false }); 93 94 test_zero('atan(-0)', { is_negative: true }); 95 test_zero('atan( 0)', { is_negative: false }); 96 97 test_zero('atan2(-0, 0)', { is_negative: true }); 98 test_zero('atan2(-0, 1)', { is_negative: true }); 99 test_zero('atan2(-0, infinity)', { is_negative: true }); 100 101 test_zero('atan2(0, 0)', { is_negative: false }); 102 test_zero('atan2(0, 1)', { is_negative: false }); 103 test_zero('atan2(0, infinity)', { is_negative: false }); 104 105 test_zero('atan2(-1, infinity)', { is_negative: true }); 106 test_zero('atan2( 1, infinity)', { is_negative: false }); 107 108 test_zero('pow(-infinity, -2)', { is_negative: false }); 109 test_zero('pow(-infinity, -1)', { is_negative: true }); 110 111 test_zero('pow(-0, 1)', { is_negative: true }); 112 test_zero('pow(-0, 2)', { is_negative: false }); 113 114 test_zero('pow(0, 1)', { is_negative: false }); 115 test_zero('pow(0, 2)', { is_negative: false }); 116 117 test_zero('pow(infinity, -2)', { is_negative: false }); 118 test_zero('pow(infinity, -1)', { is_negative: false }); 119 120 test_zero('sqrt(-0)', { is_negative: true }); 121 test_zero('sqrt( 0)', { is_negative: false }); 122 123 test_zero('hypot(-0)', { is_negative: false }); 124 test_zero('hypot( 0)', { is_negative: false }); 125 126 test_zero('exp(-infinity)', { is_negative: false }); 127 128 test_zero('abs(-0)', { is_negative: false }); 129 test_zero('abs( 0)', { is_negative: false }); 130 131 test_zero('sign(-0)', { is_negative: true }); 132 test_zero('sign( 0)', { is_negative: false }); 133 </script>