js/src/jit-test/tests/debug/Debugger-findScripts-12.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/debug/Debugger-findScripts-12.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,128 @@
     1.4 +// Debugger.prototype.findScripts can filter by global, url, and line number.
     1.5 +
     1.6 +// Two scripts, with different functions at the same line numbers.
     1.7 +var url1 = scriptdir + 'Debugger-findScripts-12-script1';
     1.8 +var url2 = scriptdir + 'Debugger-findScripts-12-script2';
     1.9 +
    1.10 +// Three globals: two with code, one with nothing.
    1.11 +var g1 = newGlobal();
    1.12 +g1.toSource = function () "[global g1]";
    1.13 +g1.load(url1);
    1.14 +g1.load(url2);
    1.15 +var g2 = newGlobal();
    1.16 +g2.toSource = function () "[global g2]";
    1.17 +g2.load(url1);
    1.18 +g2.load(url2);
    1.19 +var g3 = newGlobal();
    1.20 +
    1.21 +var dbg = new Debugger(g1, g2, g3);
    1.22 +
    1.23 +function script(func) {
    1.24 +    var gw = dbg.addDebuggee(func.global);
    1.25 +    var script = gw.makeDebuggeeValue(func).script;
    1.26 +    script.toString = function ()
    1.27 +        "[Debugger.Script for " + func.name + " in " + uneval(func.global) + "]";
    1.28 +    return script;
    1.29 +}
    1.30 +
    1.31 +// The function scripts we know of. There may be random eval scripts involved, but
    1.32 +// we don't care about those.
    1.33 +var allScripts = ([g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i,
    1.34 +                   g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i].map(script));
    1.35 +
    1.36 +// Search for scripts using |query|, expecting no members of allScripts
    1.37 +// except those given in |expected| in the result. If |expected| is
    1.38 +// omitted, expect no members of allScripts at all.
    1.39 +function queryExpectOnly(query, expected) {
    1.40 +    print();
    1.41 +    print("queryExpectOnly(" + uneval(query) + ")");
    1.42 +    var scripts = dbg.findScripts(query);
    1.43 +    var present = allScripts.filter(function (s) { return scripts.indexOf(s) != -1; });
    1.44 +    if (expected) {
    1.45 +        expected = expected.map(script);
    1.46 +        expected.forEach(function (s) {
    1.47 +                             if (present.indexOf(s) == -1)
    1.48 +                                 assertEq(s + " not present", "is present");
    1.49 +                         });
    1.50 +        present.forEach(function (s) {
    1.51 +                             if (expected.indexOf(s) == -1)
    1.52 +                                 assertEq(s + " is present", "not present");
    1.53 +                         });
    1.54 +    } else {
    1.55 +        assertEq(present.length, 0);
    1.56 +    }
    1.57 +}
    1.58 +
    1.59 +// We have twelve functions: two globals, each with two urls, each
    1.60 +// defining three functions. Show that all the different combinations of
    1.61 +// query parameters select what they should.
    1.62 +
    1.63 +// There are gaps in the pattern:
    1.64 +// - You can only filter by line if you're also filtering by url.
    1.65 +// - You can't ask for only the innermost scripts unless you're filtering by line.
    1.66 +
    1.67 +// Filtering by global, url, and line produces one function, or two
    1.68 +// where they are nested.
    1.69 +queryExpectOnly({ global:g1, url:url1, line:  6 }, [g1.f        ]);
    1.70 +queryExpectOnly({ global:g1, url:url1, line:  8 }, [g1.f, g1.f()]);
    1.71 +queryExpectOnly({ global:g1, url:url1, line: 15 }, [g1.g        ]);
    1.72 +queryExpectOnly({ global:g1, url:url2, line:  6 }, [g1.h        ]);
    1.73 +queryExpectOnly({ global:g1, url:url2, line:  8 }, [g1.h, g1.h()]);
    1.74 +queryExpectOnly({ global:g1, url:url2, line: 15 }, [g1.i        ]);
    1.75 +queryExpectOnly({ global:g2, url:url1, line:  6 }, [g2.f        ]);
    1.76 +queryExpectOnly({ global:g2, url:url1, line:  8 }, [g2.f, g2.f()]);
    1.77 +queryExpectOnly({ global:g2, url:url1, line: 15 }, [g2.g        ]);
    1.78 +queryExpectOnly({ global:g2, url:url2, line:  6 }, [g2.h        ]);
    1.79 +queryExpectOnly({ global:g2, url:url2, line:  8 }, [g2.h, g2.h()]);
    1.80 +queryExpectOnly({ global:g2, url:url2, line: 15 }, [g2.i        ]); 
    1.81 +
    1.82 +// Filtering by global, url, and line, and requesting only the innermost
    1.83 +// function at each point, should produce only one function.
    1.84 +queryExpectOnly({ global:g1, url:url1, line:  6, innermost: true }, [g1.f  ]);
    1.85 +queryExpectOnly({ global:g1, url:url1, line:  8, innermost: true }, [g1.f()]);
    1.86 +queryExpectOnly({ global:g1, url:url1, line: 15, innermost: true }, [g1.g  ]);
    1.87 +queryExpectOnly({ global:g1, url:url2, line:  6, innermost: true }, [g1.h  ]);
    1.88 +queryExpectOnly({ global:g1, url:url2, line:  8, innermost: true }, [g1.h()]);
    1.89 +queryExpectOnly({ global:g1, url:url2, line: 15, innermost: true }, [g1.i  ]);
    1.90 +queryExpectOnly({ global:g2, url:url1, line:  6, innermost: true }, [g2.f  ]);
    1.91 +queryExpectOnly({ global:g2, url:url1, line:  8, innermost: true }, [g2.f()]);
    1.92 +queryExpectOnly({ global:g2, url:url1, line: 15, innermost: true }, [g2.g  ]);
    1.93 +queryExpectOnly({ global:g2, url:url2, line:  6, innermost: true }, [g2.h  ]);
    1.94 +queryExpectOnly({ global:g2, url:url2, line:  8, innermost: true }, [g2.h()]);
    1.95 +queryExpectOnly({ global:g2, url:url2, line: 15, innermost: true }, [g2.i  ]); 
    1.96 +
    1.97 +// Filtering by url and global should produce sets of three scripts.
    1.98 +queryExpectOnly({ global:g1, url:url1 }, [g1.f, g1.f(), g1.g]);
    1.99 +queryExpectOnly({ global:g1, url:url2 }, [g1.h, g1.h(), g1.i]);
   1.100 +queryExpectOnly({ global:g2, url:url1 }, [g2.f, g2.f(), g2.g]);
   1.101 +queryExpectOnly({ global:g2, url:url2 }, [g2.h, g2.h(), g2.i]);
   1.102 +
   1.103 +// Filtering by url and line, innermost-only, should produce sets of two scripts,
   1.104 +// or four where there are nested functions.
   1.105 +queryExpectOnly({ url:url1, line: 6 }, [g1.f,         g2.f        ]);
   1.106 +queryExpectOnly({ url:url1, line: 8 }, [g1.f, g1.f(), g2.f, g2.f()]);
   1.107 +queryExpectOnly({ url:url1, line:15 }, [g1.g,         g2.g        ]);
   1.108 +queryExpectOnly({ url:url2, line: 6 }, [g1.h,         g2.h        ]);
   1.109 +queryExpectOnly({ url:url2, line: 8 }, [g1.h, g1.h(), g2.h, g2.h()]);
   1.110 +queryExpectOnly({ url:url2, line:15 }, [g1.i,         g2.i        ]);
   1.111 +
   1.112 +// Filtering by url and line, and requesting only the innermost scripts,
   1.113 +// should always produce pairs of scripts.
   1.114 +queryExpectOnly({ url:url1, line: 6, innermost: true }, [g1.f,   g2.f  ]);
   1.115 +queryExpectOnly({ url:url1, line: 8, innermost: true }, [g1.f(), g2.f()]);
   1.116 +queryExpectOnly({ url:url1, line:15, innermost: true }, [g1.g,   g2.g  ]);
   1.117 +queryExpectOnly({ url:url2, line: 6, innermost: true }, [g1.h,   g2.h  ]);
   1.118 +queryExpectOnly({ url:url2, line: 8, innermost: true }, [g1.h(), g2.h()]);
   1.119 +queryExpectOnly({ url:url2, line:15, innermost: true }, [g1.i,   g2.i  ]);
   1.120 +
   1.121 +// Filtering by global only should produce sets of six scripts.
   1.122 +queryExpectOnly({ global:g1 }, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i]);
   1.123 +queryExpectOnly({ global:g2 }, [g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]);
   1.124 +
   1.125 +// Filtering by url should produce sets of six scripts.
   1.126 +queryExpectOnly({ url:url1 }, [g1.f, g1.f(), g1.g, g2.f, g2.f(), g2.g]);
   1.127 +queryExpectOnly({ url:url2 }, [g1.h, g1.h(), g1.i, g2.h, g2.h(), g2.i]);
   1.128 +
   1.129 +// Filtering by no axes should produce all twelve scripts.
   1.130 +queryExpectOnly({}, [g1.f, g1.f(), g1.g, g1.h, g1.h(), g1.i,
   1.131 +                     g2.f, g2.f(), g2.g, g2.h, g2.h(), g2.i]);

mercurial