test_linearEasing.js (5897B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Tests methods from the LinearEasingWidget module 7 8 const { 9 LinearEasingFunctionWidget, 10 parseTimingFunction, 11 } = require("resource://devtools/client/shared/widgets/LinearEasingFunctionWidget.js"); 12 13 add_task(function testParseTimingFunction() { 14 info("test parseTimingFunction"); 15 16 for (const test of ["ease", "linear", "ease-in", "ease-out", "ease-in-out"]) { 17 ok(!parseTimingFunction(test), `"${test}" is not valid`); 18 } 19 20 ok(!parseTimingFunction("something"), "non-function token"); 21 ok(!parseTimingFunction("something()"), "non-linear function"); 22 ok( 23 !parseTimingFunction( 24 "linear(something)", 25 "linear with non-numeric argument" 26 ) 27 ); 28 29 ok(!parseTimingFunction("linear(0)", "linear with only 1 point")); 30 31 deepEqual( 32 parseTimingFunction("linear(0, 0.5, 1)"), 33 [ 34 { input: 0, output: 0 }, 35 { input: 0.5, output: 0.5 }, 36 { input: 1, output: 1 }, 37 ], 38 "correct invocation" 39 ); 40 deepEqual( 41 parseTimingFunction("linear(0, 0.5 /* mid */, 1)"), 42 [ 43 { input: 0, output: 0 }, 44 { input: 0.5, output: 0.5 }, 45 { input: 1, output: 1 }, 46 ], 47 "correct with comments and whitespace" 48 ); 49 deepEqual( 50 parseTimingFunction("linear(0 10%, 0.5 20%, 1 90%)"), 51 [ 52 { input: 0.1, output: 0 }, 53 { input: 0.2, output: 0.5 }, 54 { input: 0.9, output: 1 }, 55 ], 56 "correct invocation with single stop" 57 ); 58 deepEqual( 59 parseTimingFunction( 60 "linear(0, 0.1, 0.2, 0.3, 0.4, 0.5 50%, 0.6, 0.7, 0.8, 0.9 70%, 1)" 61 ), 62 [ 63 { input: 0, output: 0 }, 64 { input: 0.1, output: 0.1 }, 65 { input: 0.2, output: 0.2 }, 66 { input: 0.3, output: 0.3 }, 67 { input: 0.4, output: 0.4 }, 68 { input: 0.5, output: 0.5 }, 69 { input: 0.55, output: 0.6 }, 70 { input: 0.6, output: 0.7 }, 71 { 72 // This should be 0.65, but JS doesn't play well with floating points, which makes 73 // the test fail. So re-do the computation here 74 input: 0.5 * 0.25 + 0.7 * 0.75, 75 output: 0.8, 76 }, 77 { input: 0.7, output: 0.9 }, 78 { input: 1, output: 1 }, 79 ], 80 "correct invocation with single stop and run of non-stop values" 81 ); 82 83 deepEqual( 84 parseTimingFunction("linear(0, 0.5 80%, 0.75 40%, 1)"), 85 [ 86 { input: 0, output: 0 }, 87 { input: 0.8, output: 0.5 }, 88 { input: 0.8, output: 0.75 }, 89 { input: 1, output: 1 }, 90 ], 91 "correct invocation with out of order single stop" 92 ); 93 94 deepEqual( 95 parseTimingFunction("linear(0.5 10% 40%, 0, 0.2 60% 70%, 0.75 80% 100%)"), 96 [ 97 { input: 0.1, output: 0.5 }, 98 { input: 0.4, output: 0.5 }, 99 { input: 0.5, output: 0 }, 100 { input: 0.6, output: 0.2 }, 101 { input: 0.7, output: 0.2 }, 102 { input: 0.8, output: 0.75 }, 103 { input: 1, output: 0.75 }, 104 ], 105 "correct invocation with multiple stops" 106 ); 107 108 deepEqual( 109 parseTimingFunction("linear(0, 0.2 60% 10%, 1)"), 110 [ 111 { input: 0, output: 0 }, 112 { input: 0.6, output: 0.2 }, 113 { input: 0.6, output: 0.2 }, 114 { input: 1, output: 1 }, 115 ], 116 "correct invocation with multiple out of order stops" 117 ); 118 119 deepEqual( 120 parseTimingFunction("linear(0, 1.5, 1)"), 121 [ 122 { input: 0, output: 0 }, 123 { input: 0.5, output: 1.5 }, 124 { input: 1, output: 1 }, 125 ], 126 "linear function easing with output greater than 1" 127 ); 128 129 deepEqual( 130 parseTimingFunction("linear(1, -0.5, 0)"), 131 [ 132 { input: 0, output: 1 }, 133 { input: 0.5, output: -0.5 }, 134 { input: 1, output: 0 }, 135 ], 136 "linear function easing with output less than 1" 137 ); 138 139 deepEqual( 140 parseTimingFunction("linear(0, 0.1 -10%, 1)"), 141 [ 142 { input: 0, output: 0 }, 143 { input: 0, output: 0.1 }, 144 { input: 1, output: 1 }, 145 ], 146 "correct invocation, input value being unspecified in the first entry implies zero" 147 ); 148 149 deepEqual( 150 parseTimingFunction("linear(0, 0.9 110%, 1)"), 151 [ 152 { input: 0, output: 0 }, 153 { input: 1.1, output: 0.9 }, 154 { input: 1.1, output: 1 }, 155 ], 156 "correct invocation, input value being unspecified in the last entry implies max input value" 157 ); 158 }); 159 160 add_task(function testGetSetCssLinearValue() { 161 const doc = Services.appShell.createWindowlessBrowser().document; 162 const widget = new LinearEasingFunctionWidget(doc.body); 163 164 widget.setCssLinearValue("linear(0)"); 165 ok(!widget.getCssLinearValue(), "no value returned for invalid value"); 166 167 widget.setCssLinearValue("linear(0, 0.5, 1)"); 168 deepEqual( 169 widget.getCssLinearValue(), 170 "linear(0 0%, 0.5 50%, 1 100%)", 171 "no stops" 172 ); 173 174 widget.setCssLinearValue("linear(0 10%, 0.5 20%, 1 90%)"); 175 deepEqual( 176 widget.getCssLinearValue(), 177 "linear(0 10%, 0.5 20%, 1 90%)", 178 "with single stops" 179 ); 180 181 widget.setCssLinearValue("linear(0, 0.5 80%, 0.75 40%, 1)"); 182 deepEqual( 183 widget.getCssLinearValue(), 184 "linear(0 0%, 0.5 80%, 0.75 80%, 1 100%)", 185 "correcting out of order single stops" 186 ); 187 188 widget.setCssLinearValue( 189 "linear(0.5 10% 40%, 0, 0.2 60% 70%, 0.75 80% 100%)" 190 ); 191 deepEqual( 192 widget.getCssLinearValue(), 193 "linear(0.5 10%, 0.5 40%, 0 50%, 0.2 60%, 0.2 70%, 0.75 80%, 0.75 100%)", 194 "multiple stops" 195 ); 196 197 widget.setCssLinearValue("linear(0, 0.2 60% 10%, 1)"); 198 deepEqual( 199 widget.getCssLinearValue(), 200 "linear(0 0%, 0.2 60%, 0.2 60%, 1 100%)", 201 "correcting multiple out-of-order stops" 202 ); 203 204 widget.setCssLinearValue("linear(1, -0.5, 1.5)"); 205 deepEqual( 206 widget.getCssLinearValue(), 207 "linear(1 0%, -0.5 50%, 1.5 100%)", 208 "output outside of [0,1] range" 209 ); 210 211 widget.setCssLinearValue("linear(0 -10%, 0.5, 1 130%)"); 212 deepEqual( 213 widget.getCssLinearValue(), 214 "linear(0 -10%, 0.5 60%, 1 130%)", 215 "input outside of [0%,100%] range" 216 ); 217 });