95 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
How to write unit tests for wxWidgets
 | 
						|
=====================================
 | 
						|
 | 
						|
wxWidgets unit tests use [Catch](http://catch-lib.net/) framework. It is
 | 
						|
included in wxWidgets as a submodule, so you will need to run
 | 
						|
 | 
						|
    $ git submodule update --init 3rdparty/catch
 | 
						|
 | 
						|
to get it before the first use. Catch is header-only and doesn't need to be
 | 
						|
compiled.
 | 
						|
 | 
						|
Testing with Catch
 | 
						|
------------------
 | 
						|
 | 
						|
**WARNING**: Most of the existing tests are currently still written in the
 | 
						|
CppUnit style, please do _not_ follow them when writing new tests, the old
 | 
						|
style is too complex and unnecessary.
 | 
						|
 | 
						|
Writing tests with Catch is almost embarrassingly simple: you need to just
 | 
						|
add a new test case and use Catch assertion macros inside it, e.g.
 | 
						|
 | 
						|
    TEST_CASE("MyNewTest", "[my][new][another-tag]")
 | 
						|
    {
 | 
						|
        wxString s("Hello, world!");
 | 
						|
        CHECK( s.BeforeFirst(",") == "Hello" );
 | 
						|
        CHECK( s.AfterLast(" ") == "world!" );
 | 
						|
    }
 | 
						|
 | 
						|
This is all, the new test will be automatically run when you run the full test
 | 
						|
suite or you can run just it using
 | 
						|
 | 
						|
    $ ./test MyNewTest
 | 
						|
 | 
						|
(see below for more about running tests).
 | 
						|
 | 
						|
See [Catch tutorial](https://github.com/philsquared/Catch/blob/v1.11.0/docs/tutorial.md)
 | 
						|
for more information.
 | 
						|
 | 
						|
 | 
						|
Tests physical structure
 | 
						|
------------------------
 | 
						|
 | 
						|
All (i.e. both GUI and non-GUI) unit tests are under `tests` subdirectory. When
 | 
						|
adding a new test, try to find an existing file to add it to. If there are no
 | 
						|
applicable files, try to add a new file to an existing directory. If there is
 | 
						|
no applicable directory neither, create a new one and put the new file there
 | 
						|
(i.e. do _not_ put new files directly under `tests`). If your test is small,
 | 
						|
consider adding it to `tests/misc/misctests.cpp`.
 | 
						|
 | 
						|
If you add a new file, you need to update `tests/test.bkl` and add a
 | 
						|
`<sources>` tag for your new file.bkl. Make sure it's in the correct section:
 | 
						|
the one starting `<exe id="test_gui"` for a gui test, the one starting `<exe
 | 
						|
id="test" template="wx_sample_console` otherwise. After modifying this file,
 | 
						|
rerun bakefile to regenerate the tests make- and project files:
 | 
						|
 | 
						|
    $ cd build/bakefiles
 | 
						|
    $ bakefile_gen -b ../../tests/test.bkl
 | 
						|
 | 
						|
 | 
						|
Writing GUI-specific tests
 | 
						|
--------------------------
 | 
						|
 | 
						|
`wxUIActionSimulator` can be used when user input is required, for example
 | 
						|
clicking buttons or typing text. A simple example of this can be found in
 | 
						|
`tests/controls/buttontest.cpp`. After simulating some user input always
 | 
						|
call `wxYield()` to allow event processing. When writing a test using
 | 
						|
`wxUIActionSimulator` wrap it in `#if wxUSE_UIACTIONSIMULATOR` block.
 | 
						|
 | 
						|
There are a number of classes that are available to help with testing GUI
 | 
						|
elements. Firstly throughout the test run there is a frame of type
 | 
						|
`wxTestableFrame` that you can access through `wxTheApp->GetTopWindow()`. This
 | 
						|
class adds two new functions, `GetEventCount()`, which takes an optional
 | 
						|
`wxEventType`. It then returns the number of events of that type that it has
 | 
						|
received since the last call. Passing nothing returns the total number of event
 | 
						|
received since the last call. Also there is `OnEvent()`, which counts the events
 | 
						|
based on type that are passed to it. To make it easy to count events there is
 | 
						|
also a new class called `EventCounter` which takes a window and event type and
 | 
						|
connects the window to the top level `wxTestableFrame` with the specific event
 | 
						|
type. It disconnects again once it is out of scope. It simply reduces the
 | 
						|
amount of typing required to count events.
 | 
						|
 | 
						|
 | 
						|
Running the tests
 | 
						|
-----------------
 | 
						|
 | 
						|
Run the main test suite by using the command `test` for the console tests,
 | 
						|
or `test_gui` for the GUI ones. With no arguments, all the default set of tests
 | 
						|
(all those registered without `[hide]` tag) are run.
 | 
						|
 | 
						|
To list the test suites without running them use `-l` command-line option.
 | 
						|
 | 
						|
To run a particular test case, use `./test NameTestCase`. To run all tests
 | 
						|
using the specified tag, use `./test [tag_name]` (the square brackets may need
 | 
						|
to be escaped from your shell).
 |