[jQuery] Re: QUnit, jqUnit, and rhino

2008-06-26 Thread John Resig

I'm working on this (well, trying to get more of the jQuery test suite
to pass). I've broken it out into a separate project here:
http://github.com/jeresig/env-js/tree/master

I'm also trying to get it to run on more platforms (such as
Ruby/Johnson, Perl/Spidermonkey, and Python/Spidermonkey).

--John


On Thu, Jun 26, 2008 at 12:18 AM, fuzziman [EMAIL PROTECTED] wrote:


 I was thinking about modifying testrunner.js (the rhino version) with jqUnit,
 and getting it run to a point where it will be compatible with the latest
 QUnit and jqUnit test framework.

 before I dive in, has anyone done any work on this they'd be able to share,
 so I won't be reinventing the wheel?

 thanks
 --
 View this message in context: 
 http://www.nabble.com/jQuery-test-suite-and-jsUnit-compatibility-tp15882865s27240p18126261.html
 Sent from the jQuery General Discussion mailing list archive at Nabble.com.




[jQuery] Re: QUnit, jqUnit, and rhino

2008-06-26 Thread fuzziman


So excited to see that you are actively working on this John! :-)

I can see you've been concentrating on document parsing behavior, while I've
just been looking at automated testing in rhino. From my testing
perspective, I made a couple of patches:
- in test(), wrapping fn() and the next lines in try/catch/fail, so tests
don't fail silently but get logged
- as part of testrunner's results() method, quit with error code if there
was a failure, so ant build can stop if a failure occurred.

I also patched another bug (I'm not sure whether you experience this bug
too..)
$.get callback wasn't being called.
I tracked it down to the setInterval/clearInterval code.
2 problems:
- the very first setInterval returns 0, which evaluates to false in jquery,
and so timer will never be stopped, because in jquery you doif (ival)
- as soon as stop() is called, the entire rhino engine stops! not sure
why. stop() is deprecated anyway. easy workaround though, I changed it
to use the standard java runnable stop pattern of checking a local variable
and returning:


//--
// Timers

var timers = [{}];

window.setTimeout = function(fn, time){
var num;
return num = setInterval(function(){
fn();
clearInterval(num);
}, time);
};

window.setInterval = function(fn, time){
var num = timers.length;
var isRunning = true;
var timerObj = {
thread: new java.lang.Thread(new java.lang.Runnable({
run: function(){
while (isRunning){

java.lang.Thread.currentThread().sleep(time);
fn();
}
}
})),
stop: function() {isRunning = false;}
};
timers[num] = timerObj;
timers[num].thread.start();

return num;
};

window.clearInterval = function(num){
if ( timers[num] ) {
timers[num].stop();
delete timers[num];
}
};

//--

If you like, I can keep posting my findings on this thread as I find them.
Once again, good to see you working on env.js, its amazing!
Keep up the good work John!





John Resig wrote:
 
 I'm working on this (well, trying to get more of the jQuery test suite
 to pass). I've broken it out into a separate project here:
 http://github.com/jeresig/env-js/tree/master
 

-- 
View this message in context: 
http://www.nabble.com/jQuery-test-suite-and-jsUnit-compatibility-tp15882865s27240p18136064.html
Sent from the jQuery General Discussion mailing list archive at Nabble.com.



[jQuery] Re: QUnit, jqUnit, and rhino

2008-06-26 Thread chris thatcher
Wow this is good news.  I've been mucking up env.js for awhile now locally
and was afraid I wouldn't see it go where I hope it will.

John you mentioned the other platforms you want it to be used on and I think
this would be ideal.  One thing that is currently preventing that is that
the basic window code, which essentially emulates the browsers behavior and
provides the standard global functions and objects available in browsers, is
mixed with Java specific code.  If env.js has these provided by the
container, eg rhino jar + 'implementation of xmlhttprequest jar', then
env.js could stay generic across all the implementations.  It's a little
more work but inverts the control so env.js could be used by
javascript/spidermonkey  to emulate the browser as well.  This doesnt really
help perl/python but might keep the patterns clearer.

So I guess what I'm asking is, for the javascript 'env.js' is it worth it to
abstract so the same script could be used across javascript engines?  A
simple way to achieve this is to use 'providers' which are just aliases to
implementations:
- in env.js -
window.XMLHttpRequest = Env.XMLHttpRequest;

- in rhino.env.js -
Rhino = {
XMLHttpRequest = function()...
};
EnvProvider.XMLHttpRequest = RhinoEnv.XMLHttpRequest;

allows you to include a second script, say 'rhino.env.js' , to keep env.js
reusable in spidermonkey?

Thatcher

On Thu, Jun 26, 2008 at 11:00 AM, fuzziman [EMAIL PROTECTED] wrote:



 So excited to see that you are actively working on this John! :-)

 I can see you've been concentrating on document parsing behavior, while
 I've
 just been looking at automated testing in rhino. From my testing
 perspective, I made a couple of patches:
 - in test(), wrapping fn() and the next lines in try/catch/fail, so tests
 don't fail silently but get logged
 - as part of testrunner's results() method, quit with error code if there
 was a failure, so ant build can stop if a failure occurred.

 I also patched another bug (I'm not sure whether you experience this bug
 too..)
 $.get callback wasn't being called.
 I tracked it down to the setInterval/clearInterval code.
 2 problems:
 - the very first setInterval returns 0, which evaluates to false in jquery,
 and so timer will never be stopped, because in jquery you doif (ival)
 - as soon as stop() is called, the entire rhino engine stops! not sure
 why. stop() is deprecated anyway. easy workaround though, I changed it
 to use the standard java runnable stop pattern of checking a local variable
 and returning:


 //--
// Timers

var timers = [{}];

window.setTimeout = function(fn, time){
var num;
return num = setInterval(function(){
fn();
clearInterval(num);
}, time);
};

window.setInterval = function(fn, time){
var num = timers.length;
var isRunning = true;
var timerObj = {
thread: new java.lang.Thread(new
 java.lang.Runnable({
run: function(){
while (isRunning){

  java.lang.Thread.currentThread().sleep(time);
fn();
}
}
})),
stop: function() {isRunning = false;}
};
timers[num] = timerObj;
timers[num].thread.start();

return num;
};

window.clearInterval = function(num){
if ( timers[num] ) {
timers[num].stop();
delete timers[num];
}
};

 //--

 If you like, I can keep posting my findings on this thread as I find them.
 Once again, good to see you working on env.js, its amazing!
 Keep up the good work John!





 John Resig wrote:
 
  I'm working on this (well, trying to get more of the jQuery test suite
  to pass). I've broken it out into a separate project here:
  http://github.com/jeresig/env-js/tree/master
 

 --
 View this message in context:
 http://www.nabble.com/jQuery-test-suite-and-jsUnit-compatibility-tp15882865s27240p18136064.html
 Sent from the jQuery General Discussion mailing list archive at Nabble.com.




-- 
Christopher Thatcher