1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 21:28:00 +01:00

Fuck with :regressions a bit.

This commit is contained in:
Kris Maglione
2008-12-08 11:44:58 -05:00
parent 09a944b926
commit cc22c2f192
4 changed files with 143 additions and 84 deletions

View File

@@ -559,48 +559,7 @@ function Events() //{{{
} }
// return true when load successful, or false otherwise // return true when load successful, or false otherwise
function waitForPageLoaded() function waitForPageLoaded() events.waitForPageLoaded();
{
liberator.dump("start waiting in loaded state: " + buffer.loaded);
liberator.threadYield(true); // clear queue
if (buffer.loaded == 1)
return true;
let start = Date.now();
let end = start + 25000; // maximum time to wait - TODO: add option
let now;
while (now = Date.now(), now < end)
{
liberator.threadYield();
if ((now - start) % 1000 < 10)
liberator.dump("waited: " + (now - start) + " ms");
if (!events.feedingKeys)
return false;
if (buffer.loaded > 0)
{
liberator.sleep(250);
break;
}
else
liberator.echo("Waiting for page to load...");
}
modes.show();
// TODO: allow macros to be continued when page does not fully load with an option
var ret = (buffer.loaded == 1);
if (!ret)
liberator.echoerr("Page did not load completely in " + ms + " milliseconds. Macro stopped.");
liberator.dump("done waiting: " + ret);
// sometimes the input widget had focus when replaying a macro
// maybe this call should be moved somewhere else?
// liberator.focusContent(true);
return ret;
}
// load all macros inside ~/.vimperator/macros/ // load all macros inside ~/.vimperator/macros/
// setTimeout needed since io. is loaded after events. // setTimeout needed since io. is loaded after events.
@@ -1051,6 +1010,49 @@ function Events() //{{{
return (key == "<Esc>" || key == "<C-[>" || key == "<C-c>"); return (key == "<Esc>" || key == "<C-[>" || key == "<C-c>");
}, },
waitForPageLoad: function ()
{
liberator.dump("start waiting in loaded state: " + buffer.loaded);
liberator.threadYield(true); // clear queue
if (buffer.loaded == 1)
return true;
let start = Date.now();
let end = start + 25000; // maximum time to wait - TODO: add option
let now;
while (now = Date.now(), now < end)
{
liberator.threadYield();
if ((now - start) % 1000 < 10)
liberator.dump("waited: " + (now - start) + " ms");
if (!events.feedingKeys)
return false;
if (buffer.loaded > 0)
{
liberator.sleep(250);
break;
}
else
liberator.echo("Waiting for page to load...");
}
modes.show();
// TODO: allow macros to be continued when page does not fully load with an option
var ret = (buffer.loaded == 1);
if (!ret)
liberator.echoerr("Page did not load completely in " + ms + " milliseconds. Macro stopped.");
liberator.dump("done waiting: " + ret);
// sometimes the input widget had focus when replaying a macro
// maybe this call should be moved somewhere else?
// liberator.focusContent(true);
return ret;
},
// argument "event" is delibarately not used, as i don't seem to have // argument "event" is delibarately not used, as i don't seem to have
// access to the real focus target // access to the real focus target
// //

View File

@@ -635,12 +635,17 @@ const liberator = (function () //{{{
registerObserver: registerObserver, registerObserver: registerObserver,
triggerObserver: function (type, data) unregisterObserver: function (type, callback)
{
observers = observers.filter(function ([t, c]) t != type || c != callback);
},
triggerObserver: function (type)
{ {
for (let [,[thistype, callback]] in Iterator(observers)) for (let [,[thistype, callback]] in Iterator(observers))
{ {
if (thistype == type) if (thistype == type)
callback(data); callback.apply(null, Array.slice(arguments, 1));
} }
}, },

View File

@@ -547,6 +547,8 @@ function CommandLine() //{{{
setHighlightGroup(highlightGroup); setHighlightGroup(highlightGroup);
messageBox.value = str; messageBox.value = str;
liberator.triggerObserver("echoLine", str, highlightGroup, forceSingle);
if (!commandShown()) if (!commandShown())
commandline.hide(); commandline.hide();
@@ -562,6 +564,8 @@ function CommandLine() //{{{
let doc = multilineOutputWidget.contentDocument; let doc = multilineOutputWidget.contentDocument;
let win = multilineOutputWidget.contentWindow; let win = multilineOutputWidget.contentWindow;
liberator.triggerObserver("echoMultiline", str, highlightGroup);
/* If it's already XML, assume it knows what it's doing. /* If it's already XML, assume it knows what it's doing.
* Otherwise, white space is significant. * Otherwise, white space is significant.
* The problem elsewhere is that E4X tends to insert new lines * The problem elsewhere is that E4X tends to insert new lines

View File

@@ -51,9 +51,9 @@ let tests = [
// verify: function () getOutput() == "testerr" }, // verify: function () getOutput() == "testerr" },
{ cmds: ["gg", "<C-f>"], // NOTE: does not work when there is no page to scroll, we should load a large page before doing these tests { cmds: ["gg", "<C-f>"], // NOTE: does not work when there is no page to scroll, we should load a large page before doing these tests
verify: function () this._initialPos.y != getBufferPosition().y, verify: function () this._initialPos.y != getBufferPosition().y,
init: function () this._initialPos = getBufferPosition() } init: function () this._initialPos = getBufferPosition() }
// testing tab behavior // testing tab behavior
]; ];
// these functions highly depend on the liberator API, so use ex command tests whenever possible // these functions highly depend on the liberator API, so use ex command tests whenever possible
@@ -69,10 +69,10 @@ let functions = [
function resetEnvironment() function resetEnvironment()
{ {
multilineOutput.contentDocument.body.innerHTML = ""; multilineOutput.contentDocument.body.innerHTML = "";
singlelineOutput.value = ""; singlelineOutput.value = "";
commandline.close(); commandline.close();
modes.reset(); modes.reset();
} }
function getOutput() multilineOutput.contentDocument.body.textContent || singlelineOutput.value; function getOutput() multilineOutput.contentDocument.body.textContent || singlelineOutput.value;
@@ -84,15 +84,33 @@ function getTabCount() getBrowser().mTabs.length;
function getBufferPosition() function getBufferPosition()
{ {
let win = window.content; let win = window.content;
return { x: win.scrollMaxX ? win.pageXOffset / win.scrollMaxX : 0, return { x: win.scrollMaxX ? win.pageXOffset / win.scrollMaxX : 0,
y: win.scrollMaxY ? win.pageYOffset / win.scrollMaxY : 0 } y: win.scrollMaxY ? win.pageYOffset / win.scrollMaxY : 0 }
}; };
// TODO: need to find a way to wait for page load // TODO: need to find a way to wait for page load
function getLocation() window.content.document.location.href; function getLocation() window.content.document.location.href;
var doc;
function echoLine(str, group)
{
if (!doc)
return;
doc.body.appendChild(util.xmlToDom(
<div highlight={group} style="border: 1px solid gray; white-space: pre">{str}</div>,
doc));
}
function echoMulti(str, group)
{
if (!doc)
return;
doc.body.appendChild(util.xmlToDom(<div class="ex-command-output"
style="white-space: nowrap; border: 1px solid black"
highlight={group}>{template.maybeXML(str)}</div>,
doc));
}
commands.addUserCommand(["regr[essions]"], commands.addUserCommand(["regr[essions]"],
"Run regression tests", "Run regression tests",
@@ -104,17 +122,44 @@ commands.addUserCommand(["regr[essions]"],
// should only be done in a clean profile or b) run functions and not // should only be done in a clean profile or b) run functions and not
// just ex command tests; Yet to be decided // just ex command tests; Yet to be decided
let updateOutputHeight = null;
function init()
{
liberator.registerObserver("echoLine", echoLine);
liberator.registerObserver("echoMulti", echoMulti);
liberator.open("chrome://liberator/content/buffer.xhtml", liberator.NEW_TAB);
events.waitForPageLoad();
doc = content.document;
updateOutputHeight = commandline.updateOutputHeight;
commandline.updateOutputHeight = function (open)
{
let elem = document.getElementById("liberator-multiline-output");
if (open)
elem.collapsed = false;
elem.height = 0;
};
}
function cleanup()
{
liberator.unregisterObserver("echoLine", echoLine);
liberator.unregisterObserver("echoMulti", echoMulti);
commandline.updateOutputHeight = updateOutputHeight;
}
function run () function run ()
{ {
let now = Date.now(); let now = Date.now();
let totalTests = tests.length + functions.length; let totalTests = tests.length + functions.length;
let successfulTests = 0; let successfulTests = 0;
let skippedTests = 0; let skippedTests = 0;
let currentTest = 0; let currentTest = 0;
init();
// TODO: might want to unify 'tests' and 'functions' handling // TODO: might want to unify 'tests' and 'functions' handling
// 1.) run commands and mappings tests // 1.) run commands and mappings tests
outer: outer:
for (let [, test] in Iterator(tests)) for (let [, test] in Iterator(tests))
{ {
currentTest++; currentTest++;
@@ -122,15 +167,15 @@ commands.addUserCommand(["regr[essions]"],
continue; continue;
let testDescription = util.clip(test.cmds.join(" -> "), 80); let testDescription = util.clip(test.cmds.join(" -> "), 80);
for (let [,cmd] in Iterator(test.cmds)) for (let [,cmd] in Iterator(test.cmds))
{ {
if (skipTests.indexOf(cmd) != -1) if (skipTests.indexOf(cmd) != -1)
{ {
skippedTests++; skippedTests++;
liberator.echomsg("Skipping test " + currentTest + " of " + totalTests + ": " + testDescription, 0); liberator.echomsg("Skipping test " + currentTest + " of " + totalTests + ": " + testDescription, 0);
continue outer; continue outer;
} }
}; };
liberator.echomsg("Running test " + currentTest + " of " + totalTests + ": " + testDescription, 0); liberator.echomsg("Running test " + currentTest + " of " + totalTests + ": " + testDescription, 0);
resetEnvironment(); resetEnvironment();
@@ -141,13 +186,13 @@ commands.addUserCommand(["regr[essions]"],
if (cmd[0] == ":") if (cmd[0] == ":")
liberator.execute(cmd); liberator.execute(cmd);
else else
events.feedkeys(cmd); events.feedkeys(cmd);
}); });
if (!test.verify()) if (!test.verify())
liberator.echoerr("Test " + currentTest + " failed: " + testDescription); liberator.echoerr("Test " + currentTest + " failed: " + testDescription);
else else
successfulTests++; successfulTests++;
} }
// 2.) Run function tests // 2.) Run function tests
@@ -166,29 +211,32 @@ commands.addUserCommand(["regr[essions]"],
successfulTests++; successfulTests++;
} }
let runTests = (args.count >= 1 ? 1 : totalTests) - skippedTests; cleanup();
XML.ignoreWhitespace = false;
liberator.echomsg(<><span style="font-weight: bold">{successfulTests}</span> of <span style="font-weight: bold">{runTests}</span> let runTests = (args.count >= 1 ? 1 : totalTests) - skippedTests;
tests successfully completed (<span style="font-weight: bold">{skippedTests}</span> tests skipped) in XML.ignoreWhitespace = false;
<span class="time-total">{((Date.now() - now) / 1000.0)}</span> msec</>); liberator.echomsg(<><span style="font-weight: bold">{successfulTests}</span> of <span style="font-weight: bold">{runTests}</span>
tests successfully completed (<span style="font-weight: bold">{skippedTests}</span> tests skipped) in
<span class="time-total">{((Date.now() - now) / 1000.0)}</span> msec</>);
liberator.execute(":messages"); liberator.execute(":messages");
} }
if (!args.bang) if (!args.bang)
{ {
liberator.echo(<> liberator.echo(<>
<span style="font-weight: bold">Running tests should always be done in a new profile.</span><br/> <span style="font-weight: bold">Running tests should always be done in a new profile.</span><br/>
It should not do any harm to your profile, but your current settings like options, It should not do any harm to your profile, but your current settings like options,
abbreviations or mappings might not be in the same state as before running the tests. abbreviations or mappings might not be in the same state as before running the tests.
Just make sure, you don't :mkvimperatorrc, after running the tests.<br/><br/> Just make sure, you don't :mkvimperatorrc, after running the tests.<br/><br/>
<!--' vim. -->
Use :regressions! to skip this prompt. Use :regressions! to skip this prompt.
</>); </>);
commandline.input("Type 'yes' to run the tests:", function (res) { if (res == "yes") run(); } ); commandline.input("Type 'yes' to run the tests: ", function (res) { if (res == "yes") run(); } );
return; return;
} }
run(); run();
}, },
{ {
bang: true, bang: true,
@@ -196,4 +244,4 @@ commands.addUserCommand(["regr[essions]"],
count: true count: true
}); });
// vimperator: set et ts=4 sw=4 : // vimperator: set et sts=4 sw=4 :