- From: Maciej Stachowiak <mjs@apple.com>
- Date: Mon, 20 Mar 2006 13:31:48 -0800
- To: Ian Davis <Ian.Davis@talis.com>
- Cc: "Web APIs WG (public)" <public-webapi@w3.org>
- Message-Id: <9664B52F-39AC-4233-A58E-3DD07F0935F0@apple.com>
Hi Ian,
On Mar 20, 2006, at 5:44 AM, Ian Davis wrote:
> Maciej,
>
> The test suite is a great piece of work. I have question and a
> suggestion: in the test suite you have the following directory
> structure:
[... snip ...]
> Some of the code in ecmascript/browsing-contexts is repeated
> underthe publish/shared/browsing-contexts directory. Which is the
> canonical form? I'm guessing it's the one in ecmascript. The
> publish/shared directory contains some test harness code too which
> is cool.
Let me try to explain the design a bit. The only files that are truly
source files are the ecmascript/ directory. The files in scripts/ are
used to generate the published copies in publish/. And a handful of
shared helper files are in publish/shared/.
When you write a new test, all you have to do is add a .js file to
ecmascript that includes a mixture of JS code and test assertions.
Then you run the scripts/generate-tests script. For those following
along at home, here's an example of what one of the test files looks
like:
--------------
description(
'This test checks testable assertions related to the <code>window</
code> attribute of the <code>Window</code> interface'
);
// Each view of a Document presented in a browsing context MUST be
// represented by an object that implements the Window interface.
// Window objects MUST implement the following attributes:
// ... window
shouldNotThrow("window");
shouldBeFalse("typeof window == 'undefined'");
shouldBeFalse("typeof window == 'null'");
// The window attribute MUST be a reference to the same Window object
that
// has the attribute (a self-reference).
shouldBeTrue("window == this");
shouldBe("window", "this");
shouldBeTrue("window.window == window");
shouldBe("window.window", "window");
--------------
Here's an example of how to mix code with assertions, a hypothetical
test for the ability to shadow the global window property with a var
declaration:
---------
var window = 3;
shouldBe("window", "3");
---------
I'll write up some docs for all the test assertion functions available.
This script generates the published versions of the test as follows:
- For each source .js file, copies it to an appropriate subdirectory
of publish/shared, appending the line "var successfullyParsed =
true;" at the end. This extra statement is so that the harness can
ensure tests don't accidentally appear to pass due to a parse error
throwing an exception midway.
- For each source .js file, generates a wrapper based on each of the
template files. Presently there are TEMPLATE.html, TEMPLATE.xhtml,
and TEMPLATE.svg. Given a test ecmascript/category/testname.js and a
template file named TEMPLATE.fooml, the generator makes a wrapper
called publish/fooml/category/testname.fooml.
> The html, svg and xhtml directories play the role of test harnesses
> for various ecmascript hosts. Presumably we'd accept contributions
> from people who want to write harnesses for other bindings and
> hosts. Is there a better structure to help with this?
I think the structure is already pretty good for this. Someone
wanting to provide a harness for, say, VoiceXML, would only need to
implement scripts/TEMPLATE.voicexml and (probably) publish/shared/js-
test-pre-voicexml.js.
Things will start to get a bit more complicated once we start testing
compound documents (by reference), in that case we'll need more
templates to test the various kinds of embedding allowed. I imagine
we'll want html-only, xhtml-only and svg-only versions where they
compound only with themselves, but probably also all the other
pairwise combinations of one language embedding another by reference.
For these three languages, that makes 6 combos (since we want to test
embedding both ways, so XHTML referencing SVG will be a separate test
from SVG referencing XHTML).
> Perhaps the first subdirectory of the test suite should be the
> binding with subdirectories for the harnesses and actual tests.
> Maybe something like:
>
> /WindowTestSuite
> ecmascript
> harnesses
> shared
> html
> svg
> xhtml
> tests
> browsing-contexts
>
> The test assertion framework should come out of this tree into a
> separate area for reuse by other components e.g. XHR. I've already
> rewritten my XHR method tests to use it so we're consistent. I'd
> like to be consistent on the directory structure too.
Sure, I'm happy to break out the generator scripts and shared helper
files into a separate module. Suggested names? Maybe ReTest? :-)
Here's the directory structure I'd propose:
ReTest
bin
retest
templates
TEMPLATE.*
resources
# all the JS and CSS files that will be referenced by templates
WindowTestSuite
source
ecmascript
browsing-contexts
# etc
publish
shared
browsing-contexts
# etc
html
browsing-contexts
# etc
svg
browsing-contexts
# etc
xhtml
browsing-contexts
# etc
The test generator script would end up copying some of its resources
into the publish directory, but I think that's ok. It means we'll
have just one place to update these for possibly multiple test
suites, which can then be regenerated and remain self-contained.
For this test framework to be effective for testing XMLHttpRequest,
though, I think it will need a few additional features. In
particular, you'll want the ability to defer the final processing
that adds the TEST COMPLETED message until a later time.
I already have a design for how to do this, since tests for timers
and embedding will require this as well. The short version is that
there will be a waitForTestCompleted() function that makes the test
wait until you call testCompleted() to finish.
Regards,
Maciej
Received on Monday, 20 March 2006 21:32:01 UTC