# Running the unit tests #

Load the index.html file with you favorite browser.

# Adding a spec #

$ build/build.sh 

You need to have the SDKTools or at least hammerjs installed and available in your
PATH

# THE RULES 

* No dynamic spec generation, the unit tests are not designed to be dry,
 they must be easy to read and allow you to quickly find a bug.
* If a spec generates dom, don't forget to clean the document.body after 
 it is executed.
* Avoid testing dom rendering we are using the eye for that, you should only test code logic.
* Don't comment a spec or a suite to disable it, instead use xit and xdescribe.
* You should have only one expectation by spec.
* 99% of time you don't need to write specifics test for private functions and abstract classes.
* RTFM https://github.com/pivotal/jasmine/wiki

# Test Coverage #

The test reporter supports jscoverage which is available at http://siliconforks.com/jscoverage/
Here the jscoverage-server command for each project:

Ext
$ jscoverage-server --no-instrument=extjs/test --no-instrument=platform/test --no-instrument=platform/core/test --no-instrument=testreporter

Touch
$ jscoverage-server --no-instrument=touch/test --no-instrument=platform/test --no-instrument=platform/core/test --no-instrument=testreporter

Use jscoverage-server, it helps a lot.

# Mouse and Keyboard events simulation #

/**
 * @param {HTMLElement} el The target dom element
 * @param {String} type The event name 'mousedown', 'click' etc...
 * @param {Number} x The x position
 * @param {Number} y The y position
 */
jasmine.fireMouseEvent(el, type, x, y);

/**
 * @param {HTMLElement} el The target dom element
 * @param {String} type The event name 'keypress', 'keydown' etc...
 * @param {Number} key The keycode number
 */
jasmine.fireKeyEvent(el, type, key);

# Accessing sandbox iframe from your browser console #

The specs are run in an isolated scope from the the testreporter ui.
To execute command inside the isolated scope, you can use iScope() function.

// with a string as first argument
iScope("console.log(Ext)");
 
//with a function as first argument
iScope(function() { console.log(Ext); });


# White Listing global variable #

With Chrome and Firefox the Test Reporter is able to detect global variables. 
But sometimes you have to create one during spec execution, in this case you must use addGlobal() function inside the spec to whitelist your global.


// whitelist a global variable
addGlobal("foobar");


# Matchers List #

This is a list of available matchers
expect(x).toEqual(y);vcompares objects or primitives x and y and passes if they are equivalent
expect(x).toBe(y); compares objects or primitives x and y and passes if they are the same object
expect(x).toMatch(pattern); compares x to string or regular expression pattern and passes if they match
expect(x).toBeDefined(); passes if x is not undefined
expect(x).toBeNull(); passes if x is null
expect(x).toBeTruthy(); passes if x evaluates to true
expect(x).toBeFalsy(); passes if x evaluates to false
expect(x).toContain(y); passes if array or string x contains y
expect(x).toBeLessThan(y); passes if x is less than y
expect(x).toBeGreaterThan(y); passes if x is greater than y
expect(fn).toThrow(e); passes if function fn throws exception e when executed
expect(fn).toRaiseExtError(e); passes if function fn raise an Ext.Error e when executed
expect(dom).hasHTML(html); passes if dom.innerHTML and html are equivalent (it normalizes difference across browsers just use standard webkit/ff innerHTML)
