tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });