bringing cxxtest-3.10.1 to ScummVM's main branch
svn-id: r21488
This commit is contained in:
parent
9c94670e22
commit
3820593bb8
88 changed files with 11285 additions and 0 deletions
504
test/cxxtest/COPYING
Normal file
504
test/cxxtest/COPYING
Normal file
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
63
test/cxxtest/README
Normal file
63
test/cxxtest/README
Normal file
|
@ -0,0 +1,63 @@
|
|||
Introduction
|
||||
------------
|
||||
|
||||
CxxTest is a JUnit/CppUnit/xUnit-like framework for C++.
|
||||
|
||||
Its advantages over existing alternatives are that it:
|
||||
- Doesn't require RTTI
|
||||
- Doesn't require member template functions
|
||||
- Doesn't require exception handling
|
||||
- Doesn't require any external libraries (including memory management,
|
||||
file/console I/O, graphics libraries)
|
||||
|
||||
This makes it extremely portable and usable.
|
||||
|
||||
CxxTest is available under the GNU Lesser General Public Licence (LGPL).
|
||||
See http://www.gnu.org/copyleft/lesser.html for the license.
|
||||
|
||||
Simple user's guide
|
||||
-------------------
|
||||
|
||||
1. Create a test suite header file:
|
||||
|
||||
MyTest.h:
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
class MyTestSuite : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void testAddition( void )
|
||||
{
|
||||
TS_ASSERT( 1 + 1 > 1 );
|
||||
TS_ASSERT_EQUALS( 1 + 1, 2 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
2. Generate the tests file:
|
||||
|
||||
# cxxtestgen.pl -o tests.cpp MyTestSuite.h
|
||||
|
||||
|
||||
3. Create a main function that runs the tests
|
||||
|
||||
main.cpp:
|
||||
#include <cxxtest/ErrorPrinter.h>
|
||||
|
||||
int main( void )
|
||||
{
|
||||
CxxText::ErrorPrinter::runAllTests();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
4. Compile and run!
|
||||
|
||||
# g++ -o main main.cpp tests.cpp
|
||||
# ./main
|
||||
Running 1 test(s).OK!
|
||||
|
||||
|
||||
Advanced User's Guide
|
||||
---------------------
|
||||
See docs/guide.html.
|
34
test/cxxtest/TODO
Normal file
34
test/cxxtest/TODO
Normal file
|
@ -0,0 +1,34 @@
|
|||
This is an -*- Outline -*- of ideas for future versions of CxxTest.
|
||||
It is not meant to be "human readable".
|
||||
|
||||
* CxxTest To Do list
|
||||
|
||||
** Mock framework
|
||||
|
||||
Write some mocks
|
||||
|
||||
*** Distribution
|
||||
Seperate packages (w/ binaries)? How would that be used?
|
||||
For Windows: .lib for "Real" and "Mock" parts.
|
||||
For Linux: Maybe. Different compilers etc.
|
||||
So probably only source release with Makefiles and .ds[pw]? Or just Win32 binary.
|
||||
|
||||
**** Installation?
|
||||
extract cxxtest-x.y.z.tar.gz
|
||||
(extract cxxtest-mock-x.y.z.tar.gz) ?
|
||||
make -C cxxtest/Real
|
||||
make -C cxxtest/Mock
|
||||
|
||||
or maybe make -C cxxtest -f Makefile.mock
|
||||
but then Makefile.mock.bcc32, Makefile.mock.msvc, Makefile.mock.gcc, and heaven knows what else.
|
||||
|
||||
Could put the Makefile.mock.* in cxxtest/Real and cxxtest/Mock or in cxxtest/T
|
||||
|
||||
Maybe this should be a different package altogether?
|
||||
Seems logical, since they evolve separately. But then you'd want to download both.
|
||||
|
||||
** Thoughts
|
||||
-fomit-frame-pointer
|
||||
|
||||
** TS_HEX
|
||||
|
152
test/cxxtest/Versions
Normal file
152
test/cxxtest/Versions
Normal file
|
@ -0,0 +1,152 @@
|
|||
CxxTest Releases
|
||||
================
|
||||
|
||||
Version 3.10.1 (2004-12-01):
|
||||
----------------------------
|
||||
- Improved support for VC7
|
||||
- Fixed clash with some versions of STL
|
||||
|
||||
Version 3.10.0 (2004-11-20):
|
||||
----------------------------
|
||||
- Added mock framework for global functions
|
||||
- Added TS_ASSERT_THROWS_ASSERT and TS_ASSERT_THROWS_EQUALS
|
||||
- Added CXXTEST_ENUM_TRAITS
|
||||
- Improved support for STL classes (vector, map etc.)
|
||||
- Added support for Digital Mars compiler
|
||||
- Reduced root/part compilation time and binary size
|
||||
- Support C++-style commenting of tests
|
||||
|
||||
Version 3.9.1 (2004-01-19):
|
||||
---------------------------
|
||||
- Fixed small bug with runner exit code
|
||||
- Embedded test suites are now deprecated
|
||||
|
||||
Version 3.9.0 (2004-01-17):
|
||||
---------------------------
|
||||
- Added TS_TRACE
|
||||
- Added --no-static-init
|
||||
- CxxTest::setAbortTestOnFail() works even without --abort-on-fail
|
||||
|
||||
Version 3.8.5 (2004-01-08):
|
||||
---------------------------
|
||||
- Added --no-eh
|
||||
- Added CxxTest::setAbortTestOnFail() and CXXTEST_DEFAULT_ABORT
|
||||
- Added CxxTest::setMaxDumpSize()
|
||||
- Added StdioFilePrinter
|
||||
|
||||
Version 3.8.4 (2003-12-31):
|
||||
---------------------------
|
||||
- Split distribution into cxxtest and cxxtest-selftest
|
||||
- Added `sample/msvc/FixFiles.bat'
|
||||
|
||||
Version 3.8.3 (2003-12-24):
|
||||
---------------------------
|
||||
- Added TS_ASSERT_PREDICATE
|
||||
- Template files can now specify where to insert the preamble
|
||||
- Added a sample Visual Studio workspace in `sample/msvc'
|
||||
- Can compile in MSVC with warning level 4
|
||||
- Changed output format slightly
|
||||
|
||||
Version 3.8.1 (2003-12-21):
|
||||
---------------------------
|
||||
- Fixed small bug when using multiple --part files.
|
||||
- Fixed X11 GUI crash when there's no X server.
|
||||
- Added GlobalFixture::setUpWorld()/tearDownWorld()
|
||||
- Added leaveOnly(), activateAllTests() and `sample/only.tpl'
|
||||
- Should now run without warnings on Sun compiler.
|
||||
|
||||
Version 3.8.0 (2003-12-13):
|
||||
---------------------------
|
||||
- Fixed bug where `Root.cpp' needed exception handling
|
||||
- Added TS_ASSERT_RELATION
|
||||
- TSM_ macros now also tell you what went wrong
|
||||
- Renamed Win32Gui::free() to avoid clashes
|
||||
- Now compatible with more versions of Borland compiler
|
||||
- Improved the documentation
|
||||
|
||||
Version 3.7.1 (2003-09-29):
|
||||
---------------------------
|
||||
- Added --version
|
||||
- Compiles with even more exotic g++ warnings
|
||||
- Win32 Gui compiles with UNICODE
|
||||
- Should compile on some more platforms (Sun Forte, HP aCC)
|
||||
|
||||
Version 3.7.0 (2003-09-20):
|
||||
---------------------------
|
||||
- Added TS_ASSERT_LESS_THAN_EQUALS
|
||||
- Minor cleanups
|
||||
|
||||
Version 3.6.1 (2003-09-15):
|
||||
---------------------------
|
||||
- Improved QT GUI
|
||||
- Improved portability some more
|
||||
|
||||
Version 3.6.0 (2003-09-04):
|
||||
---------------------------
|
||||
- Added --longlong
|
||||
- Some portability improvements
|
||||
|
||||
Version 3.5.1 (2003-09-03):
|
||||
---------------------------
|
||||
- Major internal rewrite of macros
|
||||
- Added TS_ASSERT_SAME_DATA
|
||||
- Added --include option
|
||||
- Added --part and --root to enable splitting the test runner
|
||||
- Added global fixtures
|
||||
- Enhanced Win32 GUI with timers, -keep and -title
|
||||
- Now compiles with strict warnings
|
||||
|
||||
Version 3.1.1 (2003-08-27):
|
||||
---------------------------
|
||||
- Fixed small bug in TS_ASSERT_THROWS_*()
|
||||
|
||||
Version 3.1.0 (2003-08-23):
|
||||
---------------------------
|
||||
- Default ValueTraits now dumps value as hex bytes
|
||||
- Fixed double invocation bug (e.g. TS_FAIL(functionWithSideEffects()))
|
||||
- TS_ASSERT_THROWS*() are now "abort on fail"-friendly
|
||||
- Win32 GUI now supports Windows 98 and doesn't need comctl32.lib
|
||||
|
||||
Version 3.0.1 (2003-08-07):
|
||||
---------------------------
|
||||
- Added simple GUI for X11, Win32 and Qt
|
||||
- Added TS_WARN() macro
|
||||
- Removed --exit-code
|
||||
- Improved samples
|
||||
- Improved support for older (pre-std::) compilers
|
||||
- Made a PDF version of the User's Guide
|
||||
|
||||
Version 2.8.4 (2003-07-21):
|
||||
---------------------------
|
||||
- Now supports g++-3.3
|
||||
- Added --have-eh
|
||||
- Fixed bug in numberToString()
|
||||
|
||||
Version 2.8.3 (2003-06-30):
|
||||
---------------------------
|
||||
- Fixed bugs in cxxtestgen.pl
|
||||
- Fixed warning for some compilers in ErrorPrinter/StdioPrinter
|
||||
- Thanks Martin Jost for pointing out these problems!
|
||||
|
||||
Version 2.8.2 (2003-06-10):
|
||||
---------------------------
|
||||
- Fixed bug when using CXXTEST_ABORT_TEST_ON_FAIL without standard library
|
||||
- Added CXXTEST_USER_TRAITS
|
||||
- Added --abort-on-fail
|
||||
|
||||
Version 2.8.1 (2003-01-16):
|
||||
---------------------------
|
||||
- Fixed charToString() for negative chars
|
||||
|
||||
Version 2.8.0 (2003-01-13):
|
||||
---------------------------
|
||||
- Added CXXTEST_ABORT_TEST_ON_FAIL for xUnit-like behaviour
|
||||
- Added `sample/winddk'
|
||||
- Improved ValueTraits
|
||||
- Improved output formatter
|
||||
- Started version history
|
||||
|
||||
Version 2.7.0 (2002-09-29):
|
||||
---------------------------
|
||||
- Added embedded test suites
|
||||
- Major internal improvements
|
40
test/cxxtest/cxxtest.spec
Normal file
40
test/cxxtest/cxxtest.spec
Normal file
|
@ -0,0 +1,40 @@
|
|||
Name: cxxtest
|
||||
Summary: CxxTest Testing Framework for C++
|
||||
Version: 3.10.1
|
||||
Release: 1
|
||||
Copyright: LGPL
|
||||
Group: Development/C++
|
||||
Source: cxxtest-%{version}.tar.gz
|
||||
BuildRoot: /tmp/cxxtest-build
|
||||
BuildArch: noarch
|
||||
Prefix: /usr
|
||||
|
||||
%description
|
||||
CxxTest is a JUnit/CppUnit/xUnit-like framework for C++.
|
||||
Its advantages over existing alternatives are that it:
|
||||
- Doesn't require RTTI
|
||||
- Doesn't require member template functions
|
||||
- Doesn't require exception handling
|
||||
- Doesn't require any external libraries (including memory management,
|
||||
file/console I/O, graphics libraries)
|
||||
|
||||
%prep
|
||||
%setup -n cxxtest
|
||||
|
||||
%build
|
||||
|
||||
%install
|
||||
install -m 755 -d $RPM_BUILD_ROOT/usr/bin $RPM_BUILD_ROOT/usr/include/cxxtest
|
||||
install -m 755 cxxtestgen.p[ly] $RPM_BUILD_ROOT/usr/bin/
|
||||
install -m 644 cxxtest/* $RPM_BUILD_ROOT/usr/include/cxxtest/
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%attr(-, root, root) %doc README
|
||||
%attr(-, root, root) %doc sample
|
||||
%attr(-, root, root) /usr/include/cxxtest
|
||||
%attr(-, root, root) /usr/bin/cxxtestgen.pl
|
||||
%attr(-, root, root) /usr/bin/cxxtestgen.py
|
||||
|
58
test/cxxtest/cxxtest/Descriptions.cpp
Normal file
58
test/cxxtest/cxxtest/Descriptions.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#ifndef __cxxtest__Descriptions_cpp__
|
||||
#define __cxxtest__Descriptions_cpp__
|
||||
|
||||
#include <cxxtest/Descriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
TestDescription::~TestDescription() {}
|
||||
SuiteDescription::~SuiteDescription() {}
|
||||
WorldDescription::~WorldDescription() {}
|
||||
|
||||
//
|
||||
// Convert total tests to string
|
||||
//
|
||||
#ifndef _CXXTEST_FACTOR
|
||||
char *WorldDescription::strTotalTests( char *s ) const
|
||||
{
|
||||
numberToString( numTotalTests(), s );
|
||||
return s;
|
||||
}
|
||||
#else // _CXXTEST_FACTOR
|
||||
char *WorldDescription::strTotalTests( char *s ) const
|
||||
{
|
||||
char *p = numberToString( numTotalTests(), s );
|
||||
|
||||
if ( numTotalTests() <= 1 )
|
||||
return s;
|
||||
|
||||
unsigned n = numTotalTests();
|
||||
unsigned numFactors = 0;
|
||||
|
||||
for ( unsigned factor = 2; (factor * factor) <= n; factor += (factor == 2) ? 1 : 2 ) {
|
||||
unsigned power;
|
||||
|
||||
for ( power = 0; (n % factor) == 0; n /= factor )
|
||||
++ power;
|
||||
|
||||
if ( !power )
|
||||
continue;
|
||||
|
||||
p = numberToString( factor, copyString( p, (numFactors == 0) ? " = " : " * " ) );
|
||||
if ( power > 1 )
|
||||
p = numberToString( power, copyString( p, "^" ) );
|
||||
++ numFactors;
|
||||
}
|
||||
|
||||
if ( n > 1 ) {
|
||||
if ( !numFactors )
|
||||
copyString( p, tracker().failedTests() ? " :(" : tracker().warnings() ? " :|" : " :)" );
|
||||
else
|
||||
numberToString( n, copyString( p, " * " ) );
|
||||
}
|
||||
return s;
|
||||
}
|
||||
#endif // _CXXTEST_FACTOR
|
||||
};
|
||||
|
||||
#endif // __cxxtest__Descriptions_cpp__
|
74
test/cxxtest/cxxtest/Descriptions.h
Normal file
74
test/cxxtest/cxxtest/Descriptions.h
Normal file
|
@ -0,0 +1,74 @@
|
|||
#ifndef __cxxtest__Descriptions_h__
|
||||
#define __cxxtest__Descriptions_h__
|
||||
|
||||
//
|
||||
// TestDescription, SuiteDescription and WorldDescription
|
||||
// hold information about tests so they can be run and reported.
|
||||
//
|
||||
|
||||
#include <cxxtest/LinkedList.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TestSuite;
|
||||
|
||||
class TestDescription : public Link
|
||||
{
|
||||
public:
|
||||
virtual ~TestDescription();
|
||||
|
||||
virtual const char *file() const = 0;
|
||||
virtual unsigned line() const = 0;
|
||||
virtual const char *testName() const = 0;
|
||||
virtual const char *suiteName() const = 0;
|
||||
|
||||
virtual void run() = 0;
|
||||
|
||||
virtual const TestDescription *next() const = 0;
|
||||
virtual TestDescription *next() = 0;
|
||||
};
|
||||
|
||||
class SuiteDescription : public Link
|
||||
{
|
||||
public:
|
||||
virtual ~SuiteDescription();
|
||||
|
||||
virtual const char *file() const = 0;
|
||||
virtual unsigned line() const = 0;
|
||||
virtual const char *suiteName() const = 0;
|
||||
virtual TestSuite *suite() const = 0;
|
||||
|
||||
virtual unsigned numTests() const = 0;
|
||||
virtual const TestDescription &testDescription( unsigned /*i*/ ) const = 0;
|
||||
|
||||
virtual TestDescription *firstTest() = 0;
|
||||
virtual const TestDescription *firstTest() const = 0;
|
||||
virtual SuiteDescription *next() = 0;
|
||||
virtual const SuiteDescription *next() const = 0;
|
||||
|
||||
virtual void activateAllTests() = 0;
|
||||
virtual bool leaveOnly( const char * /*testName*/ ) = 0;
|
||||
};
|
||||
|
||||
class WorldDescription : public Link
|
||||
{
|
||||
public:
|
||||
virtual ~WorldDescription();
|
||||
|
||||
virtual unsigned numSuites( void ) const = 0;
|
||||
virtual unsigned numTotalTests( void ) const = 0;
|
||||
virtual const SuiteDescription &suiteDescription( unsigned /*i*/ ) const = 0;
|
||||
|
||||
enum { MAX_STRLEN_TOTAL_TESTS = 32 };
|
||||
char *strTotalTests( char * /*buffer*/ ) const;
|
||||
|
||||
virtual SuiteDescription *firstSuite() = 0;
|
||||
virtual const SuiteDescription *firstSuite() const = 0;
|
||||
|
||||
virtual void activateAllTests() = 0;
|
||||
virtual bool leaveOnly( const char * /*suiteName*/, const char * /*testName*/ = 0 ) = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__Descriptions_h__
|
||||
|
49
test/cxxtest/cxxtest/DummyDescriptions.cpp
Normal file
49
test/cxxtest/cxxtest/DummyDescriptions.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include <cxxtest/DummyDescriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
DummyTestDescription::DummyTestDescription() {}
|
||||
|
||||
const char *DummyTestDescription::file() const { return "<no file>"; }
|
||||
unsigned DummyTestDescription::line() const { return 0; }
|
||||
const char *DummyTestDescription::testName() const { return "<no test>"; }
|
||||
const char *DummyTestDescription::suiteName() const { return "<no suite>"; }
|
||||
bool DummyTestDescription::setUp() { return true;}
|
||||
void DummyTestDescription::run() {}
|
||||
bool DummyTestDescription::tearDown() { return true;}
|
||||
|
||||
TestDescription *DummyTestDescription::next() { return 0; }
|
||||
const TestDescription *DummyTestDescription::next() const { return 0; }
|
||||
|
||||
DummySuiteDescription::DummySuiteDescription() : _test() {}
|
||||
|
||||
const char *DummySuiteDescription::file() const { return "<no file>"; }
|
||||
unsigned DummySuiteDescription::line() const { return 0; }
|
||||
const char *DummySuiteDescription::suiteName() const { return "<no suite>"; }
|
||||
TestSuite *DummySuiteDescription::suite() const { return 0; }
|
||||
unsigned DummySuiteDescription::numTests() const { return 0; }
|
||||
const TestDescription &DummySuiteDescription::testDescription( unsigned ) const { return _test; }
|
||||
SuiteDescription *DummySuiteDescription::next() { return 0; }
|
||||
TestDescription *DummySuiteDescription::firstTest() { return 0; }
|
||||
const SuiteDescription *DummySuiteDescription::next() const { return 0; }
|
||||
const TestDescription *DummySuiteDescription::firstTest() const { return 0; }
|
||||
void DummySuiteDescription::activateAllTests() {}
|
||||
bool DummySuiteDescription::leaveOnly( const char * /*testName*/ ) { return false; }
|
||||
|
||||
bool DummySuiteDescription::setUp() { return true;}
|
||||
bool DummySuiteDescription::tearDown() { return true;}
|
||||
|
||||
DummyWorldDescription::DummyWorldDescription() : _suite() {}
|
||||
|
||||
unsigned DummyWorldDescription::numSuites( void ) const { return 0; }
|
||||
unsigned DummyWorldDescription::numTotalTests( void ) const { return 0; }
|
||||
const SuiteDescription &DummyWorldDescription::suiteDescription( unsigned ) const { return _suite; }
|
||||
SuiteDescription *DummyWorldDescription::firstSuite() { return 0; }
|
||||
const SuiteDescription *DummyWorldDescription::firstSuite() const { return 0; }
|
||||
void DummyWorldDescription::activateAllTests() {}
|
||||
bool DummyWorldDescription::leaveOnly( const char * /*suiteName*/, const char * /*testName*/ ) { return false; }
|
||||
|
||||
bool DummyWorldDescription::setUp() { return true;}
|
||||
bool DummyWorldDescription::tearDown() { return true;}
|
||||
}
|
||||
|
76
test/cxxtest/cxxtest/DummyDescriptions.h
Normal file
76
test/cxxtest/cxxtest/DummyDescriptions.h
Normal file
|
@ -0,0 +1,76 @@
|
|||
#ifndef __cxxtest__DummyDescriptions_h__
|
||||
#define __cxxtest__DummyDescriptions_h__
|
||||
|
||||
//
|
||||
// DummyTestDescription, DummySuiteDescription and DummyWorldDescription
|
||||
//
|
||||
|
||||
#include <cxxtest/Descriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class DummyTestDescription : public TestDescription
|
||||
{
|
||||
public:
|
||||
DummyTestDescription();
|
||||
|
||||
const char *file() const;
|
||||
unsigned line() const;
|
||||
const char *testName() const;
|
||||
const char *suiteName() const;
|
||||
bool setUp();
|
||||
void run();
|
||||
bool tearDown();
|
||||
|
||||
TestDescription *next();
|
||||
const TestDescription *next() const;
|
||||
};
|
||||
|
||||
class DummySuiteDescription : public SuiteDescription
|
||||
{
|
||||
public:
|
||||
DummySuiteDescription();
|
||||
|
||||
const char *file() const;
|
||||
unsigned line() const;
|
||||
const char *suiteName() const;
|
||||
TestSuite *suite() const;
|
||||
unsigned numTests() const;
|
||||
const TestDescription &testDescription( unsigned ) const;
|
||||
SuiteDescription *next();
|
||||
TestDescription *firstTest();
|
||||
const SuiteDescription *next() const;
|
||||
const TestDescription *firstTest() const;
|
||||
void activateAllTests();
|
||||
bool leaveOnly( const char * /*testName*/ );
|
||||
|
||||
bool setUp();
|
||||
bool tearDown();
|
||||
|
||||
private:
|
||||
DummyTestDescription _test;
|
||||
};
|
||||
|
||||
class DummyWorldDescription : public WorldDescription
|
||||
{
|
||||
public:
|
||||
DummyWorldDescription();
|
||||
|
||||
unsigned numSuites( void ) const;
|
||||
unsigned numTotalTests( void ) const;
|
||||
const SuiteDescription &suiteDescription( unsigned ) const;
|
||||
SuiteDescription *firstSuite();
|
||||
const SuiteDescription *firstSuite() const;
|
||||
void activateAllTests();
|
||||
bool leaveOnly( const char * /*suiteName*/, const char * /*testName*/ = 0 );
|
||||
|
||||
bool setUp();
|
||||
bool tearDown();
|
||||
|
||||
private:
|
||||
DummySuiteDescription _suite;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__DummyDescriptions_h__
|
||||
|
281
test/cxxtest/cxxtest/ErrorFormatter.h
Normal file
281
test/cxxtest/cxxtest/ErrorFormatter.h
Normal file
|
@ -0,0 +1,281 @@
|
|||
#ifndef __cxxtest__ErrorFormatter_h__
|
||||
#define __cxxtest__ErrorFormatter_h__
|
||||
|
||||
//
|
||||
// The ErrorFormatter is a TestListener that
|
||||
// prints reports of the errors to an output
|
||||
// stream. Since we cannot rely ou the standard
|
||||
// iostreams, this header defines a base class
|
||||
// analogout to std::ostream.
|
||||
//
|
||||
|
||||
#include <cxxtest/TestRunner.h>
|
||||
#include <cxxtest/TestListener.h>
|
||||
#include <cxxtest/TestTracker.h>
|
||||
#include <cxxtest/ValueTraits.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class OutputStream
|
||||
{
|
||||
public:
|
||||
virtual ~OutputStream() {}
|
||||
virtual void flush() {};
|
||||
virtual OutputStream &operator<<( unsigned /*number*/ ) { return *this; }
|
||||
virtual OutputStream &operator<<( const char * /*string*/ ) { return *this; }
|
||||
|
||||
typedef void (*Manipulator)( OutputStream & );
|
||||
|
||||
virtual OutputStream &operator<<( Manipulator m ) { m( *this ); return *this; }
|
||||
static void endl( OutputStream &o ) { (o << "\n").flush(); }
|
||||
};
|
||||
|
||||
class ErrorFormatter : public TestListener
|
||||
{
|
||||
public:
|
||||
ErrorFormatter( OutputStream *o, const char *preLine = ":", const char *postLine = "" ) :
|
||||
_dotting( true ),
|
||||
_reported( false ),
|
||||
_o(o),
|
||||
_preLine(preLine),
|
||||
_postLine(postLine)
|
||||
{
|
||||
}
|
||||
|
||||
int run()
|
||||
{
|
||||
TestRunner::runAllTests( *this );
|
||||
return tracker().failedTests();
|
||||
}
|
||||
|
||||
void enterWorld( const WorldDescription & /*desc*/ )
|
||||
{
|
||||
(*_o) << "Running " << totalTests;
|
||||
_o->flush();
|
||||
_dotting = true;
|
||||
_reported = false;
|
||||
}
|
||||
|
||||
static void totalTests( OutputStream &o )
|
||||
{
|
||||
char s[WorldDescription::MAX_STRLEN_TOTAL_TESTS];
|
||||
const WorldDescription &wd = tracker().world();
|
||||
o << wd.strTotalTests( s ) << (wd.numTotalTests() == 1 ? " test" : " tests");
|
||||
}
|
||||
|
||||
void enterSuite( const SuiteDescription & )
|
||||
{
|
||||
_reported = false;
|
||||
}
|
||||
|
||||
void enterTest( const TestDescription & )
|
||||
{
|
||||
_reported = false;
|
||||
}
|
||||
|
||||
void leaveTest( const TestDescription & )
|
||||
{
|
||||
if ( !tracker().testFailed() ) {
|
||||
((*_o) << ".").flush();
|
||||
_dotting = true;
|
||||
}
|
||||
}
|
||||
|
||||
void leaveWorld( const WorldDescription &desc )
|
||||
{
|
||||
if ( !tracker().failedTests() ) {
|
||||
(*_o) << "OK!" << endl;
|
||||
return;
|
||||
}
|
||||
newLine();
|
||||
(*_o) << "Failed " << tracker().failedTests() << " of " << totalTests << endl;
|
||||
unsigned numPassed = desc.numTotalTests() - tracker().failedTests();
|
||||
(*_o) << "Success rate: " << (numPassed * 100 / desc.numTotalTests()) << "%" << endl;
|
||||
}
|
||||
|
||||
void trace( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
stop( file, line ) << "Trace: " <<
|
||||
expression << endl;
|
||||
}
|
||||
|
||||
void warning( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
stop( file, line ) << "Warning: " <<
|
||||
expression << endl;
|
||||
}
|
||||
|
||||
void failedTest( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
stop( file, line ) << "Error: Test failed: " <<
|
||||
expression << endl;
|
||||
}
|
||||
|
||||
void failedAssert( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
stop( file, line ) << "Error: Assertion failed: " <<
|
||||
expression << endl;
|
||||
}
|
||||
|
||||
void failedAssertEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" <<
|
||||
xStr << " == " << yStr << "), found (" <<
|
||||
x << " != " << y << ")" << endl;
|
||||
}
|
||||
|
||||
void failedAssertSameData( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *sizeStr, const void *x,
|
||||
const void *y, unsigned size )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected " << sizeStr << " (" << size << ") bytes to be equal at (" <<
|
||||
xStr << ") and (" << yStr << "), found:" << endl;
|
||||
dump( x, size );
|
||||
(*_o) << " differs from" << endl;
|
||||
dump( y, size );
|
||||
}
|
||||
|
||||
void failedAssertDelta( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr, const char *dStr,
|
||||
const char *x, const char *y, const char *d )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" <<
|
||||
xStr << " == " << yStr << ") up to " << dStr << " (" << d << "), found (" <<
|
||||
x << " != " << y << ")" << endl;
|
||||
}
|
||||
|
||||
void failedAssertDiffers( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *value )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" <<
|
||||
xStr << " != " << yStr << "), found (" <<
|
||||
value << ")" << endl;
|
||||
}
|
||||
|
||||
void failedAssertLessThan( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" <<
|
||||
xStr << " < " << yStr << "), found (" <<
|
||||
x << " >= " << y << ")" << endl;
|
||||
}
|
||||
|
||||
void failedAssertLessThanEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" <<
|
||||
xStr << " <= " << yStr << "), found (" <<
|
||||
x << " > " << y << ")" << endl;
|
||||
}
|
||||
|
||||
void failedAssertRelation( const char *file, unsigned line,
|
||||
const char *relation, const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected " << relation << "( " <<
|
||||
xStr << ", " << yStr << " ), found !" << relation << "( " << x << ", " << y << " )" << endl;
|
||||
}
|
||||
|
||||
void failedAssertPredicate( const char *file, unsigned line,
|
||||
const char *predicate, const char *xStr, const char *x )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected " << predicate << "( " <<
|
||||
xStr << " ), found !" << predicate << "( " << x << " )" << endl;
|
||||
}
|
||||
|
||||
void failedAssertThrows( const char *file, unsigned line,
|
||||
const char *expression, const char *type,
|
||||
bool otherThrown )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" << expression << ") to throw (" <<
|
||||
type << ") but it " << (otherThrown ? "threw something else" : "didn't throw") <<
|
||||
endl;
|
||||
}
|
||||
|
||||
void failedAssertThrowsNot( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
stop( file, line ) << "Error: Expected (" << expression << ") not to throw, but it did" <<
|
||||
endl;
|
||||
}
|
||||
|
||||
protected:
|
||||
OutputStream *outputStream() const
|
||||
{
|
||||
return _o;
|
||||
}
|
||||
|
||||
private:
|
||||
ErrorFormatter( const ErrorFormatter & );
|
||||
ErrorFormatter &operator=( const ErrorFormatter & );
|
||||
|
||||
OutputStream &stop( const char *file, unsigned line )
|
||||
{
|
||||
newLine();
|
||||
reportTest();
|
||||
return (*_o) << file << _preLine << line << _postLine << ": ";
|
||||
}
|
||||
|
||||
void newLine( void )
|
||||
{
|
||||
if ( _dotting ) {
|
||||
(*_o) << endl;
|
||||
_dotting = false;
|
||||
}
|
||||
}
|
||||
|
||||
void reportTest( void )
|
||||
{
|
||||
if( _reported )
|
||||
return;
|
||||
(*_o) << "In " << tracker().suite().suiteName() << "::" << tracker().test().testName() << ":" << endl;
|
||||
_reported = true;
|
||||
}
|
||||
|
||||
void dump( const void *buffer, unsigned size )
|
||||
{
|
||||
if ( !buffer )
|
||||
dumpNull();
|
||||
else
|
||||
dumpBuffer( buffer, size );
|
||||
}
|
||||
|
||||
void dumpNull()
|
||||
{
|
||||
(*_o) << " (null)" << endl;
|
||||
}
|
||||
|
||||
void dumpBuffer( const void *buffer, unsigned size )
|
||||
{
|
||||
unsigned dumpSize = size;
|
||||
if ( maxDumpSize() && dumpSize > maxDumpSize() )
|
||||
dumpSize = maxDumpSize();
|
||||
|
||||
const unsigned char *p = (const unsigned char *)buffer;
|
||||
(*_o) << " { ";
|
||||
for ( unsigned i = 0; i < dumpSize; ++ i )
|
||||
(*_o) << byteToHex( *p++ ) << " ";
|
||||
if ( dumpSize < size )
|
||||
(*_o) << "... ";
|
||||
(*_o) << "}" << endl;
|
||||
}
|
||||
|
||||
static void endl( OutputStream &o )
|
||||
{
|
||||
OutputStream::endl( o );
|
||||
}
|
||||
|
||||
bool _dotting;
|
||||
bool _reported;
|
||||
OutputStream *_o;
|
||||
const char *_preLine;
|
||||
const char *_postLine;
|
||||
};
|
||||
};
|
||||
|
||||
#endif // __cxxtest__ErrorFormatter_h__
|
55
test/cxxtest/cxxtest/ErrorPrinter.h
Normal file
55
test/cxxtest/cxxtest/ErrorPrinter.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
#ifndef __cxxtest__ErrorPrinter_h__
|
||||
#define __cxxtest__ErrorPrinter_h__
|
||||
|
||||
//
|
||||
// The ErrorPrinter is a simple TestListener that
|
||||
// just prints "OK" if everything goes well, otherwise
|
||||
// reports the error in the format of compiler messages.
|
||||
// The ErrorPrinter uses std::cout
|
||||
//
|
||||
|
||||
#include <cxxtest/Flags.h>
|
||||
|
||||
#ifndef _CXXTEST_HAVE_STD
|
||||
# define _CXXTEST_HAVE_STD
|
||||
#endif // _CXXTEST_HAVE_STD
|
||||
|
||||
#include <cxxtest/ErrorFormatter.h>
|
||||
#include <cxxtest/StdValueTraits.h>
|
||||
|
||||
#ifdef _CXXTEST_OLD_STD
|
||||
# include <iostream.h>
|
||||
#else // !_CXXTEST_OLD_STD
|
||||
# include <iostream>
|
||||
#endif // _CXXTEST_OLD_STD
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class ErrorPrinter : public ErrorFormatter
|
||||
{
|
||||
public:
|
||||
ErrorPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char *preLine = ":", const char *postLine = "" ) :
|
||||
ErrorFormatter( new Adapter(o), preLine, postLine ) {}
|
||||
virtual ~ErrorPrinter() { delete outputStream(); }
|
||||
|
||||
private:
|
||||
class Adapter : public OutputStream
|
||||
{
|
||||
CXXTEST_STD(ostream) &_o;
|
||||
public:
|
||||
Adapter( CXXTEST_STD(ostream) &o ) : _o(o) {}
|
||||
void flush() { _o.flush(); }
|
||||
OutputStream &operator<<( const char *s ) { _o << s; return *this; }
|
||||
OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); }
|
||||
OutputStream &operator<<( unsigned i )
|
||||
{
|
||||
char s[1 + 3 * sizeof(unsigned)];
|
||||
numberToString( i, s );
|
||||
_o << s;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__ErrorPrinter_h__
|
121
test/cxxtest/cxxtest/Flags.h
Normal file
121
test/cxxtest/cxxtest/Flags.h
Normal file
|
@ -0,0 +1,121 @@
|
|||
#ifndef __cxxtest__Flags_h__
|
||||
#define __cxxtest__Flags_h__
|
||||
|
||||
//
|
||||
// These are the flags that control CxxTest
|
||||
//
|
||||
|
||||
#if !defined(CXXTEST_FLAGS)
|
||||
# define CXXTEST_FLAGS
|
||||
#endif // !CXXTEST_FLAGS
|
||||
|
||||
#if defined(CXXTEST_HAVE_EH) && !defined(_CXXTEST_HAVE_EH)
|
||||
# define _CXXTEST_HAVE_EH
|
||||
#endif // CXXTEST_HAVE_EH
|
||||
|
||||
#if defined(CXXTEST_HAVE_STD) && !defined(_CXXTEST_HAVE_STD)
|
||||
# define _CXXTEST_HAVE_STD
|
||||
#endif // CXXTEST_HAVE_STD
|
||||
|
||||
#if defined(CXXTEST_OLD_TEMPLATE_SYNTAX) && !defined(_CXXTEST_OLD_TEMPLATE_SYNTAX)
|
||||
# define _CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
#endif // CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
|
||||
#if defined(CXXTEST_OLD_STD) && !defined(_CXXTEST_OLD_STD)
|
||||
# define _CXXTEST_OLD_STD
|
||||
#endif // CXXTEST_OLD_STD
|
||||
|
||||
#if defined(CXXTEST_ABORT_TEST_ON_FAIL) && !defined(_CXXTEST_ABORT_TEST_ON_FAIL)
|
||||
# define _CXXTEST_ABORT_TEST_ON_FAIL
|
||||
#endif // CXXTEST_ABORT_TEST_ON_FAIL
|
||||
|
||||
#if defined(CXXTEST_NO_COPY_CONST) && !defined(_CXXTEST_NO_COPY_CONST)
|
||||
# define _CXXTEST_NO_COPY_CONST
|
||||
#endif // CXXTEST_NO_COPY_CONST
|
||||
|
||||
#if defined(CXXTEST_FACTOR) && !defined(_CXXTEST_FACTOR)
|
||||
# define _CXXTEST_FACTOR
|
||||
#endif // CXXTEST_FACTOR
|
||||
|
||||
#if defined(CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION) && !defined(_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION)
|
||||
# define _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
#endif // CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
|
||||
#if defined(CXXTEST_LONGLONG)
|
||||
# if defined(_CXXTEST_LONGLONG)
|
||||
# undef _CXXTEST_LONGLONG
|
||||
# endif
|
||||
# define _CXXTEST_LONGLONG CXXTEST_LONGLONG
|
||||
#endif // CXXTEST_LONGLONG
|
||||
|
||||
#ifndef CXXTEST_MAX_DUMP_SIZE
|
||||
# define CXXTEST_MAX_DUMP_SIZE 0
|
||||
#endif // CXXTEST_MAX_DUMP_SIZE
|
||||
|
||||
#if defined(_CXXTEST_ABORT_TEST_ON_FAIL) && !defined(CXXTEST_DEFAULT_ABORT)
|
||||
# define CXXTEST_DEFAULT_ABORT true
|
||||
#endif // _CXXTEST_ABORT_TEST_ON_FAIL && !CXXTEST_DEFAULT_ABORT
|
||||
|
||||
#if !defined(CXXTEST_DEFAULT_ABORT)
|
||||
# define CXXTEST_DEFAULT_ABORT false
|
||||
#endif // !CXXTEST_DEFAULT_ABORT
|
||||
|
||||
#if defined(_CXXTEST_ABORT_TEST_ON_FAIL) && !defined(_CXXTEST_HAVE_EH)
|
||||
# warning "CXXTEST_ABORT_TEST_ON_FAIL is meaningless without CXXTEST_HAVE_EH"
|
||||
# undef _CXXTEST_ABORT_TEST_ON_FAIL
|
||||
#endif // _CXXTEST_ABORT_TEST_ON_FAIL && !_CXXTEST_HAVE_EH
|
||||
|
||||
//
|
||||
// Some minimal per-compiler configuration to allow us to compile
|
||||
//
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
# if __BORLANDC__ <= 0x520 // Borland C++ 5.2 or earlier
|
||||
# ifndef _CXXTEST_OLD_STD
|
||||
# define _CXXTEST_OLD_STD
|
||||
# endif
|
||||
# ifndef _CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
# define _CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
# endif
|
||||
# endif
|
||||
# if __BORLANDC__ >= 0x540 // C++ Builder 4.0 or later
|
||||
# ifndef _CXXTEST_NO_COPY_CONST
|
||||
# define _CXXTEST_NO_COPY_CONST
|
||||
# endif
|
||||
# ifndef _CXXTEST_LONGLONG
|
||||
# define _CXXTEST_LONGLONG __int64
|
||||
# endif
|
||||
# endif
|
||||
#endif // __BORLANDC__
|
||||
|
||||
#ifdef _MSC_VER // Visual C++
|
||||
# ifndef _CXXTEST_LONGLONG
|
||||
# define _CXXTEST_LONGLONG __int64
|
||||
# endif
|
||||
# if (_MSC_VER >= 0x51E)
|
||||
# ifndef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
# define _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
# endif
|
||||
# endif
|
||||
# pragma warning( disable : 4127 )
|
||||
# pragma warning( disable : 4290 )
|
||||
# pragma warning( disable : 4511 )
|
||||
# pragma warning( disable : 4512 )
|
||||
# pragma warning( disable : 4514 )
|
||||
#endif // _MSC_VER
|
||||
|
||||
#ifdef __GNUC__
|
||||
# if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 9)
|
||||
# ifndef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
# define _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
# endif
|
||||
# endif
|
||||
#endif // __GNUC__
|
||||
|
||||
#ifdef __DMC__ // Digital Mars
|
||||
# ifndef _CXXTEST_OLD_STD
|
||||
# define _CXXTEST_OLD_STD
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif // __cxxtest__Flags_h__
|
23
test/cxxtest/cxxtest/GlobalFixture.cpp
Normal file
23
test/cxxtest/cxxtest/GlobalFixture.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef __cxxtest__GlobalFixture_cpp__
|
||||
#define __cxxtest__GlobalFixture_cpp__
|
||||
|
||||
#include <cxxtest/GlobalFixture.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
bool GlobalFixture::setUpWorld() { return true; }
|
||||
bool GlobalFixture::tearDownWorld() { return true; }
|
||||
bool GlobalFixture::setUp() { return true; }
|
||||
bool GlobalFixture::tearDown() { return true; }
|
||||
|
||||
GlobalFixture::GlobalFixture() { attach( _list ); }
|
||||
GlobalFixture::~GlobalFixture() { detach( _list ); }
|
||||
|
||||
GlobalFixture *GlobalFixture::firstGlobalFixture() { return (GlobalFixture *)_list.head(); }
|
||||
GlobalFixture *GlobalFixture::lastGlobalFixture() { return (GlobalFixture *)_list.tail(); }
|
||||
GlobalFixture *GlobalFixture::nextGlobalFixture() { return (GlobalFixture *)next(); }
|
||||
GlobalFixture *GlobalFixture::prevGlobalFixture() { return (GlobalFixture *)prev(); }
|
||||
}
|
||||
|
||||
#endif // __cxxtest__GlobalFixture_cpp__
|
||||
|
30
test/cxxtest/cxxtest/GlobalFixture.h
Normal file
30
test/cxxtest/cxxtest/GlobalFixture.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef __cxxtest__GlobalFixture_h__
|
||||
#define __cxxtest__GlobalFixture_h__
|
||||
|
||||
#include <cxxtest/LinkedList.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class GlobalFixture : public Link
|
||||
{
|
||||
public:
|
||||
virtual bool setUpWorld();
|
||||
virtual bool tearDownWorld();
|
||||
virtual bool setUp();
|
||||
virtual bool tearDown();
|
||||
|
||||
GlobalFixture();
|
||||
~GlobalFixture();
|
||||
|
||||
static GlobalFixture *firstGlobalFixture();
|
||||
static GlobalFixture *lastGlobalFixture();
|
||||
GlobalFixture *nextGlobalFixture();
|
||||
GlobalFixture *prevGlobalFixture();
|
||||
|
||||
private:
|
||||
static List _list;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__GlobalFixture_h__
|
||||
|
178
test/cxxtest/cxxtest/Gui.h
Normal file
178
test/cxxtest/cxxtest/Gui.h
Normal file
|
@ -0,0 +1,178 @@
|
|||
#ifndef __CXXTEST__GUI_H
|
||||
#define __CXXTEST__GUI_H
|
||||
|
||||
//
|
||||
// GuiListener is a simple base class for the differes GUIs
|
||||
// GuiTuiRunner<GuiT, TuiT> combines a GUI with a text-mode error formatter
|
||||
//
|
||||
|
||||
#include <cxxtest/TeeListener.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class GuiListener : public TestListener
|
||||
{
|
||||
public:
|
||||
GuiListener() : _state( GREEN_BAR ) {}
|
||||
virtual ~GuiListener() {}
|
||||
|
||||
virtual void runGui( int &argc, char **argv, TestListener &listener )
|
||||
{
|
||||
enterGui( argc, argv );
|
||||
TestRunner::runAllTests( listener );
|
||||
leaveGui();
|
||||
}
|
||||
|
||||
virtual void enterGui( int & /*argc*/, char ** /*argv*/ ) {}
|
||||
virtual void leaveGui() {}
|
||||
|
||||
//
|
||||
// The easy way is to implement these functions:
|
||||
//
|
||||
virtual void guiEnterWorld( unsigned /*numTotalTests*/ ) {}
|
||||
virtual void guiEnterSuite( const char * /*suiteName*/ ) {}
|
||||
virtual void guiEnterTest( const char * /*suiteName*/, const char * /*testName*/ ) {}
|
||||
virtual void yellowBar() {}
|
||||
virtual void redBar() {}
|
||||
|
||||
//
|
||||
// The hard way is this:
|
||||
//
|
||||
void enterWorld( const WorldDescription &d ) { guiEnterWorld( d.numTotalTests() ); }
|
||||
void enterSuite( const SuiteDescription &d ) { guiEnterSuite( d.suiteName() ); }
|
||||
void enterTest( const TestDescription &d ) { guiEnterTest( d.suiteName(), d.testName() ); }
|
||||
void leaveTest( const TestDescription & ) {}
|
||||
void leaveSuite( const SuiteDescription & ) {}
|
||||
void leaveWorld( const WorldDescription & ) {}
|
||||
|
||||
void warning( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
|
||||
{
|
||||
yellowBarSafe();
|
||||
}
|
||||
|
||||
void failedTest( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssert( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertEquals( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertSameData( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*sizeStr*/, const void * /*x*/,
|
||||
const void * /*y*/, unsigned /*size*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertDelta( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/, const char * /*dStr*/,
|
||||
const char * /*x*/, const char * /*y*/, const char * /*d*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertDiffers( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*value*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertLessThan( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertLessThanEquals( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertPredicate( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertRelation( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertThrows( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/, const char * /*type*/,
|
||||
bool /*otherThrown*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
void failedAssertThrowsNot( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ )
|
||||
{
|
||||
redBarSafe();
|
||||
}
|
||||
|
||||
protected:
|
||||
void yellowBarSafe()
|
||||
{
|
||||
if ( _state < YELLOW_BAR ) {
|
||||
yellowBar();
|
||||
_state = YELLOW_BAR;
|
||||
}
|
||||
}
|
||||
|
||||
void redBarSafe()
|
||||
{
|
||||
if ( _state < RED_BAR ) {
|
||||
redBar();
|
||||
_state = RED_BAR;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;
|
||||
};
|
||||
|
||||
template<class GuiT, class TuiT>
|
||||
class GuiTuiRunner : public TeeListener
|
||||
{
|
||||
int &_argc;
|
||||
char **_argv;
|
||||
GuiT _gui;
|
||||
TuiT _tui;
|
||||
|
||||
public:
|
||||
GuiTuiRunner( int &argc, char **argv ) :
|
||||
_argc( argc ),
|
||||
_argv( argv )
|
||||
{
|
||||
setFirst( _gui );
|
||||
setSecond( _tui );
|
||||
}
|
||||
|
||||
int run()
|
||||
{
|
||||
_gui.runGui( _argc, _argv, *this );
|
||||
return tracker().failedTests();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
#endif //__CXXTEST__GUI_H
|
172
test/cxxtest/cxxtest/LinkedList.cpp
Normal file
172
test/cxxtest/cxxtest/LinkedList.cpp
Normal file
|
@ -0,0 +1,172 @@
|
|||
#ifndef __cxxtest__LinkedList_cpp__
|
||||
#define __cxxtest__LinkedList_cpp__
|
||||
|
||||
#include <cxxtest/LinkedList.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
List GlobalFixture::_list = { 0, 0 };
|
||||
List RealSuiteDescription::_suites = { 0, 0 };
|
||||
|
||||
void List::initialize()
|
||||
{
|
||||
_head = _tail = 0;
|
||||
}
|
||||
|
||||
Link *List::head()
|
||||
{
|
||||
Link *l = _head;
|
||||
while ( l && !l->active() )
|
||||
l = l->next();
|
||||
return l;
|
||||
}
|
||||
|
||||
const Link *List::head() const
|
||||
{
|
||||
Link *l = _head;
|
||||
while ( l && !l->active() )
|
||||
l = l->next();
|
||||
return l;
|
||||
}
|
||||
|
||||
Link *List::tail()
|
||||
{
|
||||
Link *l = _tail;
|
||||
while ( l && !l->active() )
|
||||
l = l->prev();
|
||||
return l;
|
||||
}
|
||||
|
||||
const Link *List::tail() const
|
||||
{
|
||||
Link *l = _tail;
|
||||
while ( l && !l->active() )
|
||||
l = l->prev();
|
||||
return l;
|
||||
}
|
||||
|
||||
bool List::empty() const
|
||||
{
|
||||
return (_head == 0);
|
||||
}
|
||||
|
||||
unsigned List::size() const
|
||||
{
|
||||
unsigned count = 0;
|
||||
for ( const Link *l = head(); l != 0; l = l->next() )
|
||||
++ count;
|
||||
return count;
|
||||
}
|
||||
|
||||
Link *List::nth( unsigned n )
|
||||
{
|
||||
Link *l = head();
|
||||
while ( n -- )
|
||||
l = l->next();
|
||||
return l;
|
||||
}
|
||||
|
||||
void List::activateAll()
|
||||
{
|
||||
for ( Link *l = _head; l != 0; l = l->justNext() )
|
||||
l->setActive( true );
|
||||
}
|
||||
|
||||
void List::leaveOnly( const Link &link )
|
||||
{
|
||||
for ( Link *l = head(); l != 0; l = l->next() )
|
||||
if ( l != &link )
|
||||
l->setActive( false );
|
||||
}
|
||||
|
||||
Link::Link() :
|
||||
_next( 0 ),
|
||||
_prev( 0 ),
|
||||
_active( true )
|
||||
{
|
||||
}
|
||||
|
||||
Link::~Link()
|
||||
{
|
||||
}
|
||||
|
||||
bool Link::active() const
|
||||
{
|
||||
return _active;
|
||||
}
|
||||
|
||||
void Link::setActive( bool value )
|
||||
{
|
||||
_active = value;
|
||||
}
|
||||
|
||||
Link * Link::justNext()
|
||||
{
|
||||
return _next;
|
||||
}
|
||||
|
||||
Link * Link::justPrev()
|
||||
{
|
||||
return _prev;
|
||||
}
|
||||
|
||||
Link * Link::next()
|
||||
{
|
||||
Link *l = _next;
|
||||
while ( l && !l->_active )
|
||||
l = l->_next;
|
||||
return l;
|
||||
}
|
||||
|
||||
Link * Link::prev()
|
||||
{
|
||||
Link *l = _prev;
|
||||
while ( l && !l->_active )
|
||||
l = l->_prev;
|
||||
return l;
|
||||
}
|
||||
|
||||
const Link * Link::next() const
|
||||
{
|
||||
Link *l = _next;
|
||||
while ( l && !l->_active )
|
||||
l = l->_next;
|
||||
return l;
|
||||
}
|
||||
|
||||
const Link * Link::prev() const
|
||||
{
|
||||
Link *l = _prev;
|
||||
while ( l && !l->_active )
|
||||
l = l->_prev;
|
||||
return l;
|
||||
}
|
||||
|
||||
void Link::attach( List &l )
|
||||
{
|
||||
if ( l._tail )
|
||||
l._tail->_next = this;
|
||||
|
||||
_prev = l._tail;
|
||||
_next = 0;
|
||||
|
||||
if ( l._head == 0 )
|
||||
l._head = this;
|
||||
l._tail = this;
|
||||
}
|
||||
|
||||
void Link::detach( List &l )
|
||||
{
|
||||
if ( _prev )
|
||||
_prev->_next = _next;
|
||||
else
|
||||
l._head = _next;
|
||||
|
||||
if ( _next )
|
||||
_next->_prev = _prev;
|
||||
else
|
||||
l._tail = _prev;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __cxxtest__LinkedList_cpp__
|
65
test/cxxtest/cxxtest/LinkedList.h
Normal file
65
test/cxxtest/cxxtest/LinkedList.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
#ifndef __cxxtest__LinkedList_h__
|
||||
#define __cxxtest__LinkedList_h__
|
||||
|
||||
#include <cxxtest/Flags.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
struct List;
|
||||
class Link;
|
||||
|
||||
struct List
|
||||
{
|
||||
Link *_head;
|
||||
Link *_tail;
|
||||
|
||||
void initialize();
|
||||
|
||||
Link *head();
|
||||
const Link *head() const;
|
||||
Link *tail();
|
||||
const Link *tail() const;
|
||||
|
||||
bool empty() const;
|
||||
unsigned size() const;
|
||||
Link *nth( unsigned n );
|
||||
|
||||
void activateAll();
|
||||
void leaveOnly( const Link &link );
|
||||
};
|
||||
|
||||
class Link
|
||||
{
|
||||
public:
|
||||
Link();
|
||||
virtual ~Link();
|
||||
|
||||
bool active() const;
|
||||
void setActive( bool value = true );
|
||||
|
||||
Link *justNext();
|
||||
Link *justPrev();
|
||||
|
||||
Link *next();
|
||||
Link *prev();
|
||||
const Link *next() const;
|
||||
const Link *prev() const;
|
||||
|
||||
virtual bool setUp() = 0;
|
||||
virtual bool tearDown() = 0;
|
||||
|
||||
void attach( List &l );
|
||||
void detach( List &l );
|
||||
|
||||
private:
|
||||
Link *_next;
|
||||
Link *_prev;
|
||||
bool _active;
|
||||
|
||||
Link( const Link & );
|
||||
Link &operator=( const Link & );
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__LinkedList_h__
|
||||
|
350
test/cxxtest/cxxtest/Mock.h
Normal file
350
test/cxxtest/cxxtest/Mock.h
Normal file
|
@ -0,0 +1,350 @@
|
|||
#ifndef __cxxtest__Mock_h__
|
||||
#define __cxxtest__Mock_h__
|
||||
|
||||
//
|
||||
// The default namespace is T::
|
||||
//
|
||||
#ifndef CXXTEST_MOCK_NAMESPACE
|
||||
# define CXXTEST_MOCK_NAMESPACE T
|
||||
#endif // CXXTEST_MOCK_NAMESPACE
|
||||
|
||||
//
|
||||
// MockTraits: What to return when no mock object has been created
|
||||
//
|
||||
#define __CXXTEST_MOCK__TRAITS \
|
||||
namespace CXXTEST_MOCK_NAMESPACE \
|
||||
{ \
|
||||
template<class T> \
|
||||
class MockTraits \
|
||||
{ \
|
||||
public: \
|
||||
static T defaultValue() { return 0; } \
|
||||
}; \
|
||||
};
|
||||
|
||||
//
|
||||
// extern "C" when needed
|
||||
//
|
||||
#ifdef __cplusplus
|
||||
# define CXXTEST_EXTERN_C extern "C"
|
||||
#else
|
||||
# define CXXTEST_EXTERN_C
|
||||
#endif // __cplusplus
|
||||
|
||||
//
|
||||
// Prototypes: For "normal" headers
|
||||
//
|
||||
#define __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS; }
|
||||
|
||||
#define __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
TYPE REAL ARGS;
|
||||
|
||||
#define __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
|
||||
|
||||
//
|
||||
// Class declarations: For test files
|
||||
//
|
||||
#define __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
class Base_##MOCK : public CxxTest::Link \
|
||||
{ \
|
||||
public: \
|
||||
Base_##MOCK(); \
|
||||
~Base_##MOCK(); \
|
||||
bool setUp(); \
|
||||
bool tearDown(); \
|
||||
\
|
||||
static Base_##MOCK ¤t(); \
|
||||
\
|
||||
virtual TYPE NAME ARGS = 0; \
|
||||
\
|
||||
private: \
|
||||
static CxxTest::List _list; \
|
||||
}; \
|
||||
\
|
||||
class Real_##MOCK : public Base_##MOCK \
|
||||
{ \
|
||||
public: \
|
||||
TYPE NAME ARGS; \
|
||||
}; \
|
||||
\
|
||||
class _Unimplemented_##MOCK : public Base_##MOCK \
|
||||
{ \
|
||||
public: \
|
||||
TYPE NAME ARGS; \
|
||||
}; \
|
||||
}
|
||||
|
||||
#define __CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
class Base_##MOCK : public CxxTest::Link \
|
||||
{ \
|
||||
public: \
|
||||
Base_##MOCK(); \
|
||||
~Base_##MOCK(); \
|
||||
bool setUp(); \
|
||||
bool tearDown(); \
|
||||
\
|
||||
static Base_##MOCK ¤t(); \
|
||||
\
|
||||
virtual TYPE NAME ARGS = 0; \
|
||||
\
|
||||
private: \
|
||||
static CxxTest::List _list; \
|
||||
}; \
|
||||
\
|
||||
class _Unimplemented_##MOCK : public Base_##MOCK \
|
||||
{ \
|
||||
public: \
|
||||
TYPE NAME ARGS; \
|
||||
}; \
|
||||
}
|
||||
|
||||
#define __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
|
||||
|
||||
//
|
||||
// Class implementation: For test source files
|
||||
//
|
||||
#define __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
\
|
||||
CxxTest::List Base_##MOCK::_list = { 0, 0 }; \
|
||||
\
|
||||
Base_##MOCK::Base_##MOCK() { attach( _list ); } \
|
||||
Base_##MOCK::~Base_##MOCK() { detach( _list ); } \
|
||||
bool Base_##MOCK::setUp() { return true; } \
|
||||
bool Base_##MOCK::tearDown() { return true; } \
|
||||
\
|
||||
Base_##MOCK &Base_##MOCK::current() \
|
||||
{ \
|
||||
if ( _list.empty() ) \
|
||||
static _Unimplemented_##MOCK unimplemented; \
|
||||
return *(Base_##MOCK *)_list.tail(); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define __CXXTEST_MOCK__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
TYPE Real_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
return REAL CALL; \
|
||||
} \
|
||||
\
|
||||
TYPE _Unimplemented_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
while ( false ) \
|
||||
return NAME CALL; \
|
||||
__CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
|
||||
return MockTraits<TYPE>::defaultValue(); \
|
||||
} \
|
||||
\
|
||||
TYPE NAME ARGS \
|
||||
{ \
|
||||
return Base_##MOCK::current().NAME CALL; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define __CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
void Real_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
REAL CALL; \
|
||||
} \
|
||||
\
|
||||
void _Unimplemented_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
while ( false ) \
|
||||
NAME CALL; \
|
||||
__CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
|
||||
} \
|
||||
\
|
||||
void NAME ARGS \
|
||||
{ \
|
||||
Base_##MOCK::current().NAME CALL; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define __CXXTEST_SUPPLY__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
TYPE _Unimplemented_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
while ( false ) \
|
||||
return NAME CALL; \
|
||||
__CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
|
||||
return MockTraits<TYPE>::defaultValue(); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
TYPE REAL ARGS \
|
||||
{ \
|
||||
return CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
|
||||
}
|
||||
|
||||
#define __CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { \
|
||||
void _Unimplemented_##MOCK::NAME ARGS \
|
||||
{ \
|
||||
while ( false ) \
|
||||
NAME CALL; \
|
||||
__CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
void REAL ARGS \
|
||||
{ \
|
||||
CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
|
||||
} \
|
||||
|
||||
//
|
||||
// Error for calling mock function w/o object
|
||||
//
|
||||
#define __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ) \
|
||||
TS_FAIL( CXXTEST_MOCK_NAMESPACE_STR #NAME #ARGS " called with no " \
|
||||
CXXTEST_MOCK_NAMESPACE_STR "Base_" #NAME " object" ); \
|
||||
|
||||
#define CXXTEST_MOCK_NAMESPACE_STR __CXXTEST_STR(CXXTEST_MOCK_NAMESPACE) "::"
|
||||
#define __CXXTEST_STR(X) __CXXTEST_XSTR(X)
|
||||
#define __CXXTEST_XSTR(X) #X
|
||||
|
||||
#if defined(CXXTEST_MOCK_TEST_SOURCE_FILE)
|
||||
//
|
||||
// Test source file: Prototypes, class declarations and implementation
|
||||
//
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
__CXXTEST_MOCK__TRAITS;
|
||||
|
||||
#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#elif defined(CXXTEST_FLAGS) || defined(CXXTEST_RUNNING)
|
||||
//
|
||||
// Test file other than source: Prototypes and class declarations
|
||||
//
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
__CXXTEST_MOCK__TRAITS;
|
||||
|
||||
#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#elif defined(CXXTEST_MOCK_REAL_SOURCE_FILE)
|
||||
//
|
||||
// Real source file: "Real" implementations
|
||||
//
|
||||
#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS { return REAL CALL; } }
|
||||
|
||||
#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE { void NAME ARGS { REAL CALL; } }
|
||||
|
||||
#else
|
||||
//
|
||||
// Ordinary header file: Just prototypes
|
||||
//
|
||||
|
||||
#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
__CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#endif // Ordinary header file
|
||||
|
||||
//
|
||||
// How to supply extern "C" functions
|
||||
//
|
||||
#define CXXTEST_SUPPLY_C( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
CXXTEST_EXTERN_C __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
|
||||
CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID_C( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
CXXTEST_EXTERN_C __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
|
||||
CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL )
|
||||
|
||||
//
|
||||
// Usually we mean the global namespace
|
||||
//
|
||||
#define CXXTEST_MOCK_GLOBAL( TYPE, NAME, ARGS, CALL ) \
|
||||
CXXTEST_MOCK( NAME, TYPE, NAME, ARGS, ::NAME, CALL )
|
||||
|
||||
#define CXXTEST_MOCK_VOID_GLOBAL( NAME, ARGS, CALL ) \
|
||||
CXXTEST_MOCK_VOID( NAME, NAME, ARGS, ::NAME, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_GLOBAL( TYPE, NAME, ARGS, CALL ) \
|
||||
CXXTEST_SUPPLY( NAME, TYPE, NAME, ARGS, NAME, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID_GLOBAL( NAME, ARGS, CALL ) \
|
||||
CXXTEST_SUPPLY_VOID( NAME, NAME, ARGS, NAME, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_GLOBAL_C( TYPE, NAME, ARGS, CALL ) \
|
||||
CXXTEST_SUPPLY_C( NAME, TYPE, NAME, ARGS, NAME, CALL )
|
||||
|
||||
#define CXXTEST_SUPPLY_VOID_GLOBAL_C( NAME, ARGS, CALL ) \
|
||||
CXXTEST_SUPPLY_VOID_C( NAME, NAME, ARGS, NAME, CALL )
|
||||
|
||||
//
|
||||
// What to return when no mock object has been created.
|
||||
// The default value of 0 usually works, but some cases may need this.
|
||||
//
|
||||
#define CXXTEST_MOCK_DEFAULT_VALUE( TYPE, VALUE ) \
|
||||
namespace CXXTEST_MOCK_NAMESPACE \
|
||||
{ \
|
||||
template<> \
|
||||
class MockTraits<TYPE> \
|
||||
{ \
|
||||
public: \
|
||||
static TYPE defaultValue() { return VALUE; } \
|
||||
}; \
|
||||
}
|
||||
|
||||
#endif // __cxxtest__Mock_h__
|
21
test/cxxtest/cxxtest/ParenPrinter.h
Normal file
21
test/cxxtest/cxxtest/ParenPrinter.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
#ifndef __cxxtest__ParenPrinter_h__
|
||||
#define __cxxtest__ParenPrinter_h__
|
||||
|
||||
//
|
||||
// The ParenPrinter is identical to the ErrorPrinter, except it
|
||||
// prints the line number in a format expected by some compilers
|
||||
// (notably, MSVC).
|
||||
//
|
||||
|
||||
#include <cxxtest/ErrorPrinter.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class ParenPrinter : public ErrorPrinter
|
||||
{
|
||||
public:
|
||||
ParenPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout) ) : ErrorPrinter( o, "(", ")" ) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__ParenPrinter_h__
|
271
test/cxxtest/cxxtest/QtGui.h
Normal file
271
test/cxxtest/cxxtest/QtGui.h
Normal file
|
@ -0,0 +1,271 @@
|
|||
#ifndef __cxxtest__QtGui_h__
|
||||
#define __cxxtest__QtGui_h__
|
||||
|
||||
//
|
||||
// The QtGui displays a simple progress bar using the Qt Toolkit. It
|
||||
// has been tested with versions 2.x and 3.x.
|
||||
//
|
||||
// Apart from normal Qt command-line arguments, it accepts the following options:
|
||||
// -minimized Start minimized, pop up on error
|
||||
// -keep Don't close the window at the end
|
||||
// -title TITLE Set the window caption
|
||||
//
|
||||
// If both are -minimized and -keep specified, GUI will only keep the
|
||||
// window if it's in focus.
|
||||
//
|
||||
|
||||
#include <cxxtest/Gui.h>
|
||||
|
||||
#include <qapplication.h>
|
||||
#include <qglobal.h>
|
||||
#include <qlabel.h>
|
||||
#include <qlayout.h>
|
||||
#include <qmessagebox.h>
|
||||
#include <qpixmap.h>
|
||||
#include <qprogressbar.h>
|
||||
#include <qstatusbar.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class QtGui : public GuiListener
|
||||
{
|
||||
public:
|
||||
void enterGui( int &argc, char **argv )
|
||||
{
|
||||
parseCommandLine( argc, argv );
|
||||
createApplication( argc, argv );
|
||||
}
|
||||
|
||||
void enterWorld( const WorldDescription &wd )
|
||||
{
|
||||
createWindow( wd );
|
||||
processEvents();
|
||||
}
|
||||
|
||||
void guiEnterSuite( const char *suiteName )
|
||||
{
|
||||
showSuiteName( suiteName );
|
||||
}
|
||||
|
||||
void guiEnterTest( const char *suiteName, const char *testName )
|
||||
{
|
||||
setCaption( suiteName, testName );
|
||||
advanceProgressBar();
|
||||
showTestName( testName );
|
||||
showTestsDone( _progressBar->progress() );
|
||||
processEvents();
|
||||
}
|
||||
|
||||
void yellowBar()
|
||||
{
|
||||
setColor( 255, 255, 0 );
|
||||
setIcon( QMessageBox::Warning );
|
||||
getTotalTests();
|
||||
processEvents();
|
||||
}
|
||||
|
||||
void redBar()
|
||||
{
|
||||
if ( _startMinimized && _mainWindow->isMinimized() )
|
||||
showNormal();
|
||||
setColor( 255, 0, 0 );
|
||||
setIcon( QMessageBox::Critical );
|
||||
getTotalTests();
|
||||
processEvents();
|
||||
}
|
||||
|
||||
void leaveGui()
|
||||
{
|
||||
if ( keep() ) {
|
||||
showSummary();
|
||||
_application->exec();
|
||||
}
|
||||
else
|
||||
_mainWindow->close( true );
|
||||
}
|
||||
|
||||
private:
|
||||
QString _title;
|
||||
bool _startMinimized, _keep;
|
||||
unsigned _numTotalTests;
|
||||
QString _strTotalTests;
|
||||
QApplication *_application;
|
||||
QWidget *_mainWindow;
|
||||
QVBoxLayout *_layout;
|
||||
QProgressBar *_progressBar;
|
||||
QStatusBar *_statusBar;
|
||||
QLabel *_suiteName, *_testName, *_testsDone;
|
||||
|
||||
void parseCommandLine( int argc, char **argv )
|
||||
{
|
||||
_startMinimized = _keep = false;
|
||||
_title = argv[0];
|
||||
|
||||
for ( int i = 1; i < argc; ++ i ) {
|
||||
QString arg( argv[i] );
|
||||
if ( arg == "-minimized" )
|
||||
_startMinimized = true;
|
||||
else if ( arg == "-keep" )
|
||||
_keep = true;
|
||||
else if ( arg == "-title" && (i + 1 < argc) )
|
||||
_title = argv[++i];
|
||||
}
|
||||
}
|
||||
|
||||
void createApplication( int &argc, char **argv )
|
||||
{
|
||||
_application = new QApplication( argc, argv );
|
||||
}
|
||||
|
||||
void createWindow( const WorldDescription &wd )
|
||||
{
|
||||
getTotalTests( wd );
|
||||
createMainWindow();
|
||||
createProgressBar();
|
||||
createStatusBar();
|
||||
setMainWidget();
|
||||
if ( _startMinimized )
|
||||
showMinimized();
|
||||
else
|
||||
showNormal();
|
||||
}
|
||||
|
||||
void getTotalTests()
|
||||
{
|
||||
getTotalTests( tracker().world() );
|
||||
}
|
||||
|
||||
void getTotalTests( const WorldDescription &wd )
|
||||
{
|
||||
_numTotalTests = wd.numTotalTests();
|
||||
char s[WorldDescription::MAX_STRLEN_TOTAL_TESTS];
|
||||
_strTotalTests = wd.strTotalTests( s );
|
||||
}
|
||||
|
||||
void createMainWindow()
|
||||
{
|
||||
_mainWindow = new QWidget();
|
||||
_layout = new QVBoxLayout( _mainWindow );
|
||||
}
|
||||
|
||||
void createProgressBar()
|
||||
{
|
||||
_layout->addWidget( _progressBar = new QProgressBar( _numTotalTests, _mainWindow ) );
|
||||
_progressBar->setProgress( 0 );
|
||||
setColor( 0, 255, 0 );
|
||||
setIcon( QMessageBox::Information );
|
||||
}
|
||||
|
||||
void createStatusBar()
|
||||
{
|
||||
_layout->addWidget( _statusBar = new QStatusBar( _mainWindow ) );
|
||||
_statusBar->addWidget( _suiteName = new QLabel( _statusBar ), 2 );
|
||||
_statusBar->addWidget( _testName = new QLabel( _statusBar ), 4 );
|
||||
_statusBar->addWidget( _testsDone = new QLabel( _statusBar ), 1 );
|
||||
}
|
||||
|
||||
void setMainWidget()
|
||||
{
|
||||
_application->setMainWidget( _mainWindow );
|
||||
}
|
||||
|
||||
void showMinimized()
|
||||
{
|
||||
_mainWindow->showMinimized();
|
||||
}
|
||||
|
||||
void showNormal()
|
||||
{
|
||||
_mainWindow->showNormal();
|
||||
centerWindow();
|
||||
}
|
||||
|
||||
void setCaption( const QString &suiteName, const QString &testName )
|
||||
{
|
||||
_mainWindow->setCaption( _title + " - " + suiteName + "::" + testName + "()" );
|
||||
}
|
||||
|
||||
void showSuiteName( const QString &suiteName )
|
||||
{
|
||||
_suiteName->setText( "class " + suiteName );
|
||||
}
|
||||
|
||||
void advanceProgressBar()
|
||||
{
|
||||
_progressBar->setProgress( _progressBar->progress() + 1 );
|
||||
}
|
||||
|
||||
void showTestName( const QString &testName )
|
||||
{
|
||||
_testName->setText( testName + "()" );
|
||||
}
|
||||
|
||||
void showTestsDone( unsigned testsDone )
|
||||
{
|
||||
_testsDone->setText( asString( testsDone ) + " of " + _strTotalTests );
|
||||
}
|
||||
|
||||
static QString asString( unsigned n )
|
||||
{
|
||||
return QString::number( n );
|
||||
}
|
||||
|
||||
void setColor( int r, int g, int b )
|
||||
{
|
||||
QPalette palette = _progressBar->palette();
|
||||
palette.setColor( QColorGroup::Highlight, QColor( r, g, b ) );
|
||||
_progressBar->setPalette( palette );
|
||||
}
|
||||
|
||||
void setIcon( QMessageBox::Icon icon )
|
||||
{
|
||||
#if QT_VERSION >= 0x030000
|
||||
_mainWindow->setIcon( QMessageBox::standardIcon( icon ) );
|
||||
#else // Qt version < 3.0.0
|
||||
_mainWindow->setIcon( QMessageBox::standardIcon( icon, QApplication::style().guiStyle() ) );
|
||||
#endif // QT_VERSION
|
||||
}
|
||||
|
||||
void processEvents()
|
||||
{
|
||||
_application->processEvents();
|
||||
}
|
||||
|
||||
void centerWindow()
|
||||
{
|
||||
QWidget *desktop = QApplication::desktop();
|
||||
int xCenter = desktop->x() + (desktop->width() / 2);
|
||||
int yCenter = desktop->y() + (desktop->height() / 2);
|
||||
|
||||
int windowWidth = (desktop->width() * 4) / 5;
|
||||
int windowHeight = _mainWindow->height();
|
||||
_mainWindow->setGeometry( xCenter - (windowWidth / 2), yCenter - (windowHeight / 2), windowWidth, windowHeight );
|
||||
}
|
||||
|
||||
bool keep()
|
||||
{
|
||||
if ( !_keep )
|
||||
return false;
|
||||
if ( !_startMinimized )
|
||||
return true;
|
||||
return (_mainWindow == _application->activeWindow());
|
||||
}
|
||||
|
||||
void showSummary()
|
||||
{
|
||||
QString summary = _strTotalTests + (_numTotalTests == 1 ? " test" : " tests");
|
||||
if ( tracker().failedTests() )
|
||||
summary = "Failed " + asString( tracker().failedTests() ) + " of " + summary;
|
||||
else
|
||||
summary = summary + " passed";
|
||||
|
||||
_mainWindow->setCaption( _title + " - " + summary );
|
||||
|
||||
_statusBar->removeWidget( _suiteName );
|
||||
_statusBar->removeWidget( _testName );
|
||||
_testsDone->setText( summary );
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
#endif // __cxxtest__QtGui_h__
|
311
test/cxxtest/cxxtest/RealDescriptions.cpp
Normal file
311
test/cxxtest/cxxtest/RealDescriptions.cpp
Normal file
|
@ -0,0 +1,311 @@
|
|||
#ifndef __cxxtest__RealDescriptions_cpp__
|
||||
#define __cxxtest__RealDescriptions_cpp__
|
||||
|
||||
//
|
||||
// NOTE: If an error occur during world construction/deletion, CxxTest cannot
|
||||
// know where the error originated.
|
||||
//
|
||||
|
||||
#include <cxxtest/RealDescriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
RealTestDescription::RealTestDescription()
|
||||
{
|
||||
}
|
||||
|
||||
RealTestDescription::RealTestDescription( List &argList,
|
||||
SuiteDescription &argSuite,
|
||||
unsigned argLine,
|
||||
const char *argTestName )
|
||||
{
|
||||
initialize( argList, argSuite, argLine, argTestName );
|
||||
}
|
||||
|
||||
void RealTestDescription::initialize( List &argList,
|
||||
SuiteDescription &argSuite,
|
||||
unsigned argLine,
|
||||
const char *argTestName )
|
||||
{
|
||||
_suite = &argSuite;
|
||||
_line = argLine;
|
||||
_testName = argTestName;
|
||||
attach( argList );
|
||||
}
|
||||
|
||||
bool RealTestDescription::setUp()
|
||||
{
|
||||
if ( !suite() )
|
||||
return false;
|
||||
|
||||
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
|
||||
bool ok;
|
||||
_TS_TRY { ok = gf->setUp(); }
|
||||
_TS_LAST_CATCH( { ok = false; } );
|
||||
|
||||
if ( !ok ) {
|
||||
doFailTest( file(), line(), "Error in GlobalFixture::setUp()" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
_TS_TRY {
|
||||
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from setUp()", suite()->setUp() );
|
||||
}
|
||||
_TS_CATCH_ABORT( { return false; } );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RealTestDescription::tearDown()
|
||||
{
|
||||
if ( !suite() )
|
||||
return false;
|
||||
|
||||
_TS_TRY {
|
||||
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from tearDown()", suite()->tearDown() );
|
||||
}
|
||||
_TS_CATCH_ABORT( { return false; } );
|
||||
|
||||
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
|
||||
bool ok;
|
||||
_TS_TRY { ok = gf->tearDown(); }
|
||||
_TS_LAST_CATCH( { ok = false; } );
|
||||
|
||||
if ( !ok ) {
|
||||
doFailTest( file(), line(), "Error in GlobalFixture::tearDown()" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const char *RealTestDescription::file() const { return _suite->file(); }
|
||||
unsigned RealTestDescription::line() const { return _line; }
|
||||
const char *RealTestDescription::testName() const { return _testName; }
|
||||
const char *RealTestDescription::suiteName() const { return _suite->suiteName(); }
|
||||
|
||||
TestDescription *RealTestDescription::next() { return (RealTestDescription *)Link::next(); }
|
||||
const TestDescription *RealTestDescription::next() const { return (const RealTestDescription *)Link::next(); }
|
||||
|
||||
TestSuite *RealTestDescription::suite() const { return _suite->suite(); }
|
||||
|
||||
void RealTestDescription::run()
|
||||
{
|
||||
_TS_TRY { runTest(); }
|
||||
_TS_CATCH_ABORT( {} )
|
||||
___TSM_CATCH( file(), line(), "Exception thrown from test" );
|
||||
}
|
||||
|
||||
RealSuiteDescription::RealSuiteDescription() {}
|
||||
RealSuiteDescription::RealSuiteDescription( const char *argFile,
|
||||
unsigned argLine,
|
||||
const char *argSuiteName,
|
||||
List &argTests )
|
||||
{
|
||||
initialize( argFile, argLine, argSuiteName, argTests );
|
||||
}
|
||||
|
||||
void RealSuiteDescription::initialize( const char *argFile,
|
||||
unsigned argLine,
|
||||
const char *argSuiteName,
|
||||
List &argTests )
|
||||
{
|
||||
_file = argFile;
|
||||
_line = argLine;
|
||||
_suiteName = argSuiteName;
|
||||
_tests = &argTests;
|
||||
|
||||
attach( _suites );
|
||||
}
|
||||
|
||||
const char *RealSuiteDescription::file() const { return _file; }
|
||||
unsigned RealSuiteDescription::line() const { return _line; }
|
||||
const char *RealSuiteDescription::suiteName() const { return _suiteName; }
|
||||
|
||||
TestDescription *RealSuiteDescription::firstTest() { return (RealTestDescription *)_tests->head(); }
|
||||
const TestDescription *RealSuiteDescription::firstTest() const { return (const RealTestDescription *)_tests->head(); }
|
||||
SuiteDescription *RealSuiteDescription::next() { return (RealSuiteDescription *)Link::next(); }
|
||||
const SuiteDescription *RealSuiteDescription::next() const { return (const RealSuiteDescription *)Link::next(); }
|
||||
|
||||
unsigned RealSuiteDescription::numTests() const { return _tests->size(); }
|
||||
|
||||
const TestDescription &RealSuiteDescription::testDescription( unsigned i ) const
|
||||
{
|
||||
return *(RealTestDescription *)_tests->nth( i );
|
||||
}
|
||||
|
||||
void RealSuiteDescription::activateAllTests()
|
||||
{
|
||||
_tests->activateAll();
|
||||
}
|
||||
|
||||
bool RealSuiteDescription::leaveOnly( const char *testName )
|
||||
{
|
||||
for ( TestDescription *td = firstTest(); td != 0; td = td->next() ) {
|
||||
if ( stringsEqual( td->testName(), testName ) ) {
|
||||
_tests->leaveOnly( *td );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
StaticSuiteDescription::StaticSuiteDescription() {}
|
||||
StaticSuiteDescription::StaticSuiteDescription( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, TestSuite &argSuite,
|
||||
List &argTests ) :
|
||||
RealSuiteDescription( argFile, argLine, argSuiteName, argTests )
|
||||
{
|
||||
doInitialize( argSuite );
|
||||
}
|
||||
|
||||
void StaticSuiteDescription::initialize( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, TestSuite &argSuite,
|
||||
List &argTests )
|
||||
{
|
||||
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
|
||||
doInitialize( argSuite );
|
||||
}
|
||||
|
||||
void StaticSuiteDescription::doInitialize( TestSuite &argSuite )
|
||||
{
|
||||
_suite = &argSuite;
|
||||
}
|
||||
|
||||
TestSuite *StaticSuiteDescription::suite() const
|
||||
{
|
||||
return _suite;
|
||||
}
|
||||
|
||||
bool StaticSuiteDescription::setUp() { return true; }
|
||||
bool StaticSuiteDescription::tearDown() { return true; }
|
||||
|
||||
CommonDynamicSuiteDescription::CommonDynamicSuiteDescription() {}
|
||||
CommonDynamicSuiteDescription::CommonDynamicSuiteDescription( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
unsigned argCreateLine, unsigned argDestroyLine ) :
|
||||
RealSuiteDescription( argFile, argLine, argSuiteName, argTests )
|
||||
{
|
||||
doInitialize( argCreateLine, argDestroyLine );
|
||||
}
|
||||
|
||||
void CommonDynamicSuiteDescription::initialize( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
unsigned argCreateLine, unsigned argDestroyLine )
|
||||
{
|
||||
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
|
||||
doInitialize( argCreateLine, argDestroyLine );
|
||||
}
|
||||
|
||||
void CommonDynamicSuiteDescription::doInitialize( unsigned argCreateLine, unsigned argDestroyLine )
|
||||
{
|
||||
_createLine = argCreateLine;
|
||||
_destroyLine = argDestroyLine;
|
||||
}
|
||||
|
||||
List &RealWorldDescription::suites()
|
||||
{
|
||||
return RealSuiteDescription::_suites;
|
||||
}
|
||||
|
||||
unsigned RealWorldDescription::numSuites( void ) const
|
||||
{
|
||||
return suites().size();
|
||||
}
|
||||
|
||||
unsigned RealWorldDescription::numTotalTests( void ) const
|
||||
{
|
||||
unsigned count = 0;
|
||||
for ( const SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
|
||||
count += sd->numTests();
|
||||
return count;
|
||||
}
|
||||
|
||||
SuiteDescription *RealWorldDescription::firstSuite()
|
||||
{
|
||||
return (RealSuiteDescription *)suites().head();
|
||||
}
|
||||
|
||||
const SuiteDescription *RealWorldDescription::firstSuite() const
|
||||
{
|
||||
return (const RealSuiteDescription *)suites().head();
|
||||
}
|
||||
|
||||
const SuiteDescription &RealWorldDescription::suiteDescription( unsigned i ) const
|
||||
{
|
||||
return *(const RealSuiteDescription *)suites().nth( i );
|
||||
}
|
||||
|
||||
void RealWorldDescription::activateAllTests()
|
||||
{
|
||||
suites().activateAll();
|
||||
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
|
||||
sd->activateAllTests();
|
||||
}
|
||||
|
||||
bool RealWorldDescription::leaveOnly( const char *suiteName, const char *testName )
|
||||
{
|
||||
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) {
|
||||
if ( stringsEqual( sd->suiteName(), suiteName ) ) {
|
||||
if ( testName )
|
||||
if ( !sd->leaveOnly( testName ) )
|
||||
return false;
|
||||
suites().leaveOnly( *sd );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RealWorldDescription::setUp()
|
||||
{
|
||||
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
|
||||
bool ok;
|
||||
_TS_TRY { ok = gf->setUpWorld(); }
|
||||
_TS_LAST_CATCH( { ok = false; } );
|
||||
|
||||
if ( !ok ) {
|
||||
reportError( "Error setting up world" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RealWorldDescription::tearDown()
|
||||
{
|
||||
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
|
||||
bool ok;
|
||||
_TS_TRY { ok = gf->tearDownWorld(); }
|
||||
_TS_LAST_CATCH( { ok = false; } );
|
||||
|
||||
if ( !ok ) {
|
||||
reportError( "Error tearing down world" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RealWorldDescription::reportError( const char *message )
|
||||
{
|
||||
doWarn( __FILE__, 5, message );
|
||||
}
|
||||
|
||||
void activateAllTests()
|
||||
{
|
||||
RealWorldDescription().activateAllTests();
|
||||
}
|
||||
|
||||
bool leaveOnly( const char *suiteName, const char *testName )
|
||||
{
|
||||
return RealWorldDescription().leaveOnly( suiteName, testName );
|
||||
}
|
||||
}
|
||||
|
||||
#endif // __cxxtest__RealDescriptions_cpp__
|
||||
|
223
test/cxxtest/cxxtest/RealDescriptions.h
Normal file
223
test/cxxtest/cxxtest/RealDescriptions.h
Normal file
|
@ -0,0 +1,223 @@
|
|||
#ifndef __cxxtest__RealDescriptions_h__
|
||||
#define __cxxtest__RealDescriptions_h__
|
||||
|
||||
//
|
||||
// The "real" description classes
|
||||
//
|
||||
|
||||
#include <cxxtest/Descriptions.h>
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <cxxtest/GlobalFixture.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class RealTestDescription : public TestDescription
|
||||
{
|
||||
public:
|
||||
RealTestDescription();
|
||||
RealTestDescription( List &argList, SuiteDescription &argSuite, unsigned argLine, const char *argTestName );
|
||||
void initialize( List &argList, SuiteDescription &argSuite, unsigned argLine, const char *argTestName );
|
||||
|
||||
const char *file() const;
|
||||
unsigned line() const;
|
||||
const char *testName() const;
|
||||
const char *suiteName() const;
|
||||
|
||||
TestDescription *next();
|
||||
const TestDescription *next() const;
|
||||
|
||||
TestSuite *suite() const;
|
||||
|
||||
bool setUp();
|
||||
void run();
|
||||
bool tearDown();
|
||||
|
||||
private:
|
||||
RealTestDescription( const RealTestDescription & );
|
||||
RealTestDescription &operator=( const RealTestDescription & );
|
||||
|
||||
virtual void runTest() = 0;
|
||||
|
||||
SuiteDescription *_suite;
|
||||
unsigned _line;
|
||||
const char *_testName;
|
||||
};
|
||||
|
||||
class RealSuiteDescription : public SuiteDescription
|
||||
{
|
||||
public:
|
||||
RealSuiteDescription();
|
||||
RealSuiteDescription( const char *argFile, unsigned argLine, const char *argSuiteName, List &argTests );
|
||||
|
||||
void initialize( const char *argFile, unsigned argLine, const char *argSuiteName, List &argTests );
|
||||
|
||||
const char *file() const;
|
||||
unsigned line() const;
|
||||
const char *suiteName() const;
|
||||
|
||||
TestDescription *firstTest();
|
||||
const TestDescription *firstTest() const;
|
||||
SuiteDescription *next();
|
||||
const SuiteDescription *next() const;
|
||||
|
||||
unsigned numTests() const;
|
||||
const TestDescription &testDescription( unsigned i ) const;
|
||||
|
||||
void activateAllTests();
|
||||
bool leaveOnly( const char *testName );
|
||||
|
||||
private:
|
||||
RealSuiteDescription( const RealSuiteDescription & );
|
||||
RealSuiteDescription &operator=( const RealSuiteDescription & );
|
||||
|
||||
const char *_file;
|
||||
unsigned _line;
|
||||
const char *_suiteName;
|
||||
List *_tests;
|
||||
|
||||
static List _suites;
|
||||
friend class RealWorldDescription;
|
||||
};
|
||||
|
||||
class StaticSuiteDescription : public RealSuiteDescription
|
||||
{
|
||||
public:
|
||||
StaticSuiteDescription();
|
||||
StaticSuiteDescription( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, TestSuite &argSuite,
|
||||
List &argTests );
|
||||
|
||||
void initialize( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, TestSuite &argSuite,
|
||||
List &argTests );
|
||||
TestSuite *suite() const;
|
||||
|
||||
bool setUp();
|
||||
bool tearDown();
|
||||
|
||||
private:
|
||||
StaticSuiteDescription( const StaticSuiteDescription & );
|
||||
StaticSuiteDescription &operator=( const StaticSuiteDescription & );
|
||||
|
||||
void doInitialize( TestSuite &argSuite );
|
||||
|
||||
TestSuite *_suite;
|
||||
};
|
||||
|
||||
class CommonDynamicSuiteDescription : public RealSuiteDescription
|
||||
{
|
||||
public:
|
||||
CommonDynamicSuiteDescription();
|
||||
CommonDynamicSuiteDescription( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
unsigned argCreateLine, unsigned argDestroyLine );
|
||||
|
||||
void initialize( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
unsigned argCreateLine, unsigned argDestroyLine );
|
||||
|
||||
protected:
|
||||
unsigned _createLine, _destroyLine;
|
||||
|
||||
private:
|
||||
void doInitialize( unsigned argCreateLine, unsigned argDestroyLine );
|
||||
};
|
||||
|
||||
template<class S>
|
||||
class DynamicSuiteDescription : public CommonDynamicSuiteDescription
|
||||
{
|
||||
public:
|
||||
DynamicSuiteDescription() {}
|
||||
DynamicSuiteDescription( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
S *&argSuite, unsigned argCreateLine,
|
||||
unsigned argDestroyLine ) :
|
||||
CommonDynamicSuiteDescription( argFile, argLine, argSuiteName, argTests, argCreateLine, argDestroyLine )
|
||||
{
|
||||
_suite = &argSuite;
|
||||
}
|
||||
|
||||
void initialize( const char *argFile, unsigned argLine,
|
||||
const char *argSuiteName, List &argTests,
|
||||
S *&argSuite, unsigned argCreateLine,
|
||||
unsigned argDestroyLine )
|
||||
{
|
||||
CommonDynamicSuiteDescription::initialize( argFile, argLine,
|
||||
argSuiteName, argTests,
|
||||
argCreateLine, argDestroyLine );
|
||||
_suite = &argSuite;
|
||||
}
|
||||
|
||||
TestSuite *suite() const { return realSuite(); }
|
||||
|
||||
bool setUp();
|
||||
bool tearDown();
|
||||
|
||||
private:
|
||||
S *realSuite() const { return *_suite; }
|
||||
void setSuite( S *s ) { *_suite = s; }
|
||||
|
||||
void createSuite()
|
||||
{
|
||||
setSuite( S::createSuite() );
|
||||
}
|
||||
|
||||
void destroySuite()
|
||||
{
|
||||
S *s = realSuite();
|
||||
setSuite( 0 );
|
||||
S::destroySuite( s );
|
||||
}
|
||||
|
||||
S **_suite;
|
||||
};
|
||||
|
||||
template<class S>
|
||||
bool DynamicSuiteDescription<S>::setUp()
|
||||
{
|
||||
_TS_TRY {
|
||||
_TSM_ASSERT_THROWS_NOTHING( file(), _createLine, "Exception thrown from createSuite()", createSuite() );
|
||||
_TSM_ASSERT( file(), _createLine, "createSuite() failed", suite() != 0 );
|
||||
}
|
||||
_TS_CATCH_ABORT( { return false; } );
|
||||
|
||||
return (suite() != 0);
|
||||
}
|
||||
|
||||
template<class S>
|
||||
bool DynamicSuiteDescription<S>::tearDown()
|
||||
{
|
||||
if ( !_suite )
|
||||
return true;
|
||||
|
||||
_TS_TRY {
|
||||
_TSM_ASSERT_THROWS_NOTHING( file(), _destroyLine, "destroySuite() failed", destroySuite() );
|
||||
}
|
||||
_TS_CATCH_ABORT( { return false; } );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
class RealWorldDescription : public WorldDescription
|
||||
{
|
||||
public:
|
||||
static List &suites();
|
||||
unsigned numSuites( void ) const;
|
||||
unsigned numTotalTests( void ) const;
|
||||
SuiteDescription *firstSuite();
|
||||
const SuiteDescription *firstSuite() const;
|
||||
const SuiteDescription &suiteDescription( unsigned i ) const;
|
||||
void activateAllTests();
|
||||
bool leaveOnly( const char *suiteName, const char *testName = 0 );
|
||||
|
||||
bool setUp();
|
||||
bool tearDown();
|
||||
static void reportError( const char *message );
|
||||
};
|
||||
|
||||
void activateAllTests();
|
||||
bool leaveOnly( const char *suiteName, const char *testName = 0 );
|
||||
}
|
||||
|
||||
#endif // __cxxtest__RealDescriptions_h__
|
||||
|
18
test/cxxtest/cxxtest/Root.cpp
Normal file
18
test/cxxtest/cxxtest/Root.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef __cxxtest__Root_cpp__
|
||||
#define __cxxtest__Root_cpp__
|
||||
|
||||
//
|
||||
// This file holds the "root" of CxxTest, i.e.
|
||||
// the parts that must be in a source file file.
|
||||
//
|
||||
|
||||
#include <cxxtest/Descriptions.cpp>
|
||||
#include <cxxtest/DummyDescriptions.cpp>
|
||||
#include <cxxtest/GlobalFixture.cpp>
|
||||
#include <cxxtest/LinkedList.cpp>
|
||||
#include <cxxtest/RealDescriptions.cpp>
|
||||
#include <cxxtest/TestSuite.cpp>
|
||||
#include <cxxtest/TestTracker.cpp>
|
||||
#include <cxxtest/ValueTraits.cpp>
|
||||
|
||||
#endif // __cxxtest__Root_cpp__
|
7
test/cxxtest/cxxtest/SelfTest.h
Normal file
7
test/cxxtest/cxxtest/SelfTest.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifndef __cxxtest_SelfTest_h__
|
||||
#define __cxxtest_SelfTest_h__
|
||||
|
||||
#define CXXTEST_SUITE(name)
|
||||
#define CXXTEST_CODE(member)
|
||||
|
||||
#endif // __cxxtest_SelfTest_h__
|
25
test/cxxtest/cxxtest/StdHeaders.h
Normal file
25
test/cxxtest/cxxtest/StdHeaders.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
#ifndef __cxxtest_StdHeaders_h__
|
||||
#define __cxxtest_StdHeaders_h__
|
||||
|
||||
//
|
||||
// This file basically #includes the STL headers.
|
||||
// It exists to support warning level 4 in Visual C++
|
||||
//
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# pragma warning( push, 1 )
|
||||
#endif // _MSC_VER
|
||||
|
||||
#include <complex>
|
||||
#include <deque>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# pragma warning( pop )
|
||||
#endif // _MSC_VER
|
||||
|
||||
#endif // __cxxtest_StdHeaders_h__
|
229
test/cxxtest/cxxtest/StdValueTraits.h
Normal file
229
test/cxxtest/cxxtest/StdValueTraits.h
Normal file
|
@ -0,0 +1,229 @@
|
|||
#ifndef __cxxtest_StdValueTraits_h__
|
||||
#define __cxxtest_StdValueTraits_h__
|
||||
|
||||
//
|
||||
// This file defines ValueTraits for std:: stuff.
|
||||
// It is #included by <cxxtest/ValueTraits.h> if you
|
||||
// define CXXTEST_HAVE_STD
|
||||
//
|
||||
|
||||
#include <cxxtest/ValueTraits.h>
|
||||
#include <cxxtest/StdHeaders.h>
|
||||
|
||||
#ifdef _CXXTEST_OLD_STD
|
||||
# define CXXTEST_STD(x) x
|
||||
#else // !_CXXTEST_OLD_STD
|
||||
# define CXXTEST_STD(x) std::x
|
||||
#endif // _CXXTEST_OLD_STD
|
||||
|
||||
#ifndef CXXTEST_USER_VALUE_TRAITS
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
//
|
||||
// NOTE: This should have been
|
||||
// template<class Char, class Traits, class Allocator>
|
||||
// class ValueTraits< std::basic_string<Char, Traits, Allocator> > {};
|
||||
// But MSVC doesn't support it (yet).
|
||||
//
|
||||
|
||||
//
|
||||
// If we have std::string, we might as well use it
|
||||
//
|
||||
class StdTraitsBase
|
||||
{
|
||||
public:
|
||||
StdTraitsBase &operator<<( const CXXTEST_STD(string) &s ) { _s += s; return *this; }
|
||||
const char *asString() const { return _s.c_str(); }
|
||||
|
||||
private:
|
||||
CXXTEST_STD(string) _s;
|
||||
};
|
||||
|
||||
//
|
||||
// std::string
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const CXXTEST_STD(string)> : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(string) &s )
|
||||
{
|
||||
*this << "\"";
|
||||
for ( unsigned i = 0; i < s.length(); ++ i ) {
|
||||
char c[sizeof("\\xXX")];
|
||||
charToString( s[i], c );
|
||||
*this << c;
|
||||
}
|
||||
*this << "\"";
|
||||
}
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( CXXTEST_STD(string) );
|
||||
|
||||
#ifndef _CXXTEST_OLD_STD
|
||||
//
|
||||
// std::wstring
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const CXXTEST_STD(basic_string<wchar_t>)> : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(basic_string<wchar_t>) &s )
|
||||
{
|
||||
*this << "L\"";
|
||||
for ( unsigned i = 0; i < s.length(); ++ i ) {
|
||||
char c[sizeof("\\x12345678")];
|
||||
charToString( (unsigned long)s[i], c );
|
||||
*this << c;
|
||||
}
|
||||
*this << "\"";
|
||||
}
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( CXXTEST_STD(basic_string<wchar_t>) );
|
||||
#endif // _CXXTEST_OLD_STD
|
||||
|
||||
//
|
||||
// Convert a range defined by iterators to a string
|
||||
// This is useful for almost all STL containers
|
||||
//
|
||||
template<class Stream, class Iterator>
|
||||
void dumpRange( Stream &s, Iterator first, Iterator last )
|
||||
{
|
||||
s << "{ ";
|
||||
while ( first != last ) {
|
||||
s << TS_AS_STRING(*first);
|
||||
++ first;
|
||||
s << ((first == last) ? " }" : ", ");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
//
|
||||
// std::pair
|
||||
//
|
||||
template<class First, class Second>
|
||||
class ValueTraits< CXXTEST_STD(pair)<First, Second> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(pair)<First, Second> &p )
|
||||
{
|
||||
*this << "<" << TS_AS_STRING( p.first ) << ", " << TS_AS_STRING( p.second ) << ">";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::vector
|
||||
//
|
||||
template<class Element>
|
||||
class ValueTraits< CXXTEST_STD(vector)<Element> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(vector)<Element> &v )
|
||||
{
|
||||
dumpRange( *this, v.begin(), v.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::list
|
||||
//
|
||||
template<class Element>
|
||||
class ValueTraits< CXXTEST_STD(list)<Element> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(list)<Element> &l )
|
||||
{
|
||||
dumpRange( *this, l.begin(), l.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::set
|
||||
//
|
||||
template<class Element>
|
||||
class ValueTraits< CXXTEST_STD(set)<Element> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(set)<Element> &s )
|
||||
{
|
||||
dumpRange( *this, s.begin(), s.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::map
|
||||
//
|
||||
template<class Key, class Value>
|
||||
class ValueTraits< CXXTEST_STD(map)<Key, Value> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(map)<Key, Value> &m )
|
||||
{
|
||||
dumpRange( *this, m.begin(), m.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::deque
|
||||
//
|
||||
template<class Element>
|
||||
class ValueTraits< CXXTEST_STD(deque)<Element> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(deque)<Element> &d )
|
||||
{
|
||||
dumpRange( *this, d.begin(), d.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::multiset
|
||||
//
|
||||
template<class Element>
|
||||
class ValueTraits< CXXTEST_STD(multiset)<Element> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(multiset)<Element> &ms )
|
||||
{
|
||||
dumpRange( *this, ms.begin(), ms.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::multimap
|
||||
//
|
||||
template<class Key, class Value>
|
||||
class ValueTraits< CXXTEST_STD(multimap)<Key, Value> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(multimap)<Key, Value> &mm )
|
||||
{
|
||||
dumpRange( *this, mm.begin(), mm.end() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// std::complex
|
||||
//
|
||||
template<class Number>
|
||||
class ValueTraits< CXXTEST_STD(complex)<Number> > : public StdTraitsBase
|
||||
{
|
||||
public:
|
||||
ValueTraits( const CXXTEST_STD(complex)<Number> &c )
|
||||
{
|
||||
if ( !c.imag() )
|
||||
*this << TS_AS_STRING(c.real());
|
||||
else if ( !c.real() )
|
||||
*this << "(" << TS_AS_STRING(c.imag()) << " * i)";
|
||||
else
|
||||
*this << "(" << TS_AS_STRING(c.real()) << " + " << TS_AS_STRING(c.imag()) << " * i)";
|
||||
}
|
||||
};
|
||||
#endif // _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
|
||||
};
|
||||
|
||||
#endif // CXXTEST_USER_VALUE_TRAITS
|
||||
|
||||
#endif // __cxxtest_StdValueTraits_h__
|
41
test/cxxtest/cxxtest/StdioFilePrinter.h
Normal file
41
test/cxxtest/cxxtest/StdioFilePrinter.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
#ifndef __cxxtest__StdioFilePrinter_h__
|
||||
#define __cxxtest__StdioFilePrinter_h__
|
||||
|
||||
//
|
||||
// The StdioFilePrinter is a simple TestListener that
|
||||
// just prints "OK" if everything goes well, otherwise
|
||||
// reports the error in the format of compiler messages.
|
||||
// This class uses <stdio.h>, i.e. FILE * and fprintf().
|
||||
//
|
||||
|
||||
#include <cxxtest/ErrorFormatter.h>
|
||||
#include <stdio.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class StdioFilePrinter : public ErrorFormatter
|
||||
{
|
||||
public:
|
||||
StdioFilePrinter( FILE *o, const char *preLine = ":", const char *postLine = "" ) :
|
||||
ErrorFormatter( new Adapter(o), preLine, postLine ) {}
|
||||
virtual ~StdioFilePrinter() { delete outputStream(); }
|
||||
|
||||
private:
|
||||
class Adapter : public OutputStream
|
||||
{
|
||||
Adapter( const Adapter & );
|
||||
Adapter &operator=( const Adapter & );
|
||||
|
||||
FILE *_o;
|
||||
|
||||
public:
|
||||
Adapter( FILE *o ) : _o(o) {}
|
||||
void flush() { fflush( _o ); }
|
||||
OutputStream &operator<<( unsigned i ) { fprintf( _o, "%u", i ); return *this; }
|
||||
OutputStream &operator<<( const char *s ) { fputs( s, _o ); return *this; }
|
||||
OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); }
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__StdioFilePrinter_h__
|
22
test/cxxtest/cxxtest/StdioPrinter.h
Normal file
22
test/cxxtest/cxxtest/StdioPrinter.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef __cxxtest__StdioPrinter_h__
|
||||
#define __cxxtest__StdioPrinter_h__
|
||||
|
||||
//
|
||||
// The StdioPrinter is an StdioFilePrinter which defaults to stdout.
|
||||
// This should have been called StdOutPrinter or something, but the name
|
||||
// has been historically used.
|
||||
//
|
||||
|
||||
#include <cxxtest/StdioFilePrinter.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class StdioPrinter : public StdioFilePrinter
|
||||
{
|
||||
public:
|
||||
StdioPrinter( FILE *o = stdout, const char *preLine = ":", const char *postLine = "" ) :
|
||||
StdioFilePrinter( o, preLine, postLine ) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__StdioPrinter_h__
|
182
test/cxxtest/cxxtest/TeeListener.h
Normal file
182
test/cxxtest/cxxtest/TeeListener.h
Normal file
|
@ -0,0 +1,182 @@
|
|||
#ifndef __cxxtest__TeeListener_h__
|
||||
#define __cxxtest__TeeListener_h__
|
||||
|
||||
//
|
||||
// A TeeListener notifies two "reular" TestListeners
|
||||
//
|
||||
|
||||
#include <cxxtest/TestListener.h>
|
||||
#include <cxxtest/TestListener.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TeeListener : public TestListener
|
||||
{
|
||||
public:
|
||||
TeeListener()
|
||||
{
|
||||
setFirst( _dummy );
|
||||
setSecond( _dummy );
|
||||
}
|
||||
|
||||
virtual ~TeeListener()
|
||||
{
|
||||
}
|
||||
|
||||
void setFirst( TestListener &first )
|
||||
{
|
||||
_first = &first;
|
||||
}
|
||||
|
||||
void setSecond( TestListener &second )
|
||||
{
|
||||
_second = &second;
|
||||
}
|
||||
|
||||
void enterWorld( const WorldDescription &d )
|
||||
{
|
||||
_first->enterWorld( d );
|
||||
_second->enterWorld( d );
|
||||
}
|
||||
|
||||
void enterSuite( const SuiteDescription &d )
|
||||
{
|
||||
_first->enterSuite( d );
|
||||
_second->enterSuite( d );
|
||||
}
|
||||
|
||||
void enterTest( const TestDescription &d )
|
||||
{
|
||||
_first->enterTest( d );
|
||||
_second->enterTest( d );
|
||||
}
|
||||
|
||||
void trace( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
_first->trace( file, line, expression );
|
||||
_second->trace( file, line, expression );
|
||||
}
|
||||
|
||||
void warning( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
_first->warning( file, line, expression );
|
||||
_second->warning( file, line, expression );
|
||||
}
|
||||
|
||||
void failedTest( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
_first->failedTest( file, line, expression );
|
||||
_second->failedTest( file, line, expression );
|
||||
}
|
||||
|
||||
void failedAssert( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
_first->failedAssert( file, line, expression );
|
||||
_second->failedAssert( file, line, expression );
|
||||
}
|
||||
|
||||
void failedAssertEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
_first->failedAssertEquals( file, line, xStr, yStr, x, y );
|
||||
_second->failedAssertEquals( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void failedAssertSameData( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *sizeStr, const void *x,
|
||||
const void *y, unsigned size )
|
||||
{
|
||||
_first->failedAssertSameData( file, line, xStr, yStr, sizeStr, x, y, size );
|
||||
_second->failedAssertSameData( file, line, xStr, yStr, sizeStr, x, y, size );
|
||||
}
|
||||
|
||||
void failedAssertDelta( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr, const char *dStr,
|
||||
const char *x, const char *y, const char *d )
|
||||
{
|
||||
_first->failedAssertDelta( file, line, xStr, yStr, dStr, x, y, d );
|
||||
_second->failedAssertDelta( file, line, xStr, yStr, dStr, x, y, d );
|
||||
}
|
||||
|
||||
void failedAssertDiffers( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *value )
|
||||
{
|
||||
_first->failedAssertDiffers( file, line, xStr, yStr, value );
|
||||
_second->failedAssertDiffers( file, line, xStr, yStr, value );
|
||||
}
|
||||
|
||||
void failedAssertLessThan( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
_first->failedAssertLessThan( file, line, xStr, yStr, x, y );
|
||||
_second->failedAssertLessThan( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void failedAssertLessThanEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
_first->failedAssertLessThanEquals( file, line, xStr, yStr, x, y );
|
||||
_second->failedAssertLessThanEquals( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void failedAssertPredicate( const char *file, unsigned line,
|
||||
const char *predicate, const char *xStr, const char *x )
|
||||
{
|
||||
_first->failedAssertPredicate( file, line, predicate, xStr, x );
|
||||
_second->failedAssertPredicate( file, line, predicate, xStr, x );
|
||||
}
|
||||
|
||||
void failedAssertRelation( const char *file, unsigned line,
|
||||
const char *relation, const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
_first->failedAssertRelation( file, line, relation, xStr, yStr, x, y );
|
||||
_second->failedAssertRelation( file, line, relation, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void failedAssertThrows( const char *file, unsigned line,
|
||||
const char *expression, const char *type,
|
||||
bool otherThrown )
|
||||
{
|
||||
_first->failedAssertThrows( file, line, expression, type, otherThrown );
|
||||
_second->failedAssertThrows( file, line, expression, type, otherThrown );
|
||||
}
|
||||
|
||||
void failedAssertThrowsNot( const char *file, unsigned line,
|
||||
const char *expression )
|
||||
{
|
||||
_first->failedAssertThrowsNot( file, line, expression );
|
||||
_second->failedAssertThrowsNot( file, line, expression );
|
||||
}
|
||||
|
||||
void leaveTest( const TestDescription &d )
|
||||
{
|
||||
_first->leaveTest(d);
|
||||
_second->leaveTest(d);
|
||||
}
|
||||
|
||||
void leaveSuite( const SuiteDescription &d )
|
||||
{
|
||||
_first->leaveSuite(d);
|
||||
_second->leaveSuite(d);
|
||||
}
|
||||
|
||||
void leaveWorld( const WorldDescription &d )
|
||||
{
|
||||
_first->leaveWorld(d);
|
||||
_second->leaveWorld(d);
|
||||
}
|
||||
|
||||
private:
|
||||
TestListener *_first, *_second;
|
||||
TestListener _dummy;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
#endif // __cxxtest__TeeListener_h__
|
70
test/cxxtest/cxxtest/TestListener.h
Normal file
70
test/cxxtest/cxxtest/TestListener.h
Normal file
|
@ -0,0 +1,70 @@
|
|||
#ifndef __cxxtest__TestListener_h__
|
||||
#define __cxxtest__TestListener_h__
|
||||
|
||||
//
|
||||
// TestListener is the base class for all "listeners",
|
||||
// i.e. classes that receive notifications of the
|
||||
// testing process.
|
||||
//
|
||||
// The names of the parameters are in comments to avoid
|
||||
// "unused parameter" warnings.
|
||||
//
|
||||
|
||||
#include <cxxtest/Descriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TestListener
|
||||
{
|
||||
public:
|
||||
TestListener() {}
|
||||
virtual ~TestListener() {}
|
||||
|
||||
virtual void enterWorld( const WorldDescription & /*desc*/ ) {}
|
||||
virtual void enterSuite( const SuiteDescription & /*desc*/ ) {}
|
||||
virtual void enterTest( const TestDescription & /*desc*/ ) {}
|
||||
virtual void trace( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ ) {}
|
||||
virtual void warning( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ ) {}
|
||||
virtual void failedTest( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ ) {}
|
||||
virtual void failedAssert( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ ) {}
|
||||
virtual void failedAssertEquals( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ ) {}
|
||||
virtual void failedAssertSameData( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*sizeStr*/, const void * /*x*/,
|
||||
const void * /*y*/, unsigned /*size*/ ) {}
|
||||
virtual void failedAssertDelta( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*dStr*/, const char * /*x*/,
|
||||
const char * /*y*/, const char * /*d*/ ) {}
|
||||
virtual void failedAssertDiffers( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*value*/ ) {}
|
||||
virtual void failedAssertLessThan( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ ) {}
|
||||
virtual void failedAssertLessThanEquals( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ ) {}
|
||||
virtual void failedAssertPredicate( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ ) {}
|
||||
virtual void failedAssertRelation( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/,
|
||||
const char * /*x*/, const char * /*y*/ ) {}
|
||||
virtual void failedAssertThrows( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/, const char * /*type*/,
|
||||
bool /*otherThrown*/ ) {}
|
||||
virtual void failedAssertThrowsNot( const char * /*file*/, unsigned /*line*/,
|
||||
const char * /*expression*/ ) {}
|
||||
virtual void leaveTest( const TestDescription & /*desc*/ ) {}
|
||||
virtual void leaveSuite( const SuiteDescription & /*desc*/ ) {}
|
||||
virtual void leaveWorld( const WorldDescription & /*desc*/ ) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__TestListener_h__
|
125
test/cxxtest/cxxtest/TestRunner.h
Normal file
125
test/cxxtest/cxxtest/TestRunner.h
Normal file
|
@ -0,0 +1,125 @@
|
|||
#ifndef __cxxtest_TestRunner_h__
|
||||
#define __cxxtest_TestRunner_h__
|
||||
|
||||
//
|
||||
// TestRunner is the class that runs all the tests.
|
||||
// To use it, create an object that implements the TestListener
|
||||
// interface and call TestRunner::runAllTests( myListener );
|
||||
//
|
||||
|
||||
#include <cxxtest/TestListener.h>
|
||||
#include <cxxtest/RealDescriptions.h>
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <cxxtest/TestTracker.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TestRunner
|
||||
{
|
||||
public:
|
||||
static void runAllTests( TestListener &listener )
|
||||
{
|
||||
tracker().setListener( &listener );
|
||||
_TS_TRY { TestRunner().runWorld(); }
|
||||
_TS_LAST_CATCH( { tracker().failedTest( __FILE__, __LINE__, "Exception thrown from world" ); } );
|
||||
tracker().setListener( 0 );
|
||||
}
|
||||
|
||||
static void runAllTests( TestListener *listener )
|
||||
{
|
||||
if ( listener ) {
|
||||
listener->warning( __FILE__, __LINE__, "Deprecated; Use runAllTests( TestListener & )" );
|
||||
runAllTests( *listener );
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void runWorld()
|
||||
{
|
||||
RealWorldDescription wd;
|
||||
WorldGuard sg;
|
||||
|
||||
tracker().enterWorld( wd );
|
||||
if ( wd.setUp() ) {
|
||||
for ( SuiteDescription *sd = wd.firstSuite(); sd; sd = sd->next() )
|
||||
if ( sd->active() )
|
||||
runSuite( *sd );
|
||||
|
||||
wd.tearDown();
|
||||
}
|
||||
tracker().leaveWorld( wd );
|
||||
}
|
||||
|
||||
void runSuite( SuiteDescription &sd )
|
||||
{
|
||||
StateGuard sg;
|
||||
|
||||
tracker().enterSuite( sd );
|
||||
if ( sd.setUp() ) {
|
||||
for ( TestDescription *td = sd.firstTest(); td; td = td->next() )
|
||||
if ( td->active() )
|
||||
runTest( *td );
|
||||
|
||||
sd.tearDown();
|
||||
}
|
||||
tracker().leaveSuite( sd );
|
||||
}
|
||||
|
||||
void runTest( TestDescription &td )
|
||||
{
|
||||
StateGuard sg;
|
||||
|
||||
tracker().enterTest( td );
|
||||
if ( td.setUp() ) {
|
||||
td.run();
|
||||
td.tearDown();
|
||||
}
|
||||
tracker().leaveTest( td );
|
||||
}
|
||||
|
||||
class StateGuard
|
||||
{
|
||||
#ifdef _CXXTEST_HAVE_EH
|
||||
bool _abortTestOnFail;
|
||||
#endif // _CXXTEST_HAVE_EH
|
||||
unsigned _maxDumpSize;
|
||||
|
||||
public:
|
||||
StateGuard()
|
||||
{
|
||||
#ifdef _CXXTEST_HAVE_EH
|
||||
_abortTestOnFail = abortTestOnFail();
|
||||
#endif // _CXXTEST_HAVE_EH
|
||||
_maxDumpSize = maxDumpSize();
|
||||
}
|
||||
|
||||
~StateGuard()
|
||||
{
|
||||
#ifdef _CXXTEST_HAVE_EH
|
||||
setAbortTestOnFail( _abortTestOnFail );
|
||||
#endif // _CXXTEST_HAVE_EH
|
||||
setMaxDumpSize( _maxDumpSize );
|
||||
}
|
||||
};
|
||||
|
||||
class WorldGuard : public StateGuard
|
||||
{
|
||||
public:
|
||||
WorldGuard() : StateGuard()
|
||||
{
|
||||
#ifdef _CXXTEST_HAVE_EH
|
||||
setAbortTestOnFail( CXXTEST_DEFAULT_ABORT );
|
||||
#endif // _CXXTEST_HAVE_EH
|
||||
setMaxDumpSize( CXXTEST_MAX_DUMP_SIZE );
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
//
|
||||
// For --no-static-init
|
||||
//
|
||||
void initialize();
|
||||
};
|
||||
|
||||
|
||||
#endif // __cxxtest_TestRunner_h__
|
138
test/cxxtest/cxxtest/TestSuite.cpp
Normal file
138
test/cxxtest/cxxtest/TestSuite.cpp
Normal file
|
@ -0,0 +1,138 @@
|
|||
#ifndef __cxxtest__TestSuite_cpp__
|
||||
#define __cxxtest__TestSuite_cpp__
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
//
|
||||
// TestSuite members
|
||||
//
|
||||
TestSuite::~TestSuite() {}
|
||||
void TestSuite::setUp() {}
|
||||
void TestSuite::tearDown() {}
|
||||
|
||||
//
|
||||
// Test-aborting stuff
|
||||
//
|
||||
static bool currentAbortTestOnFail = false;
|
||||
|
||||
bool abortTestOnFail()
|
||||
{
|
||||
return currentAbortTestOnFail;
|
||||
}
|
||||
|
||||
void setAbortTestOnFail( bool value )
|
||||
{
|
||||
currentAbortTestOnFail = value;
|
||||
}
|
||||
|
||||
void doAbortTest()
|
||||
{
|
||||
# if defined(_CXXTEST_HAVE_EH)
|
||||
if ( currentAbortTestOnFail )
|
||||
throw AbortTest();
|
||||
# endif // _CXXTEST_HAVE_EH
|
||||
}
|
||||
|
||||
//
|
||||
// Max dump size
|
||||
//
|
||||
static unsigned currentMaxDumpSize = CXXTEST_MAX_DUMP_SIZE;
|
||||
|
||||
unsigned maxDumpSize()
|
||||
{
|
||||
return currentMaxDumpSize;
|
||||
}
|
||||
|
||||
void setMaxDumpSize( unsigned value )
|
||||
{
|
||||
currentMaxDumpSize = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Some non-template functions
|
||||
//
|
||||
void doTrace( const char *file, unsigned line, const char *message )
|
||||
{
|
||||
tracker().trace( file, line, message );
|
||||
}
|
||||
|
||||
void doWarn( const char *file, unsigned line, const char *message )
|
||||
{
|
||||
tracker().warning( file, line, message );
|
||||
}
|
||||
|
||||
void doFailTest( const char *file, unsigned line, const char *message )
|
||||
{
|
||||
tracker().failedTest( file, line, message );
|
||||
TS_ABORT();
|
||||
}
|
||||
|
||||
void doFailAssert( const char *file, unsigned line,
|
||||
const char *expression, const char *message )
|
||||
{
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssert( file, line, expression );
|
||||
TS_ABORT();
|
||||
}
|
||||
|
||||
bool sameData( const void *x, const void *y, unsigned size )
|
||||
{
|
||||
if ( size == 0 )
|
||||
return true;
|
||||
|
||||
if ( x == y )
|
||||
return true;
|
||||
|
||||
if ( !x || !y )
|
||||
return false;
|
||||
|
||||
const char *cx = (const char *)x;
|
||||
const char *cy = (const char *)y;
|
||||
while ( size -- )
|
||||
if ( *cx++ != *cy++ )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void doAssertSameData( const char *file, unsigned line,
|
||||
const char *xExpr, const void *x,
|
||||
const char *yExpr, const void *y,
|
||||
const char *sizeExpr, unsigned size,
|
||||
const char *message )
|
||||
{
|
||||
if ( !sameData( x, y, size ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertSameData( file, line, xExpr, yExpr, sizeExpr, x, y, size );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
void doFailAssertThrows( const char *file, unsigned line,
|
||||
const char *expr, const char *type,
|
||||
bool otherThrown,
|
||||
const char *message )
|
||||
{
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
|
||||
tracker().failedAssertThrows( file, line, expr, type, otherThrown );
|
||||
TS_ABORT();
|
||||
}
|
||||
|
||||
void doFailAssertThrowsNot( const char *file, unsigned line,
|
||||
const char *expression, const char *message )
|
||||
{
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
|
||||
tracker().failedAssertThrowsNot( file, line, expression );
|
||||
TS_ABORT();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __cxxtest__TestSuite_cpp__
|
512
test/cxxtest/cxxtest/TestSuite.h
Normal file
512
test/cxxtest/cxxtest/TestSuite.h
Normal file
|
@ -0,0 +1,512 @@
|
|||
#ifndef __cxxtest__TestSuite_h__
|
||||
#define __cxxtest__TestSuite_h__
|
||||
|
||||
//
|
||||
// class TestSuite is the base class for all test suites.
|
||||
// To define a test suite, derive from this class and add
|
||||
// member functions called void test*();
|
||||
//
|
||||
|
||||
#include <cxxtest/Flags.h>
|
||||
#include <cxxtest/TestTracker.h>
|
||||
#include <cxxtest/Descriptions.h>
|
||||
#include <cxxtest/ValueTraits.h>
|
||||
|
||||
#ifdef _CXXTEST_HAVE_STD
|
||||
# include <stdexcept>
|
||||
#endif // _CXXTEST_HAVE_STD
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TestSuite
|
||||
{
|
||||
public:
|
||||
virtual ~TestSuite();
|
||||
virtual void setUp();
|
||||
virtual void tearDown();
|
||||
};
|
||||
|
||||
class AbortTest {};
|
||||
void doAbortTest();
|
||||
# define TS_ABORT() CxxTest::doAbortTest()
|
||||
|
||||
bool abortTestOnFail();
|
||||
void setAbortTestOnFail( bool value = CXXTEST_DEFAULT_ABORT );
|
||||
|
||||
unsigned maxDumpSize();
|
||||
void setMaxDumpSize( unsigned value = CXXTEST_MAX_DUMP_SIZE );
|
||||
|
||||
void doTrace( const char *file, unsigned line, const char *message );
|
||||
void doWarn( const char *file, unsigned line, const char *message );
|
||||
void doFailTest( const char *file, unsigned line, const char *message );
|
||||
void doFailAssert( const char *file, unsigned line, const char *expression, const char *message );
|
||||
|
||||
template<class X, class Y>
|
||||
bool equals( X x, Y y )
|
||||
{
|
||||
return (x == y);
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
void doAssertEquals( const char *file, unsigned line,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *message )
|
||||
{
|
||||
if ( !equals( x, y ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertEquals( file, line, xExpr, yExpr, TS_AS_STRING(x), TS_AS_STRING(y) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
void doAssertSameData( const char *file, unsigned line,
|
||||
const char *xExpr, const void *x,
|
||||
const char *yExpr, const void *y,
|
||||
const char *sizeExpr, unsigned size,
|
||||
const char *message );
|
||||
|
||||
template<class X, class Y>
|
||||
bool differs( X x, Y y )
|
||||
{
|
||||
return !(x == y);
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
void doAssertDiffers( const char *file, unsigned line,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *message )
|
||||
{
|
||||
if ( !differs( x, y ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertDiffers( file, line, xExpr, yExpr, TS_AS_STRING(x) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
bool lessThan( X x, Y y )
|
||||
{
|
||||
return (x < y);
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
void doAssertLessThan( const char *file, unsigned line,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *message )
|
||||
{
|
||||
if ( !lessThan(x, y) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertLessThan( file, line, xExpr, yExpr, TS_AS_STRING(x), TS_AS_STRING(y) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
bool lessThanEquals( X x, Y y )
|
||||
{
|
||||
return (x <= y);
|
||||
}
|
||||
|
||||
template<class X, class Y>
|
||||
void doAssertLessThanEquals( const char *file, unsigned line,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *message )
|
||||
{
|
||||
if ( !lessThanEquals( x, y ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertLessThanEquals( file, line, xExpr, yExpr, TS_AS_STRING(x), TS_AS_STRING(y) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
template<class X, class P>
|
||||
void doAssertPredicate( const char *file, unsigned line,
|
||||
const char *pExpr, const P &p,
|
||||
const char *xExpr, X x,
|
||||
const char *message )
|
||||
{
|
||||
if ( !p( x ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertPredicate( file, line, pExpr, xExpr, TS_AS_STRING(x) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
template<class X, class Y, class R>
|
||||
void doAssertRelation( const char *file, unsigned line,
|
||||
const char *rExpr, const R &r,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *message )
|
||||
{
|
||||
if ( !r( x, y ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
tracker().failedAssertRelation( file, line, rExpr, xExpr, yExpr, TS_AS_STRING(x), TS_AS_STRING(y) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
template<class X, class Y, class D>
|
||||
bool delta( X x, Y y, D d )
|
||||
{
|
||||
return ((y >= x - d) && (y <= x + d));
|
||||
}
|
||||
|
||||
template<class X, class Y, class D>
|
||||
void doAssertDelta( const char *file, unsigned line,
|
||||
const char *xExpr, X x,
|
||||
const char *yExpr, Y y,
|
||||
const char *dExpr, D d,
|
||||
const char *message )
|
||||
{
|
||||
if ( !delta( x, y, d ) ) {
|
||||
if ( message )
|
||||
tracker().failedTest( file, line, message );
|
||||
|
||||
tracker().failedAssertDelta( file, line, xExpr, yExpr, dExpr,
|
||||
TS_AS_STRING(x), TS_AS_STRING(y), TS_AS_STRING(d) );
|
||||
TS_ABORT();
|
||||
}
|
||||
}
|
||||
|
||||
void doFailAssertThrows( const char *file, unsigned line,
|
||||
const char *expr, const char *type,
|
||||
bool otherThrown,
|
||||
const char *message );
|
||||
|
||||
void doFailAssertThrowsNot( const char *file, unsigned line,
|
||||
const char *expression, const char *message );
|
||||
|
||||
# ifdef _CXXTEST_HAVE_EH
|
||||
# define _TS_TRY try
|
||||
# define _TS_CATCH_TYPE(t, b) catch t b
|
||||
# define _TS_CATCH_ABORT(b) _TS_CATCH_TYPE( (const CxxTest::AbortTest &), b )
|
||||
# define _TS_LAST_CATCH(b) _TS_CATCH_TYPE( (...), b )
|
||||
# define _TSM_LAST_CATCH(f,l,m) _TS_LAST_CATCH( { (CxxTest::tracker()).failedTest(f,l,m); } )
|
||||
# ifdef _CXXTEST_HAVE_STD
|
||||
# define ___TSM_CATCH(f,l,m) \
|
||||
catch(const std::exception &e) { (CxxTest::tracker()).failedTest(f,l,e.what()); } \
|
||||
_TSM_LAST_CATCH(f,l,m)
|
||||
# else // !_CXXTEST_HAVE_STD
|
||||
# define ___TSM_CATCH(f,l,m) _TSM_LAST_CATCH(f,l,m)
|
||||
# endif // _CXXTEST_HAVE_STD
|
||||
# define __TSM_CATCH(f,l,m) \
|
||||
_TS_CATCH_ABORT( { throw; } ) \
|
||||
___TSM_CATCH(f,l,m)
|
||||
# define __TS_CATCH(f,l) __TSM_CATCH(f,l,"Unhandled exception")
|
||||
# define _TS_CATCH __TS_CATCH(__FILE__,__LINE__)
|
||||
# else // !_CXXTEST_HAVE_EH
|
||||
# define _TS_TRY
|
||||
# define ___TSM_CATCH(f,l,m)
|
||||
# define __TSM_CATCH(f,l,m)
|
||||
# define __TS_CATCH(f,l)
|
||||
# define _TS_CATCH
|
||||
# define _TS_CATCH_TYPE(t, b)
|
||||
# define _TS_LAST_CATCH(b)
|
||||
# define _TS_CATCH_ABORT(b)
|
||||
# endif // _CXXTEST_HAVE_EH
|
||||
|
||||
// TS_TRACE
|
||||
# define _TS_TRACE(f,l,e) CxxTest::doTrace( (f), (l), TS_AS_STRING(e) )
|
||||
# define TS_TRACE(e) _TS_TRACE( __FILE__, __LINE__, e )
|
||||
|
||||
// TS_WARN
|
||||
# define _TS_WARN(f,l,e) CxxTest::doWarn( (f), (l), TS_AS_STRING(e) )
|
||||
# define TS_WARN(e) _TS_WARN( __FILE__, __LINE__, e )
|
||||
|
||||
// TS_FAIL
|
||||
# define _TS_FAIL(f,l,e) CxxTest::doFailTest( (f), (l), TS_AS_STRING(e) )
|
||||
# define TS_FAIL(e) _TS_FAIL( __FILE__, __LINE__, e )
|
||||
|
||||
// TS_ASSERT
|
||||
# define ___ETS_ASSERT(f,l,e,m) { if ( !(e) ) CxxTest::doFailAssert( (f), (l), #e, (m) ); }
|
||||
# define ___TS_ASSERT(f,l,e,m) { _TS_TRY { ___ETS_ASSERT(f,l,e,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT(f,l,e) ___ETS_ASSERT(f,l,e,0)
|
||||
# define _TS_ASSERT(f,l,e) ___TS_ASSERT(f,l,e,0)
|
||||
|
||||
# define ETS_ASSERT(e) _ETS_ASSERT(__FILE__,__LINE__,e)
|
||||
# define TS_ASSERT(e) _TS_ASSERT(__FILE__,__LINE__,e)
|
||||
|
||||
# define _ETSM_ASSERT(f,l,m,e) ___ETS_ASSERT(f,l,e,TS_AS_STRING(m) )
|
||||
# define _TSM_ASSERT(f,l,m,e) ___TS_ASSERT(f,l,e,TS_AS_STRING(m) )
|
||||
|
||||
# define ETSM_ASSERT(m,e) _ETSM_ASSERT(__FILE__,__LINE__,m,e)
|
||||
# define TSM_ASSERT(m,e) _TSM_ASSERT(__FILE__,__LINE__,m,e)
|
||||
|
||||
// TS_ASSERT_EQUALS
|
||||
# define ___ETS_ASSERT_EQUALS(f,l,x,y,m) CxxTest::doAssertEquals( (f), (l), #x, (x), #y, (y), (m) )
|
||||
# define ___TS_ASSERT_EQUALS(f,l,x,y,m) { _TS_TRY { ___ETS_ASSERT_EQUALS(f,l,x,y,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_EQUALS(f,l,x,y) ___ETS_ASSERT_EQUALS(f,l,x,y,0)
|
||||
# define _TS_ASSERT_EQUALS(f,l,x,y) ___TS_ASSERT_EQUALS(f,l,x,y,0)
|
||||
|
||||
# define ETS_ASSERT_EQUALS(x,y) _ETS_ASSERT_EQUALS(__FILE__,__LINE__,x,y)
|
||||
# define TS_ASSERT_EQUALS(x,y) _TS_ASSERT_EQUALS(__FILE__,__LINE__,x,y)
|
||||
|
||||
# define _ETSM_ASSERT_EQUALS(f,l,m,x,y) ___ETS_ASSERT_EQUALS(f,l,x,y,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_EQUALS(f,l,m,x,y) ___TS_ASSERT_EQUALS(f,l,x,y,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_EQUALS(m,x,y) _ETSM_ASSERT_EQUALS(__FILE__,__LINE__,m,x,y)
|
||||
# define TSM_ASSERT_EQUALS(m,x,y) _TSM_ASSERT_EQUALS(__FILE__,__LINE__,m,x,y)
|
||||
|
||||
// TS_ASSERT_SAME_DATA
|
||||
# define ___ETS_ASSERT_SAME_DATA(f,l,x,y,s,m) CxxTest::doAssertSameData( (f), (l), #x, (x), #y, (y), #s, (s), (m) )
|
||||
# define ___TS_ASSERT_SAME_DATA(f,l,x,y,s,m) { _TS_TRY { ___ETS_ASSERT_SAME_DATA(f,l,x,y,s,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_SAME_DATA(f,l,x,y,s) ___ETS_ASSERT_SAME_DATA(f,l,x,y,s,0)
|
||||
# define _TS_ASSERT_SAME_DATA(f,l,x,y,s) ___TS_ASSERT_SAME_DATA(f,l,x,y,s,0)
|
||||
|
||||
# define ETS_ASSERT_SAME_DATA(x,y,s) _ETS_ASSERT_SAME_DATA(__FILE__,__LINE__,x,y,s)
|
||||
# define TS_ASSERT_SAME_DATA(x,y,s) _TS_ASSERT_SAME_DATA(__FILE__,__LINE__,x,y,s)
|
||||
|
||||
# define _ETSM_ASSERT_SAME_DATA(f,l,m,x,y,s) ___ETS_ASSERT_SAME_DATA(f,l,x,y,s,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_SAME_DATA(f,l,m,x,y,s) ___TS_ASSERT_SAME_DATA(f,l,x,y,s,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_SAME_DATA(m,x,y,s) _ETSM_ASSERT_SAME_DATA(__FILE__,__LINE__,m,x,y,s)
|
||||
# define TSM_ASSERT_SAME_DATA(m,x,y,s) _TSM_ASSERT_SAME_DATA(__FILE__,__LINE__,m,x,y,s)
|
||||
|
||||
// TS_ASSERT_DIFFERS
|
||||
# define ___ETS_ASSERT_DIFFERS(f,l,x,y,m) CxxTest::doAssertDiffers( (f), (l), #x, (x), #y, (y), (m) )
|
||||
# define ___TS_ASSERT_DIFFERS(f,l,x,y,m) { _TS_TRY { ___ETS_ASSERT_DIFFERS(f,l,x,y,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_DIFFERS(f,l,x,y) ___ETS_ASSERT_DIFFERS(f,l,x,y,0)
|
||||
# define _TS_ASSERT_DIFFERS(f,l,x,y) ___TS_ASSERT_DIFFERS(f,l,x,y,0)
|
||||
|
||||
# define ETS_ASSERT_DIFFERS(x,y) _ETS_ASSERT_DIFFERS(__FILE__,__LINE__,x,y)
|
||||
# define TS_ASSERT_DIFFERS(x,y) _TS_ASSERT_DIFFERS(__FILE__,__LINE__,x,y)
|
||||
|
||||
# define _ETSM_ASSERT_DIFFERS(f,l,m,x,y) ___ETS_ASSERT_DIFFERS(f,l,x,y,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_DIFFERS(f,l,m,x,y) ___TS_ASSERT_DIFFERS(f,l,x,y,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_DIFFERS(m,x,y) _ETSM_ASSERT_DIFFERS(__FILE__,__LINE__,m,x,y)
|
||||
# define TSM_ASSERT_DIFFERS(m,x,y) _TSM_ASSERT_DIFFERS(__FILE__,__LINE__,m,x,y)
|
||||
|
||||
// TS_ASSERT_LESS_THAN
|
||||
# define ___ETS_ASSERT_LESS_THAN(f,l,x,y,m) CxxTest::doAssertLessThan( (f), (l), #x, (x), #y, (y), (m) )
|
||||
# define ___TS_ASSERT_LESS_THAN(f,l,x,y,m) { _TS_TRY { ___ETS_ASSERT_LESS_THAN(f,l,x,y,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_LESS_THAN(f,l,x,y) ___ETS_ASSERT_LESS_THAN(f,l,x,y,0)
|
||||
# define _TS_ASSERT_LESS_THAN(f,l,x,y) ___TS_ASSERT_LESS_THAN(f,l,x,y,0)
|
||||
|
||||
# define ETS_ASSERT_LESS_THAN(x,y) _ETS_ASSERT_LESS_THAN(__FILE__,__LINE__,x,y)
|
||||
# define TS_ASSERT_LESS_THAN(x,y) _TS_ASSERT_LESS_THAN(__FILE__,__LINE__,x,y)
|
||||
|
||||
# define _ETSM_ASSERT_LESS_THAN(f,l,m,x,y) ___ETS_ASSERT_LESS_THAN(f,l,x,y,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_LESS_THAN(f,l,m,x,y) ___TS_ASSERT_LESS_THAN(f,l,x,y,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_LESS_THAN(m,x,y) _ETSM_ASSERT_LESS_THAN(__FILE__,__LINE__,m,x,y)
|
||||
# define TSM_ASSERT_LESS_THAN(m,x,y) _TSM_ASSERT_LESS_THAN(__FILE__,__LINE__,m,x,y)
|
||||
|
||||
// TS_ASSERT_LESS_THAN_EQUALS
|
||||
# define ___ETS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,m) \
|
||||
CxxTest::doAssertLessThanEquals( (f), (l), #x, (x), #y, (y), (m) )
|
||||
# define ___TS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,m) \
|
||||
{ _TS_TRY { ___ETS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_LESS_THAN_EQUALS(f,l,x,y) ___ETS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,0)
|
||||
# define _TS_ASSERT_LESS_THAN_EQUALS(f,l,x,y) ___TS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,0)
|
||||
|
||||
# define ETS_ASSERT_LESS_THAN_EQUALS(x,y) _ETS_ASSERT_LESS_THAN_EQUALS(__FILE__,__LINE__,x,y)
|
||||
# define TS_ASSERT_LESS_THAN_EQUALS(x,y) _TS_ASSERT_LESS_THAN_EQUALS(__FILE__,__LINE__,x,y)
|
||||
|
||||
# define _ETSM_ASSERT_LESS_THAN_EQUALS(f,l,m,x,y) ___ETS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_LESS_THAN_EQUALS(f,l,m,x,y) ___TS_ASSERT_LESS_THAN_EQUALS(f,l,x,y,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_LESS_THAN_EQUALS(m,x,y) _ETSM_ASSERT_LESS_THAN_EQUALS(__FILE__,__LINE__,m,x,y)
|
||||
# define TSM_ASSERT_LESS_THAN_EQUALS(m,x,y) _TSM_ASSERT_LESS_THAN_EQUALS(__FILE__,__LINE__,m,x,y)
|
||||
|
||||
// TS_ASSERT_PREDICATE
|
||||
# define ___ETS_ASSERT_PREDICATE(f,l,p,x,m) \
|
||||
CxxTest::doAssertPredicate( (f), (l), #p, p(), #x, (x), (m) )
|
||||
# define ___TS_ASSERT_PREDICATE(f,l,p,x,m) \
|
||||
{ _TS_TRY { ___ETS_ASSERT_PREDICATE(f,l,p,x,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_PREDICATE(f,l,p,x) ___ETS_ASSERT_PREDICATE(f,l,p,x,0)
|
||||
# define _TS_ASSERT_PREDICATE(f,l,p,x) ___TS_ASSERT_PREDICATE(f,l,p,x,0)
|
||||
|
||||
# define ETS_ASSERT_PREDICATE(p,x) _ETS_ASSERT_PREDICATE(__FILE__,__LINE__,p,x)
|
||||
# define TS_ASSERT_PREDICATE(p,x) _TS_ASSERT_PREDICATE(__FILE__,__LINE__,p,x)
|
||||
|
||||
# define _ETSM_ASSERT_PREDICATE(f,l,m,p,x) ___ETS_ASSERT_PREDICATE(f,l,p,x,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_PREDICATE(f,l,m,p,x) ___TS_ASSERT_PREDICATE(f,l,p,x,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_PREDICATE(m,p,x) _ETSM_ASSERT_PREDICATE(__FILE__,__LINE__,m,p,x)
|
||||
# define TSM_ASSERT_PREDICATE(m,p,x) _TSM_ASSERT_PREDICATE(__FILE__,__LINE__,m,p,x)
|
||||
|
||||
// TS_ASSERT_RELATION
|
||||
# define ___ETS_ASSERT_RELATION(f,l,r,x,y,m) \
|
||||
CxxTest::doAssertRelation( (f), (l), #r, r(), #x, (x), #y, (y), (m) )
|
||||
# define ___TS_ASSERT_RELATION(f,l,r,x,y,m) \
|
||||
{ _TS_TRY { ___ETS_ASSERT_RELATION(f,l,r,x,y,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_RELATION(f,l,r,x,y) ___ETS_ASSERT_RELATION(f,l,r,x,y,0)
|
||||
# define _TS_ASSERT_RELATION(f,l,r,x,y) ___TS_ASSERT_RELATION(f,l,r,x,y,0)
|
||||
|
||||
# define ETS_ASSERT_RELATION(r,x,y) _ETS_ASSERT_RELATION(__FILE__,__LINE__,r,x,y)
|
||||
# define TS_ASSERT_RELATION(r,x,y) _TS_ASSERT_RELATION(__FILE__,__LINE__,r,x,y)
|
||||
|
||||
# define _ETSM_ASSERT_RELATION(f,l,m,r,x,y) ___ETS_ASSERT_RELATION(f,l,r,x,y,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_RELATION(f,l,m,r,x,y) ___TS_ASSERT_RELATION(f,l,r,x,y,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_RELATION(m,r,x,y) _ETSM_ASSERT_RELATION(__FILE__,__LINE__,m,r,x,y)
|
||||
# define TSM_ASSERT_RELATION(m,r,x,y) _TSM_ASSERT_RELATION(__FILE__,__LINE__,m,r,x,y)
|
||||
|
||||
// TS_ASSERT_DELTA
|
||||
# define ___ETS_ASSERT_DELTA(f,l,x,y,d,m) CxxTest::doAssertDelta( (f), (l), #x, (x), #y, (y), #d, (d), (m) )
|
||||
# define ___TS_ASSERT_DELTA(f,l,x,y,d,m) { _TS_TRY { ___ETS_ASSERT_DELTA(f,l,x,y,d,m); } __TS_CATCH(f,l) }
|
||||
|
||||
# define _ETS_ASSERT_DELTA(f,l,x,y,d) ___ETS_ASSERT_DELTA(f,l,x,y,d,0)
|
||||
# define _TS_ASSERT_DELTA(f,l,x,y,d) ___TS_ASSERT_DELTA(f,l,x,y,d,0)
|
||||
|
||||
# define ETS_ASSERT_DELTA(x,y,d) _ETS_ASSERT_DELTA(__FILE__,__LINE__,x,y,d)
|
||||
# define TS_ASSERT_DELTA(x,y,d) _TS_ASSERT_DELTA(__FILE__,__LINE__,x,y,d)
|
||||
|
||||
# define _ETSM_ASSERT_DELTA(f,l,m,x,y,d) ___ETS_ASSERT_DELTA(f,l,x,y,d,TS_AS_STRING(m))
|
||||
# define _TSM_ASSERT_DELTA(f,l,m,x,y,d) ___TS_ASSERT_DELTA(f,l,x,y,d,TS_AS_STRING(m))
|
||||
|
||||
# define ETSM_ASSERT_DELTA(m,x,y,d) _ETSM_ASSERT_DELTA(__FILE__,__LINE__,m,x,y,d)
|
||||
# define TSM_ASSERT_DELTA(m,x,y,d) _TSM_ASSERT_DELTA(__FILE__,__LINE__,m,x,y,d)
|
||||
|
||||
// TS_ASSERT_THROWS
|
||||
# define ___TS_ASSERT_THROWS(f,l,e,t,m) { \
|
||||
bool _ts_threw_expected = false, _ts_threw_else = false; \
|
||||
_TS_TRY { e; } \
|
||||
_TS_CATCH_TYPE( (t), { _ts_threw_expected = true; } ) \
|
||||
_TS_CATCH_ABORT( { throw; } ) \
|
||||
_TS_LAST_CATCH( { _ts_threw_else = true; } ) \
|
||||
if ( !_ts_threw_expected ) { CxxTest::doFailAssertThrows( (f), (l), #e, #t, _ts_threw_else, (m) ); } }
|
||||
|
||||
# define _TS_ASSERT_THROWS(f,l,e,t) ___TS_ASSERT_THROWS(f,l,e,t,0)
|
||||
# define TS_ASSERT_THROWS(e,t) _TS_ASSERT_THROWS(__FILE__,__LINE__,e,t)
|
||||
|
||||
# define _TSM_ASSERT_THROWS(f,l,m,e,t) ___TS_ASSERT_THROWS(f,l,e,t,TS_AS_STRING(m))
|
||||
# define TSM_ASSERT_THROWS(m,e,t) _TSM_ASSERT_THROWS(__FILE__,__LINE__,m,e,t)
|
||||
|
||||
// TS_ASSERT_THROWS_ASSERT
|
||||
# define ___TS_ASSERT_THROWS_ASSERT(f,l,e,t,a,m) { \
|
||||
bool _ts_threw_expected = false, _ts_threw_else = false; \
|
||||
_TS_TRY { e; } \
|
||||
_TS_CATCH_TYPE( (t), { a; _ts_threw_expected = true; } ) \
|
||||
_TS_CATCH_ABORT( { throw; } ) \
|
||||
_TS_LAST_CATCH( { _ts_threw_else = true; } ) \
|
||||
if ( !_ts_threw_expected ) { CxxTest::doFailAssertThrows( (f), (l), #e, #t, _ts_threw_else, (m) ); } }
|
||||
|
||||
# define _TS_ASSERT_THROWS_ASSERT(f,l,e,t,a) ___TS_ASSERT_THROWS_ASSERT(f,l,e,t,a,0)
|
||||
# define TS_ASSERT_THROWS_ASSERT(e,t,a) _TS_ASSERT_THROWS_ASSERT(__FILE__,__LINE__,e,t,a)
|
||||
|
||||
# define _TSM_ASSERT_THROWS_ASSERT(f,l,m,e,t,a) ___TS_ASSERT_THROWS_ASSERT(f,l,e,t,a,TS_AS_STRING(m))
|
||||
# define TSM_ASSERT_THROWS_ASSERT(m,e,t,a) _TSM_ASSERT_THROWS_ASSERT(__FILE__,__LINE__,m,e,t,a)
|
||||
|
||||
// TS_ASSERT_THROWS_EQUALS
|
||||
# define TS_ASSERT_THROWS_EQUALS(e,t,x,y) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_EQUALS(x,y))
|
||||
# define TSM_ASSERT_THROWS_EQUALS(m,e,t,x,y) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_EQUALS(m,x,y))
|
||||
|
||||
// TS_ASSERT_THROWS_DIFFERS
|
||||
# define TS_ASSERT_THROWS_DIFFERS(e,t,x,y) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_DIFFERS(x,y))
|
||||
# define TSM_ASSERT_THROWS_DIFFERS(m,e,t,x,y) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_DIFFERS(m,x,y))
|
||||
|
||||
// TS_ASSERT_THROWS_DELTA
|
||||
# define TS_ASSERT_THROWS_DELTA(e,t,x,y,d) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_DELTA(x,y,d))
|
||||
# define TSM_ASSERT_THROWS_DELTA(m,e,t,x,y,d) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_DELTA(m,x,y,d))
|
||||
|
||||
// TS_ASSERT_THROWS_SAME_DATA
|
||||
# define TS_ASSERT_THROWS_SAME_DATA(e,t,x,y,s) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_SAME_DATA(x,y,s))
|
||||
# define TSM_ASSERT_THROWS_SAME_DATA(m,e,t,x,y,s) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_SAME_DATA(m,x,y,s))
|
||||
|
||||
// TS_ASSERT_THROWS_LESS_THAN
|
||||
# define TS_ASSERT_THROWS_LESS_THAN(e,t,x,y) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_LESS_THAN(x,y))
|
||||
# define TSM_ASSERT_THROWS_LESS_THAN(m,e,t,x,y) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_LESS_THAN(m,x,y))
|
||||
|
||||
// TS_ASSERT_THROWS_LESS_THAN_EQUALS
|
||||
# define TS_ASSERT_THROWS_LESS_THAN_EQUALS(e,t,x,y) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_LESS_THAN_EQUALS(x,y))
|
||||
# define TSM_ASSERT_THROWS_LESS_THAN_EQUALS(m,e,t,x,y) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_LESS_THAN_EQUALS(m,x,y))
|
||||
|
||||
// TS_ASSERT_THROWS_PREDICATE
|
||||
# define TS_ASSERT_THROWS_PREDICATE(e,t,p,v) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_PREDICATE(p,v))
|
||||
# define TSM_ASSERT_THROWS_PREDICATE(m,e,t,p,v) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_PREDICATE(m,p,v))
|
||||
|
||||
// TS_ASSERT_THROWS_RELATION
|
||||
# define TS_ASSERT_THROWS_RELATION(e,t,r,x,y) TS_ASSERT_THROWS_ASSERT(e,t,TS_ASSERT_RELATION(r,x,y))
|
||||
# define TSM_ASSERT_THROWS_RELATION(m,e,t,r,x,y) TSM_ASSERT_THROWS_ASSERT(m,e,t,TSM_ASSERT_RELATION(m,r,x,y))
|
||||
|
||||
// TS_ASSERT_THROWS_ANYTHING
|
||||
# define ___TS_ASSERT_THROWS_ANYTHING(f,l,e,m) { \
|
||||
bool _ts_threw = false; \
|
||||
_TS_TRY { e; } \
|
||||
_TS_LAST_CATCH( { _ts_threw = true; } ) \
|
||||
if ( !_ts_threw ) { CxxTest::doFailAssertThrows( (f), (l), #e, "...", false, (m) ); } }
|
||||
|
||||
# define _TS_ASSERT_THROWS_ANYTHING(f,l,e) ___TS_ASSERT_THROWS_ANYTHING(f,l,e,0)
|
||||
# define TS_ASSERT_THROWS_ANYTHING(e) _TS_ASSERT_THROWS_ANYTHING(__FILE__, __LINE__, e)
|
||||
|
||||
# define _TSM_ASSERT_THROWS_ANYTHING(f,l,m,e) ___TS_ASSERT_THROWS_ANYTHING(f,l,e,TS_AS_STRING(m))
|
||||
# define TSM_ASSERT_THROWS_ANYTHING(m,e) _TSM_ASSERT_THROWS_ANYTHING(__FILE__,__LINE__,m,e)
|
||||
|
||||
// TS_ASSERT_THROWS_NOTHING
|
||||
# define ___TS_ASSERT_THROWS_NOTHING(f,l,e,m) { \
|
||||
_TS_TRY { e; } \
|
||||
_TS_CATCH_ABORT( { throw; } ) \
|
||||
_TS_LAST_CATCH( { CxxTest::doFailAssertThrowsNot( (f), (l), #e, (m) ); } ) }
|
||||
|
||||
# define _TS_ASSERT_THROWS_NOTHING(f,l,e) ___TS_ASSERT_THROWS_NOTHING(f,l,e,0)
|
||||
# define TS_ASSERT_THROWS_NOTHING(e) _TS_ASSERT_THROWS_NOTHING(__FILE__,__LINE__,e)
|
||||
|
||||
# define _TSM_ASSERT_THROWS_NOTHING(f,l,m,e) ___TS_ASSERT_THROWS_NOTHING(f,l,e,TS_AS_STRING(m))
|
||||
# define TSM_ASSERT_THROWS_NOTHING(m,e) _TSM_ASSERT_THROWS_NOTHING(__FILE__,__LINE__,m,e)
|
||||
|
||||
|
||||
//
|
||||
// This takes care of "signed <-> unsigned" warnings
|
||||
//
|
||||
# define CXXTEST_COMPARISONS(CXXTEST_X, CXXTEST_Y, CXXTEST_T) \
|
||||
inline bool equals( CXXTEST_X x, CXXTEST_Y y ) { return (((CXXTEST_T)x) == ((CXXTEST_T)y)); } \
|
||||
inline bool equals( CXXTEST_Y y, CXXTEST_X x ) { return (((CXXTEST_T)y) == ((CXXTEST_T)x)); } \
|
||||
inline bool differs( CXXTEST_X x, CXXTEST_Y y ) { return (((CXXTEST_T)x) != ((CXXTEST_T)y)); } \
|
||||
inline bool differs( CXXTEST_Y y, CXXTEST_X x ) { return (((CXXTEST_T)y) != ((CXXTEST_T)x)); } \
|
||||
inline bool lessThan( CXXTEST_X x, CXXTEST_Y y ) { return (((CXXTEST_T)x) < ((CXXTEST_T)y)); } \
|
||||
inline bool lessThan( CXXTEST_Y y, CXXTEST_X x ) { return (((CXXTEST_T)y) < ((CXXTEST_T)x)); } \
|
||||
inline bool lessThanEquals( CXXTEST_X x, CXXTEST_Y y ) { return (((CXXTEST_T)x) <= ((CXXTEST_T)y)); } \
|
||||
inline bool lessThanEquals( CXXTEST_Y y, CXXTEST_X x ) { return (((CXXTEST_T)y) <= ((CXXTEST_T)x)); }
|
||||
|
||||
# define CXXTEST_INTEGRAL(CXXTEST_T) \
|
||||
CXXTEST_COMPARISONS( signed CXXTEST_T, unsigned CXXTEST_T, unsigned CXXTEST_T )
|
||||
|
||||
CXXTEST_INTEGRAL( char )
|
||||
CXXTEST_INTEGRAL( short )
|
||||
CXXTEST_INTEGRAL( int )
|
||||
CXXTEST_INTEGRAL( long )
|
||||
# ifdef _CXXTEST_LONGLONG
|
||||
CXXTEST_INTEGRAL( _CXXTEST_LONGLONG )
|
||||
# endif // _CXXTEST_LONGLONG
|
||||
|
||||
# define CXXTEST_SMALL_BIG(CXXTEST_SMALL, CXXTEST_BIG) \
|
||||
CXXTEST_COMPARISONS( signed CXXTEST_SMALL, unsigned CXXTEST_BIG, unsigned CXXTEST_BIG ) \
|
||||
CXXTEST_COMPARISONS( signed CXXTEST_BIG, unsigned CXXTEST_SMALL, unsigned CXXTEST_BIG )
|
||||
|
||||
CXXTEST_SMALL_BIG( char, short )
|
||||
CXXTEST_SMALL_BIG( char, int )
|
||||
CXXTEST_SMALL_BIG( short, int )
|
||||
CXXTEST_SMALL_BIG( char, long )
|
||||
CXXTEST_SMALL_BIG( short, long )
|
||||
CXXTEST_SMALL_BIG( int, long )
|
||||
|
||||
# ifdef _CXXTEST_LONGLONG
|
||||
CXXTEST_SMALL_BIG( char, _CXXTEST_LONGLONG )
|
||||
CXXTEST_SMALL_BIG( short, _CXXTEST_LONGLONG )
|
||||
CXXTEST_SMALL_BIG( int, _CXXTEST_LONGLONG )
|
||||
CXXTEST_SMALL_BIG( long, _CXXTEST_LONGLONG )
|
||||
# endif // _CXXTEST_LONGLONG
|
||||
}
|
||||
|
||||
#endif // __cxxtest__TestSuite_h__
|
248
test/cxxtest/cxxtest/TestTracker.cpp
Normal file
248
test/cxxtest/cxxtest/TestTracker.cpp
Normal file
|
@ -0,0 +1,248 @@
|
|||
#ifndef __cxxtest__TestTracker_cpp__
|
||||
#define __cxxtest__TestTracker_cpp__
|
||||
|
||||
#include <cxxtest/TestTracker.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
bool TestTracker::_created = false;
|
||||
|
||||
TestTracker::TestTracker()
|
||||
{
|
||||
if ( !_created ) {
|
||||
initialize();
|
||||
_created = true;
|
||||
}
|
||||
}
|
||||
|
||||
TestTracker::~TestTracker()
|
||||
{
|
||||
}
|
||||
|
||||
TestTracker & TestTracker::tracker()
|
||||
{
|
||||
static TestTracker theTracker;
|
||||
return theTracker;
|
||||
}
|
||||
|
||||
void TestTracker::initialize()
|
||||
{
|
||||
_warnings = 0;
|
||||
_failedTests = 0;
|
||||
_testFailedAsserts = 0;
|
||||
_suiteFailedTests = 0;
|
||||
_failedSuites = 0;
|
||||
setListener( 0 );
|
||||
_world = 0;
|
||||
_suite = 0;
|
||||
_test = 0;
|
||||
}
|
||||
|
||||
const TestDescription *TestTracker::fixTest( const TestDescription *d ) const
|
||||
{
|
||||
return d ? d : &dummyTest();
|
||||
}
|
||||
|
||||
const SuiteDescription *TestTracker::fixSuite( const SuiteDescription *d ) const
|
||||
{
|
||||
return d ? d : &dummySuite();
|
||||
}
|
||||
|
||||
const WorldDescription *TestTracker::fixWorld( const WorldDescription *d ) const
|
||||
{
|
||||
return d ? d : &dummyWorld();
|
||||
}
|
||||
|
||||
const TestDescription &TestTracker::dummyTest() const
|
||||
{
|
||||
return dummySuite().testDescription(0);
|
||||
}
|
||||
|
||||
const SuiteDescription &TestTracker::dummySuite() const
|
||||
{
|
||||
return dummyWorld().suiteDescription(0);
|
||||
}
|
||||
|
||||
const WorldDescription &TestTracker::dummyWorld() const
|
||||
{
|
||||
return _dummyWorld;
|
||||
}
|
||||
|
||||
void TestTracker::setListener( TestListener *l )
|
||||
{
|
||||
_l = l ? l : &_dummyListener;
|
||||
}
|
||||
|
||||
void TestTracker::enterWorld( const WorldDescription &wd )
|
||||
{
|
||||
setWorld( &wd );
|
||||
_warnings = _failedTests = _testFailedAsserts = _suiteFailedTests = _failedSuites = 0;
|
||||
_l->enterWorld( wd );
|
||||
}
|
||||
|
||||
void TestTracker::enterSuite( const SuiteDescription &sd )
|
||||
{
|
||||
setSuite( &sd );
|
||||
_testFailedAsserts = _suiteFailedTests = 0;
|
||||
_l->enterSuite(sd);
|
||||
}
|
||||
|
||||
void TestTracker::enterTest( const TestDescription &td )
|
||||
{
|
||||
setTest( &td );
|
||||
_testFailedAsserts = false;
|
||||
_l->enterTest(td);
|
||||
}
|
||||
|
||||
void TestTracker::leaveTest( const TestDescription &td )
|
||||
{
|
||||
_l->leaveTest( td );
|
||||
setTest( 0 );
|
||||
}
|
||||
|
||||
void TestTracker::leaveSuite( const SuiteDescription &sd )
|
||||
{
|
||||
_l->leaveSuite( sd );
|
||||
setSuite( 0 );
|
||||
}
|
||||
|
||||
void TestTracker::leaveWorld( const WorldDescription &wd )
|
||||
{
|
||||
_l->leaveWorld( wd );
|
||||
setWorld( 0 );
|
||||
}
|
||||
|
||||
void TestTracker::trace( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
_l->trace( file, line, expression );
|
||||
}
|
||||
|
||||
void TestTracker::warning( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
countWarning();
|
||||
_l->warning( file, line, expression );
|
||||
}
|
||||
|
||||
void TestTracker::failedTest( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedTest( file, line, expression );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssert( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssert( file, line, expression );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertEquals( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertSameData( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *sizeStr, const void *x,
|
||||
const void *y, unsigned size )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertSameData( file, line, xStr, yStr, sizeStr, x, y, size );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertDelta( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr, const char *dStr,
|
||||
const char *x, const char *y, const char *d )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertDelta( file, line, xStr, yStr, dStr, x, y, d );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertDiffers( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *value )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertDiffers( file, line, xStr, yStr, value );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertLessThan( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertLessThan( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertLessThanEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertLessThanEquals( file, line, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertPredicate( const char *file, unsigned line,
|
||||
const char *predicate, const char *xStr, const char *x )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertPredicate( file, line, predicate, xStr, x );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertRelation( const char *file, unsigned line,
|
||||
const char *relation, const char *xStr, const char *yStr,
|
||||
const char *x, const char *y )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertRelation( file, line, relation, xStr, yStr, x, y );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertThrows( const char *file, unsigned line,
|
||||
const char *expression, const char *type,
|
||||
bool otherThrown )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertThrows( file, line, expression, type, otherThrown );
|
||||
}
|
||||
|
||||
void TestTracker::failedAssertThrowsNot( const char *file, unsigned line, const char *expression )
|
||||
{
|
||||
countFailure();
|
||||
_l->failedAssertThrowsNot( file, line, expression );
|
||||
}
|
||||
|
||||
void TestTracker::setWorld( const WorldDescription *w )
|
||||
{
|
||||
_world = fixWorld( w );
|
||||
setSuite( 0 );
|
||||
}
|
||||
|
||||
void TestTracker::setSuite( const SuiteDescription *s )
|
||||
{
|
||||
_suite = fixSuite( s );
|
||||
setTest( 0 );
|
||||
}
|
||||
|
||||
void TestTracker::setTest( const TestDescription *t )
|
||||
{
|
||||
_test = fixTest( t );
|
||||
}
|
||||
|
||||
void TestTracker::countWarning()
|
||||
{
|
||||
++ _warnings;
|
||||
}
|
||||
|
||||
void TestTracker::countFailure()
|
||||
{
|
||||
if ( ++ _testFailedAsserts == 1 ) {
|
||||
++ _failedTests;
|
||||
if ( ++ _suiteFailedTests == 1 )
|
||||
++ _failedSuites;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __cxxtest__TestTracker_cpp__
|
114
test/cxxtest/cxxtest/TestTracker.h
Normal file
114
test/cxxtest/cxxtest/TestTracker.h
Normal file
|
@ -0,0 +1,114 @@
|
|||
#ifndef __cxxtest__TestTracker_h__
|
||||
#define __cxxtest__TestTracker_h__
|
||||
|
||||
//
|
||||
// The TestTracker tracks running tests
|
||||
// The actual work is done in CountingListenerProxy,
|
||||
// but this way avoids cyclic references TestListener<->CountingListenerProxy
|
||||
//
|
||||
|
||||
#include <cxxtest/TestListener.h>
|
||||
#include <cxxtest/DummyDescriptions.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class TestListener;
|
||||
|
||||
class TestTracker : public TestListener
|
||||
{
|
||||
public:
|
||||
virtual ~TestTracker();
|
||||
|
||||
static TestTracker &tracker();
|
||||
|
||||
const TestDescription *fixTest( const TestDescription *d ) const;
|
||||
const SuiteDescription *fixSuite( const SuiteDescription *d ) const;
|
||||
const WorldDescription *fixWorld( const WorldDescription *d ) const;
|
||||
|
||||
const TestDescription &test() const { return *_test; }
|
||||
const SuiteDescription &suite() const { return *_suite; }
|
||||
const WorldDescription &world() const { return *_world; }
|
||||
|
||||
bool testFailed() const { return (testFailedAsserts() > 0); }
|
||||
bool suiteFailed() const { return (suiteFailedTests() > 0); }
|
||||
bool worldFailed() const { return (failedSuites() > 0); }
|
||||
|
||||
unsigned warnings() const { return _warnings; }
|
||||
unsigned failedTests() const { return _failedTests; }
|
||||
unsigned testFailedAsserts() const { return _testFailedAsserts; }
|
||||
unsigned suiteFailedTests() const { return _suiteFailedTests; }
|
||||
unsigned failedSuites() const { return _failedSuites; }
|
||||
|
||||
void enterWorld( const WorldDescription &wd );
|
||||
void enterSuite( const SuiteDescription &sd );
|
||||
void enterTest( const TestDescription &td );
|
||||
void leaveTest( const TestDescription &td );
|
||||
void leaveSuite( const SuiteDescription &sd );
|
||||
void leaveWorld( const WorldDescription &wd );
|
||||
void trace( const char *file, unsigned line, const char *expression );
|
||||
void warning( const char *file, unsigned line, const char *expression );
|
||||
void failedTest( const char *file, unsigned line, const char *expression );
|
||||
void failedAssert( const char *file, unsigned line, const char *expression );
|
||||
void failedAssertEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y );
|
||||
void failedAssertSameData( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *sizeStr, const void *x,
|
||||
const void *y, unsigned size );
|
||||
void failedAssertDelta( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr, const char *dStr,
|
||||
const char *x, const char *y, const char *d );
|
||||
void failedAssertDiffers( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *value );
|
||||
void failedAssertLessThan( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y );
|
||||
void failedAssertLessThanEquals( const char *file, unsigned line,
|
||||
const char *xStr, const char *yStr,
|
||||
const char *x, const char *y );
|
||||
void failedAssertPredicate( const char *file, unsigned line,
|
||||
const char *predicate, const char *xStr, const char *x );
|
||||
void failedAssertRelation( const char *file, unsigned line,
|
||||
const char *relation, const char *xStr, const char *yStr,
|
||||
const char *x, const char *y );
|
||||
void failedAssertThrows( const char *file, unsigned line,
|
||||
const char *expression, const char *type,
|
||||
bool otherThrown );
|
||||
void failedAssertThrowsNot( const char *file, unsigned line, const char *expression );
|
||||
|
||||
private:
|
||||
TestTracker( const TestTracker & );
|
||||
TestTracker &operator=( const TestTracker & );
|
||||
|
||||
static bool _created;
|
||||
TestListener _dummyListener;
|
||||
DummyWorldDescription _dummyWorld;
|
||||
unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;
|
||||
TestListener *_l;
|
||||
const WorldDescription *_world;
|
||||
const SuiteDescription *_suite;
|
||||
const TestDescription *_test;
|
||||
|
||||
const TestDescription &dummyTest() const;
|
||||
const SuiteDescription &dummySuite() const;
|
||||
const WorldDescription &dummyWorld() const;
|
||||
|
||||
void setWorld( const WorldDescription *w );
|
||||
void setSuite( const SuiteDescription *s );
|
||||
void setTest( const TestDescription *t );
|
||||
void countWarning();
|
||||
void countFailure();
|
||||
|
||||
friend class TestRunner;
|
||||
|
||||
TestTracker();
|
||||
void initialize();
|
||||
void setListener( TestListener *l );
|
||||
};
|
||||
|
||||
inline TestTracker &tracker() { return TestTracker::tracker(); }
|
||||
};
|
||||
|
||||
#endif // __cxxtest__TestTracker_h__
|
140
test/cxxtest/cxxtest/ValueTraits.cpp
Normal file
140
test/cxxtest/cxxtest/ValueTraits.cpp
Normal file
|
@ -0,0 +1,140 @@
|
|||
#ifndef __cxxtest__ValueTraits_cpp__
|
||||
#define __cxxtest__ValueTraits_cpp__
|
||||
|
||||
#include <cxxtest/ValueTraits.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
//
|
||||
// Non-inline functions from ValueTraits.h
|
||||
//
|
||||
|
||||
char digitToChar( unsigned digit )
|
||||
{
|
||||
if ( digit < 10 )
|
||||
return (char)('0' + digit);
|
||||
if ( digit <= 10 + 'Z' - 'A' )
|
||||
return (char)('A' + digit - 10);
|
||||
return '?';
|
||||
}
|
||||
|
||||
const char *byteToHex( unsigned char byte )
|
||||
{
|
||||
static char asHex[3];
|
||||
asHex[0] = digitToChar( byte >> 4 );
|
||||
asHex[1] = digitToChar( byte & 0x0F );
|
||||
asHex[2] = '\0';
|
||||
return asHex;
|
||||
}
|
||||
|
||||
char *copyString( char *dst, const char *src )
|
||||
{
|
||||
while ( (*dst = *src) != '\0' ) {
|
||||
++ dst;
|
||||
++ src;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
bool stringsEqual( const char *s1, const char *s2 )
|
||||
{
|
||||
char c;
|
||||
while ( (c = *s1++) == *s2++ )
|
||||
if ( c == '\0' )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
char *charToString( unsigned long c, char *s )
|
||||
{
|
||||
switch( c ) {
|
||||
case '\\': return copyString( s, "\\\\" );
|
||||
case '\"': return copyString( s, "\\\"" );
|
||||
case '\'': return copyString( s, "\\\'" );
|
||||
case '\0': return copyString( s, "\\0" );
|
||||
case '\a': return copyString( s, "\\a" );
|
||||
case '\b': return copyString( s, "\\b" );
|
||||
case '\n': return copyString( s, "\\n" );
|
||||
case '\r': return copyString( s, "\\r" );
|
||||
case '\t': return copyString( s, "\\t" );
|
||||
}
|
||||
if ( c >= 32 && c <= 127 ) {
|
||||
s[0] = (char)c;
|
||||
s[1] = '\0';
|
||||
return s + 1;
|
||||
}
|
||||
else {
|
||||
s[0] = '\\';
|
||||
s[1] = 'x';
|
||||
if ( c < 0x10 ) {
|
||||
s[2] = '0';
|
||||
++ s;
|
||||
}
|
||||
return numberToString( c, s + 2, 16UL );
|
||||
}
|
||||
}
|
||||
|
||||
char *charToString( char c, char *s )
|
||||
{
|
||||
return charToString( (unsigned long)(unsigned char)c, s );
|
||||
}
|
||||
|
||||
char *bytesToString( const unsigned char *bytes, unsigned numBytes, unsigned maxBytes, char *s )
|
||||
{
|
||||
bool truncate = (numBytes > maxBytes);
|
||||
if ( truncate )
|
||||
numBytes = maxBytes;
|
||||
|
||||
s = copyString( s, "{ " );
|
||||
for ( unsigned i = 0; i < numBytes; ++ i, ++ bytes )
|
||||
s = copyString( copyString( s, byteToHex( *bytes ) ), " " );
|
||||
if ( truncate )
|
||||
s = copyString( s, "..." );
|
||||
return copyString( s, " }" );
|
||||
}
|
||||
|
||||
#ifndef CXXTEST_USER_VALUE_TRAITS
|
||||
unsigned ValueTraits<const double>::requiredDigitsOnLeft( double t )
|
||||
{
|
||||
unsigned digits = 1;
|
||||
for ( t = (t < 0.0) ? -t : t; t > 1.0; t /= BASE )
|
||||
++ digits;
|
||||
return digits;
|
||||
}
|
||||
|
||||
char *ValueTraits<const double>::doNegative( double &t )
|
||||
{
|
||||
if ( t >= 0 )
|
||||
return _asString;
|
||||
_asString[0] = '-';
|
||||
t = -t;
|
||||
return _asString + 1;
|
||||
}
|
||||
|
||||
void ValueTraits<const double>::hugeNumber( double t )
|
||||
{
|
||||
char *s = doNegative( t );
|
||||
s = doubleToString( t, s, 0, 1 );
|
||||
s = copyString( s, "." );
|
||||
s = doubleToString( t, s, 1, DIGITS_ON_RIGHT );
|
||||
s = copyString( s, "E" );
|
||||
s = numberToString( requiredDigitsOnLeft( t ) - 1, s );
|
||||
}
|
||||
|
||||
void ValueTraits<const double>::normalNumber( double t )
|
||||
{
|
||||
char *s = doNegative( t );
|
||||
s = doubleToString( t, s );
|
||||
s = copyString( s, "." );
|
||||
for ( unsigned i = 0; i < DIGITS_ON_RIGHT; ++ i )
|
||||
s = numberToString( (unsigned)(t *= BASE) % BASE, s );
|
||||
}
|
||||
|
||||
char *ValueTraits<const double>::doubleToString( double t, char *s, unsigned skip, unsigned max )
|
||||
{
|
||||
return numberToString<double>( t, s, BASE, skip, max );
|
||||
}
|
||||
#endif // !CXXTEST_USER_VALUE_TRAITS
|
||||
};
|
||||
|
||||
#endif // __cxxtest__ValueTraits_cpp__
|
377
test/cxxtest/cxxtest/ValueTraits.h
Normal file
377
test/cxxtest/cxxtest/ValueTraits.h
Normal file
|
@ -0,0 +1,377 @@
|
|||
#ifndef __cxxtest__ValueTraits_h__
|
||||
#define __cxxtest__ValueTraits_h__
|
||||
|
||||
//
|
||||
// ValueTraits are used by CxxTest to convert arbitrary
|
||||
// values used in TS_ASSERT_EQUALS() to a string representation.
|
||||
//
|
||||
// This header file contains value traits for builtin integral types.
|
||||
// To declare value traits for new types you should instantiate the class
|
||||
// ValueTraits<YourClass>.
|
||||
//
|
||||
|
||||
#include <cxxtest/Flags.h>
|
||||
|
||||
#ifdef _CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
# define CXXTEST_TEMPLATE_INSTANTIATION
|
||||
#else // !_CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
# define CXXTEST_TEMPLATE_INSTANTIATION template<>
|
||||
#endif // _CXXTEST_OLD_TEMPLATE_SYNTAX
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
//
|
||||
// This is how we use the value traits
|
||||
//
|
||||
# define TS_AS_STRING(x) CxxTest::traits(x).asString()
|
||||
|
||||
//
|
||||
// Char representation of a digit
|
||||
//
|
||||
char digitToChar( unsigned digit );
|
||||
|
||||
//
|
||||
// Convert byte value to hex digits
|
||||
// Returns pointer to internal buffer
|
||||
//
|
||||
const char *byteToHex( unsigned char byte );
|
||||
|
||||
//
|
||||
// Convert byte values to string
|
||||
// Returns one past the copied data
|
||||
//
|
||||
char *bytesToString( const unsigned char *bytes, unsigned numBytes, unsigned maxBytes, char *s );
|
||||
|
||||
//
|
||||
// Copy a string.
|
||||
// Returns one past the end of the destination string
|
||||
// Remember -- we can't use the standard library!
|
||||
//
|
||||
char *copyString( char *dst, const char *src );
|
||||
|
||||
//
|
||||
// Compare two strings.
|
||||
// Remember -- we can't use the standard library!
|
||||
//
|
||||
bool stringsEqual( const char *s1, const char *s2 );
|
||||
|
||||
//
|
||||
// Represent a character value as a string
|
||||
// Returns one past the end of the string
|
||||
// This will be the actual char if printable or '\xXXXX' otherwise
|
||||
//
|
||||
char *charToString( unsigned long c, char *s );
|
||||
|
||||
//
|
||||
// Prevent problems with negative (signed char)s
|
||||
//
|
||||
char *charToString( char c, char *s );
|
||||
|
||||
//
|
||||
// The default ValueTraits class dumps up to 8 bytes as hex values
|
||||
//
|
||||
template <class T>
|
||||
class ValueTraits
|
||||
{
|
||||
enum { MAX_BYTES = 8 };
|
||||
char _asString[sizeof("{ ") + sizeof("XX ") * MAX_BYTES + sizeof("... }")];
|
||||
|
||||
public:
|
||||
ValueTraits( const T &t ) { bytesToString( (const unsigned char *)&t, sizeof(T), MAX_BYTES, _asString ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
//
|
||||
// traits( T t )
|
||||
// Creates an object of type ValueTraits<T>
|
||||
//
|
||||
template <class T>
|
||||
inline ValueTraits<T> traits( T t )
|
||||
{
|
||||
return ValueTraits<T>( t );
|
||||
}
|
||||
|
||||
//
|
||||
// You can duplicate the implementation of an existing ValueTraits
|
||||
//
|
||||
# define CXXTEST_COPY_TRAITS(CXXTEST_NEW_CLASS, CXXTEST_OLD_CLASS) \
|
||||
CXXTEST_TEMPLATE_INSTANTIATION \
|
||||
class ValueTraits< CXXTEST_NEW_CLASS > \
|
||||
{ \
|
||||
ValueTraits< CXXTEST_OLD_CLASS > _old; \
|
||||
public: \
|
||||
ValueTraits( CXXTEST_NEW_CLASS n ) : _old( (CXXTEST_OLD_CLASS)n ) {} \
|
||||
const char *asString( void ) const { return _old.asString(); } \
|
||||
}
|
||||
|
||||
//
|
||||
// Certain compilers need separate declarations for T and const T
|
||||
//
|
||||
# ifdef _CXXTEST_NO_COPY_CONST
|
||||
# define CXXTEST_COPY_CONST_TRAITS(CXXTEST_CLASS)
|
||||
# else // !_CXXTEST_NO_COPY_CONST
|
||||
# define CXXTEST_COPY_CONST_TRAITS(CXXTEST_CLASS) CXXTEST_COPY_TRAITS(CXXTEST_CLASS, const CXXTEST_CLASS)
|
||||
# endif // _CXXTEST_NO_COPY_CONST
|
||||
|
||||
//
|
||||
// Avoid compiler warnings about unsigned types always >= 0
|
||||
//
|
||||
template<class N> inline bool negative( N n ) { return n < 0; }
|
||||
template<class N> inline N abs( N n ) { return negative(n) ? -n : n; }
|
||||
|
||||
# define CXXTEST_NON_NEGATIVE(Type) \
|
||||
CXXTEST_TEMPLATE_INSTANTIATION \
|
||||
inline bool negative<Type>( Type ) { return false; } \
|
||||
CXXTEST_TEMPLATE_INSTANTIATION \
|
||||
inline Type abs<Type>( Type value ) { return value; }
|
||||
|
||||
CXXTEST_NON_NEGATIVE( bool )
|
||||
CXXTEST_NON_NEGATIVE( unsigned char )
|
||||
CXXTEST_NON_NEGATIVE( unsigned short int )
|
||||
CXXTEST_NON_NEGATIVE( unsigned int )
|
||||
CXXTEST_NON_NEGATIVE( unsigned long int )
|
||||
# ifdef _CXXTEST_LONGLONG
|
||||
CXXTEST_NON_NEGATIVE( unsigned _CXXTEST_LONGLONG )
|
||||
# endif // _CXXTEST_LONGLONG
|
||||
|
||||
//
|
||||
// Represent (integral) number as a string
|
||||
// Returns one past the end of the string
|
||||
// Remember -- we can't use the standard library!
|
||||
//
|
||||
template<class N>
|
||||
char *numberToString( N n, char *s,
|
||||
N base = 10,
|
||||
unsigned skipDigits = 0,
|
||||
unsigned maxDigits = (unsigned)-1 )
|
||||
{
|
||||
if ( negative(n) ) {
|
||||
*s++ = '-';
|
||||
n = abs(n);
|
||||
}
|
||||
|
||||
N digit = 1;
|
||||
while ( digit <= (n / base) )
|
||||
digit *= base;
|
||||
N digitValue;
|
||||
for ( ; digit >= 1 && skipDigits; n -= digit * digitValue, digit /= base, -- skipDigits )
|
||||
digitValue = (unsigned)(n / digit);
|
||||
for ( ; digit >= 1 && maxDigits; n -= digit * digitValue, digit /= base, -- maxDigits )
|
||||
*s++ = digitToChar( (unsigned)(digitValue = (unsigned)(n / digit)) );
|
||||
|
||||
*s = '\0';
|
||||
return s;
|
||||
}
|
||||
|
||||
//
|
||||
// All the specific ValueTraits follow.
|
||||
// You can #define CXXTEST_USER_VALUE_TRAITS if you don't want them
|
||||
//
|
||||
|
||||
#ifndef CXXTEST_USER_VALUE_TRAITS
|
||||
//
|
||||
// ValueTraits: const char * const &
|
||||
// This is used for printing strings, as in TS_FAIL( "Message" )
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const char * const &>
|
||||
{
|
||||
ValueTraits &operator=( const ValueTraits & );
|
||||
const char *_asString;
|
||||
|
||||
public:
|
||||
ValueTraits( const char * const &value ) : _asString( value ) {}
|
||||
ValueTraits( const ValueTraits &other ) : _asString( other._asString ) {}
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_TRAITS( const char *, const char * const & );
|
||||
CXXTEST_COPY_TRAITS( char *, const char * const & );
|
||||
|
||||
//
|
||||
// ValueTraits: bool
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const bool>
|
||||
{
|
||||
bool _value;
|
||||
|
||||
public:
|
||||
ValueTraits( const bool value ) : _value( value ) {}
|
||||
const char *asString( void ) const { return _value ? "true" : "false"; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( bool );
|
||||
|
||||
# ifdef _CXXTEST_LONGLONG
|
||||
//
|
||||
// ValueTraits: signed long long
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const signed _CXXTEST_LONGLONG>
|
||||
{
|
||||
typedef _CXXTEST_LONGLONG T;
|
||||
char _asString[2 + 3 * sizeof(T)];
|
||||
public:
|
||||
ValueTraits( T t ) { numberToString<T>( t, _asString ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( signed _CXXTEST_LONGLONG );
|
||||
|
||||
//
|
||||
// ValueTraits: unsigned long long
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const unsigned _CXXTEST_LONGLONG>
|
||||
{
|
||||
typedef unsigned _CXXTEST_LONGLONG T;
|
||||
char _asString[1 + 3 * sizeof(T)];
|
||||
public:
|
||||
ValueTraits( T t ) { numberToString<T>( t, _asString ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( unsigned _CXXTEST_LONGLONG );
|
||||
# endif // _CXXTEST_LONGLONG
|
||||
|
||||
//
|
||||
// ValueTraits: signed long
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const signed long int>
|
||||
{
|
||||
typedef signed long int T;
|
||||
char _asString[2 + 3 * sizeof(T)];
|
||||
public:
|
||||
ValueTraits( T t ) { numberToString<T>( t, _asString ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( signed long int );
|
||||
|
||||
//
|
||||
// ValueTraits: unsigned long
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const unsigned long int>
|
||||
{
|
||||
typedef unsigned long int T;
|
||||
char _asString[1 + 3 * sizeof(T)];
|
||||
public:
|
||||
ValueTraits( T t ) { numberToString<T>( t, _asString ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( unsigned long int );
|
||||
|
||||
//
|
||||
// All decimals are the same as the long version
|
||||
//
|
||||
|
||||
CXXTEST_COPY_TRAITS( const signed int, const signed long int );
|
||||
CXXTEST_COPY_TRAITS( const unsigned int, const unsigned long int );
|
||||
CXXTEST_COPY_TRAITS( const signed short int, const signed long int );
|
||||
CXXTEST_COPY_TRAITS( const unsigned short int, const unsigned long int );
|
||||
CXXTEST_COPY_TRAITS( const unsigned char, const unsigned long int );
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( signed int );
|
||||
CXXTEST_COPY_CONST_TRAITS( unsigned int );
|
||||
CXXTEST_COPY_CONST_TRAITS( signed short int );
|
||||
CXXTEST_COPY_CONST_TRAITS( unsigned short int );
|
||||
CXXTEST_COPY_CONST_TRAITS( unsigned char );
|
||||
|
||||
//
|
||||
// ValueTraits: char
|
||||
// Returns 'x' for printable chars, '\x??' for others
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const char>
|
||||
{
|
||||
char _asString[sizeof("'\\xXX'")];
|
||||
public:
|
||||
ValueTraits( char c ) { copyString( charToString( c, copyString( _asString, "'" ) ), "'" ); }
|
||||
const char *asString( void ) const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( char );
|
||||
|
||||
//
|
||||
// ValueTraits: signed char
|
||||
// Same as char, some compilers need it
|
||||
//
|
||||
CXXTEST_COPY_TRAITS( const signed char, const char );
|
||||
CXXTEST_COPY_CONST_TRAITS( signed char );
|
||||
|
||||
//
|
||||
// ValueTraits: double
|
||||
//
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const double>
|
||||
{
|
||||
public:
|
||||
ValueTraits( double t )
|
||||
{
|
||||
( requiredDigitsOnLeft( t ) > MAX_DIGITS_ON_LEFT ) ?
|
||||
hugeNumber( t ) :
|
||||
normalNumber( t );
|
||||
}
|
||||
|
||||
const char *asString( void ) const { return _asString; }
|
||||
|
||||
private:
|
||||
enum { MAX_DIGITS_ON_LEFT = 24, DIGITS_ON_RIGHT = 4, BASE = 10 };
|
||||
char _asString[1 + MAX_DIGITS_ON_LEFT + 1 + DIGITS_ON_RIGHT + 1];
|
||||
|
||||
static unsigned requiredDigitsOnLeft( double t );
|
||||
char *doNegative( double &t );
|
||||
void hugeNumber( double t );
|
||||
void normalNumber( double t );
|
||||
char *doubleToString( double t, char *s, unsigned skip = 0, unsigned max = (unsigned)-1 );
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( double );
|
||||
|
||||
//
|
||||
// ValueTraits: float
|
||||
//
|
||||
CXXTEST_COPY_TRAITS( const float, const double );
|
||||
CXXTEST_COPY_CONST_TRAITS( float );
|
||||
#endif // !CXXTEST_USER_VALUE_TRAITS
|
||||
};
|
||||
|
||||
#ifdef _CXXTEST_HAVE_STD
|
||||
# include <cxxtest/StdValueTraits.h>
|
||||
#endif // _CXXTEST_HAVE_STD
|
||||
|
||||
//
|
||||
// CXXTEST_ENUM_TRAITS
|
||||
//
|
||||
#define CXXTEST_ENUM_TRAITS( TYPE, VALUES ) \
|
||||
namespace CxxTest \
|
||||
{ \
|
||||
CXXTEST_TEMPLATE_INSTANTIATION \
|
||||
class ValueTraits<TYPE> \
|
||||
{ \
|
||||
TYPE _value; \
|
||||
char _fallback[sizeof("(" #TYPE ")") + 3 * sizeof(TYPE)]; \
|
||||
public: \
|
||||
ValueTraits( TYPE value ) { \
|
||||
_value = value; \
|
||||
numberToString<unsigned long int>( _value, copyString( _fallback, "(" #TYPE ")" ) ); \
|
||||
} \
|
||||
const char *asString( void ) const \
|
||||
{ \
|
||||
switch ( _value ) \
|
||||
{ \
|
||||
VALUES \
|
||||
default: return _fallback; \
|
||||
} \
|
||||
} \
|
||||
}; \
|
||||
}
|
||||
|
||||
#define CXXTEST_ENUM_MEMBER( MEMBER ) \
|
||||
case MEMBER: return #MEMBER;
|
||||
|
||||
#endif // __cxxtest__ValueTraits_h__
|
531
test/cxxtest/cxxtest/Win32Gui.h
Normal file
531
test/cxxtest/cxxtest/Win32Gui.h
Normal file
|
@ -0,0 +1,531 @@
|
|||
#ifndef __cxxtest__Win32Gui_h__
|
||||
#define __cxxtest__Win32Gui_h__
|
||||
|
||||
//
|
||||
// The Win32Gui displays a simple progress bar using the Win32 API.
|
||||
//
|
||||
// It accepts the following command line options:
|
||||
// -minimized Start minimized, pop up on error
|
||||
// -keep Don't close the window at the end
|
||||
// -title TITLE Set the window caption
|
||||
//
|
||||
// If both -minimized and -keep are specified, GUI will only keep the
|
||||
// window if it's in focus.
|
||||
//
|
||||
// N.B. If you're wondering why this class doesn't use any standard
|
||||
// library or STL (<string> would have been nice) it's because it only
|
||||
// uses "straight" Win32 API.
|
||||
//
|
||||
|
||||
#include <cxxtest/Gui.h>
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class Win32Gui : public GuiListener
|
||||
{
|
||||
public:
|
||||
void enterGui( int &argc, char **argv )
|
||||
{
|
||||
parseCommandLine( argc, argv );
|
||||
}
|
||||
|
||||
void enterWorld( const WorldDescription &wd )
|
||||
{
|
||||
getTotalTests( wd );
|
||||
_testsDone = 0;
|
||||
startGuiThread();
|
||||
}
|
||||
|
||||
void guiEnterSuite( const char *suiteName )
|
||||
{
|
||||
showSuiteName( suiteName );
|
||||
reset( _suiteStart );
|
||||
}
|
||||
|
||||
void guiEnterTest( const char *suiteName, const char *testName )
|
||||
{
|
||||
++ _testsDone;
|
||||
setTestCaption( suiteName, testName );
|
||||
showTestName( testName );
|
||||
showTestsDone();
|
||||
progressBarMessage( PBM_STEPIT );
|
||||
reset( _testStart );
|
||||
}
|
||||
|
||||
void yellowBar()
|
||||
{
|
||||
setColor( 255, 255, 0 );
|
||||
setIcon( IDI_WARNING );
|
||||
getTotalTests();
|
||||
}
|
||||
|
||||
void redBar()
|
||||
{
|
||||
if ( _startMinimized )
|
||||
showMainWindow( SW_SHOWNORMAL );
|
||||
setColor( 255, 0, 0 );
|
||||
setIcon( IDI_ERROR );
|
||||
getTotalTests();
|
||||
}
|
||||
|
||||
void leaveGui()
|
||||
{
|
||||
if ( keep() )
|
||||
{
|
||||
showSummary();
|
||||
WaitForSingleObject( _gui, INFINITE );
|
||||
}
|
||||
DestroyWindow( _mainWindow );
|
||||
}
|
||||
|
||||
private:
|
||||
const char *_title;
|
||||
bool _startMinimized, _keep;
|
||||
HANDLE _gui;
|
||||
WNDCLASSEX _windowClass;
|
||||
HWND _mainWindow, _progressBar, _statusBar;
|
||||
HANDLE _canStartTests;
|
||||
unsigned _numTotalTests, _testsDone;
|
||||
char _strTotalTests[WorldDescription::MAX_STRLEN_TOTAL_TESTS];
|
||||
enum {
|
||||
STATUS_SUITE_NAME, STATUS_SUITE_TIME,
|
||||
STATUS_TEST_NAME, STATUS_TEST_TIME,
|
||||
STATUS_TESTS_DONE, STATUS_WORLD_TIME,
|
||||
STATUS_TOTAL_PARTS
|
||||
};
|
||||
int _statusWidths[STATUS_TOTAL_PARTS];
|
||||
unsigned _statusOffsets[STATUS_TOTAL_PARTS];
|
||||
unsigned _statusTotal;
|
||||
char _statusTestsDone[sizeof("1000000000 of (100%)") + WorldDescription::MAX_STRLEN_TOTAL_TESTS];
|
||||
DWORD _worldStart, _suiteStart, _testStart;
|
||||
char _timeString[sizeof("00:00:00")];
|
||||
|
||||
void parseCommandLine( int argc, char **argv )
|
||||
{
|
||||
_startMinimized = _keep = false;
|
||||
_title = argv[0];
|
||||
|
||||
for ( int i = 1; i < argc; ++ i )
|
||||
{
|
||||
if ( !lstrcmpA( argv[i], "-minimized" ) )
|
||||
_startMinimized = true;
|
||||
else if ( !lstrcmpA( argv[i], "-keep" ) )
|
||||
_keep = true;
|
||||
else if ( !lstrcmpA( argv[i], "-title" ) && (i + 1 < argc) )
|
||||
_title = argv[++i];
|
||||
}
|
||||
}
|
||||
|
||||
void getTotalTests()
|
||||
{
|
||||
getTotalTests( tracker().world() );
|
||||
}
|
||||
|
||||
void getTotalTests( const WorldDescription &wd )
|
||||
{
|
||||
_numTotalTests = wd.numTotalTests();
|
||||
wd.strTotalTests( _strTotalTests );
|
||||
}
|
||||
|
||||
void startGuiThread()
|
||||
{
|
||||
_canStartTests = CreateEvent( NULL, TRUE, FALSE, NULL );
|
||||
DWORD threadId;
|
||||
_gui = CreateThread( NULL, 0, &(Win32Gui::guiThread), (LPVOID)this, 0, &threadId );
|
||||
WaitForSingleObject( _canStartTests, INFINITE );
|
||||
}
|
||||
|
||||
static DWORD WINAPI guiThread( LPVOID parameter )
|
||||
{
|
||||
((Win32Gui *)parameter)->gui();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gui()
|
||||
{
|
||||
registerWindowClass();
|
||||
createMainWindow();
|
||||
initCommonControls();
|
||||
createProgressBar();
|
||||
createStatusBar();
|
||||
centerMainWindow();
|
||||
showMainWindow();
|
||||
startTimer();
|
||||
startTests();
|
||||
|
||||
messageLoop();
|
||||
}
|
||||
|
||||
void registerWindowClass()
|
||||
{
|
||||
_windowClass.cbSize = sizeof(_windowClass);
|
||||
_windowClass.style = CS_HREDRAW | CS_VREDRAW;
|
||||
_windowClass.lpfnWndProc = &(Win32Gui::windowProcedure);
|
||||
_windowClass.cbClsExtra = 0;
|
||||
_windowClass.cbWndExtra = sizeof(LONG);
|
||||
_windowClass.hInstance = (HINSTANCE)NULL;
|
||||
_windowClass.hIcon = (HICON)NULL;
|
||||
_windowClass.hCursor = (HCURSOR)NULL;
|
||||
_windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||
_windowClass.lpszMenuName = NULL;
|
||||
_windowClass.lpszClassName = TEXT("CxxTest Window Class");
|
||||
_windowClass.hIconSm = (HICON)NULL;
|
||||
|
||||
RegisterClassEx( &_windowClass );
|
||||
}
|
||||
|
||||
void createMainWindow()
|
||||
{
|
||||
_mainWindow = createWindow( _windowClass.lpszClassName, WS_OVERLAPPEDWINDOW );
|
||||
}
|
||||
|
||||
void initCommonControls()
|
||||
{
|
||||
HMODULE dll = LoadLibraryA( "comctl32.dll" );
|
||||
if ( !dll )
|
||||
return;
|
||||
|
||||
typedef void (WINAPI *FUNC)( void );
|
||||
FUNC func = (FUNC)GetProcAddress( dll, "InitCommonControls" );
|
||||
if ( !func )
|
||||
return;
|
||||
|
||||
func();
|
||||
}
|
||||
|
||||
void createProgressBar()
|
||||
{
|
||||
_progressBar = createWindow( PROGRESS_CLASS, WS_CHILD | WS_VISIBLE | PBS_SMOOTH, _mainWindow );
|
||||
|
||||
#ifdef PBM_SETRANGE32
|
||||
progressBarMessage( PBM_SETRANGE32, 0, _numTotalTests );
|
||||
#else // No PBM_SETRANGE32, use PBM_SETRANGE
|
||||
progressBarMessage( PBM_SETRANGE, 0, MAKELPARAM( 0, (WORD)_numTotalTests ) );
|
||||
#endif // PBM_SETRANGE32
|
||||
progressBarMessage( PBM_SETPOS, 0 );
|
||||
progressBarMessage( PBM_SETSTEP, 1 );
|
||||
greenBar();
|
||||
UpdateWindow( _progressBar );
|
||||
}
|
||||
|
||||
void createStatusBar()
|
||||
{
|
||||
_statusBar = createWindow( STATUSCLASSNAME, WS_CHILD | WS_VISIBLE, _mainWindow );
|
||||
setRatios( 4, 1, 3, 1, 3, 1 );
|
||||
}
|
||||
|
||||
void setRatios( unsigned suiteNameRatio, unsigned suiteTimeRatio,
|
||||
unsigned testNameRatio, unsigned testTimeRatio,
|
||||
unsigned testsDoneRatio, unsigned worldTimeRatio )
|
||||
{
|
||||
_statusTotal = 0;
|
||||
_statusOffsets[STATUS_SUITE_NAME] = (_statusTotal += suiteNameRatio);
|
||||
_statusOffsets[STATUS_SUITE_TIME] = (_statusTotal += suiteTimeRatio);
|
||||
_statusOffsets[STATUS_TEST_NAME] = (_statusTotal += testNameRatio);
|
||||
_statusOffsets[STATUS_TEST_TIME] = (_statusTotal += testTimeRatio);
|
||||
_statusOffsets[STATUS_TESTS_DONE] = (_statusTotal += testsDoneRatio);
|
||||
_statusOffsets[STATUS_WORLD_TIME] = (_statusTotal += worldTimeRatio);
|
||||
}
|
||||
|
||||
HWND createWindow( LPCTSTR className, DWORD style, HWND parent = (HWND)NULL )
|
||||
{
|
||||
return CreateWindow( className, NULL, style, 0, 0, 0, 0, parent,
|
||||
(HMENU)NULL, (HINSTANCE)NULL, (LPVOID)this );
|
||||
}
|
||||
|
||||
void progressBarMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )
|
||||
{
|
||||
SendMessage( _progressBar, message, wParam, lParam );
|
||||
}
|
||||
|
||||
void centerMainWindow()
|
||||
{
|
||||
RECT screen;
|
||||
getScreenArea( screen );
|
||||
|
||||
LONG screenWidth = screen.right - screen.left;
|
||||
LONG screenHeight = screen.bottom - screen.top;
|
||||
|
||||
LONG xCenter = (screen.right + screen.left) / 2;
|
||||
LONG yCenter = (screen.bottom + screen.top) / 2;
|
||||
|
||||
LONG windowWidth = (screenWidth * 4) / 5;
|
||||
LONG windowHeight = screenHeight / 10;
|
||||
LONG minimumHeight = 2 * (GetSystemMetrics( SM_CYCAPTION ) + GetSystemMetrics( SM_CYFRAME ));
|
||||
if ( windowHeight < minimumHeight )
|
||||
windowHeight = minimumHeight;
|
||||
|
||||
SetWindowPos( _mainWindow, HWND_TOP,
|
||||
xCenter - (windowWidth / 2), yCenter - (windowHeight / 2),
|
||||
windowWidth, windowHeight, 0 );
|
||||
}
|
||||
|
||||
void getScreenArea( RECT &area )
|
||||
{
|
||||
if ( !getScreenAreaWithoutTaskbar( area ) )
|
||||
getWholeScreenArea( area );
|
||||
}
|
||||
|
||||
bool getScreenAreaWithoutTaskbar( RECT &area )
|
||||
{
|
||||
return (SystemParametersInfo( SPI_GETWORKAREA, sizeof(RECT), &area, 0 ) != 0);
|
||||
}
|
||||
|
||||
void getWholeScreenArea( RECT &area )
|
||||
{
|
||||
area.left = area.top = 0;
|
||||
area.right = GetSystemMetrics( SM_CXSCREEN );
|
||||
area.bottom = GetSystemMetrics( SM_CYSCREEN );
|
||||
}
|
||||
|
||||
void showMainWindow()
|
||||
{
|
||||
showMainWindow( _startMinimized ? SW_MINIMIZE : SW_SHOWNORMAL );
|
||||
UpdateWindow( _mainWindow );
|
||||
}
|
||||
|
||||
void showMainWindow( int mode )
|
||||
{
|
||||
ShowWindow( _mainWindow, mode );
|
||||
}
|
||||
|
||||
enum { TIMER_ID = 1, TIMER_DELAY = 1000 };
|
||||
|
||||
void startTimer()
|
||||
{
|
||||
reset( _worldStart );
|
||||
reset( _suiteStart );
|
||||
reset( _testStart );
|
||||
SetTimer( _mainWindow, TIMER_ID, TIMER_DELAY, 0 );
|
||||
}
|
||||
|
||||
void reset( DWORD &tick )
|
||||
{
|
||||
tick = GetTickCount();
|
||||
}
|
||||
|
||||
void startTests()
|
||||
{
|
||||
SetEvent( _canStartTests );
|
||||
}
|
||||
|
||||
void messageLoop()
|
||||
{
|
||||
MSG message;
|
||||
while ( BOOL haveMessage = GetMessage( &message, NULL, 0, 0 ) )
|
||||
if ( haveMessage != -1 )
|
||||
DispatchMessage( &message );
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK windowProcedure( HWND window, UINT message, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
if ( message == WM_CREATE )
|
||||
setUp( window, (LPCREATESTRUCT)lParam );
|
||||
|
||||
Win32Gui *that = (Win32Gui *)GetWindowLong( window, GWL_USERDATA );
|
||||
return that->handle( window, message, wParam, lParam );
|
||||
}
|
||||
|
||||
static void setUp( HWND window, LPCREATESTRUCT create )
|
||||
{
|
||||
SetWindowLong( window, GWL_USERDATA, (LONG)create->lpCreateParams );
|
||||
}
|
||||
|
||||
LRESULT handle( HWND window, UINT message, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
switch ( message )
|
||||
{
|
||||
case WM_SIZE: resizeControls(); break;
|
||||
|
||||
case WM_TIMER: updateTime(); break;
|
||||
|
||||
case WM_CLOSE:
|
||||
case WM_DESTROY:
|
||||
case WM_QUIT:
|
||||
ExitProcess( 0 );
|
||||
|
||||
default: return DefWindowProc( window, message, wParam, lParam );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void resizeControls()
|
||||
{
|
||||
RECT r;
|
||||
GetClientRect( _mainWindow, &r );
|
||||
LONG width = r.right - r.left;
|
||||
LONG height = r.bottom - r.top;
|
||||
|
||||
GetClientRect( _statusBar, &r );
|
||||
LONG statusHeight = r.bottom - r.top;
|
||||
LONG resizeGripWidth = statusHeight;
|
||||
LONG progressHeight = height - statusHeight;
|
||||
|
||||
SetWindowPos( _progressBar, HWND_TOP, 0, 0, width, progressHeight, 0 );
|
||||
SetWindowPos( _statusBar, HWND_TOP, 0, progressHeight, width, statusHeight, 0 );
|
||||
setStatusParts( width - resizeGripWidth );
|
||||
}
|
||||
|
||||
void setStatusParts( LONG width )
|
||||
{
|
||||
for ( unsigned i = 0; i < STATUS_TOTAL_PARTS; ++ i )
|
||||
_statusWidths[i] = (width * _statusOffsets[i]) / _statusTotal;
|
||||
|
||||
statusBarMessage( SB_SETPARTS, STATUS_TOTAL_PARTS, _statusWidths );
|
||||
}
|
||||
|
||||
void statusBarMessage( UINT message, WPARAM wParam = 0, const void *lParam = 0 )
|
||||
{
|
||||
SendMessage( _statusBar, message, wParam, (LPARAM)lParam );
|
||||
}
|
||||
|
||||
void greenBar()
|
||||
{
|
||||
setColor( 0, 255, 0 );
|
||||
setIcon( IDI_INFORMATION );
|
||||
}
|
||||
|
||||
#ifdef PBM_SETBARCOLOR
|
||||
void setColor( BYTE red, BYTE green, BYTE blue )
|
||||
{
|
||||
progressBarMessage( PBM_SETBARCOLOR, 0, RGB( red, green, blue ) );
|
||||
}
|
||||
#else // !PBM_SETBARCOLOR
|
||||
void setColor( BYTE, BYTE, BYTE )
|
||||
{
|
||||
}
|
||||
#endif // PBM_SETBARCOLOR
|
||||
|
||||
void setIcon( LPCTSTR icon )
|
||||
{
|
||||
SendMessage( _mainWindow, WM_SETICON, ICON_BIG, (LPARAM)loadStandardIcon( icon ) );
|
||||
}
|
||||
|
||||
HICON loadStandardIcon( LPCTSTR icon )
|
||||
{
|
||||
return LoadIcon( (HINSTANCE)NULL, icon );
|
||||
}
|
||||
|
||||
void setTestCaption( const char *suiteName, const char *testName )
|
||||
{
|
||||
setCaption( suiteName, "::", testName, "()" );
|
||||
}
|
||||
|
||||
void setCaption( const char *a = "", const char *b = "", const char *c = "", const char *d = "" )
|
||||
{
|
||||
unsigned length = lstrlenA( _title ) + sizeof( " - " ) +
|
||||
lstrlenA( a ) + lstrlenA( b ) + lstrlenA( c ) + lstrlenA( d );
|
||||
char *name = allocate( length );
|
||||
lstrcpyA( name, _title );
|
||||
lstrcatA( name, " - " );
|
||||
lstrcatA( name, a );
|
||||
lstrcatA( name, b );
|
||||
lstrcatA( name, c );
|
||||
lstrcatA( name, d );
|
||||
SetWindowTextA( _mainWindow, name );
|
||||
deallocate( name );
|
||||
}
|
||||
|
||||
void showSuiteName( const char *suiteName )
|
||||
{
|
||||
setStatusPart( STATUS_SUITE_NAME, suiteName );
|
||||
}
|
||||
|
||||
void showTestName( const char *testName )
|
||||
{
|
||||
setStatusPart( STATUS_TEST_NAME, testName );
|
||||
}
|
||||
|
||||
void showTestsDone()
|
||||
{
|
||||
wsprintfA( _statusTestsDone, "%u of %s (%u%%)",
|
||||
_testsDone, _strTotalTests,
|
||||
(_testsDone * 100) / _numTotalTests );
|
||||
setStatusPart( STATUS_TESTS_DONE, _statusTestsDone );
|
||||
}
|
||||
|
||||
void updateTime()
|
||||
{
|
||||
setStatusTime( STATUS_WORLD_TIME, _worldStart );
|
||||
setStatusTime( STATUS_SUITE_TIME, _suiteStart );
|
||||
setStatusTime( STATUS_TEST_TIME, _testStart );
|
||||
}
|
||||
|
||||
void setStatusTime( unsigned part, DWORD start )
|
||||
{
|
||||
unsigned total = (GetTickCount() - start) / 1000;
|
||||
unsigned hours = total / 3600;
|
||||
unsigned minutes = (total / 60) % 60;
|
||||
unsigned seconds = total % 60;
|
||||
|
||||
if ( hours )
|
||||
wsprintfA( _timeString, "%u:%02u:%02u", hours, minutes, seconds );
|
||||
else
|
||||
wsprintfA( _timeString, "%02u:%02u", minutes, seconds );
|
||||
|
||||
setStatusPart( part, _timeString );
|
||||
}
|
||||
|
||||
bool keep()
|
||||
{
|
||||
if ( !_keep )
|
||||
return false;
|
||||
if ( !_startMinimized )
|
||||
return true;
|
||||
return (_mainWindow == GetForegroundWindow());
|
||||
}
|
||||
|
||||
void showSummary()
|
||||
{
|
||||
stopTimer();
|
||||
setSummaryStatusBar();
|
||||
setSummaryCaption();
|
||||
}
|
||||
|
||||
void setStatusPart( unsigned part, const char *text )
|
||||
{
|
||||
statusBarMessage( SB_SETTEXTA, part, text );
|
||||
}
|
||||
|
||||
void stopTimer()
|
||||
{
|
||||
KillTimer( _mainWindow, TIMER_ID );
|
||||
setStatusTime( STATUS_WORLD_TIME, _worldStart );
|
||||
}
|
||||
|
||||
void setSummaryStatusBar()
|
||||
{
|
||||
setRatios( 0, 0, 0, 0, 1, 1 );
|
||||
resizeControls();
|
||||
|
||||
const char *tests = (_numTotalTests == 1) ? "test" : "tests";
|
||||
if ( tracker().failedTests() )
|
||||
wsprintfA( _statusTestsDone, "Failed %u of %s %s",
|
||||
tracker().failedTests(), _strTotalTests, tests );
|
||||
else
|
||||
wsprintfA( _statusTestsDone, "%s %s passed", _strTotalTests, tests );
|
||||
|
||||
setStatusPart( STATUS_TESTS_DONE, _statusTestsDone );
|
||||
}
|
||||
|
||||
void setSummaryCaption()
|
||||
{
|
||||
setCaption( _statusTestsDone );
|
||||
}
|
||||
|
||||
char *allocate( unsigned length )
|
||||
{
|
||||
return (char *)HeapAlloc( GetProcessHeap(), 0, length );
|
||||
}
|
||||
|
||||
void deallocate( char *data )
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, data );
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
#endif // __cxxtest__Win32Gui_h__
|
327
test/cxxtest/cxxtest/X11Gui.h
Normal file
327
test/cxxtest/cxxtest/X11Gui.h
Normal file
|
@ -0,0 +1,327 @@
|
|||
#ifndef __cxxtest__X11Gui_h__
|
||||
#define __cxxtest__X11Gui_h__
|
||||
|
||||
//
|
||||
// X11Gui displays a simple progress bar using X11
|
||||
//
|
||||
// It accepts the following command-line arguments:
|
||||
// -title <title> - Sets the application title
|
||||
// -fn or -font <font> - Sets the font
|
||||
// -bg or -background <color> - Sets the background color (default=Grey)
|
||||
// -fg or -foreground <color> - Sets the text color (default=Black)
|
||||
// -green/-yellow/-red <color> - Sets the colors of the bar
|
||||
//
|
||||
|
||||
#include <cxxtest/Gui.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class X11Gui : public GuiListener
|
||||
{
|
||||
public:
|
||||
void enterGui( int &argc, char **argv )
|
||||
{
|
||||
parseCommandLine( argc, argv );
|
||||
}
|
||||
|
||||
void enterWorld( const WorldDescription &wd )
|
||||
{
|
||||
openDisplay();
|
||||
if ( _display ) {
|
||||
createColors();
|
||||
createWindow();
|
||||
createGc();
|
||||
createFont();
|
||||
centerWindow();
|
||||
initializeEvents();
|
||||
initializeBar( wd );
|
||||
processEvents();
|
||||
}
|
||||
}
|
||||
|
||||
void guiEnterTest( const char *suiteName, const char *testName )
|
||||
{
|
||||
if ( _display ) {
|
||||
++ _testsDone;
|
||||
setWindowName( suiteName, testName );
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
|
||||
void yellowBar()
|
||||
{
|
||||
if ( _display ) {
|
||||
_barColor = getColor( _yellowName );
|
||||
getTotalTests();
|
||||
processEvents();
|
||||
}
|
||||
}
|
||||
|
||||
void redBar()
|
||||
{
|
||||
if ( _display ) {
|
||||
_barColor = getColor( _redName );
|
||||
getTotalTests();
|
||||
processEvents();
|
||||
}
|
||||
}
|
||||
|
||||
void leaveGui()
|
||||
{
|
||||
if ( _display ) {
|
||||
freeFontInfo();
|
||||
destroyGc();
|
||||
destroyWindow();
|
||||
closeDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
const char *_programName;
|
||||
Display *_display;
|
||||
Window _window;
|
||||
unsigned _numTotalTests, _testsDone;
|
||||
char _strTotalTests[WorldDescription::MAX_STRLEN_TOTAL_TESTS];
|
||||
const char *_foregroundName, *_backgroundName;
|
||||
const char *_greenName, *_yellowName, *_redName;
|
||||
unsigned long _foreground, _background, _barColor;
|
||||
int _width, _height;
|
||||
GC _gc;
|
||||
const char *_fontName;
|
||||
XID _fontId;
|
||||
XFontStruct *_fontInfo;
|
||||
int _textHeight, _textDescent;
|
||||
long _eventMask;
|
||||
Colormap _colormap;
|
||||
|
||||
void parseCommandLine( int &argc, char **argv )
|
||||
{
|
||||
_programName = argv[0];
|
||||
|
||||
_fontName = 0;
|
||||
_foregroundName = "Black";
|
||||
_backgroundName = "Grey";
|
||||
_greenName = "Green";
|
||||
_yellowName = "Yellow";
|
||||
_redName = "Red";
|
||||
|
||||
for ( int i = 1; i + 1 < argc; ++ i ) {
|
||||
if ( !strcmp( argv[i], "-title" ) )
|
||||
_programName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-fn" ) || !strcmp( argv[i], "-font" ) )
|
||||
_fontName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-fg" ) || !strcmp( argv[i], "-foreground" ) )
|
||||
_foregroundName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-bg" ) || !strcmp( argv[i], "-background" ) )
|
||||
_backgroundName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-green" ) )
|
||||
_greenName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-yellow" ) )
|
||||
_yellowName = argv[++ i];
|
||||
else if ( !strcmp( argv[i], "-red" ) )
|
||||
_redName = argv[++ i];
|
||||
}
|
||||
}
|
||||
|
||||
void openDisplay()
|
||||
{
|
||||
_display = XOpenDisplay( NULL );
|
||||
}
|
||||
|
||||
void createColors()
|
||||
{
|
||||
_colormap = DefaultColormap( _display, 0 );
|
||||
_foreground = getColor( _foregroundName );
|
||||
_background = getColor( _backgroundName );
|
||||
}
|
||||
|
||||
unsigned long getColor( const char *colorName )
|
||||
{
|
||||
XColor color;
|
||||
XParseColor( _display, _colormap, colorName, &color );
|
||||
XAllocColor( _display, _colormap, &color );
|
||||
return color.pixel;
|
||||
}
|
||||
|
||||
void createWindow()
|
||||
{
|
||||
_window = XCreateSimpleWindow( _display, RootWindow( _display, 0 ), 0, 0, 1, 1, 0, 0, _background );
|
||||
}
|
||||
|
||||
void createGc()
|
||||
{
|
||||
_gc = XCreateGC( _display, _window, 0, 0 );
|
||||
}
|
||||
|
||||
void createFont()
|
||||
{
|
||||
if ( !loadFont() )
|
||||
useDefaultFont();
|
||||
getFontInfo();
|
||||
_textHeight = _fontInfo->ascent + _fontInfo->descent;
|
||||
_textDescent = _fontInfo->descent;
|
||||
}
|
||||
|
||||
bool loadFont()
|
||||
{
|
||||
if ( !_fontName )
|
||||
return false;
|
||||
_fontId = XLoadFont( _display, _fontName );
|
||||
return (XSetFont( _display, _gc, _fontId ) == Success);
|
||||
}
|
||||
|
||||
void useDefaultFont()
|
||||
{
|
||||
_fontId = XGContextFromGC( _gc );
|
||||
}
|
||||
|
||||
void getFontInfo()
|
||||
{
|
||||
_fontInfo = XQueryFont( _display, _fontId );
|
||||
}
|
||||
|
||||
void freeFontInfo()
|
||||
{
|
||||
XFreeFontInfo( NULL, _fontInfo, 1 );
|
||||
}
|
||||
|
||||
void initializeEvents()
|
||||
{
|
||||
_eventMask = ExposureMask;
|
||||
XSelectInput( _display, _window, _eventMask );
|
||||
}
|
||||
|
||||
void initializeBar( const WorldDescription &wd )
|
||||
{
|
||||
getTotalTests( wd );
|
||||
_testsDone = 0;
|
||||
_barColor = getColor( _greenName );
|
||||
}
|
||||
|
||||
void getTotalTests()
|
||||
{
|
||||
getTotalTests( tracker().world() );
|
||||
}
|
||||
|
||||
void getTotalTests( const WorldDescription &wd )
|
||||
{
|
||||
_numTotalTests = wd.numTotalTests();
|
||||
wd.strTotalTests( _strTotalTests );
|
||||
}
|
||||
|
||||
void centerWindow()
|
||||
{
|
||||
XMapWindow( _display, _window );
|
||||
|
||||
Screen *screen = XDefaultScreenOfDisplay( _display );
|
||||
int screenWidth = WidthOfScreen( screen );
|
||||
int screenHeight = HeightOfScreen( screen );
|
||||
int xCenter = screenWidth / 2;
|
||||
int yCenter = screenHeight / 2;
|
||||
|
||||
_width = (screenWidth * 4) / 5;
|
||||
_height = screenHeight / 14;
|
||||
|
||||
XMoveResizeWindow( _display, _window, xCenter - (_width / 2), yCenter - (_height / 2), _width, _height );
|
||||
}
|
||||
|
||||
void processEvents()
|
||||
{
|
||||
redraw();
|
||||
|
||||
XEvent event;
|
||||
while( XCheckMaskEvent( _display, _eventMask, &event ) )
|
||||
redraw();
|
||||
}
|
||||
|
||||
void setWindowName( const char *suiteName, const char *testName )
|
||||
{
|
||||
unsigned length = strlen( _programName ) + strlen( suiteName ) + strlen( testName ) + sizeof( " - ::()" );
|
||||
char *name = (char *)malloc( length );
|
||||
sprintf( name, "%s - %s::%s()", _programName, suiteName, testName );
|
||||
XSetStandardProperties( _display, _window, name, 0, 0, 0, 0, 0 );
|
||||
free( name );
|
||||
}
|
||||
|
||||
void redraw()
|
||||
{
|
||||
getWindowSize();
|
||||
drawSolidBar();
|
||||
drawDividers();
|
||||
drawPercentage();
|
||||
flush();
|
||||
}
|
||||
|
||||
void getWindowSize()
|
||||
{
|
||||
XWindowAttributes attributes;
|
||||
XGetWindowAttributes( _display, _window, &attributes );
|
||||
_width = attributes.width;
|
||||
_height = attributes.height;
|
||||
}
|
||||
|
||||
void drawSolidBar()
|
||||
{
|
||||
unsigned barWidth = (_width * _testsDone) / _numTotalTests;
|
||||
|
||||
XSetForeground( _display, _gc, _barColor );
|
||||
XFillRectangle( _display, _window, _gc, 0, 0, barWidth, _height );
|
||||
|
||||
XSetForeground( _display, _gc, _background );
|
||||
XFillRectangle( _display, _window, _gc, barWidth, 0, _width + 1 - barWidth, _height );
|
||||
}
|
||||
|
||||
void drawDividers()
|
||||
{
|
||||
if(_width / _numTotalTests < 5)
|
||||
return;
|
||||
for ( unsigned i = 1; i < _testsDone; ++ i ) {
|
||||
int x = (_width * i) / _numTotalTests;
|
||||
XDrawLine( _display, _window, _gc, x, 0, x, _height);
|
||||
}
|
||||
}
|
||||
|
||||
void drawPercentage()
|
||||
{
|
||||
XSetForeground( _display, _gc, _foreground );
|
||||
|
||||
char str[sizeof("1000000000 of ") + sizeof(_strTotalTests) + sizeof(" (100%)")];
|
||||
sprintf( str, "%u of %s (%u%%)", _testsDone, _strTotalTests, (_testsDone * 100) / _numTotalTests );
|
||||
unsigned len = strlen( str );
|
||||
|
||||
int textWidth = XTextWidth( _fontInfo, str, len );
|
||||
|
||||
XDrawString( _display, _window, _gc,
|
||||
(_width - textWidth) / 2, ((_height + _textHeight) / 2) - _textDescent,
|
||||
str, len );
|
||||
}
|
||||
|
||||
void flush()
|
||||
{
|
||||
XFlush( _display );
|
||||
}
|
||||
|
||||
void destroyGc()
|
||||
{
|
||||
XFreeGC( _display, _gc );
|
||||
}
|
||||
|
||||
void destroyWindow()
|
||||
{
|
||||
XDestroyWindow( _display, _window );
|
||||
}
|
||||
|
||||
void closeDisplay()
|
||||
{
|
||||
XCloseDisplay( _display );
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
#endif //__cxxtest__X11Gui_h__
|
29
test/cxxtest/cxxtest/YesNoRunner.h
Normal file
29
test/cxxtest/cxxtest/YesNoRunner.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
#ifndef __cxxtest__YesNoRunner_h__
|
||||
#define __cxxtest__YesNoRunner_h__
|
||||
|
||||
//
|
||||
// The YesNoRunner is a simple TestListener that
|
||||
// just returns true iff all tests passed.
|
||||
//
|
||||
|
||||
#include <cxxtest/TestRunner.h>
|
||||
#include <cxxtest/TestListener.h>
|
||||
|
||||
namespace CxxTest
|
||||
{
|
||||
class YesNoRunner : public TestListener
|
||||
{
|
||||
public:
|
||||
YesNoRunner()
|
||||
{
|
||||
}
|
||||
|
||||
int run()
|
||||
{
|
||||
TestRunner::runAllTests( *this );
|
||||
return tracker().failedTests();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __cxxtest__YesNoRunner_h__
|
551
test/cxxtest/cxxtestgen.pl
Executable file
551
test/cxxtest/cxxtestgen.pl
Executable file
|
@ -0,0 +1,551 @@
|
|||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
|
||||
sub usage() {
|
||||
print STDERR "Usage: $0 [OPTIONS] <input file(s)>\n";
|
||||
print STDERR "Generate test source file for CxxTest.\n";
|
||||
print STDERR "\n";
|
||||
print STDERR " -v, --version Write CxxTest version\n";
|
||||
print STDERR " -o, --output=NAME Write output to file NAME\n";
|
||||
print STDERR " --runner=CLASS Create a main() function that runs CxxTest::CLASS\n";
|
||||
print STDERR " --gui=CLASS Like --runner, with GUI component\n";
|
||||
print STDERR " --error-printer Same as --runner=ErrorPrinter\n";
|
||||
print STDERR " --abort-on-fail Abort tests on failed asserts (like xUnit)\n";
|
||||
print STDERR " --have-std Use standard library (even if not found in tests)\n";
|
||||
print STDERR " --no-std Don't use standard library (even if found in tests)\n";
|
||||
print STDERR " --have-eh Use exception handling (even if not found in tests)\n";
|
||||
print STDERR " --no-eh Don't use exception handling (even if found in tests)\n";
|
||||
print STDERR " --longlong=[TYPE] Use TYPE as `long long' (defaut = long long)\n";
|
||||
print STDERR " --template=TEMPLATE Use TEMPLATE file to generate the test runner\n";
|
||||
print STDERR " --include=HEADER Include \"HEADER\" in test runner before other headers\n";
|
||||
print STDERR " --root Write CxxTest globals\n";
|
||||
print STDERR " --part Don't write CxxTest globals\n";
|
||||
print STDERR " --no-static-init Don't rely on static initialization\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
sub main {
|
||||
parseCommandline();
|
||||
scanInputFiles();
|
||||
writeOutput();
|
||||
}
|
||||
|
||||
#
|
||||
# Handling the command line
|
||||
#
|
||||
|
||||
my ($output, $runner, $gui, $template, $abortOnFail, $haveEh, $noEh, $haveStd, $noStd);
|
||||
my ($root, $part, $noStaticInit, $longlong, $factor);
|
||||
my @headers = ();
|
||||
|
||||
sub parseCommandline() {
|
||||
@ARGV = expandWildcards(@ARGV);
|
||||
GetOptions( 'version' => \&printVersion,
|
||||
'output=s' => \$output,
|
||||
'template=s' => \$template,
|
||||
'runner=s' => \$runner,
|
||||
'gui=s', => \$gui,
|
||||
'error-printer' => sub { $runner = 'ErrorPrinter'; $haveStd = 1; },
|
||||
'abort-on-fail' => \$abortOnFail,
|
||||
'have-eh' => \$haveEh,
|
||||
'no-eh' => \$noEh,
|
||||
'have-std' => \$haveStd,
|
||||
'no-std' => \$noStd,
|
||||
'include=s' => \@headers,
|
||||
'root' => \$root,
|
||||
'part' => \$part,
|
||||
'no-static-init' => \$noStaticInit,
|
||||
'factor' => \$factor,
|
||||
'longlong:s' => \$longlong
|
||||
) or usage();
|
||||
scalar @ARGV or $root or usage();
|
||||
|
||||
if ( defined($noStaticInit) && (defined($root) || defined($part)) ) {
|
||||
die "--no-static-init cannot be used with --root/--part\n";
|
||||
}
|
||||
|
||||
if ( $gui && !$runner ) {
|
||||
$runner = 'StdioPrinter';
|
||||
}
|
||||
|
||||
if ( defined($longlong) && !$longlong ) {
|
||||
$longlong = 'long long';
|
||||
}
|
||||
|
||||
foreach my $header (@headers) {
|
||||
if ( !($header =~ m/^["<].*[>"]$/) ) {
|
||||
$header = "\"$header\"";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub printVersion() {
|
||||
print "This is CxxTest version 3.10.1.\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
sub expandWildcards() {
|
||||
my @result = ();
|
||||
while( my $fn = shift @_ ) {
|
||||
push @result, glob($fn);
|
||||
}
|
||||
return @result;
|
||||
}
|
||||
|
||||
#
|
||||
# Reading the input files and scanning for test cases
|
||||
#
|
||||
|
||||
my (@suites, $suite, $test, $inBlock);
|
||||
my $numTotalTests = 0;
|
||||
|
||||
sub scanInputFiles() {
|
||||
foreach my $file (@ARGV) {
|
||||
scanInputFile( $file );
|
||||
}
|
||||
scalar @suites or $root or die("No tests defined\n");
|
||||
}
|
||||
|
||||
sub scanInputFile($) {
|
||||
my ($file) = @_;
|
||||
open FILE, "<$file" or die("Cannot open input file \"$file\"\n");
|
||||
|
||||
my $line;
|
||||
while (defined($line = <FILE>)) {
|
||||
scanLineForExceptionHandling( $line );
|
||||
scanLineForStandardLibrary( $line );
|
||||
|
||||
scanLineForSuiteStart( $file, $., $line );
|
||||
|
||||
if ( $suite ) {
|
||||
if ( lineBelongsToSuite( $suite, $., $line ) ) {
|
||||
scanLineForTest( $., $line );
|
||||
scanLineForCreate( $., $line );
|
||||
scanLineForDestroy( $., $line );
|
||||
}
|
||||
}
|
||||
}
|
||||
closeSuite();
|
||||
close FILE;
|
||||
}
|
||||
|
||||
sub lineBelongsToSuite($$$) {
|
||||
my ($suite, $lineNo, $line) = @_;
|
||||
if ( !$suite->{'generated'} ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( !$inBlock ) {
|
||||
$inBlock = lineStartsBlock( $line );
|
||||
}
|
||||
if ( $inBlock ) {
|
||||
addLineToBlock( $suite->{'file'}, $lineNo, $line );
|
||||
}
|
||||
return $inBlock;
|
||||
}
|
||||
|
||||
sub scanLineForExceptionHandling($) {
|
||||
my ($line) = @_;
|
||||
if ( $line =~ m/\b(try|throw|catch|TSM?_ASSERT_THROWS[A-Z_]*)\b/ ) {
|
||||
addExceptionHandling();
|
||||
}
|
||||
}
|
||||
|
||||
sub scanLineForStandardLibrary($) {
|
||||
my ($line) = @_;
|
||||
if ( $line =~ m/\b(std\s*::|CXXTEST_STD|using\s+namespace\s+std\b|^\s*\#\s*include\s+<[a-z0-9]+>)/ ) {
|
||||
addStandardLibrary();
|
||||
}
|
||||
}
|
||||
|
||||
sub scanLineForSuiteStart($$$) {
|
||||
my ($fileName, $lineNo, $line) = @_;
|
||||
if ( $line =~ m/\bclass\s+(\w+)\s*:\s*public\s+((::)?\s*CxxTest\s*::\s*)?TestSuite\b/ ) {
|
||||
startSuite( $1, $fileName, $lineNo, 0 );
|
||||
}
|
||||
if ( $line =~ m/\bCXXTEST_SUITE\s*\(\s*(\w*)\s*\)/ ) {
|
||||
print "$fileName:$lineNo: Warning: Inline test suites are deprecated.\n";
|
||||
startSuite( $1, $fileName, $lineNo, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
sub startSuite($$$$) {
|
||||
my ($name, $file, $line, $generated) = @_;
|
||||
closeSuite();
|
||||
$suite = { 'name' => $name,
|
||||
'file' => $file,
|
||||
'line' => $line,
|
||||
'generated' => $generated,
|
||||
'create' => 0,
|
||||
'destroy' => 0,
|
||||
'tests' => [],
|
||||
'lines' => [] };
|
||||
}
|
||||
|
||||
sub lineStartsBlock($) {
|
||||
my ($line) = @_;
|
||||
return $line =~ m/\bCXXTEST_CODE\s*\(/;
|
||||
}
|
||||
|
||||
sub scanLineForTest($$) {
|
||||
my ($lineNo, $line) = @_;
|
||||
if ( $line =~ m/^([^\/]|\/[^\/])*\bvoid\s+([Tt]est\w+)\s*\(\s*(void)?\s*\)/ ) {
|
||||
addTest( $2, $lineNo );
|
||||
}
|
||||
}
|
||||
|
||||
sub addTest($$$) {
|
||||
my ($name, $line) = @_;
|
||||
$test = { 'name' => $name,
|
||||
'line' => $line };
|
||||
push @{suiteTests()}, $test;
|
||||
}
|
||||
|
||||
sub addLineToBlock($$$) {
|
||||
my ($fileName, $lineNo, $line) = @_;
|
||||
$line = fixBlockLine( $fileName, $lineNo, $line );
|
||||
$line =~ s/^.*\{\{//;
|
||||
my $end = ($line =~ s/\}\}.*//s);
|
||||
push @{$suite->{'lines'}}, $line;
|
||||
if ( $end ) {
|
||||
$inBlock = 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub fixBlockLine($$$) {
|
||||
my ($fileName, $lineNo, $line) = @_;
|
||||
my $fileLine = cstr($fileName) . "," . $lineNo;
|
||||
$line =~ s/\b(E?TSM?_(ASSERT[A-Z_]*|FAIL))\s*\(/_$1($fileLine,/g;
|
||||
return $line;
|
||||
}
|
||||
|
||||
sub scanLineForCreate($$) {
|
||||
my ($lineNo, $line) = @_;
|
||||
if ( $line =~ m/\bstatic\s+\w+\s*\*\s*createSuite\s*\(\s*(void)?\s*\)/ ) {
|
||||
addCreateSuite( $lineNo );
|
||||
}
|
||||
}
|
||||
|
||||
sub scanLineForDestroy($$) {
|
||||
my ($lineNo, $line) = @_;
|
||||
if ( $line =~ m/\bstatic\s+void\s+destroySuite\s*\(\s*\w+\s*\*\s*\w*\s*\)/ ) {
|
||||
addDestroySuite( $lineNo );
|
||||
}
|
||||
}
|
||||
|
||||
sub closeSuite() {
|
||||
if ( $suite && scalar @{suiteTests()} ) {
|
||||
verifySuite();
|
||||
rememberSuite();
|
||||
}
|
||||
undef $suite;
|
||||
}
|
||||
|
||||
sub addCreateSuite($) {
|
||||
$suite->{'createSuite'} = $_[0];
|
||||
}
|
||||
|
||||
sub addDestroySuite($) {
|
||||
$suite->{'destroySuite'} = $_[0];
|
||||
}
|
||||
|
||||
sub addExceptionHandling() {
|
||||
$haveEh = 1 unless defined($noEh);
|
||||
}
|
||||
|
||||
sub addStandardLibrary() {
|
||||
$haveStd = 1 unless defined($noStd);
|
||||
}
|
||||
|
||||
sub verifySuite() {
|
||||
if (suiteCreateLine() || suiteDestroyLine()) {
|
||||
die("Suite ", suiteName(), " must have both createSuite() and destroySuite()\n")
|
||||
unless (suiteCreateLine() && suiteDestroyLine());
|
||||
}
|
||||
}
|
||||
|
||||
sub rememberSuite() {
|
||||
push @suites, $suite;
|
||||
$numTotalTests += scalar @{$suite->{'tests'}};
|
||||
}
|
||||
|
||||
sub suiteName() { return $suite->{'name'}; }
|
||||
sub suiteTests() { return $suite->{'tests'}; }
|
||||
sub suiteCreateLine() { return $suite->{'createSuite'}; }
|
||||
sub suiteDestroyLine() { return $suite->{'destroySuite'}; }
|
||||
sub fileName() { return $suite->{'file'}; }
|
||||
sub fileString() { return cstr(fileName()); }
|
||||
sub testName() { return $test->{'name'}; }
|
||||
sub testLine() { return $test->{'line'}; }
|
||||
|
||||
sub suiteObject() { return "suite_".suiteName(); }
|
||||
|
||||
sub cstr($) {
|
||||
my $file = $_[0];
|
||||
$file =~ s/\\/\\\\/g;
|
||||
return "\"".$file."\"";
|
||||
}
|
||||
|
||||
#
|
||||
# Writing the test source file
|
||||
#
|
||||
|
||||
sub writeOutput() {
|
||||
$template ? writeTemplateOutput() : writeSimpleOutput();
|
||||
}
|
||||
|
||||
sub startOutputFile() {
|
||||
if ( !standardOutput() ) {
|
||||
open OUTPUT_FILE,">$output" or die("Cannot create output file \"$output\"\n");
|
||||
select OUTPUT_FILE;
|
||||
}
|
||||
print "/* Generated file, do not edit */\n\n";
|
||||
}
|
||||
|
||||
sub standardOutput() {
|
||||
return !$output;
|
||||
}
|
||||
|
||||
sub writeSimpleOutput() {
|
||||
startOutputFile();
|
||||
writePreamble();
|
||||
writeMain();
|
||||
writeWorld();
|
||||
}
|
||||
|
||||
my ($didPreamble, $didWorld);
|
||||
|
||||
sub writeTemplateOutput() {
|
||||
openTemplateFile();
|
||||
startOutputFile();
|
||||
my $line;
|
||||
while (defined($line = <TEMPLATE_FILE>)) {
|
||||
if ( $line =~ m/^\s*\#\s*include\s*<cxxtest\// ) {
|
||||
writePreamble();
|
||||
print $line;
|
||||
} elsif ( $line =~ m/^\s*<CxxTest\s+preamble>\s*$/ ) {
|
||||
writePreamble();
|
||||
} elsif ( $line =~ m/^\s*<CxxTest\s+world>\s*$/ ) {
|
||||
writeWorld();
|
||||
} else {
|
||||
print $line;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub openTemplateFile() {
|
||||
open TEMPLATE_FILE, "<$template" or die("Cannot open template file \"$template\"\n");
|
||||
}
|
||||
|
||||
sub writePreamble() {
|
||||
return if $didPreamble;
|
||||
print "#ifndef CXXTEST_RUNNING\n";
|
||||
print "#define CXXTEST_RUNNING\n";
|
||||
print "#endif\n";
|
||||
print "\n";
|
||||
if ( $haveStd ) {
|
||||
print "#define _CXXTEST_HAVE_STD\n";
|
||||
}
|
||||
if ( $haveEh ) {
|
||||
print "#define _CXXTEST_HAVE_EH\n";
|
||||
}
|
||||
if ( $abortOnFail ) {
|
||||
print "#define _CXXTEST_ABORT_TEST_ON_FAIL\n";
|
||||
}
|
||||
if ( $longlong ) {
|
||||
print "#define _CXXTEST_LONGLONG $longlong\n";
|
||||
}
|
||||
if ( $factor ) {
|
||||
print "#define _CXXTEST_FACTOR\n";
|
||||
}
|
||||
foreach my $header (@headers) {
|
||||
print "#include $header\n";
|
||||
}
|
||||
print "#include <cxxtest/TestListener.h>\n";
|
||||
print "#include <cxxtest/TestTracker.h>\n";
|
||||
print "#include <cxxtest/TestRunner.h>\n";
|
||||
print "#include <cxxtest/RealDescriptions.h>\n";
|
||||
print "#include <cxxtest/$runner.h>\n" if $runner;
|
||||
print "#include <cxxtest/$gui.h>\n" if $gui;
|
||||
print "\n";
|
||||
$didPreamble = 1;
|
||||
}
|
||||
|
||||
sub writeWorld() {
|
||||
return if $didWorld;
|
||||
writePreamble();
|
||||
writeSuites();
|
||||
($root or !$part) and writeRoot();
|
||||
$noStaticInit and writeInitialize();
|
||||
$didWorld = 1;
|
||||
}
|
||||
|
||||
sub writeSuites() {
|
||||
foreach (@suites) {
|
||||
$suite = $_;
|
||||
writeInclude(fileName());
|
||||
if ( $suite->{'generated'} ) { generateSuite(); }
|
||||
dynamicSuite() ? writeSuitePointer() : writeSuiteObject();
|
||||
writeTestList();
|
||||
writeSuiteDescription();
|
||||
writeTestDescriptions();
|
||||
}
|
||||
}
|
||||
|
||||
sub dynamicSuite() {
|
||||
return suiteCreateLine();
|
||||
}
|
||||
|
||||
my $lastIncluded;
|
||||
|
||||
sub writeInclude($) {
|
||||
my $file = $_[0];
|
||||
return if $lastIncluded && ($file eq $lastIncluded);
|
||||
print "#include \"$file\"\n\n";
|
||||
$lastIncluded = $file;
|
||||
}
|
||||
|
||||
sub generateSuite() {
|
||||
print "class ", suiteName(), " : public CxxTest::TestSuite {\n";
|
||||
print "public:\n";
|
||||
foreach my $line (@{$suite->{'lines'}}) {
|
||||
print $line;
|
||||
}
|
||||
print "};\n\n";
|
||||
}
|
||||
|
||||
sub writeTestDescriptionsBase() {
|
||||
my $class = "TestDescriptionBase_" . suiteName();
|
||||
print "class $class : public CxxTest::TestDescription {\n";
|
||||
print "public:\n";
|
||||
print " const char *file() const { return ", fileString(), "; }\n";
|
||||
print " const char *suiteName() const { return \"", suiteName(), "\"; }\n";
|
||||
print "};\n\n";
|
||||
}
|
||||
|
||||
sub writeSuitePointer() {
|
||||
if ( $noStaticInit ) {
|
||||
print "static ", suiteName(), " *", suiteObject(), ";\n\n";
|
||||
} else {
|
||||
print "static ", suiteName(), " *", suiteObject(), " = 0;\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub writeSuiteObject() {
|
||||
print "static ", suiteName(), " ", suiteObject(), ";\n\n";
|
||||
}
|
||||
|
||||
sub testList() {
|
||||
return "Tests_" . suiteName();
|
||||
}
|
||||
|
||||
sub writeTestList() {
|
||||
if ( $noStaticInit ) {
|
||||
printf "static CxxTest::List %s;\n", testList();
|
||||
} else {
|
||||
printf "static CxxTest::List %s = { 0, 0 };\n", testList();
|
||||
}
|
||||
}
|
||||
|
||||
sub writeTestDescriptions() {
|
||||
foreach (@{suiteTests()}) {
|
||||
$test = $_;
|
||||
writeTestDescription();
|
||||
}
|
||||
}
|
||||
|
||||
sub suiteDescription() {
|
||||
return "suiteDescription_" . suiteName();
|
||||
}
|
||||
|
||||
sub writeTestDescription() {
|
||||
my $class = "TestDescription_" . suiteName() . "_" . testName();
|
||||
printf "static class $class : public CxxTest::RealTestDescription {\n";
|
||||
printf "public:\n";
|
||||
$noStaticInit or
|
||||
printf " $class() : CxxTest::RealTestDescription( %s, %s, %s, \"%s\" ) {}\n",
|
||||
testList(), suiteDescription(), testLine(), testName();
|
||||
printf " void runTest() { %s }\n", dynamicSuite() ? dynamicRun() : staticRun();
|
||||
printf "} testDescription_%s_%s;\n\n", suiteName(), testName();
|
||||
}
|
||||
|
||||
sub dynamicRun() {
|
||||
return sprintf( "if ( %s ) %s->%s();", suiteObject(), suiteObject(), testName() );
|
||||
}
|
||||
|
||||
sub staticRun() {
|
||||
return sprintf( "%s.%s();", suiteObject(), testName() );
|
||||
}
|
||||
|
||||
sub writeSuiteDescription() {
|
||||
dynamicSuite() ? writeDynamicDescription() : writeStaticDescription();
|
||||
}
|
||||
|
||||
sub writeDynamicDescription() {
|
||||
printf "CxxTest::DynamicSuiteDescription<%s> %s", suiteName(), suiteDescription();
|
||||
if ( !$noStaticInit ) {
|
||||
printf "( %s, %s, \"%s\", %s, %s, %s, %s )",
|
||||
fileString(), $suite->{'line'}, suiteName(), testList(),
|
||||
suiteObject(), suiteCreateLine(), suiteDestroyLine();
|
||||
}
|
||||
print ";\n\n";
|
||||
}
|
||||
|
||||
sub writeStaticDescription() {
|
||||
printf "CxxTest::StaticSuiteDescription %s", suiteDescription();
|
||||
if ( !$noStaticInit ) {
|
||||
printf "( %s, %s, \"%s\", %s, %s )", fileString(), $suite->{'line'}, suiteName(), suiteObject(), testList();
|
||||
}
|
||||
print ";\n\n";
|
||||
}
|
||||
|
||||
sub writeRoot() {
|
||||
print "#include <cxxtest/Root.cpp>\n";
|
||||
}
|
||||
|
||||
sub writeInitialize() {
|
||||
print "namespace CxxTest {\n";
|
||||
print " void initialize()\n";
|
||||
print " {\n";
|
||||
foreach (@suites) {
|
||||
$suite = $_;
|
||||
printf " %s.initialize();\n", testList();
|
||||
if ( dynamicSuite() ) {
|
||||
printf " %s = 0;\n", suiteObject();
|
||||
printf " %s.initialize( %s, %s, \"%s\", %s, %s, %s, %s );\n",
|
||||
suiteDescription(), fileString(), $suite->{'line'}, suiteName(), testList(),
|
||||
suiteObject(), suiteCreateLine(), suiteDestroyLine();
|
||||
} else {
|
||||
printf " %s.initialize( %s, %s, \"%s\", %s, %s );\n",
|
||||
suiteDescription(), fileString(), $suite->{'line'}, suiteName(), suiteObject(), testList();
|
||||
}
|
||||
|
||||
foreach (@{suiteTests()}) {
|
||||
$test = $_;
|
||||
printf " testDescription_%s_%s.initialize( %s, %s, %s, \"%s\" );\n",
|
||||
suiteName(), testName(), testList(), suiteDescription(), testLine(), testName();
|
||||
}
|
||||
}
|
||||
print " }\n";
|
||||
print "}\n";
|
||||
}
|
||||
|
||||
sub writeMain() {
|
||||
if ( $gui ) {
|
||||
print "int main( int argc, char *argv[] ) {\n";
|
||||
$noStaticInit &&
|
||||
print " CxxTest::initialize();\n";
|
||||
print " return CxxTest::GuiTuiRunner<CxxTest::$gui, CxxTest::$runner>( argc, argv ).run();\n";
|
||||
print "}\n";
|
||||
}
|
||||
elsif ( $runner ) {
|
||||
print "int main() {\n";
|
||||
$noStaticInit &&
|
||||
print " CxxTest::initialize();\n";
|
||||
print " return CxxTest::$runner().run();\n";
|
||||
print "}\n";
|
||||
}
|
||||
}
|
593
test/cxxtest/cxxtestgen.py
Executable file
593
test/cxxtest/cxxtestgen.py
Executable file
|
@ -0,0 +1,593 @@
|
|||
#!/usr/bin/python
|
||||
'''Usage: %s [OPTIONS] <input file(s)>
|
||||
Generate test source file for CxxTest.
|
||||
|
||||
-v, --version Write CxxTest version
|
||||
-o, --output=NAME Write output to file NAME
|
||||
--runner=CLASS Create a main() function that runs CxxTest::CLASS
|
||||
--gui=CLASS Like --runner, with GUI component
|
||||
--error-printer Same as --runner=ErrorPrinter
|
||||
--abort-on-fail Abort tests on failed asserts (like xUnit)
|
||||
--have-std Use standard library (even if not found in tests)
|
||||
--no-std Don\'t use standard library (even if found in tests)
|
||||
--have-eh Use exception handling (even if not found in tests)
|
||||
--no-eh Don\'t use exception handling (even if found in tests)
|
||||
--longlong=[TYPE] Use TYPE (default: long long) as long long
|
||||
--template=TEMPLATE Use TEMPLATE file to generate the test runner
|
||||
--include=HEADER Include HEADER in test runner before other headers
|
||||
--root Write CxxTest globals
|
||||
--part Don\'t write CxxTest globals
|
||||
--no-static-init Don\'t rely on static initialization
|
||||
'''
|
||||
|
||||
import re
|
||||
import sys
|
||||
import getopt
|
||||
import glob
|
||||
import string
|
||||
|
||||
# Global variables
|
||||
suites = []
|
||||
suite = None
|
||||
inBlock = 0
|
||||
|
||||
outputFileName = None
|
||||
runner = None
|
||||
gui = None
|
||||
root = None
|
||||
part = None
|
||||
noStaticInit = None
|
||||
templateFileName = None
|
||||
headers = []
|
||||
|
||||
haveExceptionHandling = 0
|
||||
noExceptionHandling = 0
|
||||
haveStandardLibrary = 0
|
||||
noStandardLibrary = 0
|
||||
abortOnFail = 0
|
||||
factor = 0
|
||||
longlong = 0
|
||||
|
||||
def main():
|
||||
'''The main program'''
|
||||
files = parseCommandline()
|
||||
scanInputFiles( files )
|
||||
writeOutput()
|
||||
|
||||
def usage( problem = None ):
|
||||
'''Print usage info and exit'''
|
||||
if problem is None:
|
||||
print usageString()
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.stderr.write( usageString() )
|
||||
abort( problem )
|
||||
|
||||
def usageString():
|
||||
'''Construct program usage string'''
|
||||
return __doc__ % sys.argv[0]
|
||||
|
||||
def abort( problem ):
|
||||
'''Print error message and exit'''
|
||||
sys.stderr.write( '\n' )
|
||||
sys.stderr.write( problem )
|
||||
sys.stderr.write( '\n\n' )
|
||||
sys.exit(2)
|
||||
|
||||
def parseCommandline():
|
||||
'''Analyze command line arguments'''
|
||||
try:
|
||||
options, patterns = getopt.getopt( sys.argv[1:], 'o:r:',
|
||||
['version', 'output=', 'runner=', 'gui=',
|
||||
'error-printer', 'abort-on-fail', 'have-std', 'no-std',
|
||||
'have-eh', 'no-eh', 'template=', 'include=',
|
||||
'root', 'part', 'no-static-init', 'factor', 'longlong='] )
|
||||
except getopt.error, problem:
|
||||
usage( problem )
|
||||
setOptions( options )
|
||||
return setFiles( patterns )
|
||||
|
||||
def setOptions( options ):
|
||||
'''Set options specified on command line'''
|
||||
global outputFileName, templateFileName, runner, gui, haveStandardLibrary, factor, longlong
|
||||
global haveExceptionHandling, noExceptionHandling, abortOnFail, headers, root, part, noStaticInit
|
||||
for o, a in options:
|
||||
if o in ('-v', '--version'):
|
||||
printVersion()
|
||||
elif o in ('-o', '--output'):
|
||||
outputFileName = a
|
||||
elif o == '--template':
|
||||
templateFileName = a
|
||||
elif o == '--runner':
|
||||
runner = a
|
||||
elif o == '--gui':
|
||||
gui = a
|
||||
elif o == '--include':
|
||||
if not re.match( r'^["<].*[>"]$', a ):
|
||||
a = ('"%s"' % a)
|
||||
headers.append( a )
|
||||
elif o == '--error-printer':
|
||||
runner = 'ErrorPrinter'
|
||||
haveStandardLibrary = 1
|
||||
elif o == '--abort-on-fail':
|
||||
abortOnFail = 1
|
||||
elif o == '--have-std':
|
||||
haveStandardLibrary = 1
|
||||
elif o == '--no-std':
|
||||
noStandardLibrary = 1
|
||||
elif o == '--have-eh':
|
||||
haveExceptionHandling = 1
|
||||
elif o == '--no-eh':
|
||||
noExceptionHandling = 1
|
||||
elif o == '--root':
|
||||
root = 1
|
||||
elif o == '--part':
|
||||
part = 1
|
||||
elif o == '--no-static-init':
|
||||
noStaticInit = 1
|
||||
elif o == '--factor':
|
||||
factor = 1
|
||||
elif o == '--longlong':
|
||||
if a:
|
||||
longlong = a
|
||||
else:
|
||||
longlong = 'long long'
|
||||
|
||||
if noStaticInit and (root or part):
|
||||
abort( '--no-static-init cannot be used with --root/--part' )
|
||||
|
||||
if gui and not runner:
|
||||
runner = 'StdioPrinter'
|
||||
|
||||
def printVersion():
|
||||
'''Print CxxTest version and exit'''
|
||||
sys.stdout.write( "This is CxxTest version 3.10.1.\n" )
|
||||
sys.exit(0)
|
||||
|
||||
def setFiles( patterns ):
|
||||
'''Set input files specified on command line'''
|
||||
files = expandWildcards( patterns )
|
||||
if len(files) is 0 and not root:
|
||||
usage( "No input files found" )
|
||||
return files
|
||||
|
||||
def expandWildcards( patterns ):
|
||||
'''Expand all wildcards in an array (glob)'''
|
||||
fileNames = []
|
||||
for pathName in patterns:
|
||||
patternFiles = glob.glob( pathName )
|
||||
for fileName in patternFiles:
|
||||
fileNames.append( fixBackslashes( fileName ) )
|
||||
return fileNames
|
||||
|
||||
def fixBackslashes( fileName ):
|
||||
'''Convert backslashes to slashes in file name'''
|
||||
return re.sub( r'\\', '/', fileName, 0 )
|
||||
|
||||
def scanInputFiles(files):
|
||||
'''Scan all input files for test suites'''
|
||||
for file in files:
|
||||
scanInputFile(file)
|
||||
global suites
|
||||
if len(suites) is 0 and not root:
|
||||
abort( 'No tests defined' )
|
||||
|
||||
def scanInputFile(fileName):
|
||||
'''Scan single input file for test suites'''
|
||||
file = open(fileName)
|
||||
lineNo = 0
|
||||
while 1:
|
||||
line = file.readline()
|
||||
if not line:
|
||||
break
|
||||
lineNo = lineNo + 1
|
||||
|
||||
scanInputLine( fileName, lineNo, line )
|
||||
closeSuite()
|
||||
file.close()
|
||||
|
||||
def scanInputLine( fileName, lineNo, line ):
|
||||
'''Scan single input line for interesting stuff'''
|
||||
scanLineForExceptionHandling( line )
|
||||
scanLineForStandardLibrary( line )
|
||||
|
||||
scanLineForSuiteStart( fileName, lineNo, line )
|
||||
|
||||
global suite
|
||||
if suite:
|
||||
scanLineInsideSuite( suite, lineNo, line )
|
||||
|
||||
def scanLineInsideSuite( suite, lineNo, line ):
|
||||
'''Analyze line which is part of a suite'''
|
||||
global inBlock
|
||||
if lineBelongsToSuite( suite, lineNo, line ):
|
||||
scanLineForTest( suite, lineNo, line )
|
||||
scanLineForCreate( suite, lineNo, line )
|
||||
scanLineForDestroy( suite, lineNo, line )
|
||||
|
||||
def lineBelongsToSuite( suite, lineNo, line ):
|
||||
'''Returns whether current line is part of the current suite.
|
||||
This can be false when we are in a generated suite outside of CXXTEST_CODE() blocks
|
||||
If the suite is generated, adds the line to the list of lines'''
|
||||
if not suite['generated']:
|
||||
return 1
|
||||
|
||||
global inBlock
|
||||
if not inBlock:
|
||||
inBlock = lineStartsBlock( line )
|
||||
if inBlock:
|
||||
inBlock = addLineToBlock( suite, lineNo, line )
|
||||
return inBlock
|
||||
|
||||
|
||||
std_re = re.compile( r"\b(std\s*::|CXXTEST_STD|using\s+namespace\s+std\b|^\s*\#\s*include\s+<[a-z0-9]+>)" )
|
||||
def scanLineForStandardLibrary( line ):
|
||||
'''Check if current line uses standard library'''
|
||||
global haveStandardLibrary, noStandardLibrary
|
||||
if not haveStandardLibrary and std_re.search(line):
|
||||
if not noStandardLibrary:
|
||||
haveStandardLibrary = 1
|
||||
|
||||
exception_re = re.compile( r"\b(throw|try|catch|TSM?_ASSERT_THROWS[A-Z_]*)\b" )
|
||||
def scanLineForExceptionHandling( line ):
|
||||
'''Check if current line uses exception handling'''
|
||||
global haveExceptionHandling, noExceptionHandling
|
||||
if not haveExceptionHandling and exception_re.search(line):
|
||||
if not noExceptionHandling:
|
||||
haveExceptionHandling = 1
|
||||
|
||||
suite_re = re.compile( r'\bclass\s+(\w+)\s*:\s*public\s+((::)?\s*CxxTest\s*::\s*)?TestSuite\b' )
|
||||
generatedSuite_re = re.compile( r'\bCXXTEST_SUITE\s*\(\s*(\w*)\s*\)' )
|
||||
def scanLineForSuiteStart( fileName, lineNo, line ):
|
||||
'''Check if current line starts a new test suite'''
|
||||
m = suite_re.search( line )
|
||||
if m:
|
||||
startSuite( m.group(1), fileName, lineNo, 0 )
|
||||
m = generatedSuite_re.search( line )
|
||||
if m:
|
||||
sys.stdout.write( "%s:%s: Warning: Inline test suites are deprecated.\n" % (fileName, lineNo) )
|
||||
startSuite( m.group(1), fileName, lineNo, 1 )
|
||||
|
||||
def startSuite( name, file, line, generated ):
|
||||
'''Start scanning a new suite'''
|
||||
global suite
|
||||
closeSuite()
|
||||
suite = { 'name' : name,
|
||||
'file' : file,
|
||||
'cfile' : cstr(file),
|
||||
'line' : line,
|
||||
'generated' : generated,
|
||||
'object' : 'suite_%s' % name,
|
||||
'dobject' : 'suiteDescription_%s' % name,
|
||||
'tlist' : 'Tests_%s' % name,
|
||||
'tests' : [],
|
||||
'lines' : [] }
|
||||
|
||||
def lineStartsBlock( line ):
|
||||
'''Check if current line starts a new CXXTEST_CODE() block'''
|
||||
return re.search( r'\bCXXTEST_CODE\s*\(', line ) is not None
|
||||
|
||||
test_re = re.compile( r'^([^/]|/[^/])*\bvoid\s+([Tt]est\w+)\s*\(\s*(void)?\s*\)' )
|
||||
def scanLineForTest( suite, lineNo, line ):
|
||||
'''Check if current line starts a test'''
|
||||
m = test_re.search( line )
|
||||
if m:
|
||||
addTest( suite, m.group(2), lineNo )
|
||||
|
||||
def addTest( suite, name, line ):
|
||||
'''Add a test function to the current suite'''
|
||||
test = { 'name' : name,
|
||||
'suite' : suite,
|
||||
'class' : 'TestDescription_%s_%s' % (suite['name'], name),
|
||||
'object' : 'testDescription_%s_%s' % (suite['name'], name),
|
||||
'line' : line,
|
||||
}
|
||||
suite['tests'].append( test )
|
||||
|
||||
def addLineToBlock( suite, lineNo, line ):
|
||||
'''Append the line to the current CXXTEST_CODE() block'''
|
||||
line = fixBlockLine( suite, lineNo, line )
|
||||
line = re.sub( r'^.*\{\{', '', line )
|
||||
|
||||
e = re.search( r'\}\}', line )
|
||||
if e:
|
||||
line = line[:e.start()]
|
||||
suite['lines'].append( line )
|
||||
return e is None
|
||||
|
||||
def fixBlockLine( suite, lineNo, line):
|
||||
'''Change all [E]TS_ macros used in a line to _[E]TS_ macros with the correct file/line'''
|
||||
return re.sub( r'\b(E?TSM?_(ASSERT[A-Z_]*|FAIL))\s*\(',
|
||||
r'_\1(%s,%s,' % (suite['cfile'], lineNo),
|
||||
line, 0 )
|
||||
|
||||
create_re = re.compile( r'\bstatic\s+\w+\s*\*\s*createSuite\s*\(\s*(void)?\s*\)' )
|
||||
def scanLineForCreate( suite, lineNo, line ):
|
||||
'''Check if current line defines a createSuite() function'''
|
||||
if create_re.search( line ):
|
||||
addSuiteCreateDestroy( suite, 'create', lineNo )
|
||||
|
||||
destroy_re = re.compile( r'\bstatic\s+void\s+destroySuite\s*\(\s*\w+\s*\*\s*\w*\s*\)' )
|
||||
def scanLineForDestroy( suite, lineNo, line ):
|
||||
'''Check if current line defines a destroySuite() function'''
|
||||
if destroy_re.search( line ):
|
||||
addSuiteCreateDestroy( suite, 'destroy', lineNo )
|
||||
|
||||
def cstr( str ):
|
||||
'''Convert a string to its C representation'''
|
||||
return '"' + string.replace( str, '\\', '\\\\' ) + '"'
|
||||
|
||||
|
||||
def addSuiteCreateDestroy( suite, which, line ):
|
||||
'''Add createSuite()/destroySuite() to current suite'''
|
||||
if suite.has_key(which):
|
||||
abort( '%s:%s: %sSuite() already declared' % ( suite['file'], str(line), which ) )
|
||||
suite[which] = line
|
||||
|
||||
def closeSuite():
|
||||
'''Close current suite and add it to the list if valid'''
|
||||
global suite
|
||||
if suite is not None:
|
||||
if len(suite['tests']) is not 0:
|
||||
verifySuite(suite)
|
||||
rememberSuite(suite)
|
||||
suite = None
|
||||
|
||||
def verifySuite(suite):
|
||||
'''Verify current suite is legal'''
|
||||
if suite.has_key('create') and not suite.has_key('destroy'):
|
||||
abort( '%s:%s: Suite %s has createSuite() but no destroySuite()' %
|
||||
(suite['file'], suite['create'], suite['name']) )
|
||||
if suite.has_key('destroy') and not suite.has_key('create'):
|
||||
abort( '%s:%s: Suite %s has destroySuite() but no createSuite()' %
|
||||
(suite['file'], suite['destroy'], suite['name']) )
|
||||
|
||||
def rememberSuite(suite):
|
||||
'''Add current suite to list'''
|
||||
global suites
|
||||
suites.append( suite )
|
||||
|
||||
def writeOutput():
|
||||
'''Create output file'''
|
||||
if templateFileName:
|
||||
writeTemplateOutput()
|
||||
else:
|
||||
writeSimpleOutput()
|
||||
|
||||
def writeSimpleOutput():
|
||||
'''Create output not based on template'''
|
||||
output = startOutputFile()
|
||||
writePreamble( output )
|
||||
writeMain( output )
|
||||
writeWorld( output )
|
||||
output.close()
|
||||
|
||||
include_re = re.compile( r"\s*\#\s*include\s+<cxxtest/" )
|
||||
preamble_re = re.compile( r"^\s*<CxxTest\s+preamble>\s*$" )
|
||||
world_re = re.compile( r"^\s*<CxxTest\s+world>\s*$" )
|
||||
def writeTemplateOutput():
|
||||
'''Create output based on template file'''
|
||||
template = open(templateFileName)
|
||||
output = startOutputFile()
|
||||
while 1:
|
||||
line = template.readline()
|
||||
if not line:
|
||||
break;
|
||||
if include_re.search( line ):
|
||||
writePreamble( output )
|
||||
output.write( line )
|
||||
elif preamble_re.search( line ):
|
||||
writePreamble( output )
|
||||
elif world_re.search( line ):
|
||||
writeWorld( output )
|
||||
else:
|
||||
output.write( line )
|
||||
template.close()
|
||||
output.close()
|
||||
|
||||
def startOutputFile():
|
||||
'''Create output file and write header'''
|
||||
if outputFileName is not None:
|
||||
output = open( outputFileName, 'w' )
|
||||
else:
|
||||
output = sys.stdout
|
||||
output.write( "/* Generated file, do not edit */\n\n" )
|
||||
return output
|
||||
|
||||
wrotePreamble = 0
|
||||
def writePreamble( output ):
|
||||
'''Write the CxxTest header (#includes and #defines)'''
|
||||
global wrotePreamble, headers, longlong
|
||||
if wrotePreamble: return
|
||||
output.write( "#ifndef CXXTEST_RUNNING\n" )
|
||||
output.write( "#define CXXTEST_RUNNING\n" )
|
||||
output.write( "#endif\n" )
|
||||
output.write( "\n" )
|
||||
if haveStandardLibrary:
|
||||
output.write( "#define _CXXTEST_HAVE_STD\n" )
|
||||
if haveExceptionHandling:
|
||||
output.write( "#define _CXXTEST_HAVE_EH\n" )
|
||||
if abortOnFail:
|
||||
output.write( "#define _CXXTEST_ABORT_TEST_ON_FAIL\n" )
|
||||
if longlong:
|
||||
output.write( "#define _CXXTEST_LONGLONG %s\n" % longlong )
|
||||
if factor:
|
||||
output.write( "#define _CXXTEST_FACTOR\n" )
|
||||
for header in headers:
|
||||
output.write( "#include %s\n" % header )
|
||||
output.write( "#include <cxxtest/TestListener.h>\n" )
|
||||
output.write( "#include <cxxtest/TestTracker.h>\n" )
|
||||
output.write( "#include <cxxtest/TestRunner.h>\n" )
|
||||
output.write( "#include <cxxtest/RealDescriptions.h>\n" )
|
||||
if runner:
|
||||
output.write( "#include <cxxtest/%s.h>\n" % runner )
|
||||
if gui:
|
||||
output.write( "#include <cxxtest/%s.h>\n" % gui )
|
||||
output.write( "\n" )
|
||||
wrotePreamble = 1
|
||||
|
||||
def writeMain( output ):
|
||||
'''Write the main() function for the test runner'''
|
||||
if gui:
|
||||
output.write( 'int main( int argc, char *argv[] ) {\n' )
|
||||
if noStaticInit:
|
||||
output.write( ' CxxTest::initialize();\n' )
|
||||
output.write( ' return CxxTest::GuiTuiRunner<CxxTest::%s, CxxTest::%s>( argc, argv ).run();\n' % (gui, runner) )
|
||||
output.write( '}\n' )
|
||||
elif runner:
|
||||
output.write( 'int main() {\n' )
|
||||
if noStaticInit:
|
||||
output.write( ' CxxTest::initialize();\n' )
|
||||
output.write( ' return CxxTest::%s().run();\n' % runner )
|
||||
output.write( '}\n' )
|
||||
|
||||
wroteWorld = 0
|
||||
def writeWorld( output ):
|
||||
'''Write the world definitions'''
|
||||
global wroteWorld, part
|
||||
if wroteWorld: return
|
||||
writePreamble( output )
|
||||
writeSuites( output )
|
||||
if root or not part:
|
||||
writeRoot( output )
|
||||
if noStaticInit:
|
||||
writeInitialize( output )
|
||||
wroteWorld = 1
|
||||
|
||||
def writeSuites(output):
|
||||
'''Write all TestDescriptions and SuiteDescriptions'''
|
||||
for suite in suites:
|
||||
writeInclude( output, suite['file'] )
|
||||
if isGenerated(suite):
|
||||
generateSuite( output, suite )
|
||||
if isDynamic(suite):
|
||||
writeSuitePointer( output, suite )
|
||||
else:
|
||||
writeSuiteObject( output, suite )
|
||||
writeTestList( output, suite )
|
||||
writeSuiteDescription( output, suite )
|
||||
writeTestDescriptions( output, suite )
|
||||
|
||||
def isGenerated(suite):
|
||||
'''Checks whether a suite class should be created'''
|
||||
return suite['generated']
|
||||
|
||||
def isDynamic(suite):
|
||||
'''Checks whether a suite is dynamic'''
|
||||
return suite.has_key('create')
|
||||
|
||||
lastIncluded = ''
|
||||
def writeInclude(output, file):
|
||||
'''Add #include "file" statement'''
|
||||
global lastIncluded
|
||||
if file == lastIncluded: return
|
||||
output.writelines( [ '#include "', file, '"\n\n' ] )
|
||||
lastIncluded = file
|
||||
|
||||
def generateSuite( output, suite ):
|
||||
'''Write a suite declared with CXXTEST_SUITE()'''
|
||||
output.write( 'class %s : public CxxTest::TestSuite {\n' % suite['name'] )
|
||||
output.write( 'public:\n' )
|
||||
for line in suite['lines']:
|
||||
output.write(line)
|
||||
output.write( '};\n\n' )
|
||||
|
||||
def writeSuitePointer( output, suite ):
|
||||
'''Create static suite pointer object for dynamic suites'''
|
||||
if noStaticInit:
|
||||
output.write( 'static %s *%s;\n\n' % (suite['name'], suite['object']) )
|
||||
else:
|
||||
output.write( 'static %s *%s = 0;\n\n' % (suite['name'], suite['object']) )
|
||||
|
||||
def writeSuiteObject( output, suite ):
|
||||
'''Create static suite object for non-dynamic suites'''
|
||||
output.writelines( [ "static ", suite['name'], " ", suite['object'], ";\n\n" ] )
|
||||
|
||||
def writeTestList( output, suite ):
|
||||
'''Write the head of the test linked list for a suite'''
|
||||
if noStaticInit:
|
||||
output.write( 'static CxxTest::List %s;\n' % suite['tlist'] )
|
||||
else:
|
||||
output.write( 'static CxxTest::List %s = { 0, 0 };\n' % suite['tlist'] )
|
||||
|
||||
def writeTestDescriptions( output, suite ):
|
||||
'''Write all test descriptions for a suite'''
|
||||
for test in suite['tests']:
|
||||
writeTestDescription( output, suite, test )
|
||||
|
||||
def writeTestDescription( output, suite, test ):
|
||||
'''Write test description object'''
|
||||
output.write( 'static class %s : public CxxTest::RealTestDescription {\n' % test['class'] )
|
||||
output.write( 'public:\n' )
|
||||
if not noStaticInit:
|
||||
output.write( ' %s() : CxxTest::RealTestDescription( %s, %s, %s, "%s" ) {}\n' %
|
||||
(test['class'], suite['tlist'], suite['dobject'], test['line'], test['name']) )
|
||||
output.write( ' void runTest() { %s }\n' % runBody( suite, test ) )
|
||||
output.write( '} %s;\n\n' % test['object'] )
|
||||
|
||||
def runBody( suite, test ):
|
||||
'''Body of TestDescription::run()'''
|
||||
if isDynamic(suite): return dynamicRun( suite, test )
|
||||
else: return staticRun( suite, test )
|
||||
|
||||
def dynamicRun( suite, test ):
|
||||
'''Body of TestDescription::run() for test in a dynamic suite'''
|
||||
return 'if ( ' + suite['object'] + ' ) ' + suite['object'] + '->' + test['name'] + '();'
|
||||
|
||||
def staticRun( suite, test ):
|
||||
'''Body of TestDescription::run() for test in a non-dynamic suite'''
|
||||
return suite['object'] + '.' + test['name'] + '();'
|
||||
|
||||
def writeSuiteDescription( output, suite ):
|
||||
'''Write SuiteDescription object'''
|
||||
if isDynamic( suite ):
|
||||
writeDynamicDescription( output, suite )
|
||||
else:
|
||||
writeStaticDescription( output, suite )
|
||||
|
||||
def writeDynamicDescription( output, suite ):
|
||||
'''Write SuiteDescription for a dynamic suite'''
|
||||
output.write( 'CxxTest::DynamicSuiteDescription<%s> %s' % (suite['name'], suite['dobject']) )
|
||||
if not noStaticInit:
|
||||
output.write( '( %s, %s, "%s", %s, %s, %s, %s )' %
|
||||
(suite['cfile'], suite['line'], suite['name'], suite['tlist'],
|
||||
suite['object'], suite['create'], suite['destroy']) )
|
||||
output.write( ';\n\n' )
|
||||
|
||||
def writeStaticDescription( output, suite ):
|
||||
'''Write SuiteDescription for a static suite'''
|
||||
output.write( 'CxxTest::StaticSuiteDescription %s' % suite['dobject'] )
|
||||
if not noStaticInit:
|
||||
output.write( '( %s, %s, "%s", %s, %s )' %
|
||||
(suite['cfile'], suite['line'], suite['name'], suite['object'], suite['tlist']) )
|
||||
output.write( ';\n\n' )
|
||||
|
||||
def writeRoot(output):
|
||||
'''Write static members of CxxTest classes'''
|
||||
output.write( '#include <cxxtest/Root.cpp>\n' )
|
||||
|
||||
def writeInitialize(output):
|
||||
'''Write CxxTest::initialize(), which replaces static initialization'''
|
||||
output.write( 'namespace CxxTest {\n' )
|
||||
output.write( ' void initialize()\n' )
|
||||
output.write( ' {\n' )
|
||||
for suite in suites:
|
||||
output.write( ' %s.initialize();\n' % suite['tlist'] )
|
||||
if isDynamic(suite):
|
||||
output.write( ' %s = 0;\n' % suite['object'] )
|
||||
output.write( ' %s.initialize( %s, %s, "%s", %s, %s, %s, %s );\n' %
|
||||
(suite['dobject'], suite['cfile'], suite['line'], suite['name'],
|
||||
suite['tlist'], suite['object'], suite['create'], suite['destroy']) )
|
||||
else:
|
||||
output.write( ' %s.initialize( %s, %s, "%s", %s, %s );\n' %
|
||||
(suite['dobject'], suite['cfile'], suite['line'], suite['name'],
|
||||
suite['object'], suite['tlist']) )
|
||||
|
||||
for test in suite['tests']:
|
||||
output.write( ' %s.initialize( %s, %s, %s, "%s" );\n' %
|
||||
(test['object'], suite['tlist'], suite['dobject'], test['line'], test['name']) )
|
||||
|
||||
output.write( ' }\n' )
|
||||
output.write( '}\n' )
|
||||
|
||||
main()
|
83
test/cxxtest/docs/convert.pl
Normal file
83
test/cxxtest/docs/convert.pl
Normal file
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
die "Usage: $0 <text file> <html file> <TexInfo file>\n"
|
||||
unless scalar @ARGV == 3;
|
||||
|
||||
my ($text, $html, $texi) = @ARGV;
|
||||
|
||||
open TEXT, "<$text" or die "Cannot open text file \"$text\"\n";
|
||||
open HTML, ">$html" or die "Cannot create html file \"$html\"\n";
|
||||
open TEXI, ">$texi" or die "Cannot create TexInfo file \"$texi\"\n";
|
||||
|
||||
print HTML "<html>";
|
||||
|
||||
sub analyze($) {
|
||||
my ($line) = @_;
|
||||
my ($htmlLine, $texiLine) = ($line, $line);
|
||||
|
||||
# command line options
|
||||
$texiLine =~ s/ (--?[a-z-]*)/ \@option{$1}/g;
|
||||
$htmlLine =~ s/ (--?[a-z-]*)/ <tt>$1<\/tt>/g;
|
||||
|
||||
# [Class::]function()
|
||||
$texiLine =~ s/([^A-Za-z])(([A-Z][A-Za-z0-9]*::)?[A-Za-z0-9]+\(\))/$1\@code{$2}/g;
|
||||
$htmlLine =~ s/([^A-Za-z])(([A-Z][A-Za-z0-9]*::)?[A-Za-z0-9]+\(\))/$1<code>$2<\/code>/g;
|
||||
|
||||
# `file'
|
||||
$texiLine =~ s/`([A-Za-z.\/]*)'/\@file{$1}/g;
|
||||
$htmlLine =~ s/`([A-Za-z.\/]*)'/<tt>`$1'<\/tt>/g;
|
||||
|
||||
# TS...
|
||||
$texiLine =~ s/(^|[^A-Z])(TS[A-Za-z_*()]*)/$1\@code{$2}/g;
|
||||
$htmlLine =~ s/(^|[^A-Z])(TS[A-Za-z_*()]*)/$1<code>$2<\/code>/g;
|
||||
|
||||
# CXXTEST_
|
||||
$texiLine =~ s/(CXXTEST_[A-Z_]*)/\@code{$1}/g;
|
||||
$htmlLine =~ s/(CXXTEST_[A-Z_]*)/<tt>$1<\/tt>/g;
|
||||
|
||||
return ($htmlLine, $texiLine);
|
||||
}
|
||||
|
||||
my $line;
|
||||
my $inRelease = 0;
|
||||
while ( defined( $line = <TEXT> ) ) {
|
||||
chomp $line;
|
||||
if ( $line =~ m/^CxxTest Releases/ ) {
|
||||
print HTML "<title>CxxTest Releases</title>\n";
|
||||
print HTML "<h1>CxxTest Releases</h1>\n\n";
|
||||
|
||||
print TEXI "\@appendix Version history\n";
|
||||
print TEXI "\@itemize \@bullet\n";
|
||||
}
|
||||
elsif ( $line =~ m/^(.*):$/ ) {
|
||||
if ( $inRelease ) {
|
||||
print HTML "</ul>\n\n";
|
||||
print TEXI "\@end itemize\n";
|
||||
}
|
||||
|
||||
print HTML "<h2>$1</h2>\n";
|
||||
print HTML "<ul>\n";
|
||||
|
||||
print TEXI "\@item\n\@strong{$1}\n";
|
||||
print TEXI "\@itemize \@minus\n";
|
||||
|
||||
$inRelease = 1;
|
||||
}
|
||||
elsif ( $line =~ m/^ - (.*)$/ ) {
|
||||
my ($htmlLine, $texiLine) = analyze($1);
|
||||
print HTML "<li>$htmlLine</li>\n";
|
||||
print TEXI "\@item\n$texiLine\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ( $inRelease ) {
|
||||
print HTML "</ul>\n\n";
|
||||
print TEXI "\@end itemize\n\n";
|
||||
}
|
||||
|
||||
print HTML "</html>\n";
|
||||
print TEXI "\@end itemize\n";
|
||||
|
||||
close TEXT or die "Error closing text file \"$text\"\n";
|
||||
close HTML or die "Error closing html file \"$html\"\n";
|
||||
close TEXI or die "Error closing TexInfo file \"$texi\"\n";
|
1960
test/cxxtest/docs/guide.html
Normal file
1960
test/cxxtest/docs/guide.html
Normal file
File diff suppressed because it is too large
Load diff
56
test/cxxtest/docs/index.html
Normal file
56
test/cxxtest/docs/index.html
Normal file
|
@ -0,0 +1,56 @@
|
|||
<html>
|
||||
<title>CxxTest</title>
|
||||
<h1>Introduction</h1>
|
||||
|
||||
<p>CxxTest is a JUnit/CppUnit/xUnit-like framework for C++.
|
||||
|
||||
<p>Its advantages over existing alternatives are that it:
|
||||
<ul>
|
||||
<li>Doesn't require RTTI
|
||||
<li>Doesn't require member template functions
|
||||
<li>Doesn't require exception handling
|
||||
<li>Doesn't require any external libraries (including memory management,
|
||||
file/console I/O, graphics libraries)
|
||||
<li>Is distributed entirely as a set of header files
|
||||
</ul>
|
||||
|
||||
<p>This makes it extremely portable and usable.
|
||||
|
||||
<p>CxxTest is available under the <a href="http://www.gnu.org/copyleft/lesser.html">GNU
|
||||
Lesser General Public License</a>.
|
||||
|
||||
<p>See <a href="guide.html">the user's guide</a> for information.
|
||||
It is also available as <a href="http://cxxtest.sourceforge.net/guide.pdf">a PDF file</a>.
|
||||
|
||||
<p>The version history is available <a href="http://cxxtest.sourceforge.net/Versions.html">here</a>.
|
||||
|
||||
<h1>Getting CxxTest</h1>
|
||||
You can always get the latest release from
|
||||
<a href="http://sourceforge.net/project/showfiles.php?group_id=52834">here</a> or
|
||||
<a href="http://dl.sourceforge.net/cxxtest">here</a>.
|
||||
|
||||
<p>There are several files you can download:
|
||||
<ul>
|
||||
<li><code>cxxtest-<i>version</i>-1.noarch.rpm</code>
|
||||
<li><code>cxxtest-<i>version</i>.tar.gz</code>
|
||||
<li><code>cxxtest-<i>version</i>.zip</code>
|
||||
<li><code>cxxtest-guide-<i>version</i>.pdf</code> (the user's guide)
|
||||
</ul>
|
||||
Note that, since CxxTest consists entirely of header files,
|
||||
there is no distinction between source and binary distribution.
|
||||
|
||||
<p>There are also files called <code>cxxtest-selftest-*</code>: these
|
||||
are used (usually by me) to test the portability of CxxTest, so you
|
||||
can probably do without them.
|
||||
|
||||
<p>If you just can't wait for the next release, I sometimes upload betas
|
||||
to <a href="http://cxxtest.sourceforge.net/beta">here</a>.
|
||||
|
||||
<h1>Getting started</h1>
|
||||
Get the sources and build the samples in the sample subdirectory.
|
||||
|
||||
<br>
|
||||
<p>
|
||||
<A href="http://sourceforge.net"> <IMG src="http://sourceforge.net/sflogo.php?group_id=52834&type=4" border="0" alt="SourceForge Logo"></A>
|
||||
|
||||
</html>
|
BIN
test/cxxtest/docs/qt.png
Normal file
BIN
test/cxxtest/docs/qt.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
BIN
test/cxxtest/docs/qt2.png
Normal file
BIN
test/cxxtest/docs/qt2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
test/cxxtest/docs/win32.png
Normal file
BIN
test/cxxtest/docs/win32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
test/cxxtest/docs/x11.png
Normal file
BIN
test/cxxtest/docs/x11.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
64
test/cxxtest/sample/Construct
Normal file
64
test/cxxtest/sample/Construct
Normal file
|
@ -0,0 +1,64 @@
|
|||
# -*- Perl -*-
|
||||
|
||||
#
|
||||
# This file shows how to use CxxTest with Cons
|
||||
#
|
||||
|
||||
$env = new cons( CXX => ("$^O" eq 'MSWin32') ? 'cl -nologo -GX' : 'c++',
|
||||
CPPPATH => '..',
|
||||
CXXTESTGEN => 'perl -w ../cxxtestgen.pl' );
|
||||
|
||||
@tests = <*.h>;
|
||||
|
||||
# The error printer is the most basic runner
|
||||
CxxTestErrorPrinter $env 'error_printer', @tests;
|
||||
|
||||
# You can also specify which runner you want to use
|
||||
CxxTestRunner $env 'stdio_printer', 'StdioPrinter', @tests;
|
||||
|
||||
# For more control, use template files
|
||||
CxxTestTemplate $env 'file_printer', 'file_printer.tpl', @tests;
|
||||
|
||||
# Or, you can always separate the tests from the runner
|
||||
CxxTest $env 'tests.cpp', '', @tests;
|
||||
Program $env 'yes_no_runner', ('yes_no_runner.cpp', 'tests.cpp');
|
||||
|
||||
|
||||
#
|
||||
# Here is the code used to build these files
|
||||
# You can use this in your own Construct files
|
||||
#
|
||||
|
||||
# cons::CxxTest $env $dst, $options, @srcs
|
||||
# Generates a CxxTest source file, passing the specified options to cxxtestgen
|
||||
sub cons::CxxTest($$$@) {
|
||||
my ($env, $dst, $options, @srcs) = @_;
|
||||
Command $env $dst, @srcs, "%CXXTESTGEN -o %> ${options} %<";
|
||||
}
|
||||
|
||||
# cons::CxxTestTemplate $env $dst, $template, @srcs
|
||||
# Generates and builds a CxxTest runner using a template file
|
||||
sub cons::CxxTestTemplate($$$@) {
|
||||
my ($env, $dst, $template, @srcs) = @_;
|
||||
my $source = "${dst}.cpp";
|
||||
CxxTest $env $source, "--template=${template}", ($template, @srcs);
|
||||
Program $env $dst, $source;
|
||||
}
|
||||
|
||||
# cons::CxxTestRunner $env $dst, $runner, @srcs
|
||||
# Generates and builds a CxxTest runner using the --runner option
|
||||
sub cons::CxxTestRunner($$$@) {
|
||||
my ($env, $dst, $runner, @srcs) = @_;
|
||||
my $source = "${dst}.cpp";
|
||||
CxxTest $env $source, "--runner=${runner}", @srcs;
|
||||
Program $env $dst, $source;
|
||||
}
|
||||
|
||||
# cons::CxxTestErrorPrinter $env $dst, @srcs
|
||||
# Generates and builds a CxxTest ErrorPrinter
|
||||
sub cons::CxxTestErrorPrinter($$@) {
|
||||
my ($env, $dst, @srcs) = @_;
|
||||
CxxTestRunner $env $dst, 'ErrorPrinter', @srcs;
|
||||
}
|
||||
|
||||
|
31
test/cxxtest/sample/CreatedTest.h
Normal file
31
test/cxxtest/sample/CreatedTest.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
#ifndef __CREATEDTEST_H
|
||||
#define __CREATEDTEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <string.h>
|
||||
#include <memory.h>
|
||||
|
||||
//
|
||||
// This test suite shows what to do when your test case
|
||||
// class cannot be instantiated statically.
|
||||
// As an example, this test suite requires a non-default constructor.
|
||||
//
|
||||
|
||||
class CreatedTest : public CxxTest::TestSuite
|
||||
{
|
||||
char *_buffer;
|
||||
public:
|
||||
CreatedTest( unsigned size ) : _buffer( new char[size] ) {}
|
||||
virtual ~CreatedTest() { delete [] _buffer; }
|
||||
|
||||
static CreatedTest *createSuite() { return new CreatedTest( 16 ); }
|
||||
static void destroySuite( CreatedTest *suite ) { delete suite; }
|
||||
|
||||
void test_nothing()
|
||||
{
|
||||
TS_FAIL( "Nothing to test" );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __CREATEDTEST_H
|
27
test/cxxtest/sample/DeltaTest.h
Normal file
27
test/cxxtest/sample/DeltaTest.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef __DELTATEST_H
|
||||
#define __DELTATEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <math.h>
|
||||
|
||||
class DeltaTest : public CxxTest::TestSuite
|
||||
{
|
||||
double _pi, _delta;
|
||||
|
||||
public:
|
||||
void setUp()
|
||||
{
|
||||
_pi = 3.1415926535;
|
||||
_delta = 0.0001;
|
||||
}
|
||||
|
||||
void testSine()
|
||||
{
|
||||
TS_ASSERT_DELTA( sin(0.0), 0.0, _delta );
|
||||
TS_ASSERT_DELTA( sin(_pi / 6), 0.5, _delta );
|
||||
TS_ASSERT_DELTA( sin(_pi / 2), 1.0, _delta );
|
||||
TS_ASSERT_DELTA( sin(_pi), 0.0, _delta );
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __DELTATEST_H
|
39
test/cxxtest/sample/EnumTraits.h
Normal file
39
test/cxxtest/sample/EnumTraits.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
//
|
||||
// This is a test of CxxTest's ValueTraits for enumerations.
|
||||
//
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
//
|
||||
// First define your enumeration
|
||||
//
|
||||
enum Answer {
|
||||
Yes,
|
||||
No,
|
||||
Maybe,
|
||||
DontKnow,
|
||||
DontCare
|
||||
};
|
||||
|
||||
//
|
||||
// Now make CxxTest aware of it
|
||||
//
|
||||
CXXTEST_ENUM_TRAITS( Answer,
|
||||
CXXTEST_ENUM_MEMBER( Yes )
|
||||
CXXTEST_ENUM_MEMBER( No )
|
||||
CXXTEST_ENUM_MEMBER( Maybe )
|
||||
CXXTEST_ENUM_MEMBER( DontKnow )
|
||||
CXXTEST_ENUM_MEMBER( DontCare ) );
|
||||
|
||||
class EnumTraits : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void test_Enum_traits()
|
||||
{
|
||||
TS_FAIL( Yes );
|
||||
TS_FAIL( No );
|
||||
TS_FAIL( Maybe );
|
||||
TS_FAIL( DontKnow );
|
||||
TS_FAIL( DontCare );
|
||||
TS_FAIL( (Answer)1000 );
|
||||
}
|
||||
};
|
52
test/cxxtest/sample/ExceptionTest.h
Normal file
52
test/cxxtest/sample/ExceptionTest.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
#ifndef __EXCEPTIONTEST_H
|
||||
#define __EXCEPTIONTEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
//
|
||||
// This test suite demonstrates the use of TS_ASSERT_THROWS
|
||||
//
|
||||
|
||||
class ExceptionTest : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void testAssertion( void )
|
||||
{
|
||||
// This assert passes, since throwThis() throws (Number)
|
||||
TS_ASSERT_THROWS( throwThis(3), const Number & );
|
||||
// This assert passes, since throwThis() throws something
|
||||
TS_ASSERT_THROWS_ANYTHING( throwThis(-30) );
|
||||
// This assert fails, since throwThis() doesn't throw char *
|
||||
TS_ASSERT_THROWS( throwThis(5), const char * );
|
||||
// This assert fails since goodFunction() throws nothing
|
||||
TS_ASSERT_THROWS_ANYTHING( goodFunction(1) );
|
||||
// The regular TS_ASSERT macros will catch unhandled exceptions
|
||||
TS_ASSERT_EQUALS( throwThis(3), 333 );
|
||||
// You can assert that a function throws nothing
|
||||
TS_ASSERT_THROWS_NOTHING( throwThis(-1) );
|
||||
// If you want to catch the exceptions yourself, use the ETS_ marcos
|
||||
try {
|
||||
ETS_ASSERT_EQUALS( throwThis(3), 333 );
|
||||
} catch( const Number & ) {
|
||||
TS_FAIL( "throwThis(3) failed" );
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void goodFunction( int )
|
||||
{
|
||||
}
|
||||
|
||||
class Number
|
||||
{
|
||||
public:
|
||||
Number( int ) {}
|
||||
};
|
||||
|
||||
int throwThis( int i )
|
||||
{
|
||||
throw Number( i );
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __EXCEPTIONTEST_H
|
37
test/cxxtest/sample/FixtureTest.h
Normal file
37
test/cxxtest/sample/FixtureTest.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
#ifndef __FIXTURETEST_H
|
||||
#define __FIXTURETEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <string.h>
|
||||
|
||||
//
|
||||
// This test suite shows how to use setUp() and tearDown()
|
||||
// to initialize data common to all tests.
|
||||
// setUp()/tearDown() will be called before and after each
|
||||
// test.
|
||||
//
|
||||
|
||||
class FixtureTest : public CxxTest::TestSuite
|
||||
{
|
||||
char *_buffer;
|
||||
public:
|
||||
void setUp()
|
||||
{
|
||||
_buffer = new char[1024];
|
||||
}
|
||||
|
||||
void tearDown()
|
||||
{
|
||||
delete [] _buffer;
|
||||
}
|
||||
|
||||
void test_strcpy()
|
||||
{
|
||||
strcpy( _buffer, "Hello, world!" );
|
||||
TS_ASSERT_EQUALS( _buffer[0], 'H' );
|
||||
TS_ASSERT_EQUALS( _buffer[1], 'E' );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __FIXTURETEST_H
|
32
test/cxxtest/sample/Makefile.PL
Executable file
32
test/cxxtest/sample/Makefile.PL
Executable file
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/perl
|
||||
#
|
||||
# This isn't a "real" `Makefile.PL'
|
||||
# It just copies the correct `Makefile.*' to `Makefile'
|
||||
#
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use File::Copy;
|
||||
|
||||
sub usage() {
|
||||
die "Usage: $0 [--bcc32]\n";
|
||||
}
|
||||
|
||||
my $source;
|
||||
my $target = 'Makefile';
|
||||
my $windows = $ENV{'windir'};
|
||||
|
||||
GetOptions( 'bcc32' => sub { $source = 'Makefile.bcc32' } ) or usage();
|
||||
if ( !defined( $source ) ) {
|
||||
$source = $windows ? 'Makefile.msvc' : 'Makefile.unix';
|
||||
}
|
||||
|
||||
unlink($target);
|
||||
$windows ? copy($source, $target) : symlink($source, $target);
|
||||
|
||||
print "`Makefile' is now `$source'.\n";
|
||||
|
||||
#
|
||||
# Local Variables:
|
||||
# compile-command: "perl Makefile.PL"
|
||||
# End:
|
||||
#
|
94
test/cxxtest/sample/Makefile.bcc32
Normal file
94
test/cxxtest/sample/Makefile.bcc32
Normal file
|
@ -0,0 +1,94 @@
|
|||
#
|
||||
# Makefile for Borland C++
|
||||
# Make sure bcc32.exe is in the PATH or change CXXC below
|
||||
#
|
||||
|
||||
# For the Win32 GUI
|
||||
#WIN32_FLAGS = user32.lib comctl32.lib
|
||||
|
||||
# For the Qt GUI
|
||||
#QTDIR = c:\qt
|
||||
QT_FLAGS = -I$(QTDIR)/include $(QTDIR)/lib/qt.lib
|
||||
|
||||
|
||||
TARGETS = error_printer.exe stdio_printer.exe yes_no_runner.exe file_printer.exe aborter.exe only.exe
|
||||
GUI_TARGETS = win32_runner.exe qt_runner.exe
|
||||
TESTS = *.h
|
||||
GUI_TESTS = gui/GreenYellowRed.h $(TESTS)
|
||||
TESTGEN = perl -w ../cxxtestgen.pl
|
||||
CXXC = bcc32.exe -w- -I. -I..
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
del *~ *.o *.obj
|
||||
del $(TARGETS)
|
||||
del $(GUI_TARGETS)
|
||||
del tests.cpp error_printer.cpp stdio_printer.cpp file_printer.cpp aborter.cpp only.cpp
|
||||
del win32_runner.cpp qt_runner.cpp
|
||||
|
||||
distclean: clean
|
||||
del Makefile
|
||||
|
||||
run: error_printer.exe
|
||||
error_printer.exe
|
||||
|
||||
run_win32: win32_runner.exe
|
||||
win32_runner.exe
|
||||
|
||||
run_qt: qt_runner.exe
|
||||
qt_runner.exe
|
||||
|
||||
error_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o error_printer.cpp --error-printer $(TESTS)
|
||||
|
||||
stdio_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o stdio_printer.cpp --runner=StdioPrinter $(TESTS)
|
||||
|
||||
file_printer.cpp: file_printer.tpl $(TESTS)
|
||||
$(TESTGEN) -o file_printer.cpp --template=file_printer.tpl $(TESTS)
|
||||
|
||||
aborter.cpp: aborter.tpl $(TESTS)
|
||||
$(TESTGEN) -o aborter.cpp --template=aborter.tpl $(TESTS)
|
||||
|
||||
only.cpp: only.tpl $(TESTS)
|
||||
$(TESTGEN) -o only.cpp --template=only.tpl $(TESTS)
|
||||
|
||||
tests.cpp: $(TESTS)
|
||||
$(TESTGEN) -o tests.cpp $(TESTS)
|
||||
|
||||
win32_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o win32_runner.cpp --gui=Win32Gui $(GUI_TESTS)
|
||||
|
||||
qt_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o qt_runner.cpp --gui=QtGui $(GUI_TESTS)
|
||||
|
||||
error_printer.exe: error_printer.cpp
|
||||
$(CXXC) -eerror_printer.exe error_printer.cpp
|
||||
|
||||
stdio_printer.exe: stdio_printer.cpp
|
||||
$(CXXC) -estdio_printer.exe stdio_printer.cpp
|
||||
|
||||
file_printer.exe: file_printer.cpp
|
||||
$(CXXC) -efile_printer.exe file_printer.cpp
|
||||
|
||||
only.exe: only.cpp
|
||||
$(CXXC) -eonly.exe only.cpp
|
||||
|
||||
aborter.exe: aborter.cpp
|
||||
$(CXXC) -eaborter.exe aborter.cpp
|
||||
|
||||
yes_no_runner.exe: yes_no_runner.cpp tests.cpp
|
||||
$(CXXC) -eyes_no_runner.exe yes_no_runner.cpp tests.cpp
|
||||
|
||||
win32_runner.exe: win32_runner.cpp
|
||||
$(CXXC) -ewin32_runner.exe win32_runner.cpp $(WIN32_FLAGS)
|
||||
|
||||
qt_runner.exe: qt_runner.cpp
|
||||
$(CXXC) -o qt_runner.exe qt_runner.cpp $(QT_FLAGS)
|
||||
|
||||
#
|
||||
# Local Variables:
|
||||
# compile-command: "make -fMakefile.bcc32"
|
||||
# End:
|
||||
#
|
93
test/cxxtest/sample/Makefile.msvc
Normal file
93
test/cxxtest/sample/Makefile.msvc
Normal file
|
@ -0,0 +1,93 @@
|
|||
#
|
||||
# Makefile for Microsoft Visual C++
|
||||
# Make sure cl.exe is in the PATH (run vcvars.bat) or change CXXC below
|
||||
#
|
||||
|
||||
# For the Win32 GUI
|
||||
WIN32_FLAGS = user32.lib
|
||||
|
||||
# For the Qt GUI
|
||||
# QTDIR = c:\qt
|
||||
QT_FLAGS = -I$(QTDIR)/include $(QTDIR)/lib/qt.lib
|
||||
|
||||
TARGETS = error_printer.exe stdio_printer.exe yes_no_runner.exe file_printer.exe aborter.exe only.exe
|
||||
GUI_TARGETS = win32_runner.exe qt_runner.exe
|
||||
TESTS = *.h
|
||||
GUI_TESTS = gui/GreenYellowRed.h $(TESTS)
|
||||
TESTGEN = perl -w ../cxxtestgen.pl
|
||||
CXXC = cl.exe -GX -W3 -WX -I. -I..
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
del *~ *.o *.obj
|
||||
del $(TARGETS)
|
||||
del $(GUI_TARGETS)
|
||||
del tests.cpp error_printer.cpp stdio_printer.cpp file_printer.cpp aborter.cpp only.cpp
|
||||
del win32_runner.cpp qt_runner.cpp
|
||||
|
||||
distclean: clean
|
||||
del Makefile
|
||||
|
||||
run: error_printer.exe
|
||||
error_printer.exe
|
||||
|
||||
run_win32: win32_runner.exe
|
||||
win32_runner.exe
|
||||
|
||||
run_qt: qt_runner.exe
|
||||
qt_runner.exe
|
||||
|
||||
error_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o error_printer.cpp --error-printer $(TESTS)
|
||||
|
||||
stdio_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o stdio_printer.cpp --runner=StdioPrinter $(TESTS)
|
||||
|
||||
file_printer.cpp: file_printer.tpl $(TESTS)
|
||||
$(TESTGEN) -o file_printer.cpp --template=file_printer.tpl $(TESTS)
|
||||
|
||||
aborter.cpp: aborter.tpl $(TESTS)
|
||||
$(TESTGEN) -o aborter.cpp --template=aborter.tpl $(TESTS)
|
||||
|
||||
only.cpp: only.tpl $(TESTS)
|
||||
$(TESTGEN) -o only.cpp --template=only.tpl $(TESTS)
|
||||
|
||||
tests.cpp: $(TESTS)
|
||||
$(TESTGEN) -o tests.cpp $(TESTS)
|
||||
|
||||
win32_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o win32_runner.cpp --gui=Win32Gui $(GUI_TESTS)
|
||||
|
||||
qt_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o qt_runner.cpp --gui=QtGui $(GUI_TESTS)
|
||||
|
||||
error_printer.exe: error_printer.cpp
|
||||
$(CXXC) -o error_printer.exe error_printer.cpp
|
||||
|
||||
stdio_printer.exe: stdio_printer.cpp
|
||||
$(CXXC) -o stdio_printer.exe stdio_printer.cpp
|
||||
|
||||
file_printer.exe: file_printer.cpp
|
||||
$(CXXC) -o file_printer.exe file_printer.cpp
|
||||
|
||||
only.exe: only.cpp
|
||||
$(CXXC) -o only.exe only.cpp
|
||||
|
||||
aborter.exe: aborter.cpp
|
||||
$(CXXC) -o aborter.exe aborter.cpp
|
||||
|
||||
yes_no_runner.exe: yes_no_runner.cpp tests.cpp
|
||||
$(CXXC) -o yes_no_runner.exe yes_no_runner.cpp tests.cpp
|
||||
|
||||
win32_runner.exe: win32_runner.cpp
|
||||
$(CXXC) -o win32_runner.exe win32_runner.cpp $(WIN32_FLAGS)
|
||||
|
||||
qt_runner.exe: qt_runner.cpp
|
||||
$(CXXC) -o qt_runner.exe qt_runner.cpp $(QT_FLAGS)
|
||||
|
||||
#
|
||||
# Local Variables:
|
||||
# compile-command: "nmake -fMakefile.msvc"
|
||||
# End:
|
||||
#
|
88
test/cxxtest/sample/Makefile.unix
Normal file
88
test/cxxtest/sample/Makefile.unix
Normal file
|
@ -0,0 +1,88 @@
|
|||
#
|
||||
# Makefile for UN*X-like systems
|
||||
#
|
||||
|
||||
# Change this line if you want a different compiler
|
||||
CXXC = c++ -Wall -W -Werror -I. -I..
|
||||
|
||||
# If you want to use python, specify USE_PYTHON=1 on the command line
|
||||
ifdef USE_PYTHON
|
||||
TESTGEN = ../cxxtestgen.py
|
||||
else
|
||||
TESTGEN = ../cxxtestgen.pl
|
||||
endif
|
||||
|
||||
# For the X11 GUI
|
||||
X11_FLAGS = -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
|
||||
|
||||
# For the Qt GUI
|
||||
#QTDIR = /usr/lib/qt
|
||||
QTLIB = -lqt-mt
|
||||
#QTLIB = -lqt
|
||||
QT_FLAGS = -I$(QTDIR)/include -L$(QTDIR)/lib $(QTLIB) -O2
|
||||
|
||||
TARGETS = error_printer stdio_printer yes_no_runner file_printer aborter only
|
||||
GUI_TARGETS = x11_runner qt_runner
|
||||
TESTS = *.h
|
||||
GUI_TESTS = gui/GreenYellowRed.h $(TESTS)
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
rm -f *~ *.o *.obj $(TARGETS) $(GUI_TARGETS)
|
||||
rm -f tests.cpp error_printer.cpp stdio_printer.cpp file_printer.cpp aborter.cpp only.cpp
|
||||
rm -f x11_runner.cpp qt_runner.cpp
|
||||
|
||||
distclean: clean
|
||||
rm -f Makefile
|
||||
|
||||
run: error_printer
|
||||
./error_printer
|
||||
|
||||
run_x11: x11_runner
|
||||
./x11_runner
|
||||
|
||||
run_qt: qt_runner
|
||||
./qt_runner
|
||||
|
||||
error_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o $@ --error-printer $(TESTS)
|
||||
|
||||
stdio_printer.cpp: $(TESTS)
|
||||
$(TESTGEN) -o $@ --runner=StdioPrinter $(TESTS)
|
||||
|
||||
file_printer.cpp: file_printer.tpl $(TESTS)
|
||||
$(TESTGEN) -o $@ --template=file_printer.tpl $(TESTS)
|
||||
|
||||
aborter.cpp: aborter.tpl $(TESTS)
|
||||
$(TESTGEN) -o $@ --template=aborter.tpl $(TESTS)
|
||||
|
||||
only.cpp: only.tpl $(TESTS)
|
||||
$(TESTGEN) -o $@ --template=only.tpl $(TESTS)
|
||||
|
||||
tests.cpp: $(TESTS)
|
||||
$(TESTGEN) -o $@ $(TESTS)
|
||||
|
||||
x11_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o $@ --gui=X11Gui $(GUI_TESTS)
|
||||
|
||||
qt_runner.cpp: $(GUI_TESTS)
|
||||
$(TESTGEN) -o $@ --gui=QtGui $(GUI_TESTS)
|
||||
|
||||
%: %.cpp
|
||||
$(CXXC) -o $@ $<
|
||||
|
||||
yes_no_runner: yes_no_runner.cpp tests.cpp
|
||||
$(CXXC) -o $@ $^
|
||||
|
||||
x11_runner: x11_runner.cpp
|
||||
$(CXXC) -o $@ $^ $(X11_FLAGS)
|
||||
|
||||
qt_runner: qt_runner.cpp
|
||||
$(CXXC) -o $@ $^ $(QT_FLAGS)
|
||||
|
||||
#
|
||||
# Local Variables:
|
||||
# compile-command: "make -fMakefile.unix"
|
||||
# End:
|
||||
#
|
30
test/cxxtest/sample/MessageTest.h
Normal file
30
test/cxxtest/sample/MessageTest.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef __MESSAGETEST_H
|
||||
#define __MESSAGETEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
//
|
||||
// The [E]TSM_ macros can be used to print a specified message
|
||||
// instead of the default one.
|
||||
// This is useful when you refactor your tests, as shown below
|
||||
//
|
||||
|
||||
class MessageTest : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void testValues()
|
||||
{
|
||||
checkValue( 0, "My hovercraft" );
|
||||
checkValue( 1, "is full" );
|
||||
checkValue( 2, "of eels" );
|
||||
}
|
||||
|
||||
void checkValue( unsigned value, const char *message )
|
||||
{
|
||||
TSM_ASSERT( message, value != 0 );
|
||||
TSM_ASSERT_EQUALS( message, value, value * value );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __MESSAGETEST_H
|
59
test/cxxtest/sample/SimpleTest.h
Normal file
59
test/cxxtest/sample/SimpleTest.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
#ifndef __SIMPLETEST_H
|
||||
#define __SIMPLETEST_H
|
||||
|
||||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
//
|
||||
// A simple test suite: Just inherit CxxTest::TestSuite and write tests!
|
||||
//
|
||||
|
||||
class SimpleTest : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void testEquality()
|
||||
{
|
||||
TS_ASSERT_EQUALS( 1, 1 );
|
||||
TS_ASSERT_EQUALS( 1, 2 );
|
||||
TS_ASSERT_EQUALS( 'a', 'A' );
|
||||
TS_ASSERT_EQUALS( 1.0, -12345678900000000000000000000000000000000000000000.1234 );
|
||||
}
|
||||
|
||||
void testAddition()
|
||||
{
|
||||
TS_ASSERT_EQUALS( 1 + 1, 2 );
|
||||
TS_ASSERT_EQUALS( 2 + 2, 5 );
|
||||
}
|
||||
|
||||
void TestMultiplication()
|
||||
{
|
||||
TS_ASSERT_EQUALS( 2 * 2, 4 );
|
||||
TS_ASSERT_EQUALS( 4 * 4, 44 );
|
||||
TS_ASSERT_DIFFERS( -2 * -2, 4 );
|
||||
}
|
||||
|
||||
void testComparison()
|
||||
{
|
||||
TS_ASSERT_LESS_THAN( (int)1, (unsigned long)2 );
|
||||
TS_ASSERT_LESS_THAN( -1, -2 );
|
||||
}
|
||||
|
||||
void testTheWorldIsCrazy()
|
||||
{
|
||||
TS_ASSERT_EQUALS( true, false );
|
||||
}
|
||||
|
||||
void test_Failure()
|
||||
{
|
||||
TS_FAIL( "Not implemented" );
|
||||
TS_FAIL( 1569779912 );
|
||||
}
|
||||
|
||||
void test_TS_WARN_macro()
|
||||
{
|
||||
TS_WARN( "Just a friendly warning" );
|
||||
TS_WARN( "Warnings don't abort the test" );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __SIMPLETEST_H
|
69
test/cxxtest/sample/TraitsTest.h
Normal file
69
test/cxxtest/sample/TraitsTest.h
Normal file
|
@ -0,0 +1,69 @@
|
|||
#ifndef __TRAITSTEST_H
|
||||
#define __TRAITSTEST_H
|
||||
|
||||
//
|
||||
// This example shows how to use TS_ASSERT_EQUALS for your own classes
|
||||
//
|
||||
#include <cxxtest/TestSuite.h>
|
||||
#include <cxxtest/ValueTraits.h>
|
||||
|
||||
//
|
||||
// Define your class with operator==
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
class Pet
|
||||
{
|
||||
char _name[128];
|
||||
public:
|
||||
Pet( const char *petName ) { strcpy( _name, petName ); }
|
||||
|
||||
const char *name() const { return _name; }
|
||||
|
||||
bool operator== ( const Pet &other ) const
|
||||
{
|
||||
return !strcmp( name(), other.name() );
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Instantiate CxxTest::ValueTraits<*your class*>
|
||||
// Note: Most compilers do not require that you define both
|
||||
// ValueTraits<const T> and ValueTraits<T>, but some do.
|
||||
//
|
||||
namespace CxxTest
|
||||
{
|
||||
CXXTEST_TEMPLATE_INSTANTIATION
|
||||
class ValueTraits<const Pet>
|
||||
{
|
||||
char _asString[256];
|
||||
|
||||
public:
|
||||
ValueTraits( const Pet &pet ) { sprintf( _asString, "Pet(\"%s\")", pet.name() ); }
|
||||
const char *asString() const { return _asString; }
|
||||
};
|
||||
|
||||
CXXTEST_COPY_CONST_TRAITS( Pet );
|
||||
}
|
||||
|
||||
//
|
||||
// Here's how it works
|
||||
//
|
||||
class TestFunky : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void testPets()
|
||||
{
|
||||
Pet pet1("dog"), pet2("cat");
|
||||
TS_ASSERT_EQUALS( pet1, pet2 );
|
||||
Pet cat("cat"), gato("cat");
|
||||
TS_ASSERT_DIFFERS( cat, gato );
|
||||
#ifdef _CXXTEST_HAVE_STD
|
||||
typedef CXXTEST_STD(string) String;
|
||||
TS_ASSERT_EQUALS( String("Hello"), String("World!") );
|
||||
#endif // _CXXTEST_HAVE_STD
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __TRAITSTEST_H
|
16
test/cxxtest/sample/aborter.tpl
Normal file
16
test/cxxtest/sample/aborter.tpl
Normal file
|
@ -0,0 +1,16 @@
|
|||
// -*- C++ -*-
|
||||
// This template file demonstrates the use of CXXTEST_ABORT_TEST_ON_FAIL
|
||||
//
|
||||
|
||||
#define CXXTEST_HAVE_STD
|
||||
#define CXXTEST_ABORT_TEST_ON_FAIL
|
||||
#include <cxxtest/ErrorPrinter.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
return CxxTest::ErrorPrinter().run();
|
||||
}
|
||||
|
||||
// The CxxTest "world"
|
||||
<CxxTest world>
|
||||
|
22
test/cxxtest/sample/file_printer.tpl
Normal file
22
test/cxxtest/sample/file_printer.tpl
Normal file
|
@ -0,0 +1,22 @@
|
|||
// -*- C++ -*-
|
||||
// This is a sample of a custom test runner
|
||||
// using CxxTest template files.
|
||||
// This prints the output to a file given on the command line.
|
||||
//
|
||||
|
||||
#include <cxxtest/StdioPrinter.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
if ( argc != 2 ) {
|
||||
fprintf( stderr, "Usage: %s <output file name>\n", argv[0] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
return CxxTest::StdioPrinter( fopen( argv[1], "w" ) ).run();
|
||||
}
|
||||
|
||||
// The CxxTest "world"
|
||||
<CxxTest world>
|
||||
|
57
test/cxxtest/sample/gui/GreenYellowRed.h
Normal file
57
test/cxxtest/sample/gui/GreenYellowRed.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <cxxtest/TestSuite.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
# define CXXTEST_SAMPLE_GUI_WAIT() Sleep( 1000 )
|
||||
#else // !_WIN32
|
||||
extern "C" unsigned sleep( unsigned seconds );
|
||||
# define CXXTEST_SAMPLE_GUI_WAIT() sleep( 1 )
|
||||
#endif // _WIN32
|
||||
|
||||
class GreenYellowRed : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
void wait()
|
||||
{
|
||||
CXXTEST_SAMPLE_GUI_WAIT();
|
||||
}
|
||||
|
||||
void test_Start_green()
|
||||
{
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Green_again()
|
||||
{
|
||||
TS_TRACE( "Still green" );
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Now_yellow()
|
||||
{
|
||||
TS_WARN( "Yellow" );
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Cannot_go_back()
|
||||
{
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Finally_red()
|
||||
{
|
||||
TS_FAIL( "Red" );
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Cannot_go_back_to_yellow()
|
||||
{
|
||||
TS_WARN( "Yellow?" );
|
||||
wait();
|
||||
}
|
||||
|
||||
void test_Cannot_go_back_to_green()
|
||||
{
|
||||
wait();
|
||||
}
|
||||
};
|
14
test/cxxtest/sample/mock/Dice.cpp
Normal file
14
test/cxxtest/sample/mock/Dice.cpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <T/stdlib.h>
|
||||
#include "Dice.h"
|
||||
|
||||
Dice::Dice()
|
||||
{
|
||||
T::srand( T::time( 0 ) );
|
||||
}
|
||||
|
||||
unsigned Dice::roll()
|
||||
{
|
||||
return (T::rand() % 6) + 1;
|
||||
}
|
||||
|
||||
|
13
test/cxxtest/sample/mock/Dice.h
Normal file
13
test/cxxtest/sample/mock/Dice.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef __DICE_H
|
||||
#define __DICE_H
|
||||
|
||||
class Dice
|
||||
{
|
||||
public:
|
||||
Dice();
|
||||
|
||||
unsigned roll();
|
||||
};
|
||||
|
||||
#endif // __DICE_H
|
||||
|
22
test/cxxtest/sample/mock/Makefile
Normal file
22
test/cxxtest/sample/mock/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
all: roll run
|
||||
|
||||
clean:
|
||||
rm -f *~ *.o roll test test.cpp
|
||||
|
||||
CXXTEST = ../..
|
||||
CCFLAGS = -I. -I$(CXXTEST)
|
||||
|
||||
roll: roll.o Dice.o real_stdlib.o
|
||||
g++ -o $@ $^
|
||||
|
||||
run: test
|
||||
./test
|
||||
|
||||
test: test.o Dice.o mock_stdlib.o
|
||||
g++ -o $@ $^
|
||||
|
||||
.cpp.o:
|
||||
g++ -c -o $@ $(CCFLAGS) $<
|
||||
|
||||
test.cpp: TestDice.h
|
||||
$(CXXTEST)/cxxtestgen.pl -o $@ --error-printer $<
|
31
test/cxxtest/sample/mock/MockStdlib.h
Normal file
31
test/cxxtest/sample/mock/MockStdlib.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include <T/stdlib.h>
|
||||
|
||||
class MockStdlib :
|
||||
public T::Base_srand,
|
||||
public T::Base_rand,
|
||||
public T::Base_time
|
||||
{
|
||||
public:
|
||||
unsigned lastSeed;
|
||||
|
||||
void srand( unsigned seed )
|
||||
{
|
||||
lastSeed = seed;
|
||||
}
|
||||
|
||||
int nextRand;
|
||||
|
||||
int rand()
|
||||
{
|
||||
return nextRand;
|
||||
}
|
||||
|
||||
time_t nextTime;
|
||||
|
||||
time_t time( time_t *t )
|
||||
{
|
||||
if ( t )
|
||||
*t = nextTime;
|
||||
return nextTime;
|
||||
}
|
||||
};
|
13
test/cxxtest/sample/mock/T/stdlib.h
Normal file
13
test/cxxtest/sample/mock/T/stdlib.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef __T__STDLIB_H
|
||||
#define __T__STDLIB_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <cxxtest/Mock.h>
|
||||
|
||||
CXXTEST_MOCK_VOID_GLOBAL( srand, ( unsigned seed ), ( seed ) );
|
||||
CXXTEST_MOCK_GLOBAL( int, rand, ( void ), () );
|
||||
CXXTEST_MOCK_GLOBAL( time_t, time, ( time_t *t ), ( t ) );
|
||||
|
||||
#endif // __T__STDLIB_H
|
62
test/cxxtest/sample/mock/TestDice.h
Normal file
62
test/cxxtest/sample/mock/TestDice.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include <cxxtest/TestSuite.h>
|
||||
#include "Dice.h"
|
||||
#include "MockStdlib.h"
|
||||
|
||||
class TestDice : public CxxTest::TestSuite
|
||||
{
|
||||
public:
|
||||
MockStdlib *stdlib;
|
||||
|
||||
void setUp()
|
||||
{
|
||||
TS_ASSERT( stdlib = new MockStdlib );
|
||||
}
|
||||
|
||||
void tearDown()
|
||||
{
|
||||
delete stdlib;
|
||||
}
|
||||
|
||||
void test_Randomize_uses_time()
|
||||
{
|
||||
stdlib->nextTime = 12345;
|
||||
Dice dice;
|
||||
TS_ASSERT_EQUALS( stdlib->lastSeed, 12345 );
|
||||
}
|
||||
|
||||
void test_Roll()
|
||||
{
|
||||
Dice dice;
|
||||
|
||||
stdlib->nextRand = 0;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 1 );
|
||||
|
||||
stdlib->nextRand = 2;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 3 );
|
||||
|
||||
stdlib->nextRand = 5;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 6 );
|
||||
|
||||
stdlib->nextRand = 7;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 2 );
|
||||
}
|
||||
|
||||
void test_Temporary_override_of_one_mock_function()
|
||||
{
|
||||
Dice dice;
|
||||
|
||||
stdlib->nextRand = 2;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 3 );
|
||||
|
||||
class Five : public T::Base_rand { int rand() { return 5; } };
|
||||
|
||||
Five *five = new Five;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 6 );
|
||||
TS_ASSERT_EQUALS( dice.roll(), 6 );
|
||||
TS_ASSERT_EQUALS( dice.roll(), 6 );
|
||||
delete five;
|
||||
|
||||
stdlib->nextRand = 1;
|
||||
TS_ASSERT_EQUALS( dice.roll(), 2 );
|
||||
}
|
||||
};
|
2
test/cxxtest/sample/mock/mock_stdlib.cpp
Normal file
2
test/cxxtest/sample/mock/mock_stdlib.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
#define CXXTEST_MOCK_TEST_SOURCE_FILE
|
||||
#include <T/stdlib.h>
|
2
test/cxxtest/sample/mock/real_stdlib.cpp
Normal file
2
test/cxxtest/sample/mock/real_stdlib.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
#define CXXTEST_MOCK_REAL_SOURCE_FILE
|
||||
#include <T/stdlib.h>
|
11
test/cxxtest/sample/mock/roll.cpp
Normal file
11
test/cxxtest/sample/mock/roll.cpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
#include <stdio.h>
|
||||
#include "Dice.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
Dice dice;
|
||||
printf( "First roll: %u\n", dice.roll() );
|
||||
printf( "Second roll: %u\n", dice.roll() );
|
||||
|
||||
return 0;
|
||||
}
|
93
test/cxxtest/sample/msvc/CxxTest_1_Run.dsp
Normal file
93
test/cxxtest/sample/msvc/CxxTest_1_Run.dsp
Normal file
|
@ -0,0 +1,93 @@
|
|||
# Microsoft Developer Studio Project File - Name="CxxTest_1_Run" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) External Target" 0x0106
|
||||
|
||||
CFG=CxxTest_1_Run - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_1_Run.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_1_Run.mak" CFG="CxxTest_1_Run - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "CxxTest_1_Run - Win32 Release" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "CxxTest_1_Run - Win32 Debug" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_1_Run - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Cmd_Line "NMAKE /f CxxTest_1_Run.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "CxxTest_1_Run.exe"
|
||||
# PROP BASE Bsc_Name "CxxTest_1_Run.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Cmd_Line "nmake DIR=Release run"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "Release\run.log"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_1_Run - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Cmd_Line "NMAKE /f CxxTest_1_Run.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "CxxTest_1_Run.exe"
|
||||
# PROP BASE Bsc_Name "CxxTest_1_Run.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Cmd_Line "nmake DIR=Debug run"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "Debug\run.log"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "CxxTest_1_Run - Win32 Release"
|
||||
# Name "CxxTest_1_Run - Win32 Debug"
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_1_Run - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_1_Run - Win32 Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Makefile
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ReadMe.txt
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
94
test/cxxtest/sample/msvc/CxxTest_2_Build.dsp
Normal file
94
test/cxxtest/sample/msvc/CxxTest_2_Build.dsp
Normal file
|
@ -0,0 +1,94 @@
|
|||
# Microsoft Developer Studio Project File - Name="CxxTest_2_Build" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=CxxTest_2_Build - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_2_Build.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_2_Build.mak" CFG="CxxTest_2_Build - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "CxxTest_2_Build - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "CxxTest_2_Build - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_2_Build - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/runner.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_2_Build - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/runner.exe" /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "CxxTest_2_Build - Win32 Release"
|
||||
# Name "CxxTest_2_Build - Win32 Debug"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ReadMe.txt
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\runner.cpp
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
93
test/cxxtest/sample/msvc/CxxTest_3_Generate.dsp
Normal file
93
test/cxxtest/sample/msvc/CxxTest_3_Generate.dsp
Normal file
|
@ -0,0 +1,93 @@
|
|||
# Microsoft Developer Studio Project File - Name="CxxTest_3_Generate" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) External Target" 0x0106
|
||||
|
||||
CFG=CxxTest_3_Generate - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_3_Generate.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_3_Generate.mak" CFG="CxxTest_3_Generate - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "CxxTest_3_Generate - Win32 Release" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "CxxTest_3_Generate - Win32 Debug" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_3_Generate - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Cmd_Line "NMAKE /f CxxTest_3_Generate.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "CxxTest_3_Generate.exe"
|
||||
# PROP BASE Bsc_Name "CxxTest_3_Generate.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Cmd_Line "nmake runner.cpp"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "runner.cpp"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_3_Generate - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Cmd_Line "NMAKE /f CxxTest_3_Generate.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "CxxTest_3_Generate.exe"
|
||||
# PROP BASE Bsc_Name "CxxTest_3_Generate.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Cmd_Line "nmake runner.cpp"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "runner.cpp"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "CxxTest_3_Generate - Win32 Release"
|
||||
# Name "CxxTest_3_Generate - Win32 Debug"
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_3_Generate - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_3_Generate - Win32 Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Makefile
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ReadMe.txt
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
59
test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
Normal file
59
test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
Normal file
|
@ -0,0 +1,59 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "CxxTest_1_Run"=.\CxxTest_1_Run.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name CxxTest_2_Build
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "CxxTest_2_Build"=.\CxxTest_2_Build.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name CxxTest_3_Generate
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "CxxTest_3_Generate"=.\CxxTest_3_Generate.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
212
test/cxxtest/sample/msvc/FixFiles.bat
Normal file
212
test/cxxtest/sample/msvc/FixFiles.bat
Normal file
|
@ -0,0 +1,212 @@
|
|||
@rem = '--*-Perl-*--
|
||||
@echo off
|
||||
if "%OS%" == "Windows_NT" goto WinNT
|
||||
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
goto endofperl
|
||||
:WinNT
|
||||
perl -x -S %0 %*
|
||||
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
|
||||
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
|
||||
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
|
||||
goto endofperl
|
||||
@rem ';
|
||||
#!/usr/bin/perl -w
|
||||
#line 15
|
||||
use strict;
|
||||
use English;
|
||||
use Getopt::Long;
|
||||
|
||||
$OUTPUT_AUTOFLUSH = 1;
|
||||
|
||||
sub usage() {
|
||||
print STDERR "Usage: $0 <OPTIONS>\n\n";
|
||||
print STDERR "Fix Makefile and CxxTest_2_Build.dsp for your setup.\n\n";
|
||||
print STDERR " --cxxtest=DIR Assume CxxTest is installed in DIR (default: '..\\..')\n";
|
||||
print STDERR " --tests=SPEC Use SPEC for the test files (default: '../gui/*.h ../*.h')\n\n";
|
||||
print STDERR "You must specify at least one option.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
my ($cxxtest, $tests);
|
||||
my ($Makefile, $CxxTest_2_Build);
|
||||
|
||||
sub main {
|
||||
parseCommandline();
|
||||
fixFiles();
|
||||
}
|
||||
|
||||
sub parseCommandline() {
|
||||
GetOptions( 'cxxtest=s' => \$cxxtest,
|
||||
'tests=s' => \$tests,
|
||||
) or usage();
|
||||
|
||||
usage() unless (defined($cxxtest) || defined($tests));
|
||||
$cxxtest = '..\\..' unless defined($cxxtest);
|
||||
$tests = '../gui/*.h ../*.h' unless defined($tests);
|
||||
}
|
||||
|
||||
sub fixFiles() {
|
||||
fixFile( $Makefile, 'Makefile' );
|
||||
fixFile( $CxxTest_2_Build, 'CxxTest_2_Build.dsp' );
|
||||
}
|
||||
|
||||
sub fixFile($$) {
|
||||
my ($data, $output) = @_;
|
||||
|
||||
print "$output...";
|
||||
|
||||
$data =~ s/<TESTS>/$tests/g;
|
||||
$data =~ s/<CXXTEST>/$cxxtest/g;
|
||||
|
||||
open OUTPUT, ">$output" or die "Cannot create output file \"$output\"\n";
|
||||
print OUTPUT $data;
|
||||
close OUTPUT;
|
||||
|
||||
print "OK\n";
|
||||
}
|
||||
|
||||
$Makefile =
|
||||
'# Where to look for the tests
|
||||
TESTS = <TESTS>
|
||||
|
||||
# Where the CxxTest distribution is unpacked
|
||||
CXXTESTDIR = <CXXTEST>
|
||||
|
||||
# Check CXXTESTDIR
|
||||
!if !exist($(CXXTESTDIR)\cxxtestgen.pl)
|
||||
!error Please fix CXXTESTDIR
|
||||
!endif
|
||||
|
||||
# cxxtestgen needs Perl or Python
|
||||
!if defined(PERL)
|
||||
CXXTESTGEN = $(PERL) $(CXXTESTDIR)/cxxtestgen.pl
|
||||
!elseif defined(PYTHON)
|
||||
CXXTESTGEN = $(PYTHON) $(CXXTESTDIR)/cxxtestgen.py
|
||||
!else
|
||||
!error You must define PERL or PYTHON
|
||||
!endif
|
||||
|
||||
# The arguments to pass to cxxtestgen
|
||||
# - ParenPrinter is the way MSVC likes its compilation errors
|
||||
# - --have-eh/--abort-on-fail are nice when you have them
|
||||
CXXTESTGEN_FLAGS = --gui=Win32Gui --runner=ParenPrinter --have-eh --abort-on-fail
|
||||
|
||||
# How to generate the test runner, "runner.cpp"
|
||||
runner.cpp: $(TESTS)
|
||||
$(CXXTESTGEN) $(CXXTESTGEN_FLAGS) -o $@ $(TESTS)
|
||||
|
||||
# Command-line arguments to the runner
|
||||
RUNNER_FLAGS = -title "CxxTest Runner"
|
||||
|
||||
# How to run the tests, which should be in DIR\runner.exe
|
||||
run: $(DIR)\runner.exe
|
||||
$(DIR)\runner.exe $(RUNNER_FLAGS)
|
||||
';
|
||||
|
||||
$CxxTest_2_Build =
|
||||
'# Microsoft Developer Studio Project File - Name="CxxTest_2_Build" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=CxxTest_2_Build - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_2_Build.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CxxTest_2_Build.mak" CFG="CxxTest_2_Build - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "CxxTest_2_Build - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "CxxTest_2_Build - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "CxxTest_2_Build - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /I "<CXXTEST>" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/runner.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "CxxTest_2_Build - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "<CXXTEST>" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/runner.exe" /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "CxxTest_2_Build - Win32 Release"
|
||||
# Name "CxxTest_2_Build - Win32 Debug"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ReadMe.txt
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\runner.cpp
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
||||
';
|
||||
|
||||
main();
|
||||
|
||||
__END__
|
||||
:endofperl
|
||||
|
||||
rem
|
||||
rem Local Variables:
|
||||
rem compile-command: "perl FixFiles.bat"
|
||||
rem End:
|
||||
rem
|
36
test/cxxtest/sample/msvc/Makefile
Normal file
36
test/cxxtest/sample/msvc/Makefile
Normal file
|
@ -0,0 +1,36 @@
|
|||
# Where to look for the tests
|
||||
TESTS = ..\gui\*.h ..\*.h
|
||||
|
||||
# Where the CxxTest distribution is unpacked
|
||||
CXXTESTDIR = ..\..
|
||||
|
||||
# Check CXXTESTDIR
|
||||
!if !exist($(CXXTESTDIR)\cxxtestgen.pl)
|
||||
!error Please fix CXXTESTDIR
|
||||
!endif
|
||||
|
||||
# cxxtestgen needs Perl or Python
|
||||
!if defined(PERL)
|
||||
CXXTESTGEN = $(PERL) $(CXXTESTDIR)/cxxtestgen.pl
|
||||
!elseif defined(PYTHON)
|
||||
CXXTESTGEN = $(PYTHON) $(CXXTESTDIR)/cxxtestgen.py
|
||||
!else
|
||||
!error You must define PERL or PYTHON
|
||||
!endif
|
||||
|
||||
# The arguments to pass to cxxtestgen
|
||||
# - ParenPrinter is the way MSVC likes its compilation errors
|
||||
# - --have-eh/--abort-on-fail are nice when you have them
|
||||
CXXTESTGEN_FLAGS = \
|
||||
--gui=Win32Gui \
|
||||
--runner=ParenPrinter \
|
||||
--have-eh \
|
||||
--abort-on-fail
|
||||
|
||||
# How to generate the test runner, `runner.cpp'
|
||||
runner.cpp: $(TESTS)
|
||||
$(CXXTESTGEN) $(CXXTESTGEN_FLAGS) -o $@ $(TESTS)
|
||||
|
||||
# How to run the tests, which should be in DIR\runner.exe
|
||||
run: $(DIR)\runner.exe
|
||||
$(DIR)\runner.exe
|
30
test/cxxtest/sample/msvc/ReadMe.txt
Normal file
30
test/cxxtest/sample/msvc/ReadMe.txt
Normal file
|
@ -0,0 +1,30 @@
|
|||
Sample files for Visual Studio
|
||||
==============================
|
||||
|
||||
There are three projects in this workspace:
|
||||
|
||||
- CxxTest_3_Generate runs cxxtestgen to create runner.cpp
|
||||
- CxxTest_2_Build compiles the generated file
|
||||
- CxxTest_1_Run runs the compiled binary
|
||||
|
||||
Whenever you build this workspace, the tests are run, and any failed assertions
|
||||
are displayed as compilation errors (you can browse them using F4).
|
||||
|
||||
Note that to run this sample, you need first to create an environment
|
||||
variable PERL or PYTHON, e.g. PERL=c:\perl\bin\perl.exe
|
||||
|
||||
|
||||
To use these .dsp and .dsw files in your own project, run FixFiles.bat
|
||||
to adjust them to where you've placed CxxTest and your own tests.
|
||||
|
||||
If you want to use just the .dsp files in your own workspace, don't
|
||||
forget to:
|
||||
|
||||
- Set up the dependencies (CxxTest_3_Generate depends on
|
||||
CxxTest_2_Build which depends on CxxTest_1_Run)
|
||||
|
||||
- Add your own include paths, libraries etc. to the CxxTest_2_Build project
|
||||
|
||||
|
||||
NOTE: I haven't used "Post-Build Step" to run the tests because I
|
||||
wanted the tests to be executed even if nothing has changed.
|
33
test/cxxtest/sample/only.tpl
Normal file
33
test/cxxtest/sample/only.tpl
Normal file
|
@ -0,0 +1,33 @@
|
|||
// -*- C++ -*-
|
||||
#include <cxxtest/StdioPrinter.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
if ( argc < 2 || argc > 3 ) {
|
||||
fprintf( stderr, "Usage: only <suite name> [<test name>]\n\n" );
|
||||
fprintf( stderr, "Available tests:\n" );
|
||||
CxxTest::RealWorldDescription wd;
|
||||
for ( CxxTest::SuiteDescription *sd = wd.firstSuite(); sd; sd = sd->next() )
|
||||
for ( CxxTest::TestDescription *td = sd->firstTest(); td; td = td->next() )
|
||||
fprintf( stderr, " - %s::%s()\n", sd->suiteName(), td->testName() );
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char *suiteName = argv[1];
|
||||
const char *testName = (argc > 2) ? argv[2] : 0;
|
||||
if ( !CxxTest::leaveOnly( suiteName, testName ) ) {
|
||||
if ( testName )
|
||||
fprintf( stderr, "Cannot find %s::%s()\n", argv[1], argv[2] );
|
||||
else
|
||||
fprintf( stderr, "Cannot find class %s\n", argv[1] );
|
||||
return 2;
|
||||
}
|
||||
|
||||
return CxxTest::StdioPrinter().run();
|
||||
}
|
||||
|
||||
|
||||
// The CxxTest "world"
|
||||
<CxxTest world>
|
||||
|
39
test/cxxtest/sample/parts/Makefile.unix
Normal file
39
test/cxxtest/sample/parts/Makefile.unix
Normal file
|
@ -0,0 +1,39 @@
|
|||
#
|
||||
# (GNU) Makefile for UN*X-like systems
|
||||
# This makefile shows how to make a different runner for each test
|
||||
#
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: run
|
||||
|
||||
clean:
|
||||
rm -f *~ *.cpp *.o runner
|
||||
|
||||
CXXTESTDIR = ../..
|
||||
CXXTESTGEN = $(CXXTESTDIR)/cxxtestgen.pl
|
||||
CXXTESTFLAGS = --have-eh --abort-on-fail
|
||||
|
||||
TESTS = $(wildcard ../*Test.h)
|
||||
OBJS = runner.o $(TESTS:../%.h=%.o)
|
||||
|
||||
run: runner
|
||||
./runner
|
||||
|
||||
runner: $(OBJS)
|
||||
c++ -o $@ $^
|
||||
|
||||
%.o: %.cpp
|
||||
c++ -c -o $@ -I $(CXXTESTDIR) -I .. $^
|
||||
|
||||
%.cpp: ../%.h
|
||||
$(CXXTESTGEN) $(CXXTESTFLAGS) --part -o $@ $^
|
||||
|
||||
runner.cpp:
|
||||
$(CXXTESTGEN) $(CXXTESTFLAGS) --root --error-printer -o $@
|
||||
|
||||
#
|
||||
# Local Variables:
|
||||
# compile-command: "make -fMakefile.unix"
|
||||
# End:
|
||||
#
|
2
test/cxxtest/sample/winddk/Makefile
Normal file
2
test/cxxtest/sample/winddk/Makefile
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Standard DDK Makefile
|
||||
!include $(NTMAKEENV)\makefile.def
|
15
test/cxxtest/sample/winddk/Makefile.inc
Normal file
15
test/cxxtest/sample/winddk/Makefile.inc
Normal file
|
@ -0,0 +1,15 @@
|
|||
# -*- Makefile -*-
|
||||
|
||||
#
|
||||
# Tell the DDK how to generate RunTests.cpp from RunTests.tpl and the tests
|
||||
#
|
||||
|
||||
PERL=perl
|
||||
PYTHON=python
|
||||
CXXTESTGEN=$(PERL) $(CXXTESTDIR)/cxxtestgen.pl
|
||||
#CXXTESTGEN=$(PYTHON) $(CXXTESTDIR)/cxxtestgen.py
|
||||
|
||||
TEST_SUITES=$(SUITESDIR)/*.h
|
||||
|
||||
RunTests.cpp: RunTests.tpl $(TEST_SUITES)
|
||||
$(CXXTESTGEN) -o $@ --template=RunTests.tpl $(TEST_SUITES)
|
13
test/cxxtest/sample/winddk/RunTests.tpl
Normal file
13
test/cxxtest/sample/winddk/RunTests.tpl
Normal file
|
@ -0,0 +1,13 @@
|
|||
// -*- C++ -*-
|
||||
|
||||
//
|
||||
// The DDK doesn't handle <iostream> too well
|
||||
//
|
||||
#include <cxxtest/StdioPrinter.h>
|
||||
|
||||
int __cdecl main()
|
||||
{
|
||||
return CxxTest::StdioPrinter().run();
|
||||
}
|
||||
|
||||
<CxxTest world>
|
46
test/cxxtest/sample/winddk/SOURCES
Normal file
46
test/cxxtest/sample/winddk/SOURCES
Normal file
|
@ -0,0 +1,46 @@
|
|||
# -*- Makefile -*-
|
||||
|
||||
#
|
||||
# Build this sample with the Windows DDK (XP or later)
|
||||
#
|
||||
SUITESDIR=..
|
||||
CXXTESTDIR=../..
|
||||
|
||||
#
|
||||
# Build a user-mode application
|
||||
#
|
||||
TARGETNAME=RunTests
|
||||
TARGETPATH=.
|
||||
TARGETTYPE=PROGRAM
|
||||
|
||||
#
|
||||
# Make it a console-mode app
|
||||
#
|
||||
UMTYPE=console
|
||||
|
||||
#
|
||||
# Add CxxTest and tests directory to include path
|
||||
#
|
||||
INCLUDES=$(SUITESDIR);$(CXXTESTDIR)
|
||||
|
||||
#
|
||||
# Enable exception handling and standard library
|
||||
#
|
||||
USE_NATIVE_EH=1
|
||||
LINKER_FLAGS=$(LINKER_FLAGS) -IGNORE:4099
|
||||
386_WARNING_LEVEL=-W3 -WX -wd4290
|
||||
|
||||
TARGETLIBS=\
|
||||
$(CRT_LIB_PATH)\libcp.lib \
|
||||
$(CRT_LIB_PATH)\libc.lib
|
||||
|
||||
#
|
||||
# Only one source file -- the generated test runner
|
||||
#
|
||||
SOURCES=RunTests.cpp
|
||||
|
||||
#
|
||||
# This line tells the build utility to process Makefile.inc
|
||||
#
|
||||
NTTARGETFILE0=RunTests.cpp
|
||||
|
11
test/cxxtest/sample/yes_no_runner.cpp
Normal file
11
test/cxxtest/sample/yes_no_runner.cpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
//
|
||||
// A sample program that uses class YesNoRunner to run all the tests
|
||||
// and find out if all pass.
|
||||
//
|
||||
|
||||
#include <cxxtest/YesNoRunner.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
return CxxTest::YesNoRunner().run();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue