js/src/jit-test/tests/basic/spread-call-length.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/basic/spread-call-length.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,54 @@
     1.4 +load(libdir + 'iteration.js');
     1.5 +
     1.6 +let makeCall    = farg => Function("f", "arg", "return f(" + farg + ");");
     1.7 +let makeFunCall = farg => Function("f", "arg", "return f.call(null, " + farg + ");");
     1.8 +let makeNew     = farg => Function("f", "arg", "return new f(" + farg + ").length;");
     1.9 +
    1.10 +function checkLength(f, makeFn) {
    1.11 +  assertEq(makeFn("...[1, 2, 3]")(f), 3);
    1.12 +  assertEq(makeFn("1, ...[2], 3")(f), 3);
    1.13 +  assertEq(makeFn("1, ...[2], ...[3]")(f), 3);
    1.14 +  assertEq(makeFn("1, ...[2, 3]")(f), 3);
    1.15 +  assertEq(makeFn("1, ...[], 2, 3")(f), 3);
    1.16 +
    1.17 +  assertEq(makeFn("...[1]")(f), 1);
    1.18 +  assertEq(makeFn("...[1, 2]")(f), 2);
    1.19 +  assertEq(makeFn("...[1, 2, 3, 4]")(f), 4);
    1.20 +  assertEq(makeFn("1, ...[2, 3, 4], 5")(f), 5);
    1.21 +
    1.22 +  assertEq(makeFn("...[undefined]")(f), 1);
    1.23 +
    1.24 +  // other iterable objects
    1.25 +  assertEq(makeFn("...arg")(f, new Int32Array([1, 2, 3])), 3);
    1.26 +  assertEq(makeFn("...arg")(f, "abc"), 3);
    1.27 +  assertEq(makeFn("...arg")(f, [1, 2, 3][std_iterator]()), 3);
    1.28 +  assertEq(makeFn("...arg")(f, Set([1, 2, 3])), 3);
    1.29 +  assertEq(makeFn("...arg")(f, Map([["a", "A"], ["b", "B"], ["c", "C"]])), 3);
    1.30 +  let itr = {};
    1.31 +  itr[std_iterator] = function() {
    1.32 +      return {
    1.33 +          i: 1,
    1.34 +          next: function() {
    1.35 +              if (this.i < 4)
    1.36 +                  return { value: this.i++, done: false };
    1.37 +              else
    1.38 +                  return { value: undefined, done: true };
    1.39 +          }
    1.40 +      };
    1.41 +  }
    1.42 +  assertEq(makeFn("...arg")(f, itr), 3);
    1.43 +  function* gen() {
    1.44 +      for (let i = 1; i < 4; i ++)
    1.45 +          yield i;
    1.46 +  }
    1.47 +  assertEq(makeFn("...arg")(f, gen()), 3);
    1.48 +}
    1.49 +
    1.50 +checkLength(function(x) arguments.length, makeCall);
    1.51 +checkLength(function(x) arguments.length, makeFunCall);
    1.52 +checkLength((x) => arguments.length, makeCall);
    1.53 +checkLength((x) => arguments.length, makeFunCall);
    1.54 +function lengthClass(x) {
    1.55 +  this.length = arguments.length;
    1.56 +}
    1.57 +checkLength(lengthClass, makeNew);

mercurial