--- /dev/null
+# Doxyfile 1.7.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "Project Template"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = v0.1a
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "A C++ Project Template"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = docs/doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page. This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = source
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.d \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.py \
+ *.f90 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [0,1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+# Note that a value of 0 will completely suppress the enum values from
+# appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will write a font called Helvetica to the output
+# directory and reference it in all dot files that doxygen generates.
+# When you want a differently looking font you can specify the font name
+# using DOT_FONTNAME. You need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = YES
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, svg, gif or svg.
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
--- /dev/null
+
+Copyright (c) 2012, Michael D. Lowis<br>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+DL Parser
+==============================================
+Version: 0.1a
+Created By: Michael D. Lowis
+Email: <mike@mdlowis.com>
+
+About This Project
+----------------------------------------------
+
+
+License
+----------------------------------------------
+
+
+Requirements
+----------------------------------------------
+
+* Some application (version info)
+* Some library (version info)
+
+Installation
+----------------------------------------------
+
+
+Project Files and Directories
+----------------------------------------------
+
+
+Know Issues or Bugs
+----------------------------------------------
+
+* Generic Issue #1
+* Generic Issue #2
+* Generic Issue #3
+
+Version History
+----------------------------------------------
+
+
+Feature Wish List
+----------------------------------------------
+
+This is a list of features are not yet supported but may be at some point in
+the future.
+
+* Generic feature description #1
+* Generic feature description #2
+* Generic feature description #3
+
+More Info
+----------------------------------------------
+
+
+++ /dev/null
-Overview
--------------------------------------------------------------------------------
-Cork is a compiled in memory leak detector for C++. It provides overloaded new
-and delete operators that track when and where objects are allocated and
-deallocated.
-
--- /dev/null
+cscope 15 C:\Src\Personal\libraries\cork" 0000250749
+ @source/cork.cpp
+
+1 \ 2
+ ~"cÜk.h
+"
+
+4 #undeà
+m®loc
+
+
+5 #undeà
+ä\93
+
+
+7 \ 2
+ ~<io¡»am
+>
+
+8 \ 2
+ ~<exû±iÚ
+>
+
+9 \ 2
+ ~<c¡dlib
+>
+
+10 \ 2
+ ~<¡r\9ag.h
+>
+
+13
+us\9ag
+
+Çme¥aû
+
+ g¡d
+;
+
+18 \e\19
+ sBlockTabËEÁry
+
+
+20 \1e*
+ m±r
+;
+
+21 \1d\12
+ msize
+;
+
+22 cڡ \ 5*
+ mf\9ee
+;
+
+23 \12
+ ml\9ae
+;
+
+24 \1e*
+ mÃxt
+;
+
+25 }
+ tBlockTabËEÁry_T
+;
+
+27 \e\19
+ sBlockTabË
+
+
+29 \1d\12
+ msize
+;
+
+30
+BlockTabËEÁry_T
+*
+ mblocks
+[
+TBL_SIZE
+];
+
+31 }
+ tBlockTabË_T
+;
+
+36 \1e
+\9a£¹_»cÜd
+(\1e*
+±r
+,
+BlockTabË_T
+*
+\92\8cy
+);
+
+37 \1e
+\94a£_»cÜd
+(\1e*
+±r
+);
+
+42 \1d\12
+ g®loÿ\8bd
+;
+
+43 \18
+BlockTabË_T
+
+ gBlock_TabË
+ = { 0, {0} };
+
+48 \1e
+ $\9a£¹_»cÜd
+(\1e*
+±r
+,
+BlockTabËEÁry_T
+*
+\92\8cy
+)
+
+50 \1d\12
+\9adex
+ = ((\1d\12)
+±r
+è%
+TBL_SIZE
+;
+
+51
+BlockTabËEÁry_T
+*
+ϡ
+ =
+Block_TabË
+.
+blocks
+[
+\9adex
+ ];
+
+52
+BlockTabËEÁry_T
+*
+cu¼
+ =
+ϡ
+;
+
+54 \1f
+cu¼
+ !ð
+NULL
+)
+
+56 iàÐ
+cu¼
+->
+±r
+ ==\85tr )
+
+58
+cu¼
+->
+size
+ =
+\92\8cy
+->size;
+
+59
+ `ä\93
+(
+\92\8cy
+);
+
+62
+ϡ
+ =
+cu¼
+;
+
+63
+cu¼
+ = (
+BlockTabËEÁry_T
+*)cu¼->
+Ãxt
+;
+
+66 if(
+cu¼
+ =ð
+NULL
+)
+
+68 ià(
+ϡ
+ !ð
+NULL
+)
+
+70
+ϡ
+->
+Ãxt
+ =
+\92\8cy
+;
+
+74
+Block_TabË
+.
+blocks
+[
+\9adex
+] =
+\92\8cy
+;
+
+76
+Block_TabË
+.
+size
+++;
+
+78
+ }
+}
+
+80 \1e
+ $\94a£_»cÜd
+(\1e*
+±r
+)
+
+82 \12
+d\95th
+ = 0;
+
+83 \1d\12
+\9adex
+ = ((\1d\12)
+±r
+è%
+TBL_SIZE
+;
+
+84
+BlockTabËEÁry_T
+*
+ϡ
+ =
+Block_TabË
+.
+blocks
+[
+\9adex
+ ];
+
+85
+BlockTabËEÁry_T
+*
+cu¼
+ =
+ϡ
+;
+
+87 \1f
+cu¼
+ !ð
+NULL
+ )
+
+89
+d\95th
+ = 1;
+
+90 ifÐ
+cu¼
+->
+±r
+ ==\85tr )
+
+92
+d\95th
+ = 2;
+
+93 if(
+ϡ
+ =ð
+cu¼
+)
+
+95
+d\95th
+ = 3;
+
+96
+Block_TabË
+.
+blocks
+[
+\9adex
+ ] = (
+BlockTabËEÁry_T
+*)
+cu¼
+->
+Ãxt
+;
+
+100
+d\95th
+ = 4;
+
+101
+ϡ
+->
+Ãxt
+ =
+cu¼
+->next;
+
+103
+ `ä\93
+(
+cu¼
+);
+
+104
+Block_TabË
+.
+size
+--;
+
+107
+ϡ
+ =
+cu¼
+;
+
+108
+cu¼
+ = (
+BlockTabËEÁry_T
+*)cu¼->
+Ãxt
+;
+
+110
+ }
+}
+
+112 \1e
+ $CÜk_R\95ÜtMemÜyL\97ks
+(\1e)
+
+114 \1d\12
+\9adex
+ = 0;
+
+115
+cout
+ << "-----------------------------------------------------------------" <<
+\92dl
+;
+
+116
+cout
+ << "CÜk: MemÜy AÎoÿtiÚ AÇlysis" <<
+\92dl
+;
+
+117
+cout
+ << "-----------------------------------------------------------------" <<
+\92dl
+;
+
+118
+cout
+ << "You hav\90" <<
+Block_TabË
+.
+size
+ << " Unþaimed objeùs." <<
+\92dl
+;
+
+120 \ f;
+\9adex
+ <
+TBL_SIZE
+; index++)
+
+122
+BlockTabËEÁry_T
+*
+\92\8cy
+ =
+Block_TabË
+.
+blocks
+[
+\9adex
+ ];
+
+123 \1f
+\92\8cy
+ !ð
+NULL
+)
+
+125
+cout
+ << "\t" <<
+\92\8cy
+->
+size
+ << "\t" <<\83Áry->
+±r
+;
+
+126 ifÐ
+\92\8cy
+->
+f\9ee
+ !ð
+NULL
+ )
+
+128
+cout
+ << "\t" <<
+\92\8cy
+->
+l\9ae
+ << "\t" <<\83Áry->
+f\9ee
+;
+
+130
+cout
+ <<
+\92dl
+;
+
+131
+\92\8cy
+ = (
+BlockTabËEÁry_T
+*ëÁry->
+Ãxt
+;
+
+134
+ }
+}
+
+136 \1e*
+Ý\94©Ü
+
+ $Ãw
+ (
+size_t
+
+size
+,
+¡r\9ag
+
+f\9ee
+, \1d\12
+l\9ae
+)
+
+138 \1e*
+±r
+ =
+ `m®loc
+(
+size
+);
+
+139 \ 5*
+âame
+ = (\ 5*)
+ `m®loc
+(
+f\9ee
+.
+ `Ëngth
+());
+
+140 if(
+±r
+ =ð
+NULL
+)
+
+142
+throw
+
+ `bad_®loc
+();
+
+146
+BlockTabËEÁry_T
+*
+\92\8cy
+ = (BlockTabËEÁry_T*)
+ `m®loc
+(\17(BlockTableEntry_T));
+
+147
+ `¡rýy
+Ð
+âame
+,
+f\9ee
+.
+ `c_¡r
+() );
+
+148
+\92\8cy
+->
+±r
+ =\85tr;
+
+149
+\92\8cy
+->
+size
+ = size;
+
+150
+\92\8cy
+->
+f\9ee
+ =
+âame
+;
+
+151
+\92\8cy
+->
+l\9ae
+ =\86ine;
+
+152
+\92\8cy
+->
+Ãxt
+ =
+NULL
+;
+
+153
+ `\9a£¹_»cÜd
+(
+±r
+,
+\92\8cy
+);
+
+155 \15
+±r
+;
+
+156
+ }
+}
+
+158 \1e*
+Ý\94©Ü
+
+ $Ãw
+(
+size_t
+
+size
+è
+ $throw
+(
+bad_®loc
+) {
+
+159 \1e*
+±r
+ =
+ `m®loc
+(
+size
+);
+
+160 if(
+±r
+ =ð
+NULL
+)
+
+162
+throw
+
+ `bad_®loc
+();
+
+166
+BlockTabËEÁry_T
+*
+\92\8cy
+ = (BlockTabËEÁry_T*)
+ `m®loc
+(\17(BlockTableEntry_T));
+
+167
+\92\8cy
+->
+±r
+ =\85tr;
+
+168
+\92\8cy
+->
+size
+ = size;
+
+169
+\92\8cy
+->
+f\9ee
+ =
+NULL
+;
+
+170
+\92\8cy
+->
+l\9ae
+ = 0;
+
+171
+\92\8cy
+->
+Ãxt
+ =
+NULL
+;
+
+172
+ `\9a£¹_»cÜd
+(
+±r
+,
+\92\8cy
+);
+
+174 \15
+±r
+;
+
+175
+ }
+}
+
+177 \1e
+Ý\94©Ü
+
+ $d\96\91e
+(\1e*
+p
+) {
+
+178
+ `ä\93
+(
+p
+);
+
+179
+ `\94a£_»cÜd
+(
+p
+);
+
+180
+ }
+}
+
+ @source/cork.h
+
+1 #iâdeà
+CORK_H
+
+
+2 \ 1
+ #CORK_H
+
+
+ )
+
+4 \ 2
+ ~<¡r\9ag
+>
+
+5 \e\1d\12
+ tsize_t
+;
+
+7 \1e
+CÜk_R\95ÜtMemÜyL\97ks
+(\1e);
+
+8 \1e*
+Ý\94©Ü
+
+Ãw
+ (
+size_t
+
+size
+,
+¡d
+::
+¡r\9ag
+
+f\9ee
+, \1d\12
+l\9ae
+);
+
+10 \ 1
+ #TBL_SIZE
+ 512
+
+ )
+
+11 \ 1
+ #_Ãw
+
+ `Ãw
+ (
+__FILE__
+,
+__LINE__
+)
+
+ )
+
+ @tests/source/main.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cMyTe¡Su\99e2
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+8
+ `TS_ASSERT
+(1 + 1 > 1);
+
+9
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+12 \1e
+ $\8b¡MuÉ\9dliÿtiÚ
+(\1e)
+
+14
+ `TS_TRACE
+("Starting multiplication\81est");
+
+15
+ `TS_ASSERT_EQUALS
+(2 * 2, 5);
+
+16
+ `TS_TRACE
+("Finishing multiplication\81est");
+
+17
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/empty_source_list/requirement.hpp
+
+10
+boÞ
+
+ $ÿÎ_a_»qu\9cem\92t
+() {
+
+11 \15
+\8cue
+;
+
+12
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/empty_source_list/test_bar.t.h
+
+1 #iâdeà
+TEST_BAR_T_H
+
+
+2 \ 1
+ #TEST_BAR_T_H
+
+
+ )
+
+12 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 \ 2
+ ~"»qu\9cem\92t.hµ
+"
+
+15 þas
+ cTe¡B¬
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/empty_source_list/test_foo.t.h
+
+1 #iâdeà
+TEST_FOO_T_H
+
+
+2 \ 1
+ #TEST_FOO_T_H
+
+
+ )
+
+12 \ 2
+ ~"»qu\9cem\92t.hµ
+"
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+15 þas
+ cTe¡Foo
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/globbing/src/requirement.cpp
+
+10 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+12
+boÞ
+
+ $ÿÎ_a_»qu\9cem\92t
+() {
+
+13 \15
+\8cue
+;
+
+14
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/globbing/src/requirement.h
+
+1 #iâdeà
+REQUIREMENT_H
+
+
+2 \ 1
+ #REQUIREMENT_H
+
+
+ )
+
+12
+boÞ
+
+ÿÎ_a_»qu\9cem\92t
+();
+
+ @tools/cxxtest/build_tools/SCons/test/globbing/src/test_bar.t.h
+
+1 #iâdeà
+TEST_BAR_T_H
+
+
+2 \ 1
+ #TEST_BAR_T_H
+
+
+ )
+
+12 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+15 þas
+ cTe¡B¬
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/globbing/src/test_foo.t.h
+
+1 #iâdeà
+TEST_FOO_T_H
+
+
+2 \ 1
+ #TEST_FOO_T_H
+
+
+ )
+
+12 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+15 þas
+ cTe¡Foo
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hello.cc
+
+16 \ 2
+ ~<h\96lo.hh
+>
+
+19
+ gH\96lo
+::
+ $foo
+(\12
+x
+, \12
+y
+)
+
+21 \15
+x
+ +
+y
+;
+
+22
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hello.hh
+
+11 þas
+ cH\96lo
+
+
+13
+ mpublic
+:
+
+14 \12
+foo
+(\12
+x
+, \12
+y
+);
+
+ @tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hellotest.t.h
+
+11 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+12 \ 2
+ ~<h\96lo.hh
+>
+
+15 þas
+ ch\96loTe¡Su\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡Foo
+()
+
+20
+H\96lo
+
+h
+;
+
+21
+ `TS_ASSERT_EQUALS
+ (
+h
+.
+ `foo
+(2,2), 4);
+
+23
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/globbing_edmundo/main.cpp
+
+11 \ 2
+ ~<h\96lo.hh
+>
+
+12 \ 2
+ ~<io¡»am
+>
+
+14 \12
+ $ma\9a
+ (\12
+¬gc
+, \ 5*
+¬gv
+[])
+
+16
+H\96lo
+
+h
+;
+
+17
+¡d
+::
+cout
+ <<
+h
+.
+ `foo
+(2,3è<< std::
+\92dl
+;
+
+18
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/include_CCFLAGS/src/not-with-pedantic.h
+
+11 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 þas
+ cTe¡Pedªtic
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+15
+public
+:
+
+16 \1e
+ $\8b¡PedªticP»£Á
+() {
+
+17
+ `TS_ASSERT
+(
+\8cue
+);
+
+18 \12
+f
+ = (
+\8cue
+)?:5;
+
+20
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/include_CCFLAGS/src/only_with_ansi.t.h
+
+10 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+12 þas
+ cTe¡Ansi
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+14
+public
+:
+
+15 \1e
+ $\8b¡AnsiP»£Á
+() {
+
+16 #ifdeà
+__STRICT_ANSI__
+
+
+17
+ `TS_ASSERT
+(
+\8cue
+);
+
+19
+ `TS_ASSERT
+(
+çl£
+);
+
+22
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/include_CXXFLAGS/src/not-with-pedantic.h
+
+11 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 þas
+ cTe¡Pedªtic
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+15
+public
+:
+
+16 \1e
+ $\8b¡PedªticP»£Á
+() {
+
+17 \12
+f
+ = (
+\8cue
+)?:5;
+
+19
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/multifile_tests/src/requirement.cpp
+
+10 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+12
+boÞ
+
+ $ÿÎ_a_»qu\9cem\92t
+() {
+
+13 \15
+\8cue
+;
+
+14
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/multifile_tests/src/requirement.h
+
+1 #iâdeà
+REQUIREMENT_H
+
+
+2 \ 1
+ #REQUIREMENT_H
+
+
+ )
+
+12
+boÞ
+
+ÿÎ_a_»qu\9cem\92t
+();
+
+ @tools/cxxtest/build_tools/SCons/test/multifile_tests/src/test_bar.t.h
+
+1 #iâdeà
+TEST_BAR_T_H
+
+
+2 \ 1
+ #TEST_BAR_T_H
+
+
+ )
+
+12 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+15 þas
+ cTe¡B¬
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/multifile_tests/src/test_foo.t.h
+
+1 #iâdeà
+TEST_FOO_T_H
+
+
+2 \ 1
+ #TEST_FOO_T_H
+
+
+ )
+
+12 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+15 þas
+ cTe¡Foo
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/need_cpppath/src/cpppath.t.h
+
+1 #iâdeà
+CPPPATH_T_H
+
+
+2 \ 1
+ #CPPPATH_T_H
+
+
+ )
+
+14 \ 2
+ ~"\9aþude.h
+"
+
+15 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+17 þas
+ cCµP©hTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+19
+public
+:
+
+20 \1e
+ $\8b¡_i_Ãed_me_exi¡s
+() {
+
+21
+ `TS_ASSERT
+(
+ `i_Ãed_me
+() == 0);
+
+23
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/need_cpppath/src/cpppathdir/include.h
+
+1 #iâdeà
+INCLUDE_H
+
+
+2 \ 1
+ #INCLUDE_H
+
+
+ )
+
+12 \12
+ $i_Ãed_me
+() {
+
+14
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/printer_propagation/cxxtest/CrazyRunner.h
+
+1 #iâdeà
+__cxx\8b¡_C¿zyRuÂ\94_h__
+
+
+2 \ 1
+ #__cxx\8b¡_C¿zyRuÂ\94_h__
+
+
+ )
+
+8
+Çme¥aû
+
+ gCxxTe¡
+ {
+
+9 þas
+ cC¿zyRuÂ\94
+ {
+
+10
+ gpublic
+:
+
+11 \12
+run
+() { \15 0; }
+
+12 \1e
+´oûss_commªdl\9ae
+(\12
+¬gc
+, \ 5**
+¬gv
+) { }
+
+ @tools/cxxtest/build_tools/SCons/test/printer_propagation/src/failtest.t.h
+
+1 #iâdeà
+FAILTEST_T_H
+
+
+2 \ 1
+ #FAILTEST_T_H
+
+
+ )
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+15 þas
+ cCµP©hTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_i_w\9el_ç\9e
+() {
+
+19
+ `TS_ASSERT
+(
+çl£
+);
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/recursive_sources/src/requirement.cpp
+
+10 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+12
+boÞ
+
+ $ÿÎ_a_»qu\9cem\92t
+() {
+
+13 \15
+\8cue
+;
+
+14
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/recursive_sources/src/requirement.h
+
+1 #iâdeà
+REQUIREMENT_H
+
+
+2 \ 1
+ #REQUIREMENT_H
+
+
+ )
+
+12
+boÞ
+
+ÿÎ_a_»qu\9cem\92t
+();
+
+ @tools/cxxtest/build_tools/SCons/test/recursive_sources/src/test_bar.t.h
+
+1 #iâdeà
+TEST_BAR_T_H
+
+
+2 \ 1
+ #TEST_BAR_T_H
+
+
+ )
+
+12 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+13 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+15 þas
+ cTe¡B¬
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/recursive_sources/src/test_foo.t.h
+
+1 #iâdeà
+TEST_FOO_T_H
+
+
+2 \ 1
+ #TEST_FOO_T_H
+
+
+ )
+
+12 \ 2
+ ~"»qu\9cem\92t.h
+"
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+15 þas
+ cTe¡Foo
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+17
+public
+:
+
+18 \1e
+ $\8b¡_foo
+() {
+
+19
+ `TS_ASSERT
+(
+ `ÿÎ_a_»qu\9cem\92t
+());
+
+21
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/string_cpppath/src/cpppath.t.h
+
+1 #iâdeà
+CPPPATH_T_H
+
+
+2 \ 1
+ #CPPPATH_T_H
+
+
+ )
+
+14 \ 2
+ ~"\9aþude.h
+"
+
+15 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+17 þas
+ cCµP©hTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+19
+public
+:
+
+20 \1e
+ $\8b¡_i_Ãed_me_exi¡s
+() {
+
+21
+ `TS_ASSERT
+(
+ `i_Ãed_me
+() == 0);
+
+23
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/string_cpppath/src/cpppathdir/include.h
+
+1 #iâdeà
+INCLUDE_H
+
+
+2 \ 1
+ #INCLUDE_H
+
+
+ )
+
+12 \12
+ $i_Ãed_me
+() {
+
+14
+ }
+}
+
+ @tools/cxxtest/build_tools/SCons/test/target_syntax/src/cpppath.t.h
+
+1 #iâdeà
+CPPPATH_T_H
+
+
+2 \ 1
+ #CPPPATH_T_H
+
+
+ )
+
+14 \ 2
+ ~"\9aþude.h
+"
+
+15 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+17 þas
+ cCµP©hTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+19
+public
+:
+
+20 \1e
+ $\8b¡_i_Ãed_me_exi¡s
+() {
+
+21
+ `TS_ASSERT
+(
+ `i_Ãed_me
+() == 0);
+
+23
+ }
+};
+
+ @tools/cxxtest/build_tools/SCons/test/target_syntax/src/cpppathdir/include.h
+
+1 #iâdeà
+INCLUDE_H
+
+
+2 \ 1
+ #INCLUDE_H
+
+
+ )
+
+12 \12
+ $i_Ãed_me
+() {
+
+14
+ }
+}
+
+ @tools/cxxtest/cxxtest/Descriptions.cpp
+
+12 #iâdeà
+__cxx\8b¡__Desü\9dtiÚs_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__Desü\9dtiÚs_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19
+ gTe¡Desü\9dtiÚ
+::~
+Te¡Desü\9dtiÚ
+() {}
+
+20
+Su\99eDesü\9dtiÚ
+::~SuiteDescription() {}
+
+21
+WÜldDesü\9dtiÚ
+::~WorldDescription() {}
+
+26 #iâdeà
+_CXXTEST_FACTOR
+
+
+27 \ 5*
+WÜldDesü\9dtiÚ
+::
+¡rTÙ®Te¡s
+Ð\ 5*
+s
+ ) const
+
+29
+numb\94ToS\8c\9ag
+Ð
+numTÙ®Te¡s
+(),
+s
+ );
+
+30 \15
+ gs
+;
+
+33 \ 5*
+ gWÜldDesü\9dtiÚ
+::
+¡rTÙ®Te¡s
+Ð\ 5*
+s
+ ) const
+
+35 \ 5*
+p
+ =
+numb\94ToS\8c\9ag
+Ð
+numTÙ®Te¡s
+(),
+s
+ );
+
+37 iàÐ
+numTÙ®Te¡s
+() <= 1 )
+
+38 \15
+s
+;
+
+40 \1d
+ gn
+ =
+numTÙ®Te¡s
+();
+
+41 \1d
+ gnumFaùÜs
+ = 0;
+
+43 \ f \1d
+ gçùÜ
+ = 2; (
+çùÜ
+ * faùÜè<ð
+n
+; factor += (factor == 2) ? 1 : 2 ) {
+
+44 \1d
+pow\94
+;
+
+46 \ f
+ gpow\94
+ = 0; (
+ gn
+ %
+ gçùÜ
+è=ð0;\82 /ð
+çùÜ
+ )
+
+47 ++
+pow\94
+;
+
+49 iàÐ!
+ gpow\94
+ )
+
+52
+ gp
+ =
+numb\94ToS\8c\9ag
+Ð
+çùÜ
+,
+cÝyS\8c\9ag
+Ð
+p
+, (
+numFaùÜs
+ == 0) ? " = " : " * " ) );
+
+53 iàÐ
+ gpow\94
+ > 1 )
+
+54
+ gp
+ =
+numb\94ToS\8c\9ag
+Ð
+pow\94
+,
+cÝyS\8c\9ag
+Ð
+p
+, "^" ) );
+
+55 ++
+ gnumFaùÜs
+;
+
+58 iàÐ
+ gn
+ > 1 ) {
+
+59 iàÐ!
+ gnumFaùÜs
+ )
+
+60
+cÝyS\8c\9ag
+Ð
+p
+,
+\8cack\94
+().
+ç\9eedTe¡s
+(è? " :(" :\81¿ck\94().
+w¬n\9ags
+() ? " :|" : " :)" );
+
+62
+numb\94ToS\8c\9ag
+Ð
+n
+,
+cÝyS\8c\9ag
+Ð
+p
+, " * " ) );
+
+64 \15
+ gs
+;
+
+ @tools/cxxtest/cxxtest/Descriptions.h
+
+12 #iâdeà
+__cxx\8b¡__Desü\9dtiÚs_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Desü\9dtiÚs_h__
+
+
+ )
+
+20 \ 2
+ ~<cxx\8b¡/L\9akedLi¡.h
+>
+
+22
+Çme¥aû
+
+ gCxxTe¡
+
+
+24
+þass
+
+ gTe¡Su\99e
+;
+
+26 þas
+ cTe¡Desü\9dtiÚ
+ :
+public
+
+L\9ak
+
+
+28
+public
+:
+
+29
+v\9ctu®
+ ~
+Te¡Desü\9dtiÚ
+();
+
+31
+v\9ctu®
+ cڡ \ 5*
+f\9ee
+() const = 0;
+
+32
+v\9ctu®
+ \12
+l\9ae
+() const = 0;
+
+33
+v\9ctu®
+ cڡ \ 5*
+\8b¡Name
+() const = 0;
+
+34
+v\9ctu®
+ cڡ \ 5*
+su\99eName
+() const = 0;
+
+36
+v\9ctu®
+ \1e
+run
+() = 0;
+
+37
+v\9ctu®
+
+boÞ
+
+£tUp
+() = 0;
+
+38
+v\9ctu®
+
+boÞ
+
+\8b¬Down
+() = 0;
+
+40
+v\9ctu®
+ cڡ
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+() const = 0;
+
+41
+v\9ctu®
+
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+() = 0;
+
+44 þas
+ cSu\99eDesü\9dtiÚ
+ :
+public
+
+L\9ak
+
+
+46
+public
+:
+
+47
+v\9ctu®
+ ~
+Su\99eDesü\9dtiÚ
+();
+
+49
+v\9ctu®
+ cڡ \ 5*
+f\9ee
+() const = 0;
+
+50
+v\9ctu®
+ \12
+l\9ae
+() const = 0;
+
+51
+v\9ctu®
+ cڡ \ 5*
+su\99eName
+() const = 0;
+
+52
+v\9ctu®
+
+Te¡Su\99e
+ *
+su\99e
+() const = 0;
+
+54
+v\9ctu®
+ \1d
+numTe¡s
+() const = 0;
+
+55
+v\9ctu®
+ cڡ
+ gTe¡Desü\9dtiÚ
+ &
+\8b¡Desü\9dtiÚ
+( \1d) const = 0;
+
+57
+v\9ctu®
+
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+() = 0;
+
+58
+v\9ctu®
+ cڡ
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+() const = 0;
+
+59
+v\9ctu®
+
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+() = 0;
+
+60
+v\9ctu®
+ cڡ
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+() const = 0;
+
+62
+v\9ctu®
+ \1e
+aùiv©eAÎTe¡s
+() = 0;
+
+63
+v\9ctu®
+
+boÞ
+
+ËaveOÆy
+( const \ 5* ) = 0;
+
+65
+v\9ctu®
+
+boÞ
+
+£tUp
+() = 0;
+
+66
+v\9ctu®
+
+boÞ
+
+\8b¬Down
+() = 0;
+
+69 þas
+ cWÜldDesü\9dtiÚ
+ :
+public
+
+L\9ak
+
+
+71
+public
+:
+
+72
+v\9ctu®
+ ~
+WÜldDesü\9dtiÚ
+();
+
+74
+v\9ctu®
+ cڡ \ 5*
+wÜldName
+() const { \15 "cxxtest"; }
+
+75
+v\9ctu®
+ \1d
+numSu\99es
+( \1e) const = 0;
+
+76
+v\9ctu®
+ \1d
+numTÙ®Te¡s
+( \1e) const = 0;
+
+77
+v\9ctu®
+ cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+su\99eDesü\9dtiÚ
+( \1d) const = 0;
+
+79 \92um {
+ gMAX_STRLEN_TOTAL_TESTS
+ = 32 };
+
+80 \ 5*
+¡rTÙ®Te¡s
+( \ 5* ) const;
+
+82
+v\9ctu®
+
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+() = 0;
+
+83
+v\9ctu®
+ cڡ
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+() const = 0;
+
+85
+v\9ctu®
+ \1e
+aùiv©eAÎTe¡s
+() = 0;
+
+86
+v\9ctu®
+
+boÞ
+
+ËaveOÆy
+( const \ 5* , const \ 5* = 0 ) = 0;
+
+ @tools/cxxtest/cxxtest/DummyDescriptions.cpp
+
+12 \ 2
+ ~<cxx\8b¡/DummyDesü\9dtiÚs.h
+>
+
+14
+Çme¥aû
+
+ gCxxTe¡
+
+
+16
+ gDummyTe¡Desü\9dtiÚ
+::
+DummyTe¡Desü\9dtiÚ
+() {}
+
+18 cڡ \ 5*
+DummyTe¡Desü\9dtiÚ
+::
+f\9ee
+() const { \15 "<no file>"; }
+
+19 \12
+ gDummyTe¡Desü\9dtiÚ
+::
+l\9ae
+() const { \15 0; }
+
+20 cڡ \ 5*
+ gDummyTe¡Desü\9dtiÚ
+::
+\8b¡Name
+() const { \15 "<no\81est>"; }
+
+21 cڡ \ 5*
+ gDummyTe¡Desü\9dtiÚ
+::
+su\99eName
+() const { \15 "<no suite>"; }
+
+22
+boÞ
+
+ gDummyTe¡Desü\9dtiÚ
+::
+£tUp
+(è{ \15
+\8cue
+;}
+
+23 \1e
+ gDummyTe¡Desü\9dtiÚ
+::
+run
+() {}
+
+24
+boÞ
+
+DummyTe¡Desü\9dtiÚ
+::
+\8b¬Down
+(è{ \15
+\8cue
+;}
+
+26
+Te¡Desü\9dtiÚ
+ *
+ gDummyTe¡Desü\9dtiÚ
+::
+Ãxt
+() { \15 0; }
+
+27 cڡ
+Te¡Desü\9dtiÚ
+ *
+ gDummyTe¡Desü\9dtiÚ
+::
+Ãxt
+() const { \15 0; }
+
+29
+ gDummySu\99eDesü\9dtiÚ
+::
+DummySu\99eDesü\9dtiÚ
+(è:
+_\8b¡
+() {}
+
+31 cڡ \ 5*
+DummySu\99eDesü\9dtiÚ
+::
+f\9ee
+() const { \15 "<no file>"; }
+
+32 \12
+ gDummySu\99eDesü\9dtiÚ
+::
+l\9ae
+() const { \15 0; }
+
+33 cڡ \ 5*
+ gDummySu\99eDesü\9dtiÚ
+::
+su\99eName
+() const { \15 "<no suite>"; }
+
+34
+Te¡Su\99e
+ *
+ gDummySu\99eDesü\9dtiÚ
+::
+su\99e
+() const { \15 0; }
+
+35 \1d
+ gDummySu\99eDesü\9dtiÚ
+::
+numTe¡s
+() const { \15 0; }
+
+36 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+ gDummySu\99eDesü\9dtiÚ
+::
+\8b¡Desü\9dtiÚ
+Ð\1dècÚ¡ { \15
+_\8b¡
+; }
+
+37
+Su\99eDesü\9dtiÚ
+ *
+ gDummySu\99eDesü\9dtiÚ
+::
+Ãxt
+() { \15 0; }
+
+38
+Te¡Desü\9dtiÚ
+ *
+ gDummySu\99eDesü\9dtiÚ
+::
+f\9c¡Te¡
+() { \15 0; }
+
+39 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gDummySu\99eDesü\9dtiÚ
+::
+Ãxt
+() const { \15 0; }
+
+40 cڡ
+Te¡Desü\9dtiÚ
+ *
+ gDummySu\99eDesü\9dtiÚ
+::
+f\9c¡Te¡
+() const { \15 0; }
+
+41 \1e
+ gDummySu\99eDesü\9dtiÚ
+::
+aùiv©eAÎTe¡s
+() {}
+
+42
+boÞ
+
+DummySu\99eDesü\9dtiÚ
+::
+ËaveOÆy
+ÐcÚ¡ \ 5* ) { \15
+çl£
+; }
+
+44
+boÞ
+
+ gDummySu\99eDesü\9dtiÚ
+::
+£tUp
+(è{ \15
+\8cue
+;}
+
+45
+boÞ
+
+ gDummySu\99eDesü\9dtiÚ
+::
+\8b¬Down
+(è{ \15
+\8cue
+;}
+
+47
+ gDummyWÜldDesü\9dtiÚ
+::
+DummyWÜldDesü\9dtiÚ
+(è:
+_su\99e
+() {}
+
+49 \1d
+DummyWÜldDesü\9dtiÚ
+::
+numSu\99es
+( \1e) const { \15 0; }
+
+50 \1d
+ gDummyWÜldDesü\9dtiÚ
+::
+numTÙ®Te¡s
+( \1e) const { \15 0; }
+
+51 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+ gDummyWÜldDesü\9dtiÚ
+::
+su\99eDesü\9dtiÚ
+Ð\1dècÚ¡ { \15
+_su\99e
+; }
+
+52
+Su\99eDesü\9dtiÚ
+ *
+ gDummyWÜldDesü\9dtiÚ
+::
+f\9c¡Su\99e
+() { \15 0; }
+
+53 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gDummyWÜldDesü\9dtiÚ
+::
+f\9c¡Su\99e
+() const { \15 0; }
+
+54 \1e
+ gDummyWÜldDesü\9dtiÚ
+::
+aùiv©eAÎTe¡s
+() {}
+
+55
+boÞ
+
+DummyWÜldDesü\9dtiÚ
+::
+ËaveOÆy
+ÐcÚ¡ \ 5* , cÚ¡ \ 5* ) { \15
+ gçl£
+; }
+
+57
+boÞ
+
+ gDummyWÜldDesü\9dtiÚ
+::
+£tUp
+(è{ \15
+\8cue
+;}
+
+58
+boÞ
+
+ gDummyWÜldDesü\9dtiÚ
+::
+\8b¬Down
+(è{ \15
+\8cue
+;}
+
+ @tools/cxxtest/cxxtest/DummyDescriptions.h
+
+12 #iâdeà
+__cxx\8b¡__DummyDesü\9dtiÚs_h__
+
+
+13 \ 1
+ #__cxx\8b¡__DummyDesü\9dtiÚs_h__
+
+
+ )
+
+19 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.h
+>
+
+21
+Çme¥aû
+
+ gCxxTe¡
+
+
+23 þas
+ cDummyTe¡Desü\9dtiÚ
+ :
+public
+
+Te¡Desü\9dtiÚ
+
+
+25
+public
+:
+
+26
+DummyTe¡Desü\9dtiÚ
+();
+
+28 cڡ \ 5*
+f\9ee
+() const;
+
+29 \12
+l\9ae
+() const;
+
+30 cڡ \ 5*
+\8b¡Name
+() const;
+
+31 cڡ \ 5*
+su\99eName
+() const;
+
+32
+boÞ
+
+£tUp
+();
+
+33 \1e
+run
+();
+
+34
+boÞ
+
+\8b¬Down
+();
+
+36
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+();
+
+37 cڡ
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+() const;
+
+40 þas
+ cDummySu\99eDesü\9dtiÚ
+ :
+public
+
+Su\99eDesü\9dtiÚ
+
+
+42
+public
+:
+
+43
+DummySu\99eDesü\9dtiÚ
+();
+
+45 cڡ \ 5*
+f\9ee
+() const;
+
+46 \12
+l\9ae
+() const;
+
+47 cڡ \ 5*
+su\99eName
+() const;
+
+48
+Te¡Su\99e
+ *
+su\99e
+() const;
+
+49 \1d
+numTe¡s
+() const;
+
+50 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+\8b¡Desü\9dtiÚ
+( \1d) const;
+
+51
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+();
+
+52
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+();
+
+53 cڡ
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+() const;
+
+54 cڡ
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+() const;
+
+55 \1e
+aùiv©eAÎTe¡s
+();
+
+56
+boÞ
+
+ËaveOÆy
+( const \ 5* );
+
+58
+boÞ
+
+£tUp
+();
+
+59
+boÞ
+
+\8b¬Down
+();
+
+61
+ g´iv©e
+:
+
+62
+DummyTe¡Desü\9dtiÚ
+
+_\8b¡
+;
+
+65 þas
+ cDummyWÜldDesü\9dtiÚ
+ :
+public
+
+WÜldDesü\9dtiÚ
+
+
+67
+public
+:
+
+68
+DummyWÜldDesü\9dtiÚ
+();
+
+70 \1d
+numSu\99es
+( \1e) const;
+
+71 \1d
+numTÙ®Te¡s
+( \1e) const;
+
+72 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+su\99eDesü\9dtiÚ
+( \1d) const;
+
+73
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+();
+
+74 cڡ
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+() const;
+
+75 \1e
+aùiv©eAÎTe¡s
+();
+
+76
+boÞ
+
+ËaveOÆy
+( const \ 5* , const \ 5* = 0 );
+
+78
+boÞ
+
+£tUp
+();
+
+79
+boÞ
+
+\8b¬Down
+();
+
+81
+ g´iv©e
+:
+
+82
+DummySu\99eDesü\9dtiÚ
+
+_su\99e
+;
+
+ @tools/cxxtest/cxxtest/ErrorFormatter.h
+
+12 #iâdeà
+__cxx\8b¡__E¼ÜFÜm©\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__E¼ÜFÜm©\8br_h__
+
+
+ )
+
+23 \ 2
+ ~<cxx\8b¡/Te¡RuÂ\94.h
+>
+
+24 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+25 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+26 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+27 \ 2
+ ~<c¡dio
+>
+
+29
+Çme¥aû
+
+ gCxxTe¡
+
+
+31 þas
+ cOu\8dutS\8c\97m
+
+
+33
+ gpublic
+:
+
+34
+v\9ctu®
+ ~
+Ou\8dutS\8c\97m
+() {}
+
+35
+v\9ctu®
+ \1e
+æush
+() {};
+
+36
+v\9ctu®
+
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð\1dè{ \15 *
+ gthis
+; }
+
+37
+v\9ctu®
+
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<ÐcÚ¡ \ 5* ) { \15 *
+ gthis
+; }
+
+39 \e\1e(*
+ gMª\9duÏtÜ
+)Ð
+ tOu\8dutS\8c\97m
+ & );
+
+41
+v\9ctu®
+
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð
+Mª\9duÏtÜ
+
+ gm
+ ) {
+m
+Ð*
+this
+ ); \15 *
+ gthis
+; }
+
+42 \18\1e
+\92dl
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ ) { (
+ go
+ << "\n").
+æush
+(); }
+
+45 þas
+ cE¼ÜFÜm©\8br
+ :
+public
+
+Te¡Li¡\92\94
+
+
+47
+public
+:
+
+48
+E¼ÜFÜm©\8br
+Ð
+Ou\8dutS\8c\97m
+ *
+o
+, cڡ \ 5*
+´eL\9ae
+ = ":", cڡ \ 5*
+po¡L\9ae
+ = "" ) :
+
+49
+_dÙt\9ag
+Ð
+\8cue
+ ),
+
+50
+_»pÜ\8bd
+Ð
+çl£
+ ),
+
+51
+_o
+(
+o
+),
+
+52
+_´eL\9ae
+(
+´eL\9ae
+),
+
+53
+_po¡L\9ae
+(
+po¡L\9ae
+)
+
+57 \12
+run
+()
+
+59
+ gTe¡RuÂ\94
+::
+runAÎTe¡s
+Ð*
+this
+ );
+
+60 \15
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+63 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & )
+
+65 (*
+ g_o
+è<< "RuÂ\9ag " <<
+ gtÙ®Te¡s
+;
+
+66
+ g_o
+->
+æush
+();
+
+67
+ g_dÙt\9ag
+ =
+\8cue
+;
+
+68
+ g_»pÜ\8bd
+ =
+çl£
+;
+
+71 \18\1e
+tÙ®Te¡s
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ )
+
+73 \ 5
+ gs
+[
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+74 cڡ
+ gWÜldDesü\9dtiÚ
+ &
+ gwd
+ =
+\8cack\94
+().
+wÜld
+();
+
+75
+ go
+ <<
+ gwd
+.
+¡rTÙ®Te¡s
+Ð
+s
+ ) << (wd.
+numTÙ®Te¡s
+() == 1 ? "\81est" : "\81ests");
+
+78 \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ & )
+
+80
+ g_»pÜ\8bd
+ =
+çl£
+;
+
+83 \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & )
+
+85
+ g_»pÜ\8bd
+ =
+çl£
+;
+
+88 \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & )
+
+90 iàÐ!
+\8cack\94
+().
+\8b¡Fa\9eed
+() ) {
+
+91 (*
+ g_o
+) << ".";
+
+92
+ g_o
+->
+æush
+();
+
+93
+fæush
+(
+¡dout
+);
+
+94
+ g_dÙt\9ag
+ =
+\8cue
+;
+
+98 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+desc
+ )
+
+100 iàÐ!
+\8cack\94
+().
+ç\9eedTe¡s
+() ) {
+
+101 (*
+ g_o
+è<< "OK!" <<
+ g\92dl
+;
+
+104
+ÃwL\9ae
+();
+
+105 (*
+ g_o
+è<< "Fa\9eed " <<
+\8cack\94
+().
+ç\9eedTe¡s
+(è<< " oà" <<
+ gtÙ®Te¡s
+ <<
+ g\92dl
+;
+
+106 \1d
+ gnumPas£d
+ =
+desc
+.
+numTÙ®Te¡s
+(è-
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+107 (*
+ g_o
+è<< "Sucûs ¿\8b: " << (
+ gnumPas£d
+ * 100 /
+ gdesc
+.
+numTÙ®Te¡s
+()è<< "%" <<
+ g\92dl
+;
+
+110 \1e
+\8caû
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+112
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Trace: " <<
+
+113
+ gex´essiÚ
+ <<
+ g\92dl
+;
+
+116 \1e
+w¬n\9ag
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+118
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Warning: " <<
+
+119
+ gex´essiÚ
+ <<
+ g\92dl
+;
+
+122 \1e
+ç\9eedTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+124
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Test failed: " <<
+
+125
+ gex´essiÚ
+ <<
+ g\92dl
+;
+
+128 \1e
+ç\9eedAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+130
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Assertion failed: " <<
+
+131
+ gex´essiÚ
+ <<
+ g\92dl
+;
+
+134 \1e
+ç\9eedAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+135 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+136 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+138
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Expected (" <<
+
+139
+ gxS\8c
+ << " =ð" <<
+ gyS\8c
+ << "), found (" <<
+
+140
+ gx
+ << " !ð" <<
+ gy
+ << ")" <<
+ g\92dl
+;
+
+143 \1e
+ç\9eedAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+144 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+145 cڡ \ 5*
+sizeS\8c
+, cڡ \1e*
+x
+,
+
+146 cڡ \1e*
+y
+, \1d
+size
+ )
+
+148
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: Ex³ùed " <<
+ gsizeS\8c
+ << " (" <<
+ gsize
+ << ") bytes\81o be\83qual\87t (" <<
+
+149
+ gxS\8c
+ << "èªd (" <<
+ gyS\8c
+ << "), found:" <<
+ g\92dl
+;
+
+150
+dump
+Ð
+x
+,
+size
+ );
+
+151 (*
+ g_o
+è<< " difãr äom" <<
+ g\92dl
+;
+
+152
+dump
+Ð
+y
+,
+size
+ );
+
+155 \1e
+ç\9eedAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+157 cڡ \ 5*
+ex¶ª©iÚ
+
+
+160
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: " <<
+ gex¶ª©iÚ
+ <<
+ g\92dl
+;
+
+163 \1e
+ç\9eedAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+164 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+dS\8c
+,
+
+165 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+, cڡ \ 5*
+d
+ )
+
+167
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Expected (" <<
+
+168
+ gxS\8c
+ << " =ð" <<
+ gyS\8c
+ << "èu°tØ" <<
+ gdS\8c
+ << " (" <<
+ gd
+ << "), found (" <<
+
+169
+ gx
+ << " !ð" <<
+ gy
+ << ")" <<
+ g\92dl
+;
+
+172 \1e
+ç\9eedAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+173 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+174 cڡ \ 5*
+v®ue
+ )
+
+176
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Expected (" <<
+
+177
+ gxS\8c
+ << " !ð" <<
+ gyS\8c
+ << "), found (" <<
+
+178
+ gv®ue
+ << ")" <<
+ g\92dl
+;
+
+181 \1e
+ç\9eedAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+182 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+183 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+185
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Expected (" <<
+
+186
+ gxS\8c
+ << " < " <<
+ gyS\8c
+ << "), found (" <<
+
+187
+ gx
+ << " >ð" <<
+ gy
+ << ")" <<
+ g\92dl
+;
+
+190 \1e
+ç\9eedAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+191 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+192 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+194
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "Error: Expected (" <<
+
+195
+ gxS\8c
+ << " <ð" <<
+ gyS\8c
+ << "), found (" <<
+
+196
+ gx
+ << " > " <<
+ gy
+ << ")" <<
+ g\92dl
+;
+
+199 \1e
+ç\9eedAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+200 cڡ \ 5*
+»ÏtiÚ
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+201 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+203
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: Ex³ùed " <<
+ g»ÏtiÚ
+ << "( " <<
+
+204
+ gxS\8c
+ << ", " <<
+ gyS\8c
+ << " ), found !" <<
+ g»ÏtiÚ
+ << "Ð" <<
+ gx
+ << ", " <<
+ gy
+ << " )" <<
+ g\92dl
+;
+
+207 \1e
+ç\9eedAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+208 cڡ \ 5*
+´ediÿ\8b
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+x
+ )
+
+210
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: Ex³ùed " <<
+ g´ediÿ\8b
+ << "( " <<
+
+211
+ gxS\8c
+ << " ), found !" <<
+ g´ediÿ\8b
+ << "Ð" <<
+ gx
+ << " )" <<
+ g\92dl
+;
+
+214 \1e
+ç\9eedAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+215 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+ty³
+,
+
+216
+boÞ
+
+Ùh\94Thrown
+ )
+
+218
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: Ex³ùed (" <<
+ gex´essiÚ
+ << ")\81o\81hrow (" <<
+
+219
+ gty³
+ << "èbu\88\99 " << (
+ gÙh\94Thrown
+ ? "threw something\83lse" : "didn't\81hrow") <<
+
+220
+\92dl
+;
+
+223 \1e
+ç\9eedAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+225
+¡Ý
+Ð
+f\9ee
+,
+l\9ae
+ ) << "E¼Ü: Ex³ùed (" <<
+ gex´essiÚ
+ << ")\82ot\81o\81hrow, but it did" <<
+
+226
+ g\92dl
+;
+
+229
+ g´Ùeùed
+:
+
+230
+Ou\8dutS\8c\97m
+ *
+ou\8dutS\8c\97m
+() const
+
+232 \15
+_o
+;
+
+235
+ g´iv©e
+:
+
+236
+E¼ÜFÜm©\8br
+( const ErrorFormatter & );
+
+237
+ gE¼ÜFÜm©\8br
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+E¼ÜFÜm©\8br
+ & );
+
+239
+ gOu\8dutS\8c\97m
+ &
+¡Ý
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+ )
+
+241
+ÃwL\9ae
+();
+
+242
+»pÜtTe¡
+();
+
+243 \15 (*
+ g_o
+è<<
+ gf\9ee
+ <<
+ g_´eL\9ae
+ <<
+ gl\9ae
+ <<
+ g_po¡L\9ae
+ << ": ";
+
+246 \1e
+ÃwL\9ae
+( \1e)
+
+248 iàÐ
+ g_dÙt\9ag
+ ) {
+
+249 (*
+ g_o
+è<<
+ g\92dl
+;
+
+250
+ g_dÙt\9ag
+ =
+çl£
+;
+
+254 \1e
+»pÜtTe¡
+( \1e)
+
+256 ifÐ
+ g_»pÜ\8bd
+ )
+
+258 (*
+ g_o
+è<< "IÀ" <<
+\8cack\94
+().
+su\99e
+().
+su\99eName
+(è<< "::" <<\81¿ck\94().
+\8b¡
+().
+\8b¡Name
+(è<< ":" <<
+ g\92dl
+;
+
+259
+ g_»pÜ\8bd
+ =
+\8cue
+;
+
+262 \1e
+dump
+ÐcÚ¡ \1e*
+bufãr
+, \1d
+size
+ )
+
+264 iàÐ!
+ gbufãr
+ )
+
+265
+dumpNuÎ
+();
+
+267
+dumpBufãr
+Ð
+bufãr
+,
+size
+ );
+
+270 \1e
+dumpNuÎ
+()
+
+272 (*
+ g_o
+è<< " (nuÎ)" <<
+ g\92dl
+;
+
+275 \1e
+dumpBufãr
+ÐcÚ¡ \1e*
+bufãr
+, \1d
+size
+ )
+
+277 \1d
+ gdumpSize
+ =
+size
+;
+
+278 iàÐ
+maxDumpSize
+(è&&
+ gdumpSize
+ > maxDumpSize() )
+
+279
+ gdumpSize
+ =
+maxDumpSize
+();
+
+281 cڡ \1d\ 5*
+ gp
+ = (cڡ \1d\ 5*)
+bufãr
+;
+
+282 (*
+ g_o
+) << " { ";
+
+283 \ f \1d
+ gi
+ = 0; i <
+ gdumpSize
+; ++ i )
+
+284 (*
+ g_o
+è<<
+by\8bToHex
+Ð*
+p
+++ ) << " ";
+
+285 iàÐ
+ gdumpSize
+ <
+ gsize
+ )
+
+286 (*
+ g_o
+) << "... ";
+
+287 (*
+ g_o
+è<< "}" <<
+ g\92dl
+;
+
+290 \18\1e
+\92dl
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ )
+
+292
+ gOu\8dutS\8c\97m
+::
+\92dl
+Ð
+o
+ );
+
+295
+boÞ
+
+ g_dÙt\9ag
+;
+
+296
+boÞ
+
+ g_»pÜ\8bd
+;
+
+297
+Ou\8dutS\8c\97m
+ *
+ g_o
+;
+
+298 cڡ \ 5*
+ g_´eL\9ae
+;
+
+299 cڡ \ 5*
+ g_po¡L\9ae
+;
+
+ @tools/cxxtest/cxxtest/ErrorPrinter.h
+
+12 #iâdeà
+__cxx\8b¡__E¼ÜPr\9a\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__E¼ÜPr\9a\8br_h__
+
+
+ )
+
+22 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+24 #iâdeà
+_CXXTEST_HAVE_STD
+
+
+25 \ 1
+ #_CXXTEST_HAVE_STD
+
+
+ )
+
+28 \ 2
+ ~<cxx\8b¡/E¼ÜFÜm©\8br.h
+>
+
+29 \ 2
+ ~<cxx\8b¡/StdV®ueT¿\99s.h
+>
+
+31 #ifdeà
+_CXXTEST_OLD_STD
+
+
+32 \ 2
+ ~<io¡»am.h
+>
+
+34 \ 2
+ ~<io¡»am
+>
+
+37
+Çme¥aû
+
+ gCxxTe¡
+
+
+39 þas
+ cE¼ÜPr\9a\8br
+ :
+public
+
+E¼ÜFÜm©\8br
+
+
+41
+public
+:
+
+42
+E¼ÜPr\9a\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ = CXXTEST_STD(
+cout
+), cڡ \ 5*
+´eL\9ae
+ = ":", cڡ \ 5*
+po¡L\9ae
+ = "" ) :
+
+43
+E¼ÜFÜm©\8br
+Ð
+Ãw
+
+Ad\8br
+(
+o
+),
+´eL\9ae
+,
+po¡L\9ae
+ ) {}
+
+44
+ gv\9ctu®
+ ~
+E¼ÜPr\9a\8br
+(è{
+d\96\91e
+
+ou\8dutS\8c\97m
+(); }
+
+46
+ g´iv©e
+:
+
+47 þas
+ cAd\8br
+ :
+public
+
+Ou\8dutS\8c\97m
+
+
+49
+CXXTEST_STD
+(
+o¡»am
+è&
+_o
+;
+
+50
+ gpublic
+:
+
+51
+Ad\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ ) :
+_o
+(o) {}
+
+52 \1e
+æush
+(è{
+_o
+.flush(); }
+
+53
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<ÐcÚ¡ \ 5*
+ gs
+ ) {
+ g_o
+ << s; \15 *
+ gthis
+; }
+
+54
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð
+Mª\9duÏtÜ
+
+ gm
+ ) { \15 Ou\8dutS\8c\97m::
+Ý\94©Ü
+<<Ð
+m
+ ); }
+
+55
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð\1d
+ gi
+ )
+
+57 \ 5
+ gs
+[1 + 3 * \17(\1d)];
+
+58
+numb\94ToS\8c\9ag
+Ð
+i
+,
+s
+ );
+
+59
+ g_o
+ <<
+ gs
+;
+
+60 \15 *
+ gthis
+;
+
+ @tools/cxxtest/cxxtest/Flags.h
+
+12 #iâdeà
+__cxx\8b¡__FÏgs_h__
+
+
+13 \ 1
+ #__cxx\8b¡__FÏgs_h__
+
+
+ )
+
+19 #ià!
+def\9aed
+(
+CXXTEST_FLAGS
+)
+
+20 \ 1
+ #CXXTEST_FLAGS
+
+
+ )
+
+23 #ià
+def\9aed
+(
+CXXTEST_HAVE_EH
+è&& !def\9aed(
+_CXXTEST_HAVE_EH
+)
+
+24 \ 1
+ #_CXXTEST_HAVE_EH
+
+
+ )
+
+27 #ià
+def\9aed
+(
+CXXTEST_HAVE_STD
+è&& !def\9aed(
+_CXXTEST_HAVE_STD
+)
+
+28 \ 1
+ #_CXXTEST_HAVE_STD
+
+
+ )
+
+31 #ià
+def\9aed
+(
+CXXTEST_OLD_TEMPLATE_SYNTAX
+è&& !def\9aed(
+_CXXTEST_OLD_TEMPLATE_SYNTAX
+)
+
+32 \ 1
+ #_CXXTEST_OLD_TEMPLATE_SYNTAX
+
+
+ )
+
+35 #ià
+def\9aed
+(
+CXXTEST_OLD_STD
+è&& !def\9aed(
+_CXXTEST_OLD_STD
+)
+
+36 \ 1
+ #_CXXTEST_OLD_STD
+
+
+ )
+
+39 #ià
+def\9aed
+(
+CXXTEST_ABORT_TEST_ON_FAIL
+è&& !def\9aed(
+_CXXTEST_ABORT_TEST_ON_FAIL
+)
+
+40 \ 1
+ #_CXXTEST_ABORT_TEST_ON_FAIL
+
+
+ )
+
+43 #ià
+def\9aed
+(
+CXXTEST_NO_COPY_CONST
+è&& !def\9aed(
+_CXXTEST_NO_COPY_CONST
+)
+
+44 \ 1
+ #_CXXTEST_NO_COPY_CONST
+
+
+ )
+
+47 #ià
+def\9aed
+(
+CXXTEST_FACTOR
+è&& !def\9aed(
+_CXXTEST_FACTOR
+)
+
+48 \ 1
+ #_CXXTEST_FACTOR
+
+
+ )
+
+51 #ià
+def\9aed
+(
+CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+è&& !def\9aed(
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+)
+
+52 \ 1
+ #_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+ )
+
+55 #ià
+def\9aed
+(
+CXXTEST_LONGLONG
+)
+
+56 #ià
+def\9aed
+(
+_CXXTEST_LONGLONG
+)
+
+57 #undeà
+_CXXTEST_LONGLONG
+
+
+59 \ 1
+ #_CXXTEST_LONGLONG
+
+CXXTEST_LONGLONG
+
+
+ )
+
+62 #iâdeà
+CXXTEST_MAX_DUMP_SIZE
+
+
+63 \ 1
+ #CXXTEST_MAX_DUMP_SIZE
+ 0
+
+ )
+
+66 #ià
+def\9aed
+(
+_CXXTEST_ABORT_TEST_ON_FAIL
+è&& !def\9aed(
+CXXTEST_DEFAULT_ABORT
+)
+
+67 \ 1
+ #CXXTEST_DEFAULT_ABORT
+
+\8cue
+
+
+ )
+
+70 #ià!
+def\9aed
+(
+CXXTEST_DEFAULT_ABORT
+)
+
+71 \ 1
+ #CXXTEST_DEFAULT_ABORT
+
+çl£
+
+
+ )
+
+74 #ià
+def\9aed
+(
+_CXXTEST_ABORT_TEST_ON_FAIL
+è&& !def\9aed(
+_CXXTEST_HAVE_EH
+)
+
+76 #undeà
+_CXXTEST_ABORT_TEST_ON_FAIL
+
+
+83 #ifdeà
+__BORLANDC__
+
+
+84 #ià
+__BORLANDC__
+ <= 0x520
+
+85 #iâdeà
+_CXXTEST_OLD_STD
+
+
+86 \ 1
+ #_CXXTEST_OLD_STD
+
+
+ )
+
+88 #iâdeà
+_CXXTEST_OLD_TEMPLATE_SYNTAX
+
+
+89 \ 1
+ #_CXXTEST_OLD_TEMPLATE_SYNTAX
+
+
+ )
+
+92 #ià
+__BORLANDC__
+ >= 0x540
+
+93 #iâdeà
+_CXXTEST_NO_COPY_CONST
+
+
+94 \ 1
+ #_CXXTEST_NO_COPY_CONST
+
+
+ )
+
+96 #iâdeà
+_CXXTEST_LONGLONG
+
+
+97 \ 1
+ #_CXXTEST_LONGLONG
+
+__\9at64
+
+
+ )
+
+102 #ifdeà
+_MSC_VER
+
+
+103 #iâdeà
+_CXXTEST_LONGLONG
+
+
+104 \ 1
+ #_CXXTEST_LONGLONG
+
+__\9at64
+
+
+ )
+
+106 #ià(
+_MSC_VER
+ >= 0x51E)
+
+107 #iâdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+108 \ 1
+ #_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+ )
+
+111 #´agm¨
+w¬n\9ag
+Ð
+di§bË
+ : 4127 )
+
+112 #´agm¨
+w¬n\9ag
+Ð
+di§bË
+ : 4290 )
+
+113 #´agm¨
+w¬n\9ag
+Ð
+di§bË
+ : 4511 )
+
+114 #´agm¨
+w¬n\9ag
+Ð
+di§bË
+ : 4512 )
+
+115 #´agm¨
+w¬n\9ag
+Ð
+di§bË
+ : 4514 )
+
+118 #ifdeà
+__GNUC__
+
+
+119 #ià(
+__GNUC__
+ > 2è|| (__GNUC__ =ð2 &&
+__GNUC_MINOR__
+ >= 9)
+
+120 #iâdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+121 \ 1
+ #_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+ )
+
+124 #ià
+def\9aed
+(
+__LONG_LONG_MAX__
+è&& !def\9aed(
+__ýlu¥lus
+)
+
+125 \ 1
+ #_CXXTEST_LONGLONG
+ \13\13
+
+ )
+
+129 #ifdeà
+__DMC__
+
+
+130 #iâdeà
+_CXXTEST_OLD_STD
+
+
+131 \ 1
+ #_CXXTEST_OLD_STD
+
+
+ )
+
+135 #ifdeà
+__SUNPRO_CC
+
+
+136 #ià
+__SUNPRO_CC
+ >= 0x510
+
+137 #iâdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+138 \ 1
+ #_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+ )
+
+143 #ifdeà
+__xlC__
+
+
+146 #ià
+__xlC__
+ >= 0x0700
+
+147 #iâdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+148 \ 1
+ #_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+ )
+
+ @tools/cxxtest/cxxtest/GlobalFixture.cpp
+
+12 #iâdeà
+__cxx\8b¡__Glob®Fixtu»_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__Glob®Fixtu»_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19
+boÞ
+
+ gGlob®Fixtu»
+::
+£tUpWÜld
+(è{ \15
+\8cue
+; }
+
+20
+boÞ
+
+ gGlob®Fixtu»
+::
+\8b¬DownWÜld
+(è{ \15
+\8cue
+; }
+
+21
+boÞ
+
+ gGlob®Fixtu»
+::
+£tUp
+(è{ \15
+\8cue
+; }
+
+22
+boÞ
+
+ gGlob®Fixtu»
+::
+\8b¬Down
+(è{ \15
+\8cue
+; }
+
+24
+ gGlob®Fixtu»
+::
+Glob®Fixtu»
+(è{
+©\8fch
+Ð
+_li¡
+ ); }
+
+25
+ gGlob®Fixtu»
+::~
+Glob®Fixtu»
+(è{
+d\91ach
+Ð
+_li¡
+ ); }
+
+27
+Glob®Fixtu»
+ *
+ gGlob®Fixtu»
+::
+f\9c¡Glob®Fixtu»
+(è{ \15 (Glob®Fixtu» *)
+_li¡
+.
+h\97d
+(); }
+
+28
+Glob®Fixtu»
+ *
+ gGlob®Fixtu»
+::
+Ï¡Glob®Fixtu»
+(è{ \15 (Glob®Fixtu» *)
+_li¡
+.
+\8f\9e
+(); }
+
+29
+Glob®Fixtu»
+ *
+ gGlob®Fixtu»
+::
+ÃxtGlob®Fixtu»
+(è{ \15 (Glob®Fixtu» *)
+Ãxt
+(); }
+
+30
+Glob®Fixtu»
+ *
+ gGlob®Fixtu»
+::
+´evGlob®Fixtu»
+(è{ \15 (Glob®Fixtu» *)
+´ev
+(); }
+
+ @tools/cxxtest/cxxtest/GlobalFixture.h
+
+12 #iâdeà
+__cxx\8b¡__Glob®Fixtu»_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Glob®Fixtu»_h__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/L\9akedLi¡.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19 þas
+ cGlob®Fixtu»
+ :
+public
+
+L\9ak
+
+
+21
+public
+:
+
+22
+v\9ctu®
+
+boÞ
+
+£tUpWÜld
+();
+
+23
+v\9ctu®
+
+boÞ
+
+\8b¬DownWÜld
+();
+
+24
+v\9ctu®
+
+boÞ
+
+£tUp
+();
+
+25
+v\9ctu®
+
+boÞ
+
+\8b¬Down
+();
+
+27
+Glob®Fixtu»
+();
+
+28 ~
+Glob®Fixtu»
+();
+
+30 \18
+Glob®Fixtu»
+ *
+f\9c¡Glob®Fixtu»
+();
+
+31 \18
+Glob®Fixtu»
+ *
+Ï¡Glob®Fixtu»
+();
+
+32
+Glob®Fixtu»
+ *
+ÃxtGlob®Fixtu»
+();
+
+33
+Glob®Fixtu»
+ *
+´evGlob®Fixtu»
+();
+
+35
+ g´iv©e
+:
+
+36 \18
+Li¡
+
+_li¡
+;
+
+ @tools/cxxtest/cxxtest/Gui.h
+
+12 #iâdeà
+__CXXTEST__GUI_H
+
+
+13 \ 1
+ #__CXXTEST__GUI_H
+
+
+ )
+
+20 \ 2
+ ~<cxx\8b¡/T\93Li¡\92\94.h
+>
+
+22
+Çme¥aû
+
+ gCxxTe¡
+
+
+24 þas
+ cGuiLi¡\92\94
+ :
+public
+
+Te¡Li¡\92\94
+
+
+26
+public
+:
+
+27
+GuiLi¡\92\94
+(è:
+_¡©e
+Ð
+GREEN_BAR
+ ) {}
+
+28
+v\9ctu®
+ ~
+GuiLi¡\92\94
+() {}
+
+30
+v\9ctu®
+ \1e
+runGui
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+,
+Te¡Li¡\92\94
+ &
+li¡\92\94
+ )
+
+32
+\92\8brGui
+Ð
+¬gc
+,
+¬gv
+ );
+
+33
+ gTe¡RuÂ\94
+::
+runAÎTe¡s
+Ð
+li¡\92\94
+ );
+
+34
+ËaveGui
+();
+
+37
+v\9ctu®
+ \1e
+\92\8brGui
+( \12& , \ 5** ) {}
+
+38
+v\9ctu®
+ \1e
+ËaveGui
+() {}
+
+43
+v\9ctu®
+ \1e
+guiEÁ\94WÜld
+( \1d) {}
+
+44
+v\9ctu®
+ \1e
+guiEÁ\94Su\99e
+( const \ 5* ) {}
+
+45
+v\9ctu®
+ \1e
+guiEÁ\94Te¡
+( const \ 5* , const \ 5* ) {}
+
+46
+v\9ctu®
+ \1e
+y\96lowB¬
+() {}
+
+47
+v\9ctu®
+ \1e
+»dB¬
+() {}
+
+52 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+d
+ ) {
+guiEÁ\94WÜld
+Ðd.
+numTÙ®Te¡s
+() ); }
+
+53 \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+d
+ ) {
+guiEÁ\94Su\99e
+Ðd.
+su\99eName
+() ); }
+
+54 \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+d
+ ) {
+guiEÁ\94Te¡
+Ðd.
+su\99eName
+(), d.
+\8b¡Name
+() ); }
+
+55 \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & ) {}
+
+56 \1e
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ & ) {}
+
+57 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & ) {}
+
+59 \1e
+w¬n\9ag
+( const \ 5* , \12, const \ 5* )
+
+61
+y\96lowB¬Saã
+();
+
+64 \1e
+ç\9eedTe¡
+( const \ 5* , \12, const \ 5* )
+
+66
+»dB¬Saã
+();
+
+69 \1e
+ç\9eedAs£¹
+( const \ 5* , \12, const \ 5* )
+
+71
+»dB¬Saã
+();
+
+74 \1e
+ç\9eedAs£¹Equ®s
+( const \ 5* , \12,
+
+78
+»dB¬Saã
+();
+
+81 \1e
+ç\9eedAs£¹SameD©a
+( const \ 5* , \12,
+
+86
+»dB¬Saã
+();
+
+89 \1e
+ç\9eedAs£¹D\96\8f
+( const \ 5* , \12,
+
+93
+»dB¬Saã
+();
+
+96 \1e
+ç\9eedAs£¹Difãrs
+( const \ 5* , \12,
+
+100
+»dB¬Saã
+();
+
+103 \1e
+ç\9eedAs£¹LessThª
+( const \ 5* , \12,
+
+107
+»dB¬Saã
+();
+
+110 \1e
+ç\9eedAs£¹LessThªEqu®s
+( const \ 5* , \12,
+
+114
+»dB¬Saã
+();
+
+117 \1e
+ç\9eedAs£¹P»diÿ\8b
+( const \ 5* , \12,
+
+120
+»dB¬Saã
+();
+
+123 \1e
+ç\9eedAs£¹R\96©iÚ
+( const \ 5* , \12,
+
+127
+»dB¬Saã
+();
+
+130 \1e
+ç\9eedAs£¹Throws
+( const \ 5* , \12,
+
+132
+boÞ
+ )
+
+134
+»dB¬Saã
+();
+
+137 \1e
+ç\9eedAs£¹ThrowsNÙ
+( const \ 5* , \12,
+
+140
+»dB¬Saã
+();
+
+143
+ g´Ùeùed
+:
+
+144 \1e
+y\96lowB¬Saã
+()
+
+146 iàÐ
+_¡©e
+ <
+YELLOW_BAR
+ ) {
+
+147
+y\96lowB¬
+();
+
+148
+ g_¡©e
+ =
+YELLOW_BAR
+;
+
+152 \1e
+»dB¬Saã
+()
+
+154 iàÐ
+ g_¡©e
+ <
+ gRED_BAR
+ ) {
+
+155
+»dB¬
+();
+
+156
+ g_¡©e
+ =
+RED_BAR
+;
+
+160
+ g´iv©e
+:
+
+161 \92um {
+GREEN_BAR
+,
+ gYELLOW_BAR
+,
+ gRED_BAR
+ }
+ g_¡©e
+;
+
+164
+ g\8bm¶©e
+<
+þass
+
+ gGuiT
+, cÏs
+ gTuiT
+>
+
+165 þas
+ cGuiTuiRu\94
+ :
+public
+
+T\93Li¡\92\94
+
+
+167 \12*
+_¬gc
+;
+
+168 \ 5**
+ g_¬gv
+;
+
+169
+GuiT
+
+ g_gui
+;
+
+170
+TuiT
+
+ g_tui
+;
+
+172
+ gpublic
+:
+
+173
+GuiTuiRu\94
+(è:
+_¬gc
+(0),
+_¬gv
+(0) {}
+
+175 \1e
+´oûss_commªdl\9ae
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+177
+ g_¬gc
+=&
+¬gc
+;
+
+178
+ g_¬gv
+=
+¬gv
+;
+
+179
+£tF\9c¡
+Ð
+_gui
+ );
+
+180
+£tSecÚd
+Ð
+_tui
+ );
+
+183 \12
+run
+()
+
+185
+ g_gui
+.
+runGui
+Ð*
+_¬gc
+,
+_¬gv
+, *
+this
+ );
+
+186 \15
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+ @tools/cxxtest/cxxtest/LinkedList.cpp
+
+12 #iâdeà
+__cxx\8b¡__L\9akedLi¡_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__L\9akedLi¡_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/L\9akedLi¡.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19
+Li¡
+
+ gGlob®Fixtu»
+::
+_li¡
+ = { 0, 0 };
+
+20
+Li¡
+
+ gR\97lSu\99eDesü\9dtiÚ
+::
+_su\99es
+ = { 0, 0 };
+
+22 \1e
+ gLi¡
+::
+\9a\99\9flize
+()
+
+24
+_h\97d
+ =
+_\8f\9e
+ = 0;
+
+27
+L\9ak
+ *
+ gLi¡
+::
+h\97d
+()
+
+29
+L\9ak
+ *
+l
+ =
+_h\97d
+;
+
+30 \1f
+ gl
+ && !l->
+aùive
+() )
+
+31
+ gl
+ =
+l
+->
+Ãxt
+();
+
+32 \15
+ gl
+;
+
+35 cڡ
+L\9ak
+ *
+ gLi¡
+::
+h\97d
+() const
+
+37
+L\9ak
+ *
+l
+ =
+_h\97d
+;
+
+38 \1f
+ gl
+ && !l->
+aùive
+() )
+
+39
+ gl
+ =
+l
+->
+Ãxt
+();
+
+40 \15
+ gl
+;
+
+43
+L\9ak
+ *
+ gLi¡
+::
+\8f\9e
+()
+
+45
+L\9ak
+ *
+l
+ =
+_\8f\9e
+;
+
+46 \1f
+ gl
+ && !l->
+aùive
+() )
+
+47
+ gl
+ =
+l
+->
+´ev
+();
+
+48 \15
+ gl
+;
+
+51 cڡ
+L\9ak
+ *
+ gLi¡
+::
+\8f\9e
+() const
+
+53
+L\9ak
+ *
+l
+ =
+_\8f\9e
+;
+
+54 \1f
+ gl
+ && !l->
+aùive
+() )
+
+55
+ gl
+ =
+l
+->
+´ev
+();
+
+56 \15
+ gl
+;
+
+59
+boÞ
+
+ gLi¡
+::
+em±y
+() const
+
+61 \15 (
+_h\97d
+ == 0);
+
+64 \1d
+ gLi¡
+::
+size
+() const
+
+66 \1d
+couÁ
+ = 0;
+
+67 \ f cڡ
+L\9ak
+ *
+ gl
+ =
+h\97d
+();\86 !ð0;\86 =
+l
+->
+Ãxt
+() )
+
+68 ++
+couÁ
+;
+
+69 \15
+ gcouÁ
+;
+
+72
+L\9ak
+ *
+ gLi¡
+::
+Áh
+Ð\1d
+n
+ )
+
+74
+L\9ak
+ *
+l
+ =
+h\97d
+();
+
+75 \1f
+ gn
+ -- )
+
+76
+ gl
+ =
+l
+->
+Ãxt
+();
+
+77 \15
+ gl
+;
+
+80 \1e
+ gLi¡
+::
+aùiv©eAÎ
+()
+
+82 \ f
+L\9ak
+ *
+l
+ =
+_h\97d
+;
+ gl
+ !ð0;\86 =\86->
+ju¡Next
+() )
+
+83
+l
+->
+£tAùive
+Ð
+\8cue
+ );
+
+86 \1e
+ gLi¡
+::
+ËaveOÆy
+ÐcÚ¡
+L\9ak
+ &
+l\9ak
+ )
+
+88 \ f
+L\9ak
+ *
+l
+ =
+h\97d
+();
+ gl
+ !ð0;\86 =\86->
+Ãxt
+() )
+
+89 iàÐ
+l
+ !ð&
+l\9ak
+ )
+
+90
+l
+->
+£tAùive
+Ð
+çl£
+ );
+
+93
+ gL\9ak
+::
+L\9ak
+() :
+
+94
+_Ãxt
+( 0 ),
+
+95
+_´ev
+( 0 ),
+
+96
+_aùive
+Ð
+\8cue
+ )
+
+100
+ gL\9ak
+::~
+L\9ak
+()
+
+104
+boÞ
+
+L\9ak
+::
+aùive
+() const
+
+106 \15
+_aùive
+;
+
+109 \1e
+ gL\9ak
+::
+£tAùive
+Ð
+boÞ
+
+v®ue
+ )
+
+111
+_aùive
+ =
+v®ue
+;
+
+114
+L\9ak
+ *
+ gL\9ak
+::
+ju¡Next
+()
+
+116 \15
+_Ãxt
+;
+
+119
+L\9ak
+ *
+ gL\9ak
+::
+ju¡P»v
+()
+
+121 \15
+_´ev
+;
+
+124
+L\9ak
+ *
+ gL\9ak
+::
+Ãxt
+()
+
+126
+L\9ak
+ *
+l
+ =
+_Ãxt
+;
+
+127 \1f
+ gl
+ && !l->
+ g_aùive
+ )
+
+128
+ gl
+ =
+l
+->
+_Ãxt
+;
+
+129 \15
+ gl
+;
+
+132
+L\9ak
+ *
+ gL\9ak
+::
+´ev
+()
+
+134
+L\9ak
+ *
+l
+ =
+_´ev
+;
+
+135 \1f
+ gl
+ && !l->
+ g_aùive
+ )
+
+136
+ gl
+ =
+l
+->
+_´ev
+;
+
+137 \15
+ gl
+;
+
+140 cڡ
+L\9ak
+ *
+ gL\9ak
+::
+Ãxt
+() const
+
+142
+L\9ak
+ *
+l
+ =
+_Ãxt
+;
+
+143 \1f
+ gl
+ && !l->
+ g_aùive
+ )
+
+144
+ gl
+ =
+l
+->
+_Ãxt
+;
+
+145 \15
+ gl
+;
+
+148 cڡ
+L\9ak
+ *
+ gL\9ak
+::
+´ev
+() const
+
+150
+L\9ak
+ *
+l
+ =
+_´ev
+;
+
+151 \1f
+ gl
+ && !l->
+ g_aùive
+ )
+
+152
+ gl
+ =
+l
+->
+_´ev
+;
+
+153 \15
+ gl
+;
+
+156 \1e
+ gL\9ak
+::
+©\8fch
+Ð
+Li¡
+ &
+l
+ )
+
+158 iàÐ
+l
+.
+_\8f\9e
+ )
+
+159
+l
+.
+_\8f\9e
+->
+_Ãxt
+ =
+this
+;
+
+161
+ g_´ev
+ =
+l
+.
+_\8f\9e
+;
+
+162
+ g_Ãxt
+ = 0;
+
+164 iàÐ
+ gl
+.
+ g_h\97d
+ == 0 )
+
+165
+l
+.
+_h\97d
+ =
+this
+;
+
+166
+ gl
+.
+ g_\8f\9e
+ =
+this
+;
+
+169 \1e
+ gL\9ak
+::
+d\91ach
+Ð
+Li¡
+ &
+l
+ )
+
+171 iàÐ
+_´ev
+ )
+
+172
+_´ev
+->
+_Ãxt
+ = _next;
+
+174
+ gl
+.
+ g_h\97d
+ =
+_Ãxt
+;
+
+176 iàÐ
+ g_Ãxt
+ )
+
+177
+ g_Ãxt
+->
+ g_´ev
+ =
+_´ev
+;
+
+179
+ gl
+.
+ g_\8f\9e
+ =
+_´ev
+;
+
+ @tools/cxxtest/cxxtest/LinkedList.h
+
+12 #iâdeà
+__cxx\8b¡__L\9akedLi¡_h__
+
+
+13 \ 1
+ #__cxx\8b¡__L\9akedLi¡_h__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19 \19
+ gLi¡
+;
+
+20
+þass
+
+ gL\9ak
+;
+
+22 \19
+ sLi¡
+
+
+24
+L\9ak
+ *
+ g_h\97d
+;
+
+25
+L\9ak
+ *
+ g_\8f\9e
+;
+
+27 \1e
+\9a\99\9flize
+();
+
+29
+L\9ak
+ *
+h\97d
+();
+
+30 cڡ
+L\9ak
+ *
+h\97d
+() const;
+
+31
+L\9ak
+ *
+\8f\9e
+();
+
+32 cڡ
+L\9ak
+ *
+\8f\9e
+() const;
+
+34
+boÞ
+
+em±y
+() const;
+
+35 \1d
+size
+() const;
+
+36
+L\9ak
+ *
+Áh
+Ð\1d
+n
+ );
+
+38 \1e
+aùiv©eAÎ
+();
+
+39 \1e
+ËaveOÆy
+ÐcÚ¡
+L\9ak
+ &
+l\9ak
+ );
+
+42 þas
+ cL\9ak
+
+
+44
+ gpublic
+:
+
+45
+L\9ak
+();
+
+46
+ gv\9ctu®
+ ~
+L\9ak
+();
+
+48
+boÞ
+
+aùive
+() const;
+
+49 \1e
+£tAùive
+Ð
+boÞ
+
+v®ue
+ =
+\8cue
+ );
+
+51
+L\9ak
+ *
+ju¡Next
+();
+
+52
+L\9ak
+ *
+ju¡P»v
+();
+
+54
+L\9ak
+ *
+Ãxt
+();
+
+55
+L\9ak
+ *
+´ev
+();
+
+56 cڡ
+L\9ak
+ *
+Ãxt
+() const;
+
+57 cڡ
+L\9ak
+ *
+´ev
+() const;
+
+59 \1e
+©\8fch
+Ð
+Li¡
+ &
+l
+ );
+
+60 \1e
+d\91ach
+Ð
+Li¡
+ &
+l
+ );
+
+62
+ g´iv©e
+:
+
+63
+L\9ak
+ *
+_Ãxt
+;
+
+64
+L\9ak
+ *
+ g_´ev
+;
+
+65
+boÞ
+
+ g_aùive
+;
+
+67
+L\9ak
+( const Link & );
+
+68
+ gL\9ak
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+L\9ak
+ & );
+
+ @tools/cxxtest/cxxtest/Mock.h
+
+12 #iâdeà
+__cxx\8b¡__Mock_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Mock_h__
+
+
+ )
+
+15
+Çme¥aû
+
+ gdummy_mock_ns
+ {}
+
+20 #iâdeà
+CXXTEST_MOCK_NAMESPACE
+
+
+21 \ 1
+ #CXXTEST_MOCK_NAMESPACE
+
+T
+
+
+ )
+
+27 \ 1
+ #__CXXTEST_MOCK__TRAITS
+ \
+
+28
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ \
+
+30
+\8bm¶©e
+<
+þass
+
+T
+> \
+
+31
+þass
+
+MockT¿\99s
+ \
+
+33
+public
+: \
+
+34 \18
+T
+
+ `deçuÉV®ue
+() { \15 0; } \
+
+36 }
+
+ )
+
+41 #ifdeà
+__ýlu¥lus
+
+
+42 \ 1
+ #CXXTEST_EXTERN_C
+ \r"C"
+
+ )
+
+44 \ 1
+ #CXXTEST_EXTERN_C
+
+
+ )
+
+50 \ 1
+ #__CXXTEST_MOCK__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+51
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ {
+TYPE
+
+NAME
+
+ARGS
+; }
+
+ )
+
+53 \ 1
+ #__CXXTEST_MOCK_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+54
+ `__CXXTEST_MOCK__PROTOTYPE
+Ð
+MOCK
+, \1e,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+56 \ 1
+ #__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+57
+TYPE
+
+REAL
+
+ARGS
+;
+
+ )
+
+59 \ 1
+ #__CXXTEST_SUPPLY_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+60
+ `__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+, \1e,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+65 \ 1
+ #__CXXTEST_MOCK__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+66
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+67
+þass
+
+Ba£_
+##
+MOCK
+ :
+public
+
+CxxTe¡
+::
+L\9ak
+ \
+
+69
+public
+: \
+
+70
+Ba£_
+##
+ `MOCK
+(); \
+
+71 ~
+Ba£_
+##
+ `MOCK
+(); \
+
+72
+boÞ
+
+ `£tUp
+(); \
+
+73
+boÞ
+
+ `\8b¬Down
+(); \
+
+75 \18
+Ba£_
+##
+MOCK
+ &
+ `cu¼\92t
+(); \
+
+77
+v\9ctu®
+
+TYPE
+
+NAME
+
+ARGS
+ = 0; \
+
+79
+´iv©e
+: \
+
+80 \18
+CxxTe¡
+::
+Li¡
+
+_li¡
+; \
+
+83
+þass
+
+R\97l_
+##
+MOCK
+ :
+public
+
+Ba£_
+##MOCK \
+
+85
+public
+: \
+
+86
+TYPE
+
+NAME
+
+ARGS
+; \
+
+89
+þass
+
+_Unim¶em\92\8bd_
+##
+MOCK
+ :
+public
+
+Ba£_
+##MOCK \
+
+91
+public
+: \
+
+92
+TYPE
+
+NAME
+
+ARGS
+; \
+
+94 }
+
+ )
+
+96 \ 1
+ #__CXXTEST_MOCK_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+97
+ `__CXXTEST_MOCK__CLASS_DECLARATION
+Ð
+MOCK
+, \1e,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+99 \ 1
+ #__CXXTEST_SUPPLY__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+100
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+101
+þass
+
+Ba£_
+##
+MOCK
+ :
+public
+
+CxxTe¡
+::
+L\9ak
+ \
+
+103
+public
+: \
+
+104
+Ba£_
+##
+ `MOCK
+(); \
+
+105 ~
+Ba£_
+##
+ `MOCK
+(); \
+
+106
+boÞ
+
+ `£tUp
+(); \
+
+107
+boÞ
+
+ `\8b¬Down
+(); \
+
+109 \18
+Ba£_
+##
+MOCK
+ &
+ `cu¼\92t
+(); \
+
+111
+v\9ctu®
+
+TYPE
+
+NAME
+
+ARGS
+ = 0; \
+
+113
+´iv©e
+: \
+
+114 \18
+CxxTe¡
+::
+Li¡
+
+_li¡
+; \
+
+117
+þass
+
+_Unim¶em\92\8bd_
+##
+MOCK
+ :
+public
+
+Ba£_
+##MOCK \
+
+119
+public
+: \
+
+120
+TYPE
+
+NAME
+
+ARGS
+; \
+
+122 }
+
+ )
+
+124 \ 1
+ #__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+125
+ `__CXXTEST_SUPPLY__CLASS_DECLARATION
+Ð
+MOCK
+, \1e,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+130 \ 1
+ #__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+ ) \
+
+131
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+133
+CxxTe¡
+::
+Li¡
+
+Ba£_
+##
+MOCK
+::
+_li¡
+ = { 0, 0 }; \
+
+135
+Ba£_
+##
+MOCK
+::Ba£_##
+ `MOCK
+(è{
+ `©\8fch
+Ð
+_li¡
+ ); } \
+
+136
+Ba£_
+##
+MOCK
+::~Ba£_##
+ `MOCK
+(è{
+ `d\91ach
+Ð
+_li¡
+ ); } \
+
+137
+boÞ
+
+Ba£_
+##
+MOCK
+::
+ `£tUp
+(è{ \15
+\8cue
+; } \
+
+138
+boÞ
+
+Ba£_
+##
+MOCK
+::
+ `\8b¬Down
+(è{ \15
+\8cue
+; } \
+
+140
+Ba£_
+##
+MOCK
+ &Ba£_##MOCK::
+ `cu¼\92t
+() \
+
+142 iàÐ
+_li¡
+.
+ `em±y
+() ) \
+
+143 \18
+_Unim¶em\92\8bd_
+##
+MOCK
+
+unim¶em\92\8bd
+; \
+
+144 \15 *(
+Ba£_
+##
+MOCK
+ *)
+_li¡
+.
+ `\8f\9e
+(); \
+
+146 }
+
+ )
+
+148 \ 1
+ #__CXXTEST_MOCK__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+149
+ `__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+ ) \
+
+150
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+151
+TYPE
+
+R\97l_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+153 \15
+REAL
+
+CALL
+; \
+
+156
+TYPE
+
+_Unim¶em\92\8bd_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+158 \1f
+çl£
+ ) \
+
+159 \15
+NAME
+
+CALL
+; \
+
+160
+ `__CXXTEST_MOCK_UNIMPLEMENTED
+Ð
+NAME
+,
+ARGS
+ ); \
+
+161 \15
+MockT¿\99s
+<
+TYPE
+>::
+ `deçuÉV®ue
+(); \
+
+164
+TYPE
+
+NAME
+
+ARGS
+ \
+
+166 \15
+Ba£_
+##
+MOCK
+::
+ `cu¼\92t
+().
+NAME
+
+CALL
+; \
+
+168 }
+
+ )
+
+170 \ 1
+ #__CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+171
+ `__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+ ) \
+
+172
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+173 \1e
+R\97l_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+175
+REAL
+
+CALL
+; \
+
+178 \1e
+_Unim¶em\92\8bd_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+180 \1f
+çl£
+ ) \
+
+181
+NAME
+
+CALL
+; \
+
+182
+ `__CXXTEST_MOCK_UNIMPLEMENTED
+Ð
+NAME
+,
+ARGS
+ ); \
+
+185 \1e
+NAME
+
+ARGS
+ \
+
+187
+Ba£_
+##
+MOCK
+::
+ `cu¼\92t
+().
+NAME
+
+CALL
+; \
+
+189 }
+
+ )
+
+191 \ 1
+ #__CXXTEST_SUPPLY__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+192
+ `__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+ ) \
+
+193
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+194
+TYPE
+
+_Unim¶em\92\8bd_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+196 \1f
+çl£
+ ) \
+
+197 \15
+NAME
+
+CALL
+; \
+
+198
+ `__CXXTEST_MOCK_UNIMPLEMENTED
+Ð
+NAME
+,
+ARGS
+ ); \
+
+199 \15
+MockT¿\99s
+<
+TYPE
+>::
+ `deçuÉV®ue
+(); \
+
+203
+TYPE
+
+REAL
+
+ARGS
+ \
+
+205 \15
+CXXTEST_MOCK_NAMESPACE
+::
+Ba£_
+##
+MOCK
+::
+ `cu¼\92t
+().
+NAME
+
+CALL
+; \
+
+206 }
+
+ )
+
+208 \ 1
+ #__CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+209
+ `__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+ ) \
+
+210
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \
+
+211 \1e
+_Unim¶em\92\8bd_
+##
+MOCK
+::
+NAME
+
+ARGS
+ \
+
+213 \1f
+çl£
+ ) \
+
+214
+NAME
+
+CALL
+; \
+
+215
+ `__CXXTEST_MOCK_UNIMPLEMENTED
+Ð
+NAME
+,
+ARGS
+ ); \
+
+219 \1e
+REAL
+
+ARGS
+ \
+
+221
+CXXTEST_MOCK_NAMESPACE
+::
+Ba£_
+##
+MOCK
+::
+ `cu¼\92t
+().
+NAME
+
+CALL
+; \
+
+223
+
+ )
+
+227 \ 1
+ #__CXXTEST_MOCK_UNIMPLEMENTED
+Ð
+NAME
+,
+ARGS
+ ) \
+
+228
+ `TS_FAIL
+Ð
+CXXTEST_MOCK_NAMESPACE_STR
+ #NAME #ARGS " called with\82o " \
+
+229
+CXXTEST_MOCK_NAMESPACE_STR
+ "Base_" #NAME " object" ); \
+
+230
+
+ )
+
+231 \ 1
+ #CXXTEST_MOCK_NAMESPACE_STR
+
+ `__CXXTEST_STR
+(
+CXXTEST_MOCK_NAMESPACE
+è"::"
+
+ )
+
+232 \ 1
+ #__CXXTEST_STR
+(
+X
+è
+ `__CXXTEST_XSTR
+(X)
+
+ )
+
+233 \ 1
+ #__CXXTEST_XSTR
+(
+X
+è#X
+
+ )
+
+235 #ià
+def\9aed
+(
+CXXTEST_MOCK_TEST_SOURCE_FILE
+)
+
+239 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+241
+ g__CXXTEST_MOCK__TRAITS
+
+
+243 \ 1
+ #CXXTEST_MOCK
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+244
+ `__CXXTEST_MOCK__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+245
+ `__CXXTEST_MOCK__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+246
+ `__CXXTEST_MOCK__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+247
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+249 \ 1
+ #CXXTEST_MOCK_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+250
+ `__CXXTEST_MOCK_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+251
+ `__CXXTEST_MOCK_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+252
+ `__CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+253
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+255 \ 1
+ #CXXTEST_SUPPLY
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+256
+ `__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+257
+ `__CXXTEST_SUPPLY__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+258
+ `__CXXTEST_SUPPLY__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+259
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+261 \ 1
+ #CXXTEST_SUPPLY_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+262
+ `__CXXTEST_SUPPLY_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+263
+ `__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+264
+ `__CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+265
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+267 #\96ià
+def\9aed
+(
+CXXTEST_FLAGS
+è|| def\9aed(
+CXXTEST_RUNNING
+)
+
+271 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+273
+ g__CXXTEST_MOCK__TRAITS
+;
+
+275 \ 1
+ #CXXTEST_MOCK
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+276
+ `__CXXTEST_MOCK__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+277
+ `__CXXTEST_MOCK__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+278
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+280 \ 1
+ #CXXTEST_MOCK_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+281
+ `__CXXTEST_MOCK_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+282
+ `__CXXTEST_MOCK_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+283
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+285 \ 1
+ #CXXTEST_SUPPLY
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+286
+ `__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+287
+ `__CXXTEST_SUPPLY__CLASS_DECLARATION
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+288
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+290 \ 1
+ #CXXTEST_SUPPLY_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+291
+ `__CXXTEST_SUPPLY_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+292
+ `__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+293
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+295 #\96ià
+def\9aed
+(
+CXXTEST_MOCK_REAL_SOURCE_FILE
+)
+
+299 \ 1
+ #CXXTEST_MOCK
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+300
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ {
+TYPE
+
+NAME
+
+ARGS
+ { \15
+REAL
+
+CALL
+; } }
+us\9ag
+\82ame¥aû
+dummy_mock_ns
+
+
+ )
+
+302 \ 1
+ #CXXTEST_MOCK_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+303
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ { \1e
+NAME
+
+ARGS
+ {
+REAL
+
+CALL
+; } }
+us\9ag
+\82ame¥aû
+dummy_mock_ns
+
+
+ )
+
+310 \ 1
+ #CXXTEST_MOCK
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+311
+ `__CXXTEST_MOCK__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+312
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+314 \ 1
+ #CXXTEST_MOCK_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+315
+ `__CXXTEST_MOCK_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+316
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+318 \ 1
+ #CXXTEST_SUPPLY
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+319
+ `__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+320
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+322 \ 1
+ #CXXTEST_SUPPLY_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+323
+ `__CXXTEST_SUPPLY_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+324
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+331 \ 1
+ #CXXTEST_SUPPLY_C
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+332
+CXXTEST_EXTERN_C
+
+ `__CXXTEST_SUPPLY__PROTOTYPE
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+333
+ `CXXTEST_SUPPLY
+Ð
+MOCK
+,
+TYPE
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+335 \ 1
+ #CXXTEST_SUPPLY_VOID_C
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+336
+CXXTEST_EXTERN_C
+
+ `__CXXTEST_SUPPLY_VOID__PROTOTYPE
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ ) \
+
+337
+ `CXXTEST_SUPPLY_VOID
+Ð
+MOCK
+,
+NAME
+,
+ARGS
+,
+REAL
+,
+CALL
+ )
+
+ )
+
+342 \ 1
+ #CXXTEST_MOCK_GLOBAL
+Ð
+TYPE
+,
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+343
+ `CXXTEST_MOCK
+Ð
+NAME
+,
+TYPE
+, NAME,
+ARGS
+, ::NAME,
+CALL
+ )
+
+ )
+
+345 \ 1
+ #CXXTEST_MOCK_VOID_GLOBAL
+Ð
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+346
+ `CXXTEST_MOCK_VOID
+Ð
+NAME
+, NAME,
+ARGS
+, ::NAME,
+CALL
+ )
+
+ )
+
+348 \ 1
+ #CXXTEST_SUPPLY_GLOBAL
+Ð
+TYPE
+,
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+349
+ `CXXTEST_SUPPLY
+Ð
+NAME
+,
+TYPE
+, NAME,
+ARGS
+, NAME,
+CALL
+ )
+
+ )
+
+351 \ 1
+ #CXXTEST_SUPPLY_VOID_GLOBAL
+Ð
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+352
+ `CXXTEST_SUPPLY_VOID
+Ð
+NAME
+, NAME,
+ARGS
+, NAME,
+CALL
+ )
+
+ )
+
+354 \ 1
+ #CXXTEST_SUPPLY_GLOBAL_C
+Ð
+TYPE
+,
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+355
+ `CXXTEST_SUPPLY_C
+Ð
+NAME
+,
+TYPE
+, NAME,
+ARGS
+, NAME,
+CALL
+ )
+
+ )
+
+357 \ 1
+ #CXXTEST_SUPPLY_VOID_GLOBAL_C
+Ð
+NAME
+,
+ARGS
+,
+CALL
+ ) \
+
+358
+ `CXXTEST_SUPPLY_VOID_C
+Ð
+NAME
+, NAME,
+ARGS
+, NAME,
+CALL
+ )
+
+ )
+
+364 \ 1
+ #CXXTEST_MOCK_DEFAULT_VALUE
+Ð
+TYPE
+,
+VALUE
+ ) \
+
+365
+Çme¥aû
+
+CXXTEST_MOCK_NAMESPACE
+ \
+
+367
+\8bm¶©e
+<> \
+
+368
+þass
+
+MockT¿\99s
+<
+TYPE
+> \
+
+370
+public
+: \
+
+371 \18
+TYPE
+
+ `deçuÉV®ue
+(è{ \15
+VALUE
+; } \
+
+373 }
+us\9ag
+
+Çme¥aû
+
+dummy_mock_ns
+
+
+ )
+
+ @tools/cxxtest/cxxtest/ParenPrinter.h
+
+12 #iâdeà
+__cxx\8b¡__P¬\92Pr\9a\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__P¬\92Pr\9a\8br_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/E¼ÜPr\9a\8br.h
+>
+
+23
+Çme¥aû
+
+ gCxxTe¡
+
+
+25 þas
+ cP¬\92Pr\9a\8br
+ :
+public
+
+E¼ÜPr\9a\8br
+
+
+27
+public
+:
+
+28
+P¬\92Pr\9a\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ = CXXTEST_STD(
+cout
+èè:
+E¼ÜPr\9a\8br
+( o, "(", ")" ) {}
+
+ @tools/cxxtest/cxxtest/QtGui.h
+
+12 #iâdeà
+__cxx\8b¡__QtGui_h__
+
+
+13 \ 1
+ #__cxx\8b¡__QtGui_h__
+
+
+ )
+
+28 \ 2
+ ~<cxx\8b¡/Gui.h
+>
+
+30 \ 2
+ ~<q¶iÿtiÚ.h
+>
+
+31 \ 2
+ ~<qglob®.h
+>
+
+32 \ 2
+ ~<qÏb\96.h
+>
+
+33 \ 2
+ ~<qÏyout.h
+>
+
+34 \ 2
+ ~<qmes§gebox.h
+>
+
+35 \ 2
+ ~<qpixm.h
+>
+
+36 \ 2
+ ~<q´og»ssb¬.h
+>
+
+37 \ 2
+ ~<q¡©usb¬.h
+>
+
+39
+Çme¥aû
+
+ gCxxTe¡
+
+
+41 þas
+ cQtGui
+ :
+public
+
+GuiLi¡\92\94
+
+
+43
+public
+:
+
+44 \1e
+\92\8brGui
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+46
+·r£CommªdL\9ae
+Ð
+¬gc
+,
+¬gv
+ );
+
+47
+ü\97\8bAµliÿtiÚ
+Ð
+¬gc
+,
+¬gv
+ );
+
+50 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+52
+ü\97\8bW\9adow
+Ð
+wd
+ );
+
+53
+´oûssEv\92ts
+();
+
+56 \1e
+guiEÁ\94Su\99e
+ÐcÚ¡ \ 5*
+su\99eName
+ )
+
+58
+showSu\99eName
+Ð
+su\99eName
+ );
+
+61 \1e
+guiEÁ\94Te¡
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+63
+£tCtiÚ
+Ð
+su\99eName
+,
+\8b¡Name
+ );
+
+64
+advªûProg»ssB¬
+();
+
+65
+showTe¡Name
+Ð
+\8b¡Name
+ );
+
+66
+showTe¡sDÚe
+Ð
+_´og»ssB¬
+->
+´og»ss
+() );
+
+67
+´oûssEv\92ts
+();
+
+70 \1e
+y\96lowB¬
+()
+
+72
+£tCÞÜ
+( 255, 255, 0 );
+
+73
+£tIcÚ
+Ð
+QMes§geBox
+::
+W¬n\9ag
+ );
+
+74
+g\91TÙ®Te¡s
+();
+
+75
+´oûssEv\92ts
+();
+
+78 \1e
+»dB¬
+()
+
+80 iàÐ
+ g_¡¬tM\9aimized
+ &&
+ g_ma\9aW\9adow
+->
+isM\9aimized
+() )
+
+81
+showNÜm®
+();
+
+82
+£tCÞÜ
+( 255, 0, 0 );
+
+83
+£tIcÚ
+Ð
+QMes§geBox
+::
+Cr\99iÿl
+ );
+
+84
+g\91TÙ®Te¡s
+();
+
+85
+´oûssEv\92ts
+();
+
+88 \1e
+ËaveGui
+()
+
+90 iàÐ
+k\93p
+() ) {
+
+91
+showSumm¬y
+();
+
+92
+ g_¶iÿtiÚ
+->
+exec
+();
+
+95
+ g_ma\9aW\9adow
+->
+þo£
+Ð
+\8cue
+ );
+
+98
+ g´iv©e
+:
+
+99
+QS\8c\9ag
+
+_t\99Ë
+;
+
+100
+boÞ
+
+ g_¡¬tM\9aimized
+,
+ g_k\93p
+;
+
+101 \1d
+ g_numTÙ®Te¡s
+;
+
+102
+QS\8c\9ag
+
+ g_¡rTÙ®Te¡s
+;
+
+103
+QAµliÿtiÚ
+ *
+ g_¶iÿtiÚ
+;
+
+104
+QWidg\91
+ *
+ g_ma\9aW\9adow
+;
+
+105
+QVBoxLayout
+ *
+ g_Ïyout
+;
+
+106
+QProg»ssB¬
+ *
+ g_´og»ssB¬
+;
+
+107
+QS\8ftusB¬
+ *
+ g_¡©usB¬
+;
+
+108
+QLab\96
+ *
+ g_su\99eName
+, *
+ g_\8b¡Name
+, *
+ g_\8b¡sDÚe
+;
+
+110 \1e
+·r£CommªdL\9ae
+Ð\12
+¬gc
+, \ 5**
+¬gv
+ )
+
+112
+ g_¡¬tM\9aimized
+ =
+_k\93p
+ =
+çl£
+;
+
+113
+ g_t\99Ë
+ =
+¬gv
+[0];
+
+115 \ f \12
+ gi
+ = 1; i <
+ g¬gc
+; ++ i ) {
+
+116
+QS\8c\9ag
+
+¬g
+Ð
+¬gv
+[
+i
+] );
+
+117 iàÐ
+ g¬g
+ == "-minimized" )
+
+118
+_¡¬tM\9aimized
+ =
+\8cue
+;
+
+119 \viàÐ
+ g¬g
+ == "-keep" )
+
+120
+_k\93p
+ =
+\8cue
+;
+
+121 \viàÐ
+ g¬g
+ =ð"-t\99Ë" && (
+i
+ + 1 <
+¬gc
+) )
+
+122
+_t\99Ë
+ =
+¬gv
+[++
+i
+];
+
+126 \1e
+ü\97\8bAµliÿtiÚ
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+128
+ g_¶iÿtiÚ
+ =
+Ãw
+
+QAµliÿtiÚ
+Ð
+¬gc
+,
+¬gv
+ );
+
+131 \1e
+ü\97\8bW\9adow
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+133
+g\91TÙ®Te¡s
+Ð
+wd
+ );
+
+134
+ü\97\8bMa\9aW\9adow
+();
+
+135
+ü\97\8bProg»ssB¬
+();
+
+136
+ü\97\8bS\8ftusB¬
+();
+
+137
+£tMa\9aWidg\91
+();
+
+138 iàÐ
+ g_¡¬tM\9aimized
+ )
+
+139
+showM\9aimized
+();
+
+141
+showNÜm®
+();
+
+144 \1e
+g\91TÙ®Te¡s
+()
+
+146
+g\91TÙ®Te¡s
+Ð
+\8cack\94
+().
+wÜld
+() );
+
+149 \1e
+g\91TÙ®Te¡s
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+151
+ g_numTÙ®Te¡s
+ =
+wd
+.
+numTÙ®Te¡s
+();
+
+152 \ 5
+ gs
+[
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+153
+ g_¡rTÙ®Te¡s
+ =
+wd
+.
+¡rTÙ®Te¡s
+Ð
+s
+ );
+
+156 \1e
+ü\97\8bMa\9aW\9adow
+()
+
+158
+ g_ma\9aW\9adow
+ =
+Ãw
+
+QWidg\91
+();
+
+159
+ g_Ïyout
+ =
+Ãw
+
+QVBoxLayout
+Ð
+_ma\9aW\9adow
+ );
+
+162 \1e
+ü\97\8bProg»ssB¬
+()
+
+164
+ g_Ïyout
+->
+addWidg\91
+Ð
+_´og»ssB¬
+ =
+Ãw
+
+QProg»ssB¬
+Ð
+_numTÙ®Te¡s
+,
+_ma\9aW\9adow
+ ) );
+
+165
+ g_´og»ssB¬
+->
+£tProg»ss
+( 0 );
+
+166
+£tCÞÜ
+( 0, 255, 0 );
+
+167
+£tIcÚ
+Ð
+QMes§geBox
+::
+InfÜm©iÚ
+ );
+
+170 \1e
+ü\97\8bS\8ftusB¬
+()
+
+172
+ g_Ïyout
+->
+addWidg\91
+Ð
+_¡©usB¬
+ =
+Ãw
+
+QS\8ftusB¬
+Ð
+_ma\9aW\9adow
+ ) );
+
+173
+ g_¡©usB¬
+->
+addWidg\91
+Ð
+_su\99eName
+ =
+Ãw
+
+QLab\96
+Ð
+_¡©usB¬
+ ), 2 );
+
+174
+ g_¡©usB¬
+->
+addWidg\91
+Ð
+_\8b¡Name
+ =
+Ãw
+
+QLab\96
+Ð
+_¡©usB¬
+ ), 4 );
+
+175
+ g_¡©usB¬
+->
+addWidg\91
+Ð
+_\8b¡sDÚe
+ =
+Ãw
+
+QLab\96
+Ð
+_¡©usB¬
+ ), 1 );
+
+178 \1e
+£tMa\9aWidg\91
+()
+
+180
+ g_¶iÿtiÚ
+->
+£tMa\9aWidg\91
+Ð
+_ma\9aW\9adow
+ );
+
+183 \1e
+showM\9aimized
+()
+
+185
+ g_ma\9aW\9adow
+->
+showM\9aimized
+();
+
+188 \1e
+showNÜm®
+()
+
+190
+ g_ma\9aW\9adow
+->
+showNÜm®
+();
+
+191
+ûÁ\94W\9adow
+();
+
+194 \1e
+£tCtiÚ
+ÐcÚ¡
+QS\8c\9ag
+ &
+su\99eName
+, cÚ¡ QS\8c\9ag &
+\8b¡Name
+ )
+
+196
+ g_ma\9aW\9adow
+->
+£tCtiÚ
+Ð
+_t\99Ë
+ + " - " +
+su\99eName
+ + "::" +
+\8b¡Name
+ + "()" );
+
+199 \1e
+showSu\99eName
+ÐcÚ¡
+QS\8c\9ag
+ &
+su\99eName
+ )
+
+201
+ g_su\99eName
+->
+£tText
+Ð"þas " +
+su\99eName
+ );
+
+204 \1e
+advªûProg»ssB¬
+()
+
+206
+ g_´og»ssB¬
+->
+£tProg»ss
+Ð
+_´og»ssB¬
+->
+´og»ss
+() + 1 );
+
+209 \1e
+showTe¡Name
+ÐcÚ¡
+QS\8c\9ag
+ &
+\8b¡Name
+ )
+
+211
+ g_\8b¡Name
+->
+£tText
+Ð
+\8b¡Name
+ + "()" );
+
+214 \1e
+showTe¡sDÚe
+Ð\1d
+\8b¡sDÚe
+ )
+
+216
+ g_\8b¡sDÚe
+->
+£tText
+Ð
+asS\8c\9ag
+Ð
+\8b¡sDÚe
+ ) + " oà" +
+_¡rTÙ®Te¡s
+ );
+
+219 \18
+QS\8c\9ag
+
+asS\8c\9ag
+Ð\1d
+n
+ )
+
+221 \15
+ gQS\8c\9ag
+::
+numb\94
+Ð
+n
+ );
+
+224 \1e
+£tCÞÜ
+Ð\12
+r
+, \12
+g
+, \12
+b
+ )
+
+226
+QP®\91\8b
+
+ g·Ë\89e
+ =
+_´og»ssB¬
+->
+·Ë\89e
+();
+
+227
+ g·Ë\89e
+.
+£tCÞÜ
+Ð
+QCÞÜGroup
+::
+Highlight
+,
+QCÞÜ
+Ð
+r
+,
+g
+,
+b
+ ) );
+
+228
+ g_´og»ssB¬
+->
+£tP®\91\8b
+Ð
+·Ë\89e
+ );
+
+231 \1e
+£tIcÚ
+Ð
+QMes§geBox
+::
+IcÚ
+
+icÚ
+ )
+
+233 #ià
+QT_VERSION
+ >= 0x030000
+
+234
+_ma\9aW\9adow
+->
+£tIcÚ
+Ð
+QMes§geBox
+::
+¡ªd¬dIcÚ
+Ð
+icÚ
+ ) );
+
+236
+ g_ma\9aW\9adow
+->
+£tIcÚ
+Ð
+QMes§geBox
+::
+¡ªd¬dIcÚ
+Ð
+icÚ
+,
+QAµliÿtiÚ
+::
+¡yË
+().
+guiStyË
+() ) );
+
+240 \1e
+´oûssEv\92ts
+()
+
+242
+ g_¶iÿtiÚ
+->
+´oûssEv\92ts
+();
+
+245 \1e
+ûÁ\94W\9adow
+()
+
+247
+QWidg\91
+ *
+ gdesktÝ
+ =
+QAµliÿtiÚ
+::
+desktÝ
+();
+
+248 \12
+ gxC\92\8br
+ =
+desktÝ
+->
+x
+(è+ (desktÝ->
+width
+() / 2);
+
+249 \12
+ gyC\92\8br
+ =
+desktÝ
+->
+y
+(è+ (desktÝ->
+height
+() / 2);
+
+251 \12
+ gw\9adowWidth
+ = (
+desktÝ
+->
+width
+() * 4) / 5;
+
+252 \12
+ gw\9adowHeight
+ =
+_ma\9aW\9adow
+->
+height
+();
+
+253
+ g_ma\9aW\9adow
+->
+£tGeom\91ry
+Ð
+xC\92\8br
+ - (
+w\9adowWidth
+ / 2),
+yC\92\8br
+ - (
+w\9adowHeight
+ / 2), windowWidth, windowHeight );
+
+256
+boÞ
+
+k\93p
+()
+
+258 iàÐ!
+ g_k\93p
+ )
+
+259 \15
+ gçl£
+;
+
+260 iàÐ!
+ g_¡¬tM\9aimized
+ )
+
+261 \15
+ g\8cue
+;
+
+262 \15 (
+ g_ma\9aW\9adow
+ =ð
+_¶iÿtiÚ
+->
+aùiveW\9adow
+());
+
+265 \1e
+showSumm¬y
+()
+
+267
+QS\8c\9ag
+
+ gsumm¬y
+ =
+_¡rTÙ®Te¡s
+ + (
+_numTÙ®Te¡s
+ == 1 ? "\81est" : "\81ests");
+
+268 iàÐ
+\8cack\94
+().
+ç\9eedTe¡s
+() )
+
+269
+ gsumm¬y
+ = "Fa\9eed " +
+asS\8c\9ag
+Ð
+\8cack\94
+().
+ç\9eedTe¡s
+(èè+ " oà" +
+summ¬y
+;
+
+271
+ gsumm¬y
+ =
+summ¬y
+ + "\85assed";
+
+273
+ g_ma\9aW\9adow
+->
+£tCtiÚ
+Ð
+_t\99Ë
+ + " - " +
+summ¬y
+ );
+
+275
+ g_¡©usB¬
+->
+»moveWidg\91
+Ð
+_su\99eName
+ );
+
+276
+ g_¡©usB¬
+->
+»moveWidg\91
+Ð
+_\8b¡Name
+ );
+
+277
+ g_\8b¡sDÚe
+->
+£tText
+Ð
+summ¬y
+ );
+
+ @tools/cxxtest/cxxtest/RealDescriptions.cpp
+
+12 #iâdeà
+__cxx\8b¡__R\97lDesü\9dtiÚs_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__R\97lDesü\9dtiÚs_ýp__
+
+
+ )
+
+20 \ 2
+ ~<cxx\8b¡/R\97lDesü\9dtiÚs.h
+>
+
+22
+Çme¥aû
+
+ gCxxTe¡
+
+
+24
+ gR\97lTe¡Desü\9dtiÚ
+::
+R\97lTe¡Desü\9dtiÚ
+()
+
+28
+R\97lTe¡Desü\9dtiÚ
+::R\97lTe¡Desü\9dtiÚÐ
+Li¡
+ &
+¬gLi¡
+,
+
+29
+Su\99eDesü\9dtiÚ
+ &
+¬gSu\99e
+,
+
+30 \1d
+¬gL\9ae
+,
+
+31 cڡ \ 5*
+¬gTe¡Name
+ )
+
+33
+\9a\99\9flize
+Ð
+¬gLi¡
+,
+¬gSu\99e
+,
+¬gL\9ae
+,
+¬gTe¡Name
+ );
+
+36 \1e
+ gR\97lTe¡Desü\9dtiÚ
+::
+\9a\99\9flize
+Ð
+Li¡
+ &
+¬gLi¡
+,
+
+37
+Su\99eDesü\9dtiÚ
+ &
+¬gSu\99e
+,
+
+38 \1d
+¬gL\9ae
+,
+
+39 cڡ \ 5*
+¬gTe¡Name
+ )
+
+41
+ g_su\99e
+ = &
+¬gSu\99e
+;
+
+42
+ g_l\9ae
+ =
+¬gL\9ae
+;
+
+43
+ g_\8b¡Name
+ =
+¬gTe¡Name
+;
+
+44
+©\8fch
+Ð
+¬gLi¡
+ );
+
+47
+boÞ
+
+ gR\97lTe¡Desü\9dtiÚ
+::
+£tUp
+()
+
+49 iàÐ!
+su\99e
+() )
+
+50 \15
+çl£
+;
+
+52 \ f
+Glob®Fixtu»
+ *
+ ggf
+ = Glob®Fixtu»::
+f\9c¡Glob®Fixtu»
+(); gà!ð0; gàð
+gf
+->
+ÃxtGlob®Fixtu»
+() ) {
+
+53
+boÞ
+
+ok
+;
+
+54
+ g_TS_TRY
+ {
+ gok
+ =
+gf
+->
+£tUp
+(); }
+
+55
+_TS_LAST_CATCH
+Ð{
+ok
+ =
+çl£
+; } );
+
+57 iàÐ!
+ gok
+ ) {
+
+58
+doFa\9eTe¡
+Ð
+f\9ee
+(),
+l\9ae
+(), "Error in GlobalFixture::setUp()" );
+
+59 \15
+ gçl£
+;
+
+63
+ g_TS_TRY
+ {
+
+64
+boÞ
+
+ gok
+ =
+çl£
+;
+
+65
+_TSM_ASSERT_THROWS_NOTHING
+Ð
+f\9ee
+(),
+l\9ae
+(), "Exû±iÚ\81hrowÀäom s\91Up()",
+su\99e
+()->
+£tUp
+();
+ok
+=
+\8cue
+ );
+
+66 ià(
+ gok
+ =ð
+çl£
+è\15
+ok
+;
+
+68
+_TS_CATCH_ABORT
+Ð{ \15
+çl£
+; } );
+
+70 \15
+ g\8cue
+;
+
+73
+boÞ
+
+ gR\97lTe¡Desü\9dtiÚ
+::
+\8b¬Down
+()
+
+75 iàÐ!
+su\99e
+() )
+
+76 \15
+çl£
+;
+
+78
+ g_TS_TRY
+ {
+
+79
+_TSM_ASSERT_THROWS_NOTHING
+Ð
+f\9ee
+(),
+l\9ae
+(), "Exû±iÚ\81hrowÀäom\81\97rDown()",
+su\99e
+()->
+\8b¬Down
+() );
+
+81
+_TS_CATCH_ABORT
+Ð{ \15
+çl£
+; } );
+
+83 \ f
+Glob®Fixtu»
+ *
+ ggf
+ = Glob®Fixtu»::
+Ï¡Glob®Fixtu»
+(); gà!ð0; gàð
+gf
+->
+´evGlob®Fixtu»
+() ) {
+
+84
+boÞ
+
+ok
+;
+
+85
+ g_TS_TRY
+ {
+ gok
+ =
+gf
+->
+\8b¬Down
+(); }
+
+86
+_TS_LAST_CATCH
+Ð{
+ok
+ =
+çl£
+; } );
+
+88 iàÐ!
+ gok
+ ) {
+
+89
+doFa\9eTe¡
+Ð
+f\9ee
+(),
+l\9ae
+(), "Error in GlobalFixture::tearDown()" );
+
+90 \15
+ gçl£
+;
+
+94 \15
+ g\8cue
+;
+
+97 cڡ \ 5*
+ gR\97lTe¡Desü\9dtiÚ
+::
+f\9ee
+(ècÚ¡ { \15
+_su\99e
+->file(); }
+
+98 \12
+ gR\97lTe¡Desü\9dtiÚ
+::
+l\9ae
+(ècÚ¡ { \15
+_l\9ae
+; }
+
+99 cڡ \ 5*
+ gR\97lTe¡Desü\9dtiÚ
+::
+\8b¡Name
+(ècÚ¡ { \15
+_\8b¡Name
+; }
+
+100 cڡ \ 5*
+ gR\97lTe¡Desü\9dtiÚ
+::
+su\99eName
+(ècÚ¡ { \15
+_su\99e
+->suiteName(); }
+
+102
+Te¡Desü\9dtiÚ
+ *
+ gR\97lTe¡Desü\9dtiÚ
+::
+Ãxt
+(è{ \15 (
+R\97lTe¡Desü\9dtiÚ
+ *)
+L\9ak
+::next(); }
+
+103 cڡ
+Te¡Desü\9dtiÚ
+ *
+ gR\97lTe¡Desü\9dtiÚ
+::
+Ãxt
+(ècÚ¡ { \15 (cÚ¡
+R\97lTe¡Desü\9dtiÚ
+ *)
+L\9ak
+::next(); }
+
+105
+Te¡Su\99e
+ *
+ gR\97lTe¡Desü\9dtiÚ
+::
+su\99e
+(ècÚ¡ { \15
+_su\99e
+->suite(); }
+
+107 \1e
+ gR\97lTe¡Desü\9dtiÚ
+::
+run
+()
+
+109
+_TS_TRY
+ {
+runTe¡
+(); }
+
+110
+_TS_CATCH_ABORT
+( {} )
+
+111
+___TSM_CATCH
+Ð
+f\9ee
+(),
+l\9ae
+(), "Exception\81hrown from\81est" );
+
+114
+ gR\97lSu\99eDesü\9dtiÚ
+::
+R\97lSu\99eDesü\9dtiÚ
+() {}
+
+115
+R\97lSu\99eDesü\9dtiÚ
+::R\97lSu\99eDesü\9dtiÚÐcÚ¡ \ 5*
+¬gF\9ee
+,
+
+116 \1d
+¬gL\9ae
+,
+
+117 cڡ \ 5*
+¬gSu\99eName
+,
+
+118
+Li¡
+ &
+¬gTe¡s
+ )
+
+120
+\9a\99\9flize
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+ );
+
+123 \1e
+ gR\97lSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+,
+
+124 \1d
+¬gL\9ae
+,
+
+125 cڡ \ 5*
+¬gSu\99eName
+,
+
+126
+Li¡
+ &
+¬gTe¡s
+ )
+
+128
+ g_f\9ee
+ =
+¬gF\9ee
+;
+
+129
+ g_l\9ae
+ =
+¬gL\9ae
+;
+
+130
+ g_su\99eName
+ =
+¬gSu\99eName
+;
+
+131
+ g_\8b¡s
+ = &
+¬gTe¡s
+;
+
+133
+©\8fch
+Ð
+_su\99es
+ );
+
+136 cڡ \ 5*
+ gR\97lSu\99eDesü\9dtiÚ
+::
+f\9ee
+(ècÚ¡ { \15
+_f\9ee
+; }
+
+137 \12
+ gR\97lSu\99eDesü\9dtiÚ
+::
+l\9ae
+(ècÚ¡ { \15
+_l\9ae
+; }
+
+138 cڡ \ 5*
+ gR\97lSu\99eDesü\9dtiÚ
+::
+su\99eName
+(ècÚ¡ { \15
+_su\99eName
+; }
+
+140
+Te¡Desü\9dtiÚ
+ *
+ gR\97lSu\99eDesü\9dtiÚ
+::
+f\9c¡Te¡
+(è{ \15 (
+R\97lTe¡Desü\9dtiÚ
+ *)
+_\8b¡s
+->
+h\97d
+(); }
+
+141 cڡ
+Te¡Desü\9dtiÚ
+ *
+ gR\97lSu\99eDesü\9dtiÚ
+::
+f\9c¡Te¡
+(ècÚ¡ { \15 (cÚ¡
+R\97lTe¡Desü\9dtiÚ
+ *)
+_\8b¡s
+->
+h\97d
+(); }
+
+142
+Su\99eDesü\9dtiÚ
+ *
+ gR\97lSu\99eDesü\9dtiÚ
+::
+Ãxt
+(è{ \15 (
+R\97lSu\99eDesü\9dtiÚ
+ *)
+L\9ak
+::next(); }
+
+143 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gR\97lSu\99eDesü\9dtiÚ
+::
+Ãxt
+(ècÚ¡ { \15 (cÚ¡
+R\97lSu\99eDesü\9dtiÚ
+ *)
+L\9ak
+::next(); }
+
+145 \1d
+ gR\97lSu\99eDesü\9dtiÚ
+::
+numTe¡s
+(ècÚ¡ { \15
+_\8b¡s
+->
+size
+(); }
+
+147 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+ gR\97lSu\99eDesü\9dtiÚ
+::
+\8b¡Desü\9dtiÚ
+Ð\1d
+i
+ ) const
+
+149 \15 *(
+R\97lTe¡Desü\9dtiÚ
+ *)
+_\8b¡s
+->
+Áh
+Ð
+i
+ );
+
+152 \1e
+ gR\97lSu\99eDesü\9dtiÚ
+::
+aùiv©eAÎTe¡s
+()
+
+154
+_\8b¡s
+->
+aùiv©eAÎ
+();
+
+157
+boÞ
+
+ gR\97lSu\99eDesü\9dtiÚ
+::
+ËaveOÆy
+ÐcÚ¡ \ 5*
+\8b¡Name
+ )
+
+159 \ f
+Te¡Desü\9dtiÚ
+ *
+td
+ =
+f\9c¡Te¡
+();
+ gtd
+ !ð0;\81d =\81d->
+Ãxt
+() ) {
+
+160 iàÐ
+¡r\9agsEqu®
+Ð
+td
+->
+\8b¡Name
+(),\81estName ) ) {
+
+161
+_\8b¡s
+->
+ËaveOÆy
+Ð*
+td
+ );
+
+162 \15
+ g\8cue
+;
+
+165 \15
+ gçl£
+;
+
+168
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+S\8fticSu\99eDesü\9dtiÚ
+() {}
+
+169
+S\8fticSu\99eDesü\9dtiÚ
+::S\8fticSu\99eDesü\9dtiÚÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+170 cڡ \ 5*
+¬gSu\99eName
+,
+Te¡Su\99e
+ &
+¬gSu\99e
+,
+
+171
+Li¡
+ &
+¬gTe¡s
+ ) :
+
+172
+R\97lSu\99eDesü\9dtiÚ
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+ )
+
+174
+doIn\99\9flize
+Ð
+¬gSu\99e
+ );
+
+177 \1e
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+178 cڡ \ 5*
+¬gSu\99eName
+,
+Te¡Su\99e
+ &
+¬gSu\99e
+,
+
+179
+Li¡
+ &
+¬gTe¡s
+ )
+
+181
+ gR\97lSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+ );
+
+182
+doIn\99\9flize
+Ð
+¬gSu\99e
+ );
+
+185 \1e
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+doIn\99\9flize
+Ð
+Te¡Su\99e
+ &
+¬gSu\99e
+ )
+
+187
+_su\99e
+ = &
+¬gSu\99e
+;
+
+190
+Te¡Su\99e
+ *
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+su\99e
+() const
+
+192 \15
+_su\99e
+;
+
+195
+boÞ
+
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+£tUp
+(è{ \15
+\8cue
+; }
+
+196
+boÞ
+
+ gS\8fticSu\99eDesü\9dtiÚ
+::
+\8b¬Down
+(è{ \15
+\8cue
+; }
+
+198
+ gCommÚDyÇmicSu\99eDesü\9dtiÚ
+::
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+() {}
+
+199
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+::CommÚDyÇmicSu\99eDesü\9dtiÚÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+200 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+201 \1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ ) :
+
+202
+R\97lSu\99eDesü\9dtiÚ
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+ )
+
+204
+doIn\99\9flize
+Ð
+¬gC»©eL\9ae
+,
+¬gDe¡royL\9ae
+ );
+
+207 \1e
+ gCommÚDyÇmicSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+208 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+209 \1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ )
+
+211
+ gR\97lSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+ );
+
+212
+doIn\99\9flize
+Ð
+¬gC»©eL\9ae
+,
+¬gDe¡royL\9ae
+ );
+
+215 \1e
+ gCommÚDyÇmicSu\99eDesü\9dtiÚ
+::
+doIn\99\9flize
+Ð\1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ )
+
+217
+ g_ü\97\8bL\9ae
+ =
+¬gC»©eL\9ae
+;
+
+218
+ g_de¡royL\9ae
+ =
+¬gDe¡royL\9ae
+;
+
+221
+ gLi¡
+ &
+ gR\97lWÜldDesü\9dtiÚ
+::
+su\99es
+()
+
+223 \15
+R\97lSu\99eDesü\9dtiÚ
+::
+_su\99es
+;
+
+226 \1d
+ gR\97lWÜldDesü\9dtiÚ
+::
+numSu\99es
+( \1e) const
+
+228 \15
+su\99es
+().
+size
+();
+
+231 \1d
+ gR\97lWÜldDesü\9dtiÚ
+::
+numTÙ®Te¡s
+( \1e) const
+
+233 \1d
+couÁ
+ = 0;
+
+234 \ f cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gsd
+ =
+f\9c¡Su\99e
+(); sd !ð0; sd =
+sd
+->
+Ãxt
+() )
+
+235
+couÁ
+ +ð
+sd
+->
+numTe¡s
+();
+
+236 \15
+ gcouÁ
+;
+
+239
+Su\99eDesü\9dtiÚ
+ *
+ gR\97lWÜldDesü\9dtiÚ
+::
+f\9c¡Su\99e
+()
+
+241 \15 (
+R\97lSu\99eDesü\9dtiÚ
+ *)
+su\99es
+().
+h\97d
+();
+
+244 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gR\97lWÜldDesü\9dtiÚ
+::
+f\9c¡Su\99e
+() const
+
+246 \15 (cڡ
+R\97lSu\99eDesü\9dtiÚ
+ *)
+su\99es
+().
+h\97d
+();
+
+249 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+ gR\97lWÜldDesü\9dtiÚ
+::
+su\99eDesü\9dtiÚ
+Ð\1d
+i
+ ) const
+
+251 \15 *(cڡ
+R\97lSu\99eDesü\9dtiÚ
+ *)
+su\99es
+().
+Áh
+Ð
+i
+ );
+
+254 \1e
+ gR\97lWÜldDesü\9dtiÚ
+::
+aùiv©eAÎTe¡s
+()
+
+256
+su\99es
+().
+aùiv©eAÎ
+();
+
+257 \ f
+Su\99eDesü\9dtiÚ
+ *
+ gsd
+ =
+f\9c¡Su\99e
+(); sd !ð0; sd =
+sd
+->
+Ãxt
+() )
+
+258
+sd
+->
+aùiv©eAÎTe¡s
+();
+
+261
+boÞ
+
+ gR\97lWÜldDesü\9dtiÚ
+::
+ËaveOÆy
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+263 \ f
+Su\99eDesü\9dtiÚ
+ *
+ gsd
+ =
+f\9c¡Su\99e
+(); sd !ð0; sd =
+sd
+->
+Ãxt
+() ) {
+
+264 iàÐ
+¡r\9agsEqu®
+Ð
+sd
+->
+su\99eName
+(), suiteName ) ) {
+
+265 iàÐ
+\8b¡Name
+ )
+
+266 iàÐ!
+sd
+->
+ËaveOÆy
+Ð
+\8b¡Name
+ ) )
+
+267 \15
+çl£
+;
+
+268
+su\99es
+().
+ËaveOÆy
+Ð*
+sd
+ );
+
+269 \15
+ g\8cue
+;
+
+272 \15
+ gçl£
+;
+
+275
+boÞ
+
+ gR\97lWÜldDesü\9dtiÚ
+::
+£tUp
+()
+
+277 \ f
+Glob®Fixtu»
+ *
+gf
+ = Glob®Fixtu»::
+f\9c¡Glob®Fixtu»
+();
+ ggf
+ !ð0; gàðgf->
+ÃxtGlob®Fixtu»
+() ) {
+
+278
+boÞ
+
+ok
+;
+
+279
+ g_TS_TRY
+ {
+
+280
+ gok
+ =
+gf
+->
+£tUpWÜld
+();
+
+281 ià(
+\8cack\94
+().
+\8b¡Fa\9eed
+()) {
+
+282
+\8cack\94
+().
+\9a\99\9flize
+();
+
+283
+ gok
+ =
+çl£
+;
+
+286
+_TS_LAST_CATCH
+Ð{
+ok
+ =
+çl£
+; } );
+
+288 iàÐ!
+ gok
+ ) {
+
+289
+»pÜtE¼Ü
+( "Error setting up world" );
+
+290 \15
+ gçl£
+;
+
+294 \15
+ g\8cue
+;
+
+297
+boÞ
+
+ gR\97lWÜldDesü\9dtiÚ
+::
+\8b¬Down
+()
+
+299 \ f
+Glob®Fixtu»
+ *
+gf
+ = Glob®Fixtu»::
+Ï¡Glob®Fixtu»
+();
+ ggf
+ !ð0; gàðgf->
+´evGlob®Fixtu»
+() ) {
+
+300
+boÞ
+
+ok
+;
+
+301
+ g_TS_TRY
+ {
+ gok
+ =
+gf
+->
+\8b¬DownWÜld
+(); }
+
+302
+_TS_LAST_CATCH
+Ð{
+ok
+ =
+çl£
+; } );
+
+304 iàÐ!
+ gok
+ ) {
+
+305
+»pÜtE¼Ü
+( "Error\81earing down world" );
+
+306 \15
+ gçl£
+;
+
+310 \15
+ g\8cue
+;
+
+313 \1e
+ gR\97lWÜldDesü\9dtiÚ
+::
+»pÜtE¼Ü
+ÐcÚ¡ \ 5*
+mes§ge
+ )
+
+315
+doW¬n
+Ð
+__FILE__
+, 5,
+mes§ge
+ );
+
+318 \1e
+aùiv©eAÎTe¡s
+()
+
+320
+R\97lWÜldDesü\9dtiÚ
+().
+aùiv©eAÎTe¡s
+();
+
+323
+boÞ
+
+ËaveOÆy
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+325 \15
+R\97lWÜldDesü\9dtiÚ
+().
+ËaveOÆy
+Ð
+su\99eName
+,
+\8b¡Name
+ );
+
+ @tools/cxxtest/cxxtest/RealDescriptions.h
+
+12 #iâdeà
+__cxx\8b¡__R\97lDesü\9dtiÚs_h__
+
+
+13 \ 1
+ #__cxx\8b¡__R\97lDesü\9dtiÚs_h__
+
+
+ )
+
+19 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.h
+>
+
+20 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+21 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+23
+Çme¥aû
+
+ gCxxTe¡
+
+
+25 þas
+ cR\97lTe¡Desü\9dtiÚ
+ :
+public
+
+Te¡Desü\9dtiÚ
+
+
+27
+public
+:
+
+28
+R\97lTe¡Desü\9dtiÚ
+();
+
+29
+R\97lTe¡Desü\9dtiÚ
+Ð
+Li¡
+ &
+¬gLi¡
+,
+Su\99eDesü\9dtiÚ
+ &
+¬gSu\99e
+, \1d
+¬gL\9ae
+, cڡ \ 5*
+¬gTe¡Name
+ );
+
+30 \1e
+\9a\99\9flize
+Ð
+Li¡
+ &
+¬gLi¡
+,
+Su\99eDesü\9dtiÚ
+ &
+¬gSu\99e
+, \1d
+¬gL\9ae
+, cڡ \ 5*
+¬gTe¡Name
+ );
+
+32 cڡ \ 5*
+f\9ee
+() const;
+
+33 \12
+l\9ae
+() const;
+
+34 cڡ \ 5*
+\8b¡Name
+() const;
+
+35 cڡ \ 5*
+su\99eName
+() const;
+
+37
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+();
+
+38 cڡ
+Te¡Desü\9dtiÚ
+ *
+Ãxt
+() const;
+
+40
+Te¡Su\99e
+ *
+su\99e
+() const;
+
+42
+boÞ
+
+£tUp
+();
+
+43 \1e
+run
+();
+
+44
+boÞ
+
+\8b¬Down
+();
+
+46
+ g´iv©e
+:
+
+47
+R\97lTe¡Desü\9dtiÚ
+( const RealTestDescription & );
+
+48
+ gR\97lTe¡Desü\9dtiÚ
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+R\97lTe¡Desü\9dtiÚ
+ & );
+
+50
+v\9ctu®
+ \1e
+runTe¡
+() = 0;
+
+52
+Su\99eDesü\9dtiÚ
+ *
+ g_su\99e
+;
+
+53 \12
+ g_l\9ae
+;
+
+54 cڡ \ 5*
+ g_\8b¡Name
+;
+
+57 þas
+ cR\97lSu\99eDesü\9dtiÚ
+ :
+public
+
+Su\99eDesü\9dtiÚ
+
+
+59
+public
+:
+
+60
+R\97lSu\99eDesü\9dtiÚ
+();
+
+61
+R\97lSu\99eDesü\9dtiÚ
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+, cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+ );
+
+63 \1e
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+, cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+ );
+
+65 cڡ \ 5*
+f\9ee
+() const;
+
+66 \12
+l\9ae
+() const;
+
+67 cڡ \ 5*
+su\99eName
+() const;
+
+69
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+();
+
+70 cڡ
+Te¡Desü\9dtiÚ
+ *
+f\9c¡Te¡
+() const;
+
+71
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+();
+
+72 cڡ
+Su\99eDesü\9dtiÚ
+ *
+Ãxt
+() const;
+
+74 \1d
+numTe¡s
+() const;
+
+75 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+\8b¡Desü\9dtiÚ
+Ð\1d
+i
+ ) const;
+
+77 \1e
+aùiv©eAÎTe¡s
+();
+
+78
+boÞ
+
+ËaveOÆy
+ÐcÚ¡ \ 5*
+\8b¡Name
+ );
+
+80
+ g´iv©e
+:
+
+81
+R\97lSu\99eDesü\9dtiÚ
+( const RealSuiteDescription & );
+
+82
+ gR\97lSu\99eDesü\9dtiÚ
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+R\97lSu\99eDesü\9dtiÚ
+ & );
+
+84 cڡ \ 5*
+ g_f\9ee
+;
+
+85 \12
+ g_l\9ae
+;
+
+86 cڡ \ 5*
+ g_su\99eName
+;
+
+87
+Li¡
+ *
+ g_\8b¡s
+;
+
+89 \18
+Li¡
+
+ g_su\99es
+;
+
+90
+ä\9bnd
+
+þass
+
+ gR\97lWÜldDesü\9dtiÚ
+;
+
+93 þas
+ cS\8fticSu\99eDesü\9dtiÚ
+ :
+public
+
+R\97lSu\99eDesü\9dtiÚ
+
+
+95
+public
+:
+
+96
+S\8fticSu\99eDesü\9dtiÚ
+();
+
+97
+S\8fticSu\99eDesü\9dtiÚ
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+98 cڡ \ 5*
+¬gSu\99eName
+,
+Te¡Su\99e
+ &
+¬gSu\99e
+,
+
+99
+Li¡
+ &
+¬gTe¡s
+ );
+
+101 \1e
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+102 cڡ \ 5*
+¬gSu\99eName
+,
+Te¡Su\99e
+ &
+¬gSu\99e
+,
+
+103
+Li¡
+ &
+¬gTe¡s
+ );
+
+104
+Te¡Su\99e
+ *
+su\99e
+() const;
+
+106
+boÞ
+
+£tUp
+();
+
+107
+boÞ
+
+\8b¬Down
+();
+
+109
+ g´iv©e
+:
+
+110
+S\8fticSu\99eDesü\9dtiÚ
+( const StaticSuiteDescription & );
+
+111
+ gS\8fticSu\99eDesü\9dtiÚ
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+S\8fticSu\99eDesü\9dtiÚ
+ & );
+
+113 \1e
+doIn\99\9flize
+Ð
+Te¡Su\99e
+ &
+¬gSu\99e
+ );
+
+115
+Te¡Su\99e
+ *
+ g_su\99e
+;
+
+118 þas
+ cCommÚDyÇmicSu\99eDesü\9dtiÚ
+ :
+public
+
+R\97lSu\99eDesü\9dtiÚ
+
+
+120
+public
+:
+
+121
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+();
+
+122
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+123 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+124 \1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ );
+
+126 \1e
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+127 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+128 \1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ );
+
+130
+ g´Ùeùed
+:
+
+131 \1d
+_ü\97\8bL\9ae
+,
+ g_de¡royL\9ae
+;
+
+133
+ g´iv©e
+:
+
+134 \1e
+doIn\99\9flize
+Ð\1d
+¬gC»©eL\9ae
+, \1d
+¬gDe¡royL\9ae
+ );
+
+137
+ g\8bm¶©e
+<
+þass
+
+ gS
+>
+
+138 þas
+ cDyÇmicSu\99eDesü\9dtiÚ
+ :
+public
+
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+
+
+140
+public
+:
+
+141
+DyÇmicSu\99eDesü\9dtiÚ
+() {}
+
+142
+DyÇmicSu\99eDesü\9dtiÚ
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+143 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+144
+S
+ *&
+¬gSu\99e
+, \1d
+¬gC»©eL\9ae
+,
+
+145 \1d
+¬gDe¡royL\9ae
+ ) :
+
+146
+CommÚDyÇmicSu\99eDesü\9dtiÚ
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+¬gSu\99eName
+,
+¬gTe¡s
+,
+¬gC»©eL\9ae
+,
+¬gDe¡royL\9ae
+ )
+
+148
+ g_su\99e
+ = &
+¬gSu\99e
+;
+
+151 \1e
+\9a\99\9flize
+ÐcÚ¡ \ 5*
+¬gF\9ee
+, \1d
+¬gL\9ae
+,
+
+152 cڡ \ 5*
+¬gSu\99eName
+,
+Li¡
+ &
+¬gTe¡s
+,
+
+153
+S
+ *&
+¬gSu\99e
+, \1d
+¬gC»©eL\9ae
+,
+
+154 \1d
+¬gDe¡royL\9ae
+ )
+
+156
+ gCommÚDyÇmicSu\99eDesü\9dtiÚ
+::
+\9a\99\9flize
+Ð
+¬gF\9ee
+,
+¬gL\9ae
+,
+
+157
+¬gSu\99eName
+,
+¬gTe¡s
+,
+
+158
+¬gC»©eL\9ae
+,
+¬gDe¡royL\9ae
+ );
+
+159
+ g_su\99e
+ = &
+¬gSu\99e
+;
+
+162
+Te¡Su\99e
+ *
+su\99e
+(ècÚ¡ { \15
+»®Su\99e
+(); }
+
+164
+boÞ
+
+£tUp
+();
+
+165
+boÞ
+
+\8b¬Down
+();
+
+167
+ g´iv©e
+:
+
+168
+S
+ *
+»®Su\99e
+(ècÚ¡ { \15 *
+_su\99e
+; }
+
+169 \1e
+£tSu\99e
+Ð
+S
+ *
+s
+ ) { *
+ g_su\99e
+ = s; }
+
+171 \1e
+ü\97\8bSu\99e
+()
+
+173
+£tSu\99e
+Ð
+S
+::
+ü\97\8bSu\99e
+() );
+
+176 \1e
+de¡roySu\99e
+()
+
+178
+S
+ *
+ gs
+ =
+»®Su\99e
+();
+
+179
+£tSu\99e
+( 0 );
+
+180
+ gS
+::
+de¡roySu\99e
+Ð
+s
+ );
+
+183
+S
+ **
+ g_su\99e
+;
+
+186
+ g\8bm¶©e
+<
+þass
+
+ gS
+>
+
+187
+boÞ
+
+ gDyÇmicSu\99eDesü\9dtiÚ
+<
+ gS
+>::
+ $£tUp
+()
+
+189
+_TS_TRY
+ {
+
+190
+ `_TSM_ASSERT_THROWS_NOTHING
+Ð
+ `f\9ee
+(),
+_ü\97\8bL\9ae
+, "Exû±iÚ\81hrowÀäom c»©eSu\99e()",
+ `ü\97\8bSu\99e
+() );
+
+191
+ `_TSM_ASSERT
+Ð
+ `f\9ee
+(),
+_ü\97\8bL\9ae
+, "ü\97\8bSu\99e(èç\9eed",
+ `su\99e
+() != 0 );
+
+193
+ `_TS_CATCH_ABORT
+Ð{ \15
+çl£
+; } );
+
+195 \15 (
+ `su\99e
+() != 0);
+
+196
+ }
+}
+
+198
+ g\8bm¶©e
+<
+þass
+
+ gS
+>
+
+199
+boÞ
+
+ gDyÇmicSu\99eDesü\9dtiÚ
+<
+ gS
+>::
+ $\8b¬Down
+()
+
+201 iàÐ!
+_su\99e
+ )
+
+202 \15
+\8cue
+;
+
+204
+_TS_TRY
+ {
+
+205
+ `_TSM_ASSERT_THROWS_NOTHING
+Ð
+ `f\9ee
+(),
+_de¡royL\9ae
+, "de¡roySu\99e(èç\9eed",
+ `de¡roySu\99e
+() );
+
+207
+ `_TS_CATCH_ABORT
+Ð{ \15
+çl£
+; } );
+
+209 \15
+\8cue
+;
+
+210
+ }
+}
+
+212 þas
+ cR\97lWÜldDesü\9dtiÚ
+ :
+public
+
+WÜldDesü\9dtiÚ
+
+
+214
+public
+:
+
+215 \18
+Li¡
+ &
+su\99es
+();
+
+216 cڡ \ 5*
+wÜldName
+(ècÚ¡ { \15
+ g_wÜldName
+;}
+
+217 \1d
+numSu\99es
+( \1e) const;
+
+218 \1d
+numTÙ®Te¡s
+( \1e) const;
+
+219
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+();
+
+220 cڡ
+Su\99eDesü\9dtiÚ
+ *
+f\9c¡Su\99e
+() const;
+
+221 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+su\99eDesü\9dtiÚ
+Ð\1d
+i
+ ) const;
+
+222 \1e
+aùiv©eAÎTe¡s
+();
+
+223
+boÞ
+
+ËaveOÆy
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ = 0 );
+
+225
+boÞ
+
+£tUp
+();
+
+226
+boÞ
+
+\8b¬Down
+();
+
+227 \18\1e
+»pÜtE¼Ü
+ÐcÚ¡ \ 5*
+mes§ge
+ );
+
+229 \18cڡ \ 5*
+ g_wÜldName
+;
+
+232 \1e
+aùiv©eAÎTe¡s
+();
+
+233
+boÞ
+
+ËaveOÆy
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ = 0 );
+
+ @tools/cxxtest/cxxtest/Root.cpp
+
+12 #iâdeà
+__cxx\8b¡__RoÙ_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__RoÙ_ýp__
+
+
+ )
+
+20 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.ýp
+>
+
+21 \ 2
+ ~<cxx\8b¡/DummyDesü\9dtiÚs.ýp
+>
+
+22 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».ýp
+>
+
+23 \ 2
+ ~<cxx\8b¡/L\9akedLi¡.ýp
+>
+
+24 \ 2
+ ~<cxx\8b¡/R\97lDesü\9dtiÚs.ýp
+>
+
+25 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.ýp
+>
+
+26 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.ýp
+>
+
+27 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.ýp
+>
+
+ @tools/cxxtest/cxxtest/SelfTest.h
+
+12 #iâdeà
+__cxx\8b¡_S\96fTe¡_h__
+
+
+13 \ 1
+ #__cxx\8b¡_S\96fTe¡_h__
+
+
+ )
+
+15 \ 1
+ #CXXTEST_SUITE
+(
+Çme
+)
+
+ )
+
+16 \ 1
+ #CXXTEST_CODE
+(
+memb\94
+)
+
+ )
+
+ @tools/cxxtest/cxxtest/StdHeaders.h
+
+12 #iâdeà
+__cxx\8b¡_StdH\97d\94s_h__
+
+
+13 \ 1
+ #__cxx\8b¡_StdH\97d\94s_h__
+
+
+ )
+
+20 #ifdeà
+_MSC_VER
+
+
+21 #´agm¨
+w¬n\9ag
+Ð
+push
+, 1 )
+
+24 \ 2
+ ~<com¶ex
+>
+
+25 \ 2
+ ~<deque
+>
+
+26 \ 2
+ ~<li¡
+>
+
+27 \ 2
+ ~<m
+>
+
+28 \ 2
+ ~<£t
+>
+
+29 \ 2
+ ~<¡r\9ag
+>
+
+30 \ 2
+ ~<veùÜ
+>
+
+32 #ifdeà
+_MSC_VER
+
+
+33 #´agm¨
+w¬n\9ag
+Ð
+pÝ
+ )
+
+ @tools/cxxtest/cxxtest/StdTestSuite.h
+
+12 #iâdeà
+__cxx\8b¡__StdTe¡Su\99e_h__
+
+
+13 \ 1
+ #__cxx\8b¡__StdTe¡Su\99e_h__
+
+
+ )
+
+20
+Çme¥aû
+
+ gCxxTe¡
+ {
+
+22 #ifdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+24
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+, cÏs
+ gD
+>
+
+25 \19
+ gd\96\8f
+<
+ g¡d
+::
+veùÜ
+<
+X
+>, std::veùÜ<
+Y
+>,
+ gD
+>
+
+27 \18
+boÞ
+
+\8b¡
+(
+¡d
+::
+veùÜ
+<
+X
+>
+x
+, std::veùÜ<
+Y
+>
+y
+,
+D
+
+d
+)
+
+29 iàÐ
+ gx
+.
+size
+(è!ð
+y
+.size() )
+
+30 \15
+çl£
+;
+
+31 \ f
+size_t
+
+ gi
+ = 0; i<
+ gx
+.
+size
+(); ++i)
+
+32 iàÐ!
+ gd\96\8f
+<
+ gX
+,
+ gY
+,
+ gD
+>::
+\8b¡
+(
+x
+[
+i
+],
+y
+[i],
+d
+) )
+
+33 \15
+ gçl£
+;
+
+34 \15
+ g\8cue
+;
+
+38
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+, cÏs
+ gD
+>
+
+39 \19
+ gd\96\8f
+<
+ g¡d
+::
+li¡
+<
+X
+>, std::li¡<
+Y
+>,
+ gD
+>
+
+41 \18
+boÞ
+
+\8b¡
+(
+¡d
+::
+li¡
+<
+X
+>
+x
+, std::li¡<
+Y
+>
+y
+,
+D
+
+d
+)
+
+43
+ty³Çme
+
+ g¡d
+::
+li¡
+<
+X
+>::
+cÚ¡_\99\94©Ü
+
+x_\99
+ =
+x
+.
+beg\9a
+();
+
+44
+ty³Çme
+
+ g¡d
+::
+li¡
+<
+Y
+>::
+cÚ¡_\99\94©Ü
+
+y_\99
+ =
+y
+.
+beg\9a
+();
+
+45 \ f;
+ gx_\99
+ !ð
+x
+.
+\92d
+(); ++x_\99, ++
+ gy_\99
+)
+
+47 iàÐ
+ gy_\99
+ =ð
+y
+.
+\92d
+() )
+
+48 \15
+çl£
+;
+
+49 iàÐ!
+ gd\96\8f
+<
+ gX
+,
+ gY
+,
+ gD
+>::
+\8b¡
+(*
+x_\99
+, *
+y_\99
+,
+d
+) )
+
+50 \15
+ gçl£
+;
+
+52 \15
+ gy_\99
+ =ð
+y
+.
+\92d
+();
+
+ @tools/cxxtest/cxxtest/StdValueTraits.h
+
+12 #iâdeà
+__cxx\8b¡_StdV®ueT¿\99s_h__
+
+
+13 \ 1
+ #__cxx\8b¡_StdV®ueT¿\99s_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+22 \ 2
+ ~<cxx\8b¡/StdH\97d\94s.h
+>
+
+24 #ifdeà
+_CXXTEST_OLD_STD
+
+
+25 \ 1
+ #CXXTEST_STD
+(
+x
+è
+ )
+x
+
+27 \ 1
+ #CXXTEST_STD
+(
+x
+è
+¡d
+::
+ )
+x
+
+30 #iâdeà
+CXXTEST_USER_VALUE_TRAITS
+
+
+32
+Çme¥aû
+
+ gCxxTe¡
+
+
+44 þas
+ cStdT¿\99sBa£
+
+
+46
+ gpublic
+:
+
+47
+StdT¿\99sBa£
+ &
+Ý\94©Ü
+<<ÐcÚ¡
+CXXTEST_STD
+(
+¡r\9ag
+è&
+s
+ ) {
+_s
+ +ðs; \15 *
+ gthis
+; }
+
+48 cڡ \ 5*
+asS\8c\9ag
+(ècÚ¡ { \15
+ g_s
+.
+c_¡r
+(); }
+
+50
+ g´iv©e
+:
+
+51
+CXXTEST_STD
+(
+¡r\9ag
+è
+_s
+;
+
+57
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+58
+þass
+
+ gV®ueT¿\99s
+<cڡ
+CXXTEST_STD
+(
+¡r\9ag
+)> :
+public
+
+StdT¿\99sBa£
+
+
+60
+public
+:
+
+61
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+¡r\9ag
+è&
+s
+ )
+
+63 *
+this
+ << "\"";
+
+64 \ f \1d
+ gi
+ = 0; i <
+ gs
+.
+Ëngth
+(); ++ i ) {
+
+65 \ 5
+ gc
+[\17("\\xXX")];
+
+66
+ch¬ToS\8c\9ag
+Ð
+s
+[
+i
+],
+c
+ );
+
+67 *
+ gthis
+ <<
+ gc
+;
+
+69 *
+ gthis
+ << "\"";
+
+73
+CXXTEST_COPY_CONST_TRAITS
+Ð
+CXXTEST_STD
+(
+¡r\9ag
+) );
+
+75 #iâdeà
+_CXXTEST_OLD_STD
+
+
+79
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+80
+þass
+
+ gV®ueT¿\99s
+<cڡ
+CXXTEST_STD
+(
+basic_¡r\9ag
+<
+wch¬_t
+>)> :
+public
+
+StdT¿\99sBa£
+
+
+82
+public
+:
+
+83
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+basic_¡r\9ag
+<
+wch¬_t
+>è&
+s
+ )
+
+85 *
+this
+ << "L\"";
+
+86 \ f \1d
+ gi
+ = 0; i <
+ gs
+.
+Ëngth
+(); ++ i ) {
+
+87 \ 5
+ gc
+[\17("\\x12345678")];
+
+88
+ch¬ToS\8c\9ag
+Ð(\1d\13)
+s
+[
+i
+],
+c
+ );
+
+89 *
+ gthis
+ <<
+ gc
+;
+
+91 *
+ gthis
+ << "\"";
+
+95
+CXXTEST_COPY_CONST_TRAITS
+Ð
+CXXTEST_STD
+(
+basic_¡r\9ag
+<
+wch¬_t
+>) );
+
+102
+ g\8bm¶©e
+<
+þass
+
+ gS\8c\97m
+, cÏs
+ gI\8b¿tÜ
+>
+
+103 \1e
+ $dumpRªge
+Ð
+S\8c\97m
+ &
+s
+,
+I\8b¿tÜ
+
+f\9c¡
+, I\8b¿tÜ
+ϡ
+ )
+
+105 iàÐ
+f\9c¡
+ =ð
+ϡ
+ ) {
+
+106
+s
+ << "{}";
+
+110
+s
+ << "{ ";
+
+111 \1f
+f\9c¡
+ !ð
+ϡ
+ ) {
+
+112
+s
+ <<
+ `TS_AS_STRING
+(*
+f\9c¡
+);
+
+113 iàÐ++
+f\9c¡
+ !ð
+ϡ
+ )
+
+114
+s
+ << ", ";
+
+116
+s
+ << " }";
+
+117
+ }
+}
+
+119 #ifdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+123
+ g\8bm¶©e
+<
+þass
+
+ gF\9c¡
+, cÏs
+ gSecÚd
+>
+
+124
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+·\9c
+)<
+ gF\9c¡
+,
+ gSecÚd
+> > :
+public
+
+StdT¿\99sBa£
+
+
+126
+public
+:
+
+127
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+·\9c
+)<
+F\9c¡
+,
+SecÚd
+> &
+p
+ )
+
+129 *
+ gthis
+ << "<" <<
+TS_AS_STRING
+Ð
+p
+.
+f\9c¡
+ ) << ", " << TS_AS_STRINGÐp.
+£cÚd
+ ) << ">";
+
+136
+ g\8bm¶©e
+<
+þass
+
+ gEËm\92t
+>
+
+137
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+veùÜ
+)<
+ gEËm\92t
+> > :
+public
+
+StdT¿\99sBa£
+
+
+139
+public
+:
+
+140
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+veùÜ
+)<
+EËm\92t
+> &
+v
+ )
+
+142
+dumpRªge
+Ð*
+this
+,
+v
+.
+beg\9a
+(), v.
+\92d
+() );
+
+149
+ g\8bm¶©e
+<
+þass
+
+ gEËm\92t
+>
+
+150
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+li¡
+)<
+ gEËm\92t
+> > :
+public
+
+StdT¿\99sBa£
+
+
+152
+public
+:
+
+153
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+li¡
+)<
+EËm\92t
+> &
+l
+ )
+
+155
+dumpRªge
+Ð*
+this
+,
+l
+.
+beg\9a
+(),\86.
+\92d
+() );
+
+162
+ g\8bm¶©e
+<
+þass
+
+ gEËm\92t
+>
+
+163
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+£t
+)<
+ gEËm\92t
+> > :
+public
+
+StdT¿\99sBa£
+
+
+165
+public
+:
+
+166
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+£t
+)<
+EËm\92t
+> &
+s
+ )
+
+168
+dumpRªge
+Ð*
+this
+,
+s
+.
+beg\9a
+(), s.
+\92d
+() );
+
+175
+ g\8bm¶©e
+<
+þass
+
+ gKey
+, cÏs
+ gV®ue
+>
+
+176
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+m
+)<
+ gKey
+,
+ gV®ue
+> > :
+public
+
+StdT¿\99sBa£
+
+
+178
+public
+:
+
+179
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+m
+)<
+Key
+,
+V®ue
+> &
+m
+ )
+
+181
+dumpRªge
+Ð*
+this
+,
+m
+.
+beg\9a
+(), m.
+\92d
+() );
+
+188
+ g\8bm¶©e
+<
+þass
+
+ gEËm\92t
+>
+
+189
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+deque
+)<
+ gEËm\92t
+> > :
+public
+
+StdT¿\99sBa£
+
+
+191
+public
+:
+
+192
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+deque
+)<
+EËm\92t
+> &
+d
+ )
+
+194
+dumpRªge
+Ð*
+this
+,
+d
+.
+beg\9a
+(), d.
+\92d
+() );
+
+201
+ g\8bm¶©e
+<
+þass
+
+ gEËm\92t
+>
+
+202
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+muÉi£t
+)<
+ gEËm\92t
+> > :
+public
+
+StdT¿\99sBa£
+
+
+204
+public
+:
+
+205
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+muÉi£t
+)<
+EËm\92t
+> &
+ms
+ )
+
+207
+dumpRªge
+Ð*
+this
+,
+ms
+.
+beg\9a
+(), ms.
+\92d
+() );
+
+214
+ g\8bm¶©e
+<
+þass
+
+ gKey
+, cÏs
+ gV®ue
+>
+
+215
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+muÉim
+)<
+ gKey
+,
+ gV®ue
+> > :
+public
+
+StdT¿\99sBa£
+
+
+217
+public
+:
+
+218
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+muÉim
+)<
+Key
+,
+V®ue
+> &
+mm
+ )
+
+220
+dumpRªge
+Ð*
+this
+,
+mm
+.
+beg\9a
+(), mm.
+\92d
+() );
+
+227
+ g\8bm¶©e
+<
+þass
+
+ gNumb\94
+>
+
+228
+þass
+
+ gV®ueT¿\99s
+<
+CXXTEST_STD
+(
+com¶ex
+)<
+ gNumb\94
+> > :
+public
+
+StdT¿\99sBa£
+
+
+230
+public
+:
+
+231
+V®ueT¿\99s
+ÐcÚ¡
+CXXTEST_STD
+(
+com¶ex
+)<
+Numb\94
+> &
+c
+ )
+
+233 iàÐ!
+c
+.
+imag
+() )
+
+234 *
+this
+ <<
+TS_AS_STRING
+(
+c
+.
+»®
+());
+
+235 \viàÐ!
+ gc
+.
+»®
+() )
+
+236 *
+ gthis
+ << "(" <<
+TS_AS_STRING
+(
+c
+.
+imag
+()) << " * i)";
+
+238 *
+ gthis
+ << "(" <<
+TS_AS_STRING
+(
+c
+.
+»®
+()è<< " + " << TS_AS_STRING(c.
+imag
+()) << " * i)";
+
+ @tools/cxxtest/cxxtest/StdioFilePrinter.h
+
+12 #iâdeà
+__cxx\8b¡__StdioF\9eePr\9a\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__StdioF\9eePr\9a\8br_h__
+
+
+ )
+
+22 \ 2
+ ~<cxx\8b¡/E¼ÜFÜm©\8br.h
+>
+
+23 \ 2
+ ~<¡dio.h
+>
+
+25
+Çme¥aû
+
+ gCxxTe¡
+
+
+27 þas
+ cStdioF\9eePr\9a\8br
+ :
+public
+
+E¼ÜFÜm©\8br
+
+
+29
+public
+:
+
+30
+StdioF\9eePr\9a\8br
+Ð
+FILE
+ *
+o
+, cڡ \ 5*
+´eL\9ae
+ = ":", cڡ \ 5*
+po¡L\9ae
+ = "" ) :
+
+31
+E¼ÜFÜm©\8br
+Ð
+Ãw
+
+Ad\8br
+(
+o
+),
+´eL\9ae
+,
+po¡L\9ae
+ ) {}
+
+32
+ gv\9ctu®
+ ~
+StdioF\9eePr\9a\8br
+(è{
+d\96\91e
+
+ou\8dutS\8c\97m
+(); }
+
+34
+ g´iv©e
+:
+
+35 þas
+ cAd\8br
+ :
+public
+
+Ou\8dutS\8c\97m
+
+
+37
+Ad\8br
+( const Adapter & );
+
+38
+ gAd\8br
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+Ad\8br
+ & );
+
+40
+FILE
+ *
+ g_o
+;
+
+42
+ gpublic
+:
+
+43
+Ad\8br
+Ð
+FILE
+ *
+o
+ ) :
+_o
+(o) {}
+
+44 \1e
+æush
+(è{
+fæush
+Ð
+_o
+ ); }
+
+45
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð\1d
+ gi
+ ) {
+år\9atf
+Ð
+_o
+, "%u",
+i
+ ); \15 *
+ gthis
+; }
+
+46
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<ÐcÚ¡ \ 5*
+ gs
+ ) {
+åuts
+Ð
+s
+,
+_o
+ ); \15 *
+ gthis
+; }
+
+47
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð
+Mª\9duÏtÜ
+
+ gm
+ ) { \15 Ou\8dutS\8c\97m::
+Ý\94©Ü
+<<Ð
+m
+ ); }
+
+ @tools/cxxtest/cxxtest/StdioPrinter.h
+
+12 #iâdeà
+__cxx\8b¡__StdioPr\9a\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__StdioPr\9a\8br_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/StdioF\9eePr\9a\8br.h
+>
+
+23
+Çme¥aû
+
+ gCxxTe¡
+
+
+25 þas
+ cStdioPr\9a\8br
+ :
+public
+
+StdioF\9eePr\9a\8br
+
+
+27
+public
+:
+
+28
+StdioPr\9a\8br
+Ð
+FILE
+ *
+o
+ =
+¡dout
+, cڡ \ 5*
+´eL\9ae
+ = ":", cڡ \ 5*
+po¡L\9ae
+ = "" ) :
+
+29
+StdioF\9eePr\9a\8br
+Ð
+o
+,
+´eL\9ae
+,
+po¡L\9ae
+ ) {}
+
+ @tools/cxxtest/cxxtest/TeeListener.h
+
+12 #iâdeà
+__cxx\8b¡__T\93Li¡\92\94_h__
+
+
+13 \ 1
+ #__cxx\8b¡__T\93Li¡\92\94_h__
+
+
+ )
+
+19 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+20 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+22
+Çme¥aû
+
+ gCxxTe¡
+
+
+24 þas
+ cT\93Li¡\92\94
+ :
+public
+
+Te¡Li¡\92\94
+
+
+26
+public
+:
+
+27
+T\93Li¡\92\94
+()
+
+29
+£tF\9c¡
+Ð
+_dummy
+ );
+
+30
+£tSecÚd
+Ð
+_dummy
+ );
+
+33
+ gv\9ctu®
+ ~
+T\93Li¡\92\94
+()
+
+37 \1e
+£tF\9c¡
+Ð
+Te¡Li¡\92\94
+ &
+f\9c¡
+ )
+
+39
+ g_f\9c¡
+ = &
+f\9c¡
+;
+
+42 \1e
+£tSecÚd
+Ð
+Te¡Li¡\92\94
+ &
+£cÚd
+ )
+
+44
+ g_£cÚd
+ = &
+£cÚd
+;
+
+47 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+d
+ )
+
+49
+ g_f\9c¡
+->
+\92\8brWÜld
+Ð
+d
+ );
+
+50
+ g_£cÚd
+->
+\92\8brWÜld
+Ð
+d
+ );
+
+53 \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+d
+ )
+
+55
+ g_f\9c¡
+->
+\92\8brSu\99e
+Ð
+d
+ );
+
+56
+ g_£cÚd
+->
+\92\8brSu\99e
+Ð
+d
+ );
+
+59 \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+d
+ )
+
+61
+ g_f\9c¡
+->
+\92\8brTe¡
+Ð
+d
+ );
+
+62
+ g_£cÚd
+->
+\92\8brTe¡
+Ð
+d
+ );
+
+65 \1e
+\8caû
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+67
+ g_f\9c¡
+->
+\8caû
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+68
+ g_£cÚd
+->
+\8caû
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+71 \1e
+w¬n\9ag
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+73
+ g_f\9c¡
+->
+w¬n\9ag
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+74
+ g_£cÚd
+->
+w¬n\9ag
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+77 \1e
+ç\9eedTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+79
+ g_f\9c¡
+->
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+80
+ g_£cÚd
+->
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+83 \1e
+ç\9eedAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+85
+ g_f\9c¡
+->
+ç\9eedAs£¹
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+86
+ g_£cÚd
+->
+ç\9eedAs£¹
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+89 \1e
+ç\9eedAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+90 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+91 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+93
+ g_f\9c¡
+->
+ç\9eedAs£¹Equ®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+94
+ g_£cÚd
+->
+ç\9eedAs£¹Equ®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+97 \1e
+ç\9eedAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+98 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+99 cڡ \ 5*
+sizeS\8c
+, cڡ \1e*
+x
+,
+
+100 cڡ \1e*
+y
+, \1d
+size
+ )
+
+102
+ g_f\9c¡
+->
+ç\9eedAs£¹SameD©a
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+sizeS\8c
+,
+x
+,
+y
+,
+size
+ );
+
+103
+ g_£cÚd
+->
+ç\9eedAs£¹SameD©a
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+sizeS\8c
+,
+x
+,
+y
+,
+size
+ );
+
+106 \1e
+ç\9eedAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+, cڡ \ 5*
+ex¶ª©iÚ
+)
+
+108
+ g_f\9c¡
+->
+ç\9eedAs£¹SameF\9ees
+Ð
+f\9ee
+,
+l\9ae
+,
+f\9ee1
+,
+f\9ee2
+,
+ex¶ª©iÚ
+ );
+
+109
+ g_£cÚd
+->
+ç\9eedAs£¹SameF\9ees
+Ð
+f\9ee
+,
+l\9ae
+,
+f\9ee1
+,
+f\9ee2
+,
+ex¶ª©iÚ
+ );
+
+112 \1e
+ç\9eedAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+113 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+dS\8c
+,
+
+114 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+, cڡ \ 5*
+d
+ )
+
+116
+ g_f\9c¡
+->
+ç\9eedAs£¹D\96\8f
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+dS\8c
+,
+x
+,
+y
+,
+d
+ );
+
+117
+ g_£cÚd
+->
+ç\9eedAs£¹D\96\8f
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+dS\8c
+,
+x
+,
+y
+,
+d
+ );
+
+120 \1e
+ç\9eedAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+121 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+122 cڡ \ 5*
+v®ue
+ )
+
+124
+ g_f\9c¡
+->
+ç\9eedAs£¹Difãrs
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+v®ue
+ );
+
+125
+ g_£cÚd
+->
+ç\9eedAs£¹Difãrs
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+v®ue
+ );
+
+128 \1e
+ç\9eedAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+129 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+130 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+132
+ g_f\9c¡
+->
+ç\9eedAs£¹LessThª
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+133
+ g_£cÚd
+->
+ç\9eedAs£¹LessThª
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+136 \1e
+ç\9eedAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+137 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+138 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+140
+ g_f\9c¡
+->
+ç\9eedAs£¹LessThªEqu®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+141
+ g_£cÚd
+->
+ç\9eedAs£¹LessThªEqu®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+144 \1e
+ç\9eedAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+145 cڡ \ 5*
+´ediÿ\8b
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+x
+ )
+
+147
+ g_f\9c¡
+->
+ç\9eedAs£¹P»diÿ\8b
+Ð
+f\9ee
+,
+l\9ae
+,
+´ediÿ\8b
+,
+xS\8c
+,
+x
+ );
+
+148
+ g_£cÚd
+->
+ç\9eedAs£¹P»diÿ\8b
+Ð
+f\9ee
+,
+l\9ae
+,
+´ediÿ\8b
+,
+xS\8c
+,
+x
+ );
+
+151 \1e
+ç\9eedAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+152 cڡ \ 5*
+»ÏtiÚ
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+153 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+155
+ g_f\9c¡
+->
+ç\9eedAs£¹R\96©iÚ
+Ð
+f\9ee
+,
+l\9ae
+,
+»ÏtiÚ
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+156
+ g_£cÚd
+->
+ç\9eedAs£¹R\96©iÚ
+Ð
+f\9ee
+,
+l\9ae
+,
+»ÏtiÚ
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+159 \1e
+ç\9eedAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+160 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+ty³
+,
+
+161
+boÞ
+
+Ùh\94Thrown
+ )
+
+163
+ g_f\9c¡
+->
+ç\9eedAs£¹Throws
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+,
+ty³
+,
+Ùh\94Thrown
+ );
+
+164
+ g_£cÚd
+->
+ç\9eedAs£¹Throws
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+,
+ty³
+,
+Ùh\94Thrown
+ );
+
+167 \1e
+ç\9eedAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+168 cڡ \ 5*
+ex´essiÚ
+ )
+
+170
+ g_f\9c¡
+->
+ç\9eedAs£¹ThrowsNÙ
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+171
+ g_£cÚd
+->
+ç\9eedAs£¹ThrowsNÙ
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+174 \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+d
+ )
+
+176
+ g_f\9c¡
+->
+ËaveTe¡
+(
+d
+);
+
+177
+ g_£cÚd
+->
+ËaveTe¡
+(
+d
+);
+
+180 \1e
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+d
+ )
+
+182
+ g_f\9c¡
+->
+ËaveSu\99e
+(
+d
+);
+
+183
+ g_£cÚd
+->
+ËaveSu\99e
+(
+d
+);
+
+186 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+d
+ )
+
+188
+ g_f\9c¡
+->
+ËaveWÜld
+(
+d
+);
+
+189
+ g_£cÚd
+->
+ËaveWÜld
+(
+d
+);
+
+192
+ g´iv©e
+:
+
+193
+Te¡Li¡\92\94
+ *
+_f\9c¡
+, *
+ g_£cÚd
+;
+
+194
+Te¡Li¡\92\94
+
+ g_dummy
+;
+
+ @tools/cxxtest/cxxtest/TestListener.h
+
+12 #iâdeà
+__cxx\8b¡__Te¡Li¡\92\94_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Te¡Li¡\92\94_h__
+
+
+ )
+
+24 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.h
+>
+
+26
+Çme¥aû
+
+ gCxxTe¡
+
+
+28 þas
+ cTe¡Li¡\92\94
+
+
+30
+ gpublic
+:
+
+31
+Te¡Li¡\92\94
+() {}
+
+32
+v\9ctu®
+ ~
+Te¡Li¡\92\94
+() {}
+
+33
+v\9ctu®
+ \1e
+´oûss_commªdl\9ae
+(\12& , \ 5** ) {}
+
+35
+v\9ctu®
+ \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & ) {}
+
+36
+v\9ctu®
+ \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ & ) {}
+
+37
+v\9ctu®
+ \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & ) {}
+
+38
+v\9ctu®
+ \1e
+\8caû
+( const \ 5* , \12,
+
+40
+v\9ctu®
+ \1e
+w¬n\9ag
+( const \ 5* , \12,
+
+42
+v\9ctu®
+ \1e
+ç\9eedTe¡
+( const \ 5* , \12,
+
+44
+v\9ctu®
+ \1e
+ç\9eedAs£¹
+( const \ 5* , \12,
+
+46
+v\9ctu®
+ \1e
+ç\9eedAs£¹Equ®s
+( const \ 5* , \12,
+
+49
+v\9ctu®
+ \1e
+ç\9eedAs£¹SameD©a
+( const \ 5* , \12,
+
+53
+v\9ctu®
+ \1e
+ç\9eedAs£¹D\96\8f
+( const \ 5* , \12,
+
+57
+v\9ctu®
+ \1e
+ç\9eedAs£¹Difãrs
+( const \ 5* , \12,
+
+60
+v\9ctu®
+ \1e
+ç\9eedAs£¹LessThª
+( const \ 5* , \12,
+
+63
+v\9ctu®
+ \1e
+ç\9eedAs£¹LessThªEqu®s
+( const \ 5* , \12,
+
+66
+v\9ctu®
+ \1e
+ç\9eedAs£¹P»diÿ\8b
+( const \ 5* , \12,
+
+68
+v\9ctu®
+ \1e
+ç\9eedAs£¹R\96©iÚ
+( const \ 5* , \12,
+
+71
+v\9ctu®
+ \1e
+ç\9eedAs£¹Throws
+( const \ 5* , \12,
+
+73
+boÞ
+ ) {}
+
+74
+v\9ctu®
+ \1e
+ç\9eedAs£¹ThrowsNÙ
+( const \ 5* , \12,
+
+76
+v\9ctu®
+ \1e
+ç\9eedAs£¹SameF\9ees
+( const \ 5* , \12,
+
+78
+v\9ctu®
+ \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & ) {}
+
+79
+v\9ctu®
+ \1e
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ & ) {}
+
+80
+v\9ctu®
+ \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & ) {}
+
+ @tools/cxxtest/cxxtest/TestMain.h
+
+12 #iâdeà
+__CxxTe¡Ma\9a_h
+
+
+13 \ 1
+ #__CxxTe¡Ma\9a_h
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+16 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+18 #iâdeà
+_CXXTEST_HAVE_STD
+
+
+19 \ 1
+ #_CXXTEST_HAVE_STD
+
+
+ )
+
+22 \ 2
+ ~<cxx\8b¡/StdV®ueT¿\99s.h
+>
+
+24 #ifdeà
+_CXXTEST_OLD_STD
+
+
+25 \ 2
+ ~<io¡»am.h
+>
+
+26 \ 2
+ ~<¡r\9ag.h
+>
+
+28 \ 2
+ ~<io¡»am
+>
+
+29 \ 2
+ ~<c¡r\9ag
+>
+
+32
+Çme¥aû
+
+ gCxxTe¡
+
+
+35
+\9al\9ae
+ \1e
+´\9at_h\96p
+(cڡ \ 5*
+Çme
+)
+
+37
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " <su\99\92ame>" << CXXTEST_STD(
+\92dl
+);
+
+38
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " <su\99\92ame> <\8b¡Çme>" << CXXTEST_STD(
+\92dl
+);
+
+39
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " -h" << CXXTEST_STD(
+\92dl
+);
+
+40
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " --h\96p" << CXXTEST_STD(
+\92dl
+);
+
+41
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " --h\96p-\8b¡s" << CXXTEST_STD(
+\92dl
+);
+
+42
+CXXTEST_STD
+(
+û¼
+è<<
+ gÇme
+ << " -v EÇbË\81¿c\9ag ou\8dut." << CXXTEST_STD(
+\92dl
+);
+
+46
+ g\8bm¶©e
+ <
+þass
+
+ gTe¡\94T
+>
+
+47 \12
+Ma\9a
+(
+Te¡\94T
+&
+tmp
+, \12
+¬gc
+, \ 5*
+¬gv
+[])
+
+59 \ f\12
+ gi
+=1; i<
+ g¬gc
+; i++) {
+
+60 ià((
+CXXTEST_STD
+(
+¡rcmp
+)(
+ g¬gv
+[
+i
+],"-h")==0è|| (CXXTEST_STD(¡rcmp)(
+¬gv
+[i],"--help")==0)) {
+
+61
+´\9at_h\96p
+(
+¬gv
+[0]);
+
+63 } \vià((
+CXXTEST_STD
+(
+¡rcmp
+)(
+ g¬gv
+[1],"--help-tests")==0)) {
+
+64
+CXXTEST_STD
+(
+cout
+è<< "Su\99e/Te¡ Names" << CXXTEST_STD(
+\92dl
+);
+
+65
+CXXTEST_STD
+(
+cout
+è<< "---------------------------------------------------------------------------" << CXXTEST_STD(
+\92dl
+);
+
+66 \ f
+Su\99eDesü\9dtiÚ
+ *
+ gsd
+ =
+R\97lWÜldDesü\9dtiÚ
+().
+f\9c¡Su\99e
+(); sd; sd =
+sd
+->
+Ãxt
+() )
+
+67 \ f
+Te¡Desü\9dtiÚ
+ *
+td
+ =
+sd
+->
+f\9c¡Te¡
+();
+ gtd
+;\81d =\81d->
+Ãxt
+() )
+
+68
+CXXTEST_STD
+(
+cout
+è<<
+td
+->
+su\99eName
+(è<< " " <<\81d->
+\8b¡Name
+(è<< CXXTEST_STD(
+\92dl
+);
+
+76 \1f(
+ g¬gc
+ > 1è&& (
+ g¬gv
+[1][0] == '-')) {
+
+77 ià(
+CXXTEST_STD
+(
+¡rcmp
+)(
+¬gv
+[1],"-v") == 0) {
+
+78
+\8cack\94
+().
+´\9at_\8cac\9ag
+ =
+\8cue
+;
+
+81
+CXXTEST_STD
+(
+û¼
+è<< "ERROR: unknowÀÝtiÚ '" <<
+ g¬gv
+[1] << "'" << CXXTEST_STD(
+\92dl
+);
+
+84 \ f\12
+ gi
+=1; i<(
+ g¬gc
+-1); i++)
+
+85
+ g¬gv
+[
+i
+] =
+¬gv
+[i+1];
+
+86
+ g¬gc
+--;
+
+92
+boÞ
+
+ g¡©us
+=
+çl£
+;
+
+93 ià((
+ g¬gc
+==2è&& (
+¬gv
+[1][0] != '-')) {
+
+94
+¡©us
+=
+ËaveOÆy
+(
+¬gv
+[1]);
+
+95 ià(!
+ g¡©us
+) {
+
+96
+CXXTEST_STD
+(
+û¼
+è<< "ERROR: unknowÀsu\99\90'" <<
+ g¬gv
+[1] << "'" << CXXTEST_STD(
+\92dl
+);
+
+100 ià((
+ g¬gc
+==3è&& (
+¬gv
+[1][0] != '-')) {
+
+101
+¡©us
+=
+ËaveOÆy
+(
+¬gv
+[1],argv[2]);
+
+102 ià(!
+ g¡©us
+) {
+
+103
+CXXTEST_STD
+(
+û¼
+è<< "ERROR: unknowÀ\8b¡ '" <<
+ g¬gv
+[1] << "::" <<\87rgv[2] << "'" << CXXTEST_STD(
+\92dl
+);
+
+108
+ gtmp
+.
+´oûss_commªdl\9ae
+(
+¬gc
+,
+¬gv
+);
+
+109 \15
+ gtmp
+.
+run
+();
+
+ @tools/cxxtest/cxxtest/TestRunner.h
+
+12 #iâdeà
+__cxx\8b¡_Te¡RuÂ\94_h__
+
+
+13 \ 1
+ #__cxx\8b¡_Te¡RuÂ\94_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+22 \ 2
+ ~<cxx\8b¡/R\97lDesü\9dtiÚs.h
+>
+
+23 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+24 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+26
+Çme¥aû
+
+ gCxxTe¡
+
+
+28 þas
+ cTe¡RuÂ\94
+
+
+30
+ gpublic
+:
+
+31 \18\1e
+runAÎTe¡s
+Ð
+Te¡Li¡\92\94
+ &
+li¡\92\94
+ )
+
+33
+\8cack\94
+().
+£tLi¡\92\94
+Ð&
+li¡\92\94
+ );
+
+34
+ g_TS_TRY
+ {
+Te¡RuÂ\94
+().
+runWÜld
+(); }
+
+35
+_TS_LAST_CATCH
+Ð{
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+__FILE__
+,
+__LINE__
+, "Exception\81hrown from world" ); } );
+
+36
+\8cack\94
+().
+£tLi¡\92\94
+( 0 );
+
+39 \18\1e
+runAÎTe¡s
+Ð
+Te¡Li¡\92\94
+ *
+li¡\92\94
+ )
+
+41 iàÐ
+ gli¡\92\94
+ ) {
+
+42
+ gli¡\92\94
+->
+w¬n\9ag
+Ð
+__FILE__
+,
+__LINE__
+, "Deprecated; Use\84unAllTests( TestListener & )" );
+
+43
+runAÎTe¡s
+Ð*
+li¡\92\94
+ );
+
+47
+ g´iv©e
+:
+
+48 \1e
+runWÜld
+()
+
+50
+R\97lWÜldDesü\9dtiÚ
+
+wd
+;
+
+51
+WÜldGu¬d
+
+ gsg
+;
+
+53
+\8cack\94
+().
+\92\8brWÜld
+Ð
+wd
+ );
+
+54 iàÐ
+ gwd
+.
+£tUp
+() ) {
+
+55 \ f
+Su\99eDesü\9dtiÚ
+ *
+ gsd
+ =
+wd
+.
+f\9c¡Su\99e
+(); sd; sd =
+sd
+->
+Ãxt
+() )
+
+56 iàÐ
+sd
+->
+aùive
+() )
+
+57
+runSu\99e
+Ð*
+sd
+ );
+
+59
+ gwd
+.
+\8b¬Down
+();
+
+61
+\8cack\94
+().
+ËaveWÜld
+Ð
+wd
+ );
+
+64 \1e
+runSu\99e
+Ð
+Su\99eDesü\9dtiÚ
+ &
+sd
+ )
+
+66
+S\8f\8bGu¬d
+
+ gsg
+;
+
+68
+\8cack\94
+().
+\92\8brSu\99e
+Ð
+sd
+ );
+
+69 iàÐ
+ gsd
+.
+£tUp
+() ) {
+
+70 \ f
+Te¡Desü\9dtiÚ
+ *
+ gtd
+ =
+sd
+.
+f\9c¡Te¡
+();\81d;\81d =
+td
+->
+Ãxt
+() )
+
+71 iàÐ
+td
+->
+aùive
+() )
+
+72
+runTe¡
+Ð*
+td
+ );
+
+74
+ gsd
+.
+\8b¬Down
+();
+
+76
+\8cack\94
+().
+ËaveSu\99e
+Ð
+sd
+ );
+
+79 \1e
+runTe¡
+Ð
+Te¡Desü\9dtiÚ
+ &
+td
+ )
+
+81
+S\8f\8bGu¬d
+
+ gsg
+;
+
+83
+\8cack\94
+().
+\92\8brTe¡
+Ð
+td
+ );
+
+84 iàÐ
+ gtd
+.
+£tUp
+() ) {
+
+85
+ gtd
+.
+run
+();
+
+86
+ gtd
+.
+\8b¬Down
+();
+
+88
+\8cack\94
+().
+ËaveTe¡
+Ð
+td
+ );
+
+91 þas
+ cS\8f\8bGu¬d
+
+
+93 #ifdeà
+_CXXTEST_HAVE_EH
+
+
+94
+boÞ
+
+ g_abÜtTe¡OnFa\9e
+;
+
+96 \1d
+ g_maxDumpSize
+;
+
+98
+ gpublic
+:
+
+99
+S\8f\8bGu¬d
+()
+
+101 #ifdeà
+_CXXTEST_HAVE_EH
+
+
+102
+_abÜtTe¡OnFa\9e
+ =
+abÜtTe¡OnFa\9e
+();
+
+104
+ g_maxDumpSize
+ =
+maxDumpSize
+();
+
+107 ~
+S\8f\8bGu¬d
+()
+
+109 #ifdeà
+_CXXTEST_HAVE_EH
+
+
+110
+£tAbÜtTe¡OnFa\9e
+Ð
+_abÜtTe¡OnFa\9e
+ );
+
+112
+£tMaxDumpSize
+Ð
+_maxDumpSize
+ );
+
+116 þas
+ cWÜldGu¬d
+ :
+public
+
+S\8f\8bGu¬d
+
+
+118
+public
+:
+
+119
+WÜldGu¬d
+(è:
+S\8f\8bGu¬d
+()
+
+121 #ifdeà
+_CXXTEST_HAVE_EH
+
+
+122
+£tAbÜtTe¡OnFa\9e
+Ð
+CXXTEST_DEFAULT_ABORT
+ );
+
+124
+£tMaxDumpSize
+Ð
+CXXTEST_MAX_DUMP_SIZE
+ );
+
+132 \1e
+\9a\99\9flize
+();
+
+ @tools/cxxtest/cxxtest/TestSuite.cpp
+
+12 #iâdeà
+__cxx\8b¡__Te¡Su\99e_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__Te¡Su\99e_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+16 #ià
+def\9aed
+(
+_CXXTEST_HAVE_STD
+)
+
+17 \ 2
+ ~<f¡»am
+>
+
+20
+Çme¥aû
+
+ gCxxTe¡
+
+
+25
+ gTe¡Su\99e
+::~
+Te¡Su\99e
+() {}
+
+26 \1e
+Te¡Su\99e
+::
+£tUp
+() {}
+
+27 \1e
+Te¡Su\99e
+::
+\8b¬Down
+() {}
+
+32 \18
+boÞ
+
+cu¼\92tAbÜtTe¡OnFa\9e
+ =
+çl£
+;
+
+34
+boÞ
+
+abÜtTe¡OnFa\9e
+()
+
+36 \15
+ gcu¼\92tAbÜtTe¡OnFa\9e
+;
+
+39 \1e
+£tAbÜtTe¡OnFa\9e
+Ð
+boÞ
+
+v®ue
+ )
+
+41
+ gcu¼\92tAbÜtTe¡OnFa\9e
+ =
+v®ue
+;
+
+44 \1e
+doAbÜtTe¡
+()
+
+46 #ià
+def\9aed
+(
+_CXXTEST_HAVE_EH
+)
+
+47 iàÐ
+ gcu¼\92tAbÜtTe¡OnFa\9e
+ )
+
+48
+throw
+
+AbÜtTe¡
+();
+
+55 \18\1d
+ gcu¼\92tMaxDumpSize
+ =
+CXXTEST_MAX_DUMP_SIZE
+;
+
+57 \1d
+maxDumpSize
+()
+
+59 \15
+ gcu¼\92tMaxDumpSize
+;
+
+62 \1e
+£tMaxDumpSize
+Ð\1d
+v®ue
+ )
+
+64
+ gcu¼\92tMaxDumpSize
+ =
+v®ue
+;
+
+70 \1e
+doT¿û
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ )
+
+72 ià(
+\8cack\94
+().
+ g´\9at_\8cac\9ag
+) {
+
+73
+\8cack\94
+().
+\8caû
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+77 \1e
+doW¬n
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ )
+
+79
+\8cack\94
+().
+w¬n\9ag
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+82 \1e
+doFa\9eTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ )
+
+84
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+85
+TS_ABORT
+();
+
+88 \1e
+doFa\9eAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+89 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+mes§ge
+ )
+
+91 iàÐ
+ gmes§ge
+ )
+
+92
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+93
+\8cack\94
+().
+ç\9eedAs£¹
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+94
+TS_ABORT
+();
+
+97
+boÞ
+
+§meD©a
+ÐcÚ¡ \1e*
+x
+, cڡ \1e*
+y
+, \1d
+size
+ )
+
+99 iàÐ
+ gsize
+ == 0 )
+
+100 \15
+\8cue
+;
+
+102 iàÐ
+ gx
+ =ð
+y
+ )
+
+103 \15
+\8cue
+;
+
+105 iàÐ!
+ gx
+ || !
+ gy
+ )
+
+106 \15
+ gçl£
+;
+
+108 cڡ \ 5*
+ gcx
+ = (cڡ \ 5*)
+x
+;
+
+109 cڡ \ 5*
+ gcy
+ = (cڡ \ 5*)
+y
+;
+
+110 \1f
+ gsize
+ -- )
+
+111 iàÐ*
+ gcx
+++ !ð*
+cy
+++ )
+
+112 \15
+çl£
+;
+
+114 \15
+ g\8cue
+;
+
+117 \1e
+doAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+118 cڡ \ 5*
+xEx´
+, cڡ \1e*
+x
+,
+
+119 cڡ \ 5*
+yEx´
+, cڡ \1e*
+y
+,
+
+120 cڡ \ 5*
+sizeEx´
+, \1d
+size
+,
+
+121 cڡ \ 5*
+mes§ge
+ )
+
+123 iàÐ!
+§meD©a
+Ð
+x
+,
+y
+,
+size
+ ) ) {
+
+124 iàÐ
+ gmes§ge
+ )
+
+125
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+126
+\8cack\94
+().
+ç\9eedAs£¹SameD©a
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+sizeEx´
+,
+x
+,
+y
+,
+size
+ );
+
+127
+TS_ABORT
+();
+
+132
+boÞ
+
+§meF\9ees
+ÐcÚ¡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+,
+¡d
+::
+o¡r\9ag¡»am
+&
+ex¶ª©iÚ
+)
+
+134
+¡d
+::
+¡r\9ag
+
+µ´ev_l\9ae
+;
+
+135
+ g¡d
+::
+¡r\9ag
+
+µ»v_l\9ae
+;
+
+136
+ g¡d
+::
+¡r\9ag
+
+´ev_l\9ae
+;
+
+137
+ g¡d
+::
+¡r\9ag
+
+cu¼_l\9ae
+;
+
+139
+ g¡d
+::
+if¡»am
+
+is1
+;
+
+140
+ gis1
+.
+ݒ
+(
+f\9ee1
+);
+
+141
+ g¡d
+::
+if¡»am
+
+is2
+;
+
+142
+ gis2
+.
+ݒ
+(
+f\9ee2
+);
+
+143 ià(!
+ gis1
+) {
+
+144
+ gex¶ª©iÚ
+ << "F\9e\90'" <<
+ gf\9ee1
+ << "' does\82ot\83xist!";
+
+145 \15
+ gçl£
+;
+
+147 ià(!
+ gis2
+) {
+
+148
+ gex¶ª©iÚ
+ << "F\9e\90'" <<
+ gf\9ee2
+ << "' does\82ot\83xist!";
+
+149 \15
+ gçl£
+;
+
+152 \12
+ gƚe
+=1;
+
+153 \ 5
+ gc1
+,
+ gc2
+;
+
+155
+ gis1
+.
+g\91
+(
+c1
+);
+
+156
+ gis2
+.
+g\91
+(
+c2
+);
+
+157 ià(!
+ gis1
+ && !
+ gis2
+è\15
+ g\8cue
+;
+
+158 ià(!
+ gis1
+) {
+
+159
+ gex¶ª©iÚ
+ << "F\9e\90'" <<
+ gf\9ee1
+ << "'\83nded befÜ\90f\9e\90'" <<
+ gf\9ee2
+ << "' (l\9a\90" <<
+ gƚe
+ << ")";
+
+160
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+ << "ð" <<
+µ´ev_l\9ae
+ <<
+¡d
+::\92dÈ<< "ð " <<
+µ»v_l\9ae
+ << std::\92dÈ<< "ð" <<
+´ev_l\9ae
+ << std::\92dÈ<< "< " <<
+cu¼_l\9ae
+;
+
+161
+ gis1
+.
+g\91
+(
+c1
+);
+
+162 \1f
+ gis1
+ && (
+ gc1
+ != '\n')) {
+
+163
+ex¶ª©iÚ
+ <<
+c1
+;
+
+164
+ gis1
+.
+g\91
+(
+c1
+);
+
+166
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+;
+
+167 \15
+ gçl£
+;
+
+169 ià(!
+ gis2
+) {
+
+170
+ gex¶ª©iÚ
+ << "F\9e\90'" <<
+ gf\9ee2
+ << "'\83nded befÜ\90f\9e\90'" <<
+ gf\9ee1
+ << "' (l\9a\90" <<
+ gƚe
+ << ")";
+
+171
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+ << "ð" <<
+µ´ev_l\9ae
+ <<
+¡d
+::\92dÈ<< "ð " <<
+µ»v_l\9ae
+ << std::\92dÈ<< "ð" <<
+´ev_l\9ae
+ << std::\92dÈ<< "> " <<
+cu¼_l\9ae
+;
+
+172
+ gis2
+.
+g\91
+(
+c2
+);
+
+173 \1f
+ gis2
+ && (
+ gc2
+ != '\n')) {
+
+174
+ex¶ª©iÚ
+ <<
+c2
+;
+
+175
+ gis2
+.
+g\91
+(
+c2
+);
+
+177
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+;
+
+178 \15
+ gçl£
+;
+
+180 ià(
+ gc1
+ !ð
+c2
+) {
+
+181
+ex¶ª©iÚ
+ << "F\9ee '" <<
+f\9ee1
+ << "'\87nd '" <<
+f\9ee2
+ << "' dif㸩\86\9a\90" <<
+ƚe
+;
+
+182
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+ << "ð" <<
+µ´ev_l\9ae
+ <<
+¡d
+::\92dÈ<< "ð " <<
+µ»v_l\9ae
+ << std::\92dÈ<< "ð" <<
+´ev_l\9ae
+;
+
+184
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+ << "< " <<
+cu¼_l\9ae
+;
+
+185
+ gis2
+.
+g\91
+(
+c1
+);
+
+186 \1f
+ gis1
+ && (
+ gc1
+ != '\n')) {
+
+187
+ex¶ª©iÚ
+ <<
+c1
+;
+
+188
+ gis2
+.
+g\91
+(
+c1
+);
+
+190
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+;
+
+192
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+ << "> " <<
+cu¼_l\9ae
+;
+
+193
+ gis2
+.
+g\91
+(
+c2
+);
+
+194 \1f
+ gis2
+ && (
+ gc2
+ != '\n')) {
+
+195
+ex¶ª©iÚ
+ <<
+c2
+;
+
+196
+ gis2
+.
+g\91
+(
+c2
+);
+
+198
+ gex¶ª©iÚ
+ <<
+ g¡d
+::
+\92dl
+;
+
+200 \15
+ gçl£
+;
+
+202 ià(
+ gc1
+ == '\n') {
+
+203
+µ´ev_l\9ae
+ =
+µ»v_l\9ae
+;
+
+204
+ gµ»v_l\9ae
+ =
+´ev_l\9ae
+;
+
+205
+ g´ev_l\9ae
+ =
+cu¼_l\9ae
+;
+
+206
+ gcu¼_l\9ae
+ = "";
+
+207
+ gƚe
+++;
+
+210
+ gcu¼_l\9ae
+ +ð
+c1
+;
+
+216 \1e
+doAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+217 cڡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+,
+
+218 cڡ \ 5*
+mes§ge
+)
+
+220 #ià
+def\9aed
+(
+_CXXTEST_HAVE_STD
+)
+
+221
+ g¡d
+::
+o¡r\9ag¡»am
+
+ex¶ª©iÚ
+;
+
+222 iàÐ!
+§meF\9ees
+Ð
+f\9ee1
+,
+f\9ee2
+,
+ex¶ª©iÚ
+ ) ) {
+
+223 iàÐ
+ gmes§ge
+ )
+
+224
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+225
+\8cack\94
+().
+ç\9eedAs£¹SameF\9ees
+Ð
+f\9ee
+,
+l\9ae
+,
+f\9ee1
+,
+f\9ee2
+,
+ex¶ª©iÚ
+.
+¡r
+().
+c_¡r
+());
+
+226
+TS_ABORT
+();
+
+229
+\8cack\94
+().
+ç\9eedAs£¹SameF\9ees
+Ð
+f\9ee
+,
+l\9ae
+,
+f\9ee1
+,
+f\9ee2
+, "This\81est is only supported when --have-std is\83nabled");
+
+230
+TS_ABORT
+();
+
+234 \1e
+doFa\9eAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+235 cڡ \ 5*
+ex´
+, cڡ \ 5*
+ty³
+,
+
+236
+boÞ
+
+Ùh\94Thrown
+,
+
+237 cڡ \ 5*
+mes§ge
+,
+
+238 cڡ \ 5*
+exû±iÚ
+ )
+
+240 iàÐ
+ gexû±iÚ
+ )
+
+241
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+exû±iÚ
+ );
+
+242 iàÐ
+ gmes§ge
+ )
+
+243
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+245
+\8cack\94
+().
+ç\9eedAs£¹Throws
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´
+,
+ty³
+,
+Ùh\94Thrown
+ );
+
+246
+TS_ABORT
+();
+
+249 \1e
+doFa\9eAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+250 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+mes§ge
+,
+
+251 cڡ \ 5*
+exû±iÚ
+ )
+
+253 iàÐ
+ gexû±iÚ
+ )
+
+254
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+exû±iÚ
+ );
+
+255 iàÐ
+ gmes§ge
+ )
+
+256
+\8cack\94
+().
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+258
+\8cack\94
+().
+ç\9eedAs£¹ThrowsNÙ
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+259
+TS_ABORT
+();
+
+ @tools/cxxtest/cxxtest/TestSuite.h
+
+12 #iâdeà
+__cxx\8b¡__Te¡Su\99e_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Te¡Su\99e_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+22 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+23 \ 2
+ ~<cxx\8b¡/Desü\9dtiÚs.h
+>
+
+24 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+25 \ 2
+ ~<s¡»am
+>
+
+27 #ià
+def\9aed
+(
+_CXXTEST_HAVE_STD
+)
+
+28 \ 2
+ ~<¡dexû±
+>
+
+31
+Çme¥aû
+
+ gCxxTe¡
+
+
+33 þas
+ cTe¡Su\99e
+
+
+35
+ gpublic
+:
+
+36
+v\9ctu®
+ ~
+Te¡Su\99e
+();
+
+37
+v\9ctu®
+ \1e
+£tUp
+();
+
+38
+v\9ctu®
+ \1e
+\8b¬Down
+();
+
+41 þas
+ cAbÜtTe¡
+ {};
+
+42 \1e
+doAbÜtTe¡
+();
+
+43 \ 1
+ #TS_ABORT
+(è
+CxxTe¡
+::
+ $doAbÜtTe¡
+()
+
+ )
+
+45
+boÞ
+
+ `abÜtTe¡OnFa\9e
+();
+
+46 \1e
+ `£tAbÜtTe¡OnFa\9e
+Ð
+boÞ
+
+v®ue
+ =
+CXXTEST_DEFAULT_ABORT
+ );
+
+48 \1d
+ `maxDumpSize
+();
+
+49 \1e
+ `£tMaxDumpSize
+Ð\1d
+v®ue
+ =
+CXXTEST_MAX_DUMP_SIZE
+ );
+
+51 \1e
+ `doT¿û
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ );
+
+52 \1e
+ `doW¬n
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ );
+
+53 \1e
+ `doFa\9eTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+mes§ge
+ );
+
+54 \1e
+ `doFa\9eAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+mes§ge
+ );
+
+56
+\8bm¶©e
+<
+þass
+
+X
+, cÏs
+Y
+>
+
+57 \19
+ sequ®s
+ {
+
+58 \18
+boÞ
+
+ `\8b¡
+Ð
+X
+
+x
+,
+Y
+
+y
+ )
+
+60 \15 (
+x
+ =ð
+y
+);
+
+62
+ }
+};
+
+64
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+65 \1e
+ $doAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+66 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+67 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+68 cڡ \ 5*
+mes§ge
+ )
+
+70 iàÐ!
+equ®s
+<
+X
+,
+Y
+>::
+ `\8b¡
+Ð
+x
+,
+y
+ ) ) {
+
+71 iàÐ
+mes§ge
+ )
+
+72
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+73
+ `\8cack\94
+().
+ `ç\9eedAs£¹Equ®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+ `TS_AS_STRING
+(
+x
+), TS_AS_STRING(
+y
+) );
+
+74
+ `TS_ABORT
+();
+
+76
+ }
+}
+
+78
+boÞ
+
+§meD©a
+ÐcÚ¡ \1e*
+x
+, cڡ \1e*
+y
+, \1d
+size
+ );
+
+80 \1e
+doAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+81 cڡ \ 5*
+xEx´
+, cڡ \1e*
+x
+,
+
+82 cڡ \ 5*
+yEx´
+, cڡ \1e*
+y
+,
+
+83 cڡ \ 5*
+sizeEx´
+, \1d
+size
+,
+
+84 cڡ \ 5*
+mes§ge
+ );
+
+87
+boÞ
+
+§meF\9ees
+ÐcÚ¡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+,
+¡d
+::
+o¡r\9ag¡»am
+&
+ex¶ª©iÚ
+);
+
+90
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+91 \19
+ sdifãrs
+ {
+
+92 \18
+boÞ
+
+\8b¡
+Ð
+X
+
+x
+,
+Y
+
+y
+ )
+
+94 \15 !(
+ gx
+ =ð
+y
+);
+
+98
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+99 \1e
+ $doAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+100 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+101 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+102 cڡ \ 5*
+mes§ge
+ )
+
+104 iàÐ!
+difãrs
+<
+X
+,
+Y
+>::
+ `\8b¡
+Ð
+x
+,
+y
+ ) ) {
+
+105 iàÐ
+mes§ge
+ )
+
+106
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+107
+ `\8cack\94
+().
+ `ç\9eedAs£¹Difãrs
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+ `TS_AS_STRING
+(
+x
+) );
+
+108
+ `TS_ABORT
+();
+
+110
+ }
+}
+
+112
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+113 \19
+ sËssThª
+ {
+
+114 \18
+boÞ
+
+\8b¡
+Ð
+X
+
+x
+,
+Y
+
+y
+ )
+
+116 \15 (
+ gx
+ <
+ gy
+);
+
+120
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+121 \1e
+ $doAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+122 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+123 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+124 cڡ \ 5*
+mes§ge
+ )
+
+126 iàÐ!
+ËssThª
+<
+X
+,
+Y
+>::
+ `\8b¡
+(
+x
+,
+y
+) ) {
+
+127 iàÐ
+mes§ge
+ )
+
+128
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+129
+ `\8cack\94
+().
+ `ç\9eedAs£¹LessThª
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+ `TS_AS_STRING
+(
+x
+), TS_AS_STRING(
+y
+) );
+
+130
+ `TS_ABORT
+();
+
+132
+ }
+}
+
+134
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+135 \19
+ sËssThªEqu®s
+ {
+
+136 \18
+boÞ
+
+\8b¡
+Ð
+X
+
+x
+,
+Y
+
+y
+ )
+
+138 \15 (
+ gx
+ <ð
+y
+);
+
+142
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+143 \1e
+ $doAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+144 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+145 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+146 cڡ \ 5*
+mes§ge
+ )
+
+148 iàÐ!
+ËssThªEqu®s
+<
+X
+,
+Y
+>::
+ `\8b¡
+Ð
+x
+,
+y
+ ) ) {
+
+149 iàÐ
+mes§ge
+ )
+
+150
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+151
+ `\8cack\94
+().
+ `ç\9eedAs£¹LessThªEqu®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+ `TS_AS_STRING
+(
+x
+), TS_AS_STRING(
+y
+) );
+
+152
+ `TS_ABORT
+();
+
+154
+ }
+}
+
+156
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gP
+>
+
+157 \1e
+ $doAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+158 cڡ \ 5*
+pEx´
+, cڡ
+P
+ &
+p
+,
+
+159 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+160 cڡ \ 5*
+mes§ge
+ )
+
+162 iàÐ!
+ `p
+Ð
+x
+ ) ) {
+
+163 iàÐ
+mes§ge
+ )
+
+164
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+165
+ `\8cack\94
+().
+ `ç\9eedAs£¹P»diÿ\8b
+Ð
+f\9ee
+,
+l\9ae
+,
+pEx´
+,
+xEx´
+,
+ `TS_AS_STRING
+(
+x
+) );
+
+166
+ `TS_ABORT
+();
+
+168
+ }
+}
+
+170
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+, cÏs
+ gR
+>
+
+171 \1e
+ $doAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+172 cڡ \ 5*
+rEx´
+, cڡ
+R
+ &
+r
+,
+
+173 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+174 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+175 cڡ \ 5*
+mes§ge
+ )
+
+177 iàÐ!
+ `r
+Ð
+x
+,
+y
+ ) ) {
+
+178 iàÐ
+mes§ge
+ )
+
+179
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+180
+ `\8cack\94
+().
+ `ç\9eedAs£¹R\96©iÚ
+Ð
+f\9ee
+,
+l\9ae
+,
+rEx´
+,
+xEx´
+,
+yEx´
+,
+ `TS_AS_STRING
+(
+x
+), TS_AS_STRING(
+y
+) );
+
+181
+ `TS_ABORT
+();
+
+183
+ }
+}
+
+187
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+>
+
+188
+boÞ
+
+ $d\96\8f_Ë_h\96³r
+Ð
+X
+
+x
+,
+Y
+
+y
+ )
+
+190 \15
+ËssThªEqu®s
+<
+X
+,
+Y
+>::
+ `\8b¡
+(
+x
+,
+y
+);
+
+191
+ }
+}
+
+193
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+, cÏs
+ gD
+>
+
+194 \19
+ sd\96\8f
+ {
+
+195 \18
+boÞ
+
+\8b¡
+Ð
+X
+
+x
+,
+Y
+
+y
+,
+D
+
+d
+ )
+
+197 \15
+d\96\8f_Ë_h\96³r
+(
+x
+-
+d
+,
+y
+) && delta_le_helper(y, x+d);
+
+202
+ g\8bm¶©e
+<
+þass
+
+ gX
+, cÏs
+ gY
+, cÏs
+ gD
+>
+
+203 \1e
+ $doAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+204 cڡ \ 5*
+xEx´
+,
+X
+
+x
+,
+
+205 cڡ \ 5*
+yEx´
+,
+Y
+
+y
+,
+
+206 cڡ \ 5*
+dEx´
+,
+D
+
+d
+,
+
+207 cڡ \ 5*
+mes§ge
+ )
+
+209 iàÐ!
+d\96\8f
+<
+X
+,
+Y
+,
+D
+>::
+ `\8b¡
+Ð
+x
+,
+y
+,
+d
+ ) ) {
+
+210 iàÐ
+mes§ge
+ )
+
+211
+ `\8cack\94
+().
+ `ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+mes§ge
+ );
+
+213
+ `\8cack\94
+().
+ `ç\9eedAs£¹D\96\8f
+Ð
+f\9ee
+,
+l\9ae
+,
+xEx´
+,
+yEx´
+,
+dEx´
+,
+
+214
+ `TS_AS_STRING
+(
+x
+), TS_AS_STRING(
+y
+), TS_AS_STRING(
+d
+) );
+
+215
+ `TS_ABORT
+();
+
+217
+ }
+}
+
+219 \1e
+doFa\9eAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+220 cڡ \ 5*
+ex´
+, cڡ \ 5*
+ty³
+,
+
+221
+boÞ
+
+Ùh\94Thrown
+,
+
+222 cڡ \ 5*
+mes§ge
+,
+
+223 cڡ \ 5*
+exû±iÚ
+ = 0 );
+
+225 \1e
+doFa\9eAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+226 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+mes§ge
+,
+
+227 cڡ \ 5*
+exû±iÚ
+ = 0 );
+
+229 \1e
+doAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+230 cڡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+,
+
+231 cڡ \ 5*
+mes§ge
+);
+
+233 #ifdeà
+_CXXTEST_HAVE_EH
+
+
+234 \ 1
+ #_TS_TRY
+
+\8cy
+
+
+ )
+
+235 \ 1
+ #_TS_CATCH_TYPE
+(
+t
+,
+b
+è
+ÿtch
+\81
+ )
+b
+
+236 \ 1
+ #_TS_CATCH_ABORT
+(
+b
+è
+ `_TS_CATCH_TYPE
+Ð(cÚ¡
+CxxTe¡
+::
+AbÜtTe¡
+ &), b )
+
+ )
+
+237 \ 1
+ #_TS_LAST_CATCH
+(
+b
+è
+ `_TS_CATCH_TYPE
+Ð(...), b )
+
+ )
+
+238 \ 1
+ #_TSM_LAST_CATCH
+(
+f
+,
+l
+,
+m
+è
+ `_TS_LAST_CATCH
+Ð{ (
+CxxTe¡
+::
+ `\8cack\94
+()).
+ `ç\9eedTe¡
+(f,l,m);
+ `TS_ABORT
+(); } )
+
+ )
+
+239 #ifdeà
+_CXXTEST_HAVE_STD
+
+
+240 \ 1
+ #_TS_CATCH_STD
+(
+e
+,
+b
+è
+ `_TS_CATCH_TYPE
+Ð(cÚ¡
+¡d
+::
+exû±iÚ
+&\83), b )
+
+ )
+
+242 \ 1
+ #_TS_CATCH_STD
+(
+e
+,
+b
+)
+
+ )
+
+244 \ 1
+ #___TSM_CATCH
+(
+f
+,
+l
+,
+m
+) \
+
+245
+ `_TS_CATCH_STD
+(
+e
+, { (
+CxxTe¡
+::
+ `\8cack\94
+()).
+ `ç\9eedTe¡
+(
+f
+,
+l
+,e.
+ `wh©
+());
+ `TS_ABORT
+(); }) \
+
+246
+ $_TSM_LAST_CATCH
+(
+f
+,
+l
+,
+m
+)
+
+ )
+
+247 \ 1
+ #__TSM_CATCH
+(
+f
+,
+l
+,
+m
+) \
+
+248
+ `_TS_CATCH_ABORT
+Ð{
+throw
+;
+ }
+} ) \
+
+249
+ $___TSM_CATCH
+(
+f
+,
+l
+,
+m
+)
+
+ )
+
+250 \ 1
+ #__TS_CATCH
+(
+f
+,
+l
+è
+ `__TSM_CATCH
+(f,l,"UnhªdËd\83xû±iÚ")
+
+ )
+
+251 \ 1
+ #_TS_CATCH
+
+ $__TS_CATCH
+(
+__FILE__
+,
+__LINE__
+)
+
+ )
+
+253 \ 1
+ #_TS_TRY
+
+
+ )
+
+254 \ 1
+ #___TSM_CATCH
+(
+f
+,
+l
+,
+m
+)
+
+ )
+
+255 \ 1
+ #__TSM_CATCH
+(
+f
+,
+l
+,
+m
+)
+
+ )
+
+256 \ 1
+ #__TS_CATCH
+(
+f
+,
+l
+)
+
+ )
+
+257 \ 1
+ #_TS_CATCH
+
+
+ )
+
+258 \ 1
+ #_TS_CATCH_TYPE
+(
+t
+,
+b
+)
+
+ )
+
+259 \ 1
+ #_TS_LAST_CATCH
+(
+b
+)
+
+ )
+
+260 \ 1
+ #_TS_CATCH_STD
+(
+e
+,
+b
+)
+
+ )
+
+261 \ 1
+ #_TS_CATCH_ABORT
+(
+b
+)
+
+ )
+
+265 \ 1
+ #_TS_TRACE
+(
+f
+,
+l
+,
+e
+è
+CxxTe¡
+::
+ `doT¿û
+Ð(f), (l),
+ $TS_AS_STRING
+(
+e
+è)
+
+ )
+
+266 \ 1
+ #TS_TRACE
+(
+e
+è
+ $_TS_TRACE
+Ð
+__FILE__
+,
+__LINE__
+,
+e
+ )
+
+ )
+
+269 \ 1
+ #_TS_WARN
+(
+f
+,
+l
+,
+e
+è
+CxxTe¡
+::
+ `doW¬n
+Ð(f), (l),
+ $TS_AS_STRING
+(
+e
+è)
+
+ )
+
+270 \ 1
+ #TS_WARN
+(
+e
+è
+ $_TS_WARN
+Ð
+__FILE__
+,
+__LINE__
+,
+e
+ )
+
+ )
+
+273 \ 1
+ #_TS_FAIL
+(
+f
+,
+l
+,
+e
+è
+CxxTe¡
+::
+ `doFa\9eTe¡
+Ð(f), (l),
+ $TS_AS_STRING
+(
+e
+è)
+
+ )
+
+274 \ 1
+ #TS_FAIL
+(
+e
+è
+ $_TS_FAIL
+Ð
+__FILE__
+,
+__LINE__
+,
+e
+ )
+
+ )
+
+277 \ 1
+ #___ETS_ASSERT
+(
+f
+,
+l
+,
+e
+,
+m
+è{ iàÐ!Óèè
+CxxTe¡
+::
+ `doFa\9eAs£¹
+Ð(f), (l), #e, (mè);
+ }
+
+ )
+}
+
+278 \ 1
+ #___TS_ASSERT
+(
+f
+,
+l
+,
+e
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT
+(f,l,e,m); }
+ `__TS_CATCH
+(f,lè}
+
+ )
+
+280 \ 1
+ #_ETS_ASSERT
+(
+f
+,
+l
+,
+e
+è
+ $___ETS_ASSERT
+(
+f
+,
+l
+,
+e
+,0)
+
+ )
+
+281 \ 1
+ #_TS_ASSERT
+(
+f
+,
+l
+,
+e
+è
+ $___TS_ASSERT
+(
+f
+,
+l
+,
+e
+,0)
+
+ )
+
+283 \ 1
+ #ETS_ASSERT
+(
+e
+è
+ $_ETS_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+e
+)
+
+ )
+
+284 \ 1
+ #TS_ASSERT
+(
+e
+è
+ $_TS_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+e
+)
+
+ )
+
+286 \ 1
+ #_ETSM_ASSERT
+(
+f
+,
+l
+,
+m
+,
+e
+è
+ `___ETS_ASSERT
+(f,l,e,
+ $TS_AS_STRING
+(
+m
+è)
+
+ )
+
+287 \ 1
+ #_TSM_ASSERT
+(
+f
+,
+l
+,
+m
+,
+e
+è
+ `___TS_ASSERT
+(f,l,e,
+ $TS_AS_STRING
+(
+m
+è)
+
+ )
+
+289 \ 1
+ #ETSM_ASSERT
+(
+m
+,
+e
+è
+ $_ETSM_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+)
+
+ )
+
+290 \ 1
+ #TSM_ASSERT
+(
+m
+,
+e
+è
+ $_TSM_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+)
+
+ )
+
+293 \ 1
+ #___ETS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹Equ®s
+Ð(f), (l), #x, (x), #y, (y), (mè)
+
+ )
+
+294 \ 1
+ #___TS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT_EQUALS
+(f,l,x,y,m); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+296 \ 1
+ #_ETS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+297 \ 1
+ #_TS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___TS_ASSERT_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+299 \ 1
+ #ETS_ASSERT_EQUALS
+(
+x
+,
+y
+è
+ $_ETS_ASSERT_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+300 \ 1
+ #TS_ASSERT_EQUALS
+(
+x
+,
+y
+è
+ $_TS_ASSERT_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+302 \ 1
+ #_ETSM_ASSERT_EQUALS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_EQUALS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+303 \ 1
+ #_TSM_ASSERT_EQUALS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___TS_ASSERT_EQUALS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+305 \ 1
+ #ETSM_ASSERT_EQUALS
+(
+m
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+306 \ 1
+ #TSM_ASSERT_EQUALS
+(
+m
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+309 \ 1
+ #___ETS_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+s
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹SameD©a
+Ð(f), (l), #x, (x), #y, (y), #s, (s), (mè)
+
+ )
+
+310 \ 1
+ #___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è
+ }
+
+ )
+}
+
+312 \ 1
+ #_ETS_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+s
+è
+ $___ETS_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+s
+,0)
+
+ )
+
+313 \ 1
+ #_TS_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+s
+è
+ $___TS_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+s
+,0)
+
+ )
+
+315 \ 1
+ #ETS_ASSERT_SAME_DATA
+(
+x
+,
+y
+,
+s
+è
+ $_ETS_ASSERT_SAME_DATA
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+,
+s
+)
+
+ )
+
+316 \ 1
+ #TS_ASSERT_SAME_DATA
+(
+x
+,
+y
+,
+s
+è
+ $_TS_ASSERT_SAME_DATA
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+,
+s
+)
+
+ )
+
+318 \ 1
+ #_ETSM_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+,
+s
+è
+ `___ETS_ASSERT_SAME_DATA
+(f,l,x,y,s,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+319 \ 1
+ #_TSM_ASSERT_SAME_DATA
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+,
+s
+è
+ `___TS_ASSERT_SAME_DATA
+(f,l,x,y,s,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+321 \ 1
+ #ETSM_ASSERT_SAME_DATA
+(
+m
+,
+x
+,
+y
+,
+s
+è
+ $_ETSM_ASSERT_SAME_DATA
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+,
+s
+)
+
+ )
+
+322 \ 1
+ #TSM_ASSERT_SAME_DATA
+(
+m
+,
+x
+,
+y
+,
+s
+è
+ $_TSM_ASSERT_SAME_DATA
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+,
+s
+)
+
+ )
+
+325 \ 1
+ #___ETS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹Difãrs
+Ð(f), (l), #x, (x), #y, (y), (mè)
+
+ )
+
+326 \ 1
+ #___TS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT_DIFFERS
+(f,l,x,y,m); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+328 \ 1
+ #_ETS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+329 \ 1
+ #_TS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___TS_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+331 \ 1
+ #ETS_ASSERT_DIFFERS
+(
+x
+,
+y
+è
+ $_ETS_ASSERT_DIFFERS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+332 \ 1
+ #TS_ASSERT_DIFFERS
+(
+x
+,
+y
+è
+ $_TS_ASSERT_DIFFERS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+334 \ 1
+ #_ETSM_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_DIFFERS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+335 \ 1
+ #_TSM_ASSERT_DIFFERS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___TS_ASSERT_DIFFERS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+337 \ 1
+ #ETSM_ASSERT_DIFFERS
+(
+m
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_DIFFERS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+338 \ 1
+ #TSM_ASSERT_DIFFERS
+(
+m
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_DIFFERS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+341 \ 1
+ #___ETS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹LessThª
+Ð(f), (l), #x, (x), #y, (y), (mè)
+
+ )
+
+342 \ 1
+ #___TS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT_LESS_THAN
+(f,l,x,y,m); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+344 \ 1
+ #_ETS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+345 \ 1
+ #_TS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___TS_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+347 \ 1
+ #ETS_ASSERT_LESS_THAN
+(
+x
+,
+y
+è
+ $_ETS_ASSERT_LESS_THAN
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+348 \ 1
+ #TS_ASSERT_LESS_THAN
+(
+x
+,
+y
+è
+ $_TS_ASSERT_LESS_THAN
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+350 \ 1
+ #_ETSM_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_LESS_THAN
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+351 \ 1
+ #_TSM_ASSERT_LESS_THAN
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___TS_ASSERT_LESS_THAN
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+353 \ 1
+ #ETSM_ASSERT_LESS_THAN
+(
+m
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_LESS_THAN
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+354 \ 1
+ #TSM_ASSERT_LESS_THAN
+(
+m
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_LESS_THAN
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+357 \ 1
+ #___ETS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+) \
+
+358
+CxxTe¡
+::
+ `doAs£¹LessThªEqu®s
+Ð(
+f
+), (
+l
+), #x, (
+x
+), #y, (
+y
+), (
+m
+è)
+
+ )
+
+359 \ 1
+ #___TS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+) \
+
+360 {
+_TS_TRY
+ {
+ `___ETS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+362 \ 1
+ #_ETS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+363 \ 1
+ #_TS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___TS_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+365 \ 1
+ #ETS_ASSERT_LESS_THAN_EQUALS
+(
+x
+,
+y
+è
+ $_ETS_ASSERT_LESS_THAN_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+366 \ 1
+ #TS_ASSERT_LESS_THAN_EQUALS
+(
+x
+,
+y
+è
+ $_TS_ASSERT_LESS_THAN_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+368 \ 1
+ #_ETSM_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_LESS_THAN_EQUALS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+369 \ 1
+ #_TSM_ASSERT_LESS_THAN_EQUALS
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___TS_ASSERT_LESS_THAN_EQUALS
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+371 \ 1
+ #ETSM_ASSERT_LESS_THAN_EQUALS
+(
+m
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_LESS_THAN_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+372 \ 1
+ #TSM_ASSERT_LESS_THAN_EQUALS
+(
+m
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_LESS_THAN_EQUALS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+375 \ 1
+ #___ETS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+,
+m
+) \
+
+376
+CxxTe¡
+::
+ `doAs£¹P»diÿ\8b
+Ð(
+f
+), (
+l
+), #p,
+ `p
+(), #x, (
+x
+), (
+m
+è)
+
+ )
+
+377 \ 1
+ #___TS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+,
+m
+) \
+
+378 {
+_TS_TRY
+ {
+ `___ETS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+,
+m
+); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+380 \ 1
+ #_ETS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+è
+ $___ETS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+,0)
+
+ )
+
+381 \ 1
+ #_TS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+è
+ $___TS_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+p
+,
+x
+,0)
+
+ )
+
+383 \ 1
+ #ETS_ASSERT_PREDICATE
+(
+p
+,
+x
+è
+ $_ETS_ASSERT_PREDICATE
+(
+__FILE__
+,
+__LINE__
+,
+p
+,
+x
+)
+
+ )
+
+384 \ 1
+ #TS_ASSERT_PREDICATE
+(
+p
+,
+x
+è
+ $_TS_ASSERT_PREDICATE
+(
+__FILE__
+,
+__LINE__
+,
+p
+,
+x
+)
+
+ )
+
+386 \ 1
+ #_ETSM_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+m
+,
+p
+,
+x
+è
+ `___ETS_ASSERT_PREDICATE
+(f,l,p,x,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+387 \ 1
+ #_TSM_ASSERT_PREDICATE
+(
+f
+,
+l
+,
+m
+,
+p
+,
+x
+è
+ `___TS_ASSERT_PREDICATE
+(f,l,p,x,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+389 \ 1
+ #ETSM_ASSERT_PREDICATE
+(
+m
+,
+p
+,
+x
+è
+ $_ETSM_ASSERT_PREDICATE
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+p
+,
+x
+)
+
+ )
+
+390 \ 1
+ #TSM_ASSERT_PREDICATE
+(
+m
+,
+p
+,
+x
+è
+ $_TSM_ASSERT_PREDICATE
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+p
+,
+x
+)
+
+ )
+
+393 \ 1
+ #___ETS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+,
+m
+) \
+
+394
+CxxTe¡
+::
+ `doAs£¹R\96©iÚ
+Ð(
+f
+), (
+l
+), #r,
+ `r
+(), #x, (
+x
+), #y, (
+y
+), (
+m
+è)
+
+ )
+
+395 \ 1
+ #___TS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+,
+m
+) \
+
+396 {
+_TS_TRY
+ {
+ `___ETS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+,
+m
+); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+398 \ 1
+ #_ETS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+,0)
+
+ )
+
+399 \ 1
+ #_TS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+è
+ $___TS_ASSERT_RELATION
+(
+f
+,
+l
+,
+r
+,
+x
+,
+y
+,0)
+
+ )
+
+401 \ 1
+ #ETS_ASSERT_RELATION
+(
+r
+,
+x
+,
+y
+è
+ $_ETS_ASSERT_RELATION
+(
+__FILE__
+,
+__LINE__
+,
+r
+,
+x
+,
+y
+)
+
+ )
+
+402 \ 1
+ #TS_ASSERT_RELATION
+(
+r
+,
+x
+,
+y
+è
+ $_TS_ASSERT_RELATION
+(
+__FILE__
+,
+__LINE__
+,
+r
+,
+x
+,
+y
+)
+
+ )
+
+404 \ 1
+ #_ETSM_ASSERT_RELATION
+(
+f
+,
+l
+,
+m
+,
+r
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_RELATION
+(f,l,r,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+405 \ 1
+ #_TSM_ASSERT_RELATION
+(
+f
+,
+l
+,
+m
+,
+r
+,
+x
+,
+y
+è
+ `___TS_ASSERT_RELATION
+(f,l,r,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+407 \ 1
+ #ETSM_ASSERT_RELATION
+(
+m
+,
+r
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_RELATION
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+r
+,
+x
+,
+y
+)
+
+ )
+
+408 \ 1
+ #TSM_ASSERT_RELATION
+(
+m
+,
+r
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_RELATION
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+r
+,
+x
+,
+y
+)
+
+ )
+
+411 \ 1
+ #___ETS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹D\96\8f
+Ð(f), (l), #x, (x), #y, (y), #d, (d), (mè)
+
+ )
+
+412 \ 1
+ #___TS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT_DELTA
+(f,l,x,y,d,m); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+414 \ 1
+ #_ETS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+è
+ $___ETS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+,0)
+
+ )
+
+415 \ 1
+ #_TS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+è
+ $___TS_ASSERT_DELTA
+(
+f
+,
+l
+,
+x
+,
+y
+,
+d
+,0)
+
+ )
+
+417 \ 1
+ #ETS_ASSERT_DELTA
+(
+x
+,
+y
+,
+d
+è
+ $_ETS_ASSERT_DELTA
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+,
+d
+)
+
+ )
+
+418 \ 1
+ #TS_ASSERT_DELTA
+(
+x
+,
+y
+,
+d
+è
+ $_TS_ASSERT_DELTA
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+,
+d
+)
+
+ )
+
+420 \ 1
+ #_ETSM_ASSERT_DELTA
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+,
+d
+è
+ `___ETS_ASSERT_DELTA
+(f,l,x,y,d,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+421 \ 1
+ #_TSM_ASSERT_DELTA
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+,
+d
+è
+ `___TS_ASSERT_DELTA
+(f,l,x,y,d,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+423 \ 1
+ #ETSM_ASSERT_DELTA
+(
+m
+,
+x
+,
+y
+,
+d
+è
+ $_ETSM_ASSERT_DELTA
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+,
+d
+)
+
+ )
+
+424 \ 1
+ #TSM_ASSERT_DELTA
+(
+m
+,
+x
+,
+y
+,
+d
+è
+ $_TSM_ASSERT_DELTA
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+,
+d
+)
+
+ )
+
+427 \ 1
+ #___ETS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è
+CxxTe¡
+::
+ `doAs£¹SameF\9ees
+Ð(f), (l), (x), (y), (mè)
+
+ )
+
+428 \ 1
+ #___TS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+,
+m
+è{
+_TS_TRY
+ {
+ `___ETS_ASSERT_SAME_FILES
+(f,l,x,y,m); }
+ `__TS_CATCH
+(f,lè
+ }
+
+ )
+}
+
+430 \ 1
+ #_ETS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___ETS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+431 \ 1
+ #_TS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+è
+ $___TS_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+x
+,
+y
+,0)
+
+ )
+
+433 \ 1
+ #ETS_ASSERT_SAME_FILES
+(
+x
+,
+y
+è
+ $_ETS_ASSERT_SAME_FILES
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+434 \ 1
+ #TS_ASSERT_SAME_FILES
+(
+x
+,
+y
+è
+ $_TS_ASSERT_SAME_FILES
+(
+__FILE__
+,
+__LINE__
+,
+x
+,
+y
+)
+
+ )
+
+436 \ 1
+ #_ETSM_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___ETS_ASSERT_SAME_FILES
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+437 \ 1
+ #_TSM_ASSERT_SAME_FILES
+(
+f
+,
+l
+,
+m
+,
+x
+,
+y
+è
+ `___TS_ASSERT_SAME_FILES
+(f,l,x,y,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+439 \ 1
+ #ETSM_ASSERT_SAME_FILES
+(
+m
+,
+x
+,
+y
+è
+ $_ETSM_ASSERT_SAME_FILES
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+440 \ 1
+ #TSM_ASSERT_SAME_FILES
+(
+m
+,
+x
+,
+y
+è
+ $_TSM_ASSERT_SAME_FILES
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+x
+,
+y
+)
+
+ )
+
+444 \ 1
+ #___TS_ASSERT_THROWS
+(
+f
+,
+l
+,
+e
+,
+t
+,
+m
+è
+ `___TS_ASSERT_THROWS_ASSERT
+(f,l,e,t,(\1e)0,m)
+
+ )
+
+446 \ 1
+ #_TS_ASSERT_THROWS
+(
+f
+,
+l
+,
+e
+,
+t
+è
+ $___TS_ASSERT_THROWS
+(
+f
+,
+l
+,
+e
+,
+t
+,0)
+
+ )
+
+447 \ 1
+ #TS_ASSERT_THROWS
+(
+e
+,
+t
+è
+ $_TS_ASSERT_THROWS
+(
+__FILE__
+,
+__LINE__
+,
+e
+,
+t
+)
+
+ )
+
+449 \ 1
+ #_TSM_ASSERT_THROWS
+(
+f
+,
+l
+,
+m
+,
+e
+,
+t
+è
+ `___TS_ASSERT_THROWS
+(f,l,e,t,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+450 \ 1
+ #TSM_ASSERT_THROWS
+(
+m
+,
+e
+,
+t
+è
+ $_TSM_ASSERT_THROWS
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+,
+t
+)
+
+ )
+
+453 \ 1
+ #___TS_ASSERT_THROWS_ASSERT
+(
+f
+,
+l
+,
+e
+,
+t
+,
+a
+,
+m
+) { \
+
+454
+boÞ
+
+_ts_th»w_ex³ùed
+ =
+çl£
+,
+_ts_th»w_\96£
+ = false; \
+
+455
+_TS_TRY
+ {
+e
+; } \
+
+456
+ `_TS_CATCH_TYPE
+Ð(
+t
+), {
+a
+;
+_ts_th»w_ex³ùed
+ =
+\8cue
+; } ) \
+
+457
+ `_TS_CATCH_ABORT
+Ð{
+throw
+; } ) \
+
+458
+ `_TS_CATCH_STD
+Ð
+ex
+, {
+_ts_th»w_ex³ùed
+ =
+\8cue
+;
+CxxTe¡
+::
+ `doFa\9eAs£¹Throws
+((
+f
+), (
+l
+), #e, #t,\81rue, (
+m
+),\83x.
+ `wh©
+() ); } ) \
+
+459
+ `_TS_LAST_CATCH
+Ð{
+_ts_th»w_\96£
+ =
+\8cue
+; } ) \
+
+460 iàÐ!
+_ts_th»w_ex³ùed
+ ) {
+CxxTe¡
+::
+ `doFa\9eAs£¹Throws
+Ð(
+f
+), (
+l
+), #e, #t,
+_ts_th»w_\96£
+, (
+m
+), 0 ); }
+ }
+
+ )
+}
+
+462 \ 1
+ #_TS_ASSERT_THROWS_ASSERT
+(
+f
+,
+l
+,
+e
+,
+t
+,
+a
+è
+ $___TS_ASSERT_THROWS_ASSERT
+(
+f
+,
+l
+,
+e
+,
+t
+,
+a
+,0)
+
+ )
+
+463 \ 1
+ #TS_ASSERT_THROWS_ASSERT
+(
+e
+,
+t
+,
+a
+è
+ $_TS_ASSERT_THROWS_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+e
+,
+t
+,
+a
+)
+
+ )
+
+465 \ 1
+ #_TSM_ASSERT_THROWS_ASSERT
+(
+f
+,
+l
+,
+m
+,
+e
+,
+t
+,
+a
+è
+ `___TS_ASSERT_THROWS_ASSERT
+(f,l,e,t,a,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+466 \ 1
+ #TSM_ASSERT_THROWS_ASSERT
+(
+m
+,
+e
+,
+t
+,
+a
+è
+ $_TSM_ASSERT_THROWS_ASSERT
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+,
+t
+,
+a
+)
+
+ )
+
+469 \ 1
+ #TS_ASSERT_THROWS_EQUALS
+(
+e
+,
+t
+,
+x
+,
+y
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_EQUALS
+(
+x
+,
+y
+))
+
+ )
+
+470 \ 1
+ #TSM_ASSERT_THROWS_EQUALS
+(
+m
+,
+e
+,
+t
+,
+x
+,
+y
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_EQUALS
+(
+m
+,
+x
+,
+y
+))
+
+ )
+
+473 \ 1
+ #TS_ASSERT_THROWS_DIFFERS
+(
+e
+,
+t
+,
+x
+,
+y
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_DIFFERS
+(
+x
+,
+y
+))
+
+ )
+
+474 \ 1
+ #TSM_ASSERT_THROWS_DIFFERS
+(
+m
+,
+e
+,
+t
+,
+x
+,
+y
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_DIFFERS
+(
+m
+,
+x
+,
+y
+))
+
+ )
+
+477 \ 1
+ #TS_ASSERT_THROWS_DELTA
+(
+e
+,
+t
+,
+x
+,
+y
+,
+d
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_DELTA
+(
+x
+,
+y
+,
+d
+))
+
+ )
+
+478 \ 1
+ #TSM_ASSERT_THROWS_DELTA
+(
+m
+,
+e
+,
+t
+,
+x
+,
+y
+,
+d
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_DELTA
+(
+m
+,
+x
+,
+y
+,
+d
+))
+
+ )
+
+481 \ 1
+ #TS_ASSERT_THROWS_SAME_DATA
+(
+e
+,
+t
+,
+x
+,
+y
+,
+s
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_SAME_DATA
+(
+x
+,
+y
+,
+s
+))
+
+ )
+
+482 \ 1
+ #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
+))
+
+ )
+
+485 \ 1
+ #TS_ASSERT_THROWS_LESS_THAN
+(
+e
+,
+t
+,
+x
+,
+y
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_LESS_THAN
+(
+x
+,
+y
+))
+
+ )
+
+486 \ 1
+ #TSM_ASSERT_THROWS_LESS_THAN
+(
+m
+,
+e
+,
+t
+,
+x
+,
+y
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_LESS_THAN
+(
+m
+,
+x
+,
+y
+))
+
+ )
+
+489 \ 1
+ #TS_ASSERT_THROWS_LESS_THAN_EQUALS
+(
+e
+,
+t
+,
+x
+,
+y
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_LESS_THAN_EQUALS
+(
+x
+,
+y
+))
+
+ )
+
+490 \ 1
+ #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
+))
+
+ )
+
+493 \ 1
+ #TS_ASSERT_THROWS_PREDICATE
+(
+e
+,
+t
+,
+p
+,
+v
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_PREDICATE
+(
+p
+,
+v
+))
+
+ )
+
+494 \ 1
+ #TSM_ASSERT_THROWS_PREDICATE
+(
+m
+,
+e
+,
+t
+,
+p
+,
+v
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_PREDICATE
+(
+m
+,
+p
+,
+v
+))
+
+ )
+
+497 \ 1
+ #TS_ASSERT_THROWS_RELATION
+(
+e
+,
+t
+,
+r
+,
+x
+,
+y
+è
+ `TS_ASSERT_THROWS_ASSERT
+Ó,t,
+ $TS_ASSERT_RELATION
+(
+r
+,
+x
+,
+y
+))
+
+ )
+
+498 \ 1
+ #TSM_ASSERT_THROWS_RELATION
+(
+m
+,
+e
+,
+t
+,
+r
+,
+x
+,
+y
+è
+ `TSM_ASSERT_THROWS_ASSERT
+(m,e,t,
+ $TSM_ASSERT_RELATION
+(
+m
+,
+r
+,
+x
+,
+y
+))
+
+ )
+
+501 \ 1
+ #___TS_ASSERT_THROWS_ANYTHING
+(
+f
+,
+l
+,
+e
+,
+m
+) { \
+
+502
+boÞ
+
+_ts_th»w
+ =
+çl£
+; \
+
+503
+_TS_TRY
+ {
+e
+; } \
+
+504
+ `_TS_LAST_CATCH
+Ð{
+_ts_th»w
+ =
+\8cue
+; } ) \
+
+505 iàÐ!
+_ts_th»w
+ ) {
+CxxTe¡
+::
+ `doFa\9eAs£¹Throws
+Ð(
+f
+), (
+l
+), #e, "...",
+çl£
+, (
+m
+è); }
+ }
+
+ )
+}
+
+507 \ 1
+ #_TS_ASSERT_THROWS_ANYTHING
+(
+f
+,
+l
+,
+e
+è
+ $___TS_ASSERT_THROWS_ANYTHING
+(
+f
+,
+l
+,
+e
+,0)
+
+ )
+
+508 \ 1
+ #TS_ASSERT_THROWS_ANYTHING
+(
+e
+è
+ $_TS_ASSERT_THROWS_ANYTHING
+(
+__FILE__
+,
+__LINE__
+,
+e
+)
+
+ )
+
+510 \ 1
+ #_TSM_ASSERT_THROWS_ANYTHING
+(
+f
+,
+l
+,
+m
+,
+e
+è
+ `___TS_ASSERT_THROWS_ANYTHING
+(f,l,e,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+511 \ 1
+ #TSM_ASSERT_THROWS_ANYTHING
+(
+m
+,
+e
+è
+ $_TSM_ASSERT_THROWS_ANYTHING
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+)
+
+ )
+
+514 \ 1
+ #___TS_ASSERT_THROWS_NOTHING
+(
+f
+,
+l
+,
+e
+,
+m
+) { \
+
+515
+_TS_TRY
+ {
+e
+; } \
+
+516
+ `_TS_CATCH_ABORT
+Ð{
+throw
+; } ) \
+
+517
+ `_TS_CATCH_STD
+(
+ex
+, {
+CxxTe¡
+::
+ `doFa\9eAs£¹ThrowsNÙ
+Ð(
+f
+), (
+l
+), #e, (
+m
+),\83x.
+ `wh©
+() ); } ) \
+
+518
+ `_TS_LAST_CATCH
+Ð{
+CxxTe¡
+::
+ `doFa\9eAs£¹ThrowsNÙ
+Ð(
+f
+), (
+l
+), #e, (
+m
+), 0 ); } )
+ }
+
+ )
+}
+
+520 \ 1
+ #_TS_ASSERT_THROWS_NOTHING
+(
+f
+,
+l
+,
+e
+è
+ $___TS_ASSERT_THROWS_NOTHING
+(
+f
+,
+l
+,
+e
+,0)
+
+ )
+
+521 \ 1
+ #TS_ASSERT_THROWS_NOTHING
+(
+e
+è
+ $_TS_ASSERT_THROWS_NOTHING
+(
+__FILE__
+,
+__LINE__
+,
+e
+)
+
+ )
+
+523 \ 1
+ #_TSM_ASSERT_THROWS_NOTHING
+(
+f
+,
+l
+,
+m
+,
+e
+è
+ `___TS_ASSERT_THROWS_NOTHING
+(f,l,e,
+ $TS_AS_STRING
+(
+m
+))
+
+ )
+
+524 \ 1
+ #TSM_ASSERT_THROWS_NOTHING
+(
+m
+,
+e
+è
+ $_TSM_ASSERT_THROWS_NOTHING
+(
+__FILE__
+,
+__LINE__
+,
+m
+,
+e
+)
+
+ )
+
+530 \ 1
+ #CXXTEST_COMPARISONS
+(
+CXXTEST_X
+,
+CXXTEST_Y
+,
+CXXTEST_T
+) \
+
+531
+\8bm¶©e
+<> \19
+equ®s
+<
+CXXTEST_X
+,
+CXXTEST_Y
+> { \
+
+532 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_X
+
+x
+,
+CXXTEST_Y
+
+y
+) { \
+
+533 \15
+equ®s
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); }
+ }
+}; \
+
+534
+\8bm¶©e
+<> \19
+equ®s
+<
+CXXTEST_Y
+,
+CXXTEST_X
+> { \
+
+535 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_Y
+
+x
+,
+CXXTEST_X
+
+y
+) { \
+
+536 \15
+equ®s
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+537
+\8bm¶©e
+<> \19
+difãrs
+<
+CXXTEST_X
+,
+CXXTEST_Y
+> { \
+
+538 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_X
+
+x
+,
+CXXTEST_Y
+
+y
+) { \
+
+539 \15
+difãrs
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+540
+\8bm¶©e
+<> \19
+difãrs
+<
+CXXTEST_Y
+,
+CXXTEST_X
+> { \
+
+541 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_Y
+
+x
+,
+CXXTEST_X
+
+y
+) { \
+
+542 \15
+difãrs
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+543
+\8bm¶©e
+<> \19
+ËssThª
+<
+CXXTEST_X
+,
+CXXTEST_Y
+> { \
+
+544 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_X
+
+x
+,
+CXXTEST_Y
+
+y
+) { \
+
+545 \15
+ËssThª
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+546
+\8bm¶©e
+<> \19
+ËssThª
+<
+CXXTEST_Y
+,
+CXXTEST_X
+> { \
+
+547 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_Y
+
+x
+,
+CXXTEST_X
+
+y
+) { \
+
+548 \15
+ËssThª
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+549
+\8bm¶©e
+<> \19
+ËssThªEqu®s
+<
+CXXTEST_X
+,
+CXXTEST_Y
+> { \
+
+550 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_X
+
+x
+,
+CXXTEST_Y
+
+y
+) { \
+
+551 \15
+ËssThªEqu®s
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }; \
+
+552
+\8bm¶©e
+<> \19
+ËssThªEqu®s
+<
+CXXTEST_Y
+,
+CXXTEST_X
+> { \
+
+553 \18
+boÞ
+
+ `\8b¡
+(
+CXXTEST_Y
+
+x
+,
+CXXTEST_X
+
+y
+) { \
+
+554 \15
+ËssThªEqu®s
+<
+CXXTEST_T
+,CXXTEST_T>::
+ `\8b¡
+((CXXTEST_T)
+x
+,(CXXTEST_T)
+y
+); } }
+
+ )
+
+558
+ g\8bm¶©e
+<
+þass
+
+ gD
+> \19
+ gd\96\8f
+<
+ gCXXTEST_X
+,
+ gCXXTEST_Y
+, D> { \
+
+559 \18
+boÞ
+
+\8b¡
+(
+CXXTEST_X
+
+x
+,
+CXXTEST_Y
+
+y
+,
+D
+
+d
+) { \
+
+560 \15
+ gd\96\8f
+<
+ gCXXTEST_T
+,CXXTEST_T,
+ gD
+>::
+\8b¡
+((
+CXXTEST_T
+)
+x
+,(CXXTEST_T)
+y
+,
+d
+); } }; \
+
+561
+ g\8bm¶©e
+<
+þass
+
+ gD
+> \19
+ gd\96\8f
+<
+ gCXXTEST_Y
+,
+ gCXXTEST_X
+, D> { \
+
+562 \18
+boÞ
+
+\8b¡
+(
+CXXTEST_Y
+
+x
+,
+CXXTEST_X
+
+y
+,
+D
+
+d
+) { \
+
+563 \15
+ gd\96\8f
+<
+ gCXXTEST_T
+,CXXTEST_T,
+ gD
+>::
+\8b¡
+((
+CXXTEST_T
+)
+x
+,(CXXTEST_T)
+y
+,
+d
+); } }
+
+566 \ 1
+ #CXXTEST_INTEGRAL
+(
+CXXTEST_T
+) \
+
+567
+ $CXXTEST_COMPARISONS
+ÐsigÃd
+CXXTEST_T
+, \1dCXXTEST_T, \1dCXXTEST_T )
+
+ )
+
+569
+ `CXXTEST_INTEGRAL
+( \ 5);
+
+570
+ `CXXTEST_INTEGRAL
+( \16);
+
+571
+ `CXXTEST_INTEGRAL
+( \12);
+
+572
+ `CXXTEST_INTEGRAL
+( \13);
+
+573 #ifdeà
+_CXXTEST_LONGLONG
+
+
+574
+ `CXXTEST_INTEGRAL
+Ð
+_CXXTEST_LONGLONG
+ );
+
+577 \ 1
+ #CXXTEST_SMALL_BIG
+(
+CXXTEST_SMALL
+,
+CXXTEST_BIG
+) \
+
+578
+ `CXXTEST_COMPARISONS
+ÐsigÃd
+CXXTEST_SMALL
+, \1d
+CXXTEST_BIG
+, \1dCXXTEST_BIG ); \
+
+579
+ $CXXTEST_COMPARISONS
+ÐsigÃd
+CXXTEST_BIG
+, \1d
+CXXTEST_SMALL
+, \1dCXXTEST_BIG )
+
+ )
+
+581
+ `CXXTEST_SMALL_BIG
+( \ 5, \16);
+
+582
+ `CXXTEST_SMALL_BIG
+( \ 5, \12);
+
+583
+ `CXXTEST_SMALL_BIG
+( \16, \12);
+
+584
+ `CXXTEST_SMALL_BIG
+( \ 5, \13);
+
+585
+ `CXXTEST_SMALL_BIG
+( \16, \13);
+
+586
+ `CXXTEST_SMALL_BIG
+( \12, \13);
+
+588 #ifdeà
+_CXXTEST_LONGLONG
+
+
+589
+ `CXXTEST_SMALL_BIG
+Ð\ 5,
+_CXXTEST_LONGLONG
+ );
+
+590
+ `CXXTEST_SMALL_BIG
+Ð\16,
+_CXXTEST_LONGLONG
+ );
+
+591
+ `CXXTEST_SMALL_BIG
+Ð\12,
+_CXXTEST_LONGLONG
+ );
+
+592
+ `CXXTEST_SMALL_BIG
+Ð\13,
+_CXXTEST_LONGLONG
+ );
+
+594
+ }
+}
+
+596 #ifdeà
+_CXXTEST_HAVE_STD
+
+
+597 \ 2
+ ~<cxx\8b¡/StdTe¡Su\99e.h
+>
+
+ @tools/cxxtest/cxxtest/TestTracker.cpp
+
+12 #iâdeà
+__cxx\8b¡__Te¡T¿ck\94_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__Te¡T¿ck\94_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19
+boÞ
+
+ gTe¡T¿ck\94
+::
+_ü\97\8bd
+ =
+çl£
+;
+
+20
+boÞ
+
+ gTe¡T¿ck\94
+::
+´\9at_\8cac\9ag
+ =
+çl£
+;
+
+22
+ gTe¡T¿ck\94
+::
+Te¡T¿ck\94
+()
+
+24 iàÐ!
+_ü\97\8bd
+ ) {
+
+25
+\9a\99\9flize
+();
+
+26
+£tLi¡\92\94
+( 0 );
+
+27
+ g_ü\97\8bd
+ =
+\8cue
+;
+
+31
+ gTe¡T¿ck\94
+::~
+Te¡T¿ck\94
+()
+
+35
+Te¡T¿ck\94
+ & Te¡T¿ck\94::
+\8cack\94
+()
+
+37 \18
+Te¡T¿ck\94
+
+theT¿ck\94
+;
+
+38 \15
+ gtheT¿ck\94
+;
+
+41 \1e
+ gTe¡T¿ck\94
+::
+\9a\99\9flize
+()
+
+43
+_w¬n\9ags
+ = 0;
+
+44
+ g_ç\9eedTe¡s
+ = 0;
+
+45
+ g_\8b¡Fa\9eedAs£¹s
+ = 0;
+
+46
+ g_su\99eFa\9eedTe¡s
+ = 0;
+
+47
+ g_ç\9eedSu\99es
+ = 0;
+
+48
+ g_wÜld
+ = 0;
+
+49
+ g_su\99e
+ = 0;
+
+50
+ g_\8b¡
+ = 0;
+
+53 cڡ
+Te¡Desü\9dtiÚ
+ *
+ gTe¡T¿ck\94
+::
+fixTe¡
+ÐcÚ¡ Te¡Desü\9dtiÚ *
+d
+ ) const
+
+55 \15
+d
+ ? d : &
+dummyTe¡
+();
+
+58 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ gTe¡T¿ck\94
+::
+fixSu\99e
+ÐcÚ¡ Su\99eDesü\9dtiÚ *
+d
+ ) const
+
+60 \15
+d
+ ? d : &
+dummySu\99e
+();
+
+63 cڡ
+WÜldDesü\9dtiÚ
+ *
+ gTe¡T¿ck\94
+::
+fixWÜld
+ÐcÚ¡ WÜldDesü\9dtiÚ *
+d
+ ) const
+
+65 \15
+d
+ ? d : &
+dummyWÜld
+();
+
+68 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+ gTe¡T¿ck\94
+::
+dummyTe¡
+() const
+
+70 \15
+dummySu\99e
+().
+\8b¡Desü\9dtiÚ
+(0);
+
+73 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+ gTe¡T¿ck\94
+::
+dummySu\99e
+() const
+
+75 \15
+dummyWÜld
+().
+su\99eDesü\9dtiÚ
+(0);
+
+78 cڡ
+ gWÜldDesü\9dtiÚ
+ &
+ gTe¡T¿ck\94
+::
+dummyWÜld
+() const
+
+80 \15
+_dummyWÜld
+;
+
+83 \1e
+ gTe¡T¿ck\94
+::
+£tLi¡\92\94
+Ð
+Te¡Li¡\92\94
+ *
+l
+ )
+
+85
+_l
+ =
+l
+ ?\86 : &
+_dummyLi¡\92\94
+;
+
+88 \1e
+ gTe¡T¿ck\94
+::
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+90
+£tWÜld
+Ð&
+wd
+ );
+
+91
+ g_w¬n\9ags
+ =
+_ç\9eedTe¡s
+ =
+_\8b¡Fa\9eedAs£¹s
+ =
+_su\99eFa\9eedTe¡s
+ =
+_ç\9eedSu\99es
+ = 0;
+
+92
+ g_l
+->
+\92\8brWÜld
+Ð
+wd
+ );
+
+95 \1e
+ gTe¡T¿ck\94
+::
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+sd
+ )
+
+97
+£tSu\99e
+Ð&
+sd
+ );
+
+98
+ g_\8b¡Fa\9eedAs£¹s
+ =
+_su\99eFa\9eedTe¡s
+ = 0;
+
+99
+ g_l
+->
+\92\8brSu\99e
+(
+sd
+);
+
+102 \1e
+ gTe¡T¿ck\94
+::
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+td
+ )
+
+104
+£tTe¡
+Ð&
+td
+ );
+
+105
+ g_\8b¡Fa\9eedAs£¹s
+ =
+çl£
+;
+
+106
+ g_l
+->
+\92\8brTe¡
+(
+td
+);
+
+109 \1e
+ gTe¡T¿ck\94
+::
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+td
+ )
+
+111
+_l
+->
+ËaveTe¡
+Ð
+td
+ );
+
+112
+£tTe¡
+( 0 );
+
+115 \1e
+ gTe¡T¿ck\94
+::
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+sd
+ )
+
+117
+_l
+->
+ËaveSu\99e
+Ð
+sd
+ );
+
+118
+£tSu\99e
+( 0 );
+
+121 \1e
+ gTe¡T¿ck\94
+::
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+123
+_l
+->
+ËaveWÜld
+Ð
+wd
+ );
+
+124
+£tWÜld
+( 0 );
+
+127 \1e
+ gTe¡T¿ck\94
+::
+\8caû
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+129
+ g_l
+->
+\8caû
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+132 \1e
+ gTe¡T¿ck\94
+::
+w¬n\9ag
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+134
+couÁW¬n\9ag
+();
+
+135
+ g_l
+->
+w¬n\9ag
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+138 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+140
+couÁFa\9eu»
+();
+
+141
+ g_l
+->
+ç\9eedTe¡
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+144 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+146
+couÁFa\9eu»
+();
+
+147
+ g_l
+->
+ç\9eedAs£¹
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+150 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+151 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+152 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+154
+couÁFa\9eu»
+();
+
+155
+ g_l
+->
+ç\9eedAs£¹Equ®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+158 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+159 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+160 cڡ \ 5*
+sizeS\8c
+, cڡ \1e*
+x
+,
+
+161 cڡ \1e*
+y
+, \1d
+size
+ )
+
+163
+couÁFa\9eu»
+();
+
+164
+ g_l
+->
+ç\9eedAs£¹SameD©a
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+sizeS\8c
+,
+x
+,
+y
+,
+size
+ );
+
+167 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+168 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+dS\8c
+,
+
+169 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+, cڡ \ 5*
+d
+ )
+
+171
+couÁFa\9eu»
+();
+
+172
+ g_l
+->
+ç\9eedAs£¹D\96\8f
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+dS\8c
+,
+x
+,
+y
+,
+d
+ );
+
+175 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+176 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+177 cڡ \ 5*
+v®ue
+ )
+
+179
+couÁFa\9eu»
+();
+
+180
+ g_l
+->
+ç\9eedAs£¹Difãrs
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+v®ue
+ );
+
+183 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+184 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+185 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+187
+couÁFa\9eu»
+();
+
+188
+ g_l
+->
+ç\9eedAs£¹LessThª
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+191 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+192 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+193 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+195
+couÁFa\9eu»
+();
+
+196
+ g_l
+->
+ç\9eedAs£¹LessThªEqu®s
+Ð
+f\9ee
+,
+l\9ae
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+199 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+200 cڡ \ 5*
+´ediÿ\8b
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+x
+ )
+
+202
+couÁFa\9eu»
+();
+
+203
+ g_l
+->
+ç\9eedAs£¹P»diÿ\8b
+Ð
+f\9ee
+,
+l\9ae
+,
+´ediÿ\8b
+,
+xS\8c
+,
+x
+ );
+
+206 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+207 cڡ \ 5*
+»ÏtiÚ
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+208 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+210
+couÁFa\9eu»
+();
+
+211
+ g_l
+->
+ç\9eedAs£¹R\96©iÚ
+Ð
+f\9ee
+,
+l\9ae
+,
+»ÏtiÚ
+,
+xS\8c
+,
+yS\8c
+,
+x
+,
+y
+ );
+
+214 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+215 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+ty³
+,
+
+216
+boÞ
+
+Ùh\94Thrown
+ )
+
+218
+couÁFa\9eu»
+();
+
+219
+ g_l
+->
+ç\9eedAs£¹Throws
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+,
+ty³
+,
+Ùh\94Thrown
+ );
+
+222 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+224
+couÁFa\9eu»
+();
+
+225
+ g_l
+->
+ç\9eedAs£¹ThrowsNÙ
+Ð
+f\9ee
+,
+l\9ae
+,
+ex´essiÚ
+ );
+
+228 \1e
+ gTe¡T¿ck\94
+::
+ç\9eedAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+, cڡ \ 5*
+ex¶ª©iÚ
+ )
+
+230
+couÁFa\9eu»
+();
+
+231
+ g_l
+->
+ç\9eedAs£¹SameF\9ees
+Ð
+f\9ee
+,
+l\9ae
+,
+f\9ee1
+,
+f\9ee2
+,
+ex¶ª©iÚ
+ );
+
+234 \1e
+ gTe¡T¿ck\94
+::
+£tWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ *
+w
+ )
+
+236
+_wÜld
+ =
+fixWÜld
+Ð
+w
+ );
+
+237
+£tSu\99e
+( 0 );
+
+240 \1e
+ gTe¡T¿ck\94
+::
+£tSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ *
+s
+ )
+
+242
+_su\99e
+ =
+fixSu\99e
+Ð
+s
+ );
+
+243
+£tTe¡
+( 0 );
+
+246 \1e
+ gTe¡T¿ck\94
+::
+£tTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ *
+t
+ )
+
+248
+_\8b¡
+ =
+fixTe¡
+Ð
+t
+ );
+
+251 \1e
+ gTe¡T¿ck\94
+::
+couÁW¬n\9ag
+()
+
+253 ++
+_w¬n\9ags
+;
+
+256 \1e
+ gTe¡T¿ck\94
+::
+couÁFa\9eu»
+()
+
+258 iàÐ++
+_\8b¡Fa\9eedAs£¹s
+ == 1 ) {
+
+259 ++
+_ç\9eedTe¡s
+;
+
+260 iàÐ++
+ g_su\99eFa\9eedTe¡s
+ == 1 )
+
+261 ++
+_ç\9eedSu\99es
+;
+
+ @tools/cxxtest/cxxtest/TestTracker.h
+
+12 #iâdeà
+__cxx\8b¡__Te¡T¿ck\94_h__
+
+
+13 \ 1
+ #__cxx\8b¡__Te¡T¿ck\94_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+22 \ 2
+ ~<cxx\8b¡/DummyDesü\9dtiÚs.h
+>
+
+24
+Çme¥aû
+
+ gCxxTe¡
+
+
+26
+þass
+
+ gTe¡Li¡\92\94
+;
+
+28 þas
+ cTe¡T¿ck\94
+ :
+public
+
+Te¡Li¡\92\94
+
+
+30
+public
+:
+
+31
+v\9ctu®
+ ~
+Te¡T¿ck\94
+();
+
+33 \18
+ gTe¡T¿ck\94
+ &
+\8cack\94
+();
+
+34 \18
+boÞ
+
+ g´\9at_\8cac\9ag
+;
+
+36 cڡ
+Te¡Desü\9dtiÚ
+ *
+fixTe¡
+ÐcÚ¡ Te¡Desü\9dtiÚ *
+d
+ ) const;
+
+37 cڡ
+Su\99eDesü\9dtiÚ
+ *
+fixSu\99e
+ÐcÚ¡ Su\99eDesü\9dtiÚ *
+d
+ ) const;
+
+38 cڡ
+WÜldDesü\9dtiÚ
+ *
+fixWÜld
+ÐcÚ¡ WÜldDesü\9dtiÚ *
+d
+ ) const;
+
+40 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+\8b¡
+(ècÚ¡ { \15 *
+ g_\8b¡
+; }
+
+41 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+su\99e
+(ècÚ¡ { \15 *
+ g_su\99e
+; }
+
+42 cڡ
+ gWÜldDesü\9dtiÚ
+ &
+wÜld
+(ècÚ¡ { \15 *
+ g_wÜld
+; }
+
+44
+boÞ
+
+\8b¡Fa\9eed
+(ècÚ¡ { \15 (
+\8b¡Fa\9eedAs£¹s
+() > 0); }
+
+45
+boÞ
+
+su\99eFa\9eed
+(ècÚ¡ { \15 (
+su\99eFa\9eedTe¡s
+() > 0); }
+
+46
+boÞ
+
+wÜldFa\9eed
+(ècÚ¡ { \15 (
+ç\9eedSu\99es
+() > 0); }
+
+48 \1d
+w¬n\9ags
+(ècÚ¡ { \15
+ g_w¬n\9ags
+; }
+
+49 \1d
+ç\9eedTe¡s
+(ècÚ¡ { \15
+ g_ç\9eedTe¡s
+; }
+
+50 \1d
+\8b¡Fa\9eedAs£¹s
+(ècÚ¡ { \15
+ g_\8b¡Fa\9eedAs£¹s
+; }
+
+51 \1d
+su\99eFa\9eedTe¡s
+(ècÚ¡ { \15
+ g_su\99eFa\9eedTe¡s
+; }
+
+52 \1d
+ç\9eedSu\99es
+(ècÚ¡ { \15
+ g_ç\9eedSu\99es
+; }
+
+54 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ );
+
+55 \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+sd
+ );
+
+56 \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+td
+ );
+
+57 \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+td
+ );
+
+58 \1e
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ &
+sd
+ );
+
+59 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ );
+
+60 \1e
+\8caû
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ );
+
+61 \1e
+w¬n\9ag
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ );
+
+62 \1e
+ç\9eedTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ );
+
+63 \1e
+ç\9eedAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ );
+
+64 \1e
+ç\9eedAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+65 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+66 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ );
+
+67 \1e
+ç\9eedAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+68 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+69 cڡ \ 5*
+sizeS\8c
+, cڡ \1e*
+x
+,
+
+70 cڡ \1e*
+y
+, \1d
+size
+ );
+
+71 \1e
+ç\9eedAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+72 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+dS\8c
+,
+
+73 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+, cڡ \ 5*
+d
+ );
+
+74 \1e
+ç\9eedAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+75 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+76 cڡ \ 5*
+v®ue
+ );
+
+77 \1e
+ç\9eedAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+78 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+79 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ );
+
+80 \1e
+ç\9eedAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+81 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+82 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ );
+
+83 \1e
+ç\9eedAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+84 cڡ \ 5*
+´ediÿ\8b
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+x
+ );
+
+85 \1e
+ç\9eedAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+86 cڡ \ 5*
+»ÏtiÚ
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+87 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ );
+
+88 \1e
+ç\9eedAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+89 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+ty³
+,
+
+90
+boÞ
+
+Ùh\94Thrown
+ );
+
+91 \1e
+ç\9eedAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ );
+
+92 \1e
+ç\9eedAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+f\9ee1
+, cڡ \ 5*
+f\9ee2
+, cڡ \ 5*
+ex¶ª©iÚ
+);
+
+94 \1e
+\9a\99\9flize
+();
+
+96
+ g´iv©e
+:
+
+97
+Te¡T¿ck\94
+( const TestTracker & );
+
+98
+ gTe¡T¿ck\94
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+Te¡T¿ck\94
+ & );
+
+100 \18
+boÞ
+
+ g_ü\97\8bd
+;
+
+101
+Te¡Li¡\92\94
+
+ g_dummyLi¡\92\94
+;
+
+102
+DummyWÜldDesü\9dtiÚ
+
+ g_dummyWÜld
+;
+
+103 \1d
+ g_w¬n\9ags
+,
+ g_ç\9eedTe¡s
+,
+ g_\8b¡Fa\9eedAs£¹s
+,
+ g_su\99eFa\9eedTe¡s
+,
+ g_ç\9eedSu\99es
+;
+
+104
+Te¡Li¡\92\94
+ *
+ g_l
+;
+
+105 cڡ
+WÜldDesü\9dtiÚ
+ *
+ g_wÜld
+;
+
+106 cڡ
+Su\99eDesü\9dtiÚ
+ *
+ g_su\99e
+;
+
+107 cڡ
+Te¡Desü\9dtiÚ
+ *
+ g_\8b¡
+;
+
+109 cڡ
+ gTe¡Desü\9dtiÚ
+ &
+dummyTe¡
+() const;
+
+110 cڡ
+ gSu\99eDesü\9dtiÚ
+ &
+dummySu\99e
+() const;
+
+111 cڡ
+ gWÜldDesü\9dtiÚ
+ &
+dummyWÜld
+() const;
+
+113 \1e
+£tWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ *
+w
+ );
+
+114 \1e
+£tSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ *
+s
+ );
+
+115 \1e
+£tTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ *
+t
+ );
+
+116 \1e
+couÁW¬n\9ag
+();
+
+117 \1e
+couÁFa\9eu»
+();
+
+119
+ä\9bnd
+
+þass
+
+ gTe¡RuÂ\94
+;
+
+121
+Te¡T¿ck\94
+();
+
+122 \1e
+£tLi¡\92\94
+Ð
+Te¡Li¡\92\94
+ *
+l
+ );
+
+125
+\9al\9ae
+
+ gTe¡T¿ck\94
+ &
+ $\8cack\94
+(è{ \15
+Te¡T¿ck\94
+::
+ `\8cack\94
+();
+ }
+}
+
+ @tools/cxxtest/cxxtest/ValueTraits.cpp
+
+12 #iâdeà
+__cxx\8b¡__V®ueT¿\99s_ýp__
+
+
+13 \ 1
+ #__cxx\8b¡__V®ueT¿\99s_ýp__
+
+
+ )
+
+15 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+23 \ 5
+dig\99ToCh¬
+Ð\1d
+dig\99
+ )
+
+25 iàÐ
+ gdig\99
+ < 10 )
+
+26 \15 (\ 5)('0' +
+ gdig\99
+);
+
+27 iàÐ
+ gdig\99
+ <= 10 + 'Z' - 'A' )
+
+28 \15 (\ 5)('A' +
+dig\99
+ - 10);
+
+32 cڡ \ 5*
+by\8bToHex
+Ð\1d\ 5
+by\8b
+ )
+
+34 \18\ 5
+ gasHex
+[3];
+
+35
+ gasHex
+[0] =
+dig\99ToCh¬
+Ð
+by\8b
+ >> 4 );
+
+36
+ gasHex
+[1] =
+dig\99ToCh¬
+Ð
+by\8b
+ & 0x0F );
+
+37
+ gasHex
+[2] = '\0';
+
+38 \15
+ gasHex
+;
+
+41 \ 5*
+cÝyS\8c\9ag
+Ð\ 5*
+d¡
+, cڡ \ 5*
+¤c
+ )
+
+43 \1f (*
+ gd¡
+ = *
+¤c
+) != '\0' ) {
+
+44 ++
+d¡
+;
+
+45 ++
+ g¤c
+;
+
+47 \15
+ gd¡
+;
+
+50
+boÞ
+
+¡r\9agsEqu®
+ÐcÚ¡ \ 5*
+s1
+, cڡ \ 5*
+s2
+ )
+
+52 \ 5
+ gc
+;
+
+53 \1f (
+ gc
+ = *
+s1
+++è=ð*
+s2
+++ )
+
+54 iàÐ
+c
+ == '\0' )
+
+55 \15
+\8cue
+;
+
+56 \15
+ gçl£
+;
+
+59 \ 5*
+ch¬ToS\8c\9ag
+Ð\1d\13
+c
+, \ 5*
+s
+ )
+
+61 \1a
+ gc
+ ) {
+
+62 \ 4'\\': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\\\" );
+
+63 \ 4'\"': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\\"" );
+
+64 \ 4'\'': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\\'" );
+
+65 \ 4'\0': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\0" );
+
+66 \ 4'\a': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\a" );
+
+67 \ 4'\b': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\b" );
+
+68 \ 4'\n': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\n" );
+
+69 \ 4'\r': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\r" );
+
+70 \ 4'\t': \15
+cÝyS\8c\9ag
+Ð
+s
+, "\\t" );
+
+72 iàÐ
+ gc
+ >ð32 &&
+c
+ <= 127 ) {
+
+73
+s
+[0] = (\ 5)
+c
+;
+
+74
+ gs
+[1] = '\0';
+
+75 \15
+ gs
+ + 1;
+
+78
+ gs
+[0] = '\\';
+
+79
+ gs
+[1] = 'x';
+
+80 iàÐ
+ gc
+ < 0x10 ) {
+
+81
+ gs
+[2] = '0';
+
+82 ++
+ gs
+;
+
+84 \15
+numb\94ToS\8c\9ag
+Ð
+c
+,
+s
+ + 2, 16UL );
+
+88 \ 5*
+ch¬ToS\8c\9ag
+Ð\ 5
+c
+, \ 5*
+s
+ )
+
+90 \15
+ch¬ToS\8c\9ag
+Ð(\1d\13)(\1d\ 5)
+c
+,
+s
+ );
+
+93 \ 5*
+by\8bsToS\8c\9ag
+ÐcÚ¡ \1d\ 5*
+by\8bs
+, \1d
+numBy\8bs
+, \1d
+maxBy\8bs
+, \ 5*
+s
+ )
+
+95
+boÞ
+
+ g\8cunÿ\8b
+ = (
+numBy\8bs
+ >
+maxBy\8bs
+);
+
+96 iàÐ
+ g\8cunÿ\8b
+ )
+
+97
+ gnumBy\8bs
+ =
+maxBy\8bs
+;
+
+99
+ gs
+ =
+cÝyS\8c\9ag
+Ð
+s
+, "{ " );
+
+100 \ f \1d
+ gi
+ = 0; i <
+ gnumBy\8bs
+; ++ i, ++
+ gby\8bs
+ )
+
+101
+ gs
+ =
+cÝyS\8c\9ag
+ÐcÝyS\8c\9agÐ
+s
+,
+by\8bToHex
+Ð*
+by\8bs
+ ) ), " " );
+
+102 iàÐ
+ g\8cunÿ\8b
+ )
+
+103
+ gs
+ =
+cÝyS\8c\9ag
+Ð
+s
+, "..." );
+
+104 \15
+cÝyS\8c\9ag
+Ð
+s
+, " }" );
+
+107 #iâdeà
+CXXTEST_USER_VALUE_TRAITS
+
+
+108 \1d
+ gV®ueT¿\99s
+<cڡ \b>::
+»qu\9cedDig\99sOnLeá
+Ð\b
+t
+ )
+
+110 \1d
+dig\99s
+ = 1;
+
+111 \ f
+ gt
+ = (
+t
+ < 0.0è? -\88:\81;\81 > 1.0;\81 /ð
+BASE
+ )
+
+112 ++
+dig\99s
+;
+
+113 \15
+ gdig\99s
+;
+
+116 \ 5*
+ gV®ueT¿\99s
+<cڡ \b>::
+doNeg©ive
+Ð\b&
+t
+ )
+
+118 iàÐ
+t
+ >= 0 )
+
+119 \15
+_asS\8c\9ag
+;
+
+120
+ g_asS\8c\9ag
+[0] = '-';
+
+121
+ gt
+ = -
+t
+;
+
+122 \15
+ g_asS\8c\9ag
+ + 1;
+
+125 \1e
+ gV®ueT¿\99s
+<cڡ \b>::
+hugeNumb\94
+Ð\b
+t
+ )
+
+127 \ 5*
+s
+ =
+doNeg©ive
+Ð
+t
+ );
+
+128
+ gs
+ =
+doubËToS\8c\9ag
+Ð
+t
+,
+s
+, 0, 1 );
+
+129
+ gs
+ =
+cÝyS\8c\9ag
+Ð
+s
+, "." );
+
+130
+ gs
+ =
+doubËToS\8c\9ag
+Ð
+t
+,
+s
+, 1,
+DIGITS_ON_RIGHT
+ );
+
+131
+ gs
+ =
+cÝyS\8c\9ag
+Ð
+s
+, "E" );
+
+132
+ gs
+ =
+numb\94ToS\8c\9ag
+Ð
+»qu\9cedDig\99sOnLeá
+Ð
+t
+ ) - 1,
+s
+ );
+
+135 \1e
+ gV®ueT¿\99s
+<cڡ \b>::
+nÜm®Numb\94
+Ð\b
+t
+ )
+
+137 \ 5*
+s
+ =
+doNeg©ive
+Ð
+t
+ );
+
+138
+ gs
+ =
+doubËToS\8c\9ag
+Ð
+t
+,
+s
+ );
+
+139
+ gs
+ =
+cÝyS\8c\9ag
+Ð
+s
+, "." );
+
+140 \ f \1d
+ gi
+ = 0; i <
+ gDIGITS_ON_RIGHT
+; ++ i )
+
+141
+ gs
+ =
+numb\94ToS\8c\9ag
+Ð(\1d)(
+t
+ *ð
+BASE
+è% BASE,
+s
+ );
+
+144 \1e
+ gV®ueT¿\99s
+<cڡ \b>::
+nÚF\9a\99eNumb\94
+Ð\b
+t
+ )
+
+146 \ 5*
+s
+ =
+_asS\8c\9ag
+;
+
+147 iàÐ
+ gt
+ !ð
+t
+ )
+
+148
+s
+ =
+cÝyS\8c\9ag
+( s, "nan" );
+
+150 \viàÐ
+ gt
+ >ð
+HUGE_VAL
+ )
+
+151
+s
+ =
+cÝyS\8c\9ag
+( s, "-inf" );
+
+152 \viàÐ
+ gt
+ <ð-
+HUGE_VAL
+ )
+
+154
+s
+ =
+cÝyS\8c\9ag
+( s, "inf" );
+
+157 \ 5*
+ gV®ueT¿\99s
+<cڡ \b>::
+doubËToS\8c\9ag
+Ð\b
+t
+, \ 5*
+s
+, \1d
+sk\9d
+, \1d
+max
+ )
+
+159 \15
+ gnumb\94ToS\8c\9ag
+<\b>Ð
+ gt
+,
+ gs
+,
+ gBASE
+,
+ gsk\9d
+,
+ gmax
+ );
+
+ @tools/cxxtest/cxxtest/ValueTraits.h
+
+12 #iâdeà
+__cxx\8b¡__V®ueT¿\99s_h__
+
+
+13 \ 1
+ #__cxx\8b¡__V®ueT¿\99s_h__
+
+
+ )
+
+24 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+26 #ifdeà
+_CXXTEST_OLD_TEMPLATE_SYNTAX
+
+
+27 \ 1
+ #CXXTEST_TEMPLATE_INSTANTIATION
+
+
+ )
+
+29 \ 1
+ #CXXTEST_TEMPLATE_INSTANTIATION
+
+\8bm¶©e
+<>
+
+ )
+
+32 #ifdeà
+_CXXTEST_HAVE_STD
+
+
+33 \ 2
+ ~<cm©h
+>
+
+35 \ 2
+ ~<m©h.h
+>
+
+38
+Çme¥aû
+
+ gCxxTe¡
+
+
+43 \ 1
+ #TS_AS_STRING
+(
+x
+è
+CxxTe¡
+::
+ `\8ca\99s
+(x).
+ `asS\8c\9ag
+()
+
+ )
+
+48 \ 5
+dig\99ToCh¬
+Ð\1d
+dig\99
+ );
+
+54 cڡ \ 5*
+by\8bToHex
+Ð\1d\ 5
+by\8b
+ );
+
+60 \ 5*
+by\8bsToS\8c\9ag
+ÐcÚ¡ \1d\ 5*
+by\8bs
+, \1d
+numBy\8bs
+, \1d
+maxBy\8bs
+, \ 5*
+s
+ );
+
+67 \ 5*
+cÝyS\8c\9ag
+Ð\ 5*
+d¡
+, cڡ \ 5*
+¤c
+ );
+
+73
+boÞ
+
+¡r\9agsEqu®
+ÐcÚ¡ \ 5*
+s1
+, cڡ \ 5*
+s2
+ );
+
+80 \ 5*
+ch¬ToS\8c\9ag
+Ð\1d\13
+c
+, \ 5*
+s
+ );
+
+85 \ 5*
+ch¬ToS\8c\9ag
+Ð\ 5
+c
+, \ 5*
+s
+ );
+
+90
+ g\8bm¶©e
+ <
+þass
+
+ gT
+>
+
+91 þas
+ cV®ueT¿\99s
+
+
+93 \92um {
+ gMAX_BYTES
+ = 8 };
+
+94 \ 5
+ g_asS\8c\9ag
+[\17("{ "è+ \17("XX "è*
+MAX_BYTES
+ + \17("... }")];
+
+96
+ gpublic
+:
+
+97
+V®ueT¿\99s
+ÐcÚ¡
+T
+ &
+t
+ ) {
+by\8bsToS\8c\9ag
+Ð(cÚ¡ \1d\ 5*)&t, \17(T),
+MAX_BYTES
+,
+_asS\8c\9ag
+ ); }
+
+98 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+105
+ g\8bm¶©e
+ <
+þass
+
+ gT
+>
+
+106
+\9al\9ae
+
+ gV®ueT¿\99s
+<
+ gT
+>
+ $\8ca\99s
+Ð
+T
+
+t
+ )
+
+108 \15
+V®ueT¿\99s
+<
+T
+>Ð
+t
+ );
+
+109
+ }
+}
+
+114 \ 1
+ #CXXTEST_COPY_TRAITS
+(
+CXXTEST_NEW_CLASS
+,
+CXXTEST_OLD_CLASS
+) \
+
+115
+CXXTEST_TEMPLATE_INSTANTIATION
+ \
+
+116
+þass
+
+V®ueT¿\99s
+<
+CXXTEST_NEW_CLASS
+ > \
+
+118
+V®ueT¿\99s
+<
+CXXTEST_OLD_CLASS
+ >
+_Þd
+; \
+
+119
+public
+: \
+
+120
+ `V®ueT¿\99s
+Ð
+CXXTEST_NEW_CLASS
+
+n
+ ) :
+ `_Þd
+Ð(
+CXXTEST_OLD_CLASS
+)n ) {} \
+
+121 cڡ \ 5*
+ `asS\8c\9ag
+Ð\1eècÚ¡ { \15
+_Þd
+.asString(); } \
+
+122 }
+
+ )
+
+127 #ifdeà
+_CXXTEST_NO_COPY_CONST
+
+
+128 \ 1
+ #CXXTEST_COPY_CONST_TRAITS
+(
+CXXTEST_CLASS
+)
+
+ )
+
+130 \ 1
+ #CXXTEST_COPY_CONST_TRAITS
+(
+CXXTEST_CLASS
+è
+ $CXXTEST_COPY_TRAITS
+(
+CXXTEST_CLASS
+, cڡ CXXTEST_CLASS)
+
+ )
+
+136
+\8bm¶©e
+<
+þass
+
+N
+>
+\9al\9ae
+
+boÞ
+
+ $Ãg©ive
+Ð
+N
+
+n
+ ) { \15\82 < 0;
+ }
+}
+
+137
+ g\8bm¶©e
+<
+þass
+
+ gN
+>
+\9al\9ae
+
+N
+
+ $abs
+Ð
+N
+
+n
+ ) { \15
+ `Ãg©ive
+Òè? -À:\82;
+ }
+}
+
+139 \ 1
+ #CXXTEST_NON_NEGATIVE
+(
+Ty³
+) \
+
+140
+CXXTEST_TEMPLATE_INSTANTIATION
+ \
+
+141
+\9al\9ae
+
+boÞ
+
+Ãg©ive
+<
+Ty³
+>ÐTy³ ) { \15
+çl£
+; } \
+
+142
+CXXTEST_TEMPLATE_INSTANTIATION
+ \
+
+143
+\9al\9ae
+
+Ty³
+
+abs
+<Ty³>ÐTy³
+v®ue
+ ) { \15 v®ue; }
+
+ )
+
+145
+ $CXXTEST_NON_NEGATIVE
+Ð
+boÞ
+ )
+
+146
+ $CXXTEST_NON_NEGATIVE
+( \1d\ 5)
+
+147
+ $CXXTEST_NON_NEGATIVE
+( \1d\16\12)
+
+148
+ $CXXTEST_NON_NEGATIVE
+( \1d\12)
+
+149
+ $CXXTEST_NON_NEGATIVE
+( \1d\13\12)
+
+150 #ifdeà
+_CXXTEST_LONGLONG
+
+
+151
+ $CXXTEST_NON_NEGATIVE
+Ð\1d
+_CXXTEST_LONGLONG
+ )
+
+159
+\8bm¶©e
+<
+þass
+
+N
+>
+
+160 \ 5*
+ `numb\94ToS\8c\9ag
+Ð
+N
+
+n
+, \ 5*
+s
+,
+
+161
+N
+
+ba£
+ = 10,
+
+162 \1d
+sk\9dDig\99s
+ = 0,
+
+163 \1d
+maxDig\99s
+ = (\1d)-1 )
+
+165 iàÐ
+ `Ãg©ive
+(
+n
+) ) {
+
+166 *
+s
+++ = '-';
+
+167
+n
+ =
+ `abs
+(n);
+
+170
+N
+
+dig\99
+ = 1;
+
+171 \1f
+dig\99
+ <ð(
+n
+ /
+ba£
+) )
+
+172
+dig\99
+ *ð
+ba£
+;
+
+173
+N
+
+dig\99V®ue
+;
+
+174 \ f ;
+dig\99
+ >ð1 &&
+sk\9dDig\99s
+;
+n
+ -ðdig\99 *
+dig\99V®ue
+, dig\99 /ð
+ba£
+, -- skipDigits )
+
+175
+dig\99V®ue
+ = (\1d)(
+n
+ /
+dig\99
+);
+
+176 \ f ;
+dig\99
+ >ð1 &&
+maxDig\99s
+;
+n
+ -ðdig\99 *
+dig\99V®ue
+, dig\99 /ð
+ba£
+, -- maxDigits )
+
+177 *
+s
+++ =
+ `dig\99ToCh¬
+Ð(\1d)(
+dig\99V®ue
+ = (\1d)(
+n
+ /
+dig\99
+)) );
+
+179 *
+s
+ = '\0';
+
+180 \15
+s
+;
+
+181
+ }
+}
+
+188 #iâdeà
+CXXTEST_USER_VALUE_TRAITS
+
+
+193
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+194
+þass
+
+ gV®ueT¿\99s
+<const \ 5* const &>
+
+196
+ gV®ueT¿\99s
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+V®ueT¿\99s
+ & );
+
+197 cڡ \ 5*
+ g_asS\8c\9ag
+;
+
+199
+ gpublic
+:
+
+200
+V®ueT¿\99s
+ÐcÚ¡ \ 5* cÚ¡ &
+v®ue
+ ) :
+_asS\8c\9ag
+( value ) {}
+
+201
+V®ueT¿\99s
+ÐcÚ¡ V®ueT¿\99 &
+Ùh\94
+ ) :
+_asS\8c\9ag
+( other._asString ) {}
+
+202 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+_asS\8c\9ag
+; }
+
+205
+CXXTEST_COPY_TRAITS
+( const \ 5*, const \ 5* const & );
+
+206
+CXXTEST_COPY_TRAITS
+( \ 5*, const \ 5* const & );
+
+211
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+212
+þass
+
+ gV®ueT¿\99s
+<cڡ
+ gboÞ
+>
+
+214
+boÞ
+
+ g_v®ue
+;
+
+216
+ gpublic
+:
+
+217
+V®ueT¿\99s
+ÐcÚ¡
+boÞ
+
+v®ue
+ ) :
+_v®ue
+( value ) {}
+
+218 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+_v®ue
+ ? "true" : "false"; }
+
+221
+CXXTEST_COPY_CONST_TRAITS
+Ð
+boÞ
+ );
+
+223 #ifdeà
+_CXXTEST_LONGLONG
+
+
+227
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+228
+þass
+
+ gV®ueT¿\99s
+<cÚ¡ sigÃd
+ g_CXXTEST_LONGLONG
+>
+
+230 \e
+_CXXTEST_LONGLONG
+
+ tT
+;
+
+231 \ 5
+ g_asS\8c\9ag
+[2 + 3 * \17(
+T
+)];
+
+232
+ gpublic
+:
+
+233
+V®ueT¿\99s
+Ð
+T
+
+t
+ ) {
+numb\94ToS\8c\9ag
+<T>Ðt,
+ g_asS\8c\9ag
+ ); }
+
+234 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+237
+CXXTEST_COPY_CONST_TRAITS
+ÐsigÃd
+_CXXTEST_LONGLONG
+ );
+
+242
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+243
+þass
+
+ gV®ueT¿\99s
+<cڡ \1d
+ g_CXXTEST_LONGLONG
+>
+
+245 \e\1d
+ t_CXXTEST_LONGLONG
+
+ tT
+;
+
+246 \ 5
+ g_asS\8c\9ag
+[1 + 3 * \17(
+T
+)];
+
+247
+ gpublic
+:
+
+248
+V®ueT¿\99s
+Ð
+T
+
+t
+ ) {
+numb\94ToS\8c\9ag
+<T>Ðt,
+ g_asS\8c\9ag
+ ); }
+
+249 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+252
+CXXTEST_COPY_CONST_TRAITS
+Ð\1d
+_CXXTEST_LONGLONG
+ );
+
+258
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+259
+þass
+
+ gV®ueT¿\99s
+<const signed \13\12>
+
+261 \esigÃd \13\12
+ tT
+;
+
+262 \ 5
+ g_asS\8c\9ag
+[2 + 3 * \17(
+T
+)];
+
+263
+ gpublic
+:
+
+264
+V®ueT¿\99s
+Ð
+T
+
+t
+ ) {
+numb\94ToS\8c\9ag
+<T>Ðt,
+ g_asS\8c\9ag
+ ); }
+
+265 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+268
+CXXTEST_COPY_CONST_TRAITS
+( signed \13\12);
+
+273
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+274
+þass
+
+ gV®ueT¿\99s
+<const \1d\13\12>
+
+276 \e\1d\13\12
+ tT
+;
+
+277 \ 5
+ g_asS\8c\9ag
+[1 + 3 * \17(
+T
+)];
+
+278
+ gpublic
+:
+
+279
+V®ueT¿\99s
+Ð
+T
+
+t
+ ) {
+numb\94ToS\8c\9ag
+<T>Ðt,
+ g_asS\8c\9ag
+ ); }
+
+280 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+283
+CXXTEST_COPY_CONST_TRAITS
+( \1d\13\12);
+
+289
+CXXTEST_COPY_TRAITS
+( const signed \12, const signed \13\12);
+
+290
+CXXTEST_COPY_TRAITS
+( const \1d\12, const \1d\13\12);
+
+291
+CXXTEST_COPY_TRAITS
+( const signed \16\12, const signed \13\12);
+
+292
+CXXTEST_COPY_TRAITS
+( const \1d\16\12, const \1d\13\12);
+
+293
+CXXTEST_COPY_TRAITS
+( const \1d\ 5, const \1d\13\12);
+
+295
+CXXTEST_COPY_CONST_TRAITS
+( signed \12);
+
+296
+CXXTEST_COPY_CONST_TRAITS
+( \1d\12);
+
+297
+CXXTEST_COPY_CONST_TRAITS
+( signed \16\12);
+
+298
+CXXTEST_COPY_CONST_TRAITS
+( \1d\16\12);
+
+299
+CXXTEST_COPY_CONST_TRAITS
+( \1d\ 5);
+
+305
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+306
+þass
+
+ gV®ueT¿\99s
+<const \ 5>
+
+308 \ 5
+ g_asS\8c\9ag
+[\17("'\\xXX'")];
+
+309
+ gpublic
+:
+
+310
+V®ueT¿\99s
+Ð\ 5
+c
+ ) {
+cÝyS\8c\9ag
+Ð
+ch¬ToS\8c\9ag
+Ðc, cÝyS\8c\9agÐ
+_asS\8c\9ag
+, "'" ) ), "'" ); }
+
+311 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+314
+CXXTEST_COPY_CONST_TRAITS
+( \ 5);
+
+320
+CXXTEST_COPY_TRAITS
+( const signed \ 5, const \ 5);
+
+321
+CXXTEST_COPY_CONST_TRAITS
+( signed \ 5);
+
+326
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+327
+þass
+
+ gV®ueT¿\99s
+<const \b>
+
+329
+ gpublic
+:
+
+330
+V®ueT¿\99s
+Ð\b
+t
+ )
+
+333 iàÐÐ
+t
+ !ð\88è|| (\81 >ð
+HUGE_VAL
+ ) || (\81 == -HUGE_VAL ) )
+
+334
+nÚF\9a\99eNumb\94
+Ð
+t
+ );
+
+335 \viàÐ
+»qu\9cedDig\99sOnLeá
+Ð
+t
+ ) >
+ gMAX_DIGITS_ON_LEFT
+ )
+
+336
+hugeNumb\94
+Ð
+t
+ );
+
+338
+nÜm®Numb\94
+Ð
+t
+ );
+
+341 cڡ \ 5*
+asS\8c\9ag
+Ð\1eècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+343
+ g´iv©e
+:
+
+344 \92um {
+MAX_DIGITS_ON_LEFT
+ = 24,
+ gDIGITS_ON_RIGHT
+ = 4,
+ gBASE
+ = 10 };
+
+345 \ 5
+ g_asS\8c\9ag
+[1 +
+MAX_DIGITS_ON_LEFT
+ + 1 +
+DIGITS_ON_RIGHT
+ + 1];
+
+347 \18\1d
+»qu\9cedDig\99sOnLeá
+Ð\b
+t
+ );
+
+348 \ 5*
+doNeg©ive
+Ð\b&
+t
+ );
+
+349 \1e
+hugeNumb\94
+Ð\b
+t
+ );
+
+350 \1e
+nÜm®Numb\94
+Ð\b
+t
+ );
+
+351 \1e
+nÚF\9a\99eNumb\94
+Ð\b
+t
+ );
+
+352 \ 5*
+doubËToS\8c\9ag
+Ð\b
+t
+, \ 5*
+s
+, \1d
+sk\9d
+ = 0, \1d
+max
+ = (\1d)-1 );
+
+355
+CXXTEST_COPY_CONST_TRAITS
+( \b);
+
+360
+CXXTEST_COPY_TRAITS
+( const \ e, const \b);
+
+361
+CXXTEST_COPY_CONST_TRAITS
+( \ e);
+
+365 #ifdeà
+_CXXTEST_HAVE_STD
+
+
+366 \ 2
+ ~<cxx\8b¡/StdV®ueT¿\99s.h
+>
+
+369
+Çme¥aû
+
+ gdummy_\92um_ns
+ {}
+
+374 \ 1
+ #CXXTEST_ENUM_TRAITS
+Ð
+TYPE
+,
+VALUES
+ ) \
+
+375
+Çme¥aû
+
+CxxTe¡
+ \
+
+377
+CXXTEST_TEMPLATE_INSTANTIATION
+ \
+
+378
+þass
+
+V®ueT¿\99s
+<
+TYPE
+> \
+
+380
+TYPE
+
+_v®ue
+; \
+
+381 \ 5
+_çÎback
+[\17("(" #TYPE ")"è+ 3 * \17(
+TYPE
+)]; \
+
+382
+public
+: \
+
+383
+ `V®ueT¿\99s
+Ð
+TYPE
+
+v®ue
+ ) { \
+
+384
+_v®ue
+ =
+v®ue
+; \
+
+385
+numb\94ToS\8c\9ag
+<\1d\13\12>Ð
+_v®ue
+,
+ `cÝyS\8c\9ag
+Ð
+_çÎback
+, "(" #TYPE ")" ) ); \
+
+387 cڡ \ 5*
+ `asS\8c\9ag
+( \1e) const \
+
+389 \1a
+_v®ue
+ ) \
+
+391
+VALUES
+ \
+
+392 \a: \15
+_çÎback
+; \
+
+396 }
+us\9ag
+
+Çme¥aû
+
+dummy_\92um_ns
+
+
+ )
+
+398 \ 1
+ #CXXTEST_ENUM_MEMBER
+Ð
+MEMBER
+ ) \
+
+399 \ 4
+MEMBER
+: \15 #MEMBER;
+
+ )
+
+ @tools/cxxtest/cxxtest/Win32Gui.h
+
+12 #iâdeà
+__cxx\8b¡__W\9a32Gui_h__
+
+
+13 \ 1
+ #__cxx\8b¡__W\9a32Gui_h__
+
+
+ )
+
+31 \ 2
+ ~<cxx\8b¡/Gui.h
+>
+
+33 \ 2
+ ~<w\9adows.h
+>
+
+34 \ 2
+ ~<commù¾.h
+>
+
+36
+Çme¥aû
+
+ gCxxTe¡
+
+
+38 þas
+ cW\9a32Gui
+ :
+public
+
+GuiLi¡\92\94
+
+
+40
+public
+:
+
+41 \1e
+\92\8brGui
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+43
+·r£CommªdL\9ae
+Ð
+¬gc
+,
+¬gv
+ );
+
+46 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+48
+g\91TÙ®Te¡s
+Ð
+wd
+ );
+
+49
+ g_\8b¡sDÚe
+ = 0;
+
+50
+¡¬tGuiTh»ad
+();
+
+53 \1e
+guiEÁ\94Su\99e
+ÐcÚ¡ \ 5*
+su\99eName
+ )
+
+55
+showSu\99eName
+Ð
+su\99eName
+ );
+
+56
+ȣt
+Ð
+_su\99eS\8f¹
+ );
+
+59 \1e
+guiEÁ\94Te¡
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+61 ++
+ g_\8b¡sDÚe
+;
+
+62
+£tTe¡CtiÚ
+Ð
+su\99eName
+,
+\8b¡Name
+ );
+
+63
+showTe¡Name
+Ð
+\8b¡Name
+ );
+
+64
+showTe¡sDÚe
+();
+
+65
+´og»ssB¬Mes§ge
+Ð
+PBM_STEPIT
+ );
+
+66
+ȣt
+Ð
+_\8b¡S\8f¹
+ );
+
+69 \1e
+y\96lowB¬
+()
+
+71
+£tCÞÜ
+( 255, 255, 0 );
+
+72
+£tIcÚ
+Ð
+IDI_WARNING
+ );
+
+73
+g\91TÙ®Te¡s
+();
+
+76 \1e
+»dB¬
+()
+
+78 iàÐ
+ g_¡¬tM\9aimized
+ )
+
+79
+showMa\9aW\9adow
+Ð
+SW_SHOWNORMAL
+ );
+
+80
+£tCÞÜ
+( 255, 0, 0 );
+
+81
+£tIcÚ
+Ð
+IDI_ERROR
+ );
+
+82
+g\91TÙ®Te¡s
+();
+
+85 \1e
+ËaveGui
+()
+
+87 iàÐ
+k\93p
+() )
+
+89
+showSumm¬y
+();
+
+90
+Wa\99FÜS\9agËObjeù
+Ð
+_gui
+,
+INFINITE
+ );
+
+92
+De¡royW\9adow
+Ð
+_ma\9aW\9adow
+ );
+
+95
+ g´iv©e
+:
+
+96 cڡ \ 5*
+_t\99Ë
+;
+
+97
+boÞ
+
+ g_¡¬tM\9aimized
+,
+ g_k\93p
+;
+
+98
+HANDLE
+
+ g_gui
+;
+
+99
+WNDCLASSEX
+
+ g_w\9adowCÏss
+;
+
+100
+HWND
+
+ g_ma\9aW\9adow
+,
+ g_´og»ssB¬
+,
+ g_¡©usB¬
+;
+
+101
+HANDLE
+
+ g_ÿnS\8f¹Te¡s
+;
+
+102 \1d
+ g_numTÙ®Te¡s
+,
+ g_\8b¡sDÚe
+;
+
+103 \ 5
+ g_¡rTÙ®Te¡s
+[
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+105
+ gSTATUS_SUITE_NAME
+,
+ gSTATUS_SUITE_TIME
+,
+
+106
+ gSTATUS_TEST_NAME
+,
+ gSTATUS_TEST_TIME
+,
+
+107
+ gSTATUS_TESTS_DONE
+,
+ gSTATUS_WORLD_TIME
+,
+
+108
+ gSTATUS_TOTAL_PARTS
+
+
+110 \12
+ g_¡©usWidths
+[
+STATUS_TOTAL_PARTS
+];
+
+111 \1d
+ g_¡©usOff£ts
+[
+STATUS_TOTAL_PARTS
+];
+
+112 \1d
+ g_¡©usTÙ®
+;
+
+113 \ 5
+ g_¡©usTe¡sDÚe
+[\17("1000000000 oà (100%)"è+
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+114
+DWORD
+
+ g_wÜldS\8f¹
+,
+ g_su\99eS\8f¹
+,
+ g_\8b¡S\8f¹
+;
+
+115 \ 5
+ g_timeS\8c\9ag
+[\17("00:00:00")];
+
+117 \1e
+·r£CommªdL\9ae
+Ð\12
+¬gc
+, \ 5**
+¬gv
+ )
+
+119
+ g_¡¬tM\9aimized
+ =
+_k\93p
+ =
+çl£
+;
+
+120
+ g_t\99Ë
+ =
+¬gv
+[0];
+
+122 \ f \12
+ gi
+ = 1; i <
+ g¬gc
+; ++ i )
+
+124 iàÐ!
+l¡rcmpA
+Ð
+¬gv
+[
+i
+], "-minimized" ) )
+
+125
+ g_¡¬tM\9aimized
+ =
+\8cue
+;
+
+126 \viàÐ!
+l¡rcmpA
+Ð
+¬gv
+[
+i
+], "-keep" ) )
+
+127
+ g_k\93p
+ =
+\8cue
+;
+
+128 \viàÐ!
+l¡rcmpA
+Ð
+¬gv
+[
+i
+], "-t\99Ë" ) && (
+ gi
+ + 1 <
+ g¬gc
+) )
+
+129
+ g_t\99Ë
+ =
+¬gv
+[++
+i
+];
+
+133 \1e
+g\91TÙ®Te¡s
+()
+
+135
+g\91TÙ®Te¡s
+Ð
+\8cack\94
+().
+wÜld
+() );
+
+138 \1e
+g\91TÙ®Te¡s
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+140
+ g_numTÙ®Te¡s
+ =
+wd
+.
+numTÙ®Te¡s
+();
+
+141
+ gwd
+.
+¡rTÙ®Te¡s
+Ð
+_¡rTÙ®Te¡s
+ );
+
+144 \1e
+¡¬tGuiTh»ad
+()
+
+146
+ g_ÿnS\8f¹Te¡s
+ =
+C»©eEv\92t
+Ð
+NULL
+,
+TRUE
+,
+FALSE
+, NULL );
+
+147
+DWORD
+
+ gth»adId
+;
+
+148
+ g_gui
+ =
+C»©eTh»ad
+Ð
+NULL
+, 0, &(
+W\9a32Gui
+::
+guiTh»ad
+), (
+LPVOID
+)
+this
+, 0, &
+th»adId
+ );
+
+149
+Wa\99FÜS\9agËObjeù
+Ð
+_ÿnS\8f¹Te¡s
+,
+INFINITE
+ );
+
+152 \18
+DWORD
+
+WINAPI
+
+guiTh»ad
+Ð
+LPVOID
+
+·¿m\91\94
+ )
+
+154 ((
+ gW\9a32Gui
+ *)
+ g·¿m\91\94
+)->
+gui
+();
+
+158 \1e
+gui
+()
+
+160
+»gi¡\94W\9adowCÏss
+();
+
+161
+ü\97\8bMa\9aW\9adow
+();
+
+162
+\9a\99CommÚCÚ\8cÞs
+();
+
+163
+ü\97\8bProg»ssB¬
+();
+
+164
+ü\97\8bS\8ftusB¬
+();
+
+165
+ûÁ\94Ma\9aW\9adow
+();
+
+166
+showMa\9aW\9adow
+();
+
+167
+¡¬tTim\94
+();
+
+168
+¡¬tTe¡s
+();
+
+170
+mes§geLoÝ
+();
+
+173 \1e
+»gi¡\94W\9adowCÏss
+()
+
+175
+ g_w\9adowCÏss
+.
+ gcbSize
+ = \17(
+_w\9adowCÏss
+);
+
+176
+ g_w\9adowCÏss
+.
+ g¡yË
+ =
+CS_HREDRAW
+ |
+CS_VREDRAW
+;
+
+177
+ g_w\9adowCÏss
+.
+ gÍâWndProc
+ = &(
+W\9a32Gui
+::
+w\9adowProûdu»
+);
+
+178
+ g_w\9adowCÏss
+.
+ gcbClsEx\8ca
+ = 0;
+
+179
+ g_w\9adowCÏss
+.
+ gcbWndEx\8ca
+ = \17(
+LONG
+);
+
+180
+ g_w\9adowCÏss
+.
+ ghIn¡ªû
+ = (
+HINSTANCE
+)
+NULL
+;
+
+181
+ g_w\9adowCÏss
+.
+ ghIcÚ
+ = (
+HICON
+)
+NULL
+;
+
+182
+ g_w\9adowCÏss
+.
+ ghCursÜ
+ = (
+HCURSOR
+)
+NULL
+;
+
+183
+ g_w\9adowCÏss
+.
+ ghbrBackground
+ = (
+HBRUSH
+)(
+COLOR_WINDOW
+ + 1);
+
+184
+ g_w\9adowCÏss
+.
+ gÍszM\92uName
+ =
+NULL
+;
+
+185
+ g_w\9adowCÏss
+.
+ gÍszCÏssName
+ =
+TEXT
+("CxxTest Window Class");
+
+186
+ g_w\9adowCÏss
+.
+ ghIcÚSm
+ = (
+HICON
+)
+NULL
+;
+
+188
+Regi¡\94CÏssEx
+Ð&
+_w\9adowCÏss
+ );
+
+191 \1e
+ü\97\8bMa\9aW\9adow
+()
+
+193
+ g_ma\9aW\9adow
+ =
+ü\97\8bW\9adow
+Ð
+_w\9adowCÏss
+.
+ÍszCÏssName
+,
+WS_OVERLAPPEDWINDOW
+ );
+
+196 \1e
+\9a\99CommÚCÚ\8cÞs
+()
+
+198
+HMODULE
+
+ gdÎ
+ =
+LßdLib¿ryA
+( "comctl32.dll" );
+
+199 iàÐ!
+ gdÎ
+ )
+
+202 \e\1e(
+WINAPI
+ *
+ tFUNC
+)( \1e);
+
+203
+FUNC
+
+ gfunc
+ = (FUNC)
+G\91ProcAdd»ss
+Ð
+dÎ
+, "InitCommonControls" );
+
+204 iàÐ!
+ gfunc
+ )
+
+207
+func
+();
+
+210 \1e
+ü\97\8bProg»ssB¬
+()
+
+212
+ g_´og»ssB¬
+ =
+ü\97\8bW\9adow
+Ð
+PROGRESS_CLASS
+,
+WS_CHILD
+ |
+WS_VISIBLE
+ |
+PBS_SMOOTH
+,
+_ma\9aW\9adow
+ );
+
+214 #ifdeà
+PBM_SETRANGE32
+
+
+215
+´og»ssB¬Mes§ge
+Ð
+PBM_SETRANGE32
+, 0,
+_numTÙ®Te¡s
+ );
+
+217
+´og»ssB¬Mes§ge
+Ð
+PBM_SETRANGE
+, 0,
+MAKELPARAM
+Ð0, (
+WORD
+)
+_numTÙ®Te¡s
+ ) );
+
+219
+´og»ssB¬Mes§ge
+Ð
+PBM_SETPOS
+, 0 );
+
+220
+´og»ssB¬Mes§ge
+Ð
+PBM_SETSTEP
+, 1 );
+
+221
+g»\92B¬
+();
+
+222
+Upd©eW\9adow
+Ð
+_´og»ssB¬
+ );
+
+225 \1e
+ü\97\8bS\8ftusB¬
+()
+
+227
+ g_¡©usB¬
+ =
+ü\97\8bW\9adow
+Ð
+STATUSCLASSNAME
+,
+WS_CHILD
+ |
+WS_VISIBLE
+,
+_ma\9aW\9adow
+ );
+
+228
+£tR©ios
+( 4, 1, 3, 1, 3, 1 );
+
+231 \1e
+£tR©ios
+Ð\1d
+su\99eNameR©io
+, \1d
+su\99eTimeR©io
+,
+
+232 \1d
+\8b¡NameR©io
+, \1d
+\8b¡TimeR©io
+,
+
+233 \1d
+\8b¡sDÚeR©io
+, \1d
+wÜldTimeR©io
+ )
+
+235
+ g_¡©usTÙ®
+ = 0;
+
+236
+ g_¡©usOff£ts
+[
+STATUS_SUITE_NAME
+] = (
+_¡©usTÙ®
+ +ð
+su\99eNameR©io
+);
+
+237
+ g_¡©usOff£ts
+[
+STATUS_SUITE_TIME
+] = (
+_¡©usTÙ®
+ +ð
+su\99eTimeR©io
+);
+
+238
+ g_¡©usOff£ts
+[
+STATUS_TEST_NAME
+] = (
+_¡©usTÙ®
+ +ð
+\8b¡NameR©io
+);
+
+239
+ g_¡©usOff£ts
+[
+STATUS_TEST_TIME
+] = (
+_¡©usTÙ®
+ +ð
+\8b¡TimeR©io
+);
+
+240
+ g_¡©usOff£ts
+[
+STATUS_TESTS_DONE
+] = (
+_¡©usTÙ®
+ +ð
+\8b¡sDÚeR©io
+);
+
+241
+ g_¡©usOff£ts
+[
+STATUS_WORLD_TIME
+] = (
+_¡©usTÙ®
+ +ð
+wÜldTimeR©io
+);
+
+244
+HWND
+
+ü\97\8bW\9adow
+Ð
+LPCTSTR
+
+þassName
+,
+DWORD
+
+¡yË
+, HWND
+·»Á
+ = (HWND)
+NULL
+ )
+
+246 \15
+C»©eW\9adow
+Ð
+þassName
+,
+NULL
+,
+¡yË
+, 0, 0, 0, 0,
+·»Á
+,
+
+247 (
+HMENU
+)
+NULL
+, (
+HINSTANCE
+)NULL, (
+LPVOID
+)
+this
+ );
+
+250 \1e
+´og»ssB¬Mes§ge
+Ð
+UINT
+
+mes§ge
+,
+WPARAM
+
+wP¬am
+ = 0,
+LPARAM
+
+lP¬am
+ = 0 )
+
+252
+S\92dMes§ge
+Ð
+_´og»ssB¬
+,
+mes§ge
+,
+wP¬am
+,
+lP¬am
+ );
+
+255 \1e
+ûÁ\94Ma\9aW\9adow
+()
+
+257
+RECT
+
+ gsü\93n
+;
+
+258
+g\91Sü\93nA»a
+Ð
+sü\93n
+ );
+
+260
+LONG
+
+ gsü\93nWidth
+ =
+sü\93n
+.
+right
+ - sü\93n.
+Ëá
+;
+
+261
+LONG
+
+ gsü\93nHeight
+ =
+sü\93n
+.
+bÙtom
+ - sü\93n.
+tÝ
+;
+
+263
+LONG
+
+ gxC\92\8br
+ = (
+sü\93n
+.
+right
+ + sü\93n.
+Ëá
+) / 2;
+
+264
+LONG
+
+ gyC\92\8br
+ = (
+sü\93n
+.
+bÙtom
+ + sü\93n.
+tÝ
+) / 2;
+
+266
+LONG
+
+ gw\9adowWidth
+ = (
+sü\93nWidth
+ * 4) / 5;
+
+267
+LONG
+
+ gw\9adowHeight
+ =
+sü\93nHeight
+ / 10;
+
+268
+LONG
+
+ gm\9aimumHeight
+ = 2 * (
+G\91Sy¡emM\91rics
+Ð
+SM_CYCAPTION
+ ) + G\91Sy¡emM\91ricsÐ
+SM_CYFRAME
+ ));
+
+269 iàÐ
+ gw\9adowHeight
+ <
+ gm\9aimumHeight
+ )
+
+270
+ gw\9adowHeight
+ =
+m\9aimumHeight
+;
+
+272
+S\91W\9adowPos
+Ð
+_ma\9aW\9adow
+,
+HWND_TOP
+,
+
+273
+xC\92\8br
+ - (
+w\9adowWidth
+ / 2),
+yC\92\8br
+ - (
+w\9adowHeight
+ / 2),
+
+274
+w\9adowWidth
+,
+w\9adowHeight
+, 0 );
+
+277 \1e
+g\91Sü\93nA»a
+Ð
+RECT
+ &
+¬\97
+ )
+
+279 iàÐ!
+g\91Sü\93nA»aW\99houtTaskb¬
+Ð
+¬\97
+ ) )
+
+280
+g\91WhÞeSü\93nA»a
+Ð
+¬\97
+ );
+
+283
+boÞ
+
+g\91Sü\93nA»aW\99houtTaskb¬
+Ð
+RECT
+ &
+¬\97
+ )
+
+285 \15 (
+Sy¡emP¬am\91\94sInfo
+Ð
+SPI_GETWORKAREA
+, \17(
+RECT
+), &
+¬\97
+, 0 ) != 0);
+
+288 \1e
+g\91WhÞeSü\93nA»a
+Ð
+RECT
+ &
+¬\97
+ )
+
+290
+ g¬\97
+.
+ gËá
+ =
+¬\97
+.
+tÝ
+ = 0;
+
+291
+ g¬\97
+.
+ gright
+ =
+G\91Sy¡emM\91rics
+Ð
+SM_CXSCREEN
+ );
+
+292
+ g¬\97
+.
+ gbÙtom
+ =
+G\91Sy¡emM\91rics
+Ð
+SM_CYSCREEN
+ );
+
+295 \1e
+showMa\9aW\9adow
+()
+
+297
+showMa\9aW\9adow
+Ð
+_¡¬tM\9aimized
+ ?
+SW_MINIMIZE
+ :
+SW_SHOWNORMAL
+ );
+
+298
+Upd©eW\9adow
+Ð
+_ma\9aW\9adow
+ );
+
+301 \1e
+showMa\9aW\9adow
+Ð\12
+mode
+ )
+
+303
+ShowW\9adow
+Ð
+_ma\9aW\9adow
+,
+mode
+ );
+
+306 \92um {
+ gTIMER_ID
+ = 1,
+ gTIMER_DELAY
+ = 1000 };
+
+308 \1e
+¡¬tTim\94
+()
+
+310
+ȣt
+Ð
+_wÜldS\8f¹
+ );
+
+311
+ȣt
+Ð
+_su\99eS\8f¹
+ );
+
+312
+ȣt
+Ð
+_\8b¡S\8f¹
+ );
+
+313
+S\91Tim\94
+Ð
+_ma\9aW\9adow
+,
+TIMER_ID
+,
+TIMER_DELAY
+, 0 );
+
+316 \1e
+ȣt
+Ð
+DWORD
+ &
+tick
+ )
+
+318
+ gtick
+ =
+G\91TickCouÁ
+();
+
+321 \1e
+¡¬tTe¡s
+()
+
+323
+S\91Ev\92t
+Ð
+_ÿnS\8f¹Te¡s
+ );
+
+326 \1e
+mes§geLoÝ
+()
+
+328
+MSG
+
+ gmes§ge
+;
+
+329 \1f
+BOOL
+
+ ghaveMes§ge
+ =
+G\91Mes§ge
+Ð&
+mes§ge
+,
+NULL
+, 0, 0 ) )
+
+330 iàÐ
+ ghaveMes§ge
+ != -1 )
+
+331
+Di¥©chMes§ge
+Ð&
+mes§ge
+ );
+
+334 \18
+LRESULT
+
+CALLBACK
+
+w\9adowProûdu»
+Ð
+HWND
+
+w\9adow
+,
+UINT
+
+mes§ge
+,
+WPARAM
+
+wP¬am
+,
+LPARAM
+
+lP¬am
+ )
+
+336 iàÐ
+ gmes§ge
+ =ð
+WM_CREATE
+ )
+
+337
+£tUp
+Ð
+w\9adow
+, (
+LPCREATESTRUCT
+)
+lP¬am
+ );
+
+339
+W\9a32Gui
+ *
+ gth©
+ = (W\9a32Gu\98*)
+G\91W\9adowLÚg
+Ð
+w\9adow
+,
+GWL_USERDATA
+ );
+
+340 \15
+ gth©
+->
+hªdË
+Ð
+w\9adow
+,
+mes§ge
+,
+wP¬am
+,
+lP¬am
+ );
+
+343 \18\1e
+£tUp
+Ð
+HWND
+
+w\9adow
+,
+LPCREATESTRUCT
+
+ü\97\8b
+ )
+
+345
+S\91W\9adowLÚg
+Ð
+w\9adow
+,
+GWL_USERDATA
+, (
+LONG
+)
+ü\97\8b
+->
+ÍC»©eP¬ams
+ );
+
+348
+LRESULT
+
+hªdË
+Ð
+HWND
+
+w\9adow
+,
+UINT
+
+mes§ge
+,
+WPARAM
+
+wP¬am
+,
+LPARAM
+
+lP¬am
+ )
+
+350 \1a
+ gmes§ge
+ )
+
+352 \ 4
+ gWM_SIZE
+:
+»sizeCÚ\8cÞs
+(); \ 3;
+
+354 \ 4
+ gWM_TIMER
+:
+upd©eTime
+(); \ 3;
+
+356 \ 4
+ gWM_CLOSE
+:
+
+357 \ 4
+WM_DESTROY
+:
+
+358 \ 4
+WM_QUIT
+:
+
+359
+Ex\99Proûss
+Ð
+\8cack\94
+().
+ç\9eedTe¡s
+() );
+
+361 \a: \15
+DefW\9adowProc
+Ð
+w\9adow
+,
+mes§ge
+,
+wP¬am
+,
+lP¬am
+ );
+
+366 \1e
+»sizeCÚ\8cÞs
+()
+
+368
+RECT
+
+ gr
+;
+
+369
+G\91Cl\9bÁReù
+Ð
+_ma\9aW\9adow
+, &
+r
+ );
+
+370
+LONG
+
+ gwidth
+ =
+r
+.
+right
+ -\84.
+Ëá
+;
+
+371
+LONG
+
+ gheight
+ =
+r
+.
+bÙtom
+ -\84.
+tÝ
+;
+
+373
+G\91Cl\9bÁReù
+Ð
+_¡©usB¬
+, &
+r
+ );
+
+374
+LONG
+
+ g¡©usHeight
+ =
+r
+.
+bÙtom
+ -\84.
+tÝ
+;
+
+375
+LONG
+
+ g»sizeGr\9dWidth
+ =
+¡©usHeight
+;
+
+376
+LONG
+
+ g´og»ssHeight
+ =
+height
+ -
+¡©usHeight
+;
+
+378
+S\91W\9adowPos
+Ð
+_´og»ssB¬
+,
+HWND_TOP
+, 0, 0,
+width
+,
+´og»ssHeight
+, 0 );
+
+379
+S\91W\9adowPos
+Ð
+_¡©usB¬
+,
+HWND_TOP
+, 0,
+´og»ssHeight
+,
+width
+,
+¡©usHeight
+, 0 );
+
+380
+£tS\8ftusP¬ts
+Ð
+width
+ -
+»sizeGr\9dWidth
+ );
+
+383 \1e
+£tS\8ftusP¬ts
+Ð
+LONG
+
+width
+ )
+
+385 \ f \1d
+ gi
+ = 0; i <
+ gSTATUS_TOTAL_PARTS
+; ++ i )
+
+386
+ g_¡©usWidths
+[
+i
+] = (
+width
+ *
+_¡©usOff£ts
+[i]è/
+_¡©usTÙ®
+;
+
+388
+¡©usB¬Mes§ge
+Ð
+SB_SETPARTS
+,
+STATUS_TOTAL_PARTS
+,
+_¡©usWidths
+ );
+
+391 \1e
+¡©usB¬Mes§ge
+Ð
+UINT
+
+mes§ge
+,
+WPARAM
+
+wP¬am
+ = 0, cڡ \1e*
+lP¬am
+ = 0 )
+
+393
+S\92dMes§ge
+Ð
+_¡©usB¬
+,
+mes§ge
+,
+wP¬am
+, (
+LPARAM
+)
+lP¬am
+ );
+
+396 \1e
+g»\92B¬
+()
+
+398
+£tCÞÜ
+( 0, 255, 0 );
+
+399
+£tIcÚ
+Ð
+IDI_INFORMATION
+ );
+
+402 #ifdeà
+PBM_SETBARCOLOR
+
+
+403 \1e
+£tCÞÜ
+Ð
+BYTE
+
+»d
+, BYTE
+g»\92
+, BYTE
+blue
+ )
+
+405
+´og»ssB¬Mes§ge
+Ð
+PBM_SETBARCOLOR
+, 0,
+RGB
+Ð
+»d
+,
+g»\92
+,
+blue
+ ) );
+
+408 \1e
+£tCÞÜ
+Ð
+BYTE
+, BYTE, BYTE )
+
+413 \1e
+£tIcÚ
+Ð
+LPCTSTR
+
+icÚ
+ )
+
+415
+S\92dMes§ge
+Ð
+_ma\9aW\9adow
+,
+WM_SETICON
+,
+ICON_BIG
+, (
+LPARAM
+)
+lßdS\8fnd¬dIcÚ
+Ð
+icÚ
+ ) );
+
+418
+HICON
+
+lßdS\8fnd¬dIcÚ
+Ð
+LPCTSTR
+
+icÚ
+ )
+
+420 \15
+LßdIcÚ
+Ð(
+HINSTANCE
+)
+NULL
+,
+icÚ
+ );
+
+423 \1e
+£tTe¡CtiÚ
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+425
+£tCtiÚ
+Ð
+su\99eName
+, "::",
+\8b¡Name
+, "()" );
+
+428 \1e
+£tCtiÚ
+ÐcÚ¡ \ 5*
+a
+ = "", cڡ \ 5*
+b
+ = "", cڡ \ 5*
+c
+ = "", cڡ \ 5*
+d
+ = "" )
+
+430 \1d
+Ëngth
+ =
+l¡¾\92A
+Ð
+_t\99Ë
+ ) + \17( " - " ) +
+
+431
+l¡¾\92A
+Ð
+a
+ ) +\86¡¾\92AÐ
+b
+ ) +\86¡¾\92AÐ
+c
+ ) +\86¡¾\92AÐ
+d
+ );
+
+432 \ 5*
+ gÇme
+ =
+®loÿ\8b
+Ð
+Ëngth
+ );
+
+433
+l¡rýyA
+Ð
+Çme
+,
+_t\99Ë
+ );
+
+434
+l¡rÿtA
+Ð
+Çme
+, " - " );
+
+435
+l¡rÿtA
+Ð
+Çme
+,
+a
+ );
+
+436
+l¡rÿtA
+Ð
+Çme
+,
+b
+ );
+
+437
+l¡rÿtA
+Ð
+Çme
+,
+c
+ );
+
+438
+l¡rÿtA
+Ð
+Çme
+,
+d
+ );
+
+439
+S\91W\9adowTextA
+Ð
+_ma\9aW\9adow
+,
+Çme
+ );
+
+440
+d\97Îoÿ\8b
+Ð
+Çme
+ );
+
+443 \1e
+showSu\99eName
+ÐcÚ¡ \ 5*
+su\99eName
+ )
+
+445
+£tS\8ftusP¬t
+Ð
+STATUS_SUITE_NAME
+,
+su\99eName
+ );
+
+448 \1e
+showTe¡Name
+ÐcÚ¡ \ 5*
+\8b¡Name
+ )
+
+450
+£tS\8ftusP¬t
+Ð
+STATUS_TEST_NAME
+,
+\8b¡Name
+ );
+
+453 \1e
+showTe¡sDÚe
+()
+
+455
+w¥r\9atfA
+Ð
+_¡©usTe¡sDÚe
+, "%u of %s (%u%%)",
+
+456
+_\8b¡sDÚe
+,
+_¡rTÙ®Te¡s
+,
+
+457 (
+_\8b¡sDÚe
+ * 100è/
+_numTÙ®Te¡s
+ );
+
+458
+£tS\8ftusP¬t
+Ð
+STATUS_TESTS_DONE
+,
+_¡©usTe¡sDÚe
+ );
+
+461 \1e
+upd©eTime
+()
+
+463
+£tS\8ftusTime
+Ð
+STATUS_WORLD_TIME
+,
+_wÜldS\8f¹
+ );
+
+464
+£tS\8ftusTime
+Ð
+STATUS_SUITE_TIME
+,
+_su\99eS\8f¹
+ );
+
+465
+£tS\8ftusTime
+Ð
+STATUS_TEST_TIME
+,
+_\8b¡S\8f¹
+ );
+
+468 \1e
+£tS\8ftusTime
+Ð\1d
+·¹
+,
+DWORD
+
+¡¬t
+ )
+
+470 \1d
+ gtٮ
+ = (
+G\91TickCouÁ
+(è-
+¡¬t
+) / 1000;
+
+471 \1d
+ ghours
+ =
+tٮ
+ / 3600;
+
+472 \1d
+ gm\9au\8bs
+ = (
+tٮ
+ / 60) % 60;
+
+473 \1d
+ g£cÚds
+ =
+tٮ
+ % 60;
+
+475 iàÐ
+ ghours
+ )
+
+476
+w¥r\9atfA
+Ð
+_timeS\8c\9ag
+, "%u:%02u:%02u",
+hours
+,
+m\9au\8bs
+,
+£cÚds
+ );
+
+478
+w¥r\9atfA
+Ð
+_timeS\8c\9ag
+, "%02u:%02u",
+m\9au\8bs
+,
+£cÚds
+ );
+
+480
+£tS\8ftusP¬t
+Ð
+·¹
+,
+_timeS\8c\9ag
+ );
+
+483
+boÞ
+
+k\93p
+()
+
+485 iàÐ!
+ g_k\93p
+ )
+
+486 \15
+ gçl£
+;
+
+487 iàÐ!
+ g_¡¬tM\9aimized
+ )
+
+488 \15
+ g\8cue
+;
+
+489 \15 (
+ g_ma\9aW\9adow
+ =ð
+G\91FÜegroundW\9adow
+());
+
+492 \1e
+showSumm¬y
+()
+
+494
+¡ÝTim\94
+();
+
+495
+£tSumm¬yS\8ftusB¬
+();
+
+496
+£tSumm¬yCtiÚ
+();
+
+499 \1e
+£tS\8ftusP¬t
+Ð\1d
+·¹
+, cڡ \ 5*
+\8bxt
+ )
+
+501
+¡©usB¬Mes§ge
+Ð
+SB_SETTEXTA
+,
+·¹
+,
+\8bxt
+ );
+
+504 \1e
+¡ÝTim\94
+()
+
+506
+K\9elTim\94
+Ð
+_ma\9aW\9adow
+,
+TIMER_ID
+ );
+
+507
+£tS\8ftusTime
+Ð
+STATUS_WORLD_TIME
+,
+_wÜldS\8f¹
+ );
+
+510 \1e
+£tSumm¬yS\8ftusB¬
+()
+
+512
+£tR©ios
+( 0, 0, 0, 0, 1, 1 );
+
+513
+»sizeCÚ\8cÞs
+();
+
+515 cڡ \ 5*
+ g\8b¡s
+ = (
+_numTÙ®Te¡s
+ == 1) ? "test" : "tests";
+
+516 iàÐ
+\8cack\94
+().
+ç\9eedTe¡s
+() )
+
+517
+w¥r\9atfA
+Ð
+_¡©usTe¡sDÚe
+, "Failed %u of %s %s",
+
+518
+\8cack\94
+().
+ç\9eedTe¡s
+(),
+_¡rTÙ®Te¡s
+,
+\8b¡s
+ );
+
+520
+w¥r\9atfA
+Ð
+_¡©usTe¡sDÚe
+, "% % ·s£d",
+_¡rTÙ®Te¡s
+,
+\8b¡s
+ );
+
+522
+£tS\8ftusP¬t
+Ð
+STATUS_TESTS_DONE
+,
+_¡©usTe¡sDÚe
+ );
+
+525 \1e
+£tSumm¬yCtiÚ
+()
+
+527
+£tCtiÚ
+Ð
+_¡©usTe¡sDÚe
+ );
+
+530 \ 5*
+®loÿ\8b
+Ð\1d
+Ëngth
+ )
+
+532 \15 (\ 5*)
+H\97pAÎoc
+Ð
+G\91ProûssH\97p
+(), 0,
+Ëngth
+ );
+
+535 \1e
+d\97Îoÿ\8b
+Ð\ 5*
+d©a
+ )
+
+537
+H\97pF»e
+Ð
+G\91ProûssH\97p
+(), 0,
+d©a
+ );
+
+ @tools/cxxtest/cxxtest/X11Gui.h
+
+12 #iâdeà
+__cxx\8b¡__X11Gui_h__
+
+
+13 \ 1
+ #__cxx\8b¡__X11Gui_h__
+
+
+ )
+
+26 \ 2
+ ~<cxx\8b¡/Gui.h
+>
+
+28 \ 2
+ ~<X11/Xlib.h
+>
+
+29 \ 2
+ ~<X11/Xut\9e.h
+>
+
+30 \ 2
+ ~<¡dio.h
+>
+
+31 \ 2
+ ~<¡dlib.h
+>
+
+32 \ 2
+ ~<¡r\9ag.h
+>
+
+34
+Çme¥aû
+
+ gCxxTe¡
+
+
+36 þas
+ cX11Gui
+ :
+public
+
+GuiLi¡\92\94
+
+
+38
+public
+:
+
+39 \1e
+\92\8brGui
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+41
+·r£CommªdL\9ae
+Ð
+¬gc
+,
+¬gv
+ );
+
+44 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+46
+Ý\92Di¥Ïy
+();
+
+47 iàÐ
+ g_di¥Ïy
+ ) {
+
+48
+ü\97\8bCÞÜs
+();
+
+49
+ü\97\8bW\9adow
+();
+
+50
+ü\97\8bGc
+();
+
+51
+ü\97\8bFÚt
+();
+
+52
+ûÁ\94W\9adow
+();
+
+53
+\9a\99\9flizeEv\92ts
+();
+
+54
+\9a\99\9flizeB¬
+Ð
+wd
+ );
+
+55
+´oûssEv\92ts
+();
+
+59 \1e
+guiEÁ\94Te¡
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+61 iàÐ
+ g_di¥Ïy
+ ) {
+
+62 ++
+ g_\8b¡sDÚe
+;
+
+63
+£tW\9adowName
+Ð
+su\99eName
+,
+\8b¡Name
+ );
+
+64
+»d¿w
+();
+
+68 \1e
+y\96lowB¬
+()
+
+70 iàÐ
+ g_di¥Ïy
+ ) {
+
+71
+ g_b¬CÞÜ
+ =
+g\91CÞÜ
+Ð
+_y\96lowName
+ );
+
+72
+g\91TÙ®Te¡s
+();
+
+73
+´oûssEv\92ts
+();
+
+77 \1e
+»dB¬
+()
+
+79 iàÐ
+ g_di¥Ïy
+ ) {
+
+80
+ g_b¬CÞÜ
+ =
+g\91CÞÜ
+Ð
+_»dName
+ );
+
+81
+g\91TÙ®Te¡s
+();
+
+82
+´oûssEv\92ts
+();
+
+86 \1e
+ËaveGui
+()
+
+88 iàÐ
+ g_di¥Ïy
+ ) {
+
+89
+ä\93FÚtInfo
+();
+
+90
+de¡royGc
+();
+
+91
+de¡royW\9adow
+();
+
+92
+þo£Di¥Ïy
+();
+
+96
+ g´iv©e
+:
+
+97 cڡ \ 5*
+_´og¿mName
+;
+
+98
+Di¥Ïy
+ *
+ g_di¥Ïy
+;
+
+99
+W\9adow
+
+ g_w\9adow
+;
+
+100 \1d
+ g_numTÙ®Te¡s
+,
+ g_\8b¡sDÚe
+;
+
+101 \ 5
+ g_¡rTÙ®Te¡s
+[
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+102 cڡ \ 5*
+ g_fÜegroundName
+, *
+ g_backgroundName
+;
+
+103 cڡ \ 5*
+ g_g»\92Name
+, *
+ g_y\96lowName
+, *
+ g_»dName
+;
+
+104 \1d\13
+ g_fÜeground
+,
+ g_background
+,
+ g_b¬CÞÜ
+;
+
+105 \12
+ g_width
+,
+ g_height
+;
+
+106
+GC
+
+ g_gc
+;
+
+107 cڡ \ 5*
+ g_fÚtName
+;
+
+108
+XID
+
+ g_fÚtId
+;
+
+109
+XFÚtS\8cuù
+ *
+ g_fÚtInfo
+;
+
+110 \12
+ g_\8bxtHeight
+,
+ g_\8bxtDesûÁ
+;
+
+111 \13
+ g_ev\92tMask
+;
+
+112
+CÞÜm
+
+ g_cÞÜm
+;
+
+114 \1e
+·r£CommªdL\9ae
+Ð\12&
+¬gc
+, \ 5**
+¬gv
+ )
+
+116
+ g_´og¿mName
+ =
+¬gv
+[0];
+
+118
+ g_fÚtName
+ = 0;
+
+119
+ g_fÜegroundName
+ = "Black";
+
+120
+ g_backgroundName
+ = "Grey";
+
+121
+ g_g»\92Name
+ = "Green";
+
+122
+ g_y\96lowName
+ = "Yellow";
+
+123
+ g_»dName
+ = "Red";
+
+125 \ f \12
+ gi
+ = 1; i + 1 <
+ g¬gc
+; ++ i ) {
+
+126 iàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-title" ) )
+
+127
+ g_´og¿mName
+ =
+¬gv
+[++
+i
+];
+
+128 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-fn" ) || !strcmp(\87rgv[i], "-font" ) )
+
+129
+ g_fÚtName
+ =
+¬gv
+[++
+i
+];
+
+130 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-fg" ) || !strcmp(\87rgv[i], "-foreground" ) )
+
+131
+ g_fÜegroundName
+ =
+¬gv
+[++
+i
+];
+
+132 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-bg" ) || !strcmp(\87rgv[i], "-background" ) )
+
+133
+ g_backgroundName
+ =
+¬gv
+[++
+i
+];
+
+134 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-green" ) )
+
+135
+ g_g»\92Name
+ =
+¬gv
+[++
+i
+];
+
+136 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-yellow" ) )
+
+137
+ g_y\96lowName
+ =
+¬gv
+[++
+i
+];
+
+138 \viàÐ!
+¡rcmp
+Ð
+¬gv
+[
+i
+], "-red" ) )
+
+139
+ g_»dName
+ =
+¬gv
+[++
+i
+];
+
+143 \1e
+Ý\92Di¥Ïy
+()
+
+145
+ g_di¥Ïy
+ =
+XO³nDi¥Ïy
+Ð
+NULL
+ );
+
+148 \1e
+ü\97\8bCÞÜs
+()
+
+150
+ g_cÞÜm
+ =
+DeçuÉCÞÜm
+Ð
+_di¥Ïy
+, 0 );
+
+151
+ g_fÜeground
+ =
+g\91CÞÜ
+Ð
+_fÜegroundName
+ );
+
+152
+ g_background
+ =
+g\91CÞÜ
+Ð
+_backgroundName
+ );
+
+155 \1d\13
+g\91CÞÜ
+ÐcÚ¡ \ 5*
+cÞÜName
+ )
+
+157
+XCÞÜ
+
+ gcÞÜ
+;
+
+158
+XP¬£CÞÜ
+Ð
+_di¥Ïy
+,
+_cÞÜm
+,
+cÞÜName
+, &
+cÞÜ
+ );
+
+159
+XAÎocCÞÜ
+Ð
+_di¥Ïy
+,
+_cÞÜm
+, &
+cÞÜ
+ );
+
+160 \15
+ gcÞÜ
+.
+ gpix\96
+;
+
+163 \1e
+ü\97\8bW\9adow
+()
+
+165
+ g_w\9adow
+ =
+XC»©eSim¶eW\9adow
+Ð
+_di¥Ïy
+,
+RoÙW\9adow
+Ð_di¥Ïy, 0 ), 0, 0, 1, 1, 0, 0,
+_background
+ );
+
+168 \1e
+ü\97\8bGc
+()
+
+170
+ g_gc
+ =
+XC»©eGC
+Ð
+_di¥Ïy
+,
+_w\9adow
+, 0, 0 );
+
+173 \1e
+ü\97\8bFÚt
+()
+
+175 iàÐ!
+lßdFÚt
+() )
+
+176
+u£DeçuÉFÚt
+();
+
+177
+g\91FÚtInfo
+();
+
+178
+ g_\8bxtHeight
+ =
+_fÚtInfo
+->
+asûÁ
+ + _fÚtInfo->
+desûÁ
+;
+
+179
+ g_\8bxtDesûÁ
+ =
+_fÚtInfo
+->
+desûÁ
+;
+
+182
+boÞ
+
+lßdFÚt
+()
+
+184 iàÐ!
+ g_fÚtName
+ )
+
+185 \15
+ gçl£
+;
+
+186
+ g_fÚtId
+ =
+XLßdFÚt
+Ð
+_di¥Ïy
+,
+_fÚtName
+ );
+
+187 \15 (
+XS\91FÚt
+Ð
+_di¥Ïy
+,
+_gc
+,
+_fÚtId
+ ) =ð
+Sucûss
+);
+
+190 \1e
+u£DeçuÉFÚt
+()
+
+192
+ g_fÚtId
+ =
+XGCڋxtFromGC
+Ð
+_gc
+ );
+
+195 \1e
+g\91FÚtInfo
+()
+
+197
+ g_fÚtInfo
+ =
+XQu\94yFÚt
+Ð
+_di¥Ïy
+,
+_fÚtId
+ );
+
+200 \1e
+ä\93FÚtInfo
+()
+
+202
+XF»eFÚtInfo
+Ð
+NULL
+,
+_fÚtInfo
+, 1 );
+
+205 \1e
+\9a\99\9flizeEv\92ts
+()
+
+207
+ g_ev\92tMask
+ =
+Exposu»Mask
+;
+
+208
+XS\96eùIÅut
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+_ev\92tMask
+ );
+
+211 \1e
+\9a\99\9flizeB¬
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+213
+g\91TÙ®Te¡s
+Ð
+wd
+ );
+
+214
+ g_\8b¡sDÚe
+ = 0;
+
+215
+ g_b¬CÞÜ
+ =
+g\91CÞÜ
+Ð
+_g»\92Name
+ );
+
+218 \1e
+g\91TÙ®Te¡s
+()
+
+220
+g\91TÙ®Te¡s
+Ð
+\8cack\94
+().
+wÜld
+() );
+
+223 \1e
+g\91TÙ®Te¡s
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+225
+ g_numTÙ®Te¡s
+ =
+wd
+.
+numTÙ®Te¡s
+();
+
+226
+ gwd
+.
+¡rTÙ®Te¡s
+Ð
+_¡rTÙ®Te¡s
+ );
+
+229 \1e
+ûÁ\94W\9adow
+()
+
+231
+XMW\9adow
+Ð
+_di¥Ïy
+,
+_w\9adow
+ );
+
+233
+Sü\93n
+ *
+ gsü\93n
+ =
+XDeçuÉSü\93nOfDi¥Ïy
+Ð
+_di¥Ïy
+ );
+
+234 \12
+ gsü\93nWidth
+ =
+WidthOfSü\93n
+Ð
+sü\93n
+ );
+
+235 \12
+ gsü\93nHeight
+ =
+HeightOfSü\93n
+Ð
+sü\93n
+ );
+
+236 \12
+ gxC\92\8br
+ =
+sü\93nWidth
+ / 2;
+
+237 \12
+ gyC\92\8br
+ =
+sü\93nHeight
+ / 2;
+
+239
+ g_width
+ = (
+sü\93nWidth
+ * 4) / 5;
+
+240
+ g_height
+ =
+sü\93nHeight
+ / 14;
+
+242
+XMoveResizeW\9adow
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+xC\92\8br
+ - (
+_width
+ / 2),
+yC\92\8br
+ - (
+_height
+ / 2), _width, _height );
+
+245 \1e
+´oûssEv\92ts
+()
+
+247
+»d¿w
+();
+
+249
+XEv\92t
+
+ gev\92t
+;
+
+250 \1f
+XCheckMaskEv\92t
+Ð
+_di¥Ïy
+,
+_ev\92tMask
+, &
+ev\92t
+ ) )
+
+251
+»d¿w
+();
+
+254 \1e
+£tW\9adowName
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+256 \1d
+ gËngth
+ =
+¡¾\92
+Ð
+_´og¿mName
+ ) + s\8cËnÐ
+su\99eName
+ ) + s\8cËnÐ
+\8b¡Name
+ ) + \17( " - ::()" );
+
+257 \ 5*
+ gÇme
+ = (\ 5*)
+m®loc
+Ð
+Ëngth
+ );
+
+258
+¥r\9atf
+Ð
+Çme
+, "% - %s::%s()",
+_´og¿mName
+,
+su\99eName
+,
+\8b¡Name
+ );
+
+259
+XS\91S\8fnd¬dPrÝ\94t\9bs
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+Çme
+, 0, 0, 0, 0, 0 );
+
+260
+ä\93
+Ð
+Çme
+ );
+
+263 \1e
+»d¿w
+()
+
+265
+g\91W\9adowSize
+();
+
+266
+d¿wSÞidB¬
+();
+
+267
+d¿wDivid\94s
+();
+
+268
+d¿wP\94ûÁage
+();
+
+269
+æush
+();
+
+272 \1e
+g\91W\9adowSize
+()
+
+274
+XW\9adowA\89ribu\8bs
+
+ g©\8cibu\8bs
+;
+
+275
+XG\91W\9adowA\89ribu\8bs
+Ð
+_di¥Ïy
+,
+_w\9adow
+, &
+©\8cibu\8bs
+ );
+
+276
+ g_width
+ =
+©\8cibu\8bs
+.
+width
+;
+
+277
+ g_height
+ =
+©\8cibu\8bs
+.
+height
+;
+
+280 \1e
+d¿wSÞidB¬
+()
+
+282 \1d
+ gb¬Width
+ = (
+_width
+ *
+_\8b¡sDÚe
+è/
+_numTÙ®Te¡s
+;
+
+284
+XS\91FÜeground
+Ð
+_di¥Ïy
+,
+_gc
+,
+_b¬CÞÜ
+ );
+
+285
+XF\9elReùªgË
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+_gc
+, 0, 0,
+b¬Width
+,
+_height
+ );
+
+287
+XS\91FÜeground
+Ð
+_di¥Ïy
+,
+_gc
+,
+_background
+ );
+
+288
+XF\9elReùªgË
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+_gc
+,
+b¬Width
+, 0,
+_width
+ + 1 - b¬Width,
+_height
+ );
+
+291 \1e
+d¿wDivid\94s
+()
+
+293 if(
+ g_width
+ /
+ g_numTÙ®Te¡s
+ < 5)
+
+295 \ f \1d
+ gi
+ = 1; i <
+ g_\8b¡sDÚe
+; ++ i ) {
+
+296 \12
+ gx
+ = (
+_width
+ *
+i
+è/
+_numTÙ®Te¡s
+;
+
+297
+XD¿wL\9ae
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+_gc
+,
+x
+, 0, x,
+_height
+);
+
+301 \1e
+d¿wP\94ûÁage
+()
+
+303
+XS\91FÜeground
+Ð
+_di¥Ïy
+,
+_gc
+,
+_fÜeground
+ );
+
+305 \ 5
+ g¡r
+[\17("1000000000 oà"è+ \17(
+_¡rTÙ®Te¡s
+) + \17(" (100%)")];
+
+306
+¥r\9atf
+Ð
+¡r
+, "%u oà% (%u%%)",
+_\8b¡sDÚe
+,
+_¡rTÙ®Te¡s
+, (_\8b¡sDÚ\90* 100è/
+_numTÙ®Te¡s
+ );
+
+307 \1d
+ gËn
+ =
+¡¾\92
+Ð
+¡r
+ );
+
+309 \12
+ g\8bxtWidth
+ =
+XTextWidth
+Ð
+_fÚtInfo
+,
+¡r
+,
+Ën
+ );
+
+311
+XD¿wS\8c\9ag
+Ð
+_di¥Ïy
+,
+_w\9adow
+,
+_gc
+,
+
+312 (
+_width
+ -
+\8bxtWidth
+è/ 2, ((
+_height
+ +
+_\8bxtHeight
+è/ 2è-
+_\8bxtDesûÁ
+,
+
+313
+¡r
+,
+Ën
+ );
+
+316 \1e
+æush
+()
+
+318
+XFlush
+Ð
+_di¥Ïy
+ );
+
+321 \1e
+de¡royGc
+()
+
+323
+XF»eGC
+Ð
+_di¥Ïy
+,
+_gc
+ );
+
+326 \1e
+de¡royW\9adow
+()
+
+328
+XDe¡royW\9adow
+Ð
+_di¥Ïy
+,
+_w\9adow
+ );
+
+331 \1e
+þo£Di¥Ïy
+()
+
+333
+XClo£Di¥Ïy
+Ð
+_di¥Ïy
+ );
+
+ @tools/cxxtest/cxxtest/XUnitPrinter.h
+
+12 #iâdeà
+__CXXTEST__XUNIT_PRINTER_H
+
+
+13 \ 1
+ #__CXXTEST__XUNIT_PRINTER_H
+
+
+ )
+
+19 \ 2
+ ~<cxx\8b¡/T\93Li¡\92\94.h
+>
+
+20 \ 2
+ ~<cxx\8b¡/E¼ÜPr\9a\8br.h
+>
+
+21 \ 2
+ ~<cxx\8b¡/XmlPr\9a\8br.h
+>
+
+23
+Çme¥aû
+
+ gCxxTe¡
+
+
+25 þas
+ cXUn\99Pr\9a\8br
+ :
+public
+
+T\93Li¡\92\94
+
+
+27
+public
+:
+
+29
+XmlPr\9a\8br
+
+xml_´\9a\8br
+;
+
+30
+E¼ÜPr\9a\8br
+
+ g\94rÜ_´\9a\8br
+;
+
+32
+XUn\99Pr\9a\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ = CXXTEST_STD(
+cout
+) )
+
+33 :
+xml_´\9a\8br
+(
+o
+)
+
+35
+£tF\9c¡
+Ð
+\94rÜ_´\9a\8br
+ );
+
+36
+£tSecÚd
+Ð
+xml_´\9a\8br
+ );
+
+39 \12
+run
+()
+
+41
+ gTe¡RuÂ\94
+::
+runAÎTe¡s
+Ð*
+this
+ );
+
+42 \15
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+ @tools/cxxtest/cxxtest/XmlFormatter.h
+
+14 #iâdeà
+__CXXTEST__XMLFORMATTER_H
+
+
+15 \ 1
+ #__CXXTEST__XMLFORMATTER_H
+
+
+ )
+
+26 \ 1
+ #CXXTEST_STACK_TRACE_ESCAPE_AS_XML
+
+
+ )
+
+27 \ 1
+ #CXXTEST_STACK_TRACE_NO_ESCAPE_FILELINE_AFFIXES
+
+
+ )
+
+29 \ 1
+ #CXXTEST_STACK_TRACE_INITIAL_PREFIX
+ "<¡ack-äam\90funùiÚ=\""
+
+ )
+
+30 \ 1
+ #CXXTEST_STACK_TRACE_INITIAL_SUFFIX
+ "\"/>\n"
+
+ )
+
+31 \ 1
+ #CXXTEST_STACK_TRACE_OTHER_PREFIX
+
+CXXTEST_STACK_TRACE_INITIAL_PREFIX
+
+
+ )
+
+32 \ 1
+ #CXXTEST_STACK_TRACE_OTHER_SUFFIX
+
+CXXTEST_STACK_TRACE_INITIAL_SUFFIX
+
+
+ )
+
+33 \ 1
+ #CXXTEST_STACK_TRACE_ELLIDED_MESSAGE
+ ""
+
+ )
+
+34 \ 1
+ #CXXTEST_STACK_TRACE_FILELINE_PREFIX
+ "\"\86oÿtiÚ=\""
+
+ )
+
+35 \ 1
+ #CXXTEST_STACK_TRACE_FILELINE_SUFFIX
+ ""
+
+ )
+
+38 \ 2
+ ~<cxx\8b¡/Te¡RuÂ\94.h
+>
+
+39 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+40 \ 2
+ ~<cxx\8b¡/Te¡T¿ck\94.h
+>
+
+41 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+42 \ 2
+ ~<cxx\8b¡/E¼ÜFÜm©\8br.h
+>
+
+43 \ 2
+ ~<cxx\8b¡/StdH\97d\94s.h
+>
+
+44 \ 2
+ ~<io¡»am
+>
+
+45 \ 2
+ ~<s¡»am
+>
+
+46 \ 2
+ ~<c¡r\9ag
+>
+
+47 \ 2
+ ~<c¡dio
+>
+
+49
+Çme¥aû
+
+ gCxxTe¡
+
+
+51 þas
+ cT\93Ou\8dutS\8c\97ms
+
+
+53
+ g´iv©e
+:
+
+54
+þass
+
+\8bebufãr
+ :
+public
+
+¡d
+::
+basic_¡»ambuf
+<\ 5>
+
+56 \e
+¡d
+::
+ tbasic_¡»ambuf
+<\ 5>
+ t¡»ambuf_t
+;
+
+57
+ gpublic
+:
+
+58
+\8bebufãr
+(
+¡»ambuf_t
+ *
+buf1
+, s\8c\97mbuf_\88*
+buf2
+)
+
+59 :
+bufãr1
+(
+buf1
+),
+bufãr2
+(
+buf2
+)
+
+62
+v\9ctu®
+ \12
+ov\94æow
+(\12
+c
+)
+
+64 ià(
+ gc
+ =ð
+EOF
+)
+
+65 \15 !
+EOF
+;
+
+68 \12cڡ
+ gªs1
+ =
+bufãr1
+->
+¥utc
+(
+c
+);
+
+69 \12cڡ
+ gªs2
+ =
+bufãr2
+->
+¥utc
+(
+c
+);
+
+70 \15
+ gªs1
+ =ð
+EOF
+ ||
+ªs2
+ =ðEOF ? EOF :
+c
+;
+
+74
+v\9ctu®
+ \12
+sync
+()
+
+76 \12
+ gªs1
+ =
+bufãr1
+->
+pubsync
+();
+
+77 \12
+ gªs2
+ =
+bufãr2
+->
+pubsync
+();
+
+78 \15
+ gªs1
+ ||
+ gªs2
+ ? -1 : 0;
+
+81
+¡»ambuf_t
+ *
+ gbufãr1
+;
+
+82
+¡»ambuf_t
+ *
+ gbufãr2
+;
+
+85
+ gpublic
+:
+
+86
+T\93Ou\8dutS\8c\97ms
+(
+¡d
+::
+o¡»am
+&
+_cout
+, std::o¡»am&
+_û¼
+)
+
+87 :
+out
+(),
+
+88
+\94r
+(),
+
+89
+Üig_cout
+(
+_cout
+),
+
+90
+Üig_û¼
+(
+_û¼
+),
+
+91
+\8be_out
+(
+out
+.
+rdbuf
+(),
+_cout
+.rdbuf()),
+
+92
+\8be_\94r
+(
+\94r
+.
+rdbuf
+(),
+_û¼
+.rdbuf())
+
+94
+ gÜig_cout
+.
+rdbuf
+(&
+\8be_out
+);
+
+95
+ gÜig_û¼
+.
+rdbuf
+(&
+\8be_\94r
+);
+
+98 ~
+T\93Ou\8dutS\8c\97ms
+()
+
+100
+ gÜig_cout
+.
+rdbuf
+(
+\8be_out
+.
+bufãr2
+);
+
+101
+ gÜig_û¼
+.
+rdbuf
+(
+\8be_\94r
+.
+bufãr2
+);
+
+104
+ g¡d
+::
+¡r\9ag¡»am
+
+out
+;
+
+105
+ g¡d
+::
+¡r\9ag¡»am
+
+\94r
+;
+
+107
+ g´iv©e
+:
+
+108
+¡d
+::
+o¡»am
+&
+Üig_cout
+;
+
+109
+ g¡d
+::
+o¡»am
+&
+Üig_û¼
+;
+
+110
+\8bebufãr
+
+ g\8be_out
+;
+
+111
+\8bebufãr
+
+ g\8be_\94r
+;
+
+114 þas
+ cEËm\92tInfo
+
+
+116
+ gpublic
+:
+
+117
+¡d
+::
+¡r\9ag
+
+Çme
+;
+
+118
+ g¡d
+::
+¡r\9ag¡»am
+
+v®ue
+;
+
+119
+ g¡d
+::
+m
+<
+¡d
+::
+¡r\9ag
+,¡d::¡r\9ag>
+©\8cibu\8b
+;
+
+121
+EËm\92tInfo
+()
+
+122 :
+Çme
+(),
+v®ue
+(),
+©\8cibu\8b
+()
+
+125
+EËm\92tInfo
+(cÚ¡ EËm\92tInfo&
+rhs
+)
+
+126 :
+Çme
+(
+rhs
+.Çme),
+v®ue
+Ôhs.v®ue.
+¡r
+()),
+©\8cibu\8b
+(rhs.attribute)
+
+129
+ gEËm\92tInfo
+&
+ gÝ\94©Ü
+=(cڡ
+EËm\92tInfo
+&
+rhs
+)
+
+131
+Çme
+ =
+rhs
+.name;
+
+132
+ gv®ue
+.
+¡r
+(
+rhs
+.
+v®ue
+.str());
+
+133
+ g©\8cibu\8b
+ =
+rhs
+.
+©\8cibu\8b
+;
+
+134 \15 *
+ gthis
+;
+
+137
+ g\8bm¶©e
+ <
+þass
+
+ gTy³
+>
+
+138 \1e
+add
+(cڡ
+¡d
+::
+¡r\9ag
+&
+Çme_
+,
+Ty³
+&
+v®ue_
+)
+
+140
+ g¡d
+::
+o¡r\9ag¡»am
+
+os
+;
+
+141
+ gos
+ <<
+ gv®ue_
+;
+
+142
+ g©\8cibu\8b
+[
+Çme_
+] =
+os
+.
+¡r
+();
+
+145 \1e
+wr\99e
+(
+Ou\8dutS\8c\97m
+&
+os
+) {
+
+146
+ gos
+ << " <" <<
+ gÇme
+.
+c_¡r
+() << " ";
+
+147
+ g¡d
+::
+m
+<
+¡d
+::
+¡r\9ag
+,¡d::¡r\9ag>::
+\99\94©Ü
+
+cu¼
+=
+©\8cibu\8b
+.
+beg\9a
+();
+
+148
+ g¡d
+::
+m
+<
+¡d
+::
+¡r\9ag
+,¡d::¡r\9ag>::
+\99\94©Ü
+
+\92d
+ =
+©\8cibu\8b
+.end();
+
+149 \1f
+ gcu¼
+ !ð
+\92d
+) {
+
+150
+os
+ <<
+cu¼
+->
+f\9c¡
+.
+c_¡r
+()
+
+151 << "=\"" <<
+cu¼
+->
+£cÚd
+.
+c_¡r
+() << "\" ";
+
+152
+ gcu¼
+++;
+
+154 ià(
+ gv®ue
+.
+¡r
+().
+em±y
+()) {
+
+155
+ gos
+ << "/>";
+
+158
+ gos
+ << ">" <<
+esÿ³
+(
+v®ue
+.
+¡r
+()).
+c_¡r
+()
+
+159 << "</" <<
+ gÇme
+.
+c_¡r
+() << ">";
+
+161
+ gos
+.
+\92dl
+(
+os
+);
+
+164
+ g¡d
+::
+¡r\9ag
+
+esÿ³
+(cڡ
+¡d
+::¡r\9ag&
+¡r
+)
+
+166
+¡d
+::
+¡r\9ag
+
+escS\8c
+ = "";
+
+167 \ f
+size_t
+
+ gi
+ = 0; i <
+ g¡r
+.
+Ëngth
+(); i++)
+
+169 \1a
+ g¡r
+[
+i
+])
+
+171 \ 4'"':
+escS\8c
+ += """; \ 3;
+
+172 \ 4'\'':
+escS\8c
+ += "'"; \ 3;
+
+173 \ 4'<':
+escS\8c
+ += "<"; \ 3;
+
+174 \ 4'>':
+escS\8c
+ += ">"; \ 3;
+
+175 \ 4'&':
+escS\8c
+ += "&"; \ 3;
+
+176 \a:
+escS\8c
+ +ð
+¡r
+[
+i
+]; \ 3;
+
+179 \15
+ gescS\8c
+;
+
+184 þas
+ cTe¡Ca£Info
+
+
+186
+ gpublic
+:
+
+188
+Te¡Ca£Info
+(è:
+ç\9e
+(
+çl£
+),
+\94rÜ
+(çl£),
+ruÁime
+(0.0) {}
+
+189
+ g¡d
+::
+¡r\9ag
+
+þassName
+;
+
+190
+ g¡d
+::
+¡r\9ag
+
+\8b¡Name
+;
+
+191
+ g¡d
+::
+¡r\9ag
+
+l\9ae
+;
+
+192
+boÞ
+
+ gç\9e
+;
+
+193
+boÞ
+
+ g\94rÜ
+;
+
+194 \b
+ gruÁime
+;
+
+195
+ g¡d
+::
+li¡
+<
+EËm\92tInfo
+>
+\96em\92ts
+;
+
+196 \e
+ g¡d
+::
+ tli¡
+<
+ tEËm\92tInfo
+>::
+ t\99\94©Ü
+
+ t\96em\92t_t
+;
+
+197
+ g¡d
+::
+¡r\9ag
+
+wÜld
+;
+
+199
+\96em\92t_t
+
+add_\96em\92t
+(cڡ
+¡d
+::
+¡r\9ag
+&
+Çme
+)
+
+201
+\96em\92t_t
+
+\96t
+ =
+\96em\92ts
+.
+\9a£¹
+ÓËm\92ts.
+\92d
+(),
+EËm\92tInfo
+());
+
+202
+ g\96t
+->
+ gÇme
+=
+Çme
+;
+
+203 \15
+ g\96t
+;
+
+206
+\96em\92t_t
+
+upd©e_\96em\92t
+(cڡ
+¡d
+::
+¡r\9ag
+&
+Çme
+)
+
+208
+\96em\92t_t
+
+\96t
+ =
+\96em\92ts
+.
+beg\9a
+();
+
+209 \1f
+ g\96t
+ !ð
+\96em\92ts
+.
+\92d
+() )
+
+211 iàÐ
+\96t
+->
+Çme
+ ==\82ame )
+
+212 \15
+\96t
+;
+
+214 \15
+add_\96em\92t
+(
+Çme
+);
+
+217 \1e
+wr\99e
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ )
+
+219
+ go
+ << " <\8b¡ÿ£ cÏs¢ame=\"" <<
+ gþassName
+.
+c_¡r
+()
+
+220 << "\"\82ame=\"" <<
+ g\8b¡Name
+.
+c_¡r
+()
+
+221 << "\"\86\9ae=\"" <<
+ gl\9ae
+.
+c_¡r
+() << "\"";
+
+222
+boÞ
+
+ g\96ts
+=
+çl£
+;
+
+223
+\96em\92t_t
+
+ gcu¼
+ =
+\96em\92ts
+.
+beg\9a
+();
+
+224
+\96em\92t_t
+
+ g\92d
+ =
+\96em\92ts
+.
+\92d
+();
+
+225 \1f
+ gcu¼
+ !ð
+\92d
+) {
+
+226 ià(!
+\96ts
+) {
+
+227
+o
+ << ">";
+
+228
+ go
+.
+\92dl
+(
+o
+);
+
+229
+ g\96ts
+=
+\8cue
+;
+
+231
+ gcu¼
+->
+wr\99e
+(
+o
+);
+
+232
+ gcu¼
+++;
+
+234 ià(
+ g\96ts
+)
+
+235
+ go
+ << " </testcase>";
+
+237
+ go
+ << " />";
+
+238
+ go
+.
+\92dl
+(
+o
+);
+
+243 þas
+ cXmlFÜm©\8br
+ :
+public
+
+Te¡Li¡\92\94
+
+
+245
+public
+:
+
+246
+XmlFÜm©\8br
+Ð
+Ou\8dutS\8c\97m
+ *
+o
+, Ou\8dutS\8c\97m *
+o¡r
+,
+¡d
+::
+o¡r\9ag¡»am
+ *
+os
+)
+
+247 :
+_o
+(
+o
+),
+_o¡r
+(
+o¡r
+),
+_os
+(
+os
+),
+¡»am_»d\9ceù
+(
+NULL
+)
+
+250
+ g¡d
+::
+li¡
+<
+Te¡Ca£Info
+>
+\9afo
+;
+
+251
+ g¡d
+::
+li¡
+<
+Te¡Ca£Info
+>::
+\99\94©Ü
+
+\8b¡ÿ£
+;
+
+252 \e
+ g¡d
+::
+ tli¡
+<
+ tEËm\92tInfo
+>::
+ t\99\94©Ü
+
+ t\96em\92t_t
+;
+
+253
+ g¡d
+::
+¡r\9ag
+
+þas¢ame
+;
+
+254 \12
+ gÁe¡s
+;
+
+255 \12
+ gnç\9e
+;
+
+256 \12
+ güÜ
+;
+
+257 \b
+ gtٮtime
+;
+
+259 \12
+run
+()
+
+261
+ gTe¡RuÂ\94
+::
+runAÎTe¡s
+Ð*
+this
+ );
+
+262 \15
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+265 \1e
+\92\8brWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & )
+
+267
+ gÁe¡s
+=0;
+
+268
+ gnç\9e
+=0;
+
+269
+ güÜ
+=0;
+
+270
+ gtٮtime
+=0;
+
+273 \18\1e
+tÙ®Te¡s
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ )
+
+275 \ 5
+ gs
+[
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+];
+
+276 cڡ
+ gWÜldDesü\9dtiÚ
+ &
+ gwd
+ =
+\8cack\94
+().
+wÜld
+();
+
+277
+ go
+ <<
+ gwd
+.
+¡rTÙ®Te¡s
+Ð
+s
+ )
+
+278 << (
+ gwd
+.
+numTÙ®Te¡s
+() == 1 ? "\81est" : "\81ests");
+
+281 \1e
+\92\8brSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+&
+desc
+ )
+
+283
+ gþas¢ame
+ =
+desc
+.
+su\99eName
+();
+
+285
+size_t
+
+ gpos
+ = 0;
+
+286 \1f (
+ gpos
+ =
+þas¢ame
+.
+f\9ad
+("::",
+pos
+)) !=
+
+287
+CXXTEST_STD
+(
+¡r\9ag
+::
+Åos
+) )
+
+288
+þas¢ame
+.
+»¶aû
+(
+pos
+, 2, ".");
+
+289 \1f !
+ gþas¢ame
+.
+em±y
+() && classname[0] == '.' )
+
+290
+þas¢ame
+.
+\94a£
+(0,1);
+
+301 \1e
+ËaveSu\99e
+ÐcÚ¡
+Su\99eDesü\9dtiÚ
+ & )
+
+303
+ g¡d
+::
+li¡
+<
+Te¡Ca£Info
+>::
+\99\94©Ü
+
+cu¼
+ =
+\9afo
+.
+beg\9a
+();
+
+304
+ g¡d
+::
+li¡
+<
+Te¡Ca£Info
+>::
+\99\94©Ü
+
+\92d
+ =
+\9afo
+.end();
+
+305 \1f
+ gcu¼
+ !ð
+\92d
+) {
+
+306 ià(
+cu¼
+->
+ç\9e
+è
+nç\9e
+++;
+
+307 ià(
+ gcu¼
+->
+ g\94rÜ
+è
+ güÜ
+++;
+
+308
+ gtٮtime
+ +ð
+cu¼
+->
+ruÁime
+;
+
+309
+ gÁe¡s
+++;
+
+310
+ gcu¼
+++;
+
+312
+ gcu¼
+ =
+\9afo
+.
+beg\9a
+();
+
+313
+ g\92d
+ =
+\9afo
+.
+\92d
+();
+
+314 \1f
+ gcu¼
+ !ð
+\92d
+) {
+
+315 (*
+cu¼
+).
+wr\99e
+(*
+_o¡r
+);
+
+316
+ gcu¼
+++;
+
+318
+ g\9afo
+.
+þ\97r
+();
+
+321 \1e
+\92\8brTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ &
+desc
+ )
+
+323
+ g\8b¡ÿ£
+ =
+\9afo
+.
+\9a£¹
+(\9afo.
+\92d
+(),
+Te¡Ca£Info
+());
+
+324
+ g\8b¡ÿ£
+->
+ g\8b¡Name
+ =
+desc
+.
+\8b¡Name
+();
+
+325
+ g\8b¡ÿ£
+->
+ gþassName
+ =
+þas¢ame
+;
+
+326
+ g¡d
+::
+o¡r\9ag¡»am
+
+os
+;
+
+327
+ gos
+ <<
+ gdesc
+.
+l\9ae
+();
+
+328
+ g\8b¡ÿ£
+->
+ gl\9ae
+ =
+os
+.
+¡r
+();
+
+330 iàÐ
+ g¡»am_»d\9ceù
+ )
+
+331
+CXXTEST_STD
+(
+û¼
+) << "ERROR: The stream_redirect != NULL"
+
+332 <<
+CXXTEST_STD
+(
+\92dl
+);
+
+334
+ g¡»am_»d\9ceù
+ =
+
+335
+Ãw
+
+T\93Ou\8dutS\8c\97ms
+(
+CXXTEST_STD
+(
+cout
+), CXXTEST_STD(
+û¼
+));
+
+338 \1e
+ËaveTe¡
+ÐcÚ¡
+Te¡Desü\9dtiÚ
+ & )
+
+340 iàÐ
+ g¡»am_»d\9ceù
+ !ð
+NULL
+ )
+
+342
+¡d
+::
+¡r\9ag
+
+out
+ =
+¡»am_»d\9ceù
+->out.
+¡r
+();
+
+343 iàÐ!
+ gout
+.
+em±y
+() )
+
+346 iàÐ
+ gout
+[0] !ð'.' ||
+out
+.
+size
+() > 1 )
+
+347
+\8b¡ÿ£
+->
+add_\96em\92t
+("sy¡em-out")->
+v®ue
+ <<
+out
+;
+
+349 iàÐ!
+ g¡»am_»d\9ceù
+->
+ g\94r
+.
+¡r
+().
+em±y
+() )
+
+350
+ g\8b¡ÿ£
+->
+add_\96em\92t
+("sy¡em-\94r")->
+ gv®ue
+ <<
+ g¡»am_»d\9ceù
+->
+ g\94r
+.
+¡r
+();
+
+352
+d\96\91e
+
+ g¡»am_»d\9ceù
+;
+
+353
+ g¡»am_»d\9ceù
+ =
+NULL
+;
+
+357 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+&
+desc
+ )
+
+359
+ g¡d
+::
+o¡r\9ag¡»am
+
+os
+;
+
+360
+ gos
+ <<
+ gtٮtime
+;
+
+361 (*
+ g_o
+è<< "<?xmÈv\94siÚ=\"1.0\"\83ncod\9ag=\"UTF-8\" ?>" <<
+ g\92dl
+;
+
+362 (*
+ g_o
+è<< "<\8b¡su\99\90Çme=\"" <<
+ gdesc
+.
+wÜldName
+() << "\" ";
+
+363 (*
+ g_o
+è<< "\81e¡s=\"" <<
+ gÁe¡s
+
+
+364 << "\"\83¼Üs=\"" <<
+ güÜ
+
+
+365 << "\" fa\9eu»s=\"" <<
+ gnç\9e
+
+
+366 << "\"\81ime=\"" <<
+ gos
+.
+¡r
+().
+c_¡r
+() << "\" >";
+
+367
+ g_o
+->
+\92dl
+(*
+_o
+);
+
+368 (*
+ g_o
+è<<
+ g_os
+->
+¡r
+().
+c_¡r
+();
+
+369
+ g_os
+->
+þ\97r
+();
+
+370 (*
+ g_o
+è<< "</\8b¡su\99e>" <<
+ g\92dl
+;
+
+371
+ g_o
+->
+æush
+();
+
+374 \1e
+\8caû
+ÐcÚ¡ \ 5* , \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+376
+\96em\92t_t
+
+ g\96t
+ =
+\8b¡ÿ£
+->
+add_\96em\92t
+("trace");
+
+377
+ g\96t
+->
+add
+("l\9ae",
+l\9ae
+);
+
+378
+ g\96t
+->
+ gv®ue
+ <<
+ gex´essiÚ
+;
+
+381 \1e
+w¬n\9ag
+ÐcÚ¡ \ 5* , \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+383
+\96em\92t_t
+
+ g\96t
+ =
+\8b¡ÿ£
+->
+add_\96em\92t
+("warning");
+
+384
+ g\96t
+->
+add
+("l\9ae",
+l\9ae
+);
+
+385
+ g\96t
+->
+ gv®ue
+ <<
+ gex´essiÚ
+;
+
+388 \1e
+ç\9eedTe¡
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+390
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "ç\9eu»"è<< "Te¡ fa\9eed: " <<
+ gex´essiÚ
+;
+
+393 \1e
+ç\9eedAs£¹
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+395
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssert" )
+
+396 << "As£¹iÚ fa\9eed: " <<
+ gex´essiÚ
+;
+
+399 \1e
+ç\9eedAs£¹Equ®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+400 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+401 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+403
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertEquals" )
+
+405 <<
+ gxS\8c
+ << " =ð" <<
+ gyS\8c
+ << "), found ("
+
+406 <<
+ gx
+ << " !ð" <<
+ gy
+ << ")";
+
+409 \1e
+ç\9eedAs£¹SameD©a
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+410 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+sizeS\8c
+,
+
+411 cڡ \1e* , cڡ \1e* , \1d
+size
+ )
+
+413
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertSameData")
+
+414 << "E¼Ü: Ex³ùed " <<
+ gsizeS\8c
+
+
+415 << " (" <<
+ gsize
+ << ") bytes\81o be\83qual\87t ("
+
+416 <<
+ gxS\8c
+ << "èªd (" <<
+ gyS\8c
+ << "), found";
+
+419 \1e
+ç\9eedAs£¹SameF\9ees
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+421 cڡ \ 5*
+ex¶ª©iÚ
+
+
+424
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertSameFiles" )
+
+425 << "E¼Ü: " <<
+ gex¶ª©iÚ
+;
+
+428 \1e
+ç\9eedAs£¹D\96\8f
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+429 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+, cڡ \ 5*
+dS\8c
+,
+
+430 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+, cڡ \ 5*
+d
+ )
+
+432
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertDelta" )
+
+434 <<
+ gxS\8c
+ << " =ð" <<
+ gyS\8c
+ << "èu°tØ" <<
+ gdS\8c
+
+
+435 << " (" <<
+ gd
+ << "), found ("
+
+436 <<
+ gx
+ << " !ð" <<
+ gy
+ << ")";
+
+439 \1e
+ç\9eedAs£¹Difãrs
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+440 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+441 cڡ \ 5*
+v®ue
+ )
+
+443
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertDiffers" )
+
+445 <<
+ gxS\8c
+ << " !ð" <<
+ gyS\8c
+ << "), found ("
+
+446 <<
+ gv®ue
+ << ")";
+
+449 \1e
+ç\9eedAs£¹LessThª
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+450 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+451 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+453
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertLessThan" )
+
+455
+ gxS\8c
+ << " < " <<
+ gyS\8c
+ << "), found (" <<
+
+456
+ gx
+ << " >ð" <<
+ gy
+ << ")";
+
+459 \1e
+ç\9eedAs£¹LessThªEqu®s
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+460 cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+461 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+463
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertLessThanEquals" )
+
+465
+ gxS\8c
+ << " <ð" <<
+ gyS\8c
+ << "), found (" <<
+
+466
+ gx
+ << " > " <<
+ gy
+ << ")";
+
+469 \1e
+ç\9eedAs£¹R\96©iÚ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+470 cڡ \ 5*
+»ÏtiÚ
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+yS\8c
+,
+
+471 cڡ \ 5*
+x
+, cڡ \ 5*
+y
+ )
+
+473
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertRelation" )
+
+474 << "E¼Ü: Ex³ùed " <<
+ g»ÏtiÚ
+ << "( " <<
+
+475
+ gxS\8c
+ << ", " <<
+ gyS\8c
+ << " ), found !" <<
+ g»ÏtiÚ
+
+
+476 << "Ð" <<
+ gx
+ << ", " <<
+ gy
+ << " )";
+
+479 \1e
+ç\9eedAs£¹P»diÿ\8b
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+480 cڡ \ 5*
+´ediÿ\8b
+, cڡ \ 5*
+xS\8c
+, cڡ \ 5*
+x
+ )
+
+482
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertPredicate" )
+
+483 << "E¼Ü: Ex³ùed " <<
+ g´ediÿ\8b
+ << "( " <<
+
+484
+ gxS\8c
+ << " ), found !" <<
+ g´ediÿ\8b
+ << "Ð" <<
+ gx
+ << " )";
+
+487 \1e
+ç\9eedAs£¹Throws
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+,
+
+488 cڡ \ 5*
+ex´essiÚ
+, cڡ \ 5*
+ty³
+,
+
+489
+boÞ
+
+Ùh\94Thrown
+ )
+
+491
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertThrows" )
+
+492 << "E¼Ü: Ex³ùed (" <<
+ gex´essiÚ
+ << ")\81o\81hrow (" <<
+
+493
+ gty³
+ << ") but it "
+
+494 << (
+ gÙh\94Thrown
+ ? "threw something\83lse" : "didn't\81hrow");
+
+497 \1e
+ç\9eedAs£¹ThrowsNÙ
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ex´essiÚ
+ )
+
+499
+\8b¡Fa\9eu»
+Ð
+f\9ee
+,
+l\9ae
+, "failedAssertThrowsNot" )
+
+500 << "E¼Ü: Ex³ùed (" <<
+ gex´essiÚ
+
+
+504
+ g´Ùeùed
+:
+
+506
+Ou\8dutS\8c\97m
+ *
+ou\8dutS\8c\97m
+() const
+
+508 \15
+_o
+;
+
+511
+Ou\8dutS\8c\97m
+ *
+ou\8dutF\9eeS\8c\97m
+() const
+
+513 \15
+ g_o¡r
+;
+
+516
+ g´iv©e
+:
+
+517
+XmlFÜm©\8br
+( const XmlFormatter & );
+
+518
+ gXmlFÜm©\8br
+ &
+ gÝ\94©Ü
+=ÐcÚ¡
+XmlFÜm©\8br
+ & );
+
+520
+ g¡d
+::
+¡r\9ag¡»am
+&
+\8b¡Fa\9eu»
+ÐcÚ¡ \ 5*
+f\9ee
+, \12
+l\9ae
+, cڡ \ 5*
+ç\9eu»Ty³
+)
+
+522
+ g\8b¡ÿ£
+->
+ gç\9e
+=
+\8cue
+;
+
+523
+\96em\92t_t
+
+ g\96t
+ =
+\8b¡ÿ£
+->
+upd©e_\96em\92t
+("failure");
+
+524 iàÐ
+ g\96t
+->
+ gv®ue
+.
+¡r
+().
+em±y
+() )
+
+526
+ g\96t
+->
+add
+("ty³",
+ç\9eu»Ty³
+);
+
+527
+ g\96t
+->
+add
+("l\9ae",
+l\9ae
+);
+
+528
+ g\96t
+->
+add
+("f\9ee",
+f\9ee
+);
+
+531
+ g\96t
+->
+ gv®ue
+ <<
+CXXTEST_STD
+(
+\92dl
+);
+
+532 \15
+ g\96t
+->
+ gv®ue
+;
+
+537 \1e
+©\8cibu\8bB\9a¬y
+ÐcÚ¡ \ 5*
+Çme
+, cڡ \1e*
+v®ue
+, \1d
+size
+ )
+
+539 (*
+ g_o
+è<<
+ gÇme
+;
+
+540 (*
+ g_o
+) << "=\"";
+
+541
+dump
+(
+v®ue
+,
+size
+);
+
+542 (*
+ g_o
+) << "\" ";
+
+545 \1e
+dump
+ÐcÚ¡ \1e*
+bufãr
+, \1d
+size
+ )
+
+547 ià(!
+ gbufãr
+) \15;
+
+549 \1d
+ gdumpSize
+ =
+size
+;
+
+550 iàÐ
+maxDumpSize
+(è&&
+ gdumpSize
+ > maxDumpSize() )
+
+551
+ gdumpSize
+ =
+maxDumpSize
+();
+
+553 cڡ \1d\ 5*
+ gp
+ = (cڡ \1d\ 5*)
+bufãr
+;
+
+554 \ f \1d
+ gi
+ = 0; i <
+ gdumpSize
+; ++ i )
+
+555 (*
+ g_o
+è<<
+by\8bToHex
+Ð*
+p
+++ ) << " ";
+
+556 iàÐ
+ gdumpSize
+ <
+ gsize
+ )
+
+557 (*
+ g_o
+) << "... ";
+
+561 \18\1e
+\92dl
+Ð
+Ou\8dutS\8c\97m
+ &
+o
+ )
+
+563
+ gOu\8dutS\8c\97m
+::
+\92dl
+Ð
+o
+ );
+
+566
+Ou\8dutS\8c\97m
+ *
+ g_o
+;
+
+567
+Ou\8dutS\8c\97m
+ *
+ g_o¡r
+;
+
+568
+ g¡d
+::
+o¡r\9ag¡»am
+ *
+_os
+;
+
+570
+T\93Ou\8dutS\8c\97ms
+ *
+ g¡»am_»d\9ceù
+;
+
+ @tools/cxxtest/cxxtest/XmlPrinter.h
+
+12 #iâdeà
+__cxx\8b¡__XmlPr\9a\8br_h__
+
+
+13 \ 1
+ #__cxx\8b¡__XmlPr\9a\8br_h__
+
+
+ )
+
+21 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+23 #iâdeà
+_CXXTEST_HAVE_STD
+
+
+24 \ 1
+ #_CXXTEST_HAVE_STD
+
+
+ )
+
+27 \ 2
+ ~<cxx\8b¡/XmlFÜm©\8br.h
+>
+
+28 \ 2
+ ~<cxx\8b¡/StdV®ueT¿\99s.h
+>
+
+30 \ 2
+ ~<s¡»am
+>
+
+31 #ifdeà
+_CXXTEST_OLD_STD
+
+
+32 \ 2
+ ~<io¡»am.h
+>
+
+34 \ 2
+ ~<io¡»am
+>
+
+37
+Çme¥aû
+
+ gCxxTe¡
+
+
+39 þas
+ cXmlPr\9a\8br
+ :
+public
+
+XmlFÜm©\8br
+
+
+41
+public
+:
+
+42
+XmlPr\9a\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ = CXXTEST_STD(
+cout
+), const \ 5* = ":", const \ 5* = "" ) :
+
+43
+XmlFÜm©\8br
+Ð
+Ãw
+
+Ad\8br
+(
+o
+),\82ew Ad\8br(
+o¡r
+), &ostr ) {}
+
+45
+ gv\9ctu®
+ ~
+XmlPr\9a\8br
+()
+
+47
+d\96\91e
+
+ou\8dutS\8c\97m
+();
+
+48
+d\96\91e
+
+ou\8dutF\9eeS\8c\97m
+();
+
+51
+ g´iv©e
+:
+
+53
+¡d
+::
+o¡r\9ag¡»am
+
+o¡r
+;
+
+55 þas
+ cAd\8br
+ :
+public
+
+Ou\8dutS\8c\97m
+
+
+57
+CXXTEST_STD
+(
+o¡»am
+è&
+_o
+;
+
+58
+ gpublic
+:
+
+59
+Ad\8br
+Ð
+CXXTEST_STD
+(
+o¡»am
+è&
+o
+ ) :
+_o
+(o) {}
+
+60 \1e
+æush
+(è{
+_o
+.flush(); }
+
+61
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<ÐcÚ¡ \ 5*
+ gs
+ ) {
+ g_o
+ << s; \15 *
+ gthis
+; }
+
+62
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð
+Mª\9duÏtÜ
+
+ gm
+ ) { \15 Ou\8dutS\8c\97m::
+Ý\94©Ü
+<<Ð
+m
+ ); }
+
+63
+ gOu\8dutS\8c\97m
+ &
+ gÝ\94©Ü
+<<Ð\1d
+ gi
+ )
+
+65 \ 5
+ gs
+[1 + 3 * \17(\1d)];
+
+66
+numb\94ToS\8c\9ag
+Ð
+i
+,
+s
+ );
+
+67
+ g_o
+ <<
+ gs
+;
+
+68 \15 *
+ gthis
+;
+
+ @tools/cxxtest/cxxtest/YesNoRunner.h
+
+12 #iâdeà
+__cxx\8b¡__YesNoRuÂ\94_h__
+
+
+13 \ 1
+ #__cxx\8b¡__YesNoRuÂ\94_h__
+
+
+ )
+
+20 \ 2
+ ~<cxx\8b¡/Te¡RuÂ\94.h
+>
+
+21 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+23
+Çme¥aû
+
+ gCxxTe¡
+
+
+25 þas
+ cYesNoRu\94
+ :
+public
+
+Te¡Li¡\92\94
+
+
+27
+public
+:
+
+28
+YesNoRu\94
+()
+
+32 \12
+run
+()
+
+34
+Te¡RuÂ\94
+::
+runAÎTe¡s
+Ð*
+this
+ );
+
+35 \15
+\8cack\94
+().
+ç\9eedTe¡s
+();
+
+ @tools/cxxtest/doc/examples/Assertions.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+9 \1e
+ $\8b¡_as£¹
+(\1e)
+
+11
+ `TS_ASSERT
+(1 + 1 > 1);
+
+16 \1e
+ $\8b¡_as£¹_d\96\8f
+(\1e)
+
+18
+ `TS_ASSERT_DELTA
+(
+ `sq¹
+(4.0), 2.0, 1e-7);
+
+19
+ }
+}
+
+23 \1e
+ $\8b¡_as£¹_difãrs
+(\1e)
+
+25
+ `TS_ASSERT_DIFFERS
+(1, 2);
+
+26
+ }
+}
+
+30 \1e
+ $\8b¡_as£¹_equ®s
+(\1e)
+
+32
+ `TS_ASSERT_EQUALS
+(21 % 5, 1);
+
+33
+ }
+}
+
+37 \1e
+ $\8b¡_as£¹_Ëss_thª
+(\1e)
+
+39
+ `TS_ASSERT_LESS_THAN
+(0, 1);
+
+40
+ }
+}
+
+44 \1e
+ $\8b¡_as£¹_Ëss_thª_equ®s
+(\1e)
+
+46
+ `TS_ASSERT_LESS_THAN_EQUALS
+(0, 0);
+
+47
+ }
+}
+
+51 þas
+ cIsOdd
+
+
+53
+ gpublic
+:
+
+54
+boÞ
+
+Ý\94©Ü
+()(\12
+x
+) const { \15 x % 2 == 1; }
+
+57 \1e
+ $\8b¡_as£¹_´ediÿ\8b
+(\1e)
+
+59
+ `TS_ASSERT_PREDICATE
+(
+IsOdd
+, 29);
+
+60
+ }
+}
+
+64 \1e
+ $\8b¡_as£¹_»ÏtiÚ
+(\1e)
+
+66
+ `TS_ASSERT_RELATION
+(
+¡d
+::
+g»©\94
+<\b>, 1e6, 1000.0);
+
+67
+ }
+}
+
+71 \1e
+ $\8b¡_as£¹_§me_d©a
+(\1e)
+
+73 \ 5
+\9aput
+ = "The quick brown fox\84an over\81he\86azy dog";
+
+74 \ 5
+ou\8dut
+[26];
+
+75
+ `memcÝy
+(
+ou\8dut
+,
+\9aput
+, 26);
+
+76
+ `TS_ASSERT_SAME_DATA
+(
+\9aput
+,
+ou\8dut
+, 26);
+
+77
+ }
+}
+
+81 \1e
+ $throws_ruÁime_\94rÜ
+(\1e)
+
+83
+¿i£
+
+¡d
+::
+ruÁime_\94rÜ
+, "This method simply generates\87n\83xception";
+
+84
+ }
+}
+
+86 \1e
+ $\8b¡_as£¹_throws
+(\1e)
+
+88
+ `TS_ASSERT_THROWS
+(
+£lf
+.
+ `throws_ruÁime_\94rÜ
+(),
+¡d
+::
+ruÁime_\94rÜ
+);
+
+89
+ }
+}
+
+93 \1e
+ $\8b¡_as£¹_throws_ªyth\9ag
+(\1e)
+
+95
+ `TS_ASSERT_THROWS_ANYTHING
+(
+£lf
+.
+ `throws_ruÁime_\94rÜ
+());
+
+96
+ }
+}
+
+100 \1e
+ $throws_v®ue
+(\1e)
+
+102
+¿i£
+ 1;
+
+103
+ }
+}
+
+105 \1e
+ $\8b¡_as£¹_throws_as£¹
+(\1e)
+
+107
+ `TS_ASSERT_THROWS_ASSERT
+(
+£lf
+.
+ `throws_v®ue
+(), cڡ
+E¼Ü
+ &
+e
+,
+ `TS_ASSERT_EQUALS
+(e, 1));
+
+108
+ }
+}
+
+112 \1e
+ $\8b¡_as£¹_throws_equ®s
+(\1e)
+
+114
+ `TS_ASSERT_THROWS_EQUALS
+(
+£lf
+.
+ `throws_v®ue
+(), cڡ
+E¼Ü
+ &
+e
+,\83.
+ `wh©
+(), 1);
+
+115
+ }
+}
+
+119 \1e
+ $throws_nÙh\9ag
+(\1e)
+
+120 {
+ }
+}
+
+122 \1e
+ $\8b¡_as£¹_throws_nÙh\9ag
+(\1e)
+
+124
+ `TS_ASSERT_THROWS_ASSERT
+(
+£lf
+.
+ `throws_nÙh\9ag
+());
+
+125
+ }
+}
+
+129 \1e
+ $\8b¡_ç\9e
+(\1e)
+
+131
+ `TS_FAIL
+("This\81est has failed.");
+
+132
+ }
+}
+
+136 \1e
+ $\8b¡_\8caû
+(\1e)
+
+138
+ `TS_TRACE
+("This is\87\81est\81racing message.");
+
+139
+ }
+}
+
+143 \1e
+ $\8b¡_w¬n
+(\1e)
+
+145
+ `TS_WARN
+("This is\87 warning message.");
+
+146
+ }
+}
+
+ @tools/cxxtest/doc/examples/BadTestSuite1.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cBadTe¡Su\99e1
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+7 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+9
+ `TS_ASSERT
+(1 + 1 > 1);
+
+10
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+13 \1e
+ $\8b¡Sub\8caùiÚ
+(\1e)
+
+15
+ `TS_ASSERT
+(1 - 1 < 1);
+
+16
+ `TS_ASSERT_EQUALS
+(1 - 1, 0);
+
+17
+ }
+}
+
+ @tools/cxxtest/doc/examples/MockTestSuite.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<time_mock.h
+>
+
+5 \12
+g\92\94©eRªdomNumb\94
+();
+
+8 þas
+ cMockObjeù
+ :
+public
+
+T
+::
+Ba£_time
+
+
+10
+public
+:
+
+11
+ $MockObjeù
+(\12
+\9a\99\9fl
+è:
+ $couÁ\94
+(
+\9a\99\9fl
+) {}
+
+12 \12
+couÁ\94
+;
+
+13
+time_t
+
+ $time
+Ð
+time_t
+ * ) { \15
+couÁ\94
+++;
+ }
+}
+
+16 þas
+ cTe¡Rªdom
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+18
+public
+:
+
+19 \1e
+ $\8b¡_g\92\94©eRªdomNumb\94
+()
+
+21
+MockObjeù
+
+ `t
+(1);
+
+22
+ `TS_ASSERT_EQUALS
+Ð
+ `g\92\94©eRªdomNumb\94
+(), 3 );
+
+23
+ `TS_ASSERT_EQUALS
+Ð
+ `g\92\94©eRªdomNumb\94
+(), 6 );
+
+24
+ `TS_ASSERT_EQUALS
+Ð
+ `g\92\94©eRªdomNumb\94
+(), 9 );
+
+26
+ }
+};
+
+ @tools/cxxtest/doc/examples/MyClass.h
+
+3 þas
+ cMyCÏss
+
+
+5
+ mpublic
+:
+
+7 \12
+v®ue
+;
+
+9
+ $MyCÏss
+(\12
+v®ue_
+è:
+ $v®ue
+(
+v®ue_
+) {}
+
+12
+ $MyCÏss
+(cڡ
+MyCÏss
+&
+Ùh\94
+è:
+ $v®ue
+(
+Ùh\94
+.
+v®ue
+è{
+ }
+}
+
+15
+boÞ
+
+Ý\94©Ü
+==(cڡ
+MyCÏss
+&
+Ùh\94
+ècÚ¡ { \15
+v®ue
+ == other.value; }
+
+18
+boÞ
+
+ gÝ\94©Ü
+<(cڡ
+ gMyCÏss
+&
+ gÙh\94
+ècÚ¡ { \15
+ gv®ue
+ < other.value; }
+
+21 #ifdeà
+CXXTEST_RUNNING
+
+
+23 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+24 \ 2
+ ~<¡dio.h
+>
+
+26
+Çme¥aû
+
+ gCxxTe¡
+
+
+28
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+29
+þass
+
+ gV®ueT¿\99s
+<
+ gMyCÏss
+>
+
+31 \ 5
+ g_s
+[256];
+
+33
+ gpublic
+:
+
+34
+V®ueT¿\99s
+ÐcÚ¡
+MyCÏss
+&
+m
+ ) {
+¥r\9atf
+Ð
+_s
+, "MyCÏssÐ%\98)", m.
+v®ue
+ ); }
+
+35 cڡ \ 5*
+asS\8c\9ag
+(ècÚ¡ { \15
+ g_s
+; }
+
+ @tools/cxxtest/doc/examples/MyTestSuite1.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cMyTe¡Su\99e1
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+7 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+9
+ `TS_ASSERT
+(1 + 1 > 1);
+
+10
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+12
+ }
+};
+
+ @tools/cxxtest/doc/examples/MyTestSuite10.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<MyCÏss.h
+>
+
+5 þas
+ cMyTe¡Su\99e10
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+7
+public
+:
+
+8 \1e
+ $\8b¡_Ë
+()
+
+10
+MyCÏss
+
+ `x
+(1),
+ `y
+(2);
+
+11
+ `TS_ASSERT_LESS_THAN
+Ð
+x
+,
+y
+ );
+
+14 \1e
+ $\8b¡_eq
+()
+
+16
+MyCÏss
+
+ `x
+(1),
+ `y
+(2);
+
+17
+ `TS_ASSERT_EQUALS
+Ð
+x
+,
+y
+ );
+
+18
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite11.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<TMyCÏss.h
+>
+
+5 þas
+ cMyTe¡Su\99e11
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+7
+public
+:
+
+8 \1e
+ $\8b¡_Ë
+()
+
+10
+TMyCÏss
+<\12>
+ `x
+(1),
+ `y
+(2);
+
+11
+ `TS_ASSERT_LESS_THAN
+Ð
+x
+,
+y
+ );
+
+14 \1e
+ $\8b¡_eq
+()
+
+16
+TMyCÏss
+<\12>
+ `x
+(1),
+ `y
+(2);
+
+17
+ `TS_ASSERT_EQUALS
+Ð
+x
+,
+y
+ );
+
+18
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite2.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cMyTe¡Su\99e2
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+7 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+9
+ `TS_ASSERT
+(1 + 1 > 1);
+
+10
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+13 \1e
+ $\8b¡MuÉ\9dliÿtiÚ
+(\1e)
+
+15
+ `TS_TRACE
+("Starting multiplication\81est");
+
+16
+ `TS_ASSERT_EQUALS
+(2 * 2, 5);
+
+17
+ `TS_TRACE
+("Finishing multiplication\81est");
+
+18
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite3.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cMyTe¡Su\99e3
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+7 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+9
+ `TS_ASSERT
+(1 + 1 > 1);
+
+10
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+27 \1e
+ $X\8b¡DivisiÚ
+(\1e)
+
+29
+ `TS_ASSERT
+(1 / 1 < 2);
+
+30
+ `TS_ASSERT_EQUALS
+(1 / 1, 1);
+
+31
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite4.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cMyTe¡Su\99e4
+
+
+6
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+8
+public
+:
+
+9 \1e
+ $\8b¡Add\99iÚ
+(\1e)
+
+11
+ `TS_ASSERT
+(1 + 1 > 1);
+
+12
+ `TS_ASSERT_EQUALS
+(1 + 1, 2);
+
+14
+ }
+};
+
+ @tools/cxxtest/doc/examples/MyTestSuite5.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<¡r\9ag.h
+>
+
+5 þas
+ cMyTe¡Su\99e5
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+7 \ 5*
+_bufãr
+;
+
+9
+ mpublic
+:
+
+11 \1e
+ $£tUp
+()
+
+13
+_bufãr
+ =
+Ãw
+ \ 5[1024];
+
+16 \1e
+ $\8b¬Down
+()
+
+18
+d\96\91e
+ []
+_bufãr
+;
+
+19
+ }
+}
+
+21 \1e
+ $\8b¡_¡rýy
+()
+
+23
+ `¡rýy
+(
+_bufãr
+, "Hello, world!");
+
+24
+ `TS_ASSERT_EQUALS
+(
+_bufãr
+[0], 'H');
+
+25
+ `TS_ASSERT_EQUALS
+(
+_bufãr
+[1], 'e');
+
+26
+ }
+}
+
+28 \1e
+ $\8b¡_memýy
+()
+
+30
+ `memýy
+(
+_bufãr
+, "Hello, world!", \17(\ 5));
+
+31
+ `TS_ASSERT_EQUALS
+(
+_bufãr
+[0], 'H');
+
+32
+ `TS_ASSERT_EQUALS
+(
+_bufãr
+[1], 'e');
+
+33
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite6.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 þas
+ cMyTe¡Su\99e6
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+6
+public
+:
+
+8 \18
+MyTe¡Su\99e6
+*
+ $ü\97\8bSu\99e
+()
+
+10 #ifdeà
+_MSC_VER
+
+
+11 \15
+Ãw
+
+ `MyTe¡Su\99e6
+();
+
+17 \18\1e
+ $de¡roySu\99e
+Ð
+MyTe¡Su\99e6
+*
+su\99e
+ )
+
+18 {
+d\96\91e
+
+su\99e
+;
+ }
+}
+
+20 \1e
+ $\8b¡_nÙh\9ag
+()
+
+22
+ `TS_FAIL
+( "Nothing\81o\81est" );
+
+23
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite7.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<io¡»am
+>
+
+5 þas
+ cMyTe¡Su\99e7
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+7
+public
+:
+
+9 \19
+ sD©a
+
+
+11 \ 5
+d©a
+[3];
+
+12
+boÞ
+
+ mÝ\94©Ü
+==(
+D©a
+
+o
+) {
+
+13 \15 (
+memcmp
+(
+this
+, &
+o
+, \17(o)) == 0);
+
+17 \19
+ sD©a2
+
+
+19 \ 5
+ gd©a
+[3];
+
+22 \1e
+ $\8b¡Com·»D©a
+()
+
+24
+D©a
+
+x
+,
+y
+;
+
+25
+ `mem£t
+Ð
+x
+.
+d©a
+, 0x12, \17(x.data) );
+
+26
+ `mem£t
+Ð
+y
+.
+d©a
+, 0xF6, \17(y.data) );
+
+27
+ `TS_ASSERT_EQUALS
+Ð
+x
+,
+y
+ );
+
+29
+D©a2
+
+z
+,
+w
+;
+
+30
+ `mem£t
+Ð
+z
+.
+d©a
+, 0x12, \17(
+x
+.data) );
+
+31
+ `mem£t
+Ð
+w
+.
+d©a
+, 0xF6, \17(
+y
+.data) );
+
+32
+ `TS_ASSERT_SAME_DATA
+Ð&
+z
+, &
+w
+, \17(z) )
+
+33
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite8.h
+
+2 \ 2
+ ~<c¡dio
+>
+
+3 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+9 þas
+ cFixtu»1
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12 \1d
+£tUpCouÁ
+;
+
+13 \1d
+ m\8b¬DownCouÁ
+;
+
+15
+ $Fixtu»1
+(è{
+£tUpCouÁ
+ =
+\8b¬DownCouÁ
+ = 0; }
+
+17
+boÞ
+
+ $£tUp
+(è{ ++
+£tUpCouÁ
+; \15
+\8cue
+;
+ }
+}
+
+18
+boÞ
+
+ $\8b¬Down
+(è{ ++
+\8b¬DownCouÁ
+; \15
+\8cue
+;
+ }
+}
+
+20
+boÞ
+
+ $£tUpWÜld
+(è{
+ `´\9atf
+Ð"S\8f¹\9ag\87\81e¡ su\99e\n" ); \15
+\8cue
+;
+ }
+}
+
+21
+boÞ
+
+ $\8b¬DownWÜld
+(è{
+ `´\9atf
+Ð"F\9aish\9ag\87\81e¡ su\99e\n" ); \15
+\8cue
+;
+ }
+}
+
+23 \18
+Fixtu»1
+
+ gfixtu»1
+;
+
+30 þas
+ cFixtu»2
+ :
+public
+
+Fixtu»1
+
+
+32
+public
+:
+
+33
+boÞ
+
+ $£tUp
+()
+
+35
+ `TS_ASSERT_EQUALS
+(
+£tUpCouÁ
+,
+fixtu»1
+.setUpCount - 1);
+
+36
+ `TS_ASSERT_EQUALS
+(
+\8b¬DownCouÁ
+,
+fixtu»1
+.tearDownCount);
+
+37 \15
+Fixtu»1
+::
+ `£tUp
+();
+
+40
+boÞ
+
+ $\8b¬Down
+()
+
+42
+ `TS_ASSERT_EQUALS
+(
+£tUpCouÁ
+,
+fixtu»1
+.setUpCount);
+
+43
+ `TS_ASSERT_EQUALS
+(
+\8b¬DownCouÁ
+,
+fixtu»1
+.tearDownCount);
+
+44 \15
+Fixtu»1
+::
+ `\8b¬Down
+();
+
+45
+ }
+}
+
+47 \18
+Fixtu»2
+
+ gfixtu»2
+;
+
+53 þas
+ cMyTe¡Su\99e8
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+55
+public
+:
+
+56 \1e
+ $\8b¡CouÁsF\9c¡Time
+()
+
+58
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+£tUpCouÁ
+, 1);
+
+59
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+\8b¬DownCouÁ
+, 0);
+
+60
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+£tUpCouÁ
+, 1);
+
+61
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+\8b¬DownCouÁ
+, 0);
+
+64 \1e
+ $\8b¡CouÁsSecÚdTime
+()
+
+66
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+£tUpCouÁ
+, 2);
+
+67
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+\8b¬DownCouÁ
+, 1);
+
+68
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+£tUpCouÁ
+, 2);
+
+69
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+\8b¬DownCouÁ
+, 1);
+
+70
+ }
+}
+
+ @tools/cxxtest/doc/examples/MyTestSuite9.h
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+4 \f
+ eAnsw\94
+ {
+
+5
+ mYes
+,
+
+6
+ mNo
+,
+
+7
+ mMaybe
+,
+
+8
+ mDÚtKnow
+,
+
+9
+ mDÚtC¬e
+
+
+13
+CXXTEST_ENUM_TRAITS
+Ð
+Answ\94
+,
+
+14
+ $CXXTEST_ENUM_MEMBER
+Ð
+Yes
+ )
+
+15
+ $CXXTEST_ENUM_MEMBER
+Ð
+No
+ )
+
+16
+ $CXXTEST_ENUM_MEMBER
+Ð
+Maybe
+ )
+
+17
+ $CXXTEST_ENUM_MEMBER
+Ð
+DÚtKnow
+ )
+
+18
+ `CXXTEST_ENUM_MEMBER
+Ð
+DÚtC¬e
+ ) );
+
+21 þas
+ cEnumT¿\99s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡_Enum_\8ca\99s
+()
+
+26
+ `TS_FAIL
+Ð
+Yes
+ );
+
+27
+ `TS_FAIL
+Ð
+No
+ );
+
+28
+ `TS_FAIL
+Ð
+Maybe
+ );
+
+29
+ `TS_FAIL
+Ð
+DÚtKnow
+ );
+
+30
+ `TS_FAIL
+Ð
+DÚtC¬e
+ );
+
+31
+ `TS_FAIL
+Ð(
+Answ\94
+)1000 );
+
+33
+ }
+};
+
+ @tools/cxxtest/doc/examples/TMyClass.h
+
+3
+ g\8bm¶©e
+<
+þass
+
+ gT
+>
+
+4 þas
+ cTMyCÏss
+
+
+6
+ mpublic
+:
+
+8
+T
+
+v®ue
+;
+
+10
+ $TMyCÏss
+(cڡ
+T
+&
+v®ue_
+è:
+ $v®ue
+(
+v®ue_
+) {}
+
+13
+ `TMyCÏss
+(cڡ
+TMyCÏss
+<
+T
+>&
+Ùh\94
+è:
+ $v®ue
+(
+Ùh\94
+.
+v®ue
+è{
+ }
+}
+
+16
+boÞ
+
+Ý\94©Ü
+==(cڡ
+TMyCÏss
+<
+T
+>&
+Ùh\94
+ècÚ¡ { \15
+v®ue
+ == other.value; }
+
+19
+boÞ
+
+ gÝ\94©Ü
+<(cڡ
+ gTMyCÏss
+<
+ gT
+>&
+ gÙh\94
+ècÚ¡ { \15
+ gv®ue
+ < other.value; }
+
+22 #ifdeà
+CXXTEST_RUNNING
+
+
+24 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+25 \ 2
+ ~<ty³\9afo
+>
+
+26 \ 2
+ ~<s¡»am
+>
+
+28
+Çme¥aû
+
+ gCxxTe¡
+
+
+30
+ g\8bm¶©e
+ <
+þass
+
+ gT
+>
+
+31
+þass
+
+ gV®ueT¿\99s
+<
+ gTMyCÏss
+<
+ gT
+> >
+
+33
+ gpublic
+:
+
+34
+¡d
+::
+o¡r\9ag¡»am
+
+_s
+;
+
+36
+V®ueT¿\99s
+ÐcÚ¡
+TMyCÏss
+<
+T
+>&
+t
+ ) {
+ g_s
+ <<
+ty³id
+Ñ).
+Çme
+(è<< "Ð" <<
+ gt
+.
+ gv®ue
+ << " )"; }
+
+38
+V®ueT¿\99s
+ÐcÚ¡ V®ueT¿\99s<
+TMyCÏss
+<
+T
+> >&
+v®ue
+ ) {
+ g_s
+ <<
+ gv®ue
+._s.
+rdbuf
+(); }
+
+40 cڡ \ 5*
+asS\8c\9ag
+(ècÚ¡ { \15
+ g_s
+.
+¡r
+().
+c_¡r
+(); }
+
+ @tools/cxxtest/doc/examples/rand_example.cpp
+
+2 \ 2
+ ~<time_mock.h
+>
+
+4 \12
+ $g\92\94©eRªdomNumb\94
+()
+
+6 \15
+T
+::
+ `time
+Ð
+NULL
+ ) * 3;
+
+7
+ }
+}
+
+ @tools/cxxtest/doc/examples/time_mock.cpp
+
+2 \ 1
+ #CXXTEST_MOCK_TEST_SOURCE_FILE
+
+
+ )
+
+3 \ 2
+ ~<time_mock.h
+>
+
+ @tools/cxxtest/doc/examples/time_mock.h
+
+2 \ 2
+ ~<time.h
+>
+
+3 \ 2
+ ~<cxx\8b¡/Mock.h
+>
+
+5
+CXXTEST_MOCK_GLOBAL
+Ð
+time_t
+,
+
+6
+time
+,
+
+7 Ð
+time_t
+ *
+t
+ ),
+
+8 Ð
+t
+ ) );
+
+ @tools/cxxtest/doc/examples/time_real.cpp
+
+2 \ 1
+ #CXXTEST_MOCK_REAL_SOURCE_FILE
+
+
+ )
+
+3 \ 2
+ ~<time_mock.h
+>
+
+ @tools/cxxtest/sample/CreatedTest.h
+
+1 #iâdeà
+__CREATEDTEST_H
+
+
+2 \ 1
+ #__CREATEDTEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+5 \ 2
+ ~<¡r\9ag.h
+>
+
+6 \ 2
+ ~<memÜy.h
+>
+
+14 þas
+ cC»©edTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+16 \ 5*
+_bufãr
+;
+
+17
+ mpublic
+:
+
+18
+ $C»©edTe¡
+Ð\1d
+size
+ ) :
+ $_bufãr
+Ð
+Ãw
+ \ 5[
+size
+] ) {}
+
+19
+v\9ctu®
+ ~
+ $C»©edTe¡
+(è{
+d\96\91e
+ []
+_bufãr
+;
+ }
+}
+
+21 \18
+C»©edTe¡
+ *
+ $ü\97\8bSu\99e
+(è{ \15
+Ãw
+
+ `C»©edTe¡
+Ð16 );
+ }
+}
+
+22 \18\1e
+ $de¡roySu\99e
+Ð
+C»©edTe¡
+ *
+su\99e
+ ) {
+d\96\91e
+ su\99e;
+ }
+}
+
+24 \1e
+ $\8b¡_nÙh\9ag
+()
+
+26
+ `TS_FAIL
+( "Nothing\81o\81est" );
+
+27
+ }
+}
+
+ @tools/cxxtest/sample/DeltaTest.h
+
+1 #iâdeà
+__DELTATEST_H
+
+
+2 \ 1
+ #__DELTATEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+5 \ 2
+ ~<m©h.h
+>
+
+7 þas
+ cD\96\8fTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9 \b
+_pi
+,
+ m_d\96\8f
+;
+
+11
+ mpublic
+:
+
+12 \1e
+ $£tUp
+()
+
+14
+_pi
+ = 3.1415926535;
+
+15
+_d\96\8f
+ = 0.0001;
+
+18 \1e
+ $\8b¡S\9ae
+()
+
+20
+ `TS_ASSERT_DELTA
+Ð
+ `s\9a
+(0.0), 0.0,
+_d\96\8f
+ );
+
+21
+ `TS_ASSERT_DELTA
+Ð
+ `s\9a
+(
+_pi
+ / 6), 0.5,
+_d\96\8f
+ );
+
+22
+ `TS_ASSERT_DELTA
+Ð
+ `s\9a
+(
+_pi
+ / 2), 1.0,
+_d\96\8f
+ );
+
+23
+ `TS_ASSERT_DELTA
+Ð
+ `s\9a
+(
+_pi
+), 0.0,
+_d\96\8f
+ );
+
+24
+ }
+}
+
+ @tools/cxxtest/sample/EnumTraits.h
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+9 \f
+ eAnsw\94
+ {
+
+10
+ mYes
+,
+
+11
+ mNo
+,
+
+12
+ mMaybe
+,
+
+13
+ mDÚtKnow
+,
+
+14
+ mDÚtC¬e
+
+
+20
+CXXTEST_ENUM_TRAITS
+Ð
+Answ\94
+,
+
+21
+ $CXXTEST_ENUM_MEMBER
+Ð
+Yes
+ )
+
+22
+ $CXXTEST_ENUM_MEMBER
+Ð
+No
+ )
+
+23
+ $CXXTEST_ENUM_MEMBER
+Ð
+Maybe
+ )
+
+24
+ $CXXTEST_ENUM_MEMBER
+Ð
+DÚtKnow
+ )
+
+25
+ `CXXTEST_ENUM_MEMBER
+Ð
+DÚtC¬e
+ ) );
+
+27 þas
+ cEnumT¿\99s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+29
+public
+:
+
+30 \1e
+ $\8b¡_Enum_\8ca\99s
+()
+
+32
+ `TS_FAIL
+Ð
+Yes
+ );
+
+33
+ `TS_FAIL
+Ð
+No
+ );
+
+34
+ `TS_FAIL
+Ð
+Maybe
+ );
+
+35
+ `TS_FAIL
+Ð
+DÚtKnow
+ );
+
+36
+ `TS_FAIL
+Ð
+DÚtC¬e
+ );
+
+37
+ `TS_FAIL
+Ð(
+Answ\94
+)1000 );
+
+39
+ }
+};
+
+ @tools/cxxtest/sample/ExceptionTest.h
+
+1 #iâdeà
+__EXCEPTIONTEST_H
+
+
+2 \ 1
+ #__EXCEPTIONTEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+10 þas
+ cExû±iÚTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+12
+public
+:
+
+13 \1e
+ $\8b¡As£¹iÚ
+( \1e)
+
+16
+ `TS_ASSERT_THROWS
+Ð
+ `throwThis
+(3), cڡ
+Numb\94
+ & );
+
+18
+ `TS_ASSERT_THROWS_ANYTHING
+Ð
+ `throwThis
+(-30) );
+
+20
+ `TS_ASSERT_THROWS
+Ð
+ `throwThis
+(5), const \ 5* );
+
+22
+ `TS_ASSERT_THROWS_ANYTHING
+Ð
+ `goodFunùiÚ
+(1) );
+
+24
+ `TS_ASSERT_EQUALS
+Ð
+ `throwThis
+(3), 333 );
+
+26
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `throwThis
+(-1) );
+
+28
+\8cy
+ {
+
+29
+ `ETS_ASSERT_EQUALS
+Ð
+ `throwThis
+(3), 333 );
+
+30 }
+ `ÿtch
+ÐcÚ¡
+Numb\94
+ & ) {
+
+31
+ `TS_FAIL
+( "throwThis(3) failed" );
+
+35
+´iv©e
+:
+
+36 \1e
+ $goodFunùiÚ
+( \12)
+
+38
+ }
+}
+
+40 þas
+ cNumb\94
+
+
+42
+public
+:
+
+43
+Numb\94
+( \12) {}
+
+46 \12
+ $throwThis
+Ð\12
+i
+ )
+
+48
+throw
+
+ `Numb\94
+Ð
+i
+ );
+
+49
+ }
+}
+
+ @tools/cxxtest/sample/FixtureTest.h
+
+1 #iâdeà
+__FIXTURETEST_H
+
+
+2 \ 1
+ #__FIXTURETEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+5 \ 2
+ ~<¡r\9ag.h
+>
+
+14 þas
+ cFixtu»Te¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+16 \ 5*
+_bufãr
+;
+
+17
+ mpublic
+:
+
+18 \1e
+ $£tUp
+()
+
+20
+_bufãr
+ =
+Ãw
+ \ 5[1024];
+
+23 \1e
+ $\8b¬Down
+()
+
+25
+d\96\91e
+ []
+_bufãr
+;
+
+26
+ }
+}
+
+28 \1e
+ $\8b¡_¡rýy
+()
+
+30
+ `¡rýy
+Ð
+_bufãr
+, "Hello, world!" );
+
+31
+ `TS_ASSERT_EQUALS
+Ð
+_bufãr
+[0], 'H' );
+
+32
+ `TS_ASSERT_EQUALS
+Ð
+_bufãr
+[1], 'E' );
+
+33
+ }
+}
+
+ @tools/cxxtest/sample/MessageTest.h
+
+1 #iâdeà
+__MESSAGETEST_H
+
+
+2 \ 1
+ #__MESSAGETEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+12 þas
+ cMes§geTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+14
+public
+:
+
+15 \1e
+ $\8b¡V®ues
+()
+
+17
+ `checkV®ue
+( 0, "My hovercraft" );
+
+18
+ `checkV®ue
+( 1, "is full" );
+
+19
+ `checkV®ue
+( 2, "of\83els" );
+
+22 \1e
+ $checkV®ue
+Ð\1d
+v®ue
+, cڡ \ 5*
+mes§ge
+ )
+
+24
+ `TSM_ASSERT
+Ð
+mes§ge
+,
+v®ue
+ != 0 );
+
+25
+ `TSM_ASSERT_EQUALS
+Ð
+mes§ge
+,
+v®ue
+, value * value );
+
+26
+ }
+}
+
+ @tools/cxxtest/sample/SCons/include/stack.h
+
+1 #iâdeà
+STACK_H
+
+
+2 \ 1
+ #STACK_H
+
+
+ )
+
+4 #ifdeà
+__ýlu¥lus
+
+
+8 \e\19
+ s¡ack_t
+ {
+
+9 \12
+size
+;
+
+10 \12*
+v®s
+;
+
+11 \12
+ÿ·c\99y
+;
+
+12 }
+ t¡ack_t
+;
+
+14
+¡ack_t
+*
+¡ack_ü\97\8b
+();
+
+15 \1e
+¡ack_ä\93
+(
+¡ack_t
+*
+¡ack
+);
+
+16 \12
+¡ack_size
+(
+¡ack_t
+*
+¡ack
+);
+
+17 \1e
+¡ack_push
+(
+¡ack_t
+*
+¡ack
+, \12
+v®
+);
+
+18 \12
+¡ack_pÝ
+(
+¡ack_t
+*
+¡ack
+);
+
+19 \12
+¡ack_³ak
+(
+¡ack_t
+*
+¡ack
+);
+
+20 \12
+¡ack_ÿ·c\99y
+(
+¡ack_t
+*
+¡ack
+);
+
+22 #ifdeà
+__ýlu¥lus
+
+
+ @tools/cxxtest/sample/SCons/src/stack.c
+
+1 \ 2
+ ~<¡ack.h
+>
+
+3 \ 2
+ ~<¡dlib.h
+>
+
+5
+¡ack_t
+*
+ $¡ack_ü\97\8b
+() {
+
+6
+¡ack_t
+*
+»tV®
+ =
+ `m®loc
+(\17(stack_t));
+
+7
+»tV®
+->
+size
+ = 0;
+
+8
+»tV®
+->
+ÿ·c\99y
+ = 10;
+
+9
+»tV®
+->
+v®s
+ =
+ `m®loc
+Ô\91V®->
+ÿ·c\99y
+*\17(\12));
+
+10 \15
+»tV®
+;
+
+11
+ }
+}
+
+13 \1e
+ $¡ack_ä\93
+(
+¡ack_t
+*
+¡ack
+) {
+
+14
+ `ä\93
+(
+¡ack
+->
+v®s
+);
+
+15
+ `ä\93
+(
+¡ack
+);
+
+16
+ }
+}
+
+18 \12
+ $¡ack_size
+(
+¡ack_t
+*
+¡ack
+) {
+
+19 \15
+¡ack
+->
+size
+;
+
+20
+ }
+}
+
+22 \1e
+ $¡ack_push
+(
+¡ack_t
+*
+¡ack
+, \12
+v®
+) {
+
+23 if(
+¡ack
+->
+size
+ =ð¡ack->
+ÿ·c\99y
+) {
+
+24
+¡ack
+->
+ÿ·c\99y
+ *= 2;
+
+25
+¡ack
+->
+v®s
+ =
+ `»®loc
+(¡ack->v®s, s\8fck->
+ÿ·c\99y
+*\17(\12));
+
+27
+¡ack
+->
+v®s
+[¡ack->
+size
+++] =
+v®
+;
+
+28
+ }
+}
+
+30 \12
+ $¡ack_pÝ
+(
+¡ack_t
+*
+¡ack
+) {
+
+31 ià(
+¡ack
+->
+size
+ >= 1)
+
+32 \15
+¡ack
+->
+v®s
+[--¡ack->
+size
+];
+
+35
+ }
+}
+
+37 \12
+ $¡ack_³ak
+(
+¡ack_t
+*
+¡ack
+) {
+
+38 ià(
+¡ack
+->
+size
+ >= 1)
+
+39 \15
+¡ack
+->
+v®s
+[¡ack->
+size
+-1];
+
+42
+ }
+}
+
+44 \12
+ $¡ack_ÿ·c\99y
+(
+¡ack_t
+*
+¡ack
+) {
+
+45 \15
+¡ack
+->
+ÿ·c\99y
+;
+
+46
+ }
+}
+
+ @tools/cxxtest/sample/SCons/tests/stack_test.h
+
+1 #iâdeà
+STACK_TEST_H
+
+
+2 \ 1
+ #STACK_TEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+5 \ 2
+ ~<¡ack.h
+>
+
+7 þas
+ c¡ack_\8b¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+´iv©e
+:
+
+11
+¡ack_t
+*
+¡ack
+;
+
+12
+ mpublic
+:
+
+14 \1e
+ $£tUp
+() {
+
+15
+¡ack
+ =
+ `¡ack_ü\97\8b
+();
+
+18 \1e
+ $\8b¬Down
+() {
+
+19
+ `¡ack_ä\93
+(
+¡ack
+);
+
+20
+ }
+}
+
+22 \1e
+ $\8b¡_ü\97\8b_¡ack
+() {
+
+23
+ `TS_ASSERT_DIFFERS
+((
+¡ack_t
+*)0,
+¡ack
+);
+
+24
+ }
+}
+
+26 \1e
+ $\8b¡_Ãw_¡ack_is_em±y
+() {
+
+27
+ `TS_ASSERT_EQUALS
+(0,
+ `¡ack_size
+(
+¡ack
+));
+
+28
+ }
+}
+
+30 \1e
+ $\8b¡_Úe_push_add_Úe_to_size
+() {
+
+31
+ `¡ack_push
+(
+¡ack
+, 1);
+
+32
+ `TS_ASSERT_EQUALS
+(1,
+ `¡ack_size
+(
+¡ack
+));
+
+33
+ }
+}
+
+35 \1e
+ $\8b¡_push_pÝ_dÛ¢t_chªge_size
+() {
+
+36
+ `¡ack_push
+(
+¡ack
+, 1);
+
+37 (\1e)
+ `¡ack_pÝ
+(
+¡ack
+);
+
+38
+ `TS_ASSERT_EQUALS
+(0,
+ `¡ack_size
+(
+¡ack
+));
+
+39
+ }
+}
+
+41 \1e
+ $\8b¡_³ak_aá\94_push
+() {
+
+42
+ `¡ack_push
+(
+¡ack
+, 1);
+
+43
+ `TS_ASSERT_EQUALS
+(1,
+ `¡ack_³ak
+(
+¡ack
+))
+
+44
+ }
+}
+
+46 \1e
+ $\8b¡_\9a\99\9fl_ÿ·c\99y_is_pos\99ive
+() {
+
+47
+ `TS_ASSERT
+(
+ `¡ack_ÿ·c\99y
+(
+¡ack
+) > 0);
+
+48
+ }
+}
+
+50 \1e
+ $\8b¡_pÝ_Ú_em±y
+() {
+
+51
+ `TS_ASSERT_EQUALS
+(0,
+ `¡ack_pÝ
+(
+¡ack
+));
+
+52
+ `TS_ASSERT_EQUALS
+(0,
+ `¡ack_size
+(
+¡ack
+));
+
+53
+ }
+}
+
+55 \1e
+ $\8b¡_³ak_Ú_em±y
+() {
+
+56
+ `TS_ASSERT_EQUALS
+(0,
+ `¡ack_³ak
+(
+¡ack
+));
+
+57
+ }
+}
+
+59 \1e
+ $\8b¡_ÿ·c\99y_g\8b_size
+() {
+
+60
+ `TS_ASSERT_LESS_THAN_EQUALS
+(
+ `¡ack_size
+(
+¡ack
+),
+ `¡ack_ÿ·c\99y
+(stack));
+
+61 \12
+\9a\99_ÿ·c\99y
+ =
+ `¡ack_ÿ·c\99y
+(
+¡ack
+);
+
+62 \ f\12
+i
+=0; i <
+\9a\99_ÿ·c\99y
+ + 1; i++) {
+
+63
+ `¡ack_push
+(
+¡ack
+,
+i
+);
+
+65
+ `TS_ASSERT_LESS_THAN_EQUALS
+(
+ `¡ack_size
+(
+¡ack
+),
+ `¡ack_ÿ·c\99y
+(stack));
+
+66
+ }
+}
+
+ @tools/cxxtest/sample/SimpleTest.h
+
+1 #iâdeà
+__SIMPLETEST_H
+
+
+2 \ 1
+ #__SIMPLETEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+10 þas
+ cSim¶eTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+12
+public
+:
+
+13 \1e
+ $\8b¡Equ®\99y
+()
+
+15
+ `TS_ASSERT_EQUALS
+( 1, 1 );
+
+16
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+17
+ `TS_ASSERT_EQUALS
+( 'a', 'A' );
+
+18
+ `TS_ASSERT_EQUALS
+( 1.0, -12345678900000000000000000000000000000000000000000.1234 );
+
+21 \1e
+ $\8b¡Add\99iÚ
+()
+
+23
+ `TS_ASSERT_EQUALS
+( 1 + 1, 2 );
+
+24
+ `TS_ASSERT_EQUALS
+( 2 + 2, 5 );
+
+25
+ }
+}
+
+27 \1e
+ $Te¡MuÉ\9dliÿtiÚ
+()
+
+29
+ `TS_ASSERT_EQUALS
+( 2 * 2, 4 );
+
+30
+ `TS_ASSERT_EQUALS
+( 4 * 4, 44 );
+
+31
+ `TS_ASSERT_DIFFERS
+( -2 * -2, 4 );
+
+32
+ }
+}
+
+34 \1e
+ $\8b¡Com·risÚ
+()
+
+36
+ `TS_ASSERT_LESS_THAN
+( (\12)1, (\1d\13)2 );
+
+37
+ `TS_ASSERT_LESS_THAN
+( -1, -2 );
+
+38
+ }
+}
+
+40 \1e
+ $\8b¡TheWÜldIsC¿zy
+()
+
+42
+ `TS_ASSERT_EQUALS
+Ð
+\8cue
+,
+çl£
+ );
+
+43
+ }
+}
+
+45 \1e
+ $\8b¡_Fa\9eu»
+()
+
+47
+ `TS_FAIL
+( "Not implemented" );
+
+48
+ `TS_FAIL
+( 1569779912 );
+
+49
+ }
+}
+
+51 \1e
+ $\8b¡_TS_WARN_maüo
+()
+
+53
+ `TS_WARN
+( "Just\87 friendly warning" );
+
+54
+ `TS_WARN
+( "Warnings don't\87bort\81he\81est" );
+
+55
+ }
+}
+
+ @tools/cxxtest/sample/TraitsTest.h
+
+1 #iâdeà
+__TRAITSTEST_H
+
+
+2 \ 1
+ #__TRAITSTEST_H
+
+
+ )
+
+7 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+8 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+13 \ 2
+ ~<¡dio.h
+>
+
+14 \ 2
+ ~<¡r\9ag.h
+>
+
+16 þas
+ cP\91
+
+
+18 \ 5
+ m_Çme
+[128];
+
+19
+ mpublic
+:
+
+20
+ $P\91
+ÐcÚ¡ \ 5*
+³tName
+ ) {
+ `¡rýy
+Ð
+_Çme
+,\85etName ); }
+
+22 cڡ \ 5*
+ $Çme
+(ècÚ¡ { \15
+_Çme
+;
+ }
+}
+
+24
+boÞ
+
+ gÝ\94©Ü
+=ðÐcÚ¡
+P\91
+ &
+Ùh\94
+ ) const
+
+26 \15 !
+¡rcmp
+Ð
+Çme
+(),
+Ùh\94
+.name() );
+
+35
+Çme¥aû
+
+ gCxxTe¡
+
+
+37
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+38
+þass
+
+ gV®ueT¿\99s
+<cڡ
+ gP\91
+>
+
+40 \ 5
+ g_asS\8c\9ag
+[256];
+
+42
+ gpublic
+:
+
+43
+V®ueT¿\99s
+ÐcÚ¡
+P\91
+ &
+³t
+ ) {
+¥r\9atf
+Ð
+_asS\8c\9ag
+, "P\91(\"%s\")",\85\91.
+Çme
+() ); }
+
+44 cڡ \ 5*
+asS\8c\9ag
+(ècÚ¡ { \15
+ g_asS\8c\9ag
+; }
+
+47
+CXXTEST_COPY_CONST_TRAITS
+Ð
+P\91
+ );
+
+53 þas
+ cTe¡Funky
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+55
+public
+:
+
+56 \1e
+ $\8b¡P\91s
+()
+
+58
+P\91
+
+ `³t1
+("dog"),
+ `³t2
+("cat");
+
+59
+ `TS_ASSERT_EQUALS
+Ð
+³t1
+,
+³t2
+ );
+
+60
+P\91
+
+ `ÿt
+("ÿt"),
+ `g©o
+("cat");
+
+61
+ `TS_ASSERT_DIFFERS
+Ð
+ÿt
+,
+g©o
+ );
+
+62 #ifdeà
+_CXXTEST_HAVE_STD
+
+
+63 \e
+ `CXXTEST_STD
+(
+ t¡r\9ag
+è
+ tS\8c\9ag
+;
+
+64
+ `TS_ASSERT_EQUALS
+Ð
+ `S\8c\9ag
+("Hello"), String("World!") );
+
+67
+ }
+};
+
+ @tools/cxxtest/sample/gui/GreenYellowRed.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 #ifdeà
+_WIN32
+
+
+4 \ 2
+ ~<w\9adows.h
+>
+
+5 \ 1
+ #CXXTEST_SAMPLE_GUI_WAIT
+(è
+ `S˕
+Ð1000 )
+
+ )
+
+7 \r"C" \1d
+¦\93p
+Ð\1d
+£cÚds
+ );
+
+8 \ 1
+ #CXXTEST_SAMPLE_GUI_WAIT
+(è
+ `¦\93p
+Ð1 )
+
+ )
+
+11 þas
+ cG»\92Y\96lowRed
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+13
+public
+:
+
+14 \1e
+ $wa\99
+()
+
+16
+ `CXXTEST_SAMPLE_GUI_WAIT
+();
+
+19 \1e
+ $\8b¡_S\8f¹_g»\92
+()
+
+21
+ `wa\99
+();
+
+22
+ }
+}
+
+24 \1e
+ $\8b¡_G»\92_aga\9a
+()
+
+26
+ `TS_TRACE
+( "Still green" );
+
+27
+ `wa\99
+();
+
+28
+ }
+}
+
+30 \1e
+ $\8b¡_Now_y\96low
+()
+
+32
+ `TS_WARN
+( "Yellow" );
+
+33
+ `wa\99
+();
+
+34
+ }
+}
+
+36 \1e
+ $\8b¡_CªnÙ_go_back
+()
+
+38
+ `wa\99
+();
+
+39
+ }
+}
+
+41 \1e
+ $\8b¡_F\9a®ly_»d
+()
+
+43
+ `TS_FAIL
+( "Red" );
+
+44
+ `wa\99
+();
+
+45
+ }
+}
+
+47 \1e
+ $\8b¡_CªnÙ_go_back_to_y\96low
+()
+
+49
+ `TS_WARN
+( "Yellow?" );
+
+50
+ `wa\99
+();
+
+51
+ }
+}
+
+53 \1e
+ $\8b¡_CªnÙ_go_back_to_g»\92
+()
+
+55
+ `wa\99
+();
+
+56
+ }
+}
+
+ @tools/cxxtest/sample/mock/Dice.cpp
+
+1 \ 2
+ ~<T/¡dlib.h
+>
+
+2 \ 2
+ ~"Diû.h
+"
+
+4
+ gDiû
+::
+ $Diû
+()
+
+6
+T
+::
+ `¤ªd
+ÐT::
+ `time
+( 0 ) );
+
+7
+ }
+}
+
+9 \1d
+ gDiû
+::
+ $rÞl
+()
+
+11 \15 (
+T
+::
+ `¿nd
+() % 6) + 1;
+
+12
+ }
+}
+
+ @tools/cxxtest/sample/mock/Dice.h
+
+1 #iâdeà
+__DICE_H
+
+
+2 \ 1
+ #__DICE_H
+
+
+ )
+
+4 þas
+ cDiû
+
+
+6
+ mpublic
+:
+
+7
+Diû
+();
+
+9 \1d
+rÞl
+();
+
+ @tools/cxxtest/sample/mock/MockStdlib.h
+
+1 \ 2
+ ~<T/¡dlib.h
+>
+
+3
+þass
+
+ gMockStdlib
+ :
+
+4
+public
+
+T
+::
+Ba£_¤ªd
+,
+
+5
+public
+
+ gT
+::
+Ba£_¿nd
+,
+
+6
+public
+
+ gT
+::
+Ba£_time
+
+
+8
+public
+:
+
+9 \1d
+ϡS\93d
+;
+
+11 \1e
+¤ªd
+Ð\1d
+£ed
+ )
+
+13
+ gϡS\93d
+ =
+£ed
+;
+
+16 \12
+ gÃxtRªd
+;
+
+18 \12
+¿nd
+()
+
+20 \15
+ gÃxtRªd
+;
+
+23
+time_t
+
+ gÃxtTime
+;
+
+25
+time_t
+
+time
+Ðtime_\88*
+t
+ )
+
+27 iàÐ
+ gt
+ )
+
+28 *
+ gt
+ =
+ÃxtTime
+;
+
+29 \15
+ gÃxtTime
+;
+
+ @tools/cxxtest/sample/mock/T/stdlib.h
+
+1 #iâdeà
+__T__STDLIB_H
+
+
+2 \ 1
+ #__T__STDLIB_H
+
+
+ )
+
+4 \ 2
+ ~<¡dlib.h
+>
+
+5 \ 2
+ ~<time.h
+>
+
+7 \ 2
+ ~<cxx\8b¡/Mock.h
+>
+
+9
+CXXTEST_MOCK_VOID_GLOBAL
+Ð
+¤ªd
+, ( \1d
+£ed
+ ), ( seed ) );
+
+10
+CXXTEST_MOCK_GLOBAL
+Ð\12,
+¿nd
+, ( \1e), () );
+
+11
+CXXTEST_MOCK_GLOBAL
+Ð
+time_t
+,
+time
+, (\81ime_\88*
+t
+ ), (\81 ) );
+
+ @tools/cxxtest/sample/mock/TestDice.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+2 \ 2
+ ~"Diû.h
+"
+
+3 \ 2
+ ~"MockStdlib.h
+"
+
+5 þas
+ cTe¡Diû
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+7
+public
+:
+
+8
+MockStdlib
+ *
+¡dlib
+;
+
+10 \1e
+ $£tUp
+()
+
+12
+ `TS_ASSERT
+Ð
+¡dlib
+ =
+Ãw
+
+MockStdlib
+ );
+
+15 \1e
+ $\8b¬Down
+()
+
+17
+d\96\91e
+
+¡dlib
+;
+
+18
+ }
+}
+
+20 \1e
+ $\8b¡_Rªdomize_u£s_time
+()
+
+22
+¡dlib
+->
+ÃxtTime
+ = 12345;
+
+23
+Diû
+
+diû
+;
+
+24
+ `TS_ASSERT_EQUALS
+Ð
+¡dlib
+->
+ϡS\93d
+, 12345 );
+
+25
+ }
+}
+
+27 \1e
+ $\8b¡_RÞl
+()
+
+29
+Diû
+
+diû
+;
+
+31
+¡dlib
+->
+ÃxtRªd
+ = 0;
+
+32
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 1 );
+
+34
+¡dlib
+->
+ÃxtRªd
+ = 2;
+
+35
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 3 );
+
+37
+¡dlib
+->
+ÃxtRªd
+ = 5;
+
+38
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 6 );
+
+40
+¡dlib
+->
+ÃxtRªd
+ = 7;
+
+41
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 2 );
+
+42
+ }
+}
+
+44 \1e
+ $\8b¡_Tempܬy_ov\94ride_of_Úe_mock_funùiÚ
+()
+
+46
+Diû
+
+diû
+;
+
+48
+¡dlib
+->
+ÃxtRªd
+ = 2;
+
+49
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 3 );
+
+51 þas
+ cFive
+ :
+public
+
+T
+::
+Ba£_¿nd
+ { \12
+ `¿nd
+() { \15 5; } };
+
+53
+Five
+ *
+five
+ =
+Ãw
+ Five;
+
+54
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 6 );
+
+55
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 6 );
+
+56
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 6 );
+
+57
+d\96\91e
+
+five
+;
+
+59
+¡dlib
+->
+ÃxtRªd
+ = 1;
+
+60
+ `TS_ASSERT_EQUALS
+Ð
+diû
+.
+ `rÞl
+(), 2 );
+
+61
+ }
+}
+
+ @tools/cxxtest/sample/mock/mock_stdlib.cpp
+
+1 \ 1
+ #CXXTEST_MOCK_TEST_SOURCE_FILE
+
+
+ )
+
+2 \ 2
+ ~<T/¡dlib.h
+>
+
+ @tools/cxxtest/sample/mock/real_stdlib.cpp
+
+1 \ 1
+ #CXXTEST_MOCK_REAL_SOURCE_FILE
+
+
+ )
+
+2 \ 2
+ ~<T/¡dlib.h
+>
+
+ @tools/cxxtest/sample/mock/roll.cpp
+
+1 \ 2
+ ~<¡dio.h
+>
+
+2 \ 2
+ ~"Diû.h
+"
+
+4 \12
+ $ma\9a
+()
+
+6
+Diû
+
+diû
+;
+
+7
+ `´\9atf
+Ð"F\9c¡\84Þl: %u\n",
+diû
+.
+ `rÞl
+() );
+
+8
+ `´\9atf
+Ð"SecÚd\84Þl: %u\n",
+diû
+.
+ `rÞl
+() );
+
+11
+ }
+}
+
+ @tools/cxxtest/sample/yes_no_runner.cpp
+
+6 \ 2
+ ~<cxx\8b¡/YesNoRuÂ\94.h
+>
+
+8 \12
+ $ma\9a
+()
+
+10 \15
+CxxTe¡
+::
+ `YesNoRu\94
+().
+ `run
+();
+
+11
+ }
+}
+
+ @tools/cxxtest/test/AborterNoThrow.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+8 þas
+ cAb܋rNoThrow
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+public
+:
+
+11 \1e
+ $\8b¡Fa\9eu»s
+()
+
+13
+ `TS_FAIL
+(1);
+
+14
+ `TS_FAIL
+(2);
+
+15
+ `TS_FAIL
+(3);
+
+16
+ `TS_FAIL
+(4);
+
+17
+ `TS_FAIL
+(5);
+
+19
+ }
+};
+
+ @tools/cxxtest/test/BadTest.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cBadTe¡
+
+
+9
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+11
+public
+:
+
+12 \1e
+ $\8b¡Equ®\99y
+()
+
+14
+ `TS_ASSERT_EQUALS
+( 1, 1 );
+
+15
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+16
+ `TS_ASSERT_EQUALS
+( 'a', 'A' );
+
+17
+ `TS_ASSERT_EQUALS
+( 1.0, -12345678900000000000000000000000000000000000000000.1234 );
+
+20 \1e
+ $\8b¡Add\99iÚ
+()
+
+22
+ `TS_ASSERT_EQUALS
+( 1 + 1, 2 );
+
+23
+ `TS_ASSERT_EQUALS
+( 2 + 2, 5 );
+
+24
+ }
+}
+
+26 \1e
+ $Te¡MuÉ\9dliÿtiÚ
+()
+
+28
+ `TS_ASSERT_EQUALS
+( 2 * 2, 4 );
+
+29
+ `TS_ASSERT_EQUALS
+( 4 * 4, 44 );
+
+30
+ `TS_ASSERT_DIFFERS
+( -2 * -2, 4 );
+
+31
+ }
+}
+
+33 \1e
+ $\8b¡Com·risÚ
+()
+
+35
+ `TS_ASSERT_LESS_THAN
+( (\12)1, (\1d\13)2 );
+
+36
+ `TS_ASSERT_LESS_THAN
+( -1, -2 );
+
+37
+ }
+}
+
+39 \1e
+ $\8b¡TheWÜldIsC¿zy
+()
+
+41
+ `TS_ASSERT_EQUALS
+Ð
+\8cue
+,
+çl£
+ );
+
+42
+ }
+}
+
+44 \1e
+ $\8b¡_Fa\9eu»
+()
+
+46
+ `TS_FAIL
+( "Not implemented" );
+
+47
+ `TS_FAIL
+( 1569779912 );
+
+48
+ }
+}
+
+50 \1e
+ $\8b¡_TS_WARN_maüo
+()
+
+52
+ `TS_WARN
+( "Just\87 friendly warning" );
+
+53
+ `TS_WARN
+( "Warnings don't\87bort\81he\81est" );
+
+54
+ }
+}
+
+ @tools/cxxtest/test/Comments.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cComm\92ts
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡_Som\91h\9ag
+()
+
+12
+ `TS_WARN
+( "Something" );
+
+24
+ }
+};
+
+ @tools/cxxtest/test/Comments2.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cComm\92ts
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡_Som\91h\9ag
+()
+
+12
+ `TS_WARN
+( "Something" );
+
+21
+ }
+};
+
+ @tools/cxxtest/test/CppTemplateTest.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3
+ g\8bm¶©e
+ <
+þass
+
+ gT
+>
+
+4 þas
+ cTe¡s
+
+
+6
+ mpublic
+:
+
+8
+CXXTEST_STD
+(
+li¡
+)<
+T
+>*
+ÿche
+;
+
+10 \1e
+ $£tUp
+()
+
+12
+this
+->
+ÿche
+ =
+Ãw
+
+ `CXXTEST_STD
+(
+li¡
+)<
+T
+>();
+
+15 \1e
+ $\8b¬Down
+()
+
+16 {
+ }
+}
+
+18 \1e
+ $\8b¡_size
+()
+
+20
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 0);
+
+21
+ }
+}
+
+23 \1e
+ $\8b¡_\9a£¹
+()
+
+25
+this
+->
+ÿche
+->
+ `push_back
+(1);
+
+26
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 1);
+
+27
+ }
+}
+
+31
+þass
+
+ gIÁTe¡s
+:
+public
+
+Te¡s
+<\12>,\85ubliø
+ gCxxTe¡
+::
+Te¡Su\99e
+
+
+33
+public
+:
+
+35 \1e
+£tUp
+(è{
+Te¡s
+<\12>::setUp(); }
+
+36 \1e
+\8b¬Down
+(è{
+ gTe¡s
+<\12>::tearDown(); }
+
+ @tools/cxxtest/test/DeepAbort.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cD\93pAbÜt
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡As£¹ThrowsPas£sAbÜt
+()
+
+12
+ `TS_ASSERT_THROWS
+Ð
+ `ç\9e
+(), \12);
+
+13
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+16 \1e
+ $\8b¡Mes§geAs£¹ThrowsPas£sAbÜt
+()
+
+18
+ `TSM_ASSERT_THROWS
+Ð"ç\9e(èshould\81hrow\87À\9at",
+ `ç\9e
+(), \12);
+
+19
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+20
+ }
+}
+
+22 \1e
+ $\8b¡As£¹ThrowsAbÜts
+()
+
+24
+ `TS_ASSERT_THROWS
+Ð
+ `sucûed
+(), \12);
+
+25
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+26
+ }
+}
+
+28 \1e
+ $\8b¡Mes§geAs£¹ThrowsAbÜts
+()
+
+30
+ `TSM_ASSERT_THROWS
+Ð"sucûed(èshould\81hrow\87À\9at",
+ `sucûed
+(), \12);
+
+31
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+32
+ }
+}
+
+34 \1e
+ $\8b¡As£¹ThrowsNÙh\9agPas£sAbÜt
+()
+
+36
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `ç\9e
+() );
+
+37
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+38
+ }
+}
+
+40 \1e
+ $\8b¡Mes§geAs£¹ThrowsNÙh\9agPas£sAbÜt
+()
+
+42
+ `TSM_ASSERT_THROWS_NOTHING
+Ð"ç\9e(èshouldn'\88throw\87nyth\9ag",
+ `ç\9e
+() );
+
+43
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+44
+ }
+}
+
+46 \1e
+ $\8b¡As£¹ThrowsNÙh\9agAbÜts
+()
+
+48
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `throwSom\91h\9ag
+() );
+
+49
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+50
+ }
+}
+
+52 \1e
+ $\8b¡Mes§geAs£¹ThrowsNÙh\9agAbÜts
+()
+
+54
+ `TSM_ASSERT_THROWS_NOTHING
+Ð"ç\9e(èshouldn'\88throw\87nyth\9ag",
+ `throwSom\91h\9ag
+() );
+
+55
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+56
+ }
+}
+
+58 \1e
+ $\8b¡As£¹ThrowsAnyth\9ag
+()
+
+60
+ `TS_ASSERT_THROWS_ANYTHING
+Ð
+ `sucûed
+() );
+
+61
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+62
+ }
+}
+
+64 \1e
+ $\8b¡Mes§geAs£¹ThrowsAnyth\9ag
+()
+
+66
+ `TSM_ASSERT_THROWS_ANYTHING
+Ð"sucûed(èshould\81hrow som\91h\9ag",
+ `sucûed
+() );
+
+67
+ `TS_FAIL
+( "You shouldn't see\81his if --abort-on-fail is used" );
+
+68
+ }
+}
+
+70 \1e
+ $ç\9e
+()
+
+72
+ `TS_ASSERT_EQUALS
+( 0, 1 );
+
+73
+ }
+}
+
+75 \1e
+ $throwSom\91h\9ag
+()
+
+77
+throw
+ "something";
+
+78
+ }
+}
+
+80 \1e
+ $sucûed
+()
+
+82
+ `TS_ASSERT_EQUALS
+( 1, 1 );
+
+83
+ }
+}
+
+ @tools/cxxtest/test/DefaultAbort.h
+
+1 \ 1
+ #CXXTEST_HAVE_EH
+
+
+ )
+
+2 \ 1
+ #CXXTEST_ABORT_TEST_ON_FAIL
+
+
+ )
+
+3 \ 1
+ #CXXTEST_DEFAULT_ABORT
+
+çl£
+
+
+ )
+
+ @tools/cxxtest/test/DefaultTraits.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cDeçuÉT¿\99s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \19
+ sEightBy\8bs
+
+
+12
+EightBy\8bs
+() {}
+
+13 \1d\ 5
+d©a
+[8];
+
+16 \1e
+ $\8b¡Sm®lDeçuÉT¿\99s
+()
+
+18
+EightBy\8bs
+
+x
+;
+
+19 \ f \1d
+i
+ = 0; i < \17(
+x
+.
+d©a
+); ++ i )
+
+20
+x
+.
+d©a
+[
+i
+] = (\1d\ 5)i;
+
+21
+ `TS_FAIL
+Ð
+x
+ );
+
+22
+ }
+}
+
+24 \19
+ sN\9aeBy\8bs
+
+
+26
+N\9aeBy\8bs
+() {}
+
+27 \1d\ 5
+ gd©a
+[9];
+
+30 \1e
+ $\8b¡BigDeçuÉT¿\99s
+()
+
+32
+N\9aeBy\8bs
+
+x
+;
+
+33 \ f \1d
+i
+ = 0; i < \17(
+x
+.
+d©a
+); ++ i )
+
+34
+x
+.
+d©a
+[
+i
+] = (\1d\ 5)(0x98 + i);
+
+35
+ `TS_FAIL
+Ð
+x
+ );
+
+36
+ }
+}
+
+ @tools/cxxtest/test/DoubleCall.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+9 þas
+ cDoubËC®l
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+11
+public
+:
+
+12 \12
+i
+;
+
+14 \1e
+ $£tUp
+()
+
+16
+i
+ = 0;
+
+19 \1e
+ $\8b¡As£¹Equ®sW\99hSideEfãùs
+()
+
+21
+ `TS_ASSERT_EQUALS
+Ð
+ `\9aüem\92t
+(), 3 );
+
+22
+ }
+}
+
+24 \1e
+ $\8b¡As£¹DifãrsW\99hSideEfãùs
+()
+
+26
+ `TS_ASSERT_DIFFERS
+Ð
+ `\9aüem\92t
+(), 1 );
+
+27
+ }
+}
+
+29 \1e
+ $\8b¡As£¹D\96\8fW\99hSideEfãùs
+()
+
+31
+ `TS_ASSERT_DELTA
+Ð
+ `\9aüem\92t
+(), 2.0, 0.5 );
+
+32
+ }
+}
+
+34 \12
+ $\9aüem\92t
+()
+
+36 \15 ++
+i
+;
+
+37
+ }
+}
+
+ @tools/cxxtest/test/DynamicAbort.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cDyÇmicAbÜt
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \1e
+ $\8b¡_AbÜt_Ú_ç\9e_\9a_this_\8b¡
+()
+
+8
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+9
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+12 \1e
+ $\8b¡_DÚt_abÜt_\9a_this_\8b¡
+()
+
+14
+CxxTe¡
+::
+ `£tAbÜtTe¡OnFa\9e
+Ð
+çl£
+ );
+
+15
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+16
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+17
+ }
+}
+
+19 \1e
+ $\8b¡_Rev\94t_to_abÜt
+()
+
+21
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+22
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+23
+ }
+}
+
+26 þas
+ cS\91UpWÜksAÎTe¡s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+28
+public
+:
+
+29 \1e
+ $£tUp
+()
+
+31
+CxxTe¡
+::
+ `£tAbÜtTe¡OnFa\9e
+Ð
+çl£
+ );
+
+34 \1e
+ $\8b¡_DÚt_abÜt_\9a_this_\8b¡
+()
+
+36
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+37
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+38
+ }
+}
+
+40 \1e
+ $\8b¡_DÚt_abÜt_\9a_this_\8b¡_e\99h\94
+()
+
+42
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+43
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+44
+ }
+}
+
+46 \1e
+ $\8b¡_Ov\94ride_\9a_this_\8b¡
+()
+
+48
+CxxTe¡
+::
+ `£tAbÜtTe¡OnFa\9e
+Ð
+\8cue
+ );
+
+49
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+50
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+51
+ }
+}
+
+ @tools/cxxtest/test/DynamicMax.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cDyÇmicMax
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \92um {
+DATA_SIZE
+ = 24 };
+
+7 \1d\ 5
+ gx
+[
+DATA_SIZE
+],
+ gy
+[DATA_SIZE];
+
+9 \1e
+ $£tUp
+()
+
+11 \ f \1d
+i
+ = 0; i <
+DATA_SIZE
+; ++ i ) {
+
+12
+x
+[
+i
+] = (\1d\ 5)i;
+
+13
+y
+[
+i
+] = (\1d\ 5)~
+x
+[i];
+
+15
+ }
+}
+
+17 \1e
+ $\8b¡_Max_size_äom_def\9ae
+()
+
+19
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+20
+ }
+}
+
+22 \1e
+ $\8b¡_S\91_max_size
+()
+
+24
+CxxTe¡
+::
+ `£tMaxDumpSize
+( 16 );
+
+25
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+26
+ }
+}
+
+28 \1e
+ $\8b¡_Rev\94t_to_max_size_äom_def\9ae
+()
+
+30
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+31
+ }
+}
+
+33 \1e
+ $\8b¡_S\91_max_size_to_z\94o__dumps_®l
+()
+
+35
+CxxTe¡
+::
+ `£tMaxDumpSize
+( 0 );
+
+36
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+37
+ }
+}
+
+40 þas
+ cS\91UpAfãùsAÎTe¡s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+42
+public
+:
+
+43 \92um {
+DATA_SIZE
+ = 24 };
+
+44 \1d\ 5
+ gx
+[
+DATA_SIZE
+],
+ gy
+[DATA_SIZE];
+
+46 \1e
+ $£tUp
+()
+
+48 \ f \1d
+i
+ = 0; i <
+DATA_SIZE
+; ++ i ) {
+
+49
+x
+[
+i
+] = (\1d\ 5)i;
+
+50
+y
+[
+i
+] = (\1d\ 5)~
+x
+[i];
+
+53
+CxxTe¡
+::
+ `£tMaxDumpSize
+( 12 );
+
+54
+ }
+}
+
+56 \1e
+ $\8b¡_U£_12_\9a_this_\8b¡
+()
+
+58
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+59
+ }
+}
+
+61 \1e
+ $\8b¡_U£_12_\9a_this_\8b¡_too
+()
+
+63
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+64
+ }
+}
+
+ @tools/cxxtest/test/EmptySuite.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cEm±ySu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \18
+Em±ySu\99e
+ *
+ $ü\97\8bSu\99e
+(è{ \15
+Ãw
+
+ `Em±ySu\99e
+(); }
+
+7 \18\1e
+ $de¡roySu\99e
+Ð
+Em±ySu\99e
+ *
+su\99e
+ ) {
+d\96\91e
+ su\99e;
+ }
+}
+
+9 \1e
+ $£tUp
+(è{
+ }
+}
+
+10 \1e
+ $\8b¬Down
+(è{
+ }
+}
+
+12 \1e
+ $thisSu\99eHasNoTe¡s
+()
+
+14
+ `TS_FAIL
+( "This suite has\82o\81ests" );
+
+15
+ }
+}
+
+ @tools/cxxtest/test/Exceptions.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cNuÎC»©e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \18
+NuÎC»©e
+ *
+ $ü\97\8bSu\99e
+() { \15 0; }
+
+11 \18\1e
+ $de¡roySu\99e
+Ð
+NuÎC»©e
+ * ) {
+ `TS_FAIL
+Ð"Should\82Ù b\90ÿÎed" );
+ }
+}
+
+13 \1e
+ $\8b¡NÙh\9ag
+()
+
+15
+ `TS_FAIL
+( "Test called\87lthough\82o suite" );
+
+16
+ }
+}
+
+19 þas
+ cThrowC»©e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+21
+public
+:
+
+22 \18
+ThrowC»©e
+ *
+ $ü\97\8bSu\99e
+(è{
+throw
+ -3; }
+
+23 \18\1e
+ $de¡roySu\99e
+Ð
+ThrowC»©e
+ * ) {
+ `TS_FAIL
+Ð"Should\82Ù b\90ÿÎed" );
+ }
+}
+
+25 \1e
+ $\8b¡NÙh\9ag
+()
+
+27
+ `TS_FAIL
+( "Test called\87lthough\82o suite" );
+
+28
+ }
+}
+
+31 þas
+ cThrowDe¡roy
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+33
+public
+:
+
+34 \18
+ThrowDe¡roy
+ *
+ $ü\97\8bSu\99e
+(è{ \15
+Ãw
+
+ThrowDe¡roy
+; }
+
+35 \18\1e
+ $de¡roySu\99e
+Ð
+ThrowDe¡roy
+ * ) {
+throw
+ 42;
+ }
+}
+
+37 \1e
+ $\8b¡NÙh\9ag
+(è{
+ }
+}
+
+40 þas
+ cThrowS\91Up
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+42
+public
+:
+
+43 \1e
+ $£tUp
+(è{
+throw
+ 5; }
+
+44 \1e
+ $\8b¬Down
+(è{
+ `TS_FAIL
+Ð"Shouldn'\88g\91 h\94e" );
+ }
+}
+
+46 \1e
+ $\8b¡NÙh\9ag
+(è{
+ `TS_FAIL
+Ð"Shouldn'\88g\91 h\94e" );
+ }
+}
+
+49 þas
+ cThrowT\97rDown
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+51
+public
+:
+
+52 \1e
+ $£tUp
+() {}
+
+53 \1e
+ $\8b¬Down
+(è{
+throw
+ 5;
+ }
+}
+
+55 \1e
+ $\8b¡NÙh\9ag
+(è{
+ }
+}
+
+58 þas
+ cTe¡ThrowFromTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+60
+public
+:
+
+61 \1e
+ $\8b¡ThrowSom\91h\9ag
+()
+
+63
+throw
+ 582;
+
+66 \1e
+ $\8b¡MoveOn
+()
+
+68
+ `TS_TRACE
+( "One failed\81est doesn't\87ffect\81he others" );
+
+69
+ }
+}
+
+ @tools/cxxtest/test/Factor.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/DummyDesü\9dtiÚs.h
+>
+
+8 þas
+ cFaùÜ
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+public
+:
+
+11 þas
+ cX
+ :
+public
+
+CxxTe¡
+::
+DummyWÜldDesü\9dtiÚ
+
+
+13
+public
+:
+
+14 \1d
+n
+;
+
+15 \1d
+numTÙ®Te¡s
+(ècÚ¡ { \15
+ mn
+; }
+
+18
+X
+
+ gx
+;
+
+19 \f
+ eLim\99
+ {
+ gMAX_STRLEN_TOTAL_TESTS
+ =
+CxxTe¡
+::
+WÜldDesü\9dtiÚ
+::
+MAX_STRLEN_TOTAL_TESTS
+ };
+
+20 \ 5
+ gbufãr
+[
+MAX_STRLEN_TOTAL_TESTS
+ * 2];
+
+22 cڡ \ 5*
+ $cÚv\94t
+Ð\1d
+n
+ )
+
+24
+x
+.
+n
+ =\82;
+
+25 \15
+x
+.
+ `¡rTÙ®Te¡s
+Ð
+bufãr
+ );
+
+26
+ }
+}
+
+28 \1e
+ $\8b¡_Some_numb\94s
+()
+
+30
+ `TS_WARN
+Ð
+ `cÚv\94t
+(53) );
+
+31 \ f \1d
+n
+ = 0;\82 < 64; ++\82 ) {
+
+32
+ `TS_ASSERT_DIFFERS
+Ð
+n
+, 32 );
+
+33
+ `TS_WARN
+Ð
+ `cÚv\94t
+(
+n
+) );
+
+35
+ }
+}
+
+37 þas
+ cShÜ\8brThª
+
+
+39
+ gpublic
+:
+
+40
+boÞ
+
+Ý\94©Ü
+()ÐcÚ¡ \ 5*
+s
+, \1d
+ gn
+ ) const
+
+42 \1d
+ gËn
+ = 0;
+
+43 \1f *
+ gs
+++ != '\0' )
+
+44 ++
+Ën
+;
+
+45 \15 (
+ gËn
+ <
+ gn
+);
+
+49 þas
+ cNÙShÜ\8brThª
+
+
+51
+ShÜ\8brThª
+
+ g_shÜ\8brThª
+;
+
+53
+ gpublic
+:
+
+54
+boÞ
+
+Ý\94©Ü
+()ÐcÚ¡ \ 5*
+s
+, \1d
+ gn
+ ) cڡ { \15 !
+_shÜ\8brThª
+Ðs,
+n
+ ); }
+
+57 \1e
+ $\8b¡_L\92gths
+()
+
+59 \1d
+»asÚabËLim\99
+ = 60060;
+
+60 \ f \1d
+n
+ = 0;\82 <
+»asÚabËLim\99
+; ++\82 )
+
+61
+ `TS_ASSERT_RELATION
+Ð
+ShÜ\8brThª
+,
+ `cÚv\94t
+(
+n
+),
+MAX_STRLEN_TOTAL_TESTS
+ );
+
+62
+ `TS_ASSERT_RELATION
+Ð
+NÙShÜ\8brThª
+,
+ `cÚv\94t
+(
+»asÚabËLim\99
+),
+MAX_STRLEN_TOTAL_TESTS
+ );
+
+63
+ }
+}
+
+ @tools/cxxtest/test/ForceNoEh.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cFÜûNoEh
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \1e
+ $\8b¡CxxTe¡CªComp\9eeW\99houtExû±iÚHªdl\9ag
+()
+
+8
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+9
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+10
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `foo
+() );
+
+13 \1e
+ $foo
+()
+
+15
+ }
+}
+
+ @tools/cxxtest/test/GfSetUpFails.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUp
+(è{ \15
+çl£
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+()
+
+26
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+28
+ }
+};
+
+ @tools/cxxtest/test/GfSetUpThrows.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUp
+(è{
+throw
+
+this
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+()
+
+26
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+28
+ }
+};
+
+ @tools/cxxtest/test/GfTearDownFails.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $\8b¬Down
+(è{ \15
+çl£
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+() {}
+
+25 \1e
+ $\8b¡Two
+(è{
+ `TS_WARN
+Ð"Te¡\9ag should gØÚ!" );
+ }
+}
+
+ @tools/cxxtest/test/GfTearDownThrows.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $\8b¬Down
+(è{
+throw
+
+this
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+() {}
+
+25 \1e
+ $\8b¡Two
+(è{
+ `TS_WARN
+Ð"Te¡\9ag should gØÚ!" );
+ }
+}
+
+ @tools/cxxtest/test/GlobalFixtures.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+11 þas
+ cFixtu»1
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+13 \1d
+_£tUpCouÁ
+;
+
+14 \1d
+ m_\8b¬DownCouÁ
+;
+
+16
+ mpublic
+:
+
+17
+ $Fixtu»1
+(è{
+_£tUpCouÁ
+ =
+_\8b¬DownCouÁ
+ = 0; }
+
+18
+boÞ
+
+ $£tUp
+(è{ ++
+_£tUpCouÁ
+; \15
+\8cue
+;
+ }
+}
+
+19
+boÞ
+
+ $\8b¬Down
+(è{ ++
+_\8b¬DownCouÁ
+; \15
+\8cue
+;
+ }
+}
+
+20 \1d
+ $£tUpCouÁ
+(ècÚ¡ { \15
+_£tUpCouÁ
+;
+ }
+}
+
+21 \1d
+ $\8b¬DownCouÁ
+(ècÚ¡ { \15
+_\8b¬DownCouÁ
+;
+ }
+}
+
+28 \18
+Fixtu»1
+
+ gfixtu»1
+;
+
+34 þas
+ cFixtu»2
+ :
+public
+
+Fixtu»1
+
+
+36
+public
+:
+
+37
+boÞ
+
+ $£tUp
+()
+
+39
+ `TS_ASSERT_EQUALS
+(
+ `£tUpCouÁ
+(),
+fixtu»1
+.setUpCount() - 1);
+
+40
+ `TS_ASSERT_EQUALS
+(
+ `\8b¬DownCouÁ
+(),
+fixtu»1
+.tearDownCount());
+
+41 \15
+Fixtu»1
+::
+ `£tUp
+();
+
+44
+boÞ
+
+ $\8b¬Down
+()
+
+46
+ `TS_ASSERT_EQUALS
+(
+ `£tUpCouÁ
+(),
+fixtu»1
+.setUpCount());
+
+47
+ `TS_ASSERT_EQUALS
+(
+ `\8b¬DownCouÁ
+(),
+fixtu»1
+.tearDownCount());
+
+48 \15
+Fixtu»1
+::
+ `\8b¬Down
+();
+
+49
+ }
+}
+
+52 \18
+Fixtu»2
+
+ gfixtu»2
+;
+
+54 þas
+ cTe¡Glob®Fixtu»
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+56
+public
+:
+
+57 \1e
+ $\8b¡CouÁsF\9c¡Time
+()
+
+59
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+ `£tUpCouÁ
+(), 1);
+
+60
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+ `\8b¬DownCouÁ
+(), 0);
+
+61
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+ `£tUpCouÁ
+(), 1);
+
+62
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+ `\8b¬DownCouÁ
+(), 0);
+
+65 \1e
+ $\8b¡CouÁsSecÚdTime
+()
+
+67
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+ `£tUpCouÁ
+(), 2);
+
+68
+ `TS_ASSERT_EQUALS
+(
+fixtu»1
+.
+ `\8b¬DownCouÁ
+(), 1);
+
+69
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+ `£tUpCouÁ
+(), 2);
+
+70
+ `TS_ASSERT_EQUALS
+(
+fixtu»2
+.
+ `\8b¬DownCouÁ
+(), 1);
+
+71
+ }
+}
+
+ @tools/cxxtest/test/GoodSuite.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+2 \ 2
+ ~<m©h.h
+>
+
+9 þas
+ cGoodSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+11
+public
+:
+
+12 \1e
+ $\8b¡As£¹
+()
+
+14
+ `TS_ASSERT
+Ð
+\8cue
+ );
+
+15
+ `TS_ASSERT
+( 1 == 1 );
+
+16
+ `TS_ASSERT
+( 13 );
+
+17
+ `TS_ASSERT
+Ð
+this
+ );
+
+20 \1e
+ $\8b¡As£¹Mes§ge
+()
+
+22
+ `TSM_ASSERT
+( "ASCII works", 'A' == 65 );
+
+23
+ }
+}
+
+25 \1e
+ $\8b¡Equ®s
+()
+
+27
+ `TS_ASSERT_EQUALS
+( 1 + 1, 2 );
+
+28
+ `TS_ASSERT_EQUALS
+( 2 * 2, 4 );
+
+29
+ `TS_ASSERT_EQUALS
+( -4 * -4, 16 );
+
+30
+ }
+}
+
+32 \1e
+ $\8b¡Equ®sMes§ge
+()
+
+34
+ `TSM_ASSERT_EQUALS
+( "Addition operator works", 1 + 1, 2 );
+
+35
+ }
+}
+
+37 \1e
+ $\8b¡D\96\8f
+()
+
+39
+ `TS_ASSERT_DELTA
+( 1.0 + 1.0, 2.0, 0.0001 );
+
+40
+ }
+}
+
+42 \1e
+ $\8b¡D\96\8fMes§ge
+()
+
+44
+ `TSM_ASSERT_DELTA
+Ð"sq¹(èwÜks",
+ `sq¹
+(2.0), 1.4142, 0.0001 );
+
+45
+ }
+}
+
+47 \1e
+ $\8b¡Difãrs
+()
+
+49
+ `TS_ASSERT_DIFFERS
+( 0, 1 );
+
+50
+ `TS_ASSERT_DIFFERS
+( 0.12, 0.123 );
+
+51
+ }
+}
+
+53 \1e
+ $\8b¡DifãrsMes§ge
+()
+
+55
+ `TSM_ASSERT_DIFFERS
+( "Not\87ll is\81rue", 0, 1 );
+
+56
+ }
+}
+
+58 \1e
+ $\8b¡LessThª
+()
+
+60
+ `TS_ASSERT_LESS_THAN
+( 1, 2 );
+
+61
+ `TS_ASSERT_LESS_THAN
+( -2, -1 );
+
+62
+ }
+}
+
+64 \1e
+ $\8b¡LessThªMes§ge
+()
+
+66
+ `TSM_ASSERT_LESS_THAN
+Ð".5 i Ës thª it squ¬\90roÙ", 0.5,
+ `sq¹
+(0.5) );
+
+67
+ }
+}
+
+69 \1e
+ $\8b¡LessThªEqu®s
+()
+
+71
+ `TS_ASSERT_LESS_THAN_EQUALS
+( 3, 3 );
+
+72
+ `TS_ASSERT_LESS_THAN_EQUALS
+( 3, 4 );
+
+73
+ }
+}
+
+75 \1e
+ $\8b¡LessThªEqu®sMes§ge
+()
+
+77
+ `TSM_ASSERT_LESS_THAN_EQUALS
+Ð"1.0 <ð\99 squ¬\90roÙ", 1.0,
+ `sq¹
+(1.0) );
+
+78
+ }
+}
+
+80 \1e
+ $\8b¡Throws
+()
+
+82
+ `TS_ASSERT_THROWS
+Ð{
+throw
+ 1; }, \12);
+
+83
+ }
+}
+
+85 \1e
+ $\8b¡ThrowsMes§ge
+()
+
+87
+ `TSM_ASSERT_THROWS
+Ð"1 i ª iÁeg\94", {
+throw
+ 1; }, \12);
+
+88
+ }
+}
+
+90 \1e
+ $\8b¡ThrowsAnyth\9ag
+()
+
+92
+ `TS_ASSERT_THROWS_ANYTHING
+Ð{
+throw
+
+ `GoodSu\99e
+(); } );
+
+93
+ }
+}
+
+95 \1e
+ $\8b¡ThrowsAnyth\9agMes§ge
+()
+
+97
+ `TSM_ASSERT_THROWS_ANYTHING
+( "Yes, you can\81hrow\81est suites",
+
+98 {
+throw
+
+ `GoodSu\99e
+(); } );
+
+99
+ }
+}
+
+101 \1e
+ $\8b¡ThrowsNÙh\9ag
+()
+
+103
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `throwNÙh\9ag
+() );
+
+104
+ }
+}
+
+106 \1e
+ $\8b¡ThrowsNÙh\9agMes§ge
+()
+
+108
+ `TSM_ASSERT_THROWS_NOTHING
+Ð"Em±y funùiÚ do¢'\88throw",
+ `throwNÙh\9ag
+() );
+
+109
+ }
+}
+
+111 \1e
+ $throwNÙh\9ag
+()
+
+113
+ }
+}
+
+ @tools/cxxtest/test/GuiWait.h
+
+1 #iâdeà
+__GUI_WAIT_H
+
+
+2 \ 1
+ #__GUI_WAIT_H
+
+
+ )
+
+4 \ 1
+ #CXXTEST_SAMPLE_GUI_WAIT
+()
+
+ )
+
+ @tools/cxxtest/test/HaveStd.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~"Som\91h\9ag.h
+"
+
+8 þas
+ cHaveStd
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+public
+:
+
+11 \1e
+ $\8b¡HaveStd
+()
+
+13
+ `TS_ASSERT_EQUALS
+Ð
+ `som\91h\9ag
+(), "Something" );
+
+15
+ }
+};
+
+ @tools/cxxtest/test/IncludeTest.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cInþudesTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡T¿\99s
+()
+
+12
+ `TS_WARN
+( (\1e*)0 );
+
+13
+ `TS_WARN
+( (\13*)0 );
+
+15
+ }
+};
+
+ @tools/cxxtest/test/InheritedTest.h
+
+1 #iâdeà
+__INHERITANCETEST_H
+
+
+2 \ 1
+ #__INHERITANCETEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+10 þas
+ cBa£Te¡s
+
+
+12
+ mpublic
+:
+
+13 \1e
+ $\8b¡Equ®\99y
+()
+
+15
+ `TS_ASSERT_EQUALS
+( 1, 1 );
+
+16
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+17
+ `TS_ASSERT_EQUALS
+( 'a', 'A' );
+
+18
+ `TS_ASSERT_EQUALS
+( 1.0, -12345678900000000000000000000000000000000000000000.1234 );
+
+21 \1e
+ $\8b¡Add\99iÚ
+()
+
+23
+ `TS_ASSERT_EQUALS
+( 1 + 1, 2 );
+
+24
+ `TS_ASSERT_EQUALS
+( 2 + 2, 5 );
+
+25
+ }
+}
+
+27 \1e
+ $Te¡MuÉ\9dliÿtiÚ
+()
+
+29
+ `TS_ASSERT_EQUALS
+( 2 * 2, 4 );
+
+30
+ `TS_ASSERT_EQUALS
+( 4 * 4, 44 );
+
+31
+ `TS_ASSERT_DIFFERS
+( -2 * -2, 4 );
+
+32
+ }
+}
+
+34 \1e
+ $\8b¡Com·risÚ
+()
+
+36
+ `TS_ASSERT_LESS_THAN
+( (\12)1, (\1d\13)2 );
+
+37
+ `TS_ASSERT_LESS_THAN
+( -1, -2 );
+
+38
+ }
+}
+
+40 \1e
+ $\8b¡TheWÜldIsC¿zy
+()
+
+42
+ `TS_ASSERT_EQUALS
+Ð
+\8cue
+,
+çl£
+ );
+
+43
+ }
+}
+
+45 \1e
+ $\8b¡_Fa\9eu»
+()
+
+47
+ `TS_FAIL
+( "Not implemented" );
+
+48
+ `TS_FAIL
+( 1569779912 );
+
+49
+ }
+}
+
+51 \1e
+ $\8b¡_TS_WARN_maüo
+()
+
+53
+ `TS_WARN
+( "Just\87 friendly warning" );
+
+54
+ `TS_WARN
+( "Warnings don't\87bort\81he\81est" );
+
+55
+ }
+}
+
+59
+þass
+
+ gInh\94\99edTe¡s1
+ :
+public
+
+Ba£Te¡s
+,\85ubliø
+ gCxxTe¡
+::
+Te¡Su\99e
+
+
+62
+þass
+
+ gInh\94\99edTe¡s2
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+,\85ubliø
+ gBa£Te¡s
+
+
+ @tools/cxxtest/test/Int64.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cIÁ64
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡IÁ64
+()
+
+12
+ `TS_ASSERT_EQUALS
+Ð(
+__\9at64
+)1, (__int64)2 );
+
+13
+ `TS_ASSERT_DIFFERS
+Ð(
+__\9at64
+)3, (__int64)3 );
+
+14
+ `TS_ASSERT_LESS_THAN
+Ð(
+__\9at64
+)5, (__int64)4 );
+
+16
+ }
+};
+
+ @tools/cxxtest/test/LessThanEquals.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+8 þas
+ cLessThªEqu®s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+public
+:
+
+11 \1e
+ $\8b¡LessThªEqu®s
+()
+
+13
+ `TS_ASSERT_LESS_THAN_EQUALS
+( 1, 2 );
+
+14
+ `TS_ASSERT_LESS_THAN_EQUALS
+( 1, 1 );
+
+16
+ `TS_ASSERT_LESS_THAN_EQUALS
+( 1, 0 );
+
+17
+ `TSM_ASSERT_LESS_THAN_EQUALS
+( "1 <=? 0", 1, 0 );
+
+19
+ `ETS_ASSERT_LESS_THAN
+( 1, 0 );
+
+20
+ `ETSM_ASSERT_LESS_THAN_EQUALS
+( "1 <=? 0", 1, 0 );
+
+22
+ }
+};
+
+ @tools/cxxtest/test/LongLong.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cLÚgLÚgTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡LÚgLÚg
+()
+
+12
+ `TS_ASSERT_EQUALS
+( (\13\13)1, (\13\13)2 );
+
+13
+ `TS_ASSERT_DIFFERS
+( (\13\13)3, (\13\13)3 );
+
+14
+ `TS_ASSERT_LESS_THAN
+( (\13\13)5, (\13\13)4 );
+
+16
+ }
+};
+
+ @tools/cxxtest/test/LongTraits.h
+
+5 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+7
+Çme¥aû
+
+ gCxxTe¡
+
+
+9
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+10
+þass
+
+ gV®ueT¿\99s
+<\13*>
+
+12
+ gpublic
+:
+
+13
+V®ueT¿\99s
+( \13* ) {}
+
+14 cڡ \ 5*
+asS\8c\9ag
+() { \15 "(long *)"; }
+
+ @tools/cxxtest/test/MaxDump.h
+
+5 \ 1
+ #CXXTEST_MAX_DUMP_SIZE
+ 20
+
+ )
+
+ @tools/cxxtest/test/MockTest.h
+
+4 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+9 \18\12
+ $Úe
+Ð\1eè{ \15 1;
+ }
+}
+
+10 \18\1e
+ $two
+Ð\12*
+p
+ ) { *°ð2;
+ }
+}
+
+12
+Çme¥aû
+
+ gNameS·û
+
+
+14 \18\12
+id\92t\99y
+Ð\12
+i
+ ) { \15
+ gi
+; }
+
+15 \18\b
+id\92t\99y
+Ð\b
+d
+ ) { \15
+ gd
+; }
+
+18 þas
+ cO·que
+
+
+20
+ mpublic
+:
+
+21
+ex¶ic\99
+
+ $O·que
+Ð\12
+i
+ ) :
+ $v®ue
+Ð
+i
+ ) {}
+
+22 \12
+v®ue
+;
+
+23
+ }
+};
+
+25 \18
+O·que
+
+ $g\91O·que
+Ð\12
+i
+ )
+
+27 \15
+ `O·que
+Ð
+i
+ );
+
+28
+ }
+}
+
+30 \ 1
+ #CXXTEST_MOCK_TEST_SOURCE_FILE
+
+
+ )
+
+31 \ 2
+ ~<cxx\8b¡/Mock.h
+>
+
+33
+CXXTEST_MOCK_GLOBAL
+Ð\12,
+Úe
+, ( \1e), () );
+
+34
+CXXTEST_MOCK_VOID_GLOBAL
+Ð
+two
+, ( \12*
+p
+ ), (\85 ) );
+
+36
+CXXTEST_MOCK
+Ð
+\9atId\92t\99y
+, \12,
+id\92t\99y
+, ( \12
+i
+ ),
+NameS·û
+::identity, ( i ) );
+
+37
+CXXTEST_MOCK
+Ð
+doubËId\92t\99y
+, \b,
+id\92t\99y
+, ( \b
+i
+ ),
+NameS·û
+::identity, ( i ) );
+
+39
+CXXTEST_MOCK_DEFAULT_VALUE
+Ð
+O·que
+, Opaque( 42 ) );
+
+40
+CXXTEST_MOCK_GLOBAL
+Ð
+O·que
+,
+g\91O·que
+, ( \12
+i
+ ), ( i ) );
+
+42
+CXXTEST_SUPPLY_GLOBAL
+Ð\12,
+suµlyOÃ
+, ( \1e), () );
+
+43
+CXXTEST_SUPPLY_VOID_GLOBAL
+Ð
+suµlyTwo
+, ( \12*
+p
+ ), (\85 ) );
+
+45
+CXXTEST_SUPPLY
+Ð
+SuµlyTh»e
+, \12,
+doSuµlyTh»e
+, ( \1e),
+suµlyTh»e
+, () );
+
+46
+CXXTEST_SUPPLY_VOID
+Ð
+SuµlyFour
+,
+doSuµlyFour
+, ( \12*
+p
+ ),
+suµlyFour
+, (\85 ) );
+
+48 þas
+ cMockOÃ
+ :
+public
+
+T
+::
+Ba£_Úe
+
+
+50
+public
+:
+
+51
+ $MockOÃ
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+52 \12
+»suÉ
+;
+
+53 \12
+ $Úe
+(è{ \15
+»suÉ
+;
+ }
+}
+
+56 þas
+ cMockIÁId\92t\99y
+ :
+public
+
+T
+::
+Ba£_\9atId\92t\99y
+
+
+58
+public
+:
+
+59
+ $MockIÁId\92t\99y
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+60 \12
+»suÉ
+;
+
+61 \12
+ $id\92t\99y
+Ð\12è{ \15
+»suÉ
+;
+ }
+}
+
+64 þas
+ cMockDoubËId\92t\99y
+ :
+public
+
+T
+::
+Ba£_doubËId\92t\99y
+
+
+66
+public
+:
+
+67
+ $MockDoubËId\92t\99y
+Ð\b
+d
+ ) :
+ $»suÉ
+Ð
+d
+ ) {}
+
+68 \b
+»suÉ
+;
+
+69 \b
+ $id\92t\99y
+Ð\bè{ \15
+»suÉ
+;
+ }
+}
+
+72 þas
+ cMockG\91O·que
+ :
+public
+
+T
+::
+Ba£_g\91O·que
+
+
+74
+public
+:
+
+75
+ $MockG\91O·que
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+76
+O·que
+
+»suÉ
+;
+
+77
+O·que
+
+ $g\91O·que
+Ð\12è{ \15
+»suÉ
+;
+ }
+}
+
+80 þas
+ cSuµlyOÃ
+ :
+public
+
+T
+::
+Ba£_suµlyOÃ
+
+
+82
+public
+:
+
+83
+ $SuµlyOÃ
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+84 \12
+»suÉ
+;
+
+85 \12
+ $suµlyOÃ
+(è{ \15
+»suÉ
+;
+ }
+}
+
+88 þas
+ cSuµlyTwo
+ :
+public
+
+T
+::
+Ba£_suµlyTwo
+
+
+90
+public
+:
+
+91
+ $SuµlyTwo
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+92 \12
+»suÉ
+;
+
+93 \1e
+ $suµlyTwo
+Ð\12*
+p
+ ) { *°ð
+»suÉ
+;
+ }
+}
+
+96 þas
+ cSuµlyTh»e
+ :
+public
+
+T
+::
+Ba£_SuµlyTh»e
+
+
+98
+public
+:
+
+99
+ $SuµlyTh»e
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+100 \12
+»suÉ
+;
+
+101 \12
+ $doSuµlyTh»e
+(è{ \15
+»suÉ
+;
+ }
+}
+
+104 þas
+ cSuµlyFour
+ :
+public
+
+T
+::
+Ba£_SuµlyFour
+
+
+106
+public
+:
+
+107
+ $SuµlyFour
+Ð\12
+i
+ ) :
+ $»suÉ
+Ð
+i
+ ) {}
+
+108 \12
+»suÉ
+;
+
+109 \1e
+ $doSuµlyFour
+Ð\12*
+p
+ ) { *°ð
+»suÉ
+;
+ }
+}
+
+112 þas
+ cMockTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+114
+public
+:
+
+115 \1e
+ $\8b¡_Mock
+()
+
+117
+MockOÃ
+
+ `mockOÃ
+( 2 );
+
+118
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 2 );
+
+121 \1e
+ $\8b¡_R\97l
+()
+
+123
+T
+::
+R\97l_Úe
+
+»®OÃ
+;
+
+124
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 1 );
+
+125
+ }
+}
+
+127 \1e
+ $\8b¡_Unim¶em\92\8bd
+()
+
+129
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 1 );
+
+130
+ }
+}
+
+132 \1e
+ $\8b¡_MÜe_com¶ex_mock
+()
+
+134
+MockIÁId\92t\99y
+
+ `mii
+( 53 );
+
+135
+MockDoubËId\92t\99y
+
+ `mdi
+ ( 71 );
+
+137
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `id\92t\99y
+( (\12)5 ), 53 );
+
+138
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `id\92t\99y
+( (\b)5.0 ), 71 );
+
+139
+ }
+}
+
+141 \1e
+ $\8b¡_Mock_\8ca\99s
+()
+
+143
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `g\91O·que
+Ð3 ).
+v®ue
+, 72 );
+
+144
+ }
+}
+
+146 \1e
+ $\8b¡_Ov\94ride
+()
+
+148
+MockOÃ
+ *
+two
+ =
+Ãw
+
+ `MockOÃ
+( 2 );
+
+149
+MockOÃ
+ *
+th»e
+ =
+Ãw
+
+ `MockOÃ
+( 3 );
+
+150
+MockOÃ
+ *
+four
+ =
+Ãw
+
+ `MockOÃ
+( 4 );
+
+151
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 4 );
+
+152
+d\96\91e
+
+th»e
+;
+
+153
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 4 );
+
+154
+d\96\91e
+
+four
+;
+
+155
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 2 );
+
+156
+d\96\91e
+
+two
+;
+
+157
+ `TS_ASSERT_EQUALS
+Ð
+T
+::
+ `Úe
+(), 1 );
+
+158
+ }
+}
+
+160 \1e
+ $\8b¡_Suµly
+()
+
+162
+SuµlyOÃ
+
+ `s
+( 2 );
+
+163
+ `TS_ASSERT_EQUALS
+Ð
+ `suµlyOÃ
+(), 2 );
+
+164
+ }
+}
+
+166 \1e
+ $\8b¡_Unim¶em\92\8bd_suµly
+()
+
+168
+ `TS_ASSERT_EQUALS
+Ð
+ `suµlyOÃ
+(), 1 );
+
+169
+ }
+}
+
+171 \1e
+ $\8b¡_MÜe_com¶ex_suµly
+()
+
+173
+SuµlyTh»e
+
+ `¡
+( 28 );
+
+174
+SuµlyFour
+
+ `sf
+( 53 );
+
+176
+ `TS_ASSERT_EQUALS
+Ð
+ `suµlyTh»e
+(), 28 );
+
+178 \12
+i
+;
+
+179
+ `suµlyFour
+Ð&
+i
+ );
+
+180
+ `TS_ASSERT_EQUALS
+Ð
+i
+, 53 );
+
+181
+ }
+}
+
+ @tools/cxxtest/test/NoEh.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cNoEh
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \1e
+ $\8b¡CxxTe¡CªComp\9eeW\99houtExû±iÚHªdl\9ag
+()
+
+8
+ `TS_ASSERT_EQUALS
+( 1, 2 );
+
+9
+ `TS_ASSERT_EQUALS
+( 2, 3 );
+
+11
+ }
+};
+
+ @tools/cxxtest/test/Part1.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cP¬t1
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡Som\91h\9ag
+()
+
+12
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `throwNÙh\9ag
+() );
+
+15 \1e
+ $throwNÙh\9ag
+()
+
+17
+ }
+}
+
+ @tools/cxxtest/test/Part2.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cP¬t2
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡Som\91h\9ag
+()
+
+12
+ `TS_ASSERT_THROWS_NOTHING
+Ð
+ `throwNÙh\9ag
+() );
+
+15 \1e
+ $throwNÙh\9ag
+()
+
+17
+ }
+}
+
+ @tools/cxxtest/test/Relation.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \19
+ sMyNeg©ive
+
+
+5
+boÞ
+
+Ý\94©Ü
+()ÐcÚ¡ \12&
+ mi
+ ) const { \15 i < 0; }
+
+8
+ g\8bm¶©e
+<
+þass
+
+ gT
+>
+
+9 \19
+ sMyLess
+
+
+11
+boÞ
+
+Ý\94©Ü
+()ÐcÚ¡
+ mT
+ &
+ mx
+, cڡ T &
+ my
+ ) const { \15 x < y; }
+
+14 þas
+ cR\96©iÚ
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+16
+public
+:
+
+17 \1e
+ $\8b¡P»diÿ\8b
+()
+
+19
+ `TS_ASSERT_PREDICATE
+Ð
+MyNeg©ive
+, 1 );
+
+20
+ `TSM_ASSERT_PREDICATE
+Ð"1 <? 0",
+MyNeg©ive
+, 1 );
+
+21
+\8cy
+ {
+ `ETS_ASSERT_PREDICATE
+Ð
+MyNeg©ive
+,
+ `throwIÁ
+( 1 ) ); }
+
+22
+ `ÿtch
+Ð\12
+i
+ ) {
+ `TS_WARN
+( i ); }
+
+23
+\8cy
+ {
+ `ETSM_ASSERT_PREDICATE
+Ð"1 <? 0",
+MyNeg©ive
+,
+ `throwIÁ
+( 1 ) ); }
+
+24
+ `ÿtch
+Ð\12
+i
+ ) {
+ `TS_WARN
+( i ); }
+
+27 \1e
+ $\8b¡R\96©iÚ
+()
+
+29
+ `TS_ASSERT_RELATION
+Ð
+MyLess
+<\12>, 2, 1 );
+
+30
+ `TSM_ASSERT_RELATION
+Ð"2 <? 1",
+MyLess
+<\12>, 2, 1 );
+
+31
+\8cy
+ {
+ `ETS_ASSERT_RELATION
+Ð
+MyLess
+<\12>,
+ `throwIÁ
+( 1 ),\81hrowInt( 1 ) ); }
+
+32
+ `ÿtch
+Ð\12
+i
+ ) {
+ `TS_WARN
+( i ); }
+
+33
+\8cy
+ {
+ `ETSM_ASSERT_RELATION
+Ð"2 <? 1",
+MyLess
+<\12>,
+ `throwIÁ
+( 1 ),\81hrowInt( 1 ) ); }
+
+34
+ `ÿtch
+Ð\12
+i
+ ) {
+ `TS_WARN
+( i ); }
+
+35
+ }
+}
+
+37 \12
+ $throwIÁ
+Ð\12
+i
+ )
+
+39
+throw
+
+i
+;
+
+40
+ }
+}
+
+ @tools/cxxtest/test/SameData.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cSameD©a
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \92um {
+DATA_SIZE
+ = 24 };
+
+11 \1d\ 5
+ gx
+[
+DATA_SIZE
+],
+ gy
+[DATA_SIZE];
+
+13 \1e
+ $£tUp
+()
+
+15 \ f \1d
+i
+ = 0; i <
+DATA_SIZE
+; ++ i ) {
+
+16
+x
+[
+i
+] = (\1d\ 5)i;
+
+17
+y
+[
+i
+] = (\1d\ 5)~
+x
+[i];
+
+19
+ }
+}
+
+21 \1e
+ $\8b¡As£¹SameD©a
+()
+
+23
+ `TS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+24
+ }
+}
+
+26 \1e
+ $\8b¡As£¹Mes§geSameD©a
+()
+
+28
+ `TSM_ASSERT_SAME_DATA
+Ð"NÙ sam\90d©a",
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+29
+ }
+}
+
+31 \1e
+ $\8b¡SaãAs£¹SameD©a
+()
+
+33
+ `ETS_ASSERT_SAME_DATA
+Ð
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+34
+ }
+}
+
+36 \1e
+ $\8b¡SaãAs£¹Mes§geSameD©a
+()
+
+38
+ `ETSM_ASSERT_SAME_DATA
+Ð"NÙ sam\90d©a",
+x
+,
+y
+,
+DATA_SIZE
+ );
+
+39
+ }
+}
+
+ @tools/cxxtest/test/SameFiles.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cSameF\9ees
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+11 \1e
+ $\8b¡As£¹F\9ees
+()
+
+13
+ `TS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFiles.h" );
+
+16 \1e
+ $\8b¡As£¹F\9eeShÜ\8br
+()
+
+18
+ `TS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFilesLonger.h" );
+
+19
+ }
+}
+
+21 \1e
+ $\8b¡As£¹F\9eeLÚg\94
+()
+
+23
+ `TS_ASSERT_SAME_FILES
+( "SameFilesLonger.h", "SameFiles.h" );
+
+24
+ }
+}
+
+26 \1e
+ $\8b¡As£¹Mes§geSameF\9ees
+()
+
+28
+ `TSM_ASSERT_SAME_FILES
+( "Not same files", "SameFiles.h", "SameData.h" );
+
+29
+ }
+}
+
+31 \1e
+ $\8b¡SaãAs£¹SameF\9ees
+()
+
+33
+ `ETS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFiles.h" );
+
+34
+ }
+}
+
+36 \1e
+ $\8b¡SaãAs£¹Mes§geSameF\9ees
+()
+
+38
+ `ETSM_ASSERT_SAME_FILES
+( "Not same files", "SameFiles.h", "SameData.h" );
+
+39
+ }
+}
+
+ @tools/cxxtest/test/SameFilesLonger.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cSameF\9ees
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+11 \1e
+ $\8b¡As£¹F\9ees
+()
+
+13
+ `TS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFiles.h" );
+
+16 \1e
+ $\8b¡As£¹F\9eeShÜ\8br
+()
+
+18
+ `TS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFilesLonger.h" );
+
+19
+ }
+}
+
+21 \1e
+ $\8b¡As£¹F\9eeLÚg\94
+()
+
+23
+ `TS_ASSERT_SAME_FILES
+( "SameFilesLonger.h", "SameFiles.h" );
+
+24
+ }
+}
+
+26 \1e
+ $\8b¡As£¹Mes§geSameF\9ees
+()
+
+28
+ `TSM_ASSERT_SAME_FILES
+( "Not same files", "SameFiles.h", "SameData.h" );
+
+29
+ }
+}
+
+31 \1e
+ $\8b¡SaãAs£¹SameF\9ees
+()
+
+33
+ `ETS_ASSERT_SAME_FILES
+( "SameFiles.h", "SameFiles.h" );
+
+34
+ }
+}
+
+36 \1e
+ $\8b¡SaãAs£¹Mes§geSameF\9ees
+()
+
+38
+ `ETSM_ASSERT_SAME_FILES
+( "Not same files", "SameFiles.h", "SameData.h" );
+
+39
+ }
+}
+
+ @tools/cxxtest/test/SameZero.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cSameZ\94o
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \ 5
+d©a
+[4];
+
+12 \1e
+ $£tUp
+()
+
+14 \ f \1d
+i
+ = 0; i < \17(
+d©a
+); ++ i )
+
+15
+d©a
+[
+i
+] = (\ 5)i;
+
+18 \1e
+ $\8b¡_TS_ASSERT_SAME_DATA_·s£d_z\94o
+()
+
+20
+ `TS_ASSERT_SAME_DATA
+Ð
+d©a
+, 0, \17(data) );
+
+21
+ `TS_ASSERT_SAME_DATA
+Ð0,
+d©a
+, \17(data) );
+
+22
+ `TS_ASSERT_SAME_DATA
+Ð
+d©a
+, 0, 0 );
+
+23
+ `TS_ASSERT_SAME_DATA
+Ð0,
+d©a
+, 0 );
+
+24
+ `TS_ASSERT_SAME_DATA
+( 0, 0, 0 );
+
+25
+ }
+}
+
+ @tools/cxxtest/test/SetUpWorldError.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUpWÜld
+(è{
+ `TS_FAIL
+("THIS IS BAD"); \15
+çl£
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+25 \1e
+ $\8b¡OÃ
+()
+
+27
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+30 \1e
+ $\8b¡Two
+()
+
+32
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+33
+ }
+}
+
+ @tools/cxxtest/test/SetUpWorldFails.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUpWÜld
+(è{ \15
+çl£
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+()
+
+26
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+28
+ }
+};
+
+ @tools/cxxtest/test/SetUpWorldThrows.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUpWÜld
+(è{
+throw
+
+this
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+()
+
+26
+ `TS_FAIL
+( "Shouldn't get here\87t\87ll" );
+
+28
+ }
+};
+
+ @tools/cxxtest/test/SimpleInheritedTest.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cTe¡s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+7
+CXXTEST_STD
+(
+li¡
+)<\12>*
+ÿche
+;
+
+9 \1e
+ $£tUp
+()
+
+11
+this
+->
+ÿche
+ =
+Ãw
+
+ `CXXTEST_STD
+(
+li¡
+)<\12>();
+
+14 \1e
+ $\8b¬Down
+()
+
+15 {
+ }
+}
+
+17 \1e
+ $\8b¡_size
+()
+
+19
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 0);
+
+20
+ }
+}
+
+22 \1e
+ $\8b¡_\9a£¹
+()
+
+24
+this
+->
+ÿche
+->
+ `push_back
+(1);
+
+25
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 1);
+
+26
+ }
+}
+
+31 þas
+ cInh\94\99edTe¡s
+ :
+public
+
+Te¡s
+
+
+33
+public
+:
+
+ @tools/cxxtest/test/SimpleInheritedTest2.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cTe¡s
+
+
+5
+ mpublic
+:
+
+7
+CXXTEST_STD
+(
+li¡
+)<\12>*
+ÿche
+;
+
+9 \1e
+ $£tUp
+()
+
+11
+this
+->
+ÿche
+ =
+Ãw
+
+ `CXXTEST_STD
+(
+li¡
+)<\12>();
+
+14 \1e
+ $\8b¬Down
+()
+
+15 {
+ }
+}
+
+17 \1e
+ $\8b¡_size
+()
+
+19
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 0);
+
+20
+ }
+}
+
+22 \1e
+ $\8b¡_\9a£¹
+()
+
+24
+this
+->
+ÿche
+->
+ `push_back
+(1);
+
+25
+ `TS_ASSERT_EQUALS
+(
+ÿche
+->
+ `size
+(), 1);
+
+26
+ }
+}
+
+31
+þass
+
+ gInh\94\99edTe¡s
+ :
+public
+
+Te¡s
+,\85ubliø
+ gCxxTe¡
+::
+Te¡Su\99e
+
+
+33
+public
+:
+
+35 \1e
+£tUp
+(è{
+Te¡s
+::setUp();}
+
+36 \1e
+\8b¬Down
+(è{
+ gTe¡s
+::
+£tUp
+();}
+
+ @tools/cxxtest/test/Something.h
+
+1 \ 2
+ ~<¡r\9ag
+>
+
+3
+\9al\9ae
+
+ g¡d
+::
+¡r\9ag
+
+ $som\91h\9ag
+(è{ \15 "som\91h\9ag";
+ }
+}
+
+ @tools/cxxtest/test/StlTraits.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cS\8eT¿\99s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \e
+ $CXXTEST_STD
+(
+ t¡r\9ag
+è
+ tS\8c\9ag
+;
+
+7 \e
+ `CXXTEST_STD
+(
+ t·\9c
+)<\12,
+ tS\8c\9ag
+>
+ tIÁS\8c\9ag
+;
+
+8 \e
+ `CXXTEST_STD
+(
+ t·\9c
+)<
+ tS\8c\9ag
+, \b>
+ tS\8c\9agDoubË
+;
+
+10 \1e
+ $\8b¡_Pa\9c
+()
+
+12
+IÁS\8c\9ag
+
+ `th»e
+( 3, "Three" );
+
+13
+ `TS_FAIL
+Ð
+th»e
+ );
+
+14
+S\8c\9agDoubË
+
+ `four
+( "Four", 4.0 );
+
+15
+ `TS_FAIL
+Ð
+four
+ );
+
+18 \1e
+ $\8b¡_VeùÜ
+()
+
+20
+ `CXXTEST_STD
+(
+veùÜ
+)<\12>
+v
+;
+
+21
+ `TS_TRACE
+Ð
+v
+ );
+
+22
+v
+.
+ `push_back
+( 1 );
+
+23
+v
+.
+ `push_back
+( 2 );
+
+24
+v
+.
+ `push_back
+( 3 );
+
+25
+ `TS_FAIL
+Ð
+v
+ );
+
+27
+ `CXXTEST_STD
+(
+veùÜ
+)<
+S\8c\9ag
+>
+w
+;
+
+28
+ `TS_TRACE
+Ð
+w
+ );
+
+29
+w
+.
+ `push_back
+( "One" );
+
+30
+w
+.
+ `push_back
+( "Two" );
+
+31
+w
+.
+ `push_back
+( "Three" );
+
+32
+ `TS_FAIL
+Ð
+w
+ );
+
+34
+ `CXXTEST_STD
+(
+veùÜ
+)<
+IÁS\8c\9ag
+>
+vw
+;
+
+35
+ `TS_TRACE
+Ð
+vw
+ );
+
+36
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 1, "One" ) );
+
+37
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 2, "Two" ) );
+
+38
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 3, "Three" ) );
+
+39
+ `TS_FAIL
+Ð
+vw
+ );
+
+40
+ }
+}
+
+42 \1e
+ $\8b¡_Li¡
+()
+
+44
+ `CXXTEST_STD
+(
+li¡
+)<\12>
+v
+;
+
+45
+ `TS_TRACE
+Ð
+v
+ );
+
+46
+v
+.
+ `push_back
+( 1 );
+
+47
+v
+.
+ `push_back
+( 2 );
+
+48
+v
+.
+ `push_back
+( 3 );
+
+49
+ `TS_FAIL
+Ð
+v
+ );
+
+51
+ `CXXTEST_STD
+(
+li¡
+)<
+S\8c\9ag
+>
+w
+;
+
+52
+ `TS_TRACE
+Ð
+w
+ );
+
+53
+w
+.
+ `push_back
+( "One" );
+
+54
+w
+.
+ `push_back
+( "Two" );
+
+55
+w
+.
+ `push_back
+( "Three" );
+
+56
+ `TS_FAIL
+Ð
+w
+ );
+
+58
+ `CXXTEST_STD
+(
+li¡
+)<
+IÁS\8c\9ag
+>
+vw
+;
+
+59
+ `TS_TRACE
+Ð
+vw
+ );
+
+60
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 1, "One" ) );
+
+61
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 2, "Two" ) );
+
+62
+vw
+.
+ `push_back
+Ð
+ `IÁS\8c\9ag
+( 3, "Three" ) );
+
+63
+ `TS_FAIL
+Ð
+vw
+ );
+
+64
+ }
+}
+
+66 \1e
+ $\8b¡_S\91
+()
+
+68
+ `CXXTEST_STD
+(
+£t
+)<\12>
+v
+;
+
+69
+ `TS_TRACE
+Ð
+v
+ );
+
+70
+v
+.
+ `\9a£¹
+( 1 );
+
+71
+v
+.
+ `\9a£¹
+( 2 );
+
+72
+v
+.
+ `\9a£¹
+( 3 );
+
+73
+ `TS_FAIL
+Ð
+v
+ );
+
+75
+ `CXXTEST_STD
+(
+£t
+)<
+S\8c\9ag
+>
+w
+;
+
+76
+ `TS_TRACE
+Ð
+w
+ );
+
+77
+w
+.
+ `\9a£¹
+( "One" );
+
+78
+w
+.
+ `\9a£¹
+( "Two" );
+
+79
+w
+.
+ `\9a£¹
+( "Three" );
+
+80
+ `TS_FAIL
+Ð
+w
+ );
+
+82
+ `CXXTEST_STD
+(
+£t
+)<
+IÁS\8c\9ag
+>
+vw
+;
+
+83
+ `TS_TRACE
+Ð
+vw
+ );
+
+84
+vw
+.
+ `\9a£¹
+Ð
+ `IÁS\8c\9ag
+( 1, "One" ) );
+
+85
+vw
+.
+ `\9a£¹
+Ð
+ `IÁS\8c\9ag
+( 2, "Two" ) );
+
+86
+vw
+.
+ `\9a£¹
+Ð
+ `IÁS\8c\9ag
+( 3, "Three" ) );
+
+87
+ `TS_FAIL
+Ð
+vw
+ );
+
+88
+ }
+}
+
+90 \1e
+ $\8b¡_M
+()
+
+92
+ `CXXTEST_STD
+(
+m
+)<
+S\8c\9ag
+, S\8c\9ag>
+m
+;
+
+93
+ `TS_TRACE
+Ð
+m
+ );
+
+95
+m
+["Jack"] = "Jill";
+
+96
+m
+["Humpty"] = "Dumpty";
+
+97
+m
+["Ren"] = "Stimpy";
+
+99
+ `TS_FAIL
+Ð
+m
+ );
+
+101
+ `CXXTEST_STD
+(
+m
+)< \1d, CXXTEST_STD(
+li¡
+)<\1d> >
+n
+;
+
+102
+ `TS_TRACE
+Ð
+n
+ );
+
+104
+n
+[6].
+ `push_back
+( 2 );
+
+105
+n
+[6].
+ `push_back
+( 3 );
+
+106
+n
+[210].
+ `push_back
+( 2 );
+
+107
+n
+[210].
+ `push_back
+( 3 );
+
+108
+n
+[210].
+ `push_back
+( 5 );
+
+109
+n
+[210].
+ `push_back
+( 7 );
+
+111
+ `TS_FAIL
+Ð
+n
+ );
+
+112
+ }
+}
+
+114 \1e
+ $\8b¡_Deque
+()
+
+116
+ `CXXTEST_STD
+(
+deque
+)<\12>
+d
+;
+
+117
+ `TS_TRACE
+Ð
+d
+ );
+
+118
+d
+.
+ `push_äÚt
+( 1 );
+
+119
+d
+.
+ `push_äÚt
+( 2 );
+
+120
+d
+.
+ `push_äÚt
+( 3 );
+
+121
+d
+.
+ `push_äÚt
+( 4 );
+
+122
+ `TS_FAIL
+Ð
+d
+ );
+
+123
+ }
+}
+
+125 \1e
+ $\8b¡_MuÉiM
+()
+
+127
+ `CXXTEST_STD
+(
+muÉim
+)<
+S\8c\9ag
+, \b>
+mm
+;
+
+128
+ `TS_TRACE
+Ð
+mm
+ );
+
+130
+mm
+.
+ `\9a£¹
+Ð
+ `S\8c\9agDoubË
+( "One", 1.0 ) );
+
+131
+mm
+.
+ `\9a£¹
+Ð
+ `S\8c\9agDoubË
+( "Two", 2.0 ) );
+
+132
+ `TS_FAIL
+Ð
+mm
+ );
+
+133
+ }
+}
+
+135 \1e
+ $\8b¡_MuÉiS\91
+()
+
+137
+ `CXXTEST_STD
+(
+muÉi£t
+)<\12>
+ms
+;
+
+138
+ `TS_TRACE
+Ð
+ms
+ );
+
+140
+ms
+.
+ `\9a£¹
+( 123 );
+
+141
+ms
+.
+ `\9a£¹
+( 456 );
+
+142
+ `TS_FAIL
+Ð
+ms
+ );
+
+143
+ }
+}
+
+145 \1e
+ $\8b¡_Com¶ex
+()
+
+147 \e
+ `CXXTEST_STD
+(
+ tcom¶ex
+)<\b>
+ tCom¶ex
+;
+
+148
+ `TS_FAIL
+Ð
+ `Com¶ex
+( 3.14, 2.71 ) );
+
+149
+ `TS_FAIL
+Ð
+ `Com¶ex
+( 0.0, 1.0 ) );
+
+150
+ `TS_FAIL
+Ð
+ `Com¶ex
+( 1.0, 0.0 ) );
+
+151
+ }
+}
+
+ @tools/cxxtest/test/TearDownWorldFails.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $\8b¬DownWÜld
+(è{ \15
+çl£
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+() {}
+
+25
+ }
+};
+
+ @tools/cxxtest/test/TearDownWorldThrows.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $\8b¬DownWÜld
+(è{
+throw
+
+this
+; }
+
+13
+ }
+};
+
+19 \18
+Fixtu»
+
+ gfixtu»
+;
+
+21 þas
+ cSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+23
+public
+:
+
+24 \1e
+ $\8b¡OÃ
+() {}
+
+25
+ }
+};
+
+ @tools/cxxtest/test/TestNonFinite.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+10 \b
+ gz\94o
+ = 0.0;
+
+12 þas
+ cTe¡NÚF\9a\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+14
+public
+:
+
+15 \1e
+ $\8b¡NaN
+() {
+
+16 \b
+Çn
+ = (1.0/
+z\94o
+ / (1.0/zero));
+
+17
+ `TS_ASSERT_EQUALS
+(
+Çn
+,nan);
+
+18
+ `TS_ASSERT_EQUALS
+(
+Çn
+,
+z\94o
+);
+
+20 \1e
+ $\8b¡PlusInf
+() {
+
+21 \b
+¶us_\9af
+ = -1.0/
+z\94o
+;
+
+22
+ `TS_ASSERT_EQUALS
+(-1.0/
+z\94o
+,
+¶us_\9af
+);
+
+23
+ `TS_ASSERT_EQUALS
+(3.0,
+¶us_\9af
+);
+
+24
+ }
+}
+
+25 \1e
+ $\8b¡M\9ausInf
+() {
+
+26 \b
+m\9aus_\9af
+ = 1.0/
+z\94o
+;
+
+27
+ `TS_ASSERT_EQUALS
+(1.0/
+z\94o
+,
+m\9aus_\9af
+);
+
+28
+ `TS_ASSERT_EQUALS
+(1.0/3.0,
+m\9aus_\9af
+);
+
+29
+ }
+}
+
+ @tools/cxxtest/test/ThrowNoStd.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cThrowNoStd
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+5
+public
+:
+
+6 \1e
+ $\8b¡ThrowNoStd
+()
+
+8
+ `TS_ASSERT_THROWS
+Ð{
+throw
+ 1; }, \12);
+
+10
+ }
+};
+
+ @tools/cxxtest/test/ThrowsAssert.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 þas
+ cTh\9ag
+
+
+5 \12
+ m_i
+;
+
+6
+ mpublic
+:
+
+7
+ $Th\9ag
+Ð\12
+¬gI
+ ) :
+ $_i
+(
+¬gI
+) {}
+
+8 \12
+ $i
+(ècÚ¡ { \15
+_i
+;
+ }
+}
+
+11 þas
+ cFa\9e
+
+
+13
+ mpublic
+:
+
+14
+boÞ
+
+ $Ý\94©Ü
+()Ð\12ècÚ¡ { \15
+çl£
+; }
+
+15
+boÞ
+
+ $Ý\94©Ü
+()Ð\12, \12ècÚ¡ { \15
+çl£
+;
+ }
+}
+
+18 þas
+ cThrowsAs£¹
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+20
+public
+:
+
+21 \1e
+ $\8b¡_TS_ASSERT_THROWS_EQUALS
+()
+
+23
+ `TS_ASSERT_THROWS_EQUALS
+Ð{
+throw
+ 1; }, \12
+i
+, i, 2 );
+
+24
+ `TS_ASSERT_THROWS_EQUALS
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,\81h\9ag.
+ `i
+(), 2 );
+
+27 \1e
+ $\8b¡_TS_ASSERT_THROWS_DIFFERS
+()
+
+29
+ `TS_ASSERT_THROWS_DIFFERS
+Ð{
+throw
+ 1; }, \12
+i
+, i, 1 );
+
+30
+ `TS_ASSERT_THROWS_DIFFERS
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,\81h\9ag.
+ `i
+(), 1 );
+
+31
+ }
+}
+
+33 \1e
+ $\8b¡_TS_ASSERT_THROWS_SAME_DATA
+()
+
+35
+ `TS_ASSERT_THROWS_SAME_DATA
+Ð{
+throw
+ "123"; }, cڡ \ 5*
+s
+, s, "456", 3 );
+
+36
+ }
+}
+
+38 \1e
+ $\8b¡_TS_ASSERT_THROWS_LESS_THAN
+()
+
+40
+ `TS_ASSERT_THROWS_LESS_THAN
+Ð{
+throw
+ 1; }, \12
+i
+, i, 1 );
+
+41
+ `TS_ASSERT_THROWS_LESS_THAN
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,\81h\9ag.
+ `i
+(), 1 );
+
+42
+ }
+}
+
+44 \1e
+ $\8b¡_TS_ASSERT_THROWS_LESS_THAN_EQUALS
+()
+
+46
+ `TS_ASSERT_THROWS_LESS_THAN_EQUALS
+Ð{
+throw
+ 1; }, \12
+i
+, i, 0 );
+
+47
+ `TS_ASSERT_THROWS_LESS_THAN_EQUALS
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,\81h\9ag.
+ `i
+(), 0 );
+
+48
+ }
+}
+
+50 \1e
+ $\8b¡_TS_ASSERT_THROWS_PREDICATE
+()
+
+52
+ `TS_ASSERT_THROWS_PREDICATE
+Ð{
+throw
+ 1; }, \12
+i
+,
+Fa\9e
+, i );
+
+53
+ `TS_ASSERT_THROWS_PREDICATE
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+Fa\9e
+,\81h\9ag.
+ `i
+() );
+
+54
+ }
+}
+
+56 \1e
+ $\8b¡_TS_ASSERT_THROWS_RELATION
+()
+
+58
+ `TS_ASSERT_THROWS_RELATION
+Ð{
+throw
+ 1; }, \12
+i
+,
+Fa\9e
+, i, 1 );
+
+59
+ `TS_ASSERT_THROWS_RELATION
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+Fa\9e
+,\81h\9ag.
+ `i
+(), 1 );
+
+60
+ }
+}
+
+62 \1e
+ $\8b¡_TS_ASSERT_THROWS_DELTA
+()
+
+64
+ `TS_ASSERT_THROWS_DELTA
+Ð{
+throw
+ 1; }, \12
+i
+, i, 3, 1 );
+
+65
+ `TS_ASSERT_THROWS_DELTA
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,\81h\9ag.
+ `i
+(), 3, 1 );
+
+66
+ }
+}
+
+68 \1e
+ $\8b¡_TS_ASSERT_THROWS_ASSERT
+()
+
+70
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+ 1; }, \12
+i
+,
+
+71
+ `TS_ASSERT_EQUALS
+Ð
+i
+, 2 ) );
+
+73
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+74
+ `TS_ASSERT_EQUALS
+Ð
+th\9ag
+.
+ `i
+(), 2 ) );
+
+76
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+77
+ `TS_FAIL
+Ð
+th\9ag
+.
+ `i
+() ) );
+
+79
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+80
+ `TS_ASSERT
+Ð
+th\9ag
+.
+ `i
+() - 1 ) );
+
+82 \ 5
+z\94o
+ = 0,
+Úe
+ = 1;
+
+83
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &,
+
+84
+ `TS_ASSERT_SAME_DATA
+Ð&
+z\94o
+, &
+Úe
+, \17(\ 5) ) );
+
+86
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+87
+ `TS_ASSERT_DELTA
+Ð
+th\9ag
+.
+ `i
+(), 5, 2 ) );
+
+89
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+90
+ `TS_ASSERT_DIFFERS
+Ð
+th\9ag
+.
+ `i
+(), 1 ) );
+
+92
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+93
+ `TS_ASSERT_LESS_THAN
+Ð
+th\9ag
+.
+ `i
+(), 1 ) );
+
+95
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+96
+ `TS_ASSERT_PREDICATE
+Ð
+Fa\9e
+,
+th\9ag
+.
+ `i
+() ) );
+
+98
+ `TS_ASSERT_THROWS_ASSERT
+Ð{
+throw
+
+ `Th\9ag
+Ð1 ); }, cÚ¡
+Th\9ag
+ &
+th\9ag
+,
+
+99
+ `TS_ASSERT_RELATION
+Ð
+Fa\9e
+,
+th\9ag
+.
+ `i
+(), 33 ) );
+
+100
+ }
+}
+
+ @tools/cxxtest/test/TraitsTest.h
+
+1 \ 1
+ #CXXTEST_HAVE_STD
+
+
+ )
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+8 þas
+ cT¿\99sTe¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+10
+public
+:
+
+11 \1e
+ $\8b¡IÁeg\94T¿\99s
+()
+
+13
+ `TS_FAIL
+( (\1d\ 5)1 );
+
+14
+ `TS_FAIL
+( (\ 5)0x0F );
+
+15
+ `TS_FAIL
+( (signed \16\12)-12 );
+
+16
+ `TS_FAIL
+( (\1d\16\12)34 );
+
+17
+ `TS_FAIL
+( (signed \12)-123 );
+
+18
+ `TS_FAIL
+( (\1d\12)456 );
+
+19
+ `TS_FAIL
+( (signed \13\12)-12345 );
+
+20
+ `TS_FAIL
+( (\1d\13\12)67890 );
+
+23 \1e
+ $\8b¡Flßt\9agPo\9atT¿\99s
+()
+
+25
+ `TS_FAIL
+( (\ e)0.12345678 );
+
+26
+ `TS_FAIL
+( (\b)0.12345678 );
+
+27
+ }
+}
+
+29 \1e
+ $\8b¡BoÞT¿\99s
+()
+
+31
+ `TS_FAIL
+Ð
+\8cue
+ );
+
+32
+ `TS_FAIL
+Ð
+çl£
+ );
+
+33
+ }
+}
+
+35 \1e
+ $\8b¡Ch¬T¿\99s
+()
+
+37
+ `TS_FAIL
+( 'A' );
+
+38
+ `TS_FAIL
+( '\x04' );
+
+39
+ `TS_FAIL
+( '\x1B' );
+
+40
+ `TS_FAIL
+( '\0' );
+
+41
+ `TS_FAIL
+( '\r' );
+
+42
+ `TS_FAIL
+( '\n' );
+
+43
+ `TS_FAIL
+( '\b' );
+
+44
+ `TS_FAIL
+( '\t' );
+
+45
+ `TS_FAIL
+( '\a' );
+
+46
+ `TS_FAIL
+( (\ 5)-5 );
+
+47
+ }
+}
+
+49 \1e
+ $\8b¡S\8c\9agT¿\99s
+()
+
+51
+ `TS_FAIL
+( "(char *) is displayed\87s-is\n" );
+
+52
+ }
+}
+
+54 \1e
+ $\8b¡StdS\8c\9agT¿\99s
+()
+
+56 \e
+ `CXXTEST_STD
+(
+ t¡r\9ag
+è
+ tS\8c\9ag
+;
+
+57
+ `TS_FAIL
+Ð
+ `S\8c\9ag
+( "std::string is displayed with \"\"" ) );
+
+58
+ `TS_FAIL
+Ð
+ `S\8c\9ag
+( "Escapes\rAre\rTranslated" ) );
+
+59
+ `TS_FAIL
+Ð
+ `S\8c\9ag
+( "As\87re unprintable chars: \x12\x34\x56\x78" ) );
+
+60
+ }
+}
+
+ @tools/cxxtest/test/Tsm.h
+
+1 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+7 þas
+ cTe¡Mes§geMaüos
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+9
+public
+:
+
+10 \1e
+ $\8b¡Mes§geMaüos
+()
+
+12 \12
+n
+ = 42;
+
+13 \ 5
+x
+ = 'x',
+y
+ = 'y';
+
+15
+ `TSM_ASSERT
+Ð"S\8c\9ag",
+çl£
+ );
+
+16
+ `TSM_ASSERT
+Ð
+n
+,
+çl£
+ );
+
+17
+ `TSM_ASSERT_EQUALS
+( "String", 2 + 2, 5 );
+
+18
+ `TSM_ASSERT_EQUALS
+Ð
+n
+, 2 + 2, 5 );
+
+19
+ `TSM_ASSERT_SAME_DATA
+Ð"S\8c\9ag", &
+x
+, &
+y
+, 1 );
+
+20
+ `TSM_ASSERT_SAME_DATA
+Ð
+n
+, &
+x
+, &
+y
+, 1 );
+
+21
+ `TSM_ASSERT_DELTA
+( "String", 1.0, 2.0, 0.5 );
+
+22
+ `TSM_ASSERT_DELTA
+( 42, 1.0, 2.0, 0.5 );
+
+23
+ `TSM_ASSERT_DIFFERS
+( "String", 0, 0 );
+
+24
+ `TSM_ASSERT_DIFFERS
+Ð
+n
+, 0, 0 );
+
+25
+ `TSM_ASSERT_LESS_THAN
+( "String", 2, 1 );
+
+26
+ `TSM_ASSERT_LESS_THAN
+Ð
+n
+, 2, 1 );
+
+27
+ `TSM_ASSERT_THROWS
+Ð"S\8c\9ag",
+ `throwNÙh\9ag
+(), \12);
+
+28
+ `TSM_ASSERT_THROWS
+Ð
+n
+,
+ `throwNÙh\9ag
+(), \12);
+
+29
+ `TSM_ASSERT_THROWS_ANYTHING
+Ð"S\8c\9ag",
+ `throwNÙh\9ag
+() );
+
+30
+ `TSM_ASSERT_THROWS_ANYTHING
+Ð
+n
+,
+ `throwNÙh\9ag
+() );
+
+31
+ `TSM_ASSERT_THROWS_NOTHING
+Ð"S\8c\9ag",
+ `throwIÁeg\94
+Ð
+n
+ ) );
+
+32
+ `TSM_ASSERT_THROWS_NOTHING
+Ð
+n
+,
+ `throwIÁeg\94
+(\82 ) );
+
+33
+ `TSM_ASSERT_THROWS_ASSERT
+Ð"S\8c\9ag",
+ `throwNÙh\9ag
+(), \12,
+ `TS_ASSERT
+Ð
+\8cue
+ ) );
+
+34
+ `TSM_ASSERT_THROWS_ASSERT
+Ð
+n
+,
+ `throwNÙh\9ag
+(), \12,
+ `TS_ASSERT
+Ð
+\8cue
+ ) );
+
+35
+ `TSM_ASSERT_THROWS_EQUALS
+Ð"S\8c\9ag",
+ `throwNÙh\9ag
+(), \12, 1, 1 );
+
+36
+ `TSM_ASSERT_THROWS_EQUALS
+Ð
+n
+,
+ `throwNÙh\9ag
+(), \12, 1, 1 );
+
+37
+ `TSM_ASSERT_THROWS_EQUALS
+Ð"S\8c\9ag",
+ `throwIÁeg\94
+Ð
+n
+ ), \12
+i
+, i, 43 );
+
+38
+ `TSM_ASSERT_THROWS_EQUALS
+Ð
+n
+,
+ `throwIÁeg\94
+ÐÀ), \12
+i
+, i, 43 );
+
+41 \1e
+ $throwNÙh\9ag
+()
+
+43
+ }
+}
+
+45 \1e
+ $throwIÁeg\94
+Ð\12
+i
+ )
+
+47
+throw
+
+i
+;
+
+48
+ }
+}
+
+51 #iâdeà
+_CXXTEST_HAVE_EH
+
+
+52 #\94rÜ
+cxx\8b¡g\92
+
+should
+
+have
+
+found
+
+exû±iÚ
+
+hªdl\9ag
+
+h\94e
+!
+
+ @tools/cxxtest/test/UserTraits.h
+
+14 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+15 \ 2
+ ~<¡dio.h
+>
+
+17
+Çme¥aû
+
+ gCxxTe¡
+
+
+19
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+20
+þass
+
+ gV®ueT¿\99s
+<\12>
+
+22 \ 5
+ g_asS\8c\9ag
+[128];
+
+23
+ gpublic
+:
+
+24
+V®ueT¿\99s
+Ð\12
+i
+ ) {
+¥r\9atf
+Ð
+_asS\8c\9ag
+, "0x%X", i ); }
+
+25 cڡ \ 5*
+asS\8c\9ag
+Ð\1eè{ \15
+ g_asS\8c\9ag
+; }
+
+29 þas
+ cTe¡U£rT¿\99s
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+31
+public
+:
+
+32 \1e
+ $\8b¡U£rT¿\99s
+()
+
+34
+ `TS_FAIL
+( 127 );
+
+36
+ }
+};
+
+ @tools/cxxtest/test/VoidTraits.h
+
+5 #ifdeà
+CXXTEST_RUNNING
+
+
+7 \ 2
+ ~<cxx\8b¡/V®ueT¿\99s.h
+>
+
+9
+Çme¥aû
+
+ gCxxTe¡
+
+
+11
+CXXTEST_TEMPLATE_INSTANTIATION
+
+
+12
+þass
+
+ gV®ueT¿\99s
+<\1e*>
+
+14
+ gpublic
+:
+
+15
+V®ueT¿\99s
+( \1e* ) {}
+
+16 cڡ \ 5*
+asS\8c\9ag
+( \1e) { \15 "(void *)"; }
+
+ @tools/cxxtest/test/WideCharTest.h
+
+1 \ 1
+ #CXXTEST_HAVE_STD
+
+
+ )
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+3 \ 2
+ ~<¡r\9ag
+>
+
+9 þas
+ cWideCh¬Te¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+11
+public
+:
+
+12 \1e
+ $\8b¡WideS\8c\9agT¿\99s
+()
+
+14
+ `TS_FAIL
+Ð
+¡d
+::
+basic_¡r\9ag
+<
+wch¬_t
+>Ð
+L
+"std::wstring is displayed with L\"\"" ) );
+
+15
+wch¬_t
+
+¬¿y
+[] = { (wchar_t)0x1234, (wchar_t)0x5678 };
+
+16
+ `TS_FAIL
+Ð
+¡d
+::
+basic_¡r\9ag
+<
+wch¬_t
+>Ð
+¬¿y
+, 2 ) );
+
+18
+ }
+};
+
+ @tools/cxxtest/test/WorldFixtures.h
+
+5 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+6 \ 2
+ ~<cxx\8b¡/Glob®Fixtu».h
+>
+
+7 \ 2
+ ~<¡dio.h
+>
+
+9 þas
+ cPr\9at\9agFixtu»
+ :
+public
+
+CxxTe¡
+::
+Glob®Fixtu»
+
+
+11
+public
+:
+
+12
+boÞ
+
+ $£tUpWÜld
+(è{
+ `´\9atf
+Ð"<wÜld>" ); \15
+\8cue
+; }
+
+13
+boÞ
+
+ $\8b¬DownWÜld
+(è{
+ `´\9atf
+Ð"</wÜld>" ); \15
+\8cue
+;
+ }
+}
+
+14
+boÞ
+
+ $£tUp
+(è{
+ `´\9atf
+Ð"<\8b¡>" ); \15
+\8cue
+;
+ }
+}
+
+15
+boÞ
+
+ $\8b¬Down
+(è{
+ `´\9atf
+Ð"</\8b¡>" ); \15
+\8cue
+;
+ }
+}
+
+22 \18
+Pr\9at\9agFixtu»
+
+ g´\9at\9agFixtu»
+;
+
+28 þas
+ cF\9c¡Su\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+30
+public
+:
+
+31 \1e
+ $\8b¡OÃ
+() {}
+
+32 \1e
+ $\8b¡Two
+(è{
+ }
+}
+
+35 þas
+ cSecÚdSu\99e
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+37
+public
+:
+
+38 \1e
+ $\8b¡OÃ
+() {}
+
+39 \1e
+ $\8b¡Two
+(è{
+ }
+}
+
+ @tools/cxxtest/test/anything.cpp
+
+3 \12
+ $ma\9a
+()
+
+6
+ }
+}
+
+ @tools/cxxtest/test/cxxtest/DummyGui.h
+
+1 #iâdeà
+__CXXTEST__DUMMYGUI_H
+
+
+2 \ 1
+ #__CXXTEST__DUMMYGUI_H
+
+
+ )
+
+9 \ 2
+ ~<cxx\8b¡/Gui.h
+>
+
+10 \ 2
+ ~<cxx\8b¡/Te¡RuÂ\94.h
+>
+
+11 \ 2
+ ~<cxx\8b¡/E¼ÜPr\9a\8br.h
+>
+
+13
+Çme¥aû
+
+ gCxxTe¡
+
+
+15 þas
+ cDummyGui
+ :
+public
+
+GuiLi¡\92\94
+
+
+17
+public
+:
+
+18 \1e
+guiEÁ\94WÜld
+Ð\1d
+numTÙ®Te¡s
+ )
+
+20 (
+CXXTEST_STD
+(
+cout
+è<< " {S\8f¹ " <<
+numTÙ®Te¡s
+ << "\81e¡s} ").
+æush
+();
+
+23 \1e
+guiEÁ\94Te¡
+ÐcÚ¡ \ 5*
+su\99eName
+, cڡ \ 5*
+\8b¡Name
+ )
+
+25 (
+CXXTEST_STD
+(
+cout
+è<< " {" <<
+ gsu\99eName
+ << "::" <<
+ g\8b¡Name
+ << "()} ").
+æush
+();
+
+28 \1e
+y\96lowB¬
+()
+
+30 (
+CXXTEST_STD
+(
+cout
+è<< " {Y\96low} ").
+æush
+();
+
+33 \1e
+»dB¬
+()
+
+35 (
+CXXTEST_STD
+(
+cout
+è<< " {Red} ").
+æush
+();
+
+38 \1e
+ËaveWÜld
+ÐcÚ¡
+WÜldDesü\9dtiÚ
+ & )
+
+40 (
+CXXTEST_STD
+(
+cout
+è<< " {StÝ} ").
+æush
+();
+
+ @tools/cxxtest/test/fake/X11/Xlib.h
+
+3 \19
+ sDi¥Ïy
+ {};
+
+4 \e\12
+ tW\9adow
+,
+ tCÞÜm
+,
+ tGC
+;
+
+5 \ecڡ \ 5*
+ tXID
+;
+
+6 \19
+ sXFÚtS\8cuù
+ { \12
+ masûÁ
+,
+ mdesûÁ
+; };
+
+7 \19
+ sSü\93n
+ {};
+
+8 \19
+ sXCÞÜ
+ { \12
+ mpix\96
+; };
+
+10 \92um {
+ mSucûss
+,
+ mExposu»Mask
+ };
+
+12
+\9al\9ae
+
+Di¥Ïy
+ *
+ $XO³nDi¥Ïy
+(\1e*è{ \15 0;
+ }
+}
+
+13
+\9al\9ae
+
+CÞÜm
+
+ $DeçuÉCÞÜm
+Ð
+Di¥Ïy
+ *, \12è{ \15 0;
+ }
+}
+
+14
+\9al\9ae
+ \1e
+ $XP¬£CÞÜ
+Ð
+Di¥Ïy
+ *,
+CÞÜm
+, cڡ \ 5*,
+XCÞÜ
+ * ) {
+ }
+}
+
+15
+\9al\9ae
+ \12
+ $XAÎocCÞÜ
+Ð
+Di¥Ïy
+ *,
+CÞÜm
+,
+XCÞÜ
+ *è{ \15 0;
+ }
+}
+
+16
+\9al\9ae
+
+W\9adow
+
+ $XC»©eSim¶eW\9adow
+Ð
+Di¥Ïy
+ *,
+W\9adow
+, \12, \12, \12, \12, \12, \12, \12è{ \15 0;
+ }
+}
+
+17
+\9al\9ae
+
+W\9adow
+
+ $RoÙW\9adow
+Ð
+Di¥Ïy
+ *, \12è{ \15 0;
+ }
+}
+
+18
+\9al\9ae
+
+GC
+
+ $XC»©eGC
+Ð
+Di¥Ïy
+ *,
+W\9adow
+, \12, \12è{ \15 0;
+ }
+}
+
+19
+\9al\9ae
+
+XID
+
+ $XLßdFÚt
+Ð
+Di¥Ïy
+ *, cڡ \ 5* ) { \15 0;
+ }
+}
+
+20
+\9al\9ae
+ \12
+ $XS\91FÚt
+Ð
+Di¥Ïy
+ *,
+GC
+,
+XID
+ ) { \15 0;
+ }
+}
+
+21
+\9al\9ae
+
+XID
+
+ $XGCڋxtFromGC
+Ð
+GC
+ ) { \15 0;
+ }
+}
+
+22
+\9al\9ae
+
+XFÚtS\8cuù
+ *
+ $XQu\94yFÚt
+Ð
+Di¥Ïy
+ *, cڡ \ 5* ) { \15 0;
+ }
+}
+
+23
+\9al\9ae
+ \12
+ $XF»eFÚtInfo
+Ð\ 5**,
+XFÚtS\8cuù
+ *, \12è{ \15 0;
+ }
+}
+
+24
+\9al\9ae
+ \12
+ $XS\96eùIÅut
+Ð
+Di¥Ïy
+ *,
+W\9adow
+, \12è{ \15 0;
+ }
+}
+
+25
+\9al\9ae
+ \12
+ $XMW\9adow
+Ð
+Di¥Ïy
+ *,
+W\9adow
+ ) { \15 0;
+ }
+}
+
+26
+\9al\9ae
+
+Sü\93n
+ *
+ $XDeçuÉSü\93nOfDi¥Ïy
+Ð
+Di¥Ïy
+ * ) { \15 0;
+ }
+}
+
+27
+\9al\9ae
+ \12
+ $WidthOfSü\93n
+Ð
+Sü\93n
+ * ) { \15 0;
+ }
+}
+
+28
+\9al\9ae
+ \12
+ $HeightOfSü\93n
+Ð
+Sü\93n
+ * ) { \15 0;
+ }
+}
+
+29
+\9al\9ae
+ \12
+ $XMoveResizeW\9adow
+Ð
+Di¥Ïy
+ *,
+W\9adow
+, \12, \12, \12, \12è{ \15 0;
+ }
+}
+
+31 \19
+ sXEv\92t
+ {};
+
+32
+\9al\9ae
+ \12
+ $XCheckMaskEv\92t
+Ð
+Di¥Ïy
+ *, \12,
+XEv\92t
+ * ) { \15 0;
+ }
+}
+
+33
+\9al\9ae
+ \12
+ $XS\91S\8fnd¬dPrÝ\94t\9bs
+Ð
+Di¥Ïy
+ *,
+W\9adow
+, cÚ¡ \ 5*, \12, \12, \12, \12, \12è{ \15 0;
+ }
+}
+
+35 \19
+ sXW\9adowA\89ribu\8bs
+ { \12
+ mwidth
+,
+ mheight
+; };
+
+36
+\9al\9ae
+ \12
+ $XG\91W\9adowA\89ribu\8bs
+Ð
+Di¥Ïy
+ *,
+W\9adow
+,
+XW\9adowA\89ribu\8bs
+ * ) { \15 0;
+ }
+}
+
+37
+\9al\9ae
+ \12
+ $XS\91FÜeground
+Ð
+Di¥Ïy
+ *,
+GC
+, \1d\13è{ \15 0;
+ }
+}
+
+38
+\9al\9ae
+ \12
+ $XS\91Background
+Ð
+Di¥Ïy
+ *,
+GC
+, \1d\13è{ \15 0;
+ }
+}
+
+39
+\9al\9ae
+ \12
+ $XF\9elReùªgË
+Ð
+Di¥Ïy
+ *,
+W\9adow
+,
+GC
+, \12, \12, \12, \12è{ \15 0;
+ }
+}
+
+40
+\9al\9ae
+ \12
+ $XD¿wL\9ae
+Ð
+Di¥Ïy
+ *,
+W\9adow
+,
+GC
+, \12, \12, \12, \12è{ \15 0;
+ }
+}
+
+41
+\9al\9ae
+ \12
+ $XD¿wS\8c\9ag
+Ð
+Di¥Ïy
+ *,
+W\9adow
+,
+GC
+, \12, \12, cÚ¡ \ 5*, \12è{ \15 0;
+ }
+}
+
+42
+\9al\9ae
+ \12
+ $XFlush
+Ð
+Di¥Ïy
+ * ) { \15 0;
+ }
+}
+
+43
+\9al\9ae
+ \12
+ $XF»eGC
+Ð
+Di¥Ïy
+ *,
+GC
+ ) { \15 0;
+ }
+}
+
+44
+\9al\9ae
+ \12
+ $XDe¡royW\9adow
+Ð
+Di¥Ïy
+ *,
+W\9adow
+ ) { \15 0;
+ }
+}
+
+45
+\9al\9ae
+ \12
+ $XClo£Di¥Ïy
+Ð
+Di¥Ïy
+ * ) { \15 0;
+ }
+}
+
+46
+\9al\9ae
+ \12
+ $XTextWidth
+Ð
+XFÚtS\8cuù
+ *, cÚ¡ \ 5*, \12è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/fake/X11/Xutil.h
+
+ @tools/cxxtest/test/fake/commctrl.h
+
+1 #iâdeà
+__FAKE__COMMCTRL_H__
+
+
+2 \ 1
+ #__FAKE__COMMCTRL_H__
+
+
+ )
+
+4 \ 2
+ ~<w\9adows.h
+>
+
+6 \ 1
+ #PROGRESS_CLASS
+
+ `TEXT
+("PROGRESS_CLASS")
+
+ )
+
+7 \ 1
+ #STATUSCLASSNAME
+
+ `TEXT
+("STATUSCLASSNAME")
+
+ )
+
+9 \92um {
+ mPBM_SETRANGE32
+,
+ mPBM_SETRANGE
+,
+ mPBM_SETPOS
+,
+ mPBM_SETSTEP
+,
+ mPBM_STEPIT
+,
+ mPBM_SETBARCOLOR
+,
+
+10
+ mSB_SETTEXTA
+,
+ mSB_SETPARTS
+,
+ mBS_AUTOCHECKBOX
+,
+ mBM_SETCHECK
+,
+ mBST_UNCHECKED
+,
+ mBM_GETCHECK
+,
+
+11
+ mBST_CHECKED
+,
+ mPBS_SMOOTH
+ };
+
+13 \ 1
+ #ICC_BAR_CLASSES
+ 1
+
+ )
+
+14 \ 1
+ #ICC_PROGRESS_CLASS
+ 2
+
+ )
+
+16 \19
+ sINITCOMMONCONTROLSEX
+
+
+18
+DWORD
+
+ mdwSize
+;
+
+19
+DWORD
+
+ mdwICC
+;
+
+22
+\9al\9ae
+ \1e
+ $In\99CommÚCÚ\8cÞs
+(è{
+ }
+}
+
+23
+\9al\9ae
+ \12
+ $In\99CommÚCÚ\8cÞsEx
+(
+INITCOMMONCONTROLSEX
+ *è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/fake/qapplication.h
+
+3
+þass
+
+ gQWidg\91
+;
+
+5 þas
+ cQAµliÿtiÚ
+
+
+7
+ mpublic
+:
+
+8
+ $QAµliÿtiÚ
+( \12&, \ 5** ) {}
+
+9 \1e
+ $exec
+(è{
+ }
+}
+
+10 \1e
+ $£tMa\9aWidg\91
+Ð\1e* ) {
+ }
+}
+
+11 \1e
+ $´oûssEv\92ts
+(è{
+ }
+}
+
+12 \18
+QWidg\91
+ *
+ $desktÝ
+(è{ \15 0;
+ }
+}
+
+13 \1e*
+ $aùiveW\9adow
+(è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/fake/qglobal.h
+
+2 \ 1
+ #QT_VERSION
+ 0x030000
+
+ )
+
+ @tools/cxxtest/test/fake/qlabel.h
+
+2 \ 2
+ ~<q¡r\9ag.h
+>
+
+3 \ 2
+ ~<qwidg\91.h
+>
+
+5 þas
+ cQLab\96
+
+
+7
+ mpublic
+:
+
+8
+ $QLab\96
+( \1e* ) {}
+
+9 \1e
+ $£tText
+ÐcÚ¡
+QS\8c\9ag
+ & ) {
+ }
+}
+
+ @tools/cxxtest/test/fake/qlayout.h
+
+3 þas
+ cQVBoxLayout
+
+
+5
+ mpublic
+:
+
+6
+ $QVBoxLayout
+( \1e* ) {}
+
+7 \1e
+ $addWidg\91
+Ð\1e* ) {
+ }
+}
+
+ @tools/cxxtest/test/fake/qmessagebox.h
+
+3 þas
+ cQMes§geBox
+
+
+5
+ mpublic
+:
+
+6 \f
+ eIcÚ
+ {
+InfÜm©iÚ
+,
+ mW¬n\9ag
+,
+ mCr\99iÿl
+ };
+
+7 \18\1e*
+ $¡ªd¬dIcÚ
+Ð
+IcÚ
+ ) { \15 0;
+ }
+}
+
+ @tools/cxxtest/test/fake/qpixmap.h
+
+ @tools/cxxtest/test/fake/qprogressbar.h
+
+3 þas
+ cQCÞÜGroup
+
+
+5
+ mpublic
+:
+
+6 \92um {
+Highlight
+ };
+
+9 þas
+ cQCÞÜ
+
+
+11
+ mpublic
+:
+
+12
+ $QCÞÜ
+( \12, \12, \12) {}
+
+13
+ }
+};
+
+15 þas
+ cQP®\91\8b
+
+
+17
+ mpublic
+:
+
+18 \1e
+ $£tCÞÜ
+Ð\12, cÚ¡
+QCÞÜ
+ & ) {}
+
+19
+ }
+};
+
+21 þas
+ cQProg»ssB¬
+
+
+23
+ mpublic
+:
+
+24
+ $QProg»ssB¬
+( \12, \1e* ) {}
+
+25 \1e
+ $£tProg»ss
+Ð\12è{
+ }
+}
+
+26 \12
+ $´og»ss
+(è{ \15 0;
+ }
+}
+
+27
+QP®\91\8b
+
+ $·Ë\89e
+(è{ \15
+ `QP®\91\8b
+();
+ }
+}
+
+28 \1e
+ $£tP®\91\8b
+ÐcÚ¡
+QP®\91\8b
+ & ) {
+ }
+}
+
+ @tools/cxxtest/test/fake/qstatusbar.h
+
+3 þas
+ cQS\8ftusB¬
+
+
+5
+ mpublic
+:
+
+6
+ $QS\8ftusB¬
+( \1e* ) {}
+
+7 \1e
+ $£tProg»ss
+(è{
+ }
+}
+
+8 \1e
+ $addWidg\91
+Ð\1e*, \12è{
+ }
+}
+
+9 \1e
+ $»moveWidg\91
+Ð\1e* ) {
+ }
+}
+
+ @tools/cxxtest/test/fake/qstring.h
+
+2 #iâdeà
+__FAKE__QSTRING_H
+
+
+3 \ 1
+ #__FAKE__QSTRING_H
+
+
+ )
+
+5 þas
+ cQS\8c\9ag
+
+
+7
+ mpublic
+:
+
+8
+ $QS\8c\9ag
+() {}
+
+9
+ $QS\8c\9ag
+ÐcÚ¡ \ 5* ) {
+ }
+}
+
+10
+boÞ
+
+Ý\94©Ü
+==ÐcÚ¡
+QS\8c\9ag
+ & ) { \15
+çl£
+; }
+
+12 \18
+QS\8c\9ag
+
+ $numb\94
+Ð\12è{ \15
+ `QS\8c\9ag
+();
+ }
+}
+
+15
+\9al\9ae
+
+QS\8c\9ag
+
+ gÝ\94©Ü
++ÐcÚ¡
+ gQS\8c\9ag
+ &, const QString & ) { \15 QString(); }
+
+ @tools/cxxtest/test/fake/qwidget.h
+
+2 #iâdeà
+__FAKE__QWIDGET_H
+
+
+3 \ 1
+ #__FAKE__QWIDGET_H
+
+
+ )
+
+5
+þass
+
+ gQS\8c\9ag
+;
+
+7 þas
+ cQWidg\91
+
+
+9
+ mpublic
+:
+
+10
+boÞ
+
+ $isM\9aimized
+(è{ \15
+çl£
+; }
+
+11 \1e
+ $þo£
+Ð
+boÞ
+ ) {
+ }
+}
+
+12 \1e
+ $showM\9aimized
+(è{
+ }
+}
+
+13 \1e
+ $showNÜm®
+(è{
+ }
+}
+
+14 \1e
+ $£tCtiÚ
+ÐcÚ¡
+QS\8c\9ag
+ & ) {
+ }
+}
+
+15 \1e
+ $£tIcÚ
+Ð\1e* ) {
+ }
+}
+
+16 \12
+ $x
+(è{ \15 0;
+ }
+}
+
+17 \12
+ $y
+(è{ \15 0;
+ }
+}
+
+18 \12
+ $width
+(è{ \15 0;
+ }
+}
+
+19 \12
+ $height
+(è{ \15 0;
+ }
+}
+
+20 \1e
+ $£tGeom\91ry
+Ð\12, \12, \12, \12è{
+ }
+}
+
+ @tools/cxxtest/test/fake/windows.h
+
+1 #iâdeà
+__FAKE__WINDOWS_H__
+
+
+2 \ 1
+ #__FAKE__WINDOWS_H__
+
+
+ )
+
+4 \ 2
+ ~<¡dio.h
+>
+
+6 \e\1d\ 5
+ tBYTE
+;
+
+7 \e\1d\16
+ tWORD
+;
+
+8 \e\1d\12
+ tUINT
+;
+
+9 \e\13
+ tLONG
+;
+
+10 \e\1d\13
+ tDWORD
+,
+ tULONG
+,
+ tLRESULT
+,
+ tLPARAM
+,
+ tWPARAM
+;
+
+12 \e\12
+ tBOOL
+;
+
+13 \92um {
+ mFALSE
+,
+ mTRUE
+ };
+
+15 \e\19
+ s_HANDLE
+ {} *
+ gHANDLE
+;
+
+16 \e\19
+ s_HBRUSH
+ {} *
+ gHBRUSH
+;
+
+17 \e\19
+ s_HCURSOR
+ {} *
+ gHCURSOR
+;
+
+18 \e\19
+ s_HEAP
+ {} *
+ gHEAP
+;
+
+19 \e\19
+ s_HICON
+ {} *
+ gHICON
+;
+
+20 \e\19
+ s_HINSTANCE
+ {} *
+ gHINSTANCE
+;
+
+21 \e\19
+ s_HMENU
+ {} *
+ gHMENU
+;
+
+22 \e\19
+ s_HMODULE
+ {} *
+ gHMODULE
+;
+
+23 \e\19
+ s_HWND
+ {} *
+ gHWND
+;
+
+25 \92um {
+ mINFINITE
+,
+ mCS_HREDRAW
+,
+ mCS_VREDRAW
+,
+ mCOLOR_WINDOW
+,
+ mGWL_USERDATA
+,
+ mHWND_TOP
+,
+ mSPI_GETWORKAREA
+,
+
+26
+ mWS_CHILD
+,
+ mWS_VISIBLE
+,
+ mSM_CYCAPTION
+,
+ mSM_CYFRAME
+,
+ mSM_CXSCREEN
+,
+ mSM_CYSCREEN
+,
+
+27
+ mSW_SHOWNORMAL
+,
+ mSW_MINIMIZE
+,
+ mWM_SIZE
+,
+ mWM_SETICON
+,
+ mICON_BIG
+,
+ mWS_OVERLAPPEDWINDOW
+,
+
+28
+ mWM_CREATE
+,
+ mWM_TIMER
+,
+ mWM_CLOSE
+,
+ mWM_DESTROY
+,
+ mWM_QUIT
+ };
+
+30 \e\1e*
+ tLPVOID
+;
+
+32 #ifdeà
+UNICODE
+
+
+33 \e
+wch¬_t
+
+ tTCHAR
+;
+
+34 \ 1
+ #TEXT
+(
+x
+è
+L
+##
+ )
+x
+
+36 \e\ 5
+ tTCHAR
+;
+
+37 \ 1
+ #TEXT
+(
+x
+è
+ )
+x
+
+40 \ecڡ
+ tTCHAR
+ *
+ tLPCTSTR
+;
+
+42 \e\ 5*
+ tLPSTR
+;
+
+43 \ecڡ \ 5*
+ tLPCSTR
+;
+
+44 \ 1
+ #IDI_INFORMATION
+
+ `TEXT
+("IDI_INFORMATION")
+
+ )
+
+45 \ 1
+ #IDI_WARNING
+
+ `TEXT
+("IDI_WARNING")
+
+ )
+
+46 \ 1
+ #IDI_ERROR
+
+ `TEXT
+("IDI_ERROR")
+
+ )
+
+48 \e\1e(*
+ tLPPROC
+)( \1e);
+
+50 \ 1
+ #WINAPI
+
+
+ )
+
+51 \ 1
+ #CALLBACK
+
+
+ )
+
+53 \19
+ sWNDCLASSEX
+
+
+55 \12
+cbSize
+;
+
+56 \12
+¡yË
+;
+
+57
+LRESULT
+
+ `CALLBACK
+ (*
+ÍâWndProc
+)Ð
+HWND
+,
+UINT
+,
+WPARAM
+,
+LPARAM
+ );
+
+58 \12
+cbClsEx\8ca
+;
+
+59 \12
+cbWndEx\8ca
+;
+
+60
+HINSTANCE
+
+hIn¡ªû
+;
+
+61
+HICON
+
+hIcÚ
+;
+
+62
+HCURSOR
+
+hCursÜ
+;
+
+63
+HBRUSH
+
+hbrBackground
+;
+
+64
+LPCTSTR
+
+ÍszM\92uName
+;
+
+65
+LPCTSTR
+
+ÍszCÏssName
+;
+
+66
+HICON
+
+hIcÚSm
+;
+
+69 \19
+ sRECT
+
+
+71
+LONG
+
+Ëá
+,
+right
+,
+tÝ
+,
+bÙtom
+;
+
+74 \19
+ sMSG
+
+
+80
+LPVOID
+
+ÍC»©eP¬ams
+;
+
+81 }
+ tCREATESTRUCT
+, *
+ tLPCREATESTRUCT
+;
+
+83
+\9al\9ae
+
+HANDLE
+
+ $C»©eEv\92t
+Ð
+LPVOID
+,
+BOOL
+, BOOL, LPVOID ) { \15 0;
+ }
+}
+
+84
+\9al\9ae
+
+HANDLE
+
+C»©eTh»ad
+Ð
+LPVOID
+, \12,
+DWORD
+
+ $WINAPI
+ (*)Ð
+LPVOID
+ ), LPVOID, \12, LPVOID ) { \15 0;
+ }
+}
+
+85
+\9al\9ae
+ \12
+ $Wa\99FÜS\9agËObjeù
+Ð
+HANDLE
+, \12è{ \15 0;
+ }
+}
+
+86
+\9al\9ae
+ \12
+ $Regi¡\94CÏssEx
+Ð
+WNDCLASSEX
+ * ) { \15 0;
+ }
+}
+
+87
+\9al\9ae
+ \12
+ $S\91W\9adowLÚg
+Ð
+HWND
+, \12,
+LONG
+ ) { \15 0;
+ }
+}
+
+88
+\9al\9ae
+
+LPARAM
+
+ $MAKELPARAM
+Ð\1d\16, \1d\16è{ \15 0;
+ }
+}
+
+89
+\9al\9ae
+
+HWND
+
+ $C»©eW\9adow
+Ð
+LPCTSTR
+,
+LPVOID
+,
+DWORD
+, \12, \12, \12, \12,
+HWND
+,
+HMENU
+,
+HINSTANCE
+, LPVOID ) { \15 0;
+ }
+}
+
+90
+\9al\9ae
+
+LRESULT
+
+ $S\92dMes§ge
+Ð
+HWND
+,
+UINT
+,
+WPARAM
+,
+LPARAM
+ ) { \15 0;
+ }
+}
+
+91
+\9al\9ae
+
+LONG
+
+ $G\91Sy¡emM\91rics
+Ð\12è{ \15 0;
+ }
+}
+
+92
+\9al\9ae
+ \12
+ $S\91W\9adowPos
+Ð
+HWND
+, \12,
+LONG
+, LONG, LONG, LONG, \12è{ \15 0;
+ }
+}
+
+93
+\9al\9ae
+ \12
+ $Sy¡emP¬am\91\94sInfo
+Ð\12, \12,
+LPVOID
+, \12è{ \15 0;
+ }
+}
+
+94
+\9al\9ae
+ \12
+ $ShowW\9adow
+Ð
+HWND
+, \12è{ \15 0;
+ }
+}
+
+95
+\9al\9ae
+ \12
+ $Upd©eW\9adow
+Ð
+HWND
+ ) { \15 0;
+ }
+}
+
+96
+\9al\9ae
+ \12
+ $S\91Ev\92t
+Ð
+HANDLE
+ ) { \15 0;
+ }
+}
+
+97
+\9al\9ae
+
+BOOL
+
+ $G\91Mes§ge
+Ð
+MSG
+ *,
+LPVOID
+, \12, \12è{ \15
+FALSE
+;
+ }
+}
+
+98
+\9al\9ae
+ \12
+ $Di¥©chMes§ge
+Ð
+MSG
+ * ) { \15 0;
+ }
+}
+
+99
+\9al\9ae
+ \12
+ $G\91Cl\9bÁReù
+Ð
+HWND
+,
+RECT
+ * ) { \15 0;
+ }
+}
+
+100
+\9al\9ae
+
+HICON
+
+ $LßdIcÚ
+Ð
+HINSTANCE
+,
+LPCTSTR
+ ) { \15 0;
+ }
+}
+
+101
+\9al\9ae
+ \1d
+ $l¡¾\92A
+Ð
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+102
+\9al\9ae
+ \12
+ $l¡rcmpA
+Ð
+LPCSTR
+, LPCSTR ) { \15 0;
+ }
+}
+
+103
+\9al\9ae
+ \12
+ $l¡rýyA
+Ð
+LPSTR
+,
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+104
+\9al\9ae
+ \12
+ $l¡rÿtA
+Ð
+LPSTR
+,
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+105 \ 1
+ #w¥r\9atfA
+
+¥r\9atf
+
+
+ )
+
+106
+\9al\9ae
+ \12
+ $S\91W\9adowTextA
+Ð
+HWND
+,
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+107
+\9al\9ae
+
+LPVOID
+
+ $H\97pAÎoc
+Ð
+HEAP
+, \12,
+ULONG
+ ) { \15 0;
+ }
+}
+
+108
+\9al\9ae
+
+HEAP
+
+ $G\91ProûssH\97p
+(è{ \15 0;
+ }
+}
+
+109
+\9al\9ae
+ \12
+ $H\97pF»e
+Ð
+HEAP
+, \12,
+LPVOID
+ ) { \15 0;
+ }
+}
+
+110
+\9al\9ae
+ \12
+ $De¡royW\9adow
+Ð
+HWND
+ ) { \15 0;
+ }
+}
+
+111
+\9al\9ae
+
+LONG
+
+ $G\91W\9adowLÚg
+Ð
+HWND
+, \12è{ \15 0;
+ }
+}
+
+112
+\9al\9ae
+
+LRESULT
+
+CALLBACK
+
+ $DefW\9adowProc
+Ð
+HWND
+,
+UINT
+,
+WPARAM
+,
+LPARAM
+ ) { \15 0;
+ }
+}
+
+113
+\9al\9ae
+
+HMODULE
+
+ $LßdLib¿ryA
+Ð
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+114
+\9al\9ae
+
+LPPROC
+
+ $G\91ProcAdd»ss
+Ð
+HMODULE
+,
+LPCSTR
+ ) { \15 0;
+ }
+}
+
+115
+\9al\9ae
+ \12
+ $S\91Tim\94
+Ð
+HWND
+, \1d, \1d, \1dè{ \15 0;
+ }
+}
+
+116
+\9al\9ae
+ \12
+ $K\9elTim\94
+Ð
+HWND
+, \1dè{ \15 0;
+ }
+}
+
+117
+\9al\9ae
+
+DWORD
+
+ $G\91TickCouÁ
+(è{ \15 0;
+ }
+}
+
+118
+\9al\9ae
+ \12
+ $Ex\99Proûss
+Ð\12è{ \15 0;
+ }
+}
+
+119
+\9al\9ae
+
+boÞ
+
+ $IsIcÚic
+Ð
+HWND
+ ) { \15 0;
+ }
+}
+
+120
+\9al\9ae
+
+HWND
+
+ $G\91FÜegroundW\9adow
+(è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/int64.cpp
+
+4 \12
+ $ma\9a
+()
+
+6
+__\9at64
+
+Î
+ = 0;
+
+7 \15 (\12)
+Î
+;
+
+8
+ }
+}
+
+ @tools/cxxtest/test/longlong.cpp
+
+4 \12
+ $ma\9a
+()
+
+6 \13\13
+Î
+ = 0;
+
+7 \15 (\12)
+Î
+;
+
+8
+ }
+}
+
+ @tools/cxxtest/test/main.cpp
+
+1 \ 2
+ ~<cxx\8b¡/Te¡RuÂ\94.h
+>
+
+2 \ 2
+ ~<cxx\8b¡/Te¡Li¡\92\94.h
+>
+
+3 \ 2
+ ~<¡dio.h
+>
+
+11
+us\9ag
+
+Çme¥aû
+
+ gCxxTe¡
+;
+
+13 þas
+ cSumm¬yPr\9a\8br
+ :
+public
+
+CxxTe¡
+::
+Te¡Li¡\92\94
+
+
+15
+public
+:
+
+16 \1e
+ $run
+()
+
+18
+CxxTe¡
+::
+Te¡RuÂ\94
+::
+ `runAÎTe¡s
+Ð*
+this
+ );
+
+21 \1e
+ `ËaveWÜld
+ÐcÚ¡
+CxxTe¡
+::
+WÜldDesü\9dtiÚ
+ &
+wd
+ )
+
+23
+ `´\9atf
+Ð"Numb\94 oàsu\99es: %u\n",
+wd
+.
+ `numSu\99es
+() );
+
+24
+ `´\9atf
+Ð"Numb\94 oà\8b¡s: %u\n",
+wd
+.
+ `numTÙ®Te¡s
+() );
+
+25
+ `´\9atf
+Ð"Numb\94 oàç\9eed\81e¡s: %u\n",
+Te¡T¿ck\94
+::
+ `\8cack\94
+().
+ `ç\9eedTe¡s
+() );
+
+26
+ }
+}
+
+29 \12
+ $ma\9a
+()
+
+31
+ `Summ¬yPr\9a\8br
+().
+ `run
+();
+
+33
+ }
+}
+
+ @tools/cxxtest/test/stpltpl.cpp
+
+1 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+3 #ifdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+4 \12
+ $ma\9a
+(è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/tpltpl.cpp
+
+1 \ 2
+ ~<cxx\8b¡/FÏgs.h
+>
+
+3 #iâdeà
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+
+4
+ g\8bm¶©e
+<
+þass
+
+ gT
+> cÏs
+ cX
+ {}
+ gx
+;
+
+5
+ g\8bm¶©e
+<
+þass
+
+ gT
+, cÏs
+ gU
+> cÏs
+ cPa\9c
+ {}
+ gp
+;
+
+6
+ g\8bm¶©e
+<
+þass
+
+ gT
+, cÏs
+ gU
+> cÏs
+ gX
+<
+ gPa\9c
+<T, U> > {}
+ gxp
+;
+
+8 \12
+ $ma\9a
+(è{ \15 0;
+ }
+}
+
+ @tools/cxxtest/test/unit/LinkedList_test.t.h
+
+1 #iâdeà
+LINKEDLIST_TEST_H
+
+
+2 \ 1
+ #LINKEDLIST_TEST_H
+
+
+ )
+
+4 \ 2
+ ~<cxx\8b¡/L\9akedLi¡.h
+>
+
+6 þas
+ cTe¡L\9ak
+ :
+public
+
+CxxTe¡
+::
+L\9ak
+
+
+8
+public
+:
+
+9
+boÞ
+
+ $£tUp
+(è{ \15
+\8cue
+; }
+
+10
+boÞ
+
+ $\8b¬Down
+(è{ \15
+\8cue
+;
+ }
+}
+
+13 \ 2
+ ~<cxx\8b¡/Te¡Su\99e.h
+>
+
+14 þas
+ cL\9akedLi¡_\8b¡
+ :
+public
+
+CxxTe¡
+::
+Te¡Su\99e
+
+
+16
+public
+:
+
+17 \1e
+ $\8b¡_\9a\99\9flize
+()
+
+19
+CxxTe¡
+::
+Li¡
+
+li¡
+;
+
+20
+li¡
+.
+ `\9a\99\9flize
+();
+
+21
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)0,
+li¡
+.
+ `h\97d
+());
+
+22
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)0,
+li¡
+.
+ `\8f\9e
+());
+
+23
+ `TS_ASSERT_EQUALS
+(0,
+li¡
+.
+ `size
+());
+
+24
+ `TS_ASSERT
+(
+li¡
+.
+ `em±y
+());
+
+27 \1e
+ $\8b¡_©\8fch
+()
+
+29
+CxxTe¡
+::
+Li¡
+
+li¡
+;
+
+30
+Te¡L\9ak
+
+l\9ak
+;
+
+32
+li¡
+.
+ `\9a\99\9flize
+();
+
+33
+l\9ak
+.
+ `©\8fch
+(
+li¡
+);
+
+35
+ `TS_ASSERT_EQUALS
+(1,
+li¡
+.
+ `size
+());
+
+36
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)&
+l\9ak
+,
+li¡
+.
+ `h\97d
+());
+
+37
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)&
+l\9ak
+,
+li¡
+.
+ `\8f\9e
+());
+
+38
+ }
+}
+
+40 \1e
+ $\8b¡_d\91ach
+()
+
+42
+CxxTe¡
+::
+Li¡
+
+li¡
+;
+
+43
+Te¡L\9ak
+
+l\9ak
+;
+
+45
+li¡
+.
+ `\9a\99\9flize
+();
+
+46
+l\9ak
+.
+ `©\8fch
+(
+li¡
+);
+
+47
+l\9ak
+.
+ `d\91ach
+(
+li¡
+);
+
+49
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)0,
+li¡
+.
+ `h\97d
+());
+
+50
+ `TS_ASSERT_EQUALS
+((
+CxxTe¡
+::
+L\9ak
+*)0,
+li¡
+.
+ `\8f\9e
+());
+
+51
+ `TS_ASSERT_EQUALS
+(0,
+li¡
+.
+ `size
+());
+
+52
+ `TS_ASSERT
+(
+li¡
+.
+ `em±y
+());
+
+53
+ }
+}
+
+ @tools/cxxtest/test/wchar.cpp
+
+4 \ 2
+ ~<¡r\9ag
+>
+
+6 \12
+ $ma\9a
+()
+
+8
+¡d
+::
+basic_¡r\9ag
+<
+wch¬_t
+>
+ `s
+(
+L
+"s");
+
+10
+ }
+}
+
+ @
+1
+.
+0
+194
+7883
+source/cork.cpp
+source/cork.h
+tests/source/main.h
+tools/cxxtest/build_tools/SCons/test/empty_source_list/requirement.hpp
+tools/cxxtest/build_tools/SCons/test/empty_source_list/test_bar.t.h
+tools/cxxtest/build_tools/SCons/test/empty_source_list/test_foo.t.h
+tools/cxxtest/build_tools/SCons/test/globbing/src/requirement.cpp
+tools/cxxtest/build_tools/SCons/test/globbing/src/requirement.h
+tools/cxxtest/build_tools/SCons/test/globbing/src/test_bar.t.h
+tools/cxxtest/build_tools/SCons/test/globbing/src/test_foo.t.h
+tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hello.cc
+tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hello.hh
+tools/cxxtest/build_tools/SCons/test/globbing_edmundo/hellotest.t.h
+tools/cxxtest/build_tools/SCons/test/globbing_edmundo/main.cpp
+tools/cxxtest/build_tools/SCons/test/include_CCFLAGS/src/not-with-pedantic.h
+tools/cxxtest/build_tools/SCons/test/include_CCFLAGS/src/only_with_ansi.t.h
+tools/cxxtest/build_tools/SCons/test/include_CXXFLAGS/src/not-with-pedantic.h
+tools/cxxtest/build_tools/SCons/test/multifile_tests/src/requirement.cpp
+tools/cxxtest/build_tools/SCons/test/multifile_tests/src/requirement.h
+tools/cxxtest/build_tools/SCons/test/multifile_tests/src/test_bar.t.h
+tools/cxxtest/build_tools/SCons/test/multifile_tests/src/test_foo.t.h
+tools/cxxtest/build_tools/SCons/test/need_cpppath/src/cpppath.t.h
+tools/cxxtest/build_tools/SCons/test/need_cpppath/src/cpppathdir/include.h
+tools/cxxtest/build_tools/SCons/test/printer_propagation/cxxtest/CrazyRunner.h
+tools/cxxtest/build_tools/SCons/test/printer_propagation/src/failtest.t.h
+tools/cxxtest/build_tools/SCons/test/recursive_sources/src/requirement.cpp
+tools/cxxtest/build_tools/SCons/test/recursive_sources/src/requirement.h
+tools/cxxtest/build_tools/SCons/test/recursive_sources/src/test_bar.t.h
+tools/cxxtest/build_tools/SCons/test/recursive_sources/src/test_foo.t.h
+tools/cxxtest/build_tools/SCons/test/string_cpppath/src/cpppath.t.h
+tools/cxxtest/build_tools/SCons/test/string_cpppath/src/cpppathdir/include.h
+tools/cxxtest/build_tools/SCons/test/target_syntax/src/cpppath.t.h
+tools/cxxtest/build_tools/SCons/test/target_syntax/src/cpppathdir/include.h
+tools/cxxtest/cxxtest/Descriptions.cpp
+tools/cxxtest/cxxtest/Descriptions.h
+tools/cxxtest/cxxtest/DummyDescriptions.cpp
+tools/cxxtest/cxxtest/DummyDescriptions.h
+tools/cxxtest/cxxtest/ErrorFormatter.h
+tools/cxxtest/cxxtest/ErrorPrinter.h
+tools/cxxtest/cxxtest/Flags.h
+tools/cxxtest/cxxtest/GlobalFixture.cpp
+tools/cxxtest/cxxtest/GlobalFixture.h
+tools/cxxtest/cxxtest/Gui.h
+tools/cxxtest/cxxtest/LinkedList.cpp
+tools/cxxtest/cxxtest/LinkedList.h
+tools/cxxtest/cxxtest/Mock.h
+tools/cxxtest/cxxtest/ParenPrinter.h
+tools/cxxtest/cxxtest/QtGui.h
+tools/cxxtest/cxxtest/RealDescriptions.cpp
+tools/cxxtest/cxxtest/RealDescriptions.h
+tools/cxxtest/cxxtest/Root.cpp
+tools/cxxtest/cxxtest/SelfTest.h
+tools/cxxtest/cxxtest/StdHeaders.h
+tools/cxxtest/cxxtest/StdTestSuite.h
+tools/cxxtest/cxxtest/StdValueTraits.h
+tools/cxxtest/cxxtest/StdioFilePrinter.h
+tools/cxxtest/cxxtest/StdioPrinter.h
+tools/cxxtest/cxxtest/TeeListener.h
+tools/cxxtest/cxxtest/TestListener.h
+tools/cxxtest/cxxtest/TestMain.h
+tools/cxxtest/cxxtest/TestRunner.h
+tools/cxxtest/cxxtest/TestSuite.cpp
+tools/cxxtest/cxxtest/TestSuite.h
+tools/cxxtest/cxxtest/TestTracker.cpp
+tools/cxxtest/cxxtest/TestTracker.h
+tools/cxxtest/cxxtest/ValueTraits.cpp
+tools/cxxtest/cxxtest/ValueTraits.h
+tools/cxxtest/cxxtest/Win32Gui.h
+tools/cxxtest/cxxtest/X11Gui.h
+tools/cxxtest/cxxtest/XUnitPrinter.h
+tools/cxxtest/cxxtest/XmlFormatter.h
+tools/cxxtest/cxxtest/XmlPrinter.h
+tools/cxxtest/cxxtest/YesNoRunner.h
+tools/cxxtest/doc/examples/Assertions.h
+tools/cxxtest/doc/examples/BadTestSuite1.h
+tools/cxxtest/doc/examples/MockTestSuite.h
+tools/cxxtest/doc/examples/MyClass.h
+tools/cxxtest/doc/examples/MyTestSuite1.h
+tools/cxxtest/doc/examples/MyTestSuite10.h
+tools/cxxtest/doc/examples/MyTestSuite11.h
+tools/cxxtest/doc/examples/MyTestSuite2.h
+tools/cxxtest/doc/examples/MyTestSuite3.h
+tools/cxxtest/doc/examples/MyTestSuite4.h
+tools/cxxtest/doc/examples/MyTestSuite5.h
+tools/cxxtest/doc/examples/MyTestSuite6.h
+tools/cxxtest/doc/examples/MyTestSuite7.h
+tools/cxxtest/doc/examples/MyTestSuite8.h
+tools/cxxtest/doc/examples/MyTestSuite9.h
+tools/cxxtest/doc/examples/TMyClass.h
+tools/cxxtest/doc/examples/rand_example.cpp
+tools/cxxtest/doc/examples/time_mock.cpp
+tools/cxxtest/doc/examples/time_mock.h
+tools/cxxtest/doc/examples/time_real.cpp
+tools/cxxtest/sample/CreatedTest.h
+tools/cxxtest/sample/DeltaTest.h
+tools/cxxtest/sample/EnumTraits.h
+tools/cxxtest/sample/ExceptionTest.h
+tools/cxxtest/sample/FixtureTest.h
+tools/cxxtest/sample/MessageTest.h
+tools/cxxtest/sample/SCons/include/stack.h
+tools/cxxtest/sample/SCons/src/stack.c
+tools/cxxtest/sample/SCons/tests/stack_test.h
+tools/cxxtest/sample/SimpleTest.h
+tools/cxxtest/sample/TraitsTest.h
+tools/cxxtest/sample/gui/GreenYellowRed.h
+tools/cxxtest/sample/mock/Dice.cpp
+tools/cxxtest/sample/mock/Dice.h
+tools/cxxtest/sample/mock/MockStdlib.h
+tools/cxxtest/sample/mock/T/stdlib.h
+tools/cxxtest/sample/mock/TestDice.h
+tools/cxxtest/sample/mock/mock_stdlib.cpp
+tools/cxxtest/sample/mock/real_stdlib.cpp
+tools/cxxtest/sample/mock/roll.cpp
+tools/cxxtest/sample/yes_no_runner.cpp
+tools/cxxtest/test/AborterNoThrow.h
+tools/cxxtest/test/BadTest.h
+tools/cxxtest/test/Comments.h
+tools/cxxtest/test/Comments2.h
+tools/cxxtest/test/CppTemplateTest.h
+tools/cxxtest/test/DeepAbort.h
+tools/cxxtest/test/DefaultAbort.h
+tools/cxxtest/test/DefaultTraits.h
+tools/cxxtest/test/DoubleCall.h
+tools/cxxtest/test/DynamicAbort.h
+tools/cxxtest/test/DynamicMax.h
+tools/cxxtest/test/EmptySuite.h
+tools/cxxtest/test/Exceptions.h
+tools/cxxtest/test/Factor.h
+tools/cxxtest/test/ForceNoEh.h
+tools/cxxtest/test/GfSetUpFails.h
+tools/cxxtest/test/GfSetUpThrows.h
+tools/cxxtest/test/GfTearDownFails.h
+tools/cxxtest/test/GfTearDownThrows.h
+tools/cxxtest/test/GlobalFixtures.h
+tools/cxxtest/test/GoodSuite.h
+tools/cxxtest/test/GuiWait.h
+tools/cxxtest/test/HaveStd.h
+tools/cxxtest/test/IncludeTest.h
+tools/cxxtest/test/InheritedTest.h
+tools/cxxtest/test/Int64.h
+tools/cxxtest/test/LessThanEquals.h
+tools/cxxtest/test/LongLong.h
+tools/cxxtest/test/LongTraits.h
+tools/cxxtest/test/MaxDump.h
+tools/cxxtest/test/MockTest.h
+tools/cxxtest/test/NoEh.h
+tools/cxxtest/test/Part1.h
+tools/cxxtest/test/Part2.h
+tools/cxxtest/test/Relation.h
+tools/cxxtest/test/SameData.h
+tools/cxxtest/test/SameFiles.h
+tools/cxxtest/test/SameFilesLonger.h
+tools/cxxtest/test/SameZero.h
+tools/cxxtest/test/SetUpWorldError.h
+tools/cxxtest/test/SetUpWorldFails.h
+tools/cxxtest/test/SetUpWorldThrows.h
+tools/cxxtest/test/SimpleInheritedTest.h
+tools/cxxtest/test/SimpleInheritedTest2.h
+tools/cxxtest/test/Something.h
+tools/cxxtest/test/StlTraits.h
+tools/cxxtest/test/TearDownWorldFails.h
+tools/cxxtest/test/TearDownWorldThrows.h
+tools/cxxtest/test/TestNonFinite.h
+tools/cxxtest/test/ThrowNoStd.h
+tools/cxxtest/test/ThrowsAssert.h
+tools/cxxtest/test/TraitsTest.h
+tools/cxxtest/test/Tsm.h
+tools/cxxtest/test/UserTraits.h
+tools/cxxtest/test/VoidTraits.h
+tools/cxxtest/test/WideCharTest.h
+tools/cxxtest/test/WorldFixtures.h
+tools/cxxtest/test/anything.cpp
+tools/cxxtest/test/cxxtest/DummyGui.h
+tools/cxxtest/test/fake/X11/Xlib.h
+tools/cxxtest/test/fake/X11/Xutil.h
+tools/cxxtest/test/fake/commctrl.h
+tools/cxxtest/test/fake/qapplication.h
+tools/cxxtest/test/fake/qglobal.h
+tools/cxxtest/test/fake/qlabel.h
+tools/cxxtest/test/fake/qlayout.h
+tools/cxxtest/test/fake/qmessagebox.h
+tools/cxxtest/test/fake/qpixmap.h
+tools/cxxtest/test/fake/qprogressbar.h
+tools/cxxtest/test/fake/qstatusbar.h
+tools/cxxtest/test/fake/qstring.h
+tools/cxxtest/test/fake/qwidget.h
+tools/cxxtest/test/fake/windows.h
+tools/cxxtest/test/int64.cpp
+tools/cxxtest/test/longlong.cpp
+tools/cxxtest/test/main.cpp
+tools/cxxtest/test/stpltpl.cpp
+tools/cxxtest/test/tpltpl.cpp
+tools/cxxtest/test/unit/LinkedList_test.t.h
+tools/cxxtest/test/wchar.cpp
--- /dev/null
+"------------------------------------------------------------------------------
+" Global Config Variables
+"------------------------------------------------------------------------------
+let g:ProjectPath = getcwd()
+let g:TestSrcPath = g:ProjectPath . "/tests"
+let g:CScopeDir = g:ProjectPath
+let g:CTagsFile = g:CScopeDir . "/tags"
+
+"------------------------------------------------------------------------------
+" Global Config Variables
+"------------------------------------------------------------------------------
+" Connect to CScope
+function! ConnectCScope()
+ set nocscopeverbose " suppress 'duplicate connection' error
+ silent! exec "cs add " . g:CScopeDir. "/cscope.out" . " " . g:CScopeDir . " -C"
+ set cscopeverbose
+endfunction
+
+" Connect to the Correct CTags File
+function! ConnectCTags()
+ execute("set tags=" . g:CTagsFile)
+endfunction
+
+" Update the CScope Database
+function! RefreshCScope()
+ if strlen(g:CScopeDir)
+ set nocscopeverbose
+ execute('cscope kill -1')
+ execute('cd ' . g:CScopeDir)
+ execute('silent ! cscope -Rb')
+ call ConnectCScope()
+ execute('cd ' . g:ProjectPath)
+ endif
+endfunction
+
+" Update the CTags File
+function! RefreshCTags()
+ if strlen(g:CScopeDir)
+ execute('cd ' . g:CScopeDir)
+ execute('silent ! ctags -R *')
+ execute('cd ' . g:ProjectPath)
+ endif
+endfunction
+
+"------------------------------------------------------------------------------
+" Project Specific Key Mappings
+"------------------------------------------------------------------------------
+map <F2> <ESC>:call RefreshCTags()<CR>:call RefreshCScope()<CR>
+map <F3> <ESC>:call RefreshCTags()<CR>
+map <F4> <ESC>:call RefreshCScope()<CR>
+map <F6> <ESC>:execute("find " . g:TestSrcPath . "/**/test_" . expand("%:t:r") . ".c")<CR>
+
+"------------------------------------------------------------------------------
+" Project Specific Key Mappings
+"------------------------------------------------------------------------------
+" Gentex style code formatting
+if( (&ft == "c") || (&ft == "cpp") )
+ setlocal cindent
+ setlocal cino==1s:1s(1s
+endif
+
+"------------------------------------------------------------------------------
+" Connect To CTags and CScope
+"------------------------------------------------------------------------------
+call ConnectCScope()
+call ConnectCTags()
--- /dev/null
+include Rake::DSL
+require 'tools/rake_utils/library.rb'
+require 'tools/rake_utils/tests.rb'
+
+#------------------------------------------------------------------------------
+# Configuration Objects
+#------------------------------------------------------------------------------
+# Configuration for the static library
+CorkStatic = Library.new({
+ :name => 'libcork.a',
+ :compiler_options => [ '-c', '-Wall', '-Werror', '-o' ],
+ :source_files => [ 'source/**/*.c*' ],
+ :include_dirs => [ 'source/**/' ],
+})
+CorkStatic.setup_default_rake_tasks()
+
+# Configuration for the shared library
+CorkShared = Library.new({
+ :name => 'libcork.so',
+ :compiler_options => [ '-c', '-Wall', '-Werror', '-fPIC', '-o' ],
+ :linker_bin => 'c++',
+ :linker_options => ['-shared', '-o'],
+ :source_files => [ 'source/**/*.c*' ],
+ :include_dirs => [ 'source/**/' ],
+})
+CorkShared.setup_default_rake_tasks()
+
+# Configuration for the unit tests
+UnitTest = Tests.new({
+ :test_files => [ 'tests/source/**.h' ],
+})
+UnitTest.setup_default_rake_tasks()
+
+#------------------------------------------------------------------------------
+# Rake Tasks
+#------------------------------------------------------------------------------
+desc 'Execute a complete build including unit tests and binary'
+task :default => [ :release ]
+
+desc 'Build and link the static library'
+task :release => [ CorkStatic.name(), CorkShared.name() ]
+
+desc 'Display build configuration info'
+task :config do
+ puts 'Static Library Configuration'
+ puts '----------------------------'
+ puts CorkStatic
+ puts ''
+ puts 'Shared Library Configuration'
+ puts '----------------------------'
+ puts CorkShared
+ puts ''
+ puts 'Unit Test Configuration'
+ puts '-----------------------'
+ puts UnitTest
+end
+
--- /dev/null
+#include "cork.h"
+
+// We want to use the real malloc and free in this file
+#undef malloc
+#undef free
+
+#include <iostream>
+#include <exception> // for std::bad_alloc
+#include <cstdlib> // for malloc() and free()
+#include <string.h>
+
+// Set the namespace
+using namespace std;
+
+/******************************************************************************
+ * Typedefs
+ *****************************************************************************/
+typedef struct BlockTableEntry
+{
+ void * ptr;
+ unsigned int size;
+ const char* file;
+ int line;
+ void * next;
+} BlockTableEntry_T;
+
+typedef struct BlockTable
+{
+ unsigned int size;
+ BlockTableEntry_T* blocks[TBL_SIZE];
+} BlockTable_T;
+
+/******************************************************************************
+ * Prototypes
+ *****************************************************************************/
+void insert_record(void * ptr, BlockTable_T* entry);
+void erase_record(void * ptr);
+
+/******************************************************************************
+ * Globals
+ *****************************************************************************/
+unsigned int allocated;
+static BlockTable_T Block_Table = { 0, {0} };
+
+/******************************************************************************
+ * Function Definitions
+ *****************************************************************************/
+void insert_record(void * ptr, BlockTableEntry_T* entry)
+{
+ unsigned int index = ((unsigned int)ptr) % TBL_SIZE;
+ BlockTableEntry_T* last = Block_Table.blocks[ index ];
+ BlockTableEntry_T* curr = last;
+
+ while (curr != NULL)
+ {
+ if ( curr->ptr == ptr )
+ {
+ curr->size = entry->size;
+ free(entry);
+ break;
+ }
+ last = curr;
+ curr = (BlockTableEntry_T*)curr->next;
+ }
+
+ if(curr == NULL)
+ {
+ if (last != NULL)
+ {
+ last->next = entry;
+ }
+ else
+ {
+ Block_Table.blocks[index] = entry;
+ }
+ Block_Table.size++;
+ }
+}
+
+void erase_record(void * ptr)
+{
+ int depth = 0;
+ unsigned int index = ((unsigned int)ptr) % TBL_SIZE;
+ BlockTableEntry_T* last = Block_Table.blocks[ index ];
+ BlockTableEntry_T* curr = last;
+
+ while( curr != NULL )
+ {
+ depth = 1;
+ if( curr->ptr == ptr )
+ {
+ depth = 2;
+ if(last == curr)
+ {
+ depth = 3;
+ Block_Table.blocks[ index ] = (BlockTableEntry_T*)curr->next;
+ }
+ else
+ {
+ depth = 4;
+ last->next = curr->next;
+ }
+ free(curr);
+ Block_Table.size--;
+ break;
+ }
+ last = curr;
+ curr = (BlockTableEntry_T*)curr->next;
+ }
+}
+
+void Cork_ReportMemoryLeaks(void)
+{
+ unsigned int index = 0;
+ cout << "-----------------------------------------------------------------" << endl;
+ cout << "Cork: Memory Allocation Analysis" << endl;
+ cout << "-----------------------------------------------------------------" << endl;
+ cout << "You have " << Block_Table.size << " Unclaimed objects." << endl;
+
+ for(; index < TBL_SIZE; index++)
+ {
+ BlockTableEntry_T* entry = Block_Table.blocks[ index ];
+ while(entry != NULL)
+ {
+ cout << "\t" << entry->size << "\t" << entry->ptr;
+ if( entry->file != NULL )
+ {
+ cout << "\t" << entry->line << "\t" << entry->file;
+ }
+ cout << endl;
+ entry = (BlockTableEntry_T*)entry->next;
+ }
+ }
+}
+
+void * operator new (size_t size, string file, unsigned int line)
+{
+ void * ptr = malloc(size);
+ char * fname = (char*)malloc(file.length());
+ if(ptr == NULL)
+ {
+ throw bad_alloc();
+ }
+ else
+ {
+ BlockTableEntry_T* entry = (BlockTableEntry_T*)malloc(sizeof(BlockTableEntry_T));
+ strcpy( fname, file.c_str() );
+ entry->ptr = ptr;
+ entry->size = size;
+ entry->file = fname;
+ entry->line = line;
+ entry->next = NULL;
+ insert_record(ptr,entry);
+ }
+ return ptr;
+}
+
+void * operator new(size_t size) throw(bad_alloc) {
+ void * ptr = malloc(size);
+ if(ptr == NULL)
+ {
+ throw bad_alloc();
+ }
+ else
+ {
+ BlockTableEntry_T* entry = (BlockTableEntry_T*)malloc(sizeof(BlockTableEntry_T));
+ entry->ptr = ptr;
+ entry->size = size;
+ entry->file = NULL;
+ entry->line = 0;
+ entry->next = NULL;
+ insert_record(ptr,entry);
+ }
+ return ptr;
+}
+
+void operator delete(void * p) {
+ free(p);
+ erase_record(p);
+}
--- /dev/null
+#ifndef CORK_H
+#define CORK_H
+
+#include <string>
+typedef unsigned int size_t;
+
+void Cork_ReportMemoryLeaks(void);
+void * operator new (size_t size, std::string file, unsigned int line);
+
+#define TBL_SIZE 512
+#define _new new (__FILE__,__LINE__)
+
+#endif
+++ /dev/null
-#include "cork.h"
-
-#ifdef DETECT_MEM_LEAKS
-
-// We want to use the real malloc and free in this file
-#undef malloc
-#undef free
-
-#include <iostream>
-#include <exception> // for std::bad_alloc
-#include <cstdlib> // for malloc() and free()
-#include <string.h>
-
-// Set the namespace
-using namespace std;
-/******************************************************************************
- * Typedefs
- *****************************************************************************/
-typedef struct BlockTableEntry
-{
- void * ptr;
- unsigned int size;
- const char* file;
- int line;
- void * next;
-} BlockTableEntry_T;
-
-typedef struct BlockTable
-{
- unsigned int size;
- BlockTableEntry_T* blocks[TBL_SIZE];
-} BlockTable_T;
-
-/******************************************************************************
- * Prototypes
- *****************************************************************************/
-void insert_record(void * ptr, BlockTable_T* entry);
-void erase_record(void * ptr);
-
-/******************************************************************************
- * Globals
- *****************************************************************************/
-unsigned int allocated;
-static BlockTable_T Block_Table = { 0, {0} };
-
-/******************************************************************************
- * Function Definitions
- *****************************************************************************/
-void insert_record(void * ptr, BlockTableEntry_T* entry)
-{
- unsigned int index = ((unsigned int)ptr) % TBL_SIZE;
- BlockTableEntry_T* last = Block_Table.blocks[ index ];
- BlockTableEntry_T* curr = last;
-
- while (curr != NULL)
- {
- if ( curr->ptr == ptr )
- {
- curr->size = entry->size;
- free(entry);
- break;
- }
- last = curr;
- curr = (BlockTableEntry_T*)curr->next;
- }
-
- if(curr == NULL)
- {
- if (last != NULL)
- {
- last->next = entry;
- }
- else
- {
- Block_Table.blocks[index] = entry;
- }
- Block_Table.size++;
- }
-}
-
-void erase_record(void * ptr)
-{
- int depth = 0;
- unsigned int index = ((unsigned int)ptr) % TBL_SIZE;
- BlockTableEntry_T* last = Block_Table.blocks[ index ];
- BlockTableEntry_T* curr = last;
-
- while( curr != NULL )
- {
- depth = 1;
- if( curr->ptr == ptr )
- {
- depth = 2;
- if(last == curr)
- {
- depth = 3;
- Block_Table.blocks[ index ] = (BlockTableEntry_T*)curr->next;
- }
- else
- {
- depth = 4;
- last->next = curr->next;
- }
- free(curr);
- Block_Table.size--;
- break;
- }
- last = curr;
- curr = (BlockTableEntry_T*)curr->next;
- }
-}
-
-void Cork_ReportMemoryLeaks(void)
-{
- unsigned int index = 0;
- cout << "-----------------------------------------------------------------" << endl;
- cout << "Cork: Memory Allocation Analysis" << endl;
- cout << "-----------------------------------------------------------------" << endl;
- cout << "You have " << Block_Table.size << " Unclaimed objects." << endl;
-
- for(; index < TBL_SIZE; index++)
- {
- BlockTableEntry_T* entry = Block_Table.blocks[ index ];
- while(entry != NULL)
- {
- cout << "\t" << entry->size << "\t" << entry->ptr;
- if( entry->file != NULL )
- {
- cout << "\t" << entry->line << "\t" << entry->file;
- }
- cout << endl;
- entry = (BlockTableEntry_T*)entry->next;
- }
- }
-}
-
-void * operator new (size_t size, string file, unsigned int line)
-{
- void * ptr = malloc(size);
- char * fname = (char*)malloc(file.length());
- if(ptr == NULL)
- {
- throw bad_alloc();
- }
- else
- {
- BlockTableEntry_T* entry = (BlockTableEntry_T*)malloc(sizeof(BlockTableEntry_T));
- strcpy( fname, file.c_str() );
- entry->ptr = ptr;
- entry->size = size;
- entry->file = fname;
- entry->line = line;
- entry->next = NULL;
- insert_record(ptr,entry);
- }
- return ptr;
-}
-
-void * operator new(size_t size) throw(bad_alloc) {
- void * ptr = malloc(size);
- if(ptr == NULL)
- {
- throw bad_alloc();
- }
- else
- {
- BlockTableEntry_T* entry = (BlockTableEntry_T*)malloc(sizeof(BlockTableEntry_T));
- entry->ptr = ptr;
- entry->size = size;
- entry->file = NULL;
- entry->line = 0;
- entry->next = NULL;
- insert_record(ptr,entry);
- }
- return ptr;
-}
-
-void operator delete(void * p) {
- free(p);
- erase_record(p);
-}
-
-#endif
+++ /dev/null
-#ifndef CORK_H
-#define CORK_H
-
-#ifdef DETECT_MEM_LEAKS
- #include <string>
- typedef unsigned int size_t;
-
- void Cork_ReportMemoryLeaks(void);
- void * operator new (size_t size, std::string file, unsigned int line);
- #define TBL_SIZE 512
- #define REPORT_LEAKS() Cork_ReportMemoryLeaks()
- #define _new new (__FILE__,__LINE__)
-#else
- #define REPORT_LEAKS()
- #define _new new
-#endif
-
-#endif
--- /dev/null
+!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
+!_TAG_PROGRAM_NAME Exuberant Ctags //
+!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
+!_TAG_PROGRAM_VERSION 5.8 //
+<F2> project.vim /^map <F2> <ESC>:call RefreshCTags()<CR>:call RefreshCScope()<CR>$/;" m
+<F3> project.vim /^map <F3> <ESC>:call RefreshCTags()<CR>$/;" m
+<F4> project.vim /^map <F4> <ESC>:call RefreshCScope()<CR>$/;" m
+<F6> project.vim /^map <F6> <ESC>:execute("find " . g:TestSrcPath . "\/**\/test_" . expand("%:t:r") . ".c")<CR>$/;" m
+AbortTest tools\cxxtest\cxxtest\TestSuite.h /^ class AbortTest {};$/;" c namespace:CxxTest
+AborterNoThrow tools\cxxtest\test\AborterNoThrow.h /^class AborterNoThrow : public CxxTest::TestSuite$/;" c
+Adapter tools\cxxtest\cxxtest\StdioFilePrinter.h /^ Adapter( FILE *o ) : _o(o) {}$/;" f class:CxxTest::StdioFilePrinter::Adapter
+Adapter tools\cxxtest\cxxtest\StdioFilePrinter.h /^ class Adapter : public OutputStream$/;" c class:CxxTest::StdioFilePrinter
+Adapter tools\cxxtest\cxxtest\XmlPrinter.h /^ class Adapter : public OutputStream$/;" c class:CxxTest::XmlPrinter
+Answer tools\cxxtest\doc\examples\MyTestSuite9.h /^enum Answer {$/;" g
+Answer tools\cxxtest\sample\EnumTraits.h /^enum Answer {$/;" g
+Artifact tools\rake_utils\artifact.rb /^class Artifact$/;" c
+BASE tools\cxxtest\cxxtest\ValueTraits.h /^ enum { MAX_DIGITS_ON_LEFT = 24, DIGITS_ON_RIGHT = 4, BASE = 10 };$/;" e enum:CxxTest::ValueTraits::__anon4
+BM_GETCHECK tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+BM_SETCHECK tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+BOOL tools\cxxtest\test\fake\windows.h /^typedef int BOOL;$/;" t
+BST_CHECKED tools\cxxtest\test\fake\commctrl.h /^ BST_CHECKED, PBS_SMOOTH };$/;" e enum:__anon9
+BST_UNCHECKED tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+BS_AUTOCHECKBOX tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+BYTE tools\cxxtest\test\fake\windows.h /^typedef unsigned char BYTE;$/;" t
+BadTest tools\cxxtest\test\BadTest.h /^class BadTest $/;" c
+BadTestSuite1 tools\cxxtest\doc\examples\BadTestSuite1.h /^class BadTestSuite1 : public CxxTest::TestSuite$/;" c
+BaseTestCase tools\cxxtest\test\test_cxxtest.py /^class BaseTestCase(object):$/;" c
+BaseTests tools\cxxtest\test\InheritedTest.h /^class BaseTests$/;" c
+Binary tools\rake_utils\binary.rb /^class Binary < Artifact$/;" c
+BlockTable source\cork.cpp /^typedef struct BlockTable$/;" s file:
+BlockTableEntry source\cork.cpp /^typedef struct BlockTableEntry$/;" s file:
+BlockTableEntry_T source\cork.cpp /^} BlockTableEntry_T;$/;" t typeref:struct:BlockTableEntry file:
+BlockTable_T source\cork.cpp /^} BlockTable_T;$/;" t typeref:struct:BlockTable file:
+Block_Table source\cork.cpp /^static BlockTable_T Block_Table = { 0, {0} };$/;" v file:
+Builder tools\cxxtest\build_tools\SCons\cxxtest.py /^from SCons.Builder import Builder$/;" i
+CALLBACK tools\cxxtest\test\fake\windows.h 51;" d
+COLOR_WINDOW tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+CORK_H source\cork.h 2;" d
+CPPPATH_T_H tools\cxxtest\build_tools\SCons\test\need_cpppath\src\cpppath.t.h 2;" d
+CPPPATH_T_H tools\cxxtest\build_tools\SCons\test\string_cpppath\src\cpppath.t.h 2;" d
+CPPPATH_T_H tools\cxxtest\build_tools\SCons\test\target_syntax\src\cpppath.t.h 2;" d
+CREATESTRUCT tools\cxxtest\test\fake\windows.h /^} CREATESTRUCT, *LPCREATESTRUCT;$/;" t typeref:struct:__anon13
+CS_HREDRAW tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+CS_VREDRAW tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+CXXTEST_ABORT_TEST_ON_FAIL tools\cxxtest\test\DefaultAbort.h 2;" d
+CXXTEST_CODE tools\cxxtest\cxxtest\SelfTest.h 16;" d
+CXXTEST_COMPARISONS tools\cxxtest\cxxtest\TestSuite.h 530;" d
+CXXTEST_COPY_CONST_TRAITS tools\cxxtest\cxxtest\ValueTraits.h 128;" d
+CXXTEST_COPY_CONST_TRAITS tools\cxxtest\cxxtest\ValueTraits.h 130;" d
+CXXTEST_COPY_TRAITS tools\cxxtest\cxxtest\ValueTraits.h 114;" d
+CXXTEST_DEFAULT_ABORT tools\cxxtest\cxxtest\Flags.h 67;" d
+CXXTEST_DEFAULT_ABORT tools\cxxtest\cxxtest\Flags.h 71;" d
+CXXTEST_DEFAULT_ABORT tools\cxxtest\test\DefaultAbort.h 3;" d
+CXXTEST_ENUM_MEMBER tools\cxxtest\cxxtest\ValueTraits.h 398;" d
+CXXTEST_ENUM_TRAITS tools\cxxtest\cxxtest\ValueTraits.h 374;" d
+CXXTEST_EXTERN_C tools\cxxtest\cxxtest\Mock.h 42;" d
+CXXTEST_FLAGS tools\cxxtest\cxxtest\Flags.h 20;" d
+CXXTEST_HAVE_EH tools\cxxtest\test\DefaultAbort.h 1;" d
+CXXTEST_HAVE_STD tools\cxxtest\test\TraitsTest.h 1;" d
+CXXTEST_HAVE_STD tools\cxxtest\test\WideCharTest.h 1;" d
+CXXTEST_INTEGRAL tools\cxxtest\cxxtest\TestSuite.h 566;" d
+CXXTEST_MAX_DUMP_SIZE tools\cxxtest\cxxtest\Flags.h 63;" d
+CXXTEST_MAX_DUMP_SIZE tools\cxxtest\test\MaxDump.h 5;" d
+CXXTEST_MOCK tools\cxxtest\cxxtest\Mock.h 243;" d
+CXXTEST_MOCK_DEFAULT_VALUE tools\cxxtest\cxxtest\Mock.h 364;" d
+CXXTEST_MOCK_GLOBAL tools\cxxtest\cxxtest\Mock.h 342;" d
+CXXTEST_MOCK_NAMESPACE tools\cxxtest\cxxtest\Mock.h 21;" d
+CXXTEST_MOCK_NAMESPACE_STR tools\cxxtest\cxxtest\Mock.h 231;" d
+CXXTEST_MOCK_REAL_SOURCE_FILE tools\cxxtest\doc\examples\time_real.cpp 2;" d file:
+CXXTEST_MOCK_REAL_SOURCE_FILE tools\cxxtest\sample\mock\real_stdlib.cpp 1;" d file:
+CXXTEST_MOCK_TEST_SOURCE_FILE tools\cxxtest\doc\examples\time_mock.cpp 2;" d file:
+CXXTEST_MOCK_TEST_SOURCE_FILE tools\cxxtest\sample\mock\mock_stdlib.cpp 1;" d file:
+CXXTEST_MOCK_TEST_SOURCE_FILE tools\cxxtest\test\MockTest.h 30;" d
+CXXTEST_MOCK_VOID tools\cxxtest\cxxtest\Mock.h 249;" d
+CXXTEST_MOCK_VOID_GLOBAL tools\cxxtest\cxxtest\Mock.h 345;" d
+CXXTEST_NON_NEGATIVE tools\cxxtest\cxxtest\ValueTraits.h 139;" d
+CXXTEST_SAMPLE_GUI_WAIT tools\cxxtest\sample\gui\GreenYellowRed.h 5;" d
+CXXTEST_SAMPLE_GUI_WAIT tools\cxxtest\sample\gui\GreenYellowRed.h 8;" d
+CXXTEST_SAMPLE_GUI_WAIT tools\cxxtest\test\GuiWait.h 4;" d
+CXXTEST_SMALL_BIG tools\cxxtest\cxxtest\TestSuite.h 577;" d
+CXXTEST_STACK_TRACE_ELLIDED_MESSAGE tools\cxxtest\cxxtest\XmlFormatter.h 33;" d
+CXXTEST_STACK_TRACE_ESCAPE_AS_XML tools\cxxtest\cxxtest\XmlFormatter.h 26;" d
+CXXTEST_STACK_TRACE_FILELINE_PREFIX tools\cxxtest\cxxtest\XmlFormatter.h 34;" d
+CXXTEST_STACK_TRACE_FILELINE_SUFFIX tools\cxxtest\cxxtest\XmlFormatter.h 35;" d
+CXXTEST_STACK_TRACE_INITIAL_PREFIX tools\cxxtest\cxxtest\XmlFormatter.h 29;" d
+CXXTEST_STACK_TRACE_INITIAL_SUFFIX tools\cxxtest\cxxtest\XmlFormatter.h 30;" d
+CXXTEST_STACK_TRACE_NO_ESCAPE_FILELINE_AFFIXES tools\cxxtest\cxxtest\XmlFormatter.h 27;" d
+CXXTEST_STACK_TRACE_OTHER_PREFIX tools\cxxtest\cxxtest\XmlFormatter.h 31;" d
+CXXTEST_STACK_TRACE_OTHER_SUFFIX tools\cxxtest\cxxtest\XmlFormatter.h 32;" d
+CXXTEST_STD tools\cxxtest\cxxtest\StdValueTraits.h 25;" d
+CXXTEST_STD tools\cxxtest\cxxtest\StdValueTraits.h 27;" d
+CXXTEST_SUITE tools\cxxtest\cxxtest\SelfTest.h 15;" d
+CXXTEST_SUPPLY tools\cxxtest\cxxtest\Mock.h 255;" d
+CXXTEST_SUPPLY_C tools\cxxtest\cxxtest\Mock.h 331;" d
+CXXTEST_SUPPLY_GLOBAL tools\cxxtest\cxxtest\Mock.h 348;" d
+CXXTEST_SUPPLY_GLOBAL_C tools\cxxtest\cxxtest\Mock.h 354;" d
+CXXTEST_SUPPLY_VOID tools\cxxtest\cxxtest\Mock.h 261;" d
+CXXTEST_SUPPLY_VOID_C tools\cxxtest\cxxtest\Mock.h 335;" d
+CXXTEST_SUPPLY_VOID_GLOBAL tools\cxxtest\cxxtest\Mock.h 351;" d
+CXXTEST_SUPPLY_VOID_GLOBAL_C tools\cxxtest\cxxtest\Mock.h 357;" d
+CXXTEST_TEMPLATE_INSTANTIATION tools\cxxtest\cxxtest\ValueTraits.h 27;" d
+CXXTEST_TEMPLATE_INSTANTIATION tools\cxxtest\cxxtest\ValueTraits.h 29;" d
+CalledProcessError tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from subprocess import check_call, CalledProcessError, PIPE$/;" i
+Colormap tools\cxxtest\test\fake\X11\Xlib.h /^typedef int Window, Colormap, GC;$/;" t
+Comments tools\cxxtest\test\Comments.h /^class Comments : public CxxTest::TestSuite$/;" c
+Comments tools\cxxtest\test\Comments2.h /^class Comments : public CxxTest::TestSuite$/;" c
+CommonDynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ CommonDynamicSuiteDescription::CommonDynamicSuiteDescription( const char *argFile, unsigned argLine,$/;" f class:CxxTest::CommonDynamicSuiteDescription
+CommonDynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ CommonDynamicSuiteDescription::CommonDynamicSuiteDescription() {}$/;" f class:CxxTest::CommonDynamicSuiteDescription
+CommonDynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class CommonDynamicSuiteDescription : public RealSuiteDescription$/;" c namespace:CxxTest
+ConfigOptionParser tools\cxxtest\admin\virtualenv.py /^class ConfigOptionParser(optparse.OptionParser):$/;" c
+ConfigParser tools\cxxtest\admin\virtualenv.py /^ import ConfigParser$/;" i
+ConfigParser tools\cxxtest\admin\virtualenv.py /^ import configparser as ConfigParser$/;" i
+ConnectCScope project.vim /^function! ConnectCScope()$/;" f
+ConnectCTags project.vim /^function! ConnectCTags()$/;" f
+Cork_ReportMemoryLeaks source\cork.cpp /^void Cork_ReportMemoryLeaks(void)$/;" f
+CppInfo tools\cxxtest\python\cxxtest\cxx_parser.py /^class CppInfo(object):$/;" c
+CppInfo tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^class CppInfo(object):$/;" c
+CppPathTest tools\cxxtest\build_tools\SCons\test\need_cpppath\src\cpppath.t.h /^class CppPathTest : public CxxTest::TestSuite$/;" c
+CppPathTest tools\cxxtest\build_tools\SCons\test\printer_propagation\src\failtest.t.h /^class CppPathTest : public CxxTest::TestSuite$/;" c
+CppPathTest tools\cxxtest\build_tools\SCons\test\string_cpppath\src\cpppath.t.h /^class CppPathTest : public CxxTest::TestSuite$/;" c
+CppPathTest tools\cxxtest\build_tools\SCons\test\target_syntax\src\cpppath.t.h /^class CppPathTest : public CxxTest::TestSuite$/;" c
+CrazyRunner tools\cxxtest\build_tools\SCons\test\printer_propagation\cxxtest\CrazyRunner.h /^ class CrazyRunner {$/;" c namespace:CxxTest
+CreateEvent tools\cxxtest\test\fake\windows.h /^inline HANDLE CreateEvent( LPVOID, BOOL, BOOL, LPVOID ) { return 0; }$/;" f
+CreateThread tools\cxxtest\test\fake\windows.h /^inline HANDLE CreateThread( LPVOID, int, DWORD WINAPI (*)( LPVOID ), LPVOID, int, LPVOID ) { return 0; }$/;" f
+CreateWindow tools\cxxtest\test\fake\windows.h /^inline HWND CreateWindow( LPCTSTR, LPVOID, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID ) { return 0; }$/;" f
+CreatedTest tools\cxxtest\sample\CreatedTest.h /^ CreatedTest( unsigned size ) : _buffer( new char[size] ) {}$/;" f class:CreatedTest
+CreatedTest tools\cxxtest\sample\CreatedTest.h /^class CreatedTest : public CxxTest::TestSuite$/;" c
+Critical tools\cxxtest\test\fake\qmessagebox.h /^ enum Icon { Information, Warning, Critical };$/;" e enum:QMessageBox::Icon
+CxxTest tools\cxxtest\build_tools\SCons\cxxtest.py /^ def CxxTest(env, target, source = None, **kwargs):$/;" f function:generate
+CxxTest tools\cxxtest\build_tools\SCons\test\printer_propagation\cxxtest\CrazyRunner.h /^namespace CxxTest {$/;" n
+CxxTest tools\cxxtest\cxxtest\Descriptions.cpp /^namespace CxxTest$/;" n file:
+CxxTest tools\cxxtest\cxxtest\Descriptions.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\DummyDescriptions.cpp /^namespace CxxTest $/;" n file:
+CxxTest tools\cxxtest\cxxtest\DummyDescriptions.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\ErrorFormatter.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\ErrorPrinter.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\GlobalFixture.cpp /^namespace CxxTest $/;" n file:
+CxxTest tools\cxxtest\cxxtest\GlobalFixture.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\Gui.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\LinkedList.cpp /^namespace CxxTest$/;" n file:
+CxxTest tools\cxxtest\cxxtest\LinkedList.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\ParenPrinter.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\QtGui.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\RealDescriptions.cpp /^namespace CxxTest $/;" n file:
+CxxTest tools\cxxtest\cxxtest\RealDescriptions.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\StdTestSuite.h /^namespace CxxTest {$/;" n
+CxxTest tools\cxxtest\cxxtest\StdValueTraits.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\StdioFilePrinter.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\StdioPrinter.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\TeeListener.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\TestListener.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\TestMain.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\TestRunner.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\TestSuite.cpp /^namespace CxxTest$/;" n file:
+CxxTest tools\cxxtest\cxxtest\TestSuite.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\TestTracker.cpp /^namespace CxxTest$/;" n file:
+CxxTest tools\cxxtest\cxxtest\TestTracker.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\ValueTraits.cpp /^namespace CxxTest $/;" n file:
+CxxTest tools\cxxtest\cxxtest\ValueTraits.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\cxxtest\Win32Gui.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\X11Gui.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\XUnitPrinter.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\XmlFormatter.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\XmlPrinter.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\cxxtest\YesNoRunner.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\doc\examples\MyClass.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\doc\examples\TMyClass.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\sample\TraitsTest.h /^namespace CxxTest $/;" n
+CxxTest tools\cxxtest\test\LongTraits.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\test\UserTraits.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\test\VoidTraits.h /^namespace CxxTest$/;" n
+CxxTest tools\cxxtest\test\cxxtest\DummyGui.h /^namespace CxxTest$/;" n
+DATA_SIZE tools\cxxtest\test\DynamicMax.h /^ enum { DATA_SIZE = 24 };$/;" e enum:DynamicMax::__anon7
+DATA_SIZE tools\cxxtest\test\DynamicMax.h /^ enum { DATA_SIZE = 24 };$/;" e enum:SetUpAffectsAllTests::__anon8
+DATA_SIZE tools\cxxtest\test\SameData.h /^ enum { DATA_SIZE = 24 };$/;" e enum:SameData::__anon15
+DEBUG tools\cxxtest\admin\virtualenv.py /^ DEBUG = logging.DEBUG$/;" v class:Logger
+DIGITS_ON_RIGHT tools\cxxtest\cxxtest\ValueTraits.h /^ enum { MAX_DIGITS_ON_LEFT = 24, DIGITS_ON_RIGHT = 4, BASE = 10 };$/;" e enum:CxxTest::ValueTraits::__anon4
+DWORD tools\cxxtest\test\fake\windows.h /^typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;$/;" t
+Data tools\cxxtest\doc\examples\MyTestSuite7.h /^ struct Data$/;" s class:MyTestSuite7
+Data2 tools\cxxtest\doc\examples\MyTestSuite7.h /^ struct Data2$/;" s class:MyTestSuite7
+DeepAbort tools\cxxtest\test\DeepAbort.h /^class DeepAbort : public CxxTest::TestSuite$/;" c
+DefWindowProc tools\cxxtest\test\fake\windows.h /^inline LRESULT CALLBACK DefWindowProc( HWND, UINT, WPARAM, LPARAM ) { return 0; }$/;" f
+DefaultColormap tools\cxxtest\test\fake\X11\Xlib.h /^inline Colormap DefaultColormap( Display *, int ) { return 0; }$/;" f
+DefaultTraits tools\cxxtest\test\DefaultTraits.h /^class DefaultTraits : public CxxTest::TestSuite$/;" c
+DeltaTest tools\cxxtest\sample\DeltaTest.h /^class DeltaTest : public CxxTest::TestSuite$/;" c
+DestroyWindow tools\cxxtest\test\fake\windows.h /^inline int DestroyWindow( HWND ) { return 0; }$/;" f
+Dice tools\cxxtest\sample\mock\Dice.cpp /^Dice::Dice()$/;" f class:Dice
+Dice tools\cxxtest\sample\mock\Dice.h /^class Dice$/;" c
+DispatchMessage tools\cxxtest\test\fake\windows.h /^inline int DispatchMessage( MSG * ) { return 0; }$/;" f
+Display tools\cxxtest\test\fake\X11\Xlib.h /^struct Display {};$/;" s
+DocBook tools\cxxtest\doc\epub\bin\lib\docbook.rb /^module DocBook$/;" m
+DontCare tools\cxxtest\doc\examples\MyTestSuite9.h /^ DontCare$/;" e enum:Answer
+DontCare tools\cxxtest\sample\EnumTraits.h /^ DontCare$/;" e enum:Answer
+DontKnow tools\cxxtest\doc\examples\MyTestSuite9.h /^ DontKnow,$/;" e enum:Answer
+DontKnow tools\cxxtest\sample\EnumTraits.h /^ DontKnow,$/;" e enum:Answer
+DoubleCall tools\cxxtest\test\DoubleCall.h /^class DoubleCall : public CxxTest::TestSuite$/;" c
+DummyGui tools\cxxtest\test\cxxtest\DummyGui.h /^ class DummyGui : public GuiListener$/;" c namespace:CxxTest
+DummySuiteDescription tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ DummySuiteDescription::DummySuiteDescription() : _test() {}$/;" f class:CxxTest::DummySuiteDescription
+DummySuiteDescription tools\cxxtest\cxxtest\DummyDescriptions.h /^ class DummySuiteDescription : public SuiteDescription$/;" c namespace:CxxTest
+DummyTestDescription tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ DummyTestDescription::DummyTestDescription() {}$/;" f class:CxxTest::DummyTestDescription
+DummyTestDescription tools\cxxtest\cxxtest\DummyDescriptions.h /^ class DummyTestDescription : public TestDescription$/;" c namespace:CxxTest
+DummyWorldDescription tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ DummyWorldDescription::DummyWorldDescription() : _suite() {}$/;" f class:CxxTest::DummyWorldDescription
+DummyWorldDescription tools\cxxtest\cxxtest\DummyDescriptions.h /^ class DummyWorldDescription : public WorldDescription$/;" c namespace:CxxTest
+DynamicAbort tools\cxxtest\test\DynamicAbort.h /^class DynamicAbort : public CxxTest::TestSuite$/;" c
+DynamicMax tools\cxxtest\test\DynamicMax.h /^class DynamicMax : public CxxTest::TestSuite$/;" c
+DynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ DynamicSuiteDescription( const char *argFile, unsigned argLine,$/;" f class:CxxTest::DynamicSuiteDescription
+DynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ DynamicSuiteDescription() {}$/;" f class:CxxTest::DynamicSuiteDescription
+DynamicSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class DynamicSuiteDescription : public CommonDynamicSuiteDescription$/;" c namespace:CxxTest
+ERROR tools\cxxtest\admin\virtualenv.py /^ ERROR = logging.ERROR$/;" v class:Logger
+ETSM_ASSERT tools\cxxtest\cxxtest\TestSuite.h 289;" d
+ETSM_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 423;" d
+ETSM_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 337;" d
+ETSM_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 305;" d
+ETSM_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 353;" d
+ETSM_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 371;" d
+ETSM_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 389;" d
+ETSM_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 407;" d
+ETSM_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 321;" d
+ETSM_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 439;" d
+ETS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 283;" d
+ETS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 417;" d
+ETS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 331;" d
+ETS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 299;" d
+ETS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 347;" d
+ETS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 365;" d
+ETS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 383;" d
+ETS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 401;" d
+ETS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 315;" d
+ETS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 433;" d
+EightBytes tools\cxxtest\test\DefaultTraits.h /^ EightBytes() {}$/;" f struct:DefaultTraits::EightBytes
+EightBytes tools\cxxtest\test\DefaultTraits.h /^ struct EightBytes$/;" s class:DefaultTraits
+ElementInfo tools\cxxtest\cxxtest\XmlFormatter.h /^ ElementInfo()$/;" f class:CxxTest::ElementInfo
+ElementInfo tools\cxxtest\cxxtest\XmlFormatter.h /^ ElementInfo(const ElementInfo& rhs)$/;" f class:CxxTest::ElementInfo
+ElementInfo tools\cxxtest\cxxtest\XmlFormatter.h /^ class ElementInfo$/;" c namespace:CxxTest
+EmptySuite tools\cxxtest\test\EmptySuite.h /^class EmptySuite : public CxxTest::TestSuite$/;" c
+EnumTraits tools\cxxtest\doc\examples\MyTestSuite9.h /^class EnumTraits : public CxxTest::TestSuite$/;" c
+EnumTraits tools\cxxtest\sample\EnumTraits.h /^class EnumTraits : public CxxTest::TestSuite$/;" c
+Epub tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ class Epub$/;" c class:DocBook
+ErrorFormatter tools\cxxtest\cxxtest\ErrorFormatter.h /^ ErrorFormatter( OutputStream *o, const char *preLine = ":", const char *postLine = "" ) :$/;" f class:CxxTest::ErrorFormatter
+ErrorFormatter tools\cxxtest\cxxtest\ErrorFormatter.h /^ class ErrorFormatter : public TestListener$/;" c namespace:CxxTest
+ErrorPrinter tools\cxxtest\cxxtest\ErrorPrinter.h /^ class ErrorPrinter : public ErrorFormatter$/;" c namespace:CxxTest
+ExceptionTest tools\cxxtest\sample\ExceptionTest.h /^class ExceptionTest : public CxxTest::TestSuite$/;" c
+ExitProcess tools\cxxtest\test\fake\windows.h /^inline int ExitProcess( int ) { return 0; }$/;" f
+ExposureMask tools\cxxtest\test\fake\X11\Xlib.h /^enum { Success, ExposureMask };$/;" e enum:__anon14
+FAILTEST_T_H tools\cxxtest\build_tools\SCons\test\printer_propagation\src\failtest.t.h 2;" d
+FALSE tools\cxxtest\test\fake\windows.h /^enum { FALSE, TRUE };$/;" e enum:__anon11
+FATAL tools\cxxtest\admin\virtualenv.py /^ FATAL = logging.FATAL$/;" v class:Logger
+Factor tools\cxxtest\test\Factor.h /^class Factor : public CxxTest::TestSuite$/;" c
+Fail tools\cxxtest\test\ThrowsAssert.h /^class Fail$/;" c
+First tools\cxxtest\cxxtest\StdValueTraits.h /^ ValueTraits( const CXXTEST_STD(pair)<First, Second> &p ) $/;" m class:CxxTest::ValueTraits
+FirstSuite tools\cxxtest\test\WorldFixtures.h /^class FirstSuite : public CxxTest::TestSuite$/;" c
+Fixture tools\cxxtest\test\GfSetUpFails.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\GfSetUpThrows.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\GfTearDownFails.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\GfTearDownThrows.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\SetUpWorldError.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\SetUpWorldFails.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\SetUpWorldThrows.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\TearDownWorldFails.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture tools\cxxtest\test\TearDownWorldThrows.h /^class Fixture : public CxxTest::GlobalFixture$/;" c
+Fixture1 tools\cxxtest\doc\examples\MyTestSuite8.h /^ Fixture1() { setUpCount = tearDownCount = 0; }$/;" f class:Fixture1
+Fixture1 tools\cxxtest\doc\examples\MyTestSuite8.h /^class Fixture1 : public CxxTest::GlobalFixture$/;" c
+Fixture1 tools\cxxtest\test\GlobalFixtures.h /^ Fixture1() { _setUpCount = _tearDownCount = 0; }$/;" f class:Fixture1
+Fixture1 tools\cxxtest\test\GlobalFixtures.h /^class Fixture1 : public CxxTest::GlobalFixture$/;" c
+Fixture2 tools\cxxtest\doc\examples\MyTestSuite8.h /^class Fixture2 : public Fixture1$/;" c
+Fixture2 tools\cxxtest\test\GlobalFixtures.h /^class Fixture2 : public Fixture1$/;" c
+FixtureTest tools\cxxtest\sample\FixtureTest.h /^class FixtureTest : public CxxTest::TestSuite$/;" c
+ForceNoEh tools\cxxtest\test\ForceNoEh.h /^class ForceNoEh : public CxxTest::TestSuite$/;" c
+GC tools\cxxtest\test\fake\X11\Xlib.h /^typedef int Window, Colormap, GC;$/;" t
+GREEN_BAR tools\cxxtest\cxxtest\Gui.h /^ enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;$/;" e enum:CxxTest::GuiListener::__anon2
+GWL_USERDATA tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+GetClientRect tools\cxxtest\test\fake\windows.h /^inline int GetClientRect( HWND, RECT * ) { return 0; }$/;" f
+GetForegroundWindow tools\cxxtest\test\fake\windows.h /^inline HWND GetForegroundWindow() { return 0; }$/;" f
+GetMessage tools\cxxtest\test\fake\windows.h /^inline BOOL GetMessage( MSG *, LPVOID, int, int ) { return FALSE; }$/;" f
+GetProcAddress tools\cxxtest\test\fake\windows.h /^inline LPPROC GetProcAddress( HMODULE, LPCSTR ) { return 0; }$/;" f
+GetProcessHeap tools\cxxtest\test\fake\windows.h /^inline HEAP GetProcessHeap() { return 0; }$/;" f
+GetSystemMetrics tools\cxxtest\test\fake\windows.h /^inline LONG GetSystemMetrics( int ) { return 0; }$/;" f
+GetTickCount tools\cxxtest\test\fake\windows.h /^inline DWORD GetTickCount() { return 0; }$/;" f
+GetWindowLong tools\cxxtest\test\fake\windows.h /^inline LONG GetWindowLong( HWND, int ) { return 0; }$/;" f
+GlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture::GlobalFixture() { attach( _list ); }$/;" f class:CxxTest::GlobalFixture
+GlobalFixture tools\cxxtest\cxxtest\GlobalFixture.h /^ class GlobalFixture : public Link$/;" c namespace:CxxTest
+GoodSuite tools\cxxtest\test\GoodSuite.h /^class GoodSuite : public CxxTest::TestSuite$/;" c
+GreenYellowRed tools\cxxtest\sample\gui\GreenYellowRed.h /^class GreenYellowRed : public CxxTest::TestSuite$/;" c
+GuiListener tools\cxxtest\cxxtest\Gui.h /^ GuiListener() : _state( GREEN_BAR ) {}$/;" f class:CxxTest::GuiListener
+GuiListener tools\cxxtest\cxxtest\Gui.h /^ class GuiListener : public TestListener$/;" c namespace:CxxTest
+GuiTuiRunner tools\cxxtest\cxxtest\Gui.h /^ GuiTuiRunner() : _argc(0), _argv(0) {}$/;" f class:CxxTest::GuiTuiRunner
+GuiTuiRunner tools\cxxtest\cxxtest\Gui.h /^ class GuiTuiRunner : public TeeListener$/;" c namespace:CxxTest
+HANDLE tools\cxxtest\test\fake\windows.h /^typedef struct _HANDLE {} *HANDLE;$/;" t typeref:struct:_HANDLE
+HBRUSH tools\cxxtest\test\fake\windows.h /^typedef struct _HBRUSH {} *HBRUSH;$/;" t typeref:struct:_HBRUSH
+HCURSOR tools\cxxtest\test\fake\windows.h /^typedef struct _HCURSOR {} *HCURSOR;$/;" t typeref:struct:_HCURSOR
+HEAP tools\cxxtest\test\fake\windows.h /^typedef struct _HEAP {} *HEAP;$/;" t typeref:struct:_HEAP
+HICON tools\cxxtest\test\fake\windows.h /^typedef struct _HICON {} *HICON;$/;" t typeref:struct:_HICON
+HINSTANCE tools\cxxtest\test\fake\windows.h /^typedef struct _HINSTANCE {} *HINSTANCE;$/;" t typeref:struct:_HINSTANCE
+HMENU tools\cxxtest\test\fake\windows.h /^typedef struct _HMENU {} *HMENU;$/;" t typeref:struct:_HMENU
+HMODULE tools\cxxtest\test\fake\windows.h /^typedef struct _HMODULE {} *HMODULE;$/;" t typeref:struct:_HMODULE
+HWND tools\cxxtest\test\fake\windows.h /^typedef struct _HWND {} *HWND;$/;" t typeref:struct:_HWND
+HWND_TOP tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+HaveStd tools\cxxtest\test\HaveStd.h /^class HaveStd : public CxxTest::TestSuite$/;" c
+HeapAlloc tools\cxxtest\test\fake\windows.h /^inline LPVOID HeapAlloc( HEAP, int, ULONG ) { return 0; }$/;" f
+HeapFree tools\cxxtest\test\fake\windows.h /^inline int HeapFree( HEAP, int, LPVOID ) { return 0; }$/;" f
+HeightOfScreen tools\cxxtest\test\fake\X11\Xlib.h /^inline int HeightOfScreen( Screen * ) { return 0; }$/;" f
+Hello tools\cxxtest\build_tools\SCons\test\globbing_edmundo\hello.hh /^class Hello$/;" c
+Highlight tools\cxxtest\test\fake\qprogressbar.h /^ enum { Highlight };$/;" e enum:QColorGroup::__anon10
+ICC_BAR_CLASSES tools\cxxtest\test\fake\commctrl.h 13;" d
+ICC_PROGRESS_CLASS tools\cxxtest\test\fake\commctrl.h 14;" d
+ICON_BIG tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+IDI_ERROR tools\cxxtest\test\fake\windows.h 46;" d
+IDI_INFORMATION tools\cxxtest\test\fake\windows.h 44;" d
+IDI_WARNING tools\cxxtest\test\fake\windows.h 45;" d
+INCLUDE_H tools\cxxtest\build_tools\SCons\test\need_cpppath\src\cpppathdir\include.h 2;" d
+INCLUDE_H tools\cxxtest\build_tools\SCons\test\string_cpppath\src\cpppathdir\include.h 2;" d
+INCLUDE_H tools\cxxtest\build_tools\SCons\test\target_syntax\src\cpppathdir\include.h 2;" d
+INFINITE tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+INFO tools\cxxtest\admin\virtualenv.py /^ INFO = logging.INFO$/;" v class:Logger
+INITCOMMONCONTROLSEX tools\cxxtest\test\fake\commctrl.h /^struct INITCOMMONCONTROLSEX$/;" s
+INPUT tools\cxxtest\doc\include_anchors.py /^ INPUT = open(file, 'r')$/;" v
+Icon tools\cxxtest\test\fake\qmessagebox.h /^ enum Icon { Information, Warning, Critical };$/;" g class:QMessageBox
+IncludesTest tools\cxxtest\test\IncludeTest.h /^class IncludesTest : public CxxTest::TestSuite$/;" c
+Information tools\cxxtest\test\fake\qmessagebox.h /^ enum Icon { Information, Warning, Critical };$/;" e enum:QMessageBox::Icon
+InheritedTests tools\cxxtest\test\SimpleInheritedTest.h /^class InheritedTests : public Tests$/;" c
+InheritedTests tools\cxxtest\test\SimpleInheritedTest2.h /^class InheritedTests : public Tests, public CxxTest::TestSuite$/;" c
+InheritedTests1 tools\cxxtest\test\InheritedTest.h /^class InheritedTests1 : public BaseTests, public CxxTest::TestSuite$/;" c
+InheritedTests2 tools\cxxtest\test\InheritedTest.h /^class InheritedTests2 : public CxxTest::TestSuite, public BaseTests$/;" c
+InitCommonControls tools\cxxtest\test\fake\commctrl.h /^inline void InitCommonControls() {}$/;" f
+InitCommonControlsEx tools\cxxtest\test\fake\commctrl.h /^inline int InitCommonControlsEx(INITCOMMONCONTROLSEX *) { return 0; }$/;" f
+Int64 tools\cxxtest\test\Int64.h /^class Int64 : public CxxTest::TestSuite$/;" c
+IntString tools\cxxtest\test\StlTraits.h /^ typedef CXXTEST_STD(pair)<int, String> IntString;$/;" t class:StlTraits
+IntTests tools\cxxtest\test\CppTemplateTest.h /^class IntTests: public Tests<int>, public CxxTest::TestSuite$/;" c
+IsIconic tools\cxxtest\test\fake\windows.h /^inline bool IsIconic( HWND ) { return 0; }$/;" f
+IsOdd tools\cxxtest\doc\examples\Assertions.h /^ class IsOdd$/;" c class:Test
+Key tools\cxxtest\cxxtest\StdValueTraits.h /^ ValueTraits( const CXXTEST_STD(map)<Key, Value> &m )$/;" m class:CxxTest::ValueTraits
+Key tools\cxxtest\cxxtest\StdValueTraits.h /^ ValueTraits( const CXXTEST_STD(multimap)<Key, Value> &mm )$/;" m class:CxxTest::ValueTraits
+KillTimer tools\cxxtest\test\fake\windows.h /^inline int KillTimer( HWND, unsigned ) { return 0; }$/;" f
+LEVELS tools\cxxtest\admin\virtualenv.py /^ LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL]$/;" v class:Logger
+LINKEDLIST_TEST_H tools\cxxtest\test\unit\LinkedList_test.t.h 2;" d
+LONG tools\cxxtest\test\fake\windows.h /^typedef long LONG;$/;" t
+LPARAM tools\cxxtest\test\fake\windows.h /^typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;$/;" t
+LPCREATESTRUCT tools\cxxtest\test\fake\windows.h /^} CREATESTRUCT, *LPCREATESTRUCT;$/;" t typeref:struct:__anon13
+LPCSTR tools\cxxtest\test\fake\windows.h /^typedef const char *LPCSTR;$/;" t
+LPCTSTR tools\cxxtest\test\fake\windows.h /^typedef const TCHAR *LPCTSTR;$/;" t
+LPPROC tools\cxxtest\test\fake\windows.h /^typedef void (*LPPROC)( void );$/;" t
+LPSTR tools\cxxtest\test\fake\windows.h /^typedef char *LPSTR;$/;" t
+LPVOID tools\cxxtest\test\fake\windows.h /^typedef void *LPVOID;$/;" t
+LRESULT tools\cxxtest\test\fake\windows.h /^typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;$/;" t
+LessThanEquals tools\cxxtest\test\LessThanEquals.h /^class LessThanEquals : public CxxTest::TestSuite$/;" c
+Library tools\rake_utils\library.rb /^class Library < Artifact$/;" c
+Limit tools\cxxtest\test\Factor.h /^ enum Limit { MAX_STRLEN_TOTAL_TESTS = CxxTest::WorldDescription::MAX_STRLEN_TOTAL_TESTS };$/;" g class:Factor
+Link tools\cxxtest\cxxtest\LinkedList.cpp /^ Link::Link() :$/;" f class:CxxTest::Link
+Link tools\cxxtest\cxxtest\LinkedList.h /^ class Link$/;" c namespace:CxxTest
+LinkedList_test tools\cxxtest\test\unit\LinkedList_test.t.h /^class LinkedList_test : public CxxTest::TestSuite$/;" c
+List tools\cxxtest\cxxtest\LinkedList.h /^ struct List$/;" s namespace:CxxTest
+LoadIcon tools\cxxtest\test\fake\windows.h /^inline HICON LoadIcon( HINSTANCE, LPCTSTR ) { return 0; }$/;" f
+LoadLibraryA tools\cxxtest\test\fake\windows.h /^inline HMODULE LoadLibraryA( LPCSTR ) { return 0; }$/;" f
+Logger tools\cxxtest\admin\virtualenv.py /^class Logger(object):$/;" c
+LongLongTest tools\cxxtest\test\LongLong.h /^class LongLongTest : public CxxTest::TestSuite$/;" c
+MAKELPARAM tools\cxxtest\test\fake\windows.h /^inline LPARAM MAKELPARAM( unsigned short, unsigned short ) { return 0; }$/;" f
+MAX_BYTES tools\cxxtest\cxxtest\ValueTraits.h /^ enum { MAX_BYTES = 8 };$/;" e enum:CxxTest::ValueTraits::__anon3
+MAX_DIGITS_ON_LEFT tools\cxxtest\cxxtest\ValueTraits.h /^ enum { MAX_DIGITS_ON_LEFT = 24, DIGITS_ON_RIGHT = 4, BASE = 10 };$/;" e enum:CxxTest::ValueTraits::__anon4
+MAX_STRLEN_TOTAL_TESTS tools\cxxtest\cxxtest\Descriptions.h /^ enum { MAX_STRLEN_TOTAL_TESTS = 32 };$/;" e enum:CxxTest::WorldDescription::__anon1
+MAX_STRLEN_TOTAL_TESTS tools\cxxtest\test\Factor.h /^ enum Limit { MAX_STRLEN_TOTAL_TESTS = CxxTest::WorldDescription::MAX_STRLEN_TOTAL_TESTS };$/;" e enum:Factor::Limit
+MSG tools\cxxtest\test\fake\windows.h /^struct MSG$/;" s
+Main tools\cxxtest\cxxtest\TestMain.h /^int Main(TesterT& tmp, int argc, char* argv[])$/;" f namespace:CxxTest
+Manipulator tools\cxxtest\cxxtest\ErrorFormatter.h /^ typedef void (*Manipulator)( OutputStream & );$/;" t class:CxxTest::OutputStream
+Maybe tools\cxxtest\doc\examples\MyTestSuite9.h /^ Maybe,$/;" e enum:Answer
+Maybe tools\cxxtest\sample\EnumTraits.h /^ Maybe,$/;" e enum:Answer
+MessageTest tools\cxxtest\sample\MessageTest.h /^class MessageTest : public CxxTest::TestSuite$/;" c
+MockDoubleIdentity tools\cxxtest\test\MockTest.h /^ MockDoubleIdentity( double d ) : result( d ) {}$/;" f class:MockDoubleIdentity
+MockDoubleIdentity tools\cxxtest\test\MockTest.h /^class MockDoubleIdentity : public T::Base_doubleIdentity$/;" c
+MockGetOpaque tools\cxxtest\test\MockTest.h /^ MockGetOpaque( int i ) : result( i ) {}$/;" f class:MockGetOpaque
+MockGetOpaque tools\cxxtest\test\MockTest.h /^class MockGetOpaque : public T::Base_getOpaque$/;" c
+MockIntIdentity tools\cxxtest\test\MockTest.h /^ MockIntIdentity( int i ) : result( i ) {}$/;" f class:MockIntIdentity
+MockIntIdentity tools\cxxtest\test\MockTest.h /^class MockIntIdentity : public T::Base_intIdentity$/;" c
+MockObject tools\cxxtest\doc\examples\MockTestSuite.h /^ MockObject(int initial) : counter(initial) {}$/;" f class:MockObject
+MockObject tools\cxxtest\doc\examples\MockTestSuite.h /^class MockObject : public T::Base_time$/;" c
+MockOne tools\cxxtest\test\MockTest.h /^ MockOne( int i ) : result( i ) {}$/;" f class:MockOne
+MockOne tools\cxxtest\test\MockTest.h /^class MockOne : public T::Base_one$/;" c
+MockStdlib tools\cxxtest\sample\mock\MockStdlib.h /^class MockStdlib :$/;" c
+MockTest tools\cxxtest\test\MockTest.h /^class MockTest : public CxxTest::TestSuite$/;" c
+MyClass tools\cxxtest\doc\examples\MyClass.h /^ MyClass(const MyClass& other) : value(other.value) {}$/;" f class:MyClass
+MyClass tools\cxxtest\doc\examples\MyClass.h /^ MyClass(int value_) : value(value_) {}$/;" f class:MyClass
+MyClass tools\cxxtest\doc\examples\MyClass.h /^class MyClass $/;" c
+MyLess tools\cxxtest\test\Relation.h /^struct MyLess$/;" s
+MyNegative tools\cxxtest\test\Relation.h /^struct MyNegative$/;" s
+MyTestSuite1 tools\cxxtest\doc\examples\MyTestSuite1.h /^class MyTestSuite1 : public CxxTest::TestSuite$/;" c
+MyTestSuite10 tools\cxxtest\doc\examples\MyTestSuite10.h /^class MyTestSuite10 : public CxxTest::TestSuite$/;" c
+MyTestSuite11 tools\cxxtest\doc\examples\MyTestSuite11.h /^class MyTestSuite11 : public CxxTest::TestSuite$/;" c
+MyTestSuite2 tests\source\main.h /^class MyTestSuite2 : public CxxTest::TestSuite$/;" c
+MyTestSuite2 tools\cxxtest\doc\examples\MyTestSuite2.h /^class MyTestSuite2 : public CxxTest::TestSuite$/;" c
+MyTestSuite3 tools\cxxtest\doc\examples\MyTestSuite3.h /^class MyTestSuite3 : public CxxTest::TestSuite$/;" c
+MyTestSuite4 tools\cxxtest\doc\examples\MyTestSuite4.h /^class MyTestSuite4$/;" c
+MyTestSuite5 tools\cxxtest\doc\examples\MyTestSuite5.h /^class MyTestSuite5 : public CxxTest::TestSuite$/;" c
+MyTestSuite6 tools\cxxtest\doc\examples\MyTestSuite6.h /^class MyTestSuite6 : public CxxTest::TestSuite$/;" c
+MyTestSuite7 tools\cxxtest\doc\examples\MyTestSuite7.h /^class MyTestSuite7 : public CxxTest::TestSuite$/;" c
+MyTestSuite8 tools\cxxtest\doc\examples\MyTestSuite8.h /^class MyTestSuite8 : public CxxTest::TestSuite$/;" c
+NOTIFY tools\cxxtest\admin\virtualenv.py /^ NOTIFY = (logging.INFO+logging.WARN)\/2$/;" v class:Logger
+NameSpace tools\cxxtest\test\MockTest.h /^namespace NameSpace $/;" n
+NineBytes tools\cxxtest\test\DefaultTraits.h /^ NineBytes() {}$/;" f struct:DefaultTraits::NineBytes
+NineBytes tools\cxxtest\test\DefaultTraits.h /^ struct NineBytes$/;" s class:DefaultTraits
+No tools\cxxtest\doc\examples\MyTestSuite9.h /^ No,$/;" e enum:Answer
+No tools\cxxtest\sample\EnumTraits.h /^ No,$/;" e enum:Answer
+NoEh tools\cxxtest\test\NoEh.h /^class NoEh : public CxxTest::TestSuite$/;" c
+NotShorterThan tools\cxxtest\test\Factor.h /^ class NotShorterThan$/;" c class:Factor
+NullCreate tools\cxxtest\test\Exceptions.h /^class NullCreate : public CxxTest::TestSuite$/;" c
+Number tools\cxxtest\sample\ExceptionTest.h /^ Number( int ) {}$/;" f class:ExceptionTest::Number
+Number tools\cxxtest\sample\ExceptionTest.h /^ class Number$/;" c class:ExceptionTest
+OK_ABS_SCRIPTS tools\cxxtest\admin\virtualenv.py /^OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],$/;" v
+OUTPUT tools\cxxtest\test\test_cxxtest.py /^OUTPUT = open(currdir+'Samples.txt','w')$/;" v
+Opaque tools\cxxtest\test\MockTest.h /^ explicit Opaque( int i ) : value( i ) {}$/;" f class:Opaque
+Opaque tools\cxxtest\test\MockTest.h /^class Opaque$/;" c
+OptionParser tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from optparse import OptionParser$/;" i
+OptionParser tools\cxxtest\python\cxxtest\cxxtestgen.py /^from optparse import OptionParser$/;" i
+OptionParser tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^from optparse import OptionParser$/;" i
+OrderedDict tools\cxxtest\python\cxxtest\cxx_parser.py /^ from collections import OrderedDict$/;" i
+OrderedDict tools\cxxtest\python\cxxtest\cxx_parser.py /^ from ordereddict import OrderedDict$/;" i
+OrderedDict tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ from collections import OrderedDict$/;" i
+OrderedDict tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ from ordereddict import OrderedDict$/;" i
+OutputStream tools\cxxtest\cxxtest\ErrorFormatter.h /^ class OutputStream$/;" c namespace:CxxTest
+PBM_SETBARCOLOR tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBM_SETPOS tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBM_SETRANGE tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBM_SETRANGE32 tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBM_SETSTEP tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBM_STEPIT tools\cxxtest\test\fake\commctrl.h /^enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,$/;" e enum:__anon9
+PBS_SMOOTH tools\cxxtest\test\fake\commctrl.h /^ BST_CHECKED, PBS_SMOOTH };$/;" e enum:__anon9
+PIPE tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from subprocess import check_call, CalledProcessError, PIPE$/;" i
+PROGRESS_CLASS tools\cxxtest\test\fake\commctrl.h 6;" d
+Pair tools\cxxtest\test\tpltpl.cpp /^template<class T, class U> class Pair {} p;$/;" c file:
+ParenPrinter tools\cxxtest\cxxtest\ParenPrinter.h /^ class ParenPrinter : public ErrorPrinter$/;" c namespace:CxxTest
+Part1 tools\cxxtest\test\Part1.h /^class Part1 : public CxxTest::TestSuite$/;" c
+Part2 tools\cxxtest\test\Part2.h /^class Part2 : public CxxTest::TestSuite$/;" c
+Pet tools\cxxtest\sample\TraitsTest.h /^ Pet( const char *petName ) { strcpy( _name, petName ); }$/;" f class:Pet
+Pet tools\cxxtest\sample\TraitsTest.h /^class Pet$/;" c
+PrintingFixture tools\cxxtest\test\WorldFixtures.h /^class PrintingFixture : public CxxTest::GlobalFixture$/;" c
+QApplication tools\cxxtest\test\fake\qapplication.h /^ QApplication( int &, char ** ) {}$/;" f class:QApplication
+QApplication tools\cxxtest\test\fake\qapplication.h /^class QApplication$/;" c
+QColor tools\cxxtest\test\fake\qprogressbar.h /^ QColor( int, int, int ) {}$/;" f class:QColor
+QColor tools\cxxtest\test\fake\qprogressbar.h /^class QColor$/;" c
+QColorGroup tools\cxxtest\test\fake\qprogressbar.h /^class QColorGroup$/;" c
+QLabel tools\cxxtest\test\fake\qlabel.h /^ QLabel( void * ) {}$/;" f class:QLabel
+QLabel tools\cxxtest\test\fake\qlabel.h /^class QLabel$/;" c
+QMessageBox tools\cxxtest\test\fake\qmessagebox.h /^class QMessageBox$/;" c
+QPalette tools\cxxtest\test\fake\qprogressbar.h /^class QPalette$/;" c
+QProgressBar tools\cxxtest\test\fake\qprogressbar.h /^ QProgressBar( int, void * ) {}$/;" f class:QProgressBar
+QProgressBar tools\cxxtest\test\fake\qprogressbar.h /^class QProgressBar$/;" c
+QStatusBar tools\cxxtest\test\fake\qstatusbar.h /^ QStatusBar( void * ) {}$/;" f class:QStatusBar
+QStatusBar tools\cxxtest\test\fake\qstatusbar.h /^class QStatusBar$/;" c
+QString tools\cxxtest\test\fake\qstring.h /^ QString( const char * ) {}$/;" f class:QString
+QString tools\cxxtest\test\fake\qstring.h /^ QString() {}$/;" f class:QString
+QString tools\cxxtest\test\fake\qstring.h /^class QString$/;" c
+QT_VERSION tools\cxxtest\test\fake\qglobal.h 2;" d
+QVBoxLayout tools\cxxtest\test\fake\qlayout.h /^ QVBoxLayout( void * ) {}$/;" f class:QVBoxLayout
+QVBoxLayout tools\cxxtest\test\fake\qlayout.h /^class QVBoxLayout$/;" c
+QWidget tools\cxxtest\test\fake\qwidget.h /^class QWidget$/;" c
+QtGui tools\cxxtest\cxxtest\QtGui.h /^ class QtGui : public GuiListener$/;" c namespace:CxxTest
+RECT tools\cxxtest\test\fake\windows.h /^struct RECT$/;" s
+RED_BAR tools\cxxtest\cxxtest\Gui.h /^ enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;$/;" e enum:CxxTest::GuiListener::__anon2
+REQUIRED_FILES tools\cxxtest\admin\virtualenv.py /^REQUIRED_FILES = ['lib-dynload', 'config']$/;" v
+REQUIRED_MODULES tools\cxxtest\admin\virtualenv.py /^REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',$/;" v
+REQUIREMENT_H tools\cxxtest\build_tools\SCons\test\globbing\src\requirement.h 2;" d
+REQUIREMENT_H tools\cxxtest\build_tools\SCons\test\multifile_tests\src\requirement.h 2;" d
+REQUIREMENT_H tools\cxxtest\build_tools\SCons\test\recursive_sources\src\requirement.h 2;" d
+RealSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ RealSuiteDescription::RealSuiteDescription( const char *argFile,$/;" f class:CxxTest::RealSuiteDescription
+RealSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ RealSuiteDescription::RealSuiteDescription() {}$/;" f class:CxxTest::RealSuiteDescription
+RealSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class RealSuiteDescription : public SuiteDescription$/;" c namespace:CxxTest
+RealTestDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ RealTestDescription::RealTestDescription( List &argList,$/;" f class:CxxTest::RealTestDescription
+RealTestDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ RealTestDescription::RealTestDescription()$/;" f class:CxxTest::RealTestDescription
+RealTestDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class RealTestDescription : public TestDescription$/;" c namespace:CxxTest
+RealWorldDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class RealWorldDescription : public WorldDescription$/;" c namespace:CxxTest
+RefreshCScope project.vim /^function! RefreshCScope()$/;" f
+RefreshCTags project.vim /^function! RefreshCTags()$/;" f
+RegisterClassEx tools\cxxtest\test\fake\windows.h /^inline int RegisterClassEx( WNDCLASSEX * ) { return 0; }$/;" f
+Relation tools\cxxtest\test\Relation.h /^class Relation : public CxxTest::TestSuite$/;" c
+RootWindow tools\cxxtest\test\fake\X11\Xlib.h /^inline Window RootWindow( Display *, int ) { return 0; }$/;" f
+SB_SETPARTS tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+SB_SETTEXTA tools\cxxtest\test\fake\commctrl.h /^ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,$/;" e enum:__anon9
+SM_CXSCREEN tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+SM_CYCAPTION tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+SM_CYFRAME tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+SM_CYSCREEN tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+SPI_GETWORKAREA tools\cxxtest\test\fake\windows.h /^enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,$/;" e enum:__anon12
+STACK_H tools\cxxtest\sample\SCons\include\stack.h 2;" d
+STACK_TEST_H tools\cxxtest\sample\SCons\tests\stack_test.h 2;" d
+STATUSCLASSNAME tools\cxxtest\test\fake\commctrl.h 7;" d
+STATUS_SUITE_NAME tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_SUITE_NAME, STATUS_SUITE_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_SUITE_TIME tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_SUITE_NAME, STATUS_SUITE_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_TESTS_DONE tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_TESTS_DONE, STATUS_WORLD_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_TEST_NAME tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_TEST_NAME, STATUS_TEST_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_TEST_TIME tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_TEST_NAME, STATUS_TEST_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_TOTAL_PARTS tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_TOTAL_PARTS $/;" e enum:CxxTest::Win32Gui::__anon5
+STATUS_WORLD_TIME tools\cxxtest\cxxtest\Win32Gui.h /^ STATUS_TESTS_DONE, STATUS_WORLD_TIME,$/;" e enum:CxxTest::Win32Gui::__anon5
+SW_MINIMIZE tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+SW_SHOWNORMAL tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+SameData tools\cxxtest\test\SameData.h /^class SameData : public CxxTest::TestSuite$/;" c
+SameFiles tools\cxxtest\test\SameFiles.h /^class SameFiles : public CxxTest::TestSuite$/;" c
+SameFiles tools\cxxtest\test\SameFilesLonger.h /^class SameFiles : public CxxTest::TestSuite$/;" c
+SameZero tools\cxxtest\test\SameZero.h /^class SameZero : public CxxTest::TestSuite$/;" c
+Scope tools\cxxtest\python\cxxtest\cxx_parser.py /^class Scope(object):$/;" c
+Scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^class Scope(object):$/;" c
+Screen tools\cxxtest\test\fake\X11\Xlib.h /^struct Screen {};$/;" s
+SecondSuite tools\cxxtest\test\WorldFixtures.h /^class SecondSuite : public CxxTest::TestSuite$/;" c
+SendMessage tools\cxxtest\test\fake\windows.h /^inline LRESULT SendMessage( HWND, UINT, WPARAM, LPARAM ) { return 0; }$/;" f
+SetEvent tools\cxxtest\test\fake\windows.h /^inline int SetEvent( HANDLE ) { return 0; }$/;" f
+SetTimer tools\cxxtest\test\fake\windows.h /^inline int SetTimer( HWND, unsigned, unsigned, unsigned ) { return 0; }$/;" f
+SetUpAffectsAllTests tools\cxxtest\test\DynamicMax.h /^class SetUpAffectsAllTests : public CxxTest::TestSuite$/;" c
+SetUpWorksAllTests tools\cxxtest\test\DynamicAbort.h /^class SetUpWorksAllTests : public CxxTest::TestSuite$/;" c
+SetWindowLong tools\cxxtest\test\fake\windows.h /^inline int SetWindowLong( HWND, int, LONG ) { return 0; }$/;" f
+SetWindowPos tools\cxxtest\test\fake\windows.h /^inline int SetWindowPos( HWND, int, LONG, LONG, LONG, LONG, int ) { return 0; }$/;" f
+SetWindowTextA tools\cxxtest\test\fake\windows.h /^inline int SetWindowTextA( HWND, LPCSTR ) { return 0; }$/;" f
+ShorterThan tools\cxxtest\test\Factor.h /^ class ShorterThan$/;" c class:Factor
+ShowWindow tools\cxxtest\test\fake\windows.h /^inline int ShowWindow( HWND, int ) { return 0; }$/;" f
+SimpleTest tools\cxxtest\sample\SimpleTest.h /^class SimpleTest : public CxxTest::TestSuite$/;" c
+StateGuard tools\cxxtest\cxxtest\TestRunner.h /^ StateGuard()$/;" f class:CxxTest::TestRunner::StateGuard
+StateGuard tools\cxxtest\cxxtest\TestRunner.h /^ class StateGuard$/;" c class:CxxTest::TestRunner
+StaticSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ StaticSuiteDescription::StaticSuiteDescription( const char *argFile, unsigned argLine,$/;" f class:CxxTest::StaticSuiteDescription
+StaticSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ StaticSuiteDescription::StaticSuiteDescription() {}$/;" f class:CxxTest::StaticSuiteDescription
+StaticSuiteDescription tools\cxxtest\cxxtest\RealDescriptions.h /^ class StaticSuiteDescription : public RealSuiteDescription$/;" c namespace:CxxTest
+StdTraitsBase tools\cxxtest\cxxtest\StdValueTraits.h /^ class StdTraitsBase$/;" c namespace:CxxTest
+StdioFilePrinter tools\cxxtest\cxxtest\StdioFilePrinter.h /^ StdioFilePrinter( FILE *o, const char *preLine = ":", const char *postLine = "" ) :$/;" f class:CxxTest::StdioFilePrinter
+StdioFilePrinter tools\cxxtest\cxxtest\StdioFilePrinter.h /^ class StdioFilePrinter : public ErrorFormatter$/;" c namespace:CxxTest
+StdioPrinter tools\cxxtest\cxxtest\StdioPrinter.h /^ StdioPrinter( FILE *o = stdout, const char *preLine = ":", const char *postLine = "" ) :$/;" f class:CxxTest::StdioPrinter
+StdioPrinter tools\cxxtest\cxxtest\StdioPrinter.h /^ class StdioPrinter : public StdioFilePrinter$/;" c namespace:CxxTest
+StlTraits tools\cxxtest\test\StlTraits.h /^class StlTraits : public CxxTest::TestSuite$/;" c
+String tools\cxxtest\test\StlTraits.h /^ typedef CXXTEST_STD(string) String;$/;" t class:StlTraits
+StringDouble tools\cxxtest\test\StlTraits.h /^ typedef CXXTEST_STD(pair)<String, double> StringDouble;$/;" t class:StlTraits
+Success tools\cxxtest\test\fake\X11\Xlib.h /^enum { Success, ExposureMask };$/;" e enum:__anon14
+Suite tools\cxxtest\test\GfSetUpFails.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\GfSetUpThrows.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\GfTearDownFails.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\GfTearDownThrows.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\SetUpWorldError.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\SetUpWorldFails.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\SetUpWorldThrows.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\TearDownWorldFails.h /^class Suite : public CxxTest::TestSuite$/;" c
+Suite tools\cxxtest\test\TearDownWorldThrows.h /^class Suite : public CxxTest::TestSuite$/;" c
+SuiteDescription tools\cxxtest\cxxtest\Descriptions.h /^ class SuiteDescription : public Link$/;" c namespace:CxxTest
+SummaryPrinter tools\cxxtest\test\main.cpp /^class SummaryPrinter : public CxxTest::TestListener$/;" c file:
+SupplyFour tools\cxxtest\test\MockTest.h /^ SupplyFour( int i ) : result( i ) {}$/;" f class:SupplyFour
+SupplyFour tools\cxxtest\test\MockTest.h /^class SupplyFour : public T::Base_SupplyFour$/;" c
+SupplyOne tools\cxxtest\test\MockTest.h /^ SupplyOne( int i ) : result( i ) {}$/;" f class:SupplyOne
+SupplyOne tools\cxxtest\test\MockTest.h /^class SupplyOne : public T::Base_supplyOne$/;" c
+SupplyThree tools\cxxtest\test\MockTest.h /^ SupplyThree( int i ) : result( i ) {}$/;" f class:SupplyThree
+SupplyThree tools\cxxtest\test\MockTest.h /^class SupplyThree : public T::Base_SupplyThree$/;" c
+SupplyTwo tools\cxxtest\test\MockTest.h /^ SupplyTwo( int i ) : result( i ) {}$/;" f class:SupplyTwo
+SupplyTwo tools\cxxtest\test\MockTest.h /^class SupplyTwo : public T::Base_supplyTwo$/;" c
+SystemParametersInfo tools\cxxtest\test\fake\windows.h /^inline int SystemParametersInfo( int, int, LPVOID, int ) { return 0; }$/;" f
+T tools\cxxtest\cxxtest\ValueTraits.h /^ typedef _CXXTEST_LONGLONG T;$/;" t class:CxxTest::ValueTraits
+T tools\cxxtest\cxxtest\ValueTraits.h /^ typedef signed long int T;$/;" t class:CxxTest::ValueTraits
+T tools\cxxtest\cxxtest\ValueTraits.h /^ typedef unsigned _CXXTEST_LONGLONG T;$/;" t class:CxxTest::ValueTraits
+T tools\cxxtest\cxxtest\ValueTraits.h /^ typedef unsigned long int T;$/;" t class:CxxTest::ValueTraits
+TBL_SIZE source\cork.h 10;" d
+TCHAR tools\cxxtest\test\fake\windows.h /^typedef char TCHAR;$/;" t
+TCHAR tools\cxxtest\test\fake\windows.h /^typedef wchar_t TCHAR;$/;" t
+TEST_BAR_T_H tools\cxxtest\build_tools\SCons\test\empty_source_list\test_bar.t.h 2;" d
+TEST_BAR_T_H tools\cxxtest\build_tools\SCons\test\globbing\src\test_bar.t.h 2;" d
+TEST_BAR_T_H tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_bar.t.h 2;" d
+TEST_BAR_T_H tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_bar.t.h 2;" d
+TEST_FOO_T_H tools\cxxtest\build_tools\SCons\test\empty_source_list\test_foo.t.h 2;" d
+TEST_FOO_T_H tools\cxxtest\build_tools\SCons\test\globbing\src\test_foo.t.h 2;" d
+TEST_FOO_T_H tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_foo.t.h 2;" d
+TEST_FOO_T_H tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_foo.t.h 2;" d
+TEXT tools\cxxtest\test\fake\windows.h 34;" d
+TEXT tools\cxxtest\test\fake\windows.h 37;" d
+TIMER_DELAY tools\cxxtest\cxxtest\Win32Gui.h /^ enum { TIMER_ID = 1, TIMER_DELAY = 1000 };$/;" e enum:CxxTest::Win32Gui::__anon6
+TIMER_ID tools\cxxtest\cxxtest\Win32Gui.h /^ enum { TIMER_ID = 1, TIMER_DELAY = 1000 };$/;" e enum:CxxTest::Win32Gui::__anon6
+TMyClass tools\cxxtest\doc\examples\TMyClass.h /^ TMyClass(const T& value_) : value(value_) {}$/;" f class:TMyClass
+TMyClass tools\cxxtest\doc\examples\TMyClass.h /^ TMyClass(const TMyClass<T>& other) : value(other.value) {}$/;" f class:TMyClass
+TMyClass tools\cxxtest\doc\examples\TMyClass.h /^class TMyClass $/;" c
+TRUE tools\cxxtest\test\fake\windows.h /^enum { FALSE, TRUE };$/;" e enum:__anon11
+TSM_ASSERT tools\cxxtest\cxxtest\TestSuite.h 290;" d
+TSM_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 424;" d
+TSM_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 338;" d
+TSM_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 306;" d
+TSM_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 354;" d
+TSM_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 372;" d
+TSM_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 390;" d
+TSM_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 408;" d
+TSM_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 322;" d
+TSM_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 440;" d
+TSM_ASSERT_THROWS tools\cxxtest\cxxtest\TestSuite.h 450;" d
+TSM_ASSERT_THROWS_ANYTHING tools\cxxtest\cxxtest\TestSuite.h 511;" d
+TSM_ASSERT_THROWS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 466;" d
+TSM_ASSERT_THROWS_DELTA tools\cxxtest\cxxtest\TestSuite.h 478;" d
+TSM_ASSERT_THROWS_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 474;" d
+TSM_ASSERT_THROWS_EQUALS tools\cxxtest\cxxtest\TestSuite.h 470;" d
+TSM_ASSERT_THROWS_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 486;" d
+TSM_ASSERT_THROWS_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 490;" d
+TSM_ASSERT_THROWS_NOTHING tools\cxxtest\cxxtest\TestSuite.h 524;" d
+TSM_ASSERT_THROWS_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 494;" d
+TSM_ASSERT_THROWS_RELATION tools\cxxtest\cxxtest\TestSuite.h 498;" d
+TSM_ASSERT_THROWS_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 482;" d
+TS_ABORT tools\cxxtest\cxxtest\TestSuite.h 43;" d
+TS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 284;" d
+TS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 418;" d
+TS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 332;" d
+TS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 300;" d
+TS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 348;" d
+TS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 366;" d
+TS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 384;" d
+TS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 402;" d
+TS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 316;" d
+TS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 434;" d
+TS_ASSERT_THROWS tools\cxxtest\cxxtest\TestSuite.h 447;" d
+TS_ASSERT_THROWS_ANYTHING tools\cxxtest\cxxtest\TestSuite.h 508;" d
+TS_ASSERT_THROWS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 463;" d
+TS_ASSERT_THROWS_DELTA tools\cxxtest\cxxtest\TestSuite.h 477;" d
+TS_ASSERT_THROWS_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 473;" d
+TS_ASSERT_THROWS_EQUALS tools\cxxtest\cxxtest\TestSuite.h 469;" d
+TS_ASSERT_THROWS_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 485;" d
+TS_ASSERT_THROWS_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 489;" d
+TS_ASSERT_THROWS_NOTHING tools\cxxtest\cxxtest\TestSuite.h 521;" d
+TS_ASSERT_THROWS_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 493;" d
+TS_ASSERT_THROWS_RELATION tools\cxxtest\cxxtest\TestSuite.h 497;" d
+TS_ASSERT_THROWS_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 481;" d
+TS_AS_STRING tools\cxxtest\cxxtest\ValueTraits.h 43;" d
+TS_FAIL tools\cxxtest\cxxtest\TestSuite.h 274;" d
+TS_TRACE tools\cxxtest\cxxtest\TestSuite.h 266;" d
+TS_WARN tools\cxxtest\cxxtest\TestSuite.h 270;" d
+TeeListener tools\cxxtest\cxxtest\TeeListener.h /^ TeeListener()$/;" f class:CxxTest::TeeListener
+TeeListener tools\cxxtest\cxxtest\TeeListener.h /^ class TeeListener : public TestListener$/;" c namespace:CxxTest
+TeeOutputStreams tools\cxxtest\cxxtest\XmlFormatter.h /^ TeeOutputStreams(std::ostream& _cout, std::ostream& _cerr)$/;" f class:CxxTest::TeeOutputStreams
+TeeOutputStreams tools\cxxtest\cxxtest\XmlFormatter.h /^ class TeeOutputStreams$/;" c namespace:CxxTest
+Test tools\cxxtest\doc\examples\Assertions.h /^class Test : public CxxTest::TestSuite$/;" c
+Test tools\cxxtest\doc\examples\test_examples.py /^class Test(unittest.TestCase): pass$/;" c
+TestAnsi tools\cxxtest\build_tools\SCons\test\include_CCFLAGS\src\only_with_ansi.t.h /^class TestAnsi : public CxxTest::TestSuite$/;" c
+TestBar tools\cxxtest\build_tools\SCons\test\empty_source_list\test_bar.t.h /^class TestBar : public CxxTest::TestSuite$/;" c
+TestBar tools\cxxtest\build_tools\SCons\test\globbing\src\test_bar.t.h /^class TestBar : public CxxTest::TestSuite$/;" c
+TestBar tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_bar.t.h /^class TestBar : public CxxTest::TestSuite$/;" c
+TestBar tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_bar.t.h /^class TestBar : public CxxTest::TestSuite$/;" c
+TestCL tools\cxxtest\test\test_cxxtest.py /^class TestCL(BaseTestCase, unittest.TestCase):$/;" c
+TestCLFOG tools\cxxtest\test\test_cxxtest.py /^class TestCLFOG(TestCL):$/;" c
+TestCaseInfo tools\cxxtest\cxxtest\XmlFormatter.h /^ TestCaseInfo() : fail(false), error(false), runtime(0.0) {}$/;" f class:CxxTest::TestCaseInfo
+TestCaseInfo tools\cxxtest\cxxtest\XmlFormatter.h /^ class TestCaseInfo$/;" c namespace:CxxTest
+TestClang tools\cxxtest\test\test_cxxtest.py /^class TestClang(BaseTestCase, unittest.TestCase):$/;" c
+TestClangFOG tools\cxxtest\test\test_cxxtest.py /^class TestClangFOG(TestClang):$/;" c
+TestCpp tools\cxxtest\test\test_cxxtest.py /^class TestCpp(BaseTestCase, unittest.TestCase):$/;" c
+TestCppFOG tools\cxxtest\test\test_cxxtest.py /^class TestCppFOG(TestCpp):$/;" c
+TestDescription tools\cxxtest\cxxtest\Descriptions.h /^ class TestDescription : public Link$/;" c namespace:CxxTest
+TestDice tools\cxxtest\sample\mock\TestDice.h /^class TestDice : public CxxTest::TestSuite$/;" c
+TestFoo tools\cxxtest\build_tools\SCons\test\empty_source_list\test_foo.t.h /^class TestFoo : public CxxTest::TestSuite$/;" c
+TestFoo tools\cxxtest\build_tools\SCons\test\globbing\src\test_foo.t.h /^class TestFoo : public CxxTest::TestSuite$/;" c
+TestFoo tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_foo.t.h /^class TestFoo : public CxxTest::TestSuite$/;" c
+TestFoo tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_foo.t.h /^class TestFoo : public CxxTest::TestSuite$/;" c
+TestFunky tools\cxxtest\sample\TraitsTest.h /^class TestFunky : public CxxTest::TestSuite$/;" c
+TestGlobalFixture tools\cxxtest\test\GlobalFixtures.h /^class TestGlobalFixture : public CxxTest::TestSuite$/;" c
+TestGpp tools\cxxtest\test\test_cxxtest.py /^class TestGpp(BaseTestCase, unittest.TestCase):$/;" c
+TestGppFOG tools\cxxtest\test\test_cxxtest.py /^class TestGppFOG(TestGpp):$/;" c
+TestLink tools\cxxtest\test\unit\LinkedList_test.t.h /^class TestLink : public CxxTest::Link$/;" c
+TestListener tools\cxxtest\cxxtest\TestListener.h /^ TestListener() {}$/;" f class:CxxTest::TestListener
+TestListener tools\cxxtest\cxxtest\TestListener.h /^ class TestListener$/;" c namespace:CxxTest
+TestMessageMacros tools\cxxtest\test\Tsm.h /^class TestMessageMacros : public CxxTest::TestSuite$/;" c
+TestMultiplication tools\cxxtest\sample\SimpleTest.h /^ void TestMultiplication()$/;" f class:SimpleTest
+TestMultiplication tools\cxxtest\test\BadTest.h /^ void TestMultiplication()$/;" f class:BadTest
+TestMultiplication tools\cxxtest\test\InheritedTest.h /^ void TestMultiplication()$/;" f class:BaseTests
+TestNonFinite tools\cxxtest\test\TestNonFinite.h /^class TestNonFinite : public CxxTest::TestSuite$/;" c
+TestPedantic tools\cxxtest\build_tools\SCons\test\include_CCFLAGS\src\not-with-pedantic.h /^class TestPedantic : public CxxTest::TestSuite$/;" c
+TestPedantic tools\cxxtest\build_tools\SCons\test\include_CXXFLAGS\src\not-with-pedantic.h /^class TestPedantic : public CxxTest::TestSuite$/;" c
+TestRandom tools\cxxtest\doc\examples\MockTestSuite.h /^class TestRandom : public CxxTest::TestSuite$/;" c
+TestRunner tools\cxxtest\cxxtest\TestRunner.h /^ class TestRunner$/;" c namespace:CxxTest
+TestSuite tools\cxxtest\cxxtest\TestSuite.h /^ class TestSuite$/;" c namespace:CxxTest
+TestThrowFromTest tools\cxxtest\test\Exceptions.h /^class TestThrowFromTest : public CxxTest::TestSuite$/;" c
+TestTracker tools\cxxtest\cxxtest\TestTracker.cpp /^ TestTracker::TestTracker()$/;" f class:CxxTest::TestTracker
+TestTracker tools\cxxtest\cxxtest\TestTracker.h /^ class TestTracker : public TestListener$/;" c namespace:CxxTest
+TestUserTraits tools\cxxtest\test\UserTraits.h /^class TestUserTraits : public CxxTest::TestSuite$/;" c
+Tests tools\cxxtest\test\CppTemplateTest.h /^class Tests$/;" c
+Tests tools\cxxtest\test\SimpleInheritedTest.h /^class Tests : public CxxTest::TestSuite$/;" c
+Tests tools\cxxtest\test\SimpleInheritedTest2.h /^class Tests$/;" c
+Tests tools\rake_utils\tests.rb /^class Tests < Artifact$/;" c
+Thing tools\cxxtest\test\ThrowsAssert.h /^ Thing( int argI ) : _i(argI) {}$/;" f class:Thing
+Thing tools\cxxtest\test\ThrowsAssert.h /^class Thing$/;" c
+ThrowCreate tools\cxxtest\test\Exceptions.h /^class ThrowCreate : public CxxTest::TestSuite$/;" c
+ThrowDestroy tools\cxxtest\test\Exceptions.h /^class ThrowDestroy : public CxxTest::TestSuite$/;" c
+ThrowNoStd tools\cxxtest\test\ThrowNoStd.h /^class ThrowNoStd : public CxxTest::TestSuite$/;" c
+ThrowSetUp tools\cxxtest\test\Exceptions.h /^class ThrowSetUp : public CxxTest::TestSuite$/;" c
+ThrowTearDown tools\cxxtest\test\Exceptions.h /^class ThrowTearDown : public CxxTest::TestSuite$/;" c
+ThrowsAssert tools\cxxtest\test\ThrowsAssert.h /^class ThrowsAssert : public CxxTest::TestSuite$/;" c
+TocEntry tools\cxxtest\doc\guide.html /^ function TocEntry(el, text, toclevel) {$/;" f
+ToolCxxTestWarning tools\cxxtest\build_tools\SCons\cxxtest.py /^class ToolCxxTestWarning(SCons.Warnings.Warning):$/;" c
+TraitsTest tools\cxxtest\test\TraitsTest.h /^class TraitsTest : public CxxTest::TestSuite$/;" c
+UINT tools\cxxtest\test\fake\windows.h /^typedef unsigned int UINT;$/;" t
+ULONG tools\cxxtest\test\fake\windows.h /^typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;$/;" t
+UnitTest tools\cxxtest\build_tools\SCons\cxxtest.py /^def UnitTest(env, target, source = [], **kwargs):$/;" f
+UpdateWindow tools\cxxtest\test\fake\windows.h /^inline int UpdateWindow( HWND ) { return 0; }$/;" f
+UpdatingDefaultsHelpFormatter tools\cxxtest\admin\virtualenv.py /^class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):$/;" c
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(complex)<Number> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(deque)<Element> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(list)<Element> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(map)<Key, Value> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(multimap)<Key, Value> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(multiset)<Element> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(pair)<First, Second> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(set)<Element> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits< CXXTEST_STD(vector)<Element> > : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits<const CXXTEST_STD(basic_string<wchar_t>)> : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\StdValueTraits.h /^ class ValueTraits<const CXXTEST_STD(string)> : public StdTraitsBase$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( T t ) { numberToString<T>( t, _asString ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( char c ) { copyString( charToString( c, copyString( _asString, "'" ) ), "'" ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( const T &t ) { bytesToString( (const unsigned char *)&t, sizeof(T), MAX_BYTES, _asString ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( const ValueTraits &other ) : _asString( other._asString ) {}$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( const bool value ) : _value( value ) {}$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( const char * const &value ) : _asString( value ) {}$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ ValueTraits( double t ) $/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const bool>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const char * const &>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const char>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const double>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const signed _CXXTEST_LONGLONG>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const signed long int>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const unsigned _CXXTEST_LONGLONG>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\cxxtest\ValueTraits.h /^ class ValueTraits<const unsigned long int>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\doc\examples\MyClass.h /^ ValueTraits( const MyClass& m ) { sprintf( _s, "MyClass( %i )", m.value ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\doc\examples\MyClass.h /^ class ValueTraits<MyClass> $/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\doc\examples\TMyClass.h /^ ValueTraits( const TMyClass<T>& t ) { _s << typeid(t).name() << "( " << t.value << " )"; }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\doc\examples\TMyClass.h /^ ValueTraits( const ValueTraits< TMyClass<T> >& value ) { _s << value._s.rdbuf(); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\doc\examples\TMyClass.h /^ class ValueTraits< TMyClass<T> > $/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\sample\TraitsTest.h /^ ValueTraits( const Pet &pet ) { sprintf( _asString, "Pet(\\"%s\\")", pet.name() ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\sample\TraitsTest.h /^ class ValueTraits<const Pet>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\test\LongTraits.h /^ ValueTraits( long * ) {}$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\test\LongTraits.h /^ class ValueTraits<long *>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\test\UserTraits.h /^ ValueTraits( int i ) { sprintf( _asString, "0x%X", i ); }$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\test\UserTraits.h /^ class ValueTraits<int>$/;" c namespace:CxxTest
+ValueTraits tools\cxxtest\test\VoidTraits.h /^ ValueTraits( void * ) {}$/;" f class:CxxTest::ValueTraits
+ValueTraits tools\cxxtest\test\VoidTraits.h /^ class ValueTraits<void *>$/;" c namespace:CxxTest
+WINAPI tools\cxxtest\test\fake\windows.h 50;" d
+WM_CLOSE tools\cxxtest\test\fake\windows.h /^ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };$/;" e enum:__anon12
+WM_CREATE tools\cxxtest\test\fake\windows.h /^ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };$/;" e enum:__anon12
+WM_DESTROY tools\cxxtest\test\fake\windows.h /^ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };$/;" e enum:__anon12
+WM_QUIT tools\cxxtest\test\fake\windows.h /^ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };$/;" e enum:__anon12
+WM_SETICON tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+WM_SIZE tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+WM_TIMER tools\cxxtest\test\fake\windows.h /^ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };$/;" e enum:__anon12
+WNDCLASSEX tools\cxxtest\test\fake\windows.h /^struct WNDCLASSEX$/;" s
+WORD tools\cxxtest\test\fake\windows.h /^typedef unsigned short WORD;$/;" t
+WPARAM tools\cxxtest\test\fake\windows.h /^typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;$/;" t
+WS_CHILD tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+WS_OVERLAPPEDWINDOW tools\cxxtest\test\fake\windows.h /^ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,$/;" e enum:__anon12
+WS_VISIBLE tools\cxxtest\test\fake\windows.h /^ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,$/;" e enum:__anon12
+WaitForSingleObject tools\cxxtest\test\fake\windows.h /^inline int WaitForSingleObject( HANDLE, int ) { return 0; }$/;" f
+Warning tools\cxxtest\test\fake\qmessagebox.h /^ enum Icon { Information, Warning, Critical };$/;" e enum:QMessageBox::Icon
+WideCharTest tools\cxxtest\test\WideCharTest.h /^class WideCharTest : public CxxTest::TestSuite$/;" c
+WidthOfScreen tools\cxxtest\test\fake\X11\Xlib.h /^inline int WidthOfScreen( Screen * ) { return 0; } $/;" f
+Win32Gui tools\cxxtest\cxxtest\Win32Gui.h /^ class Win32Gui : public GuiListener$/;" c namespace:CxxTest
+WinNT tools\cxxtest\sample\msvc\FixFiles.bat /^:WinNT$/;" l
+Window tools\cxxtest\test\fake\X11\Xlib.h /^typedef int Window, Colormap, GC;$/;" t
+WorldDescription tools\cxxtest\cxxtest\Descriptions.h /^ class WorldDescription : public Link$/;" c namespace:CxxTest
+WorldGuard tools\cxxtest\cxxtest\TestRunner.h /^ WorldGuard() : StateGuard()$/;" f class:CxxTest::TestRunner::WorldGuard
+WorldGuard tools\cxxtest\cxxtest\TestRunner.h /^ class WorldGuard : public StateGuard$/;" c class:CxxTest::TestRunner
+X tools\cxxtest\test\Factor.h /^ class X : public CxxTest::DummyWorldDescription$/;" c class:Factor
+X tools\cxxtest\test\tpltpl.cpp /^template<class T, class U> class X< Pair<T, U> > {} xp;$/;" c file:
+X tools\cxxtest\test\tpltpl.cpp /^template<class T> class X {} x;$/;" c file:
+X11Gui tools\cxxtest\cxxtest\X11Gui.h /^ class X11Gui : public GuiListener$/;" c namespace:CxxTest
+XAllocColor tools\cxxtest\test\fake\X11\Xlib.h /^inline int XAllocColor( Display *, Colormap, XColor *) { return 0; }$/;" f
+XCheckMaskEvent tools\cxxtest\test\fake\X11\Xlib.h /^inline int XCheckMaskEvent( Display *, int, XEvent * ) { return 0; }$/;" f
+XCloseDisplay tools\cxxtest\test\fake\X11\Xlib.h /^inline int XCloseDisplay( Display * ) { return 0; }$/;" f
+XColor tools\cxxtest\test\fake\X11\Xlib.h /^struct XColor { int pixel; };$/;" s
+XCreateGC tools\cxxtest\test\fake\X11\Xlib.h /^inline GC XCreateGC( Display *, Window, int, int ) { return 0; }$/;" f
+XCreateSimpleWindow tools\cxxtest\test\fake\X11\Xlib.h /^inline Window XCreateSimpleWindow( Display *, Window, int, int, int, int, int, int, int ) { return 0; }$/;" f
+XDefaultScreenOfDisplay tools\cxxtest\test\fake\X11\Xlib.h /^inline Screen *XDefaultScreenOfDisplay( Display * ) { return 0; }$/;" f
+XDestroyWindow tools\cxxtest\test\fake\X11\Xlib.h /^inline int XDestroyWindow( Display *, Window ) { return 0; }$/;" f
+XDrawLine tools\cxxtest\test\fake\X11\Xlib.h /^inline int XDrawLine( Display *, Window, GC, int, int, int, int ) { return 0; }$/;" f
+XDrawString tools\cxxtest\test\fake\X11\Xlib.h /^inline int XDrawString( Display *, Window, GC, int, int, const char *, int ) { return 0; }$/;" f
+XEvent tools\cxxtest\test\fake\X11\Xlib.h /^struct XEvent {};$/;" s
+XFillRectangle tools\cxxtest\test\fake\X11\Xlib.h /^inline int XFillRectangle( Display *, Window, GC, int, int, int, int ) { return 0; }$/;" f
+XFlush tools\cxxtest\test\fake\X11\Xlib.h /^inline int XFlush( Display * ) { return 0; }$/;" f
+XFontStruct tools\cxxtest\test\fake\X11\Xlib.h /^struct XFontStruct { int ascent, descent; };$/;" s
+XFreeFontInfo tools\cxxtest\test\fake\X11\Xlib.h /^inline int XFreeFontInfo( char **, XFontStruct *, int ) { return 0; }$/;" f
+XFreeGC tools\cxxtest\test\fake\X11\Xlib.h /^inline int XFreeGC( Display *, GC ) { return 0; }$/;" f
+XGContextFromGC tools\cxxtest\test\fake\X11\Xlib.h /^inline XID XGContextFromGC( GC ) { return 0; }$/;" f
+XGetWindowAttributes tools\cxxtest\test\fake\X11\Xlib.h /^inline int XGetWindowAttributes( Display *, Window, XWindowAttributes * ) { return 0; }$/;" f
+XID tools\cxxtest\test\fake\X11\Xlib.h /^typedef const char *XID;$/;" t
+XLoadFont tools\cxxtest\test\fake\X11\Xlib.h /^inline XID XLoadFont( Display *, const char * ) { return 0; }$/;" f
+XMapWindow tools\cxxtest\test\fake\X11\Xlib.h /^inline int XMapWindow( Display *, Window ) { return 0; }$/;" f
+XMoveResizeWindow tools\cxxtest\test\fake\X11\Xlib.h /^inline int XMoveResizeWindow( Display *, Window, int, int, int, int ) { return 0; }$/;" f
+XOpenDisplay tools\cxxtest\test\fake\X11\Xlib.h /^inline Display *XOpenDisplay(void *) { return 0; }$/;" f
+XParseColor tools\cxxtest\test\fake\X11\Xlib.h /^inline void XParseColor( Display *, Colormap, const char *, XColor * ) {}$/;" f
+XQueryFont tools\cxxtest\test\fake\X11\Xlib.h /^inline XFontStruct *XQueryFont( Display *, const char * ) { return 0; }$/;" f
+XSelectInput tools\cxxtest\test\fake\X11\Xlib.h /^inline int XSelectInput( Display *, Window, int ) { return 0; }$/;" f
+XSetBackground tools\cxxtest\test\fake\X11\Xlib.h /^inline int XSetBackground( Display *, GC, unsigned long ) { return 0; }$/;" f
+XSetFont tools\cxxtest\test\fake\X11\Xlib.h /^inline int XSetFont( Display *, GC, XID ) { return 0; }$/;" f
+XSetForeground tools\cxxtest\test\fake\X11\Xlib.h /^inline int XSetForeground( Display *, GC, unsigned long ) { return 0; }$/;" f
+XSetStandardProperties tools\cxxtest\test\fake\X11\Xlib.h /^inline int XSetStandardProperties( Display *, Window, const char *, int, int, int, int, int ) { return 0; }$/;" f
+XTextWidth tools\cxxtest\test\fake\X11\Xlib.h /^inline int XTextWidth( XFontStruct *, const char *, int ) { return 0; }$/;" f
+XUnitPrinter tools\cxxtest\cxxtest\XUnitPrinter.h /^ class XUnitPrinter : public TeeListener$/;" c namespace:CxxTest
+XWindowAttributes tools\cxxtest\test\fake\X11\Xlib.h /^struct XWindowAttributes { int width, height; };$/;" s
+XmlFormatter tools\cxxtest\cxxtest\XmlFormatter.h /^ XmlFormatter( OutputStream *o, OutputStream *ostr, std::ostringstream *os) $/;" f class:CxxTest::XmlFormatter
+XmlFormatter tools\cxxtest\cxxtest\XmlFormatter.h /^ class XmlFormatter : public TestListener$/;" c namespace:CxxTest
+XmlPrinter tools\cxxtest\cxxtest\XmlPrinter.h /^ class XmlPrinter : public XmlFormatter$/;" c namespace:CxxTest
+XtestDivision tools\cxxtest\doc\examples\MyTestSuite3.h /^ void XtestDivision(void)$/;" f class:MyTestSuite3
+YELLOW_BAR tools\cxxtest\cxxtest\Gui.h /^ enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;$/;" e enum:CxxTest::GuiListener::__anon2
+Yes tools\cxxtest\doc\examples\MyTestSuite9.h /^ Yes,$/;" e enum:Answer
+Yes tools\cxxtest\sample\EnumTraits.h /^ Yes,$/;" e enum:Answer
+YesNoRunner tools\cxxtest\cxxtest\YesNoRunner.h /^ YesNoRunner()$/;" f class:CxxTest::YesNoRunner
+YesNoRunner tools\cxxtest\cxxtest\YesNoRunner.h /^ class YesNoRunner : public TestListener$/;" c namespace:CxxTest
+_CXXTEST_ABORT_TEST_ON_FAIL tools\cxxtest\cxxtest\Flags.h 40;" d
+_CXXTEST_ABORT_TEST_ON_FAIL tools\cxxtest\cxxtest\Flags.h 76;" d
+_CXXTEST_FACTOR tools\cxxtest\cxxtest\Flags.h 48;" d
+_CXXTEST_HAVE_EH tools\cxxtest\cxxtest\Flags.h 24;" d
+_CXXTEST_HAVE_STD tools\cxxtest\cxxtest\ErrorPrinter.h 25;" d
+_CXXTEST_HAVE_STD tools\cxxtest\cxxtest\Flags.h 28;" d
+_CXXTEST_HAVE_STD tools\cxxtest\cxxtest\TestMain.h 19;" d
+_CXXTEST_HAVE_STD tools\cxxtest\cxxtest\XmlPrinter.h 24;" d
+_CXXTEST_LONGLONG tools\cxxtest\cxxtest\Flags.h 104;" d
+_CXXTEST_LONGLONG tools\cxxtest\cxxtest\Flags.h 125;" d
+_CXXTEST_LONGLONG tools\cxxtest\cxxtest\Flags.h 57;" d
+_CXXTEST_LONGLONG tools\cxxtest\cxxtest\Flags.h 59;" d
+_CXXTEST_LONGLONG tools\cxxtest\cxxtest\Flags.h 97;" d
+_CXXTEST_NO_COPY_CONST tools\cxxtest\cxxtest\Flags.h 44;" d
+_CXXTEST_NO_COPY_CONST tools\cxxtest\cxxtest\Flags.h 94;" d
+_CXXTEST_OLD_STD tools\cxxtest\cxxtest\Flags.h 131;" d
+_CXXTEST_OLD_STD tools\cxxtest\cxxtest\Flags.h 36;" d
+_CXXTEST_OLD_STD tools\cxxtest\cxxtest\Flags.h 86;" d
+_CXXTEST_OLD_TEMPLATE_SYNTAX tools\cxxtest\cxxtest\Flags.h 32;" d
+_CXXTEST_OLD_TEMPLATE_SYNTAX tools\cxxtest\cxxtest\Flags.h 89;" d
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION tools\cxxtest\cxxtest\Flags.h 108;" d
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION tools\cxxtest\cxxtest\Flags.h 121;" d
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION tools\cxxtest\cxxtest\Flags.h 138;" d
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION tools\cxxtest\cxxtest\Flags.h 148;" d
+_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION tools\cxxtest\cxxtest\Flags.h 52;" d
+_ETSM_ASSERT tools\cxxtest\cxxtest\TestSuite.h 286;" d
+_ETSM_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 420;" d
+_ETSM_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 334;" d
+_ETSM_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 302;" d
+_ETSM_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 350;" d
+_ETSM_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 368;" d
+_ETSM_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 386;" d
+_ETSM_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 404;" d
+_ETSM_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 318;" d
+_ETSM_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 436;" d
+_ETS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 280;" d
+_ETS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 414;" d
+_ETS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 328;" d
+_ETS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 296;" d
+_ETS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 344;" d
+_ETS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 362;" d
+_ETS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 380;" d
+_ETS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 398;" d
+_ETS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 312;" d
+_ETS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 430;" d
+_HANDLE tools\cxxtest\test\fake\windows.h /^typedef struct _HANDLE {} *HANDLE;$/;" s
+_HBRUSH tools\cxxtest\test\fake\windows.h /^typedef struct _HBRUSH {} *HBRUSH;$/;" s
+_HCURSOR tools\cxxtest\test\fake\windows.h /^typedef struct _HCURSOR {} *HCURSOR;$/;" s
+_HEAP tools\cxxtest\test\fake\windows.h /^typedef struct _HEAP {} *HEAP;$/;" s
+_HICON tools\cxxtest\test\fake\windows.h /^typedef struct _HICON {} *HICON;$/;" s
+_HINSTANCE tools\cxxtest\test\fake\windows.h /^typedef struct _HINSTANCE {} *HINSTANCE;$/;" s
+_HMENU tools\cxxtest\test\fake\windows.h /^typedef struct _HMENU {} *HMENU;$/;" s
+_HMODULE tools\cxxtest\test\fake\windows.h /^typedef struct _HMODULE {} *HMODULE;$/;" s
+_HWND tools\cxxtest\test\fake\windows.h /^typedef struct _HWND {} *HWND;$/;" s
+_TSM_ASSERT tools\cxxtest\cxxtest\TestSuite.h 287;" d
+_TSM_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 421;" d
+_TSM_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 335;" d
+_TSM_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 303;" d
+_TSM_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 351;" d
+_TSM_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 369;" d
+_TSM_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 387;" d
+_TSM_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 405;" d
+_TSM_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 319;" d
+_TSM_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 437;" d
+_TSM_ASSERT_THROWS tools\cxxtest\cxxtest\TestSuite.h 449;" d
+_TSM_ASSERT_THROWS_ANYTHING tools\cxxtest\cxxtest\TestSuite.h 510;" d
+_TSM_ASSERT_THROWS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 465;" d
+_TSM_ASSERT_THROWS_NOTHING tools\cxxtest\cxxtest\TestSuite.h 523;" d
+_TSM_LAST_CATCH tools\cxxtest\cxxtest\TestSuite.h 238;" d
+_TS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 281;" d
+_TS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 415;" d
+_TS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 329;" d
+_TS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 297;" d
+_TS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 345;" d
+_TS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 363;" d
+_TS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 381;" d
+_TS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 399;" d
+_TS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 313;" d
+_TS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 431;" d
+_TS_ASSERT_THROWS tools\cxxtest\cxxtest\TestSuite.h 446;" d
+_TS_ASSERT_THROWS_ANYTHING tools\cxxtest\cxxtest\TestSuite.h 507;" d
+_TS_ASSERT_THROWS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 462;" d
+_TS_ASSERT_THROWS_NOTHING tools\cxxtest\cxxtest\TestSuite.h 520;" d
+_TS_CATCH tools\cxxtest\cxxtest\TestSuite.h 251;" d
+_TS_CATCH tools\cxxtest\cxxtest\TestSuite.h 257;" d
+_TS_CATCH_ABORT tools\cxxtest\cxxtest\TestSuite.h 236;" d
+_TS_CATCH_ABORT tools\cxxtest\cxxtest\TestSuite.h 261;" d
+_TS_CATCH_STD tools\cxxtest\cxxtest\TestSuite.h 240;" d
+_TS_CATCH_STD tools\cxxtest\cxxtest\TestSuite.h 242;" d
+_TS_CATCH_STD tools\cxxtest\cxxtest\TestSuite.h 260;" d
+_TS_CATCH_TYPE tools\cxxtest\cxxtest\TestSuite.h 235;" d
+_TS_CATCH_TYPE tools\cxxtest\cxxtest\TestSuite.h 258;" d
+_TS_FAIL tools\cxxtest\cxxtest\TestSuite.h 273;" d
+_TS_LAST_CATCH tools\cxxtest\cxxtest\TestSuite.h 237;" d
+_TS_LAST_CATCH tools\cxxtest\cxxtest\TestSuite.h 259;" d
+_TS_TRACE tools\cxxtest\cxxtest\TestSuite.h 265;" d
+_TS_TRY tools\cxxtest\cxxtest\TestSuite.h 234;" d
+_TS_TRY tools\cxxtest\cxxtest\TestSuite.h 253;" d
+_TS_WARN tools\cxxtest\cxxtest\TestSuite.h 269;" d
+__CREATEDTEST_H tools\cxxtest\sample\CreatedTest.h 2;" d
+__CXXTEST_MOCK_UNIMPLEMENTED tools\cxxtest\cxxtest\Mock.h 227;" d
+__CXXTEST_MOCK_VOID__CLASS_DECLARATION tools\cxxtest\cxxtest\Mock.h 96;" d
+__CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION tools\cxxtest\cxxtest\Mock.h 170;" d
+__CXXTEST_MOCK_VOID__PROTOTYPE tools\cxxtest\cxxtest\Mock.h 53;" d
+__CXXTEST_MOCK__CLASS_DECLARATION tools\cxxtest\cxxtest\Mock.h 65;" d
+__CXXTEST_MOCK__CLASS_IMPLEMENTATION tools\cxxtest\cxxtest\Mock.h 148;" d
+__CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION tools\cxxtest\cxxtest\Mock.h 130;" d
+__CXXTEST_MOCK__PROTOTYPE tools\cxxtest\cxxtest\Mock.h 50;" d
+__CXXTEST_MOCK__TRAITS tools\cxxtest\cxxtest\Mock.h 27;" d
+__CXXTEST_STR tools\cxxtest\cxxtest\Mock.h 232;" d
+__CXXTEST_SUPPLY_VOID__CLASS_DECLARATION tools\cxxtest\cxxtest\Mock.h 124;" d
+__CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION tools\cxxtest\cxxtest\Mock.h 208;" d
+__CXXTEST_SUPPLY_VOID__PROTOTYPE tools\cxxtest\cxxtest\Mock.h 59;" d
+__CXXTEST_SUPPLY__CLASS_DECLARATION tools\cxxtest\cxxtest\Mock.h 99;" d
+__CXXTEST_SUPPLY__CLASS_IMPLEMENTATION tools\cxxtest\cxxtest\Mock.h 191;" d
+__CXXTEST_SUPPLY__PROTOTYPE tools\cxxtest\cxxtest\Mock.h 56;" d
+__CXXTEST_XSTR tools\cxxtest\cxxtest\Mock.h 233;" d
+__CXXTEST__DUMMYGUI_H tools\cxxtest\test\cxxtest\DummyGui.h 2;" d
+__CXXTEST__GUI_H tools\cxxtest\cxxtest\Gui.h 13;" d
+__CXXTEST__XMLFORMATTER_H tools\cxxtest\cxxtest\XmlFormatter.h 15;" d
+__CXXTEST__XUNIT_PRINTER_H tools\cxxtest\cxxtest\XUnitPrinter.h 13;" d
+__CxxTestMain_h tools\cxxtest\cxxtest\TestMain.h 13;" d
+__DELTATEST_H tools\cxxtest\sample\DeltaTest.h 2;" d
+__DICE_H tools\cxxtest\sample\mock\Dice.h 2;" d
+__EXCEPTIONTEST_H tools\cxxtest\sample\ExceptionTest.h 2;" d
+__FAKE__COMMCTRL_H__ tools\cxxtest\test\fake\commctrl.h 2;" d
+__FAKE__QSTRING_H tools\cxxtest\test\fake\qstring.h 3;" d
+__FAKE__QWIDGET_H tools\cxxtest\test\fake\qwidget.h 3;" d
+__FAKE__WINDOWS_H__ tools\cxxtest\test\fake\windows.h 2;" d
+__FIXTURETEST_H tools\cxxtest\sample\FixtureTest.h 2;" d
+__GUI_WAIT_H tools\cxxtest\test\GuiWait.h 2;" d
+__INHERITANCETEST_H tools\cxxtest\test\InheritedTest.h 2;" d
+__MESSAGETEST_H tools\cxxtest\sample\MessageTest.h 2;" d
+__SIMPLETEST_H tools\cxxtest\sample\SimpleTest.h 2;" d
+__TRAITSTEST_H tools\cxxtest\sample\TraitsTest.h 2;" d
+__TSM_CATCH tools\cxxtest\cxxtest\TestSuite.h 247;" d
+__TSM_CATCH tools\cxxtest\cxxtest\TestSuite.h 255;" d
+__TS_CATCH tools\cxxtest\cxxtest\TestSuite.h 250;" d
+__TS_CATCH tools\cxxtest\cxxtest\TestSuite.h 256;" d
+__T__STDLIB_H tools\cxxtest\sample\mock\T\stdlib.h 2;" d
+___ETS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 277;" d
+___ETS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 411;" d
+___ETS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 325;" d
+___ETS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 293;" d
+___ETS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 341;" d
+___ETS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 357;" d
+___ETS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 375;" d
+___ETS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 393;" d
+___ETS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 309;" d
+___ETS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 427;" d
+___TSM_CATCH tools\cxxtest\cxxtest\TestSuite.h 244;" d
+___TSM_CATCH tools\cxxtest\cxxtest\TestSuite.h 254;" d
+___TS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 278;" d
+___TS_ASSERT_DELTA tools\cxxtest\cxxtest\TestSuite.h 412;" d
+___TS_ASSERT_DIFFERS tools\cxxtest\cxxtest\TestSuite.h 326;" d
+___TS_ASSERT_EQUALS tools\cxxtest\cxxtest\TestSuite.h 294;" d
+___TS_ASSERT_LESS_THAN tools\cxxtest\cxxtest\TestSuite.h 342;" d
+___TS_ASSERT_LESS_THAN_EQUALS tools\cxxtest\cxxtest\TestSuite.h 359;" d
+___TS_ASSERT_PREDICATE tools\cxxtest\cxxtest\TestSuite.h 377;" d
+___TS_ASSERT_RELATION tools\cxxtest\cxxtest\TestSuite.h 395;" d
+___TS_ASSERT_SAME_DATA tools\cxxtest\cxxtest\TestSuite.h 310;" d
+___TS_ASSERT_SAME_FILES tools\cxxtest\cxxtest\TestSuite.h 428;" d
+___TS_ASSERT_THROWS tools\cxxtest\cxxtest\TestSuite.h 444;" d
+___TS_ASSERT_THROWS_ANYTHING tools\cxxtest\cxxtest\TestSuite.h 501;" d
+___TS_ASSERT_THROWS_ASSERT tools\cxxtest\cxxtest\TestSuite.h 453;" d
+___TS_ASSERT_THROWS_NOTHING tools\cxxtest\cxxtest\TestSuite.h 514;" d
+__all__ tools\cxxtest\python\cxxtest\cxxtestgen.py /^__all__ = ['main']$/;" v
+__all__ tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^__all__ = ['main']$/;" v
+__cxxtest_CrazyRunner_h__ tools\cxxtest\build_tools\SCons\test\printer_propagation\cxxtest\CrazyRunner.h 2;" d
+__cxxtest_SelfTest_h__ tools\cxxtest\cxxtest\SelfTest.h 13;" d
+__cxxtest_StdHeaders_h__ tools\cxxtest\cxxtest\StdHeaders.h 13;" d
+__cxxtest_StdValueTraits_h__ tools\cxxtest\cxxtest\StdValueTraits.h 13;" d
+__cxxtest_TestRunner_h__ tools\cxxtest\cxxtest\TestRunner.h 13;" d
+__cxxtest__Descriptions_cpp__ tools\cxxtest\cxxtest\Descriptions.cpp 13;" d file:
+__cxxtest__Descriptions_h__ tools\cxxtest\cxxtest\Descriptions.h 13;" d
+__cxxtest__DummyDescriptions_h__ tools\cxxtest\cxxtest\DummyDescriptions.h 13;" d
+__cxxtest__ErrorFormatter_h__ tools\cxxtest\cxxtest\ErrorFormatter.h 13;" d
+__cxxtest__ErrorPrinter_h__ tools\cxxtest\cxxtest\ErrorPrinter.h 13;" d
+__cxxtest__Flags_h__ tools\cxxtest\cxxtest\Flags.h 13;" d
+__cxxtest__GlobalFixture_cpp__ tools\cxxtest\cxxtest\GlobalFixture.cpp 13;" d file:
+__cxxtest__GlobalFixture_h__ tools\cxxtest\cxxtest\GlobalFixture.h 13;" d
+__cxxtest__LinkedList_cpp__ tools\cxxtest\cxxtest\LinkedList.cpp 13;" d file:
+__cxxtest__LinkedList_h__ tools\cxxtest\cxxtest\LinkedList.h 13;" d
+__cxxtest__Mock_h__ tools\cxxtest\cxxtest\Mock.h 13;" d
+__cxxtest__ParenPrinter_h__ tools\cxxtest\cxxtest\ParenPrinter.h 13;" d
+__cxxtest__QtGui_h__ tools\cxxtest\cxxtest\QtGui.h 13;" d
+__cxxtest__RealDescriptions_cpp__ tools\cxxtest\cxxtest\RealDescriptions.cpp 13;" d file:
+__cxxtest__RealDescriptions_h__ tools\cxxtest\cxxtest\RealDescriptions.h 13;" d
+__cxxtest__Root_cpp__ tools\cxxtest\cxxtest\Root.cpp 13;" d file:
+__cxxtest__StdTestSuite_h__ tools\cxxtest\cxxtest\StdTestSuite.h 13;" d
+__cxxtest__StdioFilePrinter_h__ tools\cxxtest\cxxtest\StdioFilePrinter.h 13;" d
+__cxxtest__StdioPrinter_h__ tools\cxxtest\cxxtest\StdioPrinter.h 13;" d
+__cxxtest__TeeListener_h__ tools\cxxtest\cxxtest\TeeListener.h 13;" d
+__cxxtest__TestListener_h__ tools\cxxtest\cxxtest\TestListener.h 13;" d
+__cxxtest__TestSuite_cpp__ tools\cxxtest\cxxtest\TestSuite.cpp 13;" d file:
+__cxxtest__TestSuite_h__ tools\cxxtest\cxxtest\TestSuite.h 13;" d
+__cxxtest__TestTracker_cpp__ tools\cxxtest\cxxtest\TestTracker.cpp 13;" d file:
+__cxxtest__TestTracker_h__ tools\cxxtest\cxxtest\TestTracker.h 13;" d
+__cxxtest__ValueTraits_cpp__ tools\cxxtest\cxxtest\ValueTraits.cpp 13;" d file:
+__cxxtest__ValueTraits_h__ tools\cxxtest\cxxtest\ValueTraits.h 13;" d
+__cxxtest__Win32Gui_h__ tools\cxxtest\cxxtest\Win32Gui.h 13;" d
+__cxxtest__X11Gui_h__ tools\cxxtest\cxxtest\X11Gui.h 13;" d
+__cxxtest__XmlPrinter_h__ tools\cxxtest\cxxtest\XmlPrinter.h 13;" d
+__cxxtest__YesNoRunner_h__ tools\cxxtest\cxxtest\YesNoRunner.h 13;" d
+__date__ tools\cxxtest\python\cxxtest\__init__.py /^from cxxtest.__release__ import __version__, __date__$/;" i
+__date__ tools\cxxtest\python\cxxtest\__release__.py /^__date__ = "2012-01-02"$/;" v
+__date__ tools\cxxtest\python\python3\cxxtest\__init__.py /^from cxxtest.__release__ import __version__, __date__$/;" i
+__date__ tools\cxxtest\python\python3\cxxtest\__release__.py /^__date__ = "2012-01-02"$/;" v
+__file__ tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+__init__ tools\cxxtest\admin\virtualenv.py /^ def __init__(self, *args, **kwargs):$/;" m class:ConfigOptionParser
+__init__ tools\cxxtest\admin\virtualenv.py /^ def __init__(self, consumers):$/;" m class:Logger
+__init__ tools\cxxtest\python\cxxtest\cxx_parser.py /^ def __init__(self, filter=None):$/;" m class:CppInfo
+__init__ tools\cxxtest\python\cxxtest\cxx_parser.py /^ def __init__(self,name,abs_name,scope_t,base_classes,lineno):$/;" m class:Scope
+__init__ tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def __init__(self, filter=None):$/;" m class:CppInfo
+__init__ tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def __init__(self,name,abs_name,scope_t,base_classes,lineno):$/;" m class:Scope
+__license__ tools\cxxtest\python\cxxtest\__init__.py /^__license__ = "LGPL"$/;" v
+__license__ tools\cxxtest\python\python3\cxxtest\__init__.py /^__license__ = "LGPL"$/;" v
+__maintainer__ tools\cxxtest\python\cxxtest\__init__.py /^__maintainer__ = "William E. Hart"$/;" v
+__maintainer__ tools\cxxtest\python\python3\cxxtest\__init__.py /^__maintainer__ = "William E. Hart"$/;" v
+__maintainer_email__ tools\cxxtest\python\cxxtest\__init__.py /^__maintainer_email__ = "whart222@gmail.com"$/;" v
+__maintainer_email__ tools\cxxtest\python\python3\cxxtest\__init__.py /^__maintainer_email__ = "whart222@gmail.com"$/;" v
+__release__ tools\cxxtest\python\cxxtest\cxxtestgen.py /^import __release__$/;" i
+__release__ tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^from . import __release__$/;" i
+__repr__ tools\cxxtest\python\cxxtest\cxx_parser.py /^ def __repr__(self):$/;" m class:CppInfo file:
+__repr__ tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def __repr__(self):$/;" m class:CppInfo file:
+__str__ tools\cxxtest\python\cxxtest\cxx_parser.py /^ def __str__(self):$/;" m class:CppInfo file:
+__str__ tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def __str__(self):$/;" m class:CppInfo file:
+__url__ tools\cxxtest\python\cxxtest\__init__.py /^__url__ = "http:\/\/cxxtest.tigris.org\/"$/;" v
+__url__ tools\cxxtest\python\python3\cxxtest\__init__.py /^__url__ = "http:\/\/cxxtest.tigris.org\/"$/;" v
+__version__ tools\cxxtest\python\cxxtest\__init__.py /^from cxxtest.__release__ import __version__, __date__$/;" i
+__version__ tools\cxxtest\python\cxxtest\__release__.py /^__version__ = '4.0.2'$/;" v
+__version__ tools\cxxtest\python\python3\cxxtest\__init__.py /^from cxxtest.__release__ import __version__, __date__$/;" i
+__version__ tools\cxxtest\python\python3\cxxtest\__release__.py /^__version__ = '4.0.2'$/;" v
+_abortTestOnFail tools\cxxtest\cxxtest\TestRunner.h /^ bool _abortTestOnFail;$/;" m class:CxxTest::TestRunner::StateGuard
+_active tools\cxxtest\cxxtest\LinkedList.h /^ bool _active;$/;" m class:CxxTest::Link
+_application tools\cxxtest\cxxtest\QtGui.h /^ QApplication *_application;$/;" m class:CxxTest::QtGui
+_argc tools\cxxtest\cxxtest\Gui.h /^ int* _argc;$/;" m class:CxxTest::GuiTuiRunner
+_argv tools\cxxtest\cxxtest\Gui.h /^ char **_argv;$/;" m class:CxxTest::GuiTuiRunner
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ char _asString[1 + 3 * sizeof(T)];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ char _asString[1 + MAX_DIGITS_ON_LEFT + 1 + DIGITS_ON_RIGHT + 1];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ char _asString[2 + 3 * sizeof(T)];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ char _asString[sizeof("'\\\\xXX'")];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ char _asString[sizeof("{ ") + sizeof("XX ") * MAX_BYTES + sizeof("... }")];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\cxxtest\ValueTraits.h /^ const char *_asString;$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\sample\TraitsTest.h /^ char _asString[256];$/;" m class:CxxTest::ValueTraits
+_asString tools\cxxtest\test\UserTraits.h /^ char _asString[128]; \/\/ Crude, but it should be enough$/;" m class:CxxTest::ValueTraits
+_background tools\cxxtest\cxxtest\X11Gui.h /^ unsigned long _foreground, _background, _barColor;$/;" m class:CxxTest::X11Gui
+_backgroundName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_foregroundName, *_backgroundName;$/;" m class:CxxTest::X11Gui
+_barColor tools\cxxtest\cxxtest\X11Gui.h /^ unsigned long _foreground, _background, _barColor;$/;" m class:CxxTest::X11Gui
+_buffer tools\cxxtest\doc\examples\MyTestSuite5.h /^ char *_buffer;$/;" m class:MyTestSuite5
+_buffer tools\cxxtest\sample\CreatedTest.h /^ char *_buffer;$/;" m class:CreatedTest
+_buffer tools\cxxtest\sample\FixtureTest.h /^ char *_buffer;$/;" m class:FixtureTest
+_canStartTests tools\cxxtest\cxxtest\Win32Gui.h /^ HANDLE _canStartTests;$/;" m class:CxxTest::Win32Gui
+_colormap tools\cxxtest\cxxtest\X11Gui.h /^ Colormap _colormap;$/;" m class:CxxTest::X11Gui
+_createLine tools\cxxtest\cxxtest\RealDescriptions.h /^ unsigned _createLine, _destroyLine;$/;" m class:CxxTest::CommonDynamicSuiteDescription
+_created tools\cxxtest\cxxtest\TestTracker.cpp /^ bool TestTracker::_created = false;$/;" m class:CxxTest::TestTracker file:
+_created tools\cxxtest\cxxtest\TestTracker.h /^ static bool _created;$/;" m class:CxxTest::TestTracker
+_delta tools\cxxtest\sample\DeltaTest.h /^ double _pi, _delta;$/;" m class:DeltaTest
+_destroyLine tools\cxxtest\cxxtest\RealDescriptions.h /^ unsigned _createLine, _destroyLine;$/;" m class:CxxTest::CommonDynamicSuiteDescription
+_display tools\cxxtest\cxxtest\X11Gui.h /^ Display *_display;$/;" m class:CxxTest::X11Gui
+_dotting tools\cxxtest\cxxtest\ErrorFormatter.h /^ bool _dotting;$/;" m class:CxxTest::ErrorFormatter
+_dummy tools\cxxtest\cxxtest\TeeListener.h /^ TestListener _dummy;$/;" m class:CxxTest::TeeListener
+_dummyListener tools\cxxtest\cxxtest\TestTracker.h /^ TestListener _dummyListener;$/;" m class:CxxTest::TestTracker
+_dummyWorld tools\cxxtest\cxxtest\TestTracker.h /^ DummyWorldDescription _dummyWorld;$/;" m class:CxxTest::TestTracker
+_eventMask tools\cxxtest\cxxtest\X11Gui.h /^ long _eventMask;$/;" m class:CxxTest::X11Gui
+_failedSuites tools\cxxtest\cxxtest\TestTracker.h /^ unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;$/;" m class:CxxTest::TestTracker
+_failedTests tools\cxxtest\cxxtest\TestTracker.h /^ unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;$/;" m class:CxxTest::TestTracker
+_file tools\cxxtest\cxxtest\RealDescriptions.h /^ const char *_file;$/;" m class:CxxTest::RealSuiteDescription
+_filter_ez_setup tools\cxxtest\admin\virtualenv.py /^ def _filter_ez_setup(line):$/;" f function:_install_req
+_filter_setup tools\cxxtest\admin\virtualenv.py /^ def _filter_setup(line):$/;" f function:install_pip
+_find_column tools\cxxtest\python\cxxtest\cxx_parser.py /^def _find_column(input,token):$/;" f
+_find_column tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def _find_column(input,token):$/;" f
+_find_file tools\cxxtest\admin\virtualenv.py /^def _find_file(filename, dirs):$/;" f
+_first tools\cxxtest\cxxtest\TeeListener.h /^ TestListener *_first, *_second;$/;" m class:CxxTest::TeeListener
+_fontId tools\cxxtest\cxxtest\X11Gui.h /^ XID _fontId;$/;" m class:CxxTest::X11Gui
+_fontInfo tools\cxxtest\cxxtest\X11Gui.h /^ XFontStruct *_fontInfo;$/;" m class:CxxTest::X11Gui
+_fontName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_fontName;$/;" m class:CxxTest::X11Gui
+_foreground tools\cxxtest\cxxtest\X11Gui.h /^ unsigned long _foreground, _background, _barColor;$/;" m class:CxxTest::X11Gui
+_foregroundName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_foregroundName, *_backgroundName;$/;" m class:CxxTest::X11Gui
+_gc tools\cxxtest\cxxtest\X11Gui.h /^ GC _gc;$/;" m class:CxxTest::X11Gui
+_greenName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_greenName, *_yellowName, *_redName;$/;" m class:CxxTest::X11Gui
+_gui tools\cxxtest\cxxtest\Gui.h /^ GuiT _gui;$/;" m class:CxxTest::GuiTuiRunner
+_gui tools\cxxtest\cxxtest\Win32Gui.h /^ HANDLE _gui;$/;" m class:CxxTest::Win32Gui
+_head tools\cxxtest\cxxtest\LinkedList.h /^ Link *_head;$/;" m struct:CxxTest::List
+_height tools\cxxtest\cxxtest\X11Gui.h /^ int _width, _height;$/;" m class:CxxTest::X11Gui
+_i tools\cxxtest\test\ThrowsAssert.h /^ int _i;$/;" m class:Thing
+_install_req tools\cxxtest\admin\virtualenv.py /^def _install_req(py_executable, unzip=False, distribute=False,$/;" f
+_keep tools\cxxtest\cxxtest\QtGui.h /^ bool _startMinimized, _keep;$/;" m class:CxxTest::QtGui
+_keep tools\cxxtest\cxxtest\Win32Gui.h /^ bool _startMinimized, _keep;$/;" m class:CxxTest::Win32Gui
+_l tools\cxxtest\cxxtest\TestTracker.h /^ TestListener *_l;$/;" m class:CxxTest::TestTracker
+_layout tools\cxxtest\cxxtest\QtGui.h /^ QVBoxLayout *_layout;$/;" m class:CxxTest::QtGui
+_line tools\cxxtest\cxxtest\RealDescriptions.h /^ int _line;$/;" m class:CxxTest::RealSuiteDescription
+_line tools\cxxtest\cxxtest\RealDescriptions.h /^ int _line;$/;" m class:CxxTest::RealTestDescription
+_list tools\cxxtest\cxxtest\GlobalFixture.h /^ static List _list;$/;" m class:CxxTest::GlobalFixture
+_list tools\cxxtest\cxxtest\LinkedList.cpp /^ List GlobalFixture::_list = { 0, 0 };$/;" m class:CxxTest::GlobalFixture file:
+_mainWindow tools\cxxtest\cxxtest\QtGui.h /^ QWidget *_mainWindow;$/;" m class:CxxTest::QtGui
+_mainWindow tools\cxxtest\cxxtest\Win32Gui.h /^ HWND _mainWindow, _progressBar, _statusBar;$/;" m class:CxxTest::Win32Gui
+_maxDumpSize tools\cxxtest\cxxtest\TestRunner.h /^ unsigned _maxDumpSize;$/;" m class:CxxTest::TestRunner::StateGuard
+_name tools\cxxtest\sample\TraitsTest.h /^ char _name[128];$/;" m class:Pet
+_new source\cork.h 11;" d
+_next tools\cxxtest\cxxtest\LinkedList.h /^ Link *_next;$/;" m class:CxxTest::Link
+_numTotalTests tools\cxxtest\cxxtest\QtGui.h /^ unsigned _numTotalTests;$/;" m class:CxxTest::QtGui
+_numTotalTests tools\cxxtest\cxxtest\Win32Gui.h /^ unsigned _numTotalTests, _testsDone;$/;" m class:CxxTest::Win32Gui
+_numTotalTests tools\cxxtest\cxxtest\X11Gui.h /^ unsigned _numTotalTests, _testsDone;$/;" m class:CxxTest::X11Gui
+_o tools\cxxtest\cxxtest\ErrorFormatter.h /^ OutputStream *_o;$/;" m class:CxxTest::ErrorFormatter
+_o tools\cxxtest\cxxtest\StdioFilePrinter.h /^ FILE *_o;$/;" m class:CxxTest::StdioFilePrinter::Adapter
+_o tools\cxxtest\cxxtest\XmlFormatter.h /^ OutputStream *_o;$/;" m class:CxxTest::XmlFormatter
+_o tools\cxxtest\cxxtest\XmlPrinter.h /^ Adapter( CXXTEST_STD(ostream) &o ) : _o(o) {}$/;" f class:CxxTest::XmlPrinter::Adapter
+_o tools\cxxtest\cxxtest\XmlPrinter.h /^ CXXTEST_STD(ostream) &_o;$/;" m class:CxxTest::XmlPrinter::Adapter
+_os tools\cxxtest\cxxtest\XmlFormatter.h /^ std::ostringstream *_os;$/;" m class:CxxTest::XmlFormatter
+_ostr tools\cxxtest\cxxtest\XmlFormatter.h /^ OutputStream *_ostr;$/;" m class:CxxTest::XmlFormatter
+_parse_info tools\cxxtest\python\cxxtest\cxx_parser.py /^_parse_info=None$/;" v
+_parse_info tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^_parse_info=None$/;" v
+_parsedata tools\cxxtest\python\cxxtest\cxx_parser.py /^_parsedata=None$/;" v
+_parsedata tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^_parsedata=None$/;" v
+_pi tools\cxxtest\sample\DeltaTest.h /^ double _pi, _delta;$/;" m class:DeltaTest
+_pip_re tools\cxxtest\admin\virtualenv.py /^_pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I)$/;" v
+_postLine tools\cxxtest\cxxtest\ErrorFormatter.h /^ const char *_postLine;$/;" m class:CxxTest::ErrorFormatter
+_preLine tools\cxxtest\cxxtest\ErrorFormatter.h /^ const char *_preLine;$/;" m class:CxxTest::ErrorFormatter
+_prev tools\cxxtest\cxxtest\LinkedList.h /^ Link *_prev;$/;" m class:CxxTest::Link
+_programName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_programName;$/;" m class:CxxTest::X11Gui
+_progressBar tools\cxxtest\cxxtest\QtGui.h /^ QProgressBar *_progressBar;$/;" m class:CxxTest::QtGui
+_progressBar tools\cxxtest\cxxtest\Win32Gui.h /^ HWND _mainWindow, _progressBar, _statusBar;$/;" m class:CxxTest::Win32Gui
+_redName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_greenName, *_yellowName, *_redName;$/;" m class:CxxTest::X11Gui
+_reported tools\cxxtest\cxxtest\ErrorFormatter.h /^ bool _reported;$/;" m class:CxxTest::ErrorFormatter
+_s tools\cxxtest\cxxtest\StdValueTraits.h /^ CXXTEST_STD(string) _s;$/;" m class:CxxTest::StdTraitsBase
+_s tools\cxxtest\doc\examples\MyClass.h /^ char _s[256];$/;" m class:CxxTest::ValueTraits
+_s tools\cxxtest\doc\examples\TMyClass.h /^ std::ostringstream _s;$/;" m class:CxxTest::ValueTraits
+_second tools\cxxtest\cxxtest\TeeListener.h /^ TestListener *_first, *_second;$/;" m class:CxxTest::TeeListener
+_setUpCount tools\cxxtest\test\GlobalFixtures.h /^ unsigned _setUpCount;$/;" m class:Fixture1
+_shorterThan tools\cxxtest\test\Factor.h /^ ShorterThan _shorterThan;$/;" m class:Factor::NotShorterThan
+_startMinimized tools\cxxtest\cxxtest\QtGui.h /^ bool _startMinimized, _keep;$/;" m class:CxxTest::QtGui
+_startMinimized tools\cxxtest\cxxtest\Win32Gui.h /^ bool _startMinimized, _keep;$/;" m class:CxxTest::Win32Gui
+_state tools\cxxtest\cxxtest\Gui.h /^ enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;$/;" m class:CxxTest::GuiListener typeref:enum:CxxTest::GuiListener::__anon2
+_statusBar tools\cxxtest\cxxtest\QtGui.h /^ QStatusBar *_statusBar;$/;" m class:CxxTest::QtGui
+_statusBar tools\cxxtest\cxxtest\Win32Gui.h /^ HWND _mainWindow, _progressBar, _statusBar;$/;" m class:CxxTest::Win32Gui
+_statusOffsets tools\cxxtest\cxxtest\Win32Gui.h /^ unsigned _statusOffsets[STATUS_TOTAL_PARTS];$/;" m class:CxxTest::Win32Gui
+_statusTestsDone tools\cxxtest\cxxtest\Win32Gui.h /^ char _statusTestsDone[sizeof("1000000000 of (100%)") + WorldDescription::MAX_STRLEN_TOTAL_TESTS];$/;" m class:CxxTest::Win32Gui
+_statusTotal tools\cxxtest\cxxtest\Win32Gui.h /^ unsigned _statusTotal;$/;" m class:CxxTest::Win32Gui
+_statusWidths tools\cxxtest\cxxtest\Win32Gui.h /^ int _statusWidths[STATUS_TOTAL_PARTS];$/;" m class:CxxTest::Win32Gui
+_stdout_level tools\cxxtest\admin\virtualenv.py /^ def _stdout_level(self):$/;" m class:Logger
+_strTotalTests tools\cxxtest\cxxtest\QtGui.h /^ QString _strTotalTests;$/;" m class:CxxTest::QtGui
+_strTotalTests tools\cxxtest\cxxtest\Win32Gui.h /^ char _strTotalTests[WorldDescription::MAX_STRLEN_TOTAL_TESTS];$/;" m class:CxxTest::Win32Gui
+_strTotalTests tools\cxxtest\cxxtest\X11Gui.h /^ char _strTotalTests[WorldDescription::MAX_STRLEN_TOTAL_TESTS];$/;" m class:CxxTest::X11Gui
+_suite tools\cxxtest\cxxtest\DummyDescriptions.h /^ DummySuiteDescription _suite;$/;" m class:CxxTest::DummyWorldDescription
+_suite tools\cxxtest\cxxtest\RealDescriptions.h /^ S **_suite;$/;" m class:CxxTest::DynamicSuiteDescription
+_suite tools\cxxtest\cxxtest\RealDescriptions.h /^ SuiteDescription *_suite;$/;" m class:CxxTest::RealTestDescription
+_suite tools\cxxtest\cxxtest\RealDescriptions.h /^ TestSuite *_suite;$/;" m class:CxxTest::StaticSuiteDescription
+_suite tools\cxxtest\cxxtest\TestTracker.h /^ const SuiteDescription *_suite;$/;" m class:CxxTest::TestTracker
+_suiteFailedTests tools\cxxtest\cxxtest\TestTracker.h /^ unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;$/;" m class:CxxTest::TestTracker
+_suiteName tools\cxxtest\cxxtest\QtGui.h /^ QLabel *_suiteName, *_testName, *_testsDone;$/;" m class:CxxTest::QtGui
+_suiteName tools\cxxtest\cxxtest\RealDescriptions.h /^ const char *_suiteName;$/;" m class:CxxTest::RealSuiteDescription
+_suiteStart tools\cxxtest\cxxtest\Win32Gui.h /^ DWORD _worldStart, _suiteStart, _testStart;$/;" m class:CxxTest::Win32Gui
+_suites tools\cxxtest\cxxtest\LinkedList.cpp /^ List RealSuiteDescription::_suites = { 0, 0 };$/;" m class:CxxTest::RealSuiteDescription file:
+_suites tools\cxxtest\cxxtest\RealDescriptions.h /^ static List _suites;$/;" m class:CxxTest::RealSuiteDescription
+_tail tools\cxxtest\cxxtest\LinkedList.h /^ Link *_tail;$/;" m struct:CxxTest::List
+_tearDownCount tools\cxxtest\test\GlobalFixtures.h /^ unsigned _tearDownCount;$/;" m class:Fixture1
+_test tools\cxxtest\cxxtest\DummyDescriptions.h /^ DummyTestDescription _test;$/;" m class:CxxTest::DummySuiteDescription
+_test tools\cxxtest\cxxtest\TestTracker.h /^ const TestDescription *_test;$/;" m class:CxxTest::TestTracker
+_testFailedAsserts tools\cxxtest\cxxtest\TestTracker.h /^ unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;$/;" m class:CxxTest::TestTracker
+_testName tools\cxxtest\cxxtest\QtGui.h /^ QLabel *_suiteName, *_testName, *_testsDone;$/;" m class:CxxTest::QtGui
+_testName tools\cxxtest\cxxtest\RealDescriptions.h /^ const char *_testName;$/;" m class:CxxTest::RealTestDescription
+_testStart tools\cxxtest\cxxtest\Win32Gui.h /^ DWORD _worldStart, _suiteStart, _testStart;$/;" m class:CxxTest::Win32Gui
+_tests tools\cxxtest\cxxtest\RealDescriptions.h /^ List *_tests;$/;" m class:CxxTest::RealSuiteDescription
+_testsDone tools\cxxtest\cxxtest\QtGui.h /^ QLabel *_suiteName, *_testName, *_testsDone;$/;" m class:CxxTest::QtGui
+_testsDone tools\cxxtest\cxxtest\Win32Gui.h /^ unsigned _numTotalTests, _testsDone;$/;" m class:CxxTest::Win32Gui
+_testsDone tools\cxxtest\cxxtest\X11Gui.h /^ unsigned _numTotalTests, _testsDone;$/;" m class:CxxTest::X11Gui
+_textDescent tools\cxxtest\cxxtest\X11Gui.h /^ int _textHeight, _textDescent;$/;" m class:CxxTest::X11Gui
+_textHeight tools\cxxtest\cxxtest\X11Gui.h /^ int _textHeight, _textDescent;$/;" m class:CxxTest::X11Gui
+_timeString tools\cxxtest\cxxtest\Win32Gui.h /^ char _timeString[sizeof("00:00:00")];$/;" m class:CxxTest::Win32Gui
+_title tools\cxxtest\cxxtest\QtGui.h /^ QString _title;$/;" m class:CxxTest::QtGui
+_title tools\cxxtest\cxxtest\Win32Gui.h /^ const char *_title;$/;" m class:CxxTest::Win32Gui
+_tui tools\cxxtest\cxxtest\Gui.h /^ TuiT _tui;$/;" m class:CxxTest::GuiTuiRunner
+_value tools\cxxtest\cxxtest\ValueTraits.h /^ bool _value;$/;" m class:CxxTest::ValueTraits
+_warnings tools\cxxtest\cxxtest\TestTracker.h /^ unsigned _warnings, _failedTests, _testFailedAsserts, _suiteFailedTests, _failedSuites;$/;" m class:CxxTest::TestTracker
+_width tools\cxxtest\cxxtest\X11Gui.h /^ int _width, _height;$/;" m class:CxxTest::X11Gui
+_window tools\cxxtest\cxxtest\X11Gui.h /^ Window _window;$/;" m class:CxxTest::X11Gui
+_windowClass tools\cxxtest\cxxtest\Win32Gui.h /^ WNDCLASSEX _windowClass;$/;" m class:CxxTest::Win32Gui
+_world tools\cxxtest\cxxtest\TestTracker.h /^ const WorldDescription *_world;$/;" m class:CxxTest::TestTracker
+_worldName tools\cxxtest\cxxtest\RealDescriptions.h /^ static const char *_worldName;$/;" m class:CxxTest::RealWorldDescription
+_worldStart tools\cxxtest\cxxtest\Win32Gui.h /^ DWORD _worldStart, _suiteStart, _testStart;$/;" m class:CxxTest::Win32Gui
+_yellowName tools\cxxtest\cxxtest\X11Gui.h /^ const char *_greenName, *_yellowName, *_redName;$/;" m class:CxxTest::X11Gui
+abiflags tools\cxxtest\admin\virtualenv.py /^abiflags = getattr(sys, 'abiflags', '')$/;" v
+abort tools\cxxtest\python\cxxtest\cxxtest_fog.py /^from cxxtest_misc import abort$/;" i
+abort tools\cxxtest\python\cxxtest\cxxtest_misc.py /^def abort( problem ):$/;" f
+abort tools\cxxtest\python\cxxtest\cxxtest_parser.py /^from cxxtest.cxxtest_misc import abort$/;" i
+abort tools\cxxtest\python\cxxtest\cxxtestgen.py /^from cxxtest_misc import abort$/;" i
+abort tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^from .cxxtest_misc import abort$/;" i
+abort tools\cxxtest\python\python3\cxxtest\cxxtest_misc.py /^def abort( problem ):$/;" f
+abort tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^from cxxtest.cxxtest_misc import abort$/;" i
+abort tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^from .cxxtest_misc import abort$/;" i
+abortTestOnFail tools\cxxtest\cxxtest\TestSuite.cpp /^ bool abortTestOnFail()$/;" f namespace:CxxTest
+abs tools\cxxtest\cxxtest\ValueTraits.h /^ template<class N> inline N abs( N n ) { return negative(n) ? -n : n; }$/;" f namespace:CxxTest
+abspath tools\cxxtest\doc\examples\test_examples.py /^from os.path import dirname, abspath, basename$/;" i
+abspath tools\cxxtest\test\test_doc.py /^from os.path import dirname, abspath, abspath, basename$/;" i
+accumulateEnvVar tools\cxxtest\build_tools\SCons\cxxtest.py /^def accumulateEnvVar(dicts, name, default = []):$/;" f
+activateAll tools\cxxtest\cxxtest\LinkedList.cpp /^ void List::activateAll()$/;" f class:CxxTest::List
+activateAllTests tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ void DummySuiteDescription::activateAllTests() {}$/;" f class:CxxTest::DummySuiteDescription
+activateAllTests tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ void DummyWorldDescription::activateAllTests() {}$/;" f class:CxxTest::DummyWorldDescription
+activateAllTests tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealSuiteDescription::activateAllTests()$/;" f class:CxxTest::RealSuiteDescription
+activateAllTests tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealWorldDescription::activateAllTests()$/;" f class:CxxTest::RealWorldDescription
+activateAllTests tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void activateAllTests()$/;" f namespace:CxxTest
+activate_this tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+active tools\cxxtest\cxxtest\LinkedList.cpp /^ bool Link::active() const$/;" f class:CxxTest::Link
+activeWindow tools\cxxtest\test\fake\qapplication.h /^ void *activeWindow() { return 0; }$/;" f class:QApplication
+add tools\cxxtest\cxxtest\XmlFormatter.h /^ void add(const std::string& name_, Type& value_)$/;" f class:CxxTest::ElementInfo
+addLineToBlock tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def addLineToBlock( suite, lineNo, line ):$/;" f
+addLineToBlock tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def addLineToBlock( suite, lineNo, line ):$/;" f
+addSuiteCreateDestroy tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def addSuiteCreateDestroy( suite, which, line ):$/;" f
+addSuiteCreateDestroy tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def addSuiteCreateDestroy( suite, which, line ):$/;" f
+addTest tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def addTest( suite, name, line ):$/;" f
+addTest tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def addTest( suite, name, line ):$/;" f
+addWidget tools\cxxtest\test\fake\qlayout.h /^ void addWidget( void * ) {}$/;" f class:QVBoxLayout
+addWidget tools\cxxtest\test\fake\qstatusbar.h /^ void addWidget( void *, int ) {}$/;" f class:QStatusBar
+add_element tools\cxxtest\cxxtest\XmlFormatter.h /^ element_t add_element(const std::string& name)$/;" f class:CxxTest::TestCaseInfo
+add_function tools\cxxtest\python\cxxtest\cxx_parser.py /^ def add_function(self, fn):$/;" m class:CppInfo
+add_function tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def add_function(self, fn):$/;" m class:CppInfo
+advanceProgressBar tools\cxxtest\cxxtest\QtGui.h /^ void advanceProgressBar()$/;" f class:CxxTest::QtGui
+allocate tools\cxxtest\cxxtest\Win32Gui.h /^ char *allocate( unsigned length )$/;" f class:CxxTest::Win32Gui
+allocated source\cork.cpp /^unsigned int allocated;$/;" v
+args tools\cxxtest\build_tools\SCons\test\eprouvette.py /^args = []$/;" v
+asString tools\cxxtest\cxxtest\QtGui.h /^ static QString asString( unsigned n )$/;" f class:CxxTest::QtGui
+asString tools\cxxtest\cxxtest\StdValueTraits.h /^ const char *asString() const { return _s.c_str(); }$/;" f class:CxxTest::StdTraitsBase
+asString tools\cxxtest\cxxtest\ValueTraits.h /^ const char *asString( void ) const { return _asString; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\cxxtest\ValueTraits.h /^ const char *asString( void ) const { return _value ? "true" : "false"; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\doc\examples\MyClass.h /^ const char *asString() const { return _s; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\doc\examples\TMyClass.h /^ const char *asString() const { return _s.str().c_str(); }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\sample\TraitsTest.h /^ const char *asString() const { return _asString; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\test\LongTraits.h /^ const char *asString() { return "(long *)"; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\test\UserTraits.h /^ const char *asString( void ) { return _asString; }$/;" f class:CxxTest::ValueTraits
+asString tools\cxxtest\test\VoidTraits.h /^ const char *asString( void ) { return "(void *)"; }$/;" f class:CxxTest::ValueTraits
+ascent tools\cxxtest\test\fake\X11\Xlib.h /^struct XFontStruct { int ascent, descent; };$/;" m struct:XFontStruct
+attach tools\cxxtest\cxxtest\LinkedList.cpp /^ void Link::attach( List &l )$/;" f class:CxxTest::Link
+attribute tools\cxxtest\cxxtest\XmlFormatter.h /^ std::map<std::string,std::string> attribute;$/;" m class:CxxTest::ElementInfo
+available tools\cxxtest\test\test_cxxtest.py /^def available(compiler, exe_option):$/;" f
+available_types tools\cxxtest\build_tools\SCons\test\eprouvette.py /^available_types = set(['scons'])$/;" v
+base64 tools\cxxtest\admin\virtualenv.py /^import base64$/;" i
+baseclassdef tools\cxxtest\python\cxxtest\cxxtest_parser.py /^baseclassdef = '(?:public|private|protected)\\s+%s' % (classdef,)$/;" v
+baseclassdef tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^baseclassdef = '(?:public|private|protected)\\s+%s' % (classdef,)$/;" v
+basename tools\cxxtest\doc\examples\test_examples.py /^from os.path import dirname, abspath, basename$/;" i
+basename tools\cxxtest\test\test_doc.py /^from os.path import dirname, abspath, abspath, basename$/;" i
+basestring tools\cxxtest\admin\virtualenv.py /^ basestring = str$/;" v
+bin_obj_lookup tools\rake_utils\tests.rb /^ def bin_obj_lookup()$/;" f class:Tests
+blocks source\cork.cpp /^ BlockTableEntry_T* blocks[TBL_SIZE];$/;" m struct:BlockTable file:
+bname tools\cxxtest\doc\examples\test_examples.py /^ bname = basename(file)$/;" v class:Test
+bootstrap tools\cxxtest\admin\virtualenv.py /^ logger.info("Cannot import bootstrap module: %s" % modname)$/;" i
+bottom tools\cxxtest\test\fake\windows.h /^ LONG left, right, top, bottom;$/;" m struct:RECT
+buffer tools\cxxtest\test\Factor.h /^ char buffer[MAX_STRLEN_TOTAL_TESTS * 2];$/;" m class:Factor
+buffer1 tools\cxxtest\cxxtest\XmlFormatter.h /^ streambuf_t * buffer1;$/;" m class:CxxTest::TeeOutputStreams::teebuffer
+buffer2 tools\cxxtest\cxxtest\XmlFormatter.h /^ streambuf_t * buffer2;$/;" m class:CxxTest::TeeOutputStreams::teebuffer
+bundle_epub tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def bundle_epub(output_file, verbose) $/;" f class:DocBook.Epub
+byteToHex tools\cxxtest\cxxtest\ValueTraits.cpp /^ const char *byteToHex( unsigned char byte )$/;" f namespace:CxxTest
+bytesToString tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *bytesToString( const unsigned char *bytes, unsigned numBytes, unsigned maxBytes, char *s )$/;" f namespace:CxxTest
+cache tools\cxxtest\test\CppTemplateTest.h /^ CXXTEST_STD(list)<T>* cache;$/;" m class:Tests
+cache tools\cxxtest\test\SimpleInheritedTest.h /^ CXXTEST_STD(list)<int>* cache;$/;" m class:Tests
+cache tools\cxxtest\test\SimpleInheritedTest2.h /^ CXXTEST_STD(list)<int>* cache;$/;" m class:Tests
+call_a_requirement tools\cxxtest\build_tools\SCons\test\empty_source_list\requirement.hpp /^bool call_a_requirement() {$/;" f
+call_a_requirement tools\cxxtest\build_tools\SCons\test\globbing\src\requirement.cpp /^bool call_a_requirement() {$/;" f
+call_a_requirement tools\cxxtest\build_tools\SCons\test\multifile_tests\src\requirement.cpp /^bool call_a_requirement() {$/;" f
+call_a_requirement tools\cxxtest\build_tools\SCons\test\recursive_sources\src\requirement.cpp /^bool call_a_requirement() {$/;" f
+call_subprocess tools\cxxtest\admin\virtualenv.py /^def call_subprocess(cmd, show_stdout=True,$/;" f
+capacity tools\cxxtest\sample\SCons\include\stack.h /^ int capacity;$/;" m struct:stack_t
+cbClsExtra tools\cxxtest\test\fake\windows.h /^ int cbClsExtra;$/;" m struct:WNDCLASSEX
+cbSize tools\cxxtest\test\fake\windows.h /^ int cbSize;$/;" m struct:WNDCLASSEX
+cbWndExtra tools\cxxtest\test\fake\windows.h /^ int cbWndExtra;$/;" m struct:WNDCLASSEX
+centerMainWindow tools\cxxtest\cxxtest\Win32Gui.h /^ void centerMainWindow()$/;" f class:CxxTest::Win32Gui
+centerWindow tools\cxxtest\cxxtest\QtGui.h /^ void centerWindow()$/;" f class:CxxTest::QtGui
+centerWindow tools\cxxtest\cxxtest\X11Gui.h /^ void centerWindow()$/;" f class:CxxTest::X11Gui
+change_prefix tools\cxxtest\admin\virtualenv.py /^def change_prefix(filename, dst_prefix):$/;" f
+charToString tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *charToString( char c, char *s )$/;" f namespace:CxxTest
+charToString tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *charToString( unsigned long c, char *s )$/;" f namespace:CxxTest
+checkValue tools\cxxtest\sample\MessageTest.h /^ void checkValue( unsigned value, const char *message )$/;" f class:MessageTest
+check_call tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from subprocess import check_call, CalledProcessError, PIPE$/;" i
+check_if_supported tools\cxxtest\test\test_cxxtest.py /^ def check_if_supported(self, filename, msg):$/;" m class:BaseTestCase
+check_root tools\cxxtest\test\test_cxxtest.py /^ def check_root(self, prefix='', output=None):$/;" m class:BaseTestCase
+className tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string className;$/;" m class:CxxTest::TestCaseInfo
+classdef tools\cxxtest\python\cxxtest\cxxtest_parser.py /^classdef = '(?:::\\s*)?(?:\\w+\\s*::\\s*)*\\w+'$/;" v
+classdef tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^classdef = '(?:::\\s*)?(?:\\w+\\s*::\\s*)*\\w+'$/;" v
+classifiers tools\cxxtest\python\setup.py /^ classifiers = filter(None, classifiers.split("\\n")),$/;" v
+classname tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string classname;$/;" m class:CxxTest::XmlFormatter
+clean_scons tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def clean_scons(t, opts):$/;" f
+clean_test tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def clean_test(t):$/;" f
+cleanup_files tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def cleanup_files(file_list)$/;" f class:DocBook.Epub
+close tools\cxxtest\test\fake\qwidget.h /^ void close( bool ) {}$/;" f class:QWidget
+closeDisplay tools\cxxtest\cxxtest\X11Gui.h /^ void closeDisplay()$/;" f class:CxxTest::X11Gui
+closeSuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def closeSuite():$/;" f
+closeSuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def closeSuite():$/;" f
+codecs tools\cxxtest\python\cxxtest\cxxtest_parser.py /^import codecs$/;" i
+codecs tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^import codecs$/;" i
+collapse_docbook tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def collapse_docbook$/;" f class:DocBook.Epub
+compile tools\cxxtest\test\test_cxxtest.py /^ def compile(self, prefix='', args=None, compile='', output=None, main=None, failGen=False, run=None, logfile=None, failBuild=False):$/;" m class:BaseTestCase
+compile tools\rake_utils\artifact.rb /^ def compile(input,output)$/;" f class:Artifact
+compiler tools\cxxtest\test\test_cxxtest.py /^ compiler='c++ -Wall -W -Werror -g'$/;" v class:TestCpp
+compiler tools\cxxtest\test\test_cxxtest.py /^ compiler='cl -nologo -GX -W4 -WX'$/;" v class:TestCL
+compiler tools\cxxtest\test\test_cxxtest.py /^ compiler='clang++ -v -g -Wall -W -Wshadow -Woverloaded-virtual -Wnon-virtual-dtor -Wreorder -Wsign-promo'$/;" v class:TestClang
+compiler tools\cxxtest\test\test_cxxtest.py /^ compiler='g++ -g -ansi -pedantic -Wmissing-declarations -Werror -Wall -W -Wshadow -Woverloaded-virtual -Wnon-virtual-dtor -Wreorder -Wsign-promo %s' % os.environ.get('CXXTEST_GCOV_FLAGS','')$/;" v class:TestGpp
+compilerre tools\cxxtest\test\test_cxxtest.py /^compilerre = re.compile("^(?P<path>[^:]+)(?P<rest>:[0-9]+:.*)$")$/;" v
+convert tools\cxxtest\admin\virtualenv.py /^def convert(s):$/;" f
+convert tools\cxxtest\test\Factor.h /^ const char *convert( unsigned n )$/;" f class:Factor
+copyString tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *copyString( char *dst, const char *src )$/;" f namespace:CxxTest
+copy_callouts tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def copy_callouts$/;" f class:DocBook.Epub
+copy_csses tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def copy_csses$/;" f class:DocBook.Epub
+copy_fonts tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def copy_fonts$/;" f class:DocBook.Epub
+copy_images tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def copy_images$/;" f class:DocBook.Epub
+copy_required_modules tools\cxxtest\admin\virtualenv.py /^def copy_required_modules(dst_prefix):$/;" f
+copyfile tools\cxxtest\admin\virtualenv.py /^def copyfile(src, dest, symlink=True):$/;" f
+copyfileordir tools\cxxtest\admin\virtualenv.py /^def copyfileordir(src, dest):$/;" f
+countFailure tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::countFailure()$/;" f class:CxxTest::TestTracker
+countWarning tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::countWarning()$/;" f class:CxxTest::TestTracker
+counter tools\cxxtest\doc\examples\MockTestSuite.h /^ int counter;$/;" m class:MockObject
+crawl_tests tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def crawl_tests(target):$/;" f
+createApplication tools\cxxtest\cxxtest\QtGui.h /^ void createApplication( int &argc, char **argv )$/;" f class:CxxTest::QtGui
+createColors tools\cxxtest\cxxtest\X11Gui.h /^ void createColors()$/;" f class:CxxTest::X11Gui
+createFont tools\cxxtest\cxxtest\X11Gui.h /^ void createFont()$/;" f class:CxxTest::X11Gui
+createGc tools\cxxtest\cxxtest\X11Gui.h /^ void createGc()$/;" f class:CxxTest::X11Gui
+createMainWindow tools\cxxtest\cxxtest\QtGui.h /^ void createMainWindow()$/;" f class:CxxTest::QtGui
+createMainWindow tools\cxxtest\cxxtest\Win32Gui.h /^ void createMainWindow()$/;" f class:CxxTest::Win32Gui
+createProgressBar tools\cxxtest\cxxtest\QtGui.h /^ void createProgressBar()$/;" f class:CxxTest::QtGui
+createProgressBar tools\cxxtest\cxxtest\Win32Gui.h /^ void createProgressBar()$/;" f class:CxxTest::Win32Gui
+createStatusBar tools\cxxtest\cxxtest\QtGui.h /^ void createStatusBar()$/;" f class:CxxTest::QtGui
+createStatusBar tools\cxxtest\cxxtest\Win32Gui.h /^ void createStatusBar()$/;" f class:CxxTest::Win32Gui
+createSuite tools\cxxtest\cxxtest\RealDescriptions.h /^ void createSuite()$/;" f class:CxxTest::DynamicSuiteDescription
+createSuite tools\cxxtest\doc\examples\MyTestSuite6.h /^ static MyTestSuite6* createSuite() $/;" f class:MyTestSuite6
+createSuite tools\cxxtest\sample\CreatedTest.h /^ static CreatedTest *createSuite() { return new CreatedTest( 16 ); }$/;" f class:CreatedTest
+createSuite tools\cxxtest\test\EmptySuite.h /^ static EmptySuite *createSuite() { return new EmptySuite(); }$/;" f class:EmptySuite
+createSuite tools\cxxtest\test\Exceptions.h /^ static NullCreate *createSuite() { return 0; }$/;" f class:NullCreate
+createSuite tools\cxxtest\test\Exceptions.h /^ static ThrowCreate *createSuite() { throw -3; }$/;" f class:ThrowCreate
+createSuite tools\cxxtest\test\Exceptions.h /^ static ThrowDestroy *createSuite() { return new ThrowDestroy; }$/;" f class:ThrowDestroy
+createWindow tools\cxxtest\cxxtest\QtGui.h /^ void createWindow( const WorldDescription &wd )$/;" f class:CxxTest::QtGui
+createWindow tools\cxxtest\cxxtest\Win32Gui.h /^ HWND createWindow( LPCTSTR className, DWORD style, HWND parent = (HWND)NULL )$/;" f class:CxxTest::Win32Gui
+createWindow tools\cxxtest\cxxtest\X11Gui.h /^ void createWindow()$/;" f class:CxxTest::X11Gui
+create_bootstrap_script tools\cxxtest\admin\virtualenv.py /^def create_bootstrap_script(extra_text, python_version=''):$/;" f
+create_environment tools\cxxtest\admin\virtualenv.py /^def create_environment(home_dir, site_packages=False, clear=False,$/;" f
+create_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^create_re = re.compile( r'\\bstatic\\s+\\w+\\s*\\*\\s*createSuite\\s*\\(\\s*(void)?\\s*\\)' )$/;" v
+create_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^create_re = re.compile( r'\\bstatic\\s+\\w+\\s*\\*\\s*createSuite\\s*\\(\\s*(void)?\\s*\\)' )$/;" v
+cstr tools\cxxtest\python\cxxtest\cxxtest_fog.py /^def cstr( str ):$/;" f
+cstr tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def cstr( s ):$/;" f
+cstr tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^def cstr( str ):$/;" f
+cstr tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def cstr( s ):$/;" f
+currdir tools\cxxtest\doc\examples\test_examples.py /^currdir = dirname(abspath(__file__))+os.sep$/;" v
+currdir tools\cxxtest\test\test_cxxtest.py /^currdir = os.path.dirname(os.path.abspath(__file__))+os.sep$/;" v
+currdir tools\cxxtest\test\test_doc.py /^ currdir = dirname(abspath(__file__))+os.sep$/;" v
+currentAbortTestOnFail tools\cxxtest\cxxtest\TestSuite.cpp /^ static bool currentAbortTestOnFail = false;$/;" m namespace:CxxTest file:
+currentMaxDumpSize tools\cxxtest\cxxtest\TestSuite.cpp /^ static unsigned currentMaxDumpSize = CXXTEST_MAX_DUMP_SIZE;$/;" m namespace:CxxTest file:
+cxx_parser tools\cxxtest\python\cxxtest\cxxtest_fog.py /^import cxx_parser$/;" i
+cxx_parser tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^from . import cxx_parser$/;" i
+cxxtest tools\cxxtest\python\setup.py /^import cxxtest$/;" i
+cxxtest_fog tools\cxxtest\python\cxxtest\cxxtestgen.py /^ import cxxtest_fog$/;" i
+cxxtest_fog tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^ from . import cxxtest_fog$/;" i
+cxxtest_parser tools\cxxtest\python\cxxtest\cxxtestgen.py /^import cxxtest_parser$/;" i
+cxxtest_parser tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^from . import cxxtest_parser$/;" i
+cxxtestdir tools\cxxtest\test\test_cxxtest.py /^cxxtestdir = os.path.dirname(os.path.dirname(currdir))+os.sep$/;" v
+data tools\cxxtest\doc\examples\MyTestSuite7.h /^ char data[3];$/;" m struct:MyTestSuite7::Data
+data tools\cxxtest\doc\examples\MyTestSuite7.h /^ char data[3];$/;" m struct:MyTestSuite7::Data2
+data tools\cxxtest\test\DefaultTraits.h /^ unsigned char data[8];$/;" m struct:DefaultTraits::EightBytes
+data tools\cxxtest\test\DefaultTraits.h /^ unsigned char data[9];$/;" m struct:DefaultTraits::NineBytes
+data tools\cxxtest\test\SameZero.h /^ char data[4];$/;" m class:SameZero
+datadir tools\cxxtest\doc\examples\test_examples.py /^datadir = currdir$/;" v
+datadir tools\cxxtest\test\test_doc.py /^ datadir = os.sep.join([dirname(dirname(abspath(__file__))),'doc','examples'])+os.sep$/;" v
+deallocate tools\cxxtest\cxxtest\Win32Gui.h /^ void deallocate( char *data )$/;" f class:CxxTest::Win32Gui
+debug tools\cxxtest\admin\virtualenv.py /^ def debug(self, msg, *args, **kw):$/;" m class:Logger
+debug tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def debug(msg):$/;" f
+defaultCxxTestGenLocation tools\cxxtest\build_tools\SCons\cxxtest.py /^def defaultCxxTestGenLocation(env):$/;" f
+default_config_file tools\cxxtest\admin\virtualenv.py /^default_config_file = os.path.join(default_storage_dir, 'virtualenv.ini')$/;" v
+default_storage_dir tools\cxxtest\admin\virtualenv.py /^ default_storage_dir = os.path.join(user_dir, '.virtualenv')$/;" v
+default_storage_dir tools\cxxtest\admin\virtualenv.py /^ default_storage_dir = os.path.join(user_dir, 'virtualenv')$/;" v
+defaults tools\rake_utils\artifact.rb /^ def defaults()$/;" f class:Artifact
+defaults tools\rake_utils\library.rb /^ def defaults()$/;" f class:Library
+defaults tools\rake_utils\tests.rb /^ def defaults()$/;" f class:Tests
+del tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+delta tools\cxxtest\cxxtest\StdTestSuite.h /^struct delta<std::list<X>, std::list<Y>, D>$/;" s namespace:CxxTest
+delta tools\cxxtest\cxxtest\StdTestSuite.h /^struct delta<std::vector<X>, std::vector<Y>, D>$/;" s namespace:CxxTest
+delta tools\cxxtest\cxxtest\TestSuite.h /^ struct delta {$/;" s namespace:CxxTest
+delta_le_helper tools\cxxtest\cxxtest\TestSuite.h /^ bool delta_le_helper( X x, Y y )$/;" f namespace:CxxTest
+descent tools\cxxtest\test\fake\X11\Xlib.h /^struct XFontStruct { int ascent, descent; };$/;" m struct:XFontStruct
+description tools\cxxtest\python\setup.py /^ description = doclines[0],$/;" v
+desktop tools\cxxtest\test\fake\qapplication.h /^ static QWidget *desktop() { return 0; }$/;" f class:QApplication
+destroyGc tools\cxxtest\cxxtest\X11Gui.h /^ void destroyGc()$/;" f class:CxxTest::X11Gui
+destroySuite tools\cxxtest\cxxtest\RealDescriptions.h /^ void destroySuite()$/;" f class:CxxTest::DynamicSuiteDescription
+destroySuite tools\cxxtest\doc\examples\MyTestSuite6.h /^ static void destroySuite( MyTestSuite6* suite ) $/;" f class:MyTestSuite6
+destroySuite tools\cxxtest\sample\CreatedTest.h /^ static void destroySuite( CreatedTest *suite ) { delete suite; }$/;" f class:CreatedTest
+destroySuite tools\cxxtest\test\EmptySuite.h /^ static void destroySuite( EmptySuite *suite ) { delete suite; }$/;" f class:EmptySuite
+destroySuite tools\cxxtest\test\Exceptions.h /^ static void destroySuite( NullCreate * ) { TS_FAIL( "Should not be called" ); }$/;" f class:NullCreate
+destroySuite tools\cxxtest\test\Exceptions.h /^ static void destroySuite( ThrowCreate * ) { TS_FAIL( "Should not be called" ); }$/;" f class:ThrowCreate
+destroySuite tools\cxxtest\test\Exceptions.h /^ static void destroySuite( ThrowDestroy * ) { throw 42; }$/;" f class:ThrowDestroy
+destroyWindow tools\cxxtest\cxxtest\X11Gui.h /^ void destroyWindow()$/;" f class:CxxTest::X11Gui
+destroy_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^destroy_re = re.compile( r'\\bstatic\\s+void\\s+destroySuite\\s*\\(\\s*\\w+\\s*\\*\\s*\\w*\\s*\\)' )$/;" v
+destroy_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^destroy_re = re.compile( r'\\bstatic\\s+void\\s+destroySuite\\s*\\(\\s*\\w+\\s*\\*\\s*\\w*\\s*\\)' )$/;" v
+detach tools\cxxtest\cxxtest\LinkedList.cpp /^ void Link::detach( List &l )$/;" f class:CxxTest::Link
+dict tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+differs tools\cxxtest\cxxtest\TestSuite.h /^ struct differs {$/;" s namespace:CxxTest
+difflib tools\cxxtest\test\test_cxxtest.py /^import difflib$/;" i
+digitToChar tools\cxxtest\cxxtest\ValueTraits.cpp /^ char digitToChar( unsigned digit )$/;" f namespace:CxxTest
+directories tools\rake_utils\artifact.rb /^ def directories()$/;" f class:Artifact
+directories tools\rake_utils\tests.rb /^ def directories()$/;" f class:Tests
+dirname tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+dirname tools\cxxtest\doc\examples\test_examples.py /^from os.path import dirname, abspath, basename$/;" i
+dirname tools\cxxtest\python\setup.py /^from os.path import realpath, dirname$/;" i
+dirname tools\cxxtest\test\test_doc.py /^from os.path import dirname, abspath, abspath, basename$/;" i
+dirre tools\cxxtest\test\test_cxxtest.py /^dirre = re.compile("^([^"+os.sep+"]*\/)*")$/;" v
+distutils tools\cxxtest\admin\virtualenv.py /^import distutils.sysconfig$/;" i
+division tools\cxxtest\python\cxxtest\cxx_parser.py /^from __future__ import division$/;" i
+division tools\cxxtest\python\cxxtest\cxxtest_fog.py /^from __future__ import division$/;" i
+division tools\cxxtest\python\cxxtest\cxxtest_parser.py /^from __future__ import division$/;" i
+division tools\cxxtest\python\cxxtest\cxxtestgen.py /^from __future__ import division$/;" i
+doAbortTest tools\cxxtest\cxxtest\TestSuite.cpp /^ void doAbortTest()$/;" f namespace:CxxTest
+doAssertDelta tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertDelta( const char *file, int line,$/;" f namespace:CxxTest
+doAssertDiffers tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertDiffers( const char *file, int line,$/;" f namespace:CxxTest
+doAssertEquals tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertEquals( const char *file, int line,$/;" f namespace:CxxTest
+doAssertLessThan tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertLessThan( const char *file, int line,$/;" f namespace:CxxTest
+doAssertLessThanEquals tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertLessThanEquals( const char *file, int line,$/;" f namespace:CxxTest
+doAssertPredicate tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertPredicate( const char *file, int line,$/;" f namespace:CxxTest
+doAssertRelation tools\cxxtest\cxxtest\TestSuite.h /^ void doAssertRelation( const char *file, int line,$/;" f namespace:CxxTest
+doAssertSameData tools\cxxtest\cxxtest\TestSuite.cpp /^ void doAssertSameData( const char *file, int line,$/;" f namespace:CxxTest
+doAssertSameFiles tools\cxxtest\cxxtest\TestSuite.cpp /^ void doAssertSameFiles( const char* file, int line,$/;" f namespace:CxxTest
+doFailAssert tools\cxxtest\cxxtest\TestSuite.cpp /^ void doFailAssert( const char *file, int line,$/;" f namespace:CxxTest
+doFailAssertThrows tools\cxxtest\cxxtest\TestSuite.cpp /^ void doFailAssertThrows( const char *file, int line,$/;" f namespace:CxxTest
+doFailAssertThrowsNot tools\cxxtest\cxxtest\TestSuite.cpp /^ void doFailAssertThrowsNot( const char *file, int line,$/;" f namespace:CxxTest
+doFailTest tools\cxxtest\cxxtest\TestSuite.cpp /^ void doFailTest( const char *file, int line, const char *message )$/;" f namespace:CxxTest
+doInitialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void CommonDynamicSuiteDescription::doInitialize( unsigned argCreateLine, unsigned argDestroyLine )$/;" f class:CxxTest::CommonDynamicSuiteDescription
+doInitialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void StaticSuiteDescription::doInitialize( TestSuite &argSuite )$/;" f class:CxxTest::StaticSuiteDescription
+doNegative tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *ValueTraits<const double>::doNegative( double &t )$/;" f class:CxxTest::ValueTraits
+doSupplyFour tools\cxxtest\test\MockTest.h /^ void doSupplyFour( int *p ) { *p = result; }$/;" f class:SupplyFour
+doSupplyThree tools\cxxtest\test\MockTest.h /^ int doSupplyThree() { return result; }$/;" f class:SupplyThree
+doTrace tools\cxxtest\cxxtest\TestSuite.cpp /^ void doTrace( const char *file, int line, const char *message )$/;" f namespace:CxxTest
+doWarn tools\cxxtest\cxxtest\TestSuite.cpp /^ void doWarn( const char *file, int line, const char *message )$/;" f namespace:CxxTest
+doclines tools\cxxtest\python\setup.py /^doclines = cxxtest.__doc__.split("\\n")$/;" v
+doubleToString tools\cxxtest\cxxtest\ValueTraits.cpp /^ char *ValueTraits<const double>::doubleToString( double t, char *s, unsigned skip, unsigned max )$/;" f class:CxxTest::ValueTraits
+drawDividers tools\cxxtest\cxxtest\X11Gui.h /^ void drawDividers()$/;" f class:CxxTest::X11Gui
+drawPercentage tools\cxxtest\cxxtest\X11Gui.h /^ void drawPercentage()$/;" f class:CxxTest::X11Gui
+drawSolidBar tools\cxxtest\cxxtest\X11Gui.h /^ void drawSolidBar()$/;" f class:CxxTest::X11Gui
+dummySuite tools\cxxtest\cxxtest\TestTracker.cpp /^ const SuiteDescription &TestTracker::dummySuite() const$/;" f class:CxxTest::TestTracker
+dummyTest tools\cxxtest\cxxtest\TestTracker.cpp /^ const TestDescription &TestTracker::dummyTest() const$/;" f class:CxxTest::TestTracker
+dummyWorld tools\cxxtest\cxxtest\TestTracker.cpp /^ const WorldDescription &TestTracker::dummyWorld() const$/;" f class:CxxTest::TestTracker
+dummy_enum_ns tools\cxxtest\cxxtest\ValueTraits.h /^namespace dummy_enum_ns {}$/;" n
+dummy_mock_ns tools\cxxtest\cxxtest\Mock.h /^namespace dummy_mock_ns {}$/;" n
+dump tools\cxxtest\cxxtest\ErrorFormatter.h /^ void dump( const void *buffer, unsigned size )$/;" f class:CxxTest::ErrorFormatter
+dumpBuffer tools\cxxtest\cxxtest\ErrorFormatter.h /^ void dumpBuffer( const void *buffer, unsigned size )$/;" f class:CxxTest::ErrorFormatter
+dumpNull tools\cxxtest\cxxtest\ErrorFormatter.h /^ void dumpNull()$/;" f class:CxxTest::ErrorFormatter
+dumpRange tools\cxxtest\cxxtest\StdValueTraits.h /^ void dumpRange( Stream &s, Iterator first, Iterator last )$/;" f namespace:CxxTest
+dwICC tools\cxxtest\test\fake\commctrl.h /^ DWORD dwICC;$/;" m struct:INITCOMMONCONTROLSEX
+dwSize tools\cxxtest\test\fake\commctrl.h /^ DWORD dwSize;$/;" m struct:INITCOMMONCONTROLSEX
+dynamicRun tools\cxxtest\python\cxxtest\cxxtestgen.py /^def dynamicRun( suite, test ):$/;" f
+dynamicRun tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def dynamicRun( suite, test ):$/;" f
+e tools\cxxtest\admin\virtualenv.py /^ e = sys.exc_info()[1]$/;" v
+ehNormals tools\cxxtest\test\test_cxxtest.py /^ ehNormals = "Exceptions.h DynamicAbort.h"$/;" v class:BaseTestCase
+element_t tools\cxxtest\cxxtest\XmlFormatter.h /^ typedef std::list<ElementInfo>::iterator element_t;$/;" t class:CxxTest::TestCaseInfo
+element_t tools\cxxtest\cxxtest\XmlFormatter.h /^ typedef std::list<ElementInfo>::iterator element_t;$/;" t class:CxxTest::XmlFormatter
+elements tools\cxxtest\cxxtest\XmlFormatter.h /^ std::list<ElementInfo> elements;$/;" m class:CxxTest::TestCaseInfo
+empty tools\cxxtest\cxxtest\LinkedList.cpp /^ bool List::empty() const$/;" f class:CxxTest::List
+end_progress tools\cxxtest\admin\virtualenv.py /^ def end_progress(self, msg='done.'):$/;" m class:Logger
+endl tools\cxxtest\cxxtest\ErrorFormatter.h /^ static void endl( OutputStream &o ) { (o << "\\n").flush(); }$/;" f class:CxxTest::OutputStream
+endl tools\cxxtest\cxxtest\ErrorFormatter.h /^ static void endl( OutputStream &o )$/;" f class:CxxTest::ErrorFormatter
+endl tools\cxxtest\cxxtest\XmlFormatter.h /^ static void endl( OutputStream &o )$/;" f class:CxxTest::XmlFormatter
+endofperl tools\cxxtest\sample\msvc\FixFiles.bat /^:endofperl$/;" l
+enterGui tools\cxxtest\cxxtest\Gui.h /^ virtual void enterGui( int & \/*argc*\/, char ** \/*argv*\/ ) {}$/;" f class:CxxTest::GuiListener
+enterGui tools\cxxtest\cxxtest\QtGui.h /^ void enterGui( int &argc, char **argv )$/;" f class:CxxTest::QtGui
+enterGui tools\cxxtest\cxxtest\Win32Gui.h /^ void enterGui( int &argc, char **argv )$/;" f class:CxxTest::Win32Gui
+enterGui tools\cxxtest\cxxtest\X11Gui.h /^ void enterGui( int &argc, char **argv )$/;" f class:CxxTest::X11Gui
+enterSuite tools\cxxtest\cxxtest\ErrorFormatter.h /^ void enterSuite( const SuiteDescription & )$/;" f class:CxxTest::ErrorFormatter
+enterSuite tools\cxxtest\cxxtest\Gui.h /^ void enterSuite( const SuiteDescription &d ) { guiEnterSuite( d.suiteName() ); }$/;" f class:CxxTest::GuiListener
+enterSuite tools\cxxtest\cxxtest\TeeListener.h /^ void enterSuite( const SuiteDescription &d )$/;" f class:CxxTest::TeeListener
+enterSuite tools\cxxtest\cxxtest\TestListener.h /^ virtual void enterSuite( const SuiteDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+enterSuite tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::enterSuite( const SuiteDescription &sd )$/;" f class:CxxTest::TestTracker
+enterSuite tools\cxxtest\cxxtest\XmlFormatter.h /^ void enterSuite( const SuiteDescription& desc )$/;" f class:CxxTest::XmlFormatter
+enterTest tools\cxxtest\cxxtest\ErrorFormatter.h /^ void enterTest( const TestDescription & )$/;" f class:CxxTest::ErrorFormatter
+enterTest tools\cxxtest\cxxtest\Gui.h /^ void enterTest( const TestDescription &d ) { guiEnterTest( d.suiteName(), d.testName() ); }$/;" f class:CxxTest::GuiListener
+enterTest tools\cxxtest\cxxtest\TeeListener.h /^ void enterTest( const TestDescription &d )$/;" f class:CxxTest::TeeListener
+enterTest tools\cxxtest\cxxtest\TestListener.h /^ virtual void enterTest( const TestDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+enterTest tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::enterTest( const TestDescription &td )$/;" f class:CxxTest::TestTracker
+enterTest tools\cxxtest\cxxtest\XmlFormatter.h /^ void enterTest( const TestDescription & desc )$/;" f class:CxxTest::XmlFormatter
+enterWorld tools\cxxtest\cxxtest\ErrorFormatter.h /^ void enterWorld( const WorldDescription & \/*desc*\/ )$/;" f class:CxxTest::ErrorFormatter
+enterWorld tools\cxxtest\cxxtest\Gui.h /^ void enterWorld( const WorldDescription &d ) { guiEnterWorld( d.numTotalTests() ); }$/;" f class:CxxTest::GuiListener
+enterWorld tools\cxxtest\cxxtest\QtGui.h /^ void enterWorld( const WorldDescription &wd )$/;" f class:CxxTest::QtGui
+enterWorld tools\cxxtest\cxxtest\TeeListener.h /^ void enterWorld( const WorldDescription &d )$/;" f class:CxxTest::TeeListener
+enterWorld tools\cxxtest\cxxtest\TestListener.h /^ virtual void enterWorld( const WorldDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+enterWorld tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::enterWorld( const WorldDescription &wd )$/;" f class:CxxTest::TestTracker
+enterWorld tools\cxxtest\cxxtest\Win32Gui.h /^ void enterWorld( const WorldDescription &wd )$/;" f class:CxxTest::Win32Gui
+enterWorld tools\cxxtest\cxxtest\X11Gui.h /^ void enterWorld( const WorldDescription &wd )$/;" f class:CxxTest::X11Gui
+enterWorld tools\cxxtest\cxxtest\XmlFormatter.h /^ void enterWorld( const WorldDescription & \/*desc*\/ )$/;" f class:CxxTest::XmlFormatter
+envget tools\cxxtest\build_tools\SCons\cxxtest.py /^def envget(env, key, default=None):$/;" f
+equals tools\cxxtest\cxxtest\TestSuite.h /^ struct equals {$/;" s namespace:CxxTest
+erase_record source\cork.cpp /^void erase_record(void * ptr)$/;" f
+err tools\cxxtest\cxxtest\XmlFormatter.h /^ std::stringstream err;$/;" m class:CxxTest::TeeOutputStreams
+errno tools\cxxtest\admin\virtualenv.py /^import errno$/;" i
+error tools\cxxtest\admin\virtualenv.py /^ def error(self, msg, *args, **kw):$/;" m class:Logger
+error tools\cxxtest\cxxtest\XmlFormatter.h /^ bool error;$/;" m class:CxxTest::TestCaseInfo
+error_printer tools\cxxtest\cxxtest\XUnitPrinter.h /^ ErrorPrinter error_printer;$/;" m class:CxxTest::XUnitPrinter
+escape tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string escape(const std::string& str)$/;" f class:CxxTest::ElementInfo
+exception_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^exception_re = re.compile( r"\\b(throw|try|catch|TSM?_ASSERT_THROWS[A-Z_]*)\\b" )$/;" v
+exception_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^exception_re = re.compile( r"\\b(throw|try|catch|TSM?_ASSERT_THROWS[A-Z_]*)\\b" )$/;" v
+exe_option tools\cxxtest\test\test_cxxtest.py /^ exe_option = '-o'$/;" v class:TestCL
+exe_option tools\cxxtest\test\test_cxxtest.py /^ exe_option = '-o'$/;" v class:TestClang
+exe_option tools\cxxtest\test\test_cxxtest.py /^ exe_option = '-o'$/;" v class:TestCpp
+exe_option tools\cxxtest\test\test_cxxtest.py /^ exe_option = '-o'$/;" v class:TestGpp
+exec tools\cxxtest\test\fake\qapplication.h /^ void exec() {}$/;" f class:QApplication
+execfile tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+exists tools\cxxtest\build_tools\SCons\cxxtest.py /^def exists(env):$/;" f
+expandWildcards tools\cxxtest\python\cxxtest\cxxtestgen.py /^def expandWildcards( patterns ):$/;" f
+expandWildcards tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def expandWildcards( patterns ):$/;" f
+expand_default tools\cxxtest\admin\virtualenv.py /^ def expand_default(self, option):$/;" m class:UpdatingDefaultsHelpFormatter
+expect_success tools\cxxtest\build_tools\SCons\test\default_env\TestDef.py /^expect_success = True$/;" v
+expected_exe tools\cxxtest\admin\virtualenv.py /^ expected_exe = 'jython'$/;" v
+expected_exe tools\cxxtest\admin\virtualenv.py /^ expected_exe = 'pypy'$/;" v
+expected_exe tools\cxxtest\admin\virtualenv.py /^ expected_exe = 'python'$/;" v
+fail tools\cxxtest\cxxtest\XmlFormatter.h /^ bool fail;$/;" m class:CxxTest::TestCaseInfo
+fail tools\cxxtest\test\DeepAbort.h /^ void fail()$/;" f class:DeepAbort
+failedAssert tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssert( const char *file, int line, const char *expression )$/;" f class:CxxTest::ErrorFormatter
+failedAssert tools\cxxtest\cxxtest\Gui.h /^ void failedAssert( const char * \/*file*\/, int \/*line*\/, const char * \/*expression*\/ )$/;" f class:CxxTest::GuiListener
+failedAssert tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssert( const char *file, int line, const char *expression )$/;" f class:CxxTest::TeeListener
+failedAssert tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssert( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssert tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssert( const char *file, int line, const char *expression )$/;" f class:CxxTest::TestTracker
+failedAssert tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssert( const char *file, int line, const char *expression )$/;" f class:CxxTest::XmlFormatter
+failedAssertDelta tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertDelta( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertDelta tools\cxxtest\cxxtest\Gui.h /^ void failedAssertDelta( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertDelta tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertDelta( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertDelta tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertDelta( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertDelta tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertDelta( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertDelta tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertDelta( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertDiffers tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertDiffers( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertDiffers tools\cxxtest\cxxtest\Gui.h /^ void failedAssertDiffers( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertDiffers tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertDiffers( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertDiffers tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertDiffers( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertDiffers tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertDiffers( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertDiffers tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertDiffers( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertEquals tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertEquals( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertEquals tools\cxxtest\cxxtest\Gui.h /^ void failedAssertEquals( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertEquals tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertEquals( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertEquals tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertEquals( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertEquals tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertEquals( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertEquals tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertEquals( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertLessThan tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertLessThan( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertLessThan tools\cxxtest\cxxtest\Gui.h /^ void failedAssertLessThan( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertLessThan tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertLessThan( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertLessThan tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertLessThan( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertLessThan tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertLessThan( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertLessThan tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertLessThan( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertLessThanEquals tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertLessThanEquals( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertLessThanEquals tools\cxxtest\cxxtest\Gui.h /^ void failedAssertLessThanEquals( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertLessThanEquals tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertLessThanEquals( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertLessThanEquals tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertLessThanEquals( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertLessThanEquals tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertLessThanEquals( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertLessThanEquals tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertLessThanEquals( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertPredicate tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertPredicate( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertPredicate tools\cxxtest\cxxtest\Gui.h /^ void failedAssertPredicate( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertPredicate tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertPredicate( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertPredicate tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertPredicate( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertPredicate tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertPredicate( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertPredicate tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertPredicate( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertRelation tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertRelation( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertRelation tools\cxxtest\cxxtest\Gui.h /^ void failedAssertRelation( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertRelation tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertRelation( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertRelation tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertRelation( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertRelation tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertRelation( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertRelation tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertRelation( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertSameData tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertSameData( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertSameData tools\cxxtest\cxxtest\Gui.h /^ void failedAssertSameData( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertSameData tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertSameData( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertSameData tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertSameData( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertSameData tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertSameData( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertSameData tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertSameData( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertSameFiles tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertSameFiles( const char* file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertSameFiles tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertSameFiles( const char* file, int line, const char* file1, const char* file2, const char* explanation)$/;" f class:CxxTest::TeeListener
+failedAssertSameFiles tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertSameFiles( const char* \/*file*\/, int \/*line*\/, $/;" f class:CxxTest::TestListener
+failedAssertSameFiles tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertSameFiles( const char *file, int line, const char *file1, const char* file2, const char* explanation )$/;" f class:CxxTest::TestTracker
+failedAssertSameFiles tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertSameFiles( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertThrows tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertThrows( const char *file, int line,$/;" f class:CxxTest::ErrorFormatter
+failedAssertThrows tools\cxxtest\cxxtest\Gui.h /^ void failedAssertThrows( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertThrows tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertThrows( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertThrows tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertThrows( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertThrows tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertThrows( const char *file, int line,$/;" f class:CxxTest::TestTracker
+failedAssertThrows tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertThrows( const char *file, int line,$/;" f class:CxxTest::XmlFormatter
+failedAssertThrowsNot tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedAssertThrowsNot( const char *file, int line, const char *expression )$/;" f class:CxxTest::ErrorFormatter
+failedAssertThrowsNot tools\cxxtest\cxxtest\Gui.h /^ void failedAssertThrowsNot( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::GuiListener
+failedAssertThrowsNot tools\cxxtest\cxxtest\TeeListener.h /^ void failedAssertThrowsNot( const char *file, int line,$/;" f class:CxxTest::TeeListener
+failedAssertThrowsNot tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedAssertThrowsNot( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedAssertThrowsNot tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedAssertThrowsNot( const char *file, int line, const char *expression )$/;" f class:CxxTest::TestTracker
+failedAssertThrowsNot tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedAssertThrowsNot( const char *file, int line, const char *expression )$/;" f class:CxxTest::XmlFormatter
+failedSuites tools\cxxtest\cxxtest\TestTracker.h /^ unsigned failedSuites() const { return _failedSuites; }$/;" f class:CxxTest::TestTracker
+failedTest tools\cxxtest\cxxtest\ErrorFormatter.h /^ void failedTest( const char *file, int line, const char *expression )$/;" f class:CxxTest::ErrorFormatter
+failedTest tools\cxxtest\cxxtest\Gui.h /^ void failedTest( const char * \/*file*\/, int \/*line*\/, const char * \/*expression*\/ )$/;" f class:CxxTest::GuiListener
+failedTest tools\cxxtest\cxxtest\TeeListener.h /^ void failedTest( const char *file, int line, const char *expression )$/;" f class:CxxTest::TeeListener
+failedTest tools\cxxtest\cxxtest\TestListener.h /^ virtual void failedTest( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+failedTest tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::failedTest( const char *file, int line, const char *expression )$/;" f class:CxxTest::TestTracker
+failedTest tools\cxxtest\cxxtest\XmlFormatter.h /^ void failedTest( const char* file, int line, const char* expression )$/;" f class:CxxTest::XmlFormatter
+failedTests tools\cxxtest\cxxtest\TestTracker.h /^ unsigned failedTests() const { return _failedTests; }$/;" f class:CxxTest::TestTracker
+fatal tools\cxxtest\admin\virtualenv.py /^ def fatal(self, msg, *args, **kw):$/;" m class:Logger
+file source\cork.cpp /^ const char* file;$/;" m struct:BlockTableEntry file:
+file tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const char *DummySuiteDescription::file() const { return "<no file>"; }$/;" f class:CxxTest::DummySuiteDescription
+file tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const char *DummyTestDescription::file() const { return "<no file>"; }$/;" f class:CxxTest::DummyTestDescription
+file tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const char *RealSuiteDescription::file() const { return _file; }$/;" f class:CxxTest::RealSuiteDescription
+file tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const char *RealTestDescription::file() const { return _suite->file(); }$/;" f class:CxxTest::RealTestDescription
+file_diff tools\cxxtest\test\test_cxxtest.py /^def file_diff(filename1, filename2):$/;" f
+file_search_dirs tools\cxxtest\admin\virtualenv.py /^def file_search_dirs():$/;" f
+filter tools\cxxtest\doc\examples\test_examples.py /^def filter(line):$/;" f
+filter_ez_setup tools\cxxtest\admin\virtualenv.py /^def filter_ez_setup(line, project_name='setuptools'):$/;" f
+findCxxTestGen tools\cxxtest\build_tools\SCons\cxxtest.py /^def findCxxTestGen(env):$/;" f
+findCxxTestHeaders tools\cxxtest\build_tools\SCons\cxxtest.py /^def findCxxTestHeaders(env):$/;" f
+find_class tools\cxxtest\python\cxxtest\cxx_parser.py /^ def find_class(self,name,scope):$/;" m class:CppInfo
+find_class tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def find_class(self,name,scope):$/;" m class:CppInfo
+firstGlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture *GlobalFixture::firstGlobalFixture() { return (GlobalFixture *)_list.head(); }$/;" f class:CxxTest::GlobalFixture
+firstSuite tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ SuiteDescription *DummyWorldDescription::firstSuite() { return 0; }$/;" f class:CxxTest::DummyWorldDescription
+firstSuite tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const SuiteDescription *DummyWorldDescription::firstSuite() const { return 0; }$/;" f class:CxxTest::DummyWorldDescription
+firstSuite tools\cxxtest\cxxtest\RealDescriptions.cpp /^ SuiteDescription *RealWorldDescription::firstSuite()$/;" f class:CxxTest::RealWorldDescription
+firstSuite tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const SuiteDescription *RealWorldDescription::firstSuite() const$/;" f class:CxxTest::RealWorldDescription
+firstTest tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ TestDescription *DummySuiteDescription::firstTest() { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+firstTest tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const TestDescription *DummySuiteDescription::firstTest() const { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+firstTest tools\cxxtest\cxxtest\RealDescriptions.cpp /^ TestDescription *RealSuiteDescription::firstTest() { return (RealTestDescription *)_tests->head(); }$/;" f class:CxxTest::RealSuiteDescription
+firstTest tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const TestDescription *RealSuiteDescription::firstTest() const { return (const RealTestDescription *)_tests->head(); }$/;" f class:CxxTest::RealSuiteDescription
+fixBackslashes tools\cxxtest\python\cxxtest\cxxtestgen.py /^def fixBackslashes( fileName ):$/;" f
+fixBackslashes tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def fixBackslashes( fileName ):$/;" f
+fixBlockLine tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def fixBlockLine( suite, lineNo, line):$/;" f
+fixBlockLine tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def fixBlockLine( suite, lineNo, line):$/;" f
+fixSuite tools\cxxtest\cxxtest\TestTracker.cpp /^ const SuiteDescription *TestTracker::fixSuite( const SuiteDescription *d ) const$/;" f class:CxxTest::TestTracker
+fixTest tools\cxxtest\cxxtest\TestTracker.cpp /^ const TestDescription *TestTracker::fixTest( const TestDescription *d ) const$/;" f class:CxxTest::TestTracker
+fixWorld tools\cxxtest\cxxtest\TestTracker.cpp /^ const WorldDescription *TestTracker::fixWorld( const WorldDescription *d ) const$/;" f class:CxxTest::TestTracker
+fix_lib64 tools\cxxtest\admin\virtualenv.py /^def fix_lib64(lib_dir):$/;" f
+fix_local_scheme tools\cxxtest\admin\virtualenv.py /^def fix_local_scheme(home_dir):$/;" f
+fixture tools\cxxtest\test\GfSetUpFails.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\GfSetUpThrows.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\GfTearDownFails.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\GfTearDownThrows.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\SetUpWorldError.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\SetUpWorldFails.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\SetUpWorldThrows.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\TearDownWorldFails.h /^static Fixture fixture;$/;" v
+fixture tools\cxxtest\test\TearDownWorldThrows.h /^static Fixture fixture;$/;" v
+fixture1 tools\cxxtest\doc\examples\MyTestSuite8.h /^static Fixture1 fixture1;$/;" v
+fixture1 tools\cxxtest\test\GlobalFixtures.h /^static Fixture1 fixture1;$/;" v
+fixture2 tools\cxxtest\doc\examples\MyTestSuite8.h /^static Fixture2 fixture2;$/;" v
+fixture2 tools\cxxtest\test\GlobalFixtures.h /^static Fixture2 fixture2;$/;" v
+fixup_egg_link tools\cxxtest\admin\virtualenv.py /^def fixup_egg_link(filename):$/;" f
+fixup_pth_and_egg_link tools\cxxtest\admin\virtualenv.py /^def fixup_pth_and_egg_link(home_dir, sys_path=None):$/;" f
+fixup_pth_file tools\cxxtest\admin\virtualenv.py /^def fixup_pth_file(filename):$/;" f
+fixup_scripts tools\cxxtest\admin\virtualenv.py /^def fixup_scripts(home_dir):$/;" f
+flatten tools\cxxtest\python\cxxtest\cxx_parser.py /^def flatten(x):$/;" f
+flatten tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def flatten(x):$/;" f
+flush tools\cxxtest\cxxtest\ErrorFormatter.h /^ virtual void flush() {};$/;" f class:CxxTest::OutputStream
+flush tools\cxxtest\cxxtest\StdioFilePrinter.h /^ void flush() { fflush( _o ); }$/;" f class:CxxTest::StdioFilePrinter::Adapter
+flush tools\cxxtest\cxxtest\X11Gui.h /^ void flush()$/;" f class:CxxTest::X11Gui
+flush tools\cxxtest\cxxtest\XmlPrinter.h /^ void flush() { _o.flush(); }$/;" f class:CxxTest::XmlPrinter::Adapter
+fname tools\cxxtest\doc\include_anchors.py /^ fname = m.group(1)+m.group(2)+'.'+suffix$/;" v
+fog tools\cxxtest\test\test_cxxtest.py /^ fog=''$/;" v class:BaseTestCase
+fog tools\cxxtest\test\test_cxxtest.py /^ fog='-f'$/;" v class:TestCLFOG
+fog tools\cxxtest\test\test_cxxtest.py /^ fog='-f'$/;" v class:TestClangFOG
+fog tools\cxxtest\test\test_cxxtest.py /^ fog='-f'$/;" v class:TestCppFOG
+fog tools\cxxtest\test\test_cxxtest.py /^ fog='-f'$/;" v class:TestGppFOG
+foo tools\cxxtest\build_tools\SCons\test\globbing_edmundo\hello.cc /^Hello::foo(int x, int y)$/;" f class:Hello
+foo tools\cxxtest\test\ForceNoEh.h /^ void foo()$/;" f class:ForceNoEh
+free source\cork.cpp 5;" d file:
+freeFontInfo tools\cxxtest\cxxtest\X11Gui.h /^ void freeFontInfo()$/;" f class:CxxTest::X11Gui
+g:CScopeDir project.vim /^let g:CScopeDir = g:ProjectPath$/;" v
+g:CTagsFile project.vim /^let g:CTagsFile = g:CScopeDir . "\/tags"$/;" v
+g:ProjectPath project.vim /^let g:ProjectPath = getcwd()$/;" v
+g:TestSrcPath project.vim /^let g:TestSrcPath = g:ProjectPath . "\/tests"$/;" v
+general_suite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^ % (classdef, baseclassdef,)$/;" v
+general_suite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^ % (classdef, baseclassdef,)$/;" v
+generate tools\cxxtest\build_tools\SCons\cxxtest.py /^def generate(env, **kwargs):$/;" f
+generateRandomNumber tools\cxxtest\doc\examples\rand_example.cpp /^int generateRandomNumber()$/;" f
+generateSuite tools\cxxtest\python\cxxtest\cxxtestgen.py /^def generateSuite( output, suite ):$/;" f
+generateSuite tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def generateSuite( output, suite ):$/;" f
+generate_test_runner tools\rake_utils\tests.rb /^ def generate_test_runner(input,output)$/;" f class:Tests
+generatedSuite_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^generatedSuite_re = re.compile( r'\\bCXXTEST_SUITE\\s*\\(\\s*(\\w*)\\s*\\)' )$/;" v
+generatedSuite_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^generatedSuite_re = re.compile( r'\\bCXXTEST_SUITE\\s*\\(\\s*(\\w*)\\s*\\)' )$/;" v
+getColor tools\cxxtest\cxxtest\X11Gui.h /^ unsigned long getColor( const char *colorName )$/;" f class:CxxTest::X11Gui
+getFontInfo tools\cxxtest\cxxtest\X11Gui.h /^ void getFontInfo()$/;" f class:CxxTest::X11Gui
+getOpaque tools\cxxtest\test\MockTest.h /^ Opaque getOpaque( int ) { return result; }$/;" f class:MockGetOpaque
+getOpaque tools\cxxtest\test\MockTest.h /^static Opaque getOpaque( int i ) $/;" f
+getScreenArea tools\cxxtest\cxxtest\Win32Gui.h /^ void getScreenArea( RECT &area )$/;" f class:CxxTest::Win32Gui
+getScreenAreaWithoutTaskbar tools\cxxtest\cxxtest\Win32Gui.h /^ bool getScreenAreaWithoutTaskbar( RECT &area )$/;" f class:CxxTest::Win32Gui
+getText tools\cxxtest\doc\guide.html /^ function getText(el) {$/;" f
+getTotalTests tools\cxxtest\cxxtest\QtGui.h /^ void getTotalTests( const WorldDescription &wd )$/;" f class:CxxTest::QtGui
+getTotalTests tools\cxxtest\cxxtest\QtGui.h /^ void getTotalTests()$/;" f class:CxxTest::QtGui
+getTotalTests tools\cxxtest\cxxtest\Win32Gui.h /^ void getTotalTests( const WorldDescription &wd )$/;" f class:CxxTest::Win32Gui
+getTotalTests tools\cxxtest\cxxtest\Win32Gui.h /^ void getTotalTests()$/;" f class:CxxTest::Win32Gui
+getTotalTests tools\cxxtest\cxxtest\X11Gui.h /^ void getTotalTests( const WorldDescription &wd )$/;" f class:CxxTest::X11Gui
+getTotalTests tools\cxxtest\cxxtest\X11Gui.h /^ void getTotalTests()$/;" f class:CxxTest::X11Gui
+getWholeScreenArea tools\cxxtest\cxxtest\Win32Gui.h /^ void getWholeScreenArea( RECT &area )$/;" f class:CxxTest::Win32Gui
+getWindowSize tools\cxxtest\cxxtest\X11Gui.h /^ void getWindowSize()$/;" f class:CxxTest::X11Gui
+get_bin_extension tools\rake_utils\artifact.rb /^ def get_bin_extension()$/;" f class:Artifact
+get_config_files tools\cxxtest\admin\virtualenv.py /^ def get_config_files(self):$/;" m class:ConfigOptionParser
+get_config_section tools\cxxtest\admin\virtualenv.py /^ def get_config_section(self, name):$/;" m class:ConfigOptionParser
+get_default_values tools\cxxtest\admin\virtualenv.py /^ def get_default_values(self):$/;" m class:ConfigOptionParser
+get_environ_vars tools\cxxtest\admin\virtualenv.py /^ def get_environ_vars(self, prefix='VIRTUALENV_'):$/;" m class:ConfigOptionParser
+get_functions tools\cxxtest\python\cxxtest\cxx_parser.py /^ def get_functions(self,name,quiet=False):$/;" m class:CppInfo
+get_functions tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def get_functions(self,name,quiet=False):$/;" m class:CppInfo
+get_image_refs tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def get_image_refs$/;" f class:DocBook.Epub
+get_rest tools\cxxtest\python\cxxtest\cxx_parser.py /^def get_rest(p):$/;" f
+get_rest tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def get_rest(p):$/;" f
+glob tools\cxxtest\doc\examples\test_examples.py /^import glob$/;" i
+glob tools\cxxtest\python\convert.py /^import glob$/;" i
+glob tools\cxxtest\python\cxxtest\cxxtestgen.py /^import glob$/;" i
+glob tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^import glob$/;" i
+glob tools\cxxtest\test\test_cxxtest.py /^import glob$/;" i
+goodFunction tools\cxxtest\sample\ExceptionTest.h /^ void goodFunction( int )$/;" f class:ExceptionTest
+greenBar tools\cxxtest\cxxtest\Win32Gui.h /^ void greenBar()$/;" f class:CxxTest::Win32Gui
+gui tools\cxxtest\cxxtest\Win32Gui.h /^ void gui()$/;" f class:CxxTest::Win32Gui
+guiEnterSuite tools\cxxtest\cxxtest\Gui.h /^ virtual void guiEnterSuite( const char * \/*suiteName*\/ ) {}$/;" f class:CxxTest::GuiListener
+guiEnterSuite tools\cxxtest\cxxtest\QtGui.h /^ void guiEnterSuite( const char *suiteName )$/;" f class:CxxTest::QtGui
+guiEnterSuite tools\cxxtest\cxxtest\Win32Gui.h /^ void guiEnterSuite( const char *suiteName )$/;" f class:CxxTest::Win32Gui
+guiEnterTest tools\cxxtest\cxxtest\Gui.h /^ virtual void guiEnterTest( const char * \/*suiteName*\/, const char * \/*testName*\/ ) {}$/;" f class:CxxTest::GuiListener
+guiEnterTest tools\cxxtest\cxxtest\QtGui.h /^ void guiEnterTest( const char *suiteName, const char *testName )$/;" f class:CxxTest::QtGui
+guiEnterTest tools\cxxtest\cxxtest\Win32Gui.h /^ void guiEnterTest( const char *suiteName, const char *testName )$/;" f class:CxxTest::Win32Gui
+guiEnterTest tools\cxxtest\cxxtest\X11Gui.h /^ void guiEnterTest( const char *suiteName, const char *testName )$/;" f class:CxxTest::X11Gui
+guiEnterTest tools\cxxtest\test\cxxtest\DummyGui.h /^ void guiEnterTest( const char *suiteName, const char *testName )$/;" f class:CxxTest::DummyGui
+guiEnterWorld tools\cxxtest\cxxtest\Gui.h /^ virtual void guiEnterWorld( unsigned \/*numTotalTests*\/ ) {}$/;" f class:CxxTest::GuiListener
+guiEnterWorld tools\cxxtest\test\cxxtest\DummyGui.h /^ void guiEnterWorld( unsigned numTotalTests )$/;" f class:CxxTest::DummyGui
+guiInputs tools\cxxtest\test\test_cxxtest.py /^guiInputs=currdir+'..\/sample\/gui\/GreenYellowRed.h'$/;" v
+guiThread tools\cxxtest\cxxtest\Win32Gui.h /^ static DWORD WINAPI guiThread( LPVOID parameter )$/;" f class:CxxTest::Win32Gui
+hCursor tools\cxxtest\test\fake\windows.h /^ HCURSOR hCursor;$/;" m struct:WNDCLASSEX
+hIcon tools\cxxtest\test\fake\windows.h /^ HICON hIcon;$/;" m struct:WNDCLASSEX
+hIconSm tools\cxxtest\test\fake\windows.h /^ HICON hIconSm;$/;" m struct:WNDCLASSEX
+hInstance tools\cxxtest\test\fake\windows.h /^ HINSTANCE hInstance;$/;" m struct:WNDCLASSEX
+handle tools\cxxtest\cxxtest\Win32Gui.h /^ LRESULT handle( HWND window, UINT message, WPARAM wParam, LPARAM lParam )$/;" f class:CxxTest::Win32Gui
+has_callouts? tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def has_callouts?$/;" f class:DocBook.Epub
+hbrBackground tools\cxxtest\test\fake\windows.h /^ HBRUSH hbrBackground;$/;" m struct:WNDCLASSEX
+head tools\cxxtest\cxxtest\LinkedList.cpp /^ Link *List::head()$/;" f class:CxxTest::List
+head tools\cxxtest\cxxtest\LinkedList.cpp /^ const Link *List::head() const$/;" f class:CxxTest::List
+height tools\cxxtest\test\fake\X11\Xlib.h /^struct XWindowAttributes { int width, height; };$/;" m struct:XWindowAttributes
+height tools\cxxtest\test\fake\qwidget.h /^ int height() { return 0; }$/;" f class:QWidget
+helloTestSuite tools\cxxtest\build_tools\SCons\test\globbing_edmundo\hellotest.t.h /^class helloTestSuite : public CxxTest::TestSuite $/;" c
+hugeNumber tools\cxxtest\cxxtest\ValueTraits.cpp /^ void ValueTraits<const double>::hugeNumber( double t )$/;" f class:CxxTest::ValueTraits
+i tools\cxxtest\test\DoubleCall.h /^ int i;$/;" m class:DoubleCall
+i tools\cxxtest\test\ThrowsAssert.h /^ int i() const { return _i; }$/;" f class:Thing
+i_need_me tools\cxxtest\build_tools\SCons\test\need_cpppath\src\cpppathdir\include.h /^int i_need_me() {$/;" f
+i_need_me tools\cxxtest\build_tools\SCons\test\string_cpppath\src\cpppathdir\include.h /^int i_need_me() {$/;" f
+i_need_me tools\cxxtest\build_tools\SCons\test\target_syntax\src\cpppathdir\include.h /^int i_need_me() {$/;" f
+identifier_lineno tools\cxxtest\python\cxxtest\cxx_parser.py /^identifier_lineno = {}$/;" v
+identifier_lineno tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^identifier_lineno = {}$/;" v
+identity tools\cxxtest\test\MockTest.h /^ double identity( double ) { return result; }$/;" f class:MockDoubleIdentity
+identity tools\cxxtest\test\MockTest.h /^ int identity( int ) { return result; }$/;" f class:MockIntIdentity
+identity tools\cxxtest\test\MockTest.h /^ static double identity( double d ) { return d; }$/;" f namespace:NameSpace
+identity tools\cxxtest\test\MockTest.h /^ static int identity( int i ) { return i; }$/;" f namespace:NameSpace
+imp tools\cxxtest\admin\virtualenv.py /^ import imp$/;" i
+imported_fog tools\cxxtest\python\cxxtest\cxxtestgen.py /^ imported_fog=False$/;" v
+imported_fog tools\cxxtest\python\cxxtest\cxxtestgen.py /^ imported_fog=True$/;" v
+imported_fog tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^ imported_fog=False$/;" v
+imported_fog tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^ imported_fog=True$/;" v
+inBlock tools\cxxtest\python\cxxtest\cxxtest_parser.py /^inBlock = 0$/;" v
+inBlock tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^inBlock = 0$/;" v
+include_option tools\cxxtest\test\test_cxxtest.py /^ include_option = '-I'$/;" v class:TestCL
+include_option tools\cxxtest\test\test_cxxtest.py /^ include_option = '-I'$/;" v class:TestClang
+include_option tools\cxxtest\test\test_cxxtest.py /^ include_option = '-I'$/;" v class:TestCpp
+include_option tools\cxxtest\test\test_cxxtest.py /^ include_option = '-I'$/;" v class:TestGpp
+include_re tools\cxxtest\python\cxxtest\cxxtestgen.py /^include_re = re.compile( r"\\s*\\#\\s*include\\s+<cxxtest\/" )$/;" v
+include_re tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^include_re = re.compile( r"\\s*\\#\\s*include\\s+<cxxtest\/" )$/;" v
+increment tools\cxxtest\test\DoubleCall.h /^ int increment()$/;" f class:DoubleCall
+info tools\cxxtest\admin\virtualenv.py /^ def info(self, msg, *args, **kw):$/;" m class:Logger
+info tools\cxxtest\cxxtest\XmlFormatter.h /^ std::list<TestCaseInfo> info;$/;" m class:CxxTest::XmlFormatter
+init tools\cxxtest\test\test_cxxtest.py /^ def init(self, prefix):$/;" m class:BaseTestCase
+initCommonControls tools\cxxtest\cxxtest\Win32Gui.h /^ void initCommonControls()$/;" f class:CxxTest::Win32Gui
+initialize tools\cxxtest\cxxtest\LinkedList.cpp /^ void List::initialize()$/;" f class:CxxTest::List
+initialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void CommonDynamicSuiteDescription::initialize( const char *argFile, unsigned argLine,$/;" f class:CxxTest::CommonDynamicSuiteDescription
+initialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealSuiteDescription::initialize( const char *argFile,$/;" f class:CxxTest::RealSuiteDescription
+initialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealTestDescription::initialize( List &argList,$/;" f class:CxxTest::RealTestDescription
+initialize tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void StaticSuiteDescription::initialize( const char *argFile, unsigned argLine,$/;" f class:CxxTest::StaticSuiteDescription
+initialize tools\cxxtest\cxxtest\RealDescriptions.h /^ void initialize( const char *argFile, unsigned argLine,$/;" f class:CxxTest::DynamicSuiteDescription
+initialize tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::initialize()$/;" f class:CxxTest::TestTracker
+initialize tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def initialize(docbook_file, output_dir=OUTPUT_DIR, css_file=nil, customization_layer=nil, embedded_fonts=[])$/;" f class:DocBook.Epub
+initialize tools\rake_utils\artifact.rb /^ def initialize(config)$/;" f class:Artifact
+initialize tools\rake_utils\binary.rb /^ def initialize(config)$/;" f class:Binary
+initialize tools\rake_utils\library.rb /^ def initialize(config)$/;" f class:Library
+initialize tools\rake_utils\tests.rb /^ def initialize(config)$/;" f class:Tests
+initializeBar tools\cxxtest\cxxtest\X11Gui.h /^ void initializeBar( const WorldDescription &wd )$/;" f class:CxxTest::X11Gui
+initializeEvents tools\cxxtest\cxxtest\X11Gui.h /^ void initializeEvents()$/;" f class:CxxTest::X11Gui
+insert tools\cxxtest\python\cxxtest\cxx_parser.py /^ def insert(self,scope):$/;" m class:Scope
+insert tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def insert(self,scope):$/;" m class:Scope
+insert_record source\cork.cpp /^void insert_record(void * ptr, BlockTableEntry_T* entry)$/;" f
+install_activate tools\cxxtest\admin\virtualenv.py /^def install_activate(home_dir, bin_dir, prompt=None):$/;" f
+install_distribute tools\cxxtest\admin\virtualenv.py /^def install_distribute(py_executable, unzip=False,$/;" f
+install_distutils tools\cxxtest\admin\virtualenv.py /^def install_distutils(home_dir):$/;" f
+install_pip tools\cxxtest\admin\virtualenv.py /^def install_pip(py_executable, search_dirs=None, never_download=False):$/;" f
+install_python tools\cxxtest\admin\virtualenv.py /^def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):$/;" f
+install_setuptools tools\cxxtest\admin\virtualenv.py /^def install_setuptools(py_executable, unzip=False,$/;" f
+invalid tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def self.invalid?(file)$/;" F class:DocBook.Epub
+isDynamic tools\cxxtest\python\cxxtest\cxxtestgen.py /^def isDynamic(suite):$/;" f
+isDynamic tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def isDynamic(suite):$/;" f
+isGenerated tools\cxxtest\python\cxxtest\cxxtestgen.py /^def isGenerated(suite):$/;" f
+isGenerated tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def isGenerated(suite):$/;" f
+isMinimized tools\cxxtest\test\fake\qwidget.h /^ bool isMinimized() { return false; }$/;" f class:QWidget
+isValidScriptPath tools\cxxtest\build_tools\SCons\cxxtest.py /^def isValidScriptPath(cxxtestgen):$/;" f
+is_baseclass tools\cxxtest\python\cxxtest\cxx_parser.py /^ def is_baseclass(self,cls,base):$/;" m class:CppInfo
+is_baseclass tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def is_baseclass(self,cls,base):$/;" m class:CppInfo
+is_executable tools\cxxtest\admin\virtualenv.py /^def is_executable(exe):$/;" f
+is_jython tools\cxxtest\admin\virtualenv.py /^is_jython = sys.platform.startswith('java')$/;" v
+is_pypy tools\cxxtest\admin\virtualenv.py /^is_pypy = hasattr(sys, 'pypy_version_info')$/;" v
+is_win tools\cxxtest\admin\virtualenv.py /^is_win = (sys.platform == 'win32')$/;" v
+isdir tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from os.path import isdir, isfile, islink, join$/;" i
+isfile tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from os.path import isdir, isfile, islink, join$/;" i
+islink tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from os.path import isdir, isfile, islink, join$/;" i
+join tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+join tools\cxxtest\admin\virtualenv.py /^join = os.path.join$/;" v
+join tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from os.path import isdir, isfile, islink, join$/;" i
+justNext tools\cxxtest\cxxtest\LinkedList.cpp /^ Link * Link::justNext()$/;" f class:CxxTest::Link
+justPrev tools\cxxtest\cxxtest\LinkedList.cpp /^ Link * Link::justPrev()$/;" f class:CxxTest::Link
+keep tools\cxxtest\cxxtest\QtGui.h /^ bool keep()$/;" f class:CxxTest::QtGui
+keep tools\cxxtest\cxxtest\Win32Gui.h /^ bool keep()$/;" f class:CxxTest::Win32Gui
+keywords tools\cxxtest\python\setup.py /^ keywords=['utility'],$/;" v
+lastGlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture *GlobalFixture::lastGlobalFixture() { return (GlobalFixture *)_list.tail(); }$/;" f class:CxxTest::GlobalFixture
+lastIncluded tools\cxxtest\python\cxxtest\cxxtestgen.py /^lastIncluded = ''$/;" v
+lastIncluded tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^lastIncluded = ''$/;" v
+lastSeed tools\cxxtest\sample\mock\MockStdlib.h /^ unsigned lastSeed;$/;" m class:MockStdlib
+leaveGui tools\cxxtest\cxxtest\Gui.h /^ virtual void leaveGui() {}$/;" f class:CxxTest::GuiListener
+leaveGui tools\cxxtest\cxxtest\QtGui.h /^ void leaveGui()$/;" f class:CxxTest::QtGui
+leaveGui tools\cxxtest\cxxtest\Win32Gui.h /^ void leaveGui()$/;" f class:CxxTest::Win32Gui
+leaveGui tools\cxxtest\cxxtest\X11Gui.h /^ void leaveGui()$/;" f class:CxxTest::X11Gui
+leaveOnly tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummySuiteDescription::leaveOnly( const char * \/*testName*\/ ) { return false; }$/;" f class:CxxTest::DummySuiteDescription
+leaveOnly tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummyWorldDescription::leaveOnly( const char * \/*suiteName*\/, const char * \/*testName*\/ ) { return false; }$/;" f class:CxxTest::DummyWorldDescription
+leaveOnly tools\cxxtest\cxxtest\LinkedList.cpp /^ void List::leaveOnly( const Link &link )$/;" f class:CxxTest::List
+leaveOnly tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealSuiteDescription::leaveOnly( const char *testName )$/;" f class:CxxTest::RealSuiteDescription
+leaveOnly tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealWorldDescription::leaveOnly( const char *suiteName, const char *testName )$/;" f class:CxxTest::RealWorldDescription
+leaveOnly tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool leaveOnly( const char *suiteName, const char *testName )$/;" f namespace:CxxTest
+leaveSuite tools\cxxtest\cxxtest\Gui.h /^ void leaveSuite( const SuiteDescription & ) {}$/;" f class:CxxTest::GuiListener
+leaveSuite tools\cxxtest\cxxtest\TeeListener.h /^ void leaveSuite( const SuiteDescription &d )$/;" f class:CxxTest::TeeListener
+leaveSuite tools\cxxtest\cxxtest\TestListener.h /^ virtual void leaveSuite( const SuiteDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+leaveSuite tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::leaveSuite( const SuiteDescription &sd )$/;" f class:CxxTest::TestTracker
+leaveSuite tools\cxxtest\cxxtest\XmlFormatter.h /^ void leaveSuite( const SuiteDescription & )$/;" f class:CxxTest::XmlFormatter
+leaveTest tools\cxxtest\cxxtest\ErrorFormatter.h /^ void leaveTest( const TestDescription & )$/;" f class:CxxTest::ErrorFormatter
+leaveTest tools\cxxtest\cxxtest\Gui.h /^ void leaveTest( const TestDescription & ) {}$/;" f class:CxxTest::GuiListener
+leaveTest tools\cxxtest\cxxtest\TeeListener.h /^ void leaveTest( const TestDescription &d )$/;" f class:CxxTest::TeeListener
+leaveTest tools\cxxtest\cxxtest\TestListener.h /^ virtual void leaveTest( const TestDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+leaveTest tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::leaveTest( const TestDescription &td )$/;" f class:CxxTest::TestTracker
+leaveTest tools\cxxtest\cxxtest\XmlFormatter.h /^ void leaveTest( const TestDescription & )$/;" f class:CxxTest::XmlFormatter
+leaveWorld tools\cxxtest\cxxtest\ErrorFormatter.h /^ void leaveWorld( const WorldDescription &desc )$/;" f class:CxxTest::ErrorFormatter
+leaveWorld tools\cxxtest\cxxtest\Gui.h /^ void leaveWorld( const WorldDescription & ) {}$/;" f class:CxxTest::GuiListener
+leaveWorld tools\cxxtest\cxxtest\TeeListener.h /^ void leaveWorld( const WorldDescription &d )$/;" f class:CxxTest::TeeListener
+leaveWorld tools\cxxtest\cxxtest\TestListener.h /^ virtual void leaveWorld( const WorldDescription & \/*desc*\/ ) {}$/;" f class:CxxTest::TestListener
+leaveWorld tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::leaveWorld( const WorldDescription &wd )$/;" f class:CxxTest::TestTracker
+leaveWorld tools\cxxtest\cxxtest\XmlFormatter.h /^ void leaveWorld( const WorldDescription& desc )$/;" f class:CxxTest::XmlFormatter
+leaveWorld tools\cxxtest\test\cxxtest\DummyGui.h /^ void leaveWorld( const WorldDescription & )$/;" f class:CxxTest::DummyGui
+leaveWorld tools\cxxtest\test\main.cpp /^ void leaveWorld( const CxxTest::WorldDescription &wd )$/;" f class:SummaryPrinter
+left tools\cxxtest\test\fake\windows.h /^ LONG left, right, top, bottom;$/;" m struct:RECT
+lessThan tools\cxxtest\cxxtest\TestSuite.h /^ struct lessThan {$/;" s namespace:CxxTest
+lessThanEquals tools\cxxtest\cxxtest\TestSuite.h /^ struct lessThanEquals {$/;" s namespace:CxxTest
+level_for_integer tools\cxxtest\admin\virtualenv.py /^ def level_for_integer(cls, level):$/;" m class:Logger
+level_for_integer tools\cxxtest\admin\virtualenv.py /^ level_for_integer = classmethod(level_for_integer)$/;" v class:Logger
+level_matches tools\cxxtest\admin\virtualenv.py /^ def level_matches(self, level, consumer_level):$/;" m class:Logger
+lex tools\cxxtest\python\cxxtest\cxx_parser.py /^import ply.lex as lex$/;" i
+lex tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import ply.lex as lex$/;" i
+lexer tools\cxxtest\python\cxxtest\cxx_parser.py /^lexer = None$/;" v
+lexer tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^lexer = None$/;" v
+license tools\cxxtest\python\setup.py /^ license = cxxtest.__license__,$/;" v
+line source\cork.cpp /^ int line;$/;" m struct:BlockTableEntry file:
+line tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ int DummySuiteDescription::line() const { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+line tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ int DummyTestDescription::line() const { return 0; }$/;" f class:CxxTest::DummyTestDescription
+line tools\cxxtest\cxxtest\RealDescriptions.cpp /^ int RealSuiteDescription::line() const { return _line; }$/;" f class:CxxTest::RealSuiteDescription
+line tools\cxxtest\cxxtest\RealDescriptions.cpp /^ int RealTestDescription::line() const { return _line; }$/;" f class:CxxTest::RealTestDescription
+line tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string line;$/;" m class:CxxTest::TestCaseInfo
+lineBelongsToSuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def lineBelongsToSuite( suite, lineNo, line ):$/;" f
+lineBelongsToSuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def lineBelongsToSuite( suite, lineNo, line ):$/;" f
+lineCont_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^lineCont_re = re.compile('(.*)\\\\\\s*$')$/;" v
+lineCont_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^lineCont_re = re.compile('(.*)\\\\\\s*$')$/;" v
+lineStartsBlock tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def lineStartsBlock( line ):$/;" f
+lineStartsBlock tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def lineStartsBlock( line ):$/;" f
+link tools\rake_utils\artifact.rb /^ def link(*args)$/;" f class:Artifact
+links tools\cxxtest\build_tools\SCons\test\default_env\TestDef.py /^links = {$/;" v
+links tools\cxxtest\build_tools\SCons\test\empty_source_list\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\expanding_#\TestDef.py /^links = {'src' : '..\/..\/..\/..\/test'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\globbing\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\globbing_edmundo\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\include_CCFLAGS\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\include_CXXFLAGS\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\multifile_tests\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\nonstandard_cxxtest_dir\TestDef.py /^links = {'src' : '..\/..\/..\/..\/test\/'}$/;" v
+links tools\cxxtest\build_tools\SCons\test\recursive_sources\TestDef.py /^links = {'cxxtest' : '..\/..\/..\/..\/'}$/;" v
+loadFont tools\cxxtest\cxxtest\X11Gui.h /^ bool loadFont()$/;" f class:CxxTest::X11Gui
+loadStandardIcon tools\cxxtest\cxxtest\Win32Gui.h /^ HICON loadStandardIcon( LPCTSTR icon )$/;" f class:CxxTest::Win32Gui
+log tools\cxxtest\admin\virtualenv.py /^ def log(self, level, msg, *args, **kw):$/;" m class:Logger
+logger tools\cxxtest\admin\virtualenv.py /^logger = Logger([(Logger.LEVELS[-1], sys.stdout)])$/;" v
+logging tools\cxxtest\admin\virtualenv.py /^import logging$/;" i
+long_description tools\cxxtest\python\setup.py /^ long_description = "\\n".join(doclines[2:]),$/;" v
+lpCreateParams tools\cxxtest\test\fake\windows.h /^ LPVOID lpCreateParams;$/;" m struct:__anon13
+lpfnWndProc tools\cxxtest\test\fake\windows.h /^ LRESULT CALLBACK (*lpfnWndProc)( HWND, UINT, WPARAM, LPARAM );$/;" m struct:WNDCLASSEX
+lpszClassName tools\cxxtest\test\fake\windows.h /^ LPCTSTR lpszClassName;$/;" m struct:WNDCLASSEX
+lpszMenuName tools\cxxtest\test\fake\windows.h /^ LPCTSTR lpszMenuName;$/;" m struct:WNDCLASSEX
+lstrcatA tools\cxxtest\test\fake\windows.h /^inline int lstrcatA( LPSTR, LPCSTR ) { return 0; }$/;" f
+lstrcmpA tools\cxxtest\test\fake\windows.h /^inline int lstrcmpA( LPCSTR, LPCSTR ) { return 0; }$/;" f
+lstrcpyA tools\cxxtest\test\fake\windows.h /^inline int lstrcpyA( LPSTR, LPCSTR ) { return 0; }$/;" f
+lstrlenA tools\cxxtest\test\fake\windows.h /^inline unsigned lstrlenA( LPCSTR ) { return 0; }$/;" f
+m tools\cxxtest\doc\include_anchors.py /^ m = pat1b.match(line)$/;" v
+m tools\cxxtest\doc\include_anchors.py /^ m = pat1c.match(line)$/;" v
+m tools\cxxtest\doc\include_anchors.py /^ m = pat1d.match(line)$/;" v
+m tools\cxxtest\doc\include_anchors.py /^ m = pat1a.match(line)$/;" v
+main tools\cxxtest\admin\virtualenv.py /^def main():$/;" f
+main tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def main():$/;" f
+main tools\cxxtest\build_tools\SCons\test\globbing_edmundo\main.cpp /^int main (int argc, char *argv[])$/;" f
+main tools\cxxtest\python\cxxtest\cxxtestgen.py /^def main(args=sys.argv):$/;" f
+main tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def main(args=sys.argv):$/;" f
+main tools\cxxtest\sample\mock\roll.cpp /^int main()$/;" f
+main tools\cxxtest\sample\yes_no_runner.cpp /^int main()$/;" f
+main tools\cxxtest\test\anything.cpp /^int main()$/;" f
+main tools\cxxtest\test\int64.cpp /^int main()$/;" f
+main tools\cxxtest\test\longlong.cpp /^int main()$/;" f
+main tools\cxxtest\test\main.cpp /^int main()$/;" f
+main tools\cxxtest\test\stpltpl.cpp /^int main() { return 0; }$/;" f
+main tools\cxxtest\test\tpltpl.cpp /^int main() { return 0; }$/;" f
+main tools\cxxtest\test\wchar.cpp /^int main()$/;" f
+maintainer tools\cxxtest\python\setup.py /^ maintainer=cxxtest.__maintainer__,$/;" v
+maintainer_email tools\cxxtest\python\setup.py /^ maintainer_email=cxxtest.__maintainer_email__,$/;" v
+make_diff_readable tools\cxxtest\test\test_cxxtest.py /^def make_diff_readable(diff):$/;" f
+make_environment_relocatable tools\cxxtest\admin\virtualenv.py /^def make_environment_relocatable(home_dir):$/;" f
+make_exe tools\cxxtest\admin\virtualenv.py /^def make_exe(fn):$/;" f
+make_file_list tools\rake_utils\artifact.rb /^ def make_file_list(patt_list)$/;" f class:Artifact
+make_option_list tools\rake_utils\artifact.rb /^ def make_option_list(prefix,list)$/;" f class:Artifact
+make_relative_path tools\cxxtest\admin\virtualenv.py /^def make_relative_path(source, dest, dest_is_directory=True):$/;" f
+malloc source\cork.cpp 4;" d file:
+maxDumpSize tools\cxxtest\cxxtest\TestSuite.cpp /^ unsigned maxDumpSize()$/;" f namespace:CxxTest
+messageLoop tools\cxxtest\cxxtest\Win32Gui.h /^ void messageLoop()$/;" f class:CxxTest::Win32Gui
+mkdir tools\cxxtest\admin\virtualenv.py /^def mkdir(path):$/;" f
+module tools\cxxtest\admin\virtualenv.py /^ logger.info("Cannot import bootstrap module: %s" % modname)$/;" i
+multiget tools\cxxtest\build_tools\SCons\cxxtest.py /^def multiget(dictlist, key, default = None):$/;" f
+n tools\cxxtest\test\Factor.h /^ unsigned n;$/;" m class:Factor::X
+name tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string name;$/;" m class:CxxTest::ElementInfo
+name tools\cxxtest\doc\examples\test_examples.py /^ name=bname.split('.')[0]$/;" v class:Test
+name tools\cxxtest\sample\TraitsTest.h /^ const char *name() const { return _name; }$/;" f class:Pet
+name tools\rake_utils\binary.rb /^ def name()$/;" f class:Binary
+name tools\rake_utils\library.rb /^ def name()$/;" f class:Library
+negative tools\cxxtest\cxxtest\ValueTraits.h /^ template<class N> inline bool negative( N n ) { return n < 0; }$/;" f namespace:CxxTest
+nerror tools\cxxtest\cxxtest\XmlFormatter.h /^ int nerror;$/;" m class:CxxTest::XmlFormatter
+newLine tools\cxxtest\cxxtest\ErrorFormatter.h /^ void newLine( void )$/;" f class:CxxTest::ErrorFormatter
+next source\cork.cpp /^ void * next;$/;" m struct:BlockTableEntry file:
+next tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ SuiteDescription *DummySuiteDescription::next() { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+next tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ TestDescription *DummyTestDescription::next() { return 0; }$/;" f class:CxxTest::DummyTestDescription
+next tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const SuiteDescription *DummySuiteDescription::next() const { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+next tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const TestDescription *DummyTestDescription::next() const { return 0; }$/;" f class:CxxTest::DummyTestDescription
+next tools\cxxtest\cxxtest\LinkedList.cpp /^ Link * Link::next()$/;" f class:CxxTest::Link
+next tools\cxxtest\cxxtest\LinkedList.cpp /^ const Link * Link::next() const$/;" f class:CxxTest::Link
+next tools\cxxtest\cxxtest\RealDescriptions.cpp /^ SuiteDescription *RealSuiteDescription::next() { return (RealSuiteDescription *)Link::next(); }$/;" f class:CxxTest::RealSuiteDescription
+next tools\cxxtest\cxxtest\RealDescriptions.cpp /^ TestDescription *RealTestDescription::next() { return (RealTestDescription *)Link::next(); }$/;" f class:CxxTest::RealTestDescription
+next tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const SuiteDescription *RealSuiteDescription::next() const { return (const RealSuiteDescription *)Link::next(); }$/;" f class:CxxTest::RealSuiteDescription
+next tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const TestDescription *RealTestDescription::next() const { return (const RealTestDescription *)Link::next(); }$/;" f class:CxxTest::RealTestDescription
+nextGlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture *GlobalFixture::nextGlobalFixture() { return (GlobalFixture *)next(); }$/;" f class:CxxTest::GlobalFixture
+nextRand tools\cxxtest\sample\mock\MockStdlib.h /^ int nextRand;$/;" m class:MockStdlib
+nextTime tools\cxxtest\sample\mock\MockStdlib.h /^ time_t nextTime;$/;" m class:MockStdlib
+nfail tools\cxxtest\cxxtest\XmlFormatter.h /^ int nfail;$/;" m class:CxxTest::XmlFormatter
+noExceptionLogic tools\cxxtest\python\cxxtest\cxx_parser.py /^noExceptionLogic = True$/;" v
+noExceptionLogic tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^noExceptionLogic = True$/;" v
+no_eh_option tools\cxxtest\test\test_cxxtest.py /^ no_eh_option = '-GX-'$/;" v class:TestCL
+no_eh_option tools\cxxtest\test\test_cxxtest.py /^ no_eh_option = '-fno-exceptions'$/;" v class:TestClang
+no_eh_option tools\cxxtest\test\test_cxxtest.py /^ no_eh_option = '-fno-exceptions'$/;" v class:TestGpp
+no_eh_option tools\cxxtest\test\test_cxxtest.py /^ no_eh_option = None$/;" v class:TestCpp
+nonFiniteNumber tools\cxxtest\cxxtest\ValueTraits.cpp /^ void ValueTraits<const double>::nonFiniteNumber( double t )$/;" f class:CxxTest::ValueTraits
+norm_home_dir tools\cxxtest\admin\virtualenv.py /^ norm_home_dir = norm_home_dir.decode(sys.getfilesystemencoding())$/;" v
+norm_home_dir tools\cxxtest\admin\virtualenv.py /^ norm_home_dir = os.path.normcase(os.path.abspath(home_dir))$/;" v
+normalNumber tools\cxxtest\cxxtest\ValueTraits.cpp /^ void ValueTraits<const double>::normalNumber( double t )$/;" f class:CxxTest::ValueTraits
+normalize_line_for_diff tools\cxxtest\test\test_cxxtest.py /^def normalize_line_for_diff(line):$/;" f
+normals tools\cxxtest\test\test_cxxtest.py /^ normals = " ".join(currdir+file for file in ["LessThanEquals.h","Relation.h","DefaultTraits.h","DoubleCall.h","SameData.h","SameFiles.h","Tsm.h","TraitsTest.h","MockTest.h","SameZero.h"])$/;" v class:BaseTestCase
+notice tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def notice(msg):$/;" f
+notify tools\cxxtest\admin\virtualenv.py /^ def notify(self, msg, *args, **kw):$/;" m class:Logger
+ntests tools\cxxtest\cxxtest\XmlFormatter.h /^ int ntests;$/;" m class:CxxTest::XmlFormatter
+nth tools\cxxtest\cxxtest\LinkedList.cpp /^ Link *List::nth( unsigned n )$/;" f class:CxxTest::List
+numSuites tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ unsigned DummyWorldDescription::numSuites( void ) const { return 0; }$/;" f class:CxxTest::DummyWorldDescription
+numSuites tools\cxxtest\cxxtest\RealDescriptions.cpp /^ unsigned RealWorldDescription::numSuites( void ) const$/;" f class:CxxTest::RealWorldDescription
+numTests tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ unsigned DummySuiteDescription::numTests() const { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+numTests tools\cxxtest\cxxtest\RealDescriptions.cpp /^ unsigned RealSuiteDescription::numTests() const { return _tests->size(); }$/;" f class:CxxTest::RealSuiteDescription
+numTotalTests tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ unsigned DummyWorldDescription::numTotalTests( void ) const { return 0; }$/;" f class:CxxTest::DummyWorldDescription
+numTotalTests tools\cxxtest\cxxtest\RealDescriptions.cpp /^ unsigned RealWorldDescription::numTotalTests( void ) const$/;" f class:CxxTest::RealWorldDescription
+numTotalTests tools\cxxtest\test\Factor.h /^ unsigned numTotalTests() const { return n; }$/;" f class:Factor::X
+number tools\cxxtest\test\fake\qstring.h /^ static QString number( int ) { return QString(); }$/;" f class:QString
+numberToString tools\cxxtest\cxxtest\ValueTraits.h /^ char *numberToString( N n, char *s,$/;" f namespace:CxxTest
+o tools\cxxtest\cxxtest\ErrorPrinter.h /^ ErrorPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char *preLine = ":", const char *postLine = "" ) :$/;" m class:CxxTest::ErrorPrinter
+o tools\cxxtest\cxxtest\ParenPrinter.h /^ ParenPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout) ) : ErrorPrinter( o, "(", ")" ) {}$/;" m class:CxxTest::ParenPrinter
+o tools\cxxtest\cxxtest\XUnitPrinter.h /^ XUnitPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout) )$/;" m class:CxxTest::XUnitPrinter
+o tools\cxxtest\cxxtest\XmlPrinter.h /^ XmlPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char* \/*preLine*\/ = ":", const char* \/*postLine*\/ = "" ) :$/;" m class:CxxTest::XmlPrinter
+obj_src_lookup tools\rake_utils\binary.rb /^ def obj_src_lookup()$/;" f class:Binary
+obj_src_lookup tools\rake_utils\library.rb /^ def obj_src_lookup()$/;" f class:Library
+obj_src_lookup tools\rake_utils\tests.rb /^ def obj_src_lookup()$/;" f class:Tests
+objects tools\rake_utils\binary.rb /^ def objects()$/;" f class:Binary
+objects tools\rake_utils\library.rb /^ def objects()$/;" f class:Library
+one tools\cxxtest\test\MockTest.h /^ int one() { return result; }$/;" f class:MockOne
+one tools\cxxtest\test\MockTest.h /^static int one( void ) { return 1; }$/;" f
+openDisplay tools\cxxtest\cxxtest\X11Gui.h /^ void openDisplay()$/;" f class:CxxTest::X11Gui
+operator () tools\cxxtest\doc\examples\Assertions.h /^ bool operator()(int x) const { return x % 2 == 1; }$/;" f class:Test::IsOdd
+operator () tools\cxxtest\test\Factor.h /^ bool operator()( const char *s, unsigned n ) const { return !_shorterThan( s, n ); }$/;" f class:Factor::NotShorterThan
+operator () tools\cxxtest\test\Factor.h /^ bool operator()( const char *s, unsigned n ) const$/;" f class:Factor::ShorterThan
+operator () tools\cxxtest\test\Relation.h /^ bool operator()( const T &x, const T &y ) const { return x < y; }$/;" f struct:MyLess
+operator () tools\cxxtest\test\Relation.h /^ bool operator()( const int &i ) const { return i < 0; }$/;" f struct:MyNegative
+operator () tools\cxxtest\test\ThrowsAssert.h /^ bool operator()( int ) const { return false; }$/;" f class:Fail
+operator () tools\cxxtest\test\ThrowsAssert.h /^ bool operator()( int, int ) const { return false; }$/;" f class:Fail
+operator + tools\cxxtest\test\fake\qstring.h /^inline QString operator+( const QString &, const QString & ) { return QString(); }$/;" f
+operator < tools\cxxtest\doc\examples\MyClass.h /^ bool operator<(const MyClass& other) const { return value < other.value; }$/;" f class:MyClass
+operator < tools\cxxtest\doc\examples\TMyClass.h /^ bool operator<(const TMyClass<T>& other) const { return value < other.value; }$/;" f class:TMyClass
+operator << tools\cxxtest\cxxtest\ErrorFormatter.h /^ virtual OutputStream &operator<<( Manipulator m ) { m( *this ); return *this; }$/;" f class:CxxTest::OutputStream
+operator << tools\cxxtest\cxxtest\ErrorFormatter.h /^ virtual OutputStream &operator<<( const char * \/*string*\/ ) { return *this; }$/;" f class:CxxTest::OutputStream
+operator << tools\cxxtest\cxxtest\ErrorFormatter.h /^ virtual OutputStream &operator<<( unsigned \/*number*\/ ) { return *this; }$/;" f class:CxxTest::OutputStream
+operator << tools\cxxtest\cxxtest\StdioFilePrinter.h /^ OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); }$/;" f class:CxxTest::StdioFilePrinter::Adapter
+operator << tools\cxxtest\cxxtest\StdioFilePrinter.h /^ OutputStream &operator<<( const char *s ) { fputs( s, _o ); return *this; }$/;" f class:CxxTest::StdioFilePrinter::Adapter
+operator << tools\cxxtest\cxxtest\StdioFilePrinter.h /^ OutputStream &operator<<( unsigned i ) { fprintf( _o, "%u", i ); return *this; }$/;" f class:CxxTest::StdioFilePrinter::Adapter
+operator << tools\cxxtest\cxxtest\XmlPrinter.h /^ OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); }$/;" f class:CxxTest::XmlPrinter::Adapter
+operator << tools\cxxtest\cxxtest\XmlPrinter.h /^ OutputStream &operator<<( const char *s ) { _o << s; return *this; }$/;" f class:CxxTest::XmlPrinter::Adapter
+operator << tools\cxxtest\cxxtest\XmlPrinter.h /^ OutputStream &operator<<( unsigned i )$/;" f class:CxxTest::XmlPrinter::Adapter
+operator = tools\cxxtest\cxxtest\XmlFormatter.h /^ ElementInfo& operator=(const ElementInfo& rhs)$/;" f class:CxxTest::ElementInfo
+operator == tools\cxxtest\doc\examples\MyClass.h /^ bool operator==(const MyClass& other) const { return value == other.value; }$/;" f class:MyClass
+operator == tools\cxxtest\doc\examples\MyTestSuite7.h /^ bool operator==(Data o) {$/;" f struct:MyTestSuite7::Data
+operator == tools\cxxtest\doc\examples\TMyClass.h /^ bool operator==(const TMyClass<T>& other) const { return value == other.value; }$/;" f class:TMyClass
+operator == tools\cxxtest\sample\TraitsTest.h /^ bool operator== ( const Pet &other ) const$/;" f class:Pet
+operator == tools\cxxtest\test\fake\qstring.h /^ bool operator==( const QString & ) { return false; }$/;" f class:QString
+operator delete source\cork.cpp /^void operator delete(void * p) {$/;" f
+operator new source\cork.cpp /^void * operator new (size_t size, string file, unsigned int line)$/;" f
+operator new source\cork.cpp /^void * operator new(size_t size) throw(bad_alloc) {$/;" f
+options tools\cxxtest\build_tools\SCons\test\eprouvette.py /^options = None$/;" v
+options tools\cxxtest\python\cxxtest\cxxtest_parser.py /^options=None$/;" v
+options tools\cxxtest\python\cxxtest\cxxtestgen.py /^options = []$/;" v
+options tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^options=None$/;" v
+options tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^options = []$/;" v
+optparse tools\cxxtest\admin\virtualenv.py /^import optparse$/;" i
+orig_cerr tools\cxxtest\cxxtest\XmlFormatter.h /^ std::ostream& orig_cerr;$/;" m class:CxxTest::TeeOutputStreams
+orig_cout tools\cxxtest\cxxtest\XmlFormatter.h /^ std::ostream& orig_cout;$/;" m class:CxxTest::TeeOutputStreams
+os tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+os tools\cxxtest\admin\virtualenv.py /^import os$/;" i
+os tools\cxxtest\build_tools\SCons\cxxtest.py /^import os$/;" i
+os tools\cxxtest\build_tools\SCons\test\eprouvette.py /^import os, sys$/;" i
+os tools\cxxtest\doc\examples\test_examples.py /^import os$/;" i
+os tools\cxxtest\doc\include_anchors.py /^import os$/;" i
+os tools\cxxtest\doc\include_anchors.py /^import os.path$/;" i
+os tools\cxxtest\python\convert.py /^import os$/;" i
+os tools\cxxtest\python\cxxtest\cxx_parser.py /^import os$/;" i
+os tools\cxxtest\python\cxxtest\cxxtestgen.py /^import os$/;" i
+os tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import os$/;" i
+os tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^import os$/;" i
+os tools\cxxtest\python\setup.py /^import os$/;" i
+os tools\cxxtest\test\test_cxxtest.py /^import os$/;" i
+os tools\cxxtest\test\test_cxxtest.py /^import os.path$/;" i
+os tools\cxxtest\test\test_doc.py /^import os$/;" i
+out tools\cxxtest\cxxtest\XmlFormatter.h /^ std::stringstream out;$/;" m class:CxxTest::TeeOutputStreams
+outputFileStream tools\cxxtest\cxxtest\XmlFormatter.h /^ OutputStream *outputFileStream() const$/;" f class:CxxTest::XmlFormatter
+outputStream tools\cxxtest\cxxtest\ErrorFormatter.h /^ OutputStream *outputStream() const$/;" f class:CxxTest::ErrorFormatter
+outputStream tools\cxxtest\cxxtest\XmlFormatter.h /^ OutputStream *outputStream() const$/;" f class:CxxTest::XmlFormatter
+overflow tools\cxxtest\cxxtest\XmlFormatter.h /^ virtual int overflow(int c)$/;" f class:CxxTest::TeeOutputStreams::teebuffer
+p tools\cxxtest\test\tpltpl.cpp /^template<class T, class U> class Pair {} p;$/;" v typeref:class:Pair
+p_Xbuilt_in_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_Xbuilt_in_type_specifier(p):$/;" f
+p_Xbuilt_in_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_Xbuilt_in_type_specifier(p):$/;" f
+p_abstract_declarator_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_abstract_declarator_opt(p):$/;" f
+p_abstract_declarator_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_abstract_declarator_opt(p):$/;" f
+p_abstract_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_abstract_expression(p):$/;" f
+p_abstract_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_abstract_expression(p):$/;" f
+p_abstract_parameter_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_abstract_parameter_declaration(p):$/;" f
+p_abstract_parameter_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_abstract_parameter_declaration(p):$/;" f
+p_abstract_pointer_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_abstract_pointer_declaration(p):$/;" f
+p_abstract_pointer_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_abstract_pointer_declaration(p):$/;" f
+p_access_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_access_specifier(p):$/;" f
+p_access_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_access_specifier(p):$/;" f
+p_accessibility_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_accessibility_specifier(p):$/;" f
+p_accessibility_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_accessibility_specifier(p):$/;" f
+p_additive_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_additive_expression(p):$/;" f
+p_additive_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_additive_expression(p):$/;" f
+p_and_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_and_expression(p):$/;" f
+p_and_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_and_expression(p):$/;" f
+p_asm_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_asm_definition(p):$/;" f
+p_asm_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_asm_definition(p):$/;" f
+p_assignment_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_assignment_expression(p):$/;" f
+p_assignment_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_assignment_expression(p):$/;" f
+p_assignment_operator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_assignment_operator(p):$/;" f
+p_assignment_operator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_assignment_operator(p):$/;" f
+p_attribute tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_attribute(p):$/;" f
+p_attribute tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_attribute(p):$/;" f
+p_attributes tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_attributes(p):$/;" f
+p_attributes tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_attributes(p):$/;" f
+p_base_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_base_specifier(p):$/;" f
+p_base_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_base_specifier(p):$/;" f
+p_base_specifier_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_base_specifier_list(p):$/;" f
+p_base_specifier_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_base_specifier_list(p):$/;" f
+p_bexpression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bexpression(p):$/;" f
+p_bexpression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bexpression(p):$/;" f
+p_bexpression_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bexpression_clause(p):$/;" f
+p_bexpression_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bexpression_clause(p):$/;" f
+p_bexpression_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bexpression_opt(p):$/;" f
+p_bexpression_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bexpression_opt(p):$/;" f
+p_bexpression_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bexpression_seq(p):$/;" f
+p_bexpression_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bexpression_seq(p):$/;" f
+p_bit_field_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bit_field_declaration(p):$/;" f
+p_bit_field_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bit_field_declaration(p):$/;" f
+p_bit_field_init_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bit_field_init_declaration(p):$/;" f
+p_bit_field_init_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bit_field_init_declaration(p):$/;" f
+p_bit_field_width tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_bit_field_width(p):$/;" f
+p_bit_field_width tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_bit_field_width(p):$/;" f
+p_block_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_block_declaration(p):$/;" f
+p_block_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_block_declaration(p):$/;" f
+p_braced_initializer tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_braced_initializer(p):$/;" f
+p_braced_initializer tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_braced_initializer(p):$/;" f
+p_built_in_type_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_built_in_type_id(p):$/;" f
+p_built_in_type_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_built_in_type_id(p):$/;" f
+p_built_in_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_built_in_type_specifier(p):$/;" f
+p_built_in_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_built_in_type_specifier(p):$/;" f
+p_cast_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_cast_expression(p):$/;" f
+p_cast_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_cast_expression(p):$/;" f
+p_class_key tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_class_key(p):$/;" f
+p_class_key tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_class_key(p):$/;" f
+p_class_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_class_specifier(p):$/;" f
+p_class_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_class_specifier(p):$/;" f
+p_class_specifier_head tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_class_specifier_head(p):$/;" f
+p_class_specifier_head tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_class_specifier_head(p):$/;" f
+p_compound_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_compound_declaration(p):$/;" f
+p_compound_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_compound_declaration(p):$/;" f
+p_compound_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_compound_statement(p):$/;" f
+p_compound_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_compound_statement(p):$/;" f
+p_condition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_condition(p):$/;" f
+p_condition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_condition(p):$/;" f
+p_condition_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_condition_opt(p):$/;" f
+p_condition_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_condition_opt(p):$/;" f
+p_condition_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_condition_seq(p):$/;" f
+p_condition_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_condition_seq(p):$/;" f
+p_conditional_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_conditional_expression(p):$/;" f
+p_conditional_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_conditional_expression(p):$/;" f
+p_constant_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_constant_expression(p):$/;" f
+p_constant_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_constant_expression(p):$/;" f
+p_constructor_head tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_constructor_head(p):$/;" f
+p_constructor_head tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_constructor_head(p):$/;" f
+p_conversion_function_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_conversion_function_id(p):$/;" f
+p_conversion_function_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_conversion_function_id(p):$/;" f
+p_conversion_type_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_conversion_type_id(p):$/;" f
+p_conversion_type_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_conversion_type_id(p):$/;" f
+p_ctor_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ctor_definition(p):$/;" f
+p_ctor_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ctor_definition(p):$/;" f
+p_ctor_initializer tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ctor_initializer(p):$/;" f
+p_ctor_initializer tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ctor_initializer(p):$/;" f
+p_ctor_initializer_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ctor_initializer_opt(p):$/;" f
+p_ctor_initializer_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ctor_initializer_opt(p):$/;" f
+p_cv_qualifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_cv_qualifier(p):$/;" f
+p_cv_qualifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_cv_qualifier(p):$/;" f
+p_cv_qualifier_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_cv_qualifier_seq_opt(p):$/;" f
+p_cv_qualifier_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_cv_qualifier_seq_opt(p):$/;" f
+p_decl_specifier_affix tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_decl_specifier_affix(p):$/;" f
+p_decl_specifier_affix tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_decl_specifier_affix(p):$/;" f
+p_decl_specifier_prefix tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_decl_specifier_prefix(p):$/;" f
+p_decl_specifier_prefix tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_decl_specifier_prefix(p):$/;" f
+p_decl_specifier_suffix tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_decl_specifier_suffix(p):$/;" f
+p_decl_specifier_suffix tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_decl_specifier_suffix(p):$/;" f
+p_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_declaration(p):$/;" f
+p_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_declaration(p):$/;" f
+p_declaration_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_declaration_seq_opt(p):$/;" f
+p_declaration_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_declaration_seq_opt(p):$/;" f
+p_declaration_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_declaration_statement(p):$/;" f
+p_declaration_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_declaration_statement(p):$/;" f
+p_declarator_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_declarator_id(p):$/;" f
+p_declarator_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_declarator_id(p):$/;" f
+p_delete_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_delete_expression(p):$/;" f
+p_delete_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_delete_expression(p):$/;" f
+p_destructor_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_destructor_id(p):$/;" f
+p_destructor_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_destructor_id(p):$/;" f
+p_direct_abstract_declarator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_direct_abstract_declarator(p):$/;" f
+p_direct_abstract_declarator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_direct_abstract_declarator(p):$/;" f
+p_direct_abstract_declarator_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_direct_abstract_declarator_opt(p):$/;" f
+p_direct_abstract_declarator_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_direct_abstract_declarator_opt(p):$/;" f
+p_direct_new_declarator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_direct_new_declarator(p):$/;" f
+p_direct_new_declarator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_direct_new_declarator(p):$/;" f
+p_elaborate_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_elaborate_type_specifier(p):$/;" f
+p_elaborate_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_elaborate_type_specifier(p):$/;" f
+p_elaborated_enum_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_elaborated_enum_specifier(p):$/;" f
+p_elaborated_enum_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_elaborated_enum_specifier(p):$/;" f
+p_elaborated_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_elaborated_type_specifier(p):$/;" f
+p_elaborated_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_elaborated_type_specifier(p):$/;" f
+p_empty tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_empty(p):$/;" f
+p_empty tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_empty(p):$/;" f
+p_enum_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enum_specifier(p):$/;" f
+p_enum_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enum_specifier(p):$/;" f
+p_enumerator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator(p):$/;" f
+p_enumerator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator(p):$/;" f
+p_enumerator_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_clause(p):$/;" f
+p_enumerator_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_clause(p):$/;" f
+p_enumerator_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_definition(p):$/;" f
+p_enumerator_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_definition(p):$/;" f
+p_enumerator_definition_ecarb tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_definition_ecarb(p):$/;" f
+p_enumerator_definition_ecarb tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_definition_ecarb(p):$/;" f
+p_enumerator_definition_filler tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_definition_filler(p):$/;" f
+p_enumerator_definition_filler tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_definition_filler(p):$/;" f
+p_enumerator_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_list(p):$/;" f
+p_enumerator_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_list(p):$/;" f
+p_enumerator_list_ecarb tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_list_ecarb(p):$/;" f
+p_enumerator_list_ecarb tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_list_ecarb(p):$/;" f
+p_enumerator_list_head tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_enumerator_list_head(p):$/;" f
+p_enumerator_list_head tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_enumerator_list_head(p):$/;" f
+p_equality_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_equality_expression(p):$/;" f
+p_equality_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_equality_expression(p):$/;" f
+p_error tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_error(p):$/;" f
+p_error tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_error(p):$/;" f
+p_exception_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_exception_declaration(p):$/;" f
+p_exception_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_exception_declaration(p):$/;" f
+p_exception_specification tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_exception_specification(p):$/;" f
+p_exception_specification tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_exception_specification(p):$/;" f
+p_exclusive_or_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_exclusive_or_expression(p):$/;" f
+p_exclusive_or_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_exclusive_or_expression(p):$/;" f
+p_explicit_specialization tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_explicit_specialization(p):$/;" f
+p_explicit_specialization tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_explicit_specialization(p):$/;" f
+p_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_expression(p):$/;" f
+p_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_expression(p):$/;" f
+p_expression_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_expression_list(p):$/;" f
+p_expression_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_expression_list(p):$/;" f
+p_expression_list_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_expression_list_opt(p):$/;" f
+p_expression_list_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_expression_list_opt(p):$/;" f
+p_func_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_func_definition(p):$/;" f
+p_func_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_func_definition(p):$/;" f
+p_function_block tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_function_block(p):$/;" f
+p_function_block tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_function_block(p):$/;" f
+p_function_body tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_function_body(p):$/;" f
+p_function_body tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_function_body(p):$/;" f
+p_function_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_function_definition(p):$/;" f
+p_function_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_function_definition(p):$/;" f
+p_function_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_function_specifier(p):$/;" f
+p_function_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_function_specifier(p):$/;" f
+p_function_try_block tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_function_try_block(p):$/;" f
+p_function_try_block tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_function_try_block(p):$/;" f
+p_global_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_global_scope(p):$/;" f
+p_global_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_global_scope(p):$/;" f
+p_handler tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_handler(p):$/;" f
+p_handler tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_handler(p):$/;" f
+p_handler_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_handler_seq(p):$/;" f
+p_handler_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_handler_seq(p):$/;" f
+p_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_id(p):$/;" f
+p_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_id(p):$/;" f
+p_id_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_id_scope(p):$/;" f
+p_id_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_id_scope(p):$/;" f
+p_id_scope_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_id_scope_seq(p):$/;" f
+p_id_scope_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_id_scope_seq(p):$/;" f
+p_identifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_identifier(p):$/;" f
+p_identifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_identifier(p):$/;" f
+p_inclusive_or_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_inclusive_or_expression(p):$/;" f
+p_inclusive_or_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_inclusive_or_expression(p):$/;" f
+p_init_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_init_declaration(p):$/;" f
+p_init_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_init_declaration(p):$/;" f
+p_init_declarations tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_init_declarations(p):$/;" f
+p_init_declarations tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_init_declarations(p):$/;" f
+p_initializer_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_initializer_clause(p):$/;" f
+p_initializer_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_initializer_clause(p):$/;" f
+p_initializer_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_initializer_list(p):$/;" f
+p_initializer_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_initializer_list(p):$/;" f
+p_iteration_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_iteration_statement(p):$/;" f
+p_iteration_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_iteration_statement(p):$/;" f
+p_jump_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_jump_statement(p):$/;" f
+p_jump_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_jump_statement(p):$/;" f
+p_labeled_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_labeled_statement(p):$/;" f
+p_labeled_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_labeled_statement(p):$/;" f
+p_linkage_specification tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_linkage_specification(p):$/;" f
+p_linkage_specification tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_linkage_specification(p):$/;" f
+p_literal tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_literal(p):$/;" f
+p_literal tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_literal(p):$/;" f
+p_logical_and_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_logical_and_expression(p):$/;" f
+p_logical_and_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_logical_and_expression(p):$/;" f
+p_logical_or_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_logical_or_expression(p):$/;" f
+p_logical_or_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_logical_or_expression(p):$/;" f
+p_mem_initializer tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_mem_initializer(p):$/;" f
+p_mem_initializer tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_mem_initializer(p):$/;" f
+p_mem_initializer_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_mem_initializer_id(p):$/;" f
+p_mem_initializer_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_mem_initializer_id(p):$/;" f
+p_mem_initializer_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_mem_initializer_list(p):$/;" f
+p_mem_initializer_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_mem_initializer_list(p):$/;" f
+p_mem_initializer_list_head tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_mem_initializer_list_head(p):$/;" f
+p_mem_initializer_list_head tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_mem_initializer_list_head(p):$/;" f
+p_member_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_member_declaration(p):$/;" f
+p_member_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_member_declaration(p):$/;" f
+p_member_init_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_member_init_declaration(p):$/;" f
+p_member_init_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_member_init_declaration(p):$/;" f
+p_member_init_declarations tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_member_init_declarations(p):$/;" f
+p_member_init_declarations tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_member_init_declarations(p):$/;" f
+p_member_specification_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_member_specification_opt(p):$/;" f
+p_member_specification_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_member_specification_opt(p):$/;" f
+p_misc tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_misc(p):$/;" f
+p_misc tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_misc(p):$/;" f
+p_multiplicative_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_multiplicative_expression(p):$/;" f
+p_multiplicative_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_multiplicative_expression(p):$/;" f
+p_namespace_alias_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_namespace_alias_definition(p):$/;" f
+p_namespace_alias_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_namespace_alias_definition(p):$/;" f
+p_namespace_definition tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_namespace_definition(p):$/;" f
+p_namespace_definition tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_namespace_definition(p):$/;" f
+p_nested_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nested_id(p):$/;" f
+p_nested_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nested_id(p):$/;" f
+p_nested_pseudo_destructor_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nested_pseudo_destructor_id(p):$/;" f
+p_nested_pseudo_destructor_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nested_pseudo_destructor_id(p):$/;" f
+p_nested_ptr_operator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nested_ptr_operator(p):$/;" f
+p_nested_ptr_operator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nested_ptr_operator(p):$/;" f
+p_nested_special_function_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nested_special_function_id(p):$/;" f
+p_nested_special_function_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nested_special_function_id(p):$/;" f
+p_new_declarator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_new_declarator(p):$/;" f
+p_new_declarator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_new_declarator(p):$/;" f
+p_new_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_new_expression(p):$/;" f
+p_new_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_new_expression(p):$/;" f
+p_new_initializer_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_new_initializer_opt(p):$/;" f
+p_new_initializer_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_new_initializer_opt(p):$/;" f
+p_new_type_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_new_type_id(p):$/;" f
+p_new_type_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_new_type_id(p):$/;" f
+p_nonbrace tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonbrace(p):$/;" f
+p_nonbrace tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonbrace(p):$/;" f
+p_nonbrace_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonbrace_seq_opt(p):$/;" f
+p_nonbrace_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonbrace_seq_opt(p):$/;" f
+p_nonbracket tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonbracket(p):$/;" f
+p_nonbracket tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonbracket(p):$/;" f
+p_nonbracket_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonbracket_seq(p):$/;" f
+p_nonbracket_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonbracket_seq(p):$/;" f
+p_nonbracket_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonbracket_seq_opt(p):$/;" f
+p_nonbracket_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonbracket_seq_opt(p):$/;" f
+p_nonlgt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonlgt(p):$/;" f
+p_nonlgt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonlgt(p):$/;" f
+p_nonlgt_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonlgt_seq_opt(p):$/;" f
+p_nonlgt_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonlgt_seq_opt(p):$/;" f
+p_nonparen tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonparen(p):$/;" f
+p_nonparen tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonparen(p):$/;" f
+p_nonparen_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonparen_seq(p):$/;" f
+p_nonparen_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonparen_seq(p):$/;" f
+p_nonparen_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonparen_seq_opt(p):$/;" f
+p_nonparen_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonparen_seq_opt(p):$/;" f
+p_nonsemicolon tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonsemicolon(p):$/;" f
+p_nonsemicolon tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonsemicolon(p):$/;" f
+p_nonsemicolon_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_nonsemicolon_seq(p):$/;" f
+p_nonsemicolon_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_nonsemicolon_seq(p):$/;" f
+p_operator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_operator(p):$/;" f
+p_operator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_operator(p):$/;" f
+p_operator_function_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_operator_function_id(p):$/;" f
+p_operator_function_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_operator_function_id(p):$/;" f
+p_parameter_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_parameter_declaration(p):$/;" f
+p_parameter_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_parameter_declaration(p):$/;" f
+p_parameters_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_parameters_clause(p):$/;" f
+p_parameters_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_parameters_clause(p):$/;" f
+p_parenthesis_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_parenthesis_clause(p):$/;" f
+p_parenthesis_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_parenthesis_clause(p):$/;" f
+p_pm_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_pm_expression(p):$/;" f
+p_pm_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_pm_expression(p):$/;" f
+p_postfix_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_postfix_expression(p):$/;" f
+p_postfix_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_postfix_expression(p):$/;" f
+p_primary_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_primary_expression(p):$/;" f
+p_primary_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_primary_expression(p):$/;" f
+p_pseudo_destructor_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_pseudo_destructor_id(p):$/;" f
+p_pseudo_destructor_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_pseudo_destructor_id(p):$/;" f
+p_ptr_operator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ptr_operator(p):$/;" f
+p_ptr_operator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ptr_operator(p):$/;" f
+p_ptr_operator_seq tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ptr_operator_seq(p):$/;" f
+p_ptr_operator_seq tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ptr_operator_seq(p):$/;" f
+p_ptr_operator_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_ptr_operator_seq_opt(p):$/;" f
+p_ptr_operator_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_ptr_operator_seq_opt(p):$/;" f
+p_push_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_push_scope(p):$/;" f
+p_push_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_push_scope(p):$/;" f
+p_relational_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_relational_expression(p):$/;" f
+p_relational_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_relational_expression(p):$/;" f
+p_reserved tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_reserved(p):$/;" f
+p_reserved tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_reserved(p):$/;" f
+p_scoped_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_scoped_id(p):$/;" f
+p_scoped_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_scoped_id(p):$/;" f
+p_scoped_pseudo_destructor_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_scoped_pseudo_destructor_id(p):$/;" f
+p_scoped_pseudo_destructor_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_scoped_pseudo_destructor_id(p):$/;" f
+p_scoped_special_function_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_scoped_special_function_id(p):$/;" f
+p_scoped_special_function_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_scoped_special_function_id(p):$/;" f
+p_selection_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_selection_statement(p):$/;" f
+p_selection_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_selection_statement(p):$/;" f
+p_shift_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_shift_expression(p):$/;" f
+p_shift_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_shift_expression(p):$/;" f
+p_simple_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_simple_declaration(p):$/;" f
+p_simple_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_simple_declaration(p):$/;" f
+p_simple_member_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_simple_member_declaration(p):$/;" f
+p_simple_member_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_simple_member_declaration(p):$/;" f
+p_simple_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_simple_type_specifier(p):$/;" f
+p_simple_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_simple_type_specifier(p):$/;" f
+p_special_function_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_special_function_id(p):$/;" f
+p_special_function_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_special_function_id(p):$/;" f
+p_special_parameter_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_special_parameter_declaration(p):$/;" f
+p_special_parameter_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_special_parameter_declaration(p):$/;" f
+p_specialised_block_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_specialised_block_declaration(p):$/;" f
+p_specialised_block_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_specialised_block_declaration(p):$/;" f
+p_specialised_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_specialised_declaration(p):$/;" f
+p_specialised_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_specialised_declaration(p):$/;" f
+p_star_ptr_operator tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_star_ptr_operator(p):$/;" f
+p_star_ptr_operator tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_star_ptr_operator(p):$/;" f
+p_statement tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_statement(p):$/;" f
+p_statement tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_statement(p):$/;" f
+p_statement_seq_opt tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_statement_seq_opt(p):$/;" f
+p_statement_seq_opt tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_statement_seq_opt(p):$/;" f
+p_storage_class_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_storage_class_specifier(p):$/;" f
+p_storage_class_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_storage_class_specifier(p):$/;" f
+p_suffix_built_in_decl_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_built_in_decl_specifier(p):$/;" f
+p_suffix_built_in_decl_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_built_in_decl_specifier(p):$/;" f
+p_suffix_built_in_decl_specifier_raw tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_built_in_decl_specifier_raw(p):$/;" f
+p_suffix_built_in_decl_specifier_raw tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_built_in_decl_specifier_raw(p):$/;" f
+p_suffix_decl_specified_ids tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_decl_specified_ids(p):$/;" f
+p_suffix_decl_specified_ids tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_decl_specified_ids(p):$/;" f
+p_suffix_decl_specified_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_decl_specified_scope(p):$/;" f
+p_suffix_decl_specified_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_decl_specified_scope(p):$/;" f
+p_suffix_named_decl_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifier(p):$/;" f
+p_suffix_named_decl_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifier(p):$/;" f
+p_suffix_named_decl_specifier_bi tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifier_bi(p):$/;" f
+p_suffix_named_decl_specifier_bi tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifier_bi(p):$/;" f
+p_suffix_named_decl_specifiers tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifiers(p):$/;" f
+p_suffix_named_decl_specifiers tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifiers(p):$/;" f
+p_suffix_named_decl_specifiers_sf tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifiers_sf(p):$/;" f
+p_suffix_named_decl_specifiers_sf tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_suffix_named_decl_specifiers_sf(p):$/;" f
+p_template_decl tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_template_decl(p):$/;" f
+p_template_decl tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_template_decl(p):$/;" f
+p_template_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_template_declaration(p):$/;" f
+p_template_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_template_declaration(p):$/;" f
+p_template_parameter_clause tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_template_parameter_clause(p):$/;" f
+p_template_parameter_clause tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_template_parameter_clause(p):$/;" f
+p_throw_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_throw_expression(p):$/;" f
+p_throw_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_throw_expression(p):$/;" f
+p_translation_unit tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_translation_unit(p):$/;" f
+p_translation_unit tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_translation_unit(p):$/;" f
+p_try_block tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_try_block(p):$/;" f
+p_try_block tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_try_block(p):$/;" f
+p_type_id tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_type_id(p):$/;" f
+p_type_id tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_type_id(p):$/;" f
+p_type_id_list tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_type_id_list(p):$/;" f
+p_type_id_list tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_type_id_list(p):$/;" f
+p_type_specifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_type_specifier(p):$/;" f
+p_type_specifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_type_specifier(p):$/;" f
+p_unary_expression tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_unary_expression(p):$/;" f
+p_unary_expression tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_unary_expression(p):$/;" f
+p_using_declaration tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_using_declaration(p):$/;" f
+p_using_declaration tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_using_declaration(p):$/;" f
+p_using_directive tools\cxxtest\python\cxxtest\cxx_parser.py /^def p_using_directive(p):$/;" f
+p_using_directive tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def p_using_directive(p):$/;" f
+packages tools\cxxtest\python\setup.py /^ packages=['cxxtest'],$/;" v
+palette tools\cxxtest\test\fake\qprogressbar.h /^ QPalette palette() { return QPalette(); }$/;" f class:QProgressBar
+parseCommandLine tools\cxxtest\cxxtest\QtGui.h /^ void parseCommandLine( int argc, char **argv )$/;" f class:CxxTest::QtGui
+parseCommandLine tools\cxxtest\cxxtest\Win32Gui.h /^ void parseCommandLine( int argc, char **argv )$/;" f class:CxxTest::Win32Gui
+parseCommandLine tools\cxxtest\cxxtest\X11Gui.h /^ void parseCommandLine( int &argc, char **argv )$/;" f class:CxxTest::X11Gui
+parseCommandline tools\cxxtest\python\cxxtest\cxxtestgen.py /^def parseCommandline(args):$/;" f
+parseCommandline tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def parseCommandline(args):$/;" f
+parse_cpp tools\cxxtest\python\cxxtest\cxx_parser.py /^def parse_cpp(data=None, filename=None, debug=0, optimize=0, verbose=False, func_filter=None):$/;" f
+parse_cpp tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def parse_cpp(data=None, filename=None, debug=0, optimize=0, verbose=False, func_filter=None):$/;" f
+pat1a tools\cxxtest\doc\include_anchors.py /^pat1a = re.compile('include::([a-zA-Z0-9_\\.\\-\/\\\/]+\\\/)\\.([^\\_]+)\\_[a-zA-Z0-9]*\\.py\\[\\]')$/;" v
+pat1b tools\cxxtest\doc\include_anchors.py /^pat1b = re.compile('include::([a-zA-Z0-9_\\.\\-\/\\\/]+\\\/)\\.([^\\_]+)\\_[a-zA-Z0-9]*\\.sh\\[\\]')$/;" v
+pat1c tools\cxxtest\doc\include_anchors.py /^pat1c = re.compile('include::([a-zA-Z0-9_\\.\\-\/\\\/]+\\\/)\\.([^\\_]+)\\_[a-zA-Z0-9]*\\.h\\[\\]')$/;" v
+pat1d tools\cxxtest\doc\include_anchors.py /^pat1d = re.compile('include::([a-zA-Z0-9_\\.\\-\/\\\/]+\\\/)\\.([^\\_]+)\\_[a-zA-Z0-9]*\\.cpp\\[\\]')$/;" v
+pat2 tools\cxxtest\doc\include_anchors.py /^pat2 = re.compile('([^@]+)@([a-zA-Z0-9]+):')$/;" v
+pat3 tools\cxxtest\doc\include_anchors.py /^pat3 = re.compile('([^@]+)@:([a-zA-Z0-9]+)')$/;" v
+path tools\cxxtest\admin\virtualenv.py /^ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"$/;" i
+path tools\cxxtest\doc\include_anchors.py /^import os.path$/;" i
+path tools\cxxtest\test\test_cxxtest.py /^import os.path$/;" i
+path_locations tools\cxxtest\admin\virtualenv.py /^def path_locations(home_dir):$/;" f
+pixel tools\cxxtest\test\fake\X11\Xlib.h /^struct XColor { int pixel; };$/;" m struct:XColor
+platforms tools\cxxtest\python\setup.py /^ platforms = ["any"],$/;" v
+ply tools\cxxtest\python\cxxtest\cxx_parser.py /^import ply.lex as lex$/;" i
+ply tools\cxxtest\python\cxxtest\cxx_parser.py /^import ply.yacc as yacc$/;" i
+ply tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import ply.lex as lex$/;" i
+ply tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import ply.yacc as yacc$/;" i
+ply tools\cxxtest\test\test_cxxtest.py /^ import ply$/;" i
+ply_available tools\cxxtest\test\test_cxxtest.py /^ ply_available=False$/;" v
+ply_available tools\cxxtest\test\test_cxxtest.py /^ ply_available=True$/;" v
+ply_init tools\cxxtest\python\cxxtest\cxx_parser.py /^def ply_init(data):$/;" f
+ply_init tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def ply_init(data):$/;" f
+pop_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^ def pop_scope(self):$/;" m class:CppInfo
+pop_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def pop_scope(self):$/;" m class:CppInfo
+postLine tools\cxxtest\cxxtest\ErrorPrinter.h /^ ErrorPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char *preLine = ":", const char *postLine = "" ) :$/;" m class:CxxTest::ErrorPrinter
+preLine tools\cxxtest\cxxtest\ErrorPrinter.h /^ ErrorPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char *preLine = ":", const char *postLine = "" ) :$/;" m class:CxxTest::ErrorPrinter
+preamble_re tools\cxxtest\python\cxxtest\cxxtestgen.py /^preamble_re = re.compile( r"^\\s*<CxxTest\\s+preamble>\\s*$" )$/;" v
+preamble_re tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^preamble_re = re.compile( r"^\\s*<CxxTest\\s+preamble>\\s*$" )$/;" v
+precedence tools\cxxtest\python\cxxtest\cxx_parser.py /^precedence = ($/;" v
+precedence tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^precedence = ($/;" v
+prev tools\cxxtest\cxxtest\LinkedList.cpp /^ Link * Link::prev()$/;" f class:CxxTest::Link
+prev tools\cxxtest\cxxtest\LinkedList.cpp /^ const Link * Link::prev() const$/;" f class:CxxTest::Link
+prevGlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture *GlobalFixture::prevGlobalFixture() { return (GlobalFixture *)prev(); }$/;" f class:CxxTest::GlobalFixture
+printVersion tools\cxxtest\python\cxxtest\cxxtestgen.py /^def printVersion():$/;" f
+printVersion tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def printVersion():$/;" f
+print_function tools\cxxtest\build_tools\SCons\test\eprouvette.py /^from __future__ import print_function$/;" i
+print_help tools\cxxtest\cxxtest\TestMain.h /^inline void print_help(const char* name)$/;" f namespace:CxxTest
+print_tracing tools\cxxtest\cxxtest\TestTracker.cpp /^ bool TestTracker::print_tracing = false;$/;" m class:CxxTest::TestTracker file:
+print_tracing tools\cxxtest\cxxtest\TestTracker.h /^ static bool print_tracing;$/;" m class:CxxTest::TestTracker
+printingFixture tools\cxxtest\test\WorldFixtures.h /^static PrintingFixture printingFixture;$/;" v
+proc tools\cxxtest\admin\virtualenv.py /^ proc = subprocess.Popen(cmd,$/;" v
+proc_stdout tools\cxxtest\admin\virtualenv.py /^ proc_stdout = os.path.normcase(os.path.abspath(proc_stdout))$/;" v
+proc_stdout tools\cxxtest\admin\virtualenv.py /^ proc_stdout = proc_stdout.strip().decode("utf-8")$/;" v
+process tools\cxxtest\doc\include_anchors.py /^def process(dir, root, suffix):$/;" f
+processEvents tools\cxxtest\cxxtest\QtGui.h /^ void processEvents()$/;" f class:CxxTest::QtGui
+processEvents tools\cxxtest\cxxtest\X11Gui.h /^ void processEvents()$/;" f class:CxxTest::X11Gui
+processEvents tools\cxxtest\test\fake\qapplication.h /^ void processEvents() {}$/;" f class:QApplication
+process_commandline tools\cxxtest\build_tools\SCons\test\printer_propagation\cxxtest\CrazyRunner.h /^ void process_commandline(int argc, char** argv) { }$/;" f class:CxxTest::CrazyRunner
+process_commandline tools\cxxtest\cxxtest\Gui.h /^ void process_commandline( int& argc, char** argv )$/;" f class:CxxTest::GuiTuiRunner
+process_commandline tools\cxxtest\cxxtest\TestListener.h /^ virtual void process_commandline(int& \/*argc*\/, char** \/*argv*\/) {}$/;" f class:CxxTest::TestListener
+processed tools\cxxtest\doc\include_anchors.py /^processed = set()$/;" v
+progress tools\cxxtest\test\fake\qprogressbar.h /^ int progress() { return 0; }$/;" f class:QProgressBar
+progressBarMessage tools\cxxtest\cxxtest\Win32Gui.h /^ void progressBarMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )$/;" f class:CxxTest::Win32Gui
+ptr source\cork.cpp /^ void * ptr;$/;" m struct:BlockTableEntry file:
+purge_tests tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def purge_tests(dirs):$/;" f
+push_scope tools\cxxtest\python\cxxtest\cxx_parser.py /^ def push_scope(self,ns,scope_t,base_classes=[]):$/;" m class:CppInfo
+push_scope tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^ def push_scope(self,ns,scope_t,base_classes=[]):$/;" m class:CppInfo
+py_version tools\cxxtest\admin\virtualenv.py /^py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])$/;" v
+pydistutils tools\cxxtest\admin\virtualenv.py /^ pydistutils = os.path.expanduser('~\/.pydistutils.cfg')$/;" v
+pyutilib tools\cxxtest\doc\examples\test_examples.py /^import pyutilib.th as unittest$/;" i
+pyutilib tools\cxxtest\test\test_doc.py /^ import pyutilib.th as unittest$/;" i
+pyutilib_available tools\cxxtest\test\test_doc.py /^ pyutilib_available=False$/;" v
+pyutilib_available tools\cxxtest\test\test_doc.py /^ pyutilib_available=True$/;" v
+qtFlags tools\cxxtest\test\test_cxxtest.py /^ qtFlags='-Ifake'$/;" v class:TestCL
+qtFlags tools\cxxtest\test\test_cxxtest.py /^ qtFlags='-Ifake'$/;" v class:TestClang
+qtFlags tools\cxxtest\test\test_cxxtest.py /^ qtFlags='-Ifake'$/;" v class:TestCpp
+qtFlags tools\cxxtest\test\test_cxxtest.py /^ qtFlags='-Ifake'$/;" v class:TestGpp
+rand tools\cxxtest\sample\mock\MockStdlib.h /^ int rand()$/;" f class:MockStdlib
+re tools\cxxtest\admin\virtualenv.py /^import re$/;" i
+re tools\cxxtest\doc\include_anchors.py /^import re$/;" i
+re tools\cxxtest\python\cxxtest\cxx_parser.py /^import re$/;" i
+re tools\cxxtest\python\cxxtest\cxxtest_fog.py /^import re$/;" i
+re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^import re$/;" i
+re tools\cxxtest\python\cxxtest\cxxtestgen.py /^import re$/;" i
+re tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import re$/;" i
+re tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^import re$/;" i
+re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^import re$/;" i
+re tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^import re$/;" i
+re tools\cxxtest\test\test_cxxtest.py /^import re$/;" i
+read_opts tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def read_opts(t):$/;" f
+realSuite tools\cxxtest\cxxtest\RealDescriptions.h /^ S *realSuite() const { return *_suite; }$/;" f class:CxxTest::DynamicSuiteDescription
+realpath tools\cxxtest\python\setup.py /^from os.path import realpath, dirname$/;" i
+redBar tools\cxxtest\cxxtest\Gui.h /^ virtual void redBar() {}$/;" f class:CxxTest::GuiListener
+redBar tools\cxxtest\cxxtest\QtGui.h /^ void redBar()$/;" f class:CxxTest::QtGui
+redBar tools\cxxtest\cxxtest\Win32Gui.h /^ void redBar()$/;" f class:CxxTest::Win32Gui
+redBar tools\cxxtest\cxxtest\X11Gui.h /^ void redBar()$/;" f class:CxxTest::X11Gui
+redBar tools\cxxtest\test\cxxtest\DummyGui.h /^ void redBar()$/;" f class:CxxTest::DummyGui
+redBarSafe tools\cxxtest\cxxtest\Gui.h /^ void redBarSafe()$/;" f class:CxxTest::GuiListener
+redraw tools\cxxtest\cxxtest\X11Gui.h /^ void redraw()$/;" f class:CxxTest::X11Gui
+registerWindowClass tools\cxxtest\cxxtest\Win32Gui.h /^ void registerWindowClass()$/;" f class:CxxTest::Win32Gui
+register_directory tools\rake_utils\artifact.rb /^ def register_directory(dir_name)$/;" f class:Artifact
+reinstall tools\cxxtest\doc\guide.html /^ function reinstall() {$/;" f
+reinstallAndRemoveTimer tools\cxxtest\doc\guide.html /^ function reinstallAndRemoveTimer() {$/;" f
+rememberSuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def rememberSuite(suite):$/;" f
+rememberSuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def rememberSuite(suite):$/;" f
+removeWidget tools\cxxtest\test\fake\qstatusbar.h /^ void removeWidget( void * ) {}$/;" f class:QStatusBar
+remove_absdir tools\cxxtest\test\test_cxxtest.py /^def remove_absdir(filename):$/;" f
+render_to_epub tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def render_to_epub(output_file, verbose) $/;" f class:DocBook.Epub
+render_to_file tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def render_to_file(output_file, verbose=false)$/;" f class:DocBook.Epub
+reportError tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealWorldDescription::reportError( const char *message )$/;" f class:CxxTest::RealWorldDescription
+reportTest tools\cxxtest\cxxtest\ErrorFormatter.h /^ void reportTest( void )$/;" f class:CxxTest::ErrorFormatter
+requiredDigitsOnLeft tools\cxxtest\cxxtest\ValueTraits.cpp /^ unsigned ValueTraits<const double>::requiredDigitsOnLeft( double t )$/;" f class:CxxTest::ValueTraits
+reserved tools\cxxtest\python\cxxtest\cxx_parser.py /^reserved = {$/;" v
+reserved tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^reserved = {$/;" v
+reset tools\cxxtest\cxxtest\Win32Gui.h /^ void reset( DWORD &tick )$/;" f class:CxxTest::Win32Gui
+resizeControls tools\cxxtest\cxxtest\Win32Gui.h /^ void resizeControls()$/;" f class:CxxTest::Win32Gui
+resolve_interpreter tools\cxxtest\admin\virtualenv.py /^def resolve_interpreter(exe):$/;" f
+result tools\cxxtest\test\MockTest.h /^ Opaque result;$/;" m class:MockGetOpaque
+result tools\cxxtest\test\MockTest.h /^ double result;$/;" m class:MockDoubleIdentity
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:MockIntIdentity
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:MockOne
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:SupplyFour
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:SupplyOne
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:SupplyThree
+result tools\cxxtest\test\MockTest.h /^ int result;$/;" m class:SupplyTwo
+right tools\cxxtest\test\fake\windows.h /^ LONG left, right, top, bottom;$/;" m struct:RECT
+rmtree tools\cxxtest\admin\virtualenv.py /^def rmtree(dir):$/;" f
+roll tools\cxxtest\sample\mock\Dice.cpp /^unsigned Dice::roll()$/;" f class:Dice
+run tools\cxxtest\build_tools\SCons\test\printer_propagation\cxxtest\CrazyRunner.h /^ int run() { return 0; }$/;" f class:CxxTest::CrazyRunner
+run tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ void DummyTestDescription::run() {}$/;" f class:CxxTest::DummyTestDescription
+run tools\cxxtest\cxxtest\ErrorFormatter.h /^ int run()$/;" f class:CxxTest::ErrorFormatter
+run tools\cxxtest\cxxtest\Gui.h /^ int run()$/;" f class:CxxTest::GuiTuiRunner
+run tools\cxxtest\cxxtest\RealDescriptions.cpp /^ void RealTestDescription::run()$/;" f class:CxxTest::RealTestDescription
+run tools\cxxtest\cxxtest\XmlFormatter.h /^ int run()$/;" f class:CxxTest::XmlFormatter
+run tools\cxxtest\cxxtest\YesNoRunner.h /^ int run()$/;" f class:CxxTest::YesNoRunner
+run tools\cxxtest\test\main.cpp /^ void run()$/;" f class:SummaryPrinter
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestCL
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestCLFOG
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestClang
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestClangFOG
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestCpp
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestCppFOG
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestGpp
+run tools\cxxtest\test\test_cxxtest.py /^ def run(self, *args, **kwds):$/;" m class:TestGppFOG
+runAllTests tools\cxxtest\cxxtest\TestRunner.h /^ static void runAllTests( TestListener &listener )$/;" f class:CxxTest::TestRunner
+runAllTests tools\cxxtest\cxxtest\TestRunner.h /^ static void runAllTests( TestListener *listener )$/;" f class:CxxTest::TestRunner
+runBody tools\cxxtest\python\cxxtest\cxxtestgen.py /^def runBody( suite, test ):$/;" f
+runBody tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def runBody( suite, test ):$/;" f
+runGui tools\cxxtest\cxxtest\Gui.h /^ virtual void runGui( int &argc, char **argv, TestListener &listener )$/;" f class:CxxTest::GuiListener
+runSuite tools\cxxtest\cxxtest\TestRunner.h /^ void runSuite( SuiteDescription &sd )$/;" f class:CxxTest::TestRunner
+runTest tools\cxxtest\cxxtest\TestRunner.h /^ void runTest( TestDescription &td )$/;" f class:CxxTest::TestRunner
+runWorld tools\cxxtest\cxxtest\TestRunner.h /^ void runWorld()$/;" f class:CxxTest::TestRunner
+run_all_test_runners tools\rake_utils\tests.rb /^ def run_all_test_runners()$/;" f class:Tests
+run_scons tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def run_scons(t, opts):$/;" f
+run_test tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def run_test(t):$/;" f
+runners tools\rake_utils\tests.rb /^ def runners()$/;" f class:Tests
+runtime tools\cxxtest\cxxtest\XmlFormatter.h /^ double runtime;$/;" m class:CxxTest::TestCaseInfo
+s tools\cxxtest\admin\virtualenv.py /^ logger.info("Cannot import bootstrap module: %s" % modname)$/;" i
+sameData tools\cxxtest\cxxtest\TestSuite.cpp /^ bool sameData( const void *x, const void *y, unsigned size )$/;" f namespace:CxxTest
+sameFiles tools\cxxtest\cxxtest\TestSuite.cpp /^ bool sameFiles( const char* file1, const char* file2, std::ostringstream& explanation)$/;" f namespace:CxxTest
+sampledir tools\cxxtest\test\test_cxxtest.py /^sampledir = os.path.dirname(os.path.dirname(currdir))+'\/sample'+os.sep$/;" v
+samples tools\cxxtest\test\test_cxxtest.py /^samples = ' '.join(file for file in sorted(glob.glob(sampledir+'*.h')))$/;" v
+scanInputFile tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanInputFile(fileName):$/;" f
+scanInputFile tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanInputFile(fileName):$/;" f
+scanInputFiles tools\cxxtest\python\cxxtest\cxxtest_fog.py /^def scanInputFiles(files, _options):$/;" f
+scanInputFiles tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanInputFiles(files, _options):$/;" f
+scanInputFiles tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^def scanInputFiles(files, _options):$/;" f
+scanInputFiles tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanInputFiles(files, _options):$/;" f
+scanInputLine tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanInputLine( fileName, lineNo, line ):$/;" f
+scanInputLine tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanInputLine( fileName, lineNo, line ):$/;" f
+scanLineForCreate tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForCreate( suite, lineNo, line ):$/;" f
+scanLineForCreate tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForCreate( suite, lineNo, line ):$/;" f
+scanLineForDestroy tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForDestroy( suite, lineNo, line ):$/;" f
+scanLineForDestroy tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForDestroy( suite, lineNo, line ):$/;" f
+scanLineForExceptionHandling tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForExceptionHandling( line ):$/;" f
+scanLineForExceptionHandling tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForExceptionHandling( line ):$/;" f
+scanLineForStandardLibrary tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForStandardLibrary( line ):$/;" f
+scanLineForStandardLibrary tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForStandardLibrary( line ):$/;" f
+scanLineForSuiteStart tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForSuiteStart( fileName, lineNo, line ):$/;" f
+scanLineForSuiteStart tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForSuiteStart( fileName, lineNo, line ):$/;" f
+scanLineForTest tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineForTest( suite, lineNo, line ):$/;" f
+scanLineForTest tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineForTest( suite, lineNo, line ):$/;" f
+scanLineInsideSuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def scanLineInsideSuite( suite, lineNo, line ):$/;" f
+scanLineInsideSuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def scanLineInsideSuite( suite, lineNo, line ):$/;" f
+scope_lineno tools\cxxtest\python\cxxtest\cxx_parser.py /^scope_lineno = 0$/;" v
+scope_lineno tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^scope_lineno = 0$/;" v
+scripts tools\cxxtest\python\setup.py /^ scripts=['scripts\/cxxtestgen']$/;" v
+set tools\cxxtest\admin\virtualenv.py /^ from sets import Set as set$/;" i
+setAbortTestOnFail tools\cxxtest\cxxtest\TestSuite.cpp /^ void setAbortTestOnFail( bool value )$/;" f namespace:CxxTest
+setActive tools\cxxtest\cxxtest\LinkedList.cpp /^ void Link::setActive( bool value )$/;" f class:CxxTest::Link
+setCaption tools\cxxtest\cxxtest\QtGui.h /^ void setCaption( const QString &suiteName, const QString &testName )$/;" f class:CxxTest::QtGui
+setCaption tools\cxxtest\cxxtest\Win32Gui.h /^ void setCaption( const char *a = "", const char *b = "", const char *c = "", const char *d = "" )$/;" f class:CxxTest::Win32Gui
+setCaption tools\cxxtest\test\fake\qwidget.h /^ void setCaption( const QString & ) {}$/;" f class:QWidget
+setColor tools\cxxtest\cxxtest\QtGui.h /^ void setColor( int r, int g, int b )$/;" f class:CxxTest::QtGui
+setColor tools\cxxtest\cxxtest\Win32Gui.h /^ void setColor( BYTE red, BYTE green, BYTE blue )$/;" f class:CxxTest::Win32Gui
+setColor tools\cxxtest\cxxtest\Win32Gui.h /^ void setColor( BYTE, BYTE, BYTE ) $/;" f class:CxxTest::Win32Gui
+setColor tools\cxxtest\test\fake\qprogressbar.h /^ void setColor( int, const QColor & ) {}$/;" f class:QPalette
+setFiles tools\cxxtest\python\cxxtest\cxxtestgen.py /^def setFiles(patterns ):$/;" f
+setFiles tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def setFiles(patterns ):$/;" f
+setFirst tools\cxxtest\cxxtest\TeeListener.h /^ void setFirst( TestListener &first )$/;" f class:CxxTest::TeeListener
+setGeometry tools\cxxtest\test\fake\qwidget.h /^ void setGeometry( int, int, int, int ) {}$/;" f class:QWidget
+setIcon tools\cxxtest\cxxtest\QtGui.h /^ void setIcon( QMessageBox::Icon icon )$/;" f class:CxxTest::QtGui
+setIcon tools\cxxtest\cxxtest\Win32Gui.h /^ void setIcon( LPCTSTR icon )$/;" f class:CxxTest::Win32Gui
+setIcon tools\cxxtest\test\fake\qwidget.h /^ void setIcon( void * ) {}$/;" f class:QWidget
+setListener tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::setListener( TestListener *l )$/;" f class:CxxTest::TestTracker
+setMainWidget tools\cxxtest\cxxtest\QtGui.h /^ void setMainWidget()$/;" f class:CxxTest::QtGui
+setMainWidget tools\cxxtest\test\fake\qapplication.h /^ void setMainWidget( void * ) {}$/;" f class:QApplication
+setMaxDumpSize tools\cxxtest\cxxtest\TestSuite.cpp /^ void setMaxDumpSize( unsigned value )$/;" f namespace:CxxTest
+setPalette tools\cxxtest\test\fake\qprogressbar.h /^ void setPalette( const QPalette & ) {}$/;" f class:QProgressBar
+setProgress tools\cxxtest\test\fake\qprogressbar.h /^ void setProgress( int ) {}$/;" f class:QProgressBar
+setProgress tools\cxxtest\test\fake\qstatusbar.h /^ void setProgress() {}$/;" f class:QStatusBar
+setRatios tools\cxxtest\cxxtest\Win32Gui.h /^ void setRatios( unsigned suiteNameRatio, unsigned suiteTimeRatio,$/;" f class:CxxTest::Win32Gui
+setSecond tools\cxxtest\cxxtest\TeeListener.h /^ void setSecond( TestListener &second )$/;" f class:CxxTest::TeeListener
+setStatusPart tools\cxxtest\cxxtest\Win32Gui.h /^ void setStatusPart( unsigned part, const char *text )$/;" f class:CxxTest::Win32Gui
+setStatusParts tools\cxxtest\cxxtest\Win32Gui.h /^ void setStatusParts( LONG width )$/;" f class:CxxTest::Win32Gui
+setStatusTime tools\cxxtest\cxxtest\Win32Gui.h /^ void setStatusTime( unsigned part, DWORD start )$/;" f class:CxxTest::Win32Gui
+setSuite tools\cxxtest\cxxtest\RealDescriptions.h /^ void setSuite( S *s ) { *_suite = s; }$/;" f class:CxxTest::DynamicSuiteDescription
+setSuite tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::setSuite( const SuiteDescription *s )$/;" f class:CxxTest::TestTracker
+setSummaryCaption tools\cxxtest\cxxtest\Win32Gui.h /^ void setSummaryCaption()$/;" f class:CxxTest::Win32Gui
+setSummaryStatusBar tools\cxxtest\cxxtest\Win32Gui.h /^ void setSummaryStatusBar()$/;" f class:CxxTest::Win32Gui
+setTest tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::setTest( const TestDescription *t )$/;" f class:CxxTest::TestTracker
+setTestCaption tools\cxxtest\cxxtest\Win32Gui.h /^ void setTestCaption( const char *suiteName, const char *testName )$/;" f class:CxxTest::Win32Gui
+setText tools\cxxtest\test\fake\qlabel.h /^ void setText( const QString & ) {}$/;" f class:QLabel
+setUp tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummySuiteDescription::setUp() { return true;}$/;" f class:CxxTest::DummySuiteDescription
+setUp tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummyTestDescription::setUp() { return true;}$/;" f class:CxxTest::DummyTestDescription
+setUp tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummyWorldDescription::setUp() { return true;}$/;" f class:CxxTest::DummyWorldDescription
+setUp tools\cxxtest\cxxtest\GlobalFixture.cpp /^ bool GlobalFixture::setUp() { return true; }$/;" f class:CxxTest::GlobalFixture
+setUp tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealTestDescription::setUp()$/;" f class:CxxTest::RealTestDescription
+setUp tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealWorldDescription::setUp()$/;" f class:CxxTest::RealWorldDescription
+setUp tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool StaticSuiteDescription::setUp() { return true; }$/;" f class:CxxTest::StaticSuiteDescription
+setUp tools\cxxtest\cxxtest\RealDescriptions.h /^ bool DynamicSuiteDescription<S>::setUp()$/;" f class:CxxTest::DynamicSuiteDescription
+setUp tools\cxxtest\cxxtest\TestSuite.cpp /^ void TestSuite::setUp() {}$/;" f class:CxxTest::TestSuite
+setUp tools\cxxtest\cxxtest\Win32Gui.h /^ static void setUp( HWND window, LPCREATESTRUCT create )$/;" f class:CxxTest::Win32Gui
+setUp tools\cxxtest\doc\examples\MyTestSuite5.h /^ void setUp()$/;" f class:MyTestSuite5
+setUp tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool setUp() { ++ setUpCount; return true; }$/;" f class:Fixture1
+setUp tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool setUp()$/;" f class:Fixture2
+setUp tools\cxxtest\sample\DeltaTest.h /^ void setUp()$/;" f class:DeltaTest
+setUp tools\cxxtest\sample\FixtureTest.h /^ void setUp()$/;" f class:FixtureTest
+setUp tools\cxxtest\sample\SCons\tests\stack_test.h /^ void setUp() {$/;" f class:stack_test
+setUp tools\cxxtest\sample\mock\TestDice.h /^ void setUp()$/;" f class:TestDice
+setUp tools\cxxtest\test\CppTemplateTest.h /^ void setUp() { Tests<int>::setUp(); }$/;" f class:IntTests
+setUp tools\cxxtest\test\CppTemplateTest.h /^ void setUp()$/;" f class:Tests
+setUp tools\cxxtest\test\DoubleCall.h /^ void setUp()$/;" f class:DoubleCall
+setUp tools\cxxtest\test\DynamicAbort.h /^ void setUp()$/;" f class:SetUpWorksAllTests
+setUp tools\cxxtest\test\DynamicMax.h /^ void setUp()$/;" f class:DynamicMax
+setUp tools\cxxtest\test\DynamicMax.h /^ void setUp()$/;" f class:SetUpAffectsAllTests
+setUp tools\cxxtest\test\EmptySuite.h /^ void setUp() {}$/;" f class:EmptySuite
+setUp tools\cxxtest\test\Exceptions.h /^ void setUp() { throw 5; }$/;" f class:ThrowSetUp
+setUp tools\cxxtest\test\Exceptions.h /^ void setUp() {}$/;" f class:ThrowTearDown
+setUp tools\cxxtest\test\GfSetUpFails.h /^ bool setUp() { return false; }$/;" f class:Fixture
+setUp tools\cxxtest\test\GfSetUpThrows.h /^ bool setUp() { throw this; }$/;" f class:Fixture
+setUp tools\cxxtest\test\GlobalFixtures.h /^ bool setUp() { ++ _setUpCount; return true; }$/;" f class:Fixture1
+setUp tools\cxxtest\test\GlobalFixtures.h /^ bool setUp()$/;" f class:Fixture2
+setUp tools\cxxtest\test\SameData.h /^ void setUp()$/;" f class:SameData
+setUp tools\cxxtest\test\SameZero.h /^ void setUp()$/;" f class:SameZero
+setUp tools\cxxtest\test\SimpleInheritedTest.h /^ void setUp()$/;" f class:Tests
+setUp tools\cxxtest\test\SimpleInheritedTest2.h /^ void setUp() { Tests::setUp();}$/;" f class:InheritedTests
+setUp tools\cxxtest\test\SimpleInheritedTest2.h /^ void setUp()$/;" f class:Tests
+setUp tools\cxxtest\test\WorldFixtures.h /^ bool setUp() { printf( "<test>" ); return true; }$/;" f class:PrintingFixture
+setUp tools\cxxtest\test\test_cxxtest.py /^ def setUp(self):$/;" m class:BaseTestCase
+setUp tools\cxxtest\test\test_cxxtest.py /^ def setUp(self):$/;" m class:TestCL
+setUp tools\cxxtest\test\test_cxxtest.py /^ def setUp(self):$/;" m class:TestClang
+setUp tools\cxxtest\test\test_cxxtest.py /^ def setUp(self):$/;" m class:TestCpp
+setUp tools\cxxtest\test\test_cxxtest.py /^ def setUp(self):$/;" m class:TestGpp
+setUp tools\cxxtest\test\unit\LinkedList_test.t.h /^ bool setUp() { return true; }$/;" f class:TestLink
+setUpCount tools\cxxtest\doc\examples\MyTestSuite8.h /^ unsigned setUpCount;$/;" m class:Fixture1
+setUpCount tools\cxxtest\test\GlobalFixtures.h /^ unsigned setUpCount() const { return _setUpCount; }$/;" f class:Fixture1
+setUpWorld tools\cxxtest\cxxtest\GlobalFixture.cpp /^ bool GlobalFixture::setUpWorld() { return true; }$/;" f class:CxxTest::GlobalFixture
+setUpWorld tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool setUpWorld() { printf( "Starting a test suite\\n" ); return true;}$/;" f class:Fixture1
+setUpWorld tools\cxxtest\test\SetUpWorldError.h /^ bool setUpWorld() { TS_FAIL("THIS IS BAD"); return false; }$/;" f class:Fixture
+setUpWorld tools\cxxtest\test\SetUpWorldFails.h /^ bool setUpWorld() { return false; }$/;" f class:Fixture
+setUpWorld tools\cxxtest\test\SetUpWorldThrows.h /^ bool setUpWorld() { throw this; }$/;" f class:Fixture
+setUpWorld tools\cxxtest\test\WorldFixtures.h /^ bool setUpWorld() { printf( "<world>" ); return true; }$/;" f class:PrintingFixture
+setWindowName tools\cxxtest\cxxtest\X11Gui.h /^ void setWindowName( const char *suiteName, const char *testName )$/;" f class:CxxTest::X11Gui
+setWorld tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::setWorld( const WorldDescription *w )$/;" f class:CxxTest::TestTracker
+setup tools\cxxtest\python\setup.py /^ from distutils.core import setup$/;" i
+setup tools\cxxtest\python\setup.py /^ from setuptools import setup$/;" i
+setup_default_rake_tasks tools\rake_utils\library.rb /^ def setup_default_rake_tasks()$/;" f class:Library
+setup_default_rake_tasks tools\rake_utils\tests.rb /^ def setup_default_rake_tasks()$/;" f class:Tests
+setup_env tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def setup_env(t, opts):$/;" f
+showMainWindow tools\cxxtest\cxxtest\Win32Gui.h /^ void showMainWindow( int mode )$/;" f class:CxxTest::Win32Gui
+showMainWindow tools\cxxtest\cxxtest\Win32Gui.h /^ void showMainWindow()$/;" f class:CxxTest::Win32Gui
+showMinimized tools\cxxtest\cxxtest\QtGui.h /^ void showMinimized()$/;" f class:CxxTest::QtGui
+showMinimized tools\cxxtest\test\fake\qwidget.h /^ void showMinimized() {}$/;" f class:QWidget
+showNormal tools\cxxtest\cxxtest\QtGui.h /^ void showNormal()$/;" f class:CxxTest::QtGui
+showNormal tools\cxxtest\test\fake\qwidget.h /^ void showNormal() {}$/;" f class:QWidget
+showSuiteName tools\cxxtest\cxxtest\QtGui.h /^ void showSuiteName( const QString &suiteName )$/;" f class:CxxTest::QtGui
+showSuiteName tools\cxxtest\cxxtest\Win32Gui.h /^ void showSuiteName( const char *suiteName )$/;" f class:CxxTest::Win32Gui
+showSummary tools\cxxtest\cxxtest\QtGui.h /^ void showSummary()$/;" f class:CxxTest::QtGui
+showSummary tools\cxxtest\cxxtest\Win32Gui.h /^ void showSummary()$/;" f class:CxxTest::Win32Gui
+showTestName tools\cxxtest\cxxtest\QtGui.h /^ void showTestName( const QString &testName )$/;" f class:CxxTest::QtGui
+showTestName tools\cxxtest\cxxtest\Win32Gui.h /^ void showTestName( const char *testName )$/;" f class:CxxTest::Win32Gui
+showTestsDone tools\cxxtest\cxxtest\QtGui.h /^ void showTestsDone( unsigned testsDone )$/;" f class:CxxTest::QtGui
+showTestsDone tools\cxxtest\cxxtest\Win32Gui.h /^ void showTestsDone()$/;" f class:CxxTest::Win32Gui
+show_progress tools\cxxtest\admin\virtualenv.py /^ def show_progress(self):$/;" m class:Logger
+shutil tools\cxxtest\admin\virtualenv.py /^import shutil$/;" i
+shutil tools\cxxtest\python\convert.py /^import shutil$/;" i
+site tools\cxxtest\admin\virtualenv.py /^ import site$/;" i
+size source\cork.cpp /^ unsigned int size;$/;" m struct:BlockTable file:
+size source\cork.cpp /^ unsigned int size;$/;" m struct:BlockTableEntry file:
+size tools\cxxtest\cxxtest\LinkedList.cpp /^ unsigned List::size() const$/;" f class:CxxTest::List
+size tools\cxxtest\sample\SCons\include\stack.h /^ int size;$/;" m struct:stack_t
+size_t source\cork.h /^typedef unsigned int size_t;$/;" t
+something tools\cxxtest\test\Something.h /^inline std::string something() { return "something"; }$/;" f
+source_from_obj tools\rake_utils\binary.rb /^ def source_from_obj(obj)$/;" f class:Binary
+source_from_obj tools\rake_utils\library.rb /^ def source_from_obj(obj)$/;" f class:Library
+srand tools\cxxtest\sample\mock\MockStdlib.h /^ void srand( unsigned seed )$/;" f class:MockStdlib
+src_test_lookup tools\rake_utils\tests.rb /^ def src_test_lookup()$/;" f class:Tests
+stack tools\cxxtest\sample\SCons\tests\stack_test.h /^ stack_t* stack;$/;" m class:stack_test
+stack_capacity tools\cxxtest\sample\SCons\src\stack.c /^int stack_capacity(stack_t* stack) {$/;" f
+stack_create tools\cxxtest\sample\SCons\src\stack.c /^stack_t* stack_create() {$/;" f
+stack_free tools\cxxtest\sample\SCons\src\stack.c /^void stack_free(stack_t* stack) {$/;" f
+stack_peak tools\cxxtest\sample\SCons\src\stack.c /^int stack_peak(stack_t* stack) {$/;" f
+stack_pop tools\cxxtest\sample\SCons\src\stack.c /^int stack_pop(stack_t* stack) {$/;" f
+stack_push tools\cxxtest\sample\SCons\src\stack.c /^void stack_push(stack_t* stack, int val) {$/;" f
+stack_size tools\cxxtest\sample\SCons\src\stack.c /^int stack_size(stack_t* stack) {$/;" f
+stack_t tools\cxxtest\sample\SCons\include\stack.h /^ typedef struct stack_t {$/;" s
+stack_t tools\cxxtest\sample\SCons\include\stack.h /^ } stack_t;$/;" t typeref:struct:stack_t
+stack_test tools\cxxtest\sample\SCons\tests\stack_test.h /^class stack_test : public CxxTest::TestSuite$/;" c
+standardIcon tools\cxxtest\test\fake\qmessagebox.h /^ static void *standardIcon( Icon ) { return 0; }$/;" f class:QMessageBox
+start tools\cxxtest\python\cxxtest\cxx_parser.py /^start = 'translation_unit'$/;" v
+start tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^start = 'translation_unit'$/;" v
+startGuiThread tools\cxxtest\cxxtest\Win32Gui.h /^ void startGuiThread()$/;" f class:CxxTest::Win32Gui
+startOutputFile tools\cxxtest\python\cxxtest\cxxtestgen.py /^def startOutputFile():$/;" f
+startOutputFile tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def startOutputFile():$/;" f
+startSuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def startSuite( name, file, line, generated ):$/;" f
+startSuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def startSuite( name, file, line, generated ):$/;" f
+startTests tools\cxxtest\cxxtest\Win32Gui.h /^ void startTests()$/;" f class:CxxTest::Win32Gui
+startTimer tools\cxxtest\cxxtest\Win32Gui.h /^ void startTimer()$/;" f class:CxxTest::Win32Gui
+start_progress tools\cxxtest\admin\virtualenv.py /^ def start_progress(self, msg):$/;" m class:Logger
+staticRun tools\cxxtest\python\cxxtest\cxxtestgen.py /^def staticRun( suite, test ):$/;" f
+staticRun tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def staticRun( suite, test ):$/;" f
+statusBarMessage tools\cxxtest\cxxtest\Win32Gui.h /^ void statusBarMessage( UINT message, WPARAM wParam = 0, const void *lParam = 0 )$/;" f class:CxxTest::Win32Gui
+std_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^std_re = re.compile( r"\\b(std\\s*::|CXXTEST_STD|using\\s+namespace\\s+std\\b|^\\s*\\#\\s*include\\s+<[a-z0-9]+>)" )$/;" v
+std_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^std_re = re.compile( r"\\b(std\\s*::|CXXTEST_STD|using\\s+namespace\\s+std\\b|^\\s*\\#\\s*include\\s+<[a-z0-9]+>)" )$/;" v
+stdlib tools\cxxtest\sample\mock\TestDice.h /^ MockStdlib *stdlib;$/;" m class:TestDice
+stdout tools\cxxtest\admin\virtualenv.py /^ stdout=subprocess.PIPE)$/;" v
+stdout_level_matches tools\cxxtest\admin\virtualenv.py /^ def stdout_level_matches(self, level):$/;" m class:Logger
+stop tools\cxxtest\cxxtest\ErrorFormatter.h /^ OutputStream &stop( const char *file, int line )$/;" f class:CxxTest::ErrorFormatter
+stopTimer tools\cxxtest\cxxtest\Win32Gui.h /^ void stopTimer()$/;" f class:CxxTest::Win32Gui
+strTotalTests tools\cxxtest\cxxtest\Descriptions.cpp /^ char *WorldDescription::strTotalTests( char *s ) const$/;" f class:CxxTest::WorldDescription
+stream_redirect tools\cxxtest\cxxtest\XmlFormatter.h /^ TeeOutputStreams *stream_redirect;$/;" m class:CxxTest::XmlFormatter
+streambuf_t tools\cxxtest\cxxtest\XmlFormatter.h /^ typedef std::basic_streambuf<char> streambuf_t;$/;" t class:CxxTest::TeeOutputStreams::teebuffer
+stringsEqual tools\cxxtest\cxxtest\ValueTraits.cpp /^ bool stringsEqual( const char *s1, const char *s2 )$/;" f namespace:CxxTest
+strtobool tools\cxxtest\admin\virtualenv.py /^from distutils.util import strtobool$/;" i
+style tools\cxxtest\test\fake\windows.h /^ int style;$/;" m struct:WNDCLASSEX
+subprocess tools\cxxtest\admin\virtualenv.py /^ import subprocess$/;" i
+subprocess tools\cxxtest\python\convert.py /^import subprocess$/;" i
+subprocess tools\cxxtest\test\test_cxxtest.py /^import subprocess$/;" i
+succeed tools\cxxtest\test\DeepAbort.h /^ void succeed()$/;" f class:DeepAbort
+suffix tools\cxxtest\doc\include_anchors.py /^ suffix = 'cpp'$/;" v
+suffix tools\cxxtest\doc\include_anchors.py /^ suffix = 'h'$/;" v
+suffix tools\cxxtest\doc\include_anchors.py /^ suffix = 'sh'$/;" v
+suffix tools\cxxtest\doc\include_anchors.py /^ suffix = 'py'$/;" v
+suffix tools\cxxtest\doc\include_anchors.py /^ suffix = None$/;" v
+suite tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ TestSuite *DummySuiteDescription::suite() const { return 0; }$/;" f class:CxxTest::DummySuiteDescription
+suite tools\cxxtest\cxxtest\RealDescriptions.cpp /^ TestSuite *RealTestDescription::suite() const { return _suite->suite(); }$/;" f class:CxxTest::RealTestDescription
+suite tools\cxxtest\cxxtest\RealDescriptions.cpp /^ TestSuite *StaticSuiteDescription::suite() const$/;" f class:CxxTest::StaticSuiteDescription
+suite tools\cxxtest\cxxtest\RealDescriptions.h /^ TestSuite *suite() const { return realSuite(); }$/;" f class:CxxTest::DynamicSuiteDescription
+suite tools\cxxtest\cxxtest\TestTracker.h /^ const SuiteDescription &suite() const { return *_suite; }$/;" f class:CxxTest::TestTracker
+suite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^suite = None$/;" v
+suite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^suite = None$/;" v
+suiteDescription tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const SuiteDescription &DummyWorldDescription::suiteDescription( unsigned ) const { return _suite; }$/;" f class:CxxTest::DummyWorldDescription
+suiteDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const SuiteDescription &RealWorldDescription::suiteDescription( unsigned i ) const$/;" f class:CxxTest::RealWorldDescription
+suiteFailed tools\cxxtest\cxxtest\TestTracker.h /^ bool suiteFailed() const { return (suiteFailedTests() > 0); }$/;" f class:CxxTest::TestTracker
+suiteFailedTests tools\cxxtest\cxxtest\TestTracker.h /^ unsigned suiteFailedTests() const { return _suiteFailedTests; }$/;" f class:CxxTest::TestTracker
+suiteName tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const char *DummySuiteDescription::suiteName() const { return "<no suite>"; }$/;" f class:CxxTest::DummySuiteDescription
+suiteName tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const char *DummyTestDescription::suiteName() const { return "<no suite>"; }$/;" f class:CxxTest::DummyTestDescription
+suiteName tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const char *RealSuiteDescription::suiteName() const { return _suiteName; }$/;" f class:CxxTest::RealSuiteDescription
+suiteName tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const char *RealTestDescription::suiteName() const { return _suite->suiteName(); }$/;" f class:CxxTest::RealTestDescription
+suites tools\cxxtest\cxxtest\RealDescriptions.cpp /^ List &RealWorldDescription::suites()$/;" f class:CxxTest::RealWorldDescription
+suites tools\cxxtest\python\cxxtest\cxxtest_parser.py /^suites = []$/;" v
+suites tools\cxxtest\python\cxxtest\cxxtestgen.py /^suites = []$/;" v
+suites tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^suites = []$/;" v
+suites tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^suites = []$/;" v
+suites_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^suites_re = { re.compile( general_suite + testsuite ) : None }$/;" v
+suites_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^suites_re = { re.compile( general_suite + testsuite ) : None }$/;" v
+supplyOne tools\cxxtest\test\MockTest.h /^ int supplyOne() { return result; }$/;" f class:SupplyOne
+supplyTwo tools\cxxtest\test\MockTest.h /^ void supplyTwo( int *p ) { *p = result; }$/;" f class:SupplyTwo
+sync tools\cxxtest\cxxtest\XmlFormatter.h /^ virtual int sync()$/;" f class:CxxTest::TeeOutputStreams::teebuffer
+sys tools\cxxtest\admin\virtualenv.py /^import sys$/;" i
+sys tools\cxxtest\build_tools\SCons\test\eprouvette.py /^import os, sys$/;" i
+sys tools\cxxtest\doc\examples\test_examples.py /^import sys$/;" i
+sys tools\cxxtest\doc\include_anchors.py /^import sys$/;" i
+sys tools\cxxtest\python\cxxtest\cxx_parser.py /^import sys$/;" i
+sys tools\cxxtest\python\cxxtest\cxxtest_fog.py /^import sys$/;" i
+sys tools\cxxtest\python\cxxtest\cxxtest_misc.py /^import sys$/;" i
+sys tools\cxxtest\python\cxxtest\cxxtestgen.py /^import sys$/;" i
+sys tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import sys$/;" i
+sys tools\cxxtest\python\python3\cxxtest\cxxtest_fog.py /^import sys$/;" i
+sys tools\cxxtest\python\python3\cxxtest\cxxtest_misc.py /^import sys$/;" i
+sys tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^import sys$/;" i
+sys tools\cxxtest\python\setup.py /^import sys$/;" i
+sys tools\cxxtest\test\test_cxxtest.py /^import sys$/;" i
+sys tools\cxxtest\test\test_doc.py /^import sys$/;" i
+sysconfig tools\cxxtest\admin\virtualenv.py /^ import sysconfig$/;" i
+sysconfig tools\cxxtest\admin\virtualenv.py /^import distutils.sysconfig$/;" i
+t_ARROW tools\cxxtest\python\cxxtest\cxx_parser.py /^t_ARROW = r"->"$/;" v
+t_ARROW tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_ARROW = r"->"$/;" v
+t_ARROW_STAR tools\cxxtest\python\cxxtest\cxx_parser.py /^t_ARROW_STAR = r"->\\*"$/;" v
+t_ARROW_STAR tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_ARROW_STAR = r"->\\*"$/;" v
+t_COMMENT tools\cxxtest\python\cxxtest\cxx_parser.py /^def t_COMMENT(t):$/;" f
+t_COMMENT tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def t_COMMENT(t):$/;" f
+t_CharacterLiteral tools\cxxtest\python\cxxtest\cxx_parser.py /^t_CharacterLiteral = r'\\'([^\\'\\\\]|\\\\.)*\\''$/;" v
+t_CharacterLiteral tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_CharacterLiteral = r'\\'([^\\'\\\\]|\\\\.)*\\''$/;" v
+t_DEC tools\cxxtest\python\cxxtest\cxx_parser.py /^t_DEC = r"--"$/;" v
+t_DEC tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_DEC = r"--"$/;" v
+t_DOT_STAR tools\cxxtest\python\cxxtest\cxx_parser.py /^t_DOT_STAR = r"\\.\\*"$/;" v
+t_DOT_STAR tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_DOT_STAR = r"\\.\\*"$/;" v
+t_ELLIPSIS tools\cxxtest\python\cxxtest\cxx_parser.py /^t_ELLIPSIS = r"\\.\\.\\."$/;" v
+t_ELLIPSIS tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_ELLIPSIS = r"\\.\\.\\."$/;" v
+t_FloatingLiteral tools\cxxtest\python\cxxtest\cxx_parser.py /^t_FloatingLiteral = r"[0-9]+[eE\\.\\+-]+[eE\\.\\+\\-0-9]+"$/;" v
+t_FloatingLiteral tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_FloatingLiteral = r"[0-9]+[eE\\.\\+-]+[eE\\.\\+\\-0-9]+"$/;" v
+t_INC tools\cxxtest\python\cxxtest\cxx_parser.py /^t_INC = r"\\+\\+"$/;" v
+t_INC tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_INC = r"\\+\\+"$/;" v
+t_Identifier tools\cxxtest\python\cxxtest\cxx_parser.py /^def t_Identifier(t):$/;" f
+t_Identifier tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def t_Identifier(t):$/;" f
+t_IntegerLiteral tools\cxxtest\python\cxxtest\cxx_parser.py /^t_IntegerLiteral = r'(0x[0-9A-F]+)|([0-9]+(L){0,1})'$/;" v
+t_IntegerLiteral tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_IntegerLiteral = r'(0x[0-9A-F]+)|([0-9]+(L){0,1})'$/;" v
+t_LBRACE tools\cxxtest\python\cxxtest\cxx_parser.py /^t_LBRACE = r"(\\{)|(<%)"$/;" v
+t_LBRACE tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_LBRACE = r"(\\{)|(<%)"$/;" v
+t_LBRACKET tools\cxxtest\python\cxxtest\cxx_parser.py /^t_LBRACKET = r"(\\[)|(<:)"$/;" v
+t_LBRACKET tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_LBRACKET = r"(\\[)|(<:)"$/;" v
+t_LOG_AND tools\cxxtest\python\cxxtest\cxx_parser.py /^t_LOG_AND = r"&&"$/;" v
+t_LOG_AND tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_LOG_AND = r"&&"$/;" v
+t_LOG_OR tools\cxxtest\python\cxxtest\cxx_parser.py /^t_LOG_OR = r"\\|\\|"$/;" v
+t_LOG_OR tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_LOG_OR = r"\\|\\|"$/;" v
+t_RBRACE tools\cxxtest\python\cxxtest\cxx_parser.py /^t_RBRACE = r"(\\})|(%>)"$/;" v
+t_RBRACE tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_RBRACE = r"(\\})|(%>)"$/;" v
+t_RBRACKET tools\cxxtest\python\cxxtest\cxx_parser.py /^t_RBRACKET = r"(\\])|(:>)"$/;" v
+t_RBRACKET tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_RBRACKET = r"(\\])|(:>)"$/;" v
+t_SCOPE tools\cxxtest\python\cxxtest\cxx_parser.py /^t_SCOPE = r"::"$/;" v
+t_SCOPE tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_SCOPE = r"::"$/;" v
+t_SHL tools\cxxtest\python\cxxtest\cxx_parser.py /^t_SHL = r"<<"$/;" v
+t_SHL tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_SHL = r"<<"$/;" v
+t_SHR tools\cxxtest\python\cxxtest\cxx_parser.py /^t_SHR = r">>"$/;" v
+t_SHR tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_SHR = r">>"$/;" v
+t_StringLiteral tools\cxxtest\python\cxxtest\cxx_parser.py /^def t_StringLiteral(t):$/;" f
+t_StringLiteral tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def t_StringLiteral(t):$/;" f
+t_error tools\cxxtest\python\cxxtest\cxx_parser.py /^def t_error(t):$/;" f
+t_error tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def t_error(t):$/;" f
+t_ignore tools\cxxtest\python\cxxtest\cxx_parser.py /^t_ignore = " \\t\\r"$/;" v
+t_ignore tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^t_ignore = " \\t\\r"$/;" v
+t_newline tools\cxxtest\python\cxxtest\cxx_parser.py /^def t_newline(t):$/;" f
+t_newline tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^def t_newline(t):$/;" f
+tail tools\cxxtest\cxxtest\LinkedList.cpp /^ Link *List::tail()$/;" f class:CxxTest::List
+tail tools\cxxtest\cxxtest\LinkedList.cpp /^ const Link *List::tail() const$/;" f class:CxxTest::List
+target_suffix tools\cxxtest\test\test_cxxtest.py /^ target_suffix = ''$/;" v
+target_suffix tools\cxxtest\test\test_cxxtest.py /^ target_suffix = '.exe'$/;" v
+tearDown tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummySuiteDescription::tearDown() { return true;}$/;" f class:CxxTest::DummySuiteDescription
+tearDown tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummyTestDescription::tearDown() { return true;}$/;" f class:CxxTest::DummyTestDescription
+tearDown tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ bool DummyWorldDescription::tearDown() { return true;}$/;" f class:CxxTest::DummyWorldDescription
+tearDown tools\cxxtest\cxxtest\GlobalFixture.cpp /^ bool GlobalFixture::tearDown() { return true; }$/;" f class:CxxTest::GlobalFixture
+tearDown tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealTestDescription::tearDown()$/;" f class:CxxTest::RealTestDescription
+tearDown tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool RealWorldDescription::tearDown()$/;" f class:CxxTest::RealWorldDescription
+tearDown tools\cxxtest\cxxtest\RealDescriptions.cpp /^ bool StaticSuiteDescription::tearDown() { return true; }$/;" f class:CxxTest::StaticSuiteDescription
+tearDown tools\cxxtest\cxxtest\RealDescriptions.h /^ bool DynamicSuiteDescription<S>::tearDown()$/;" f class:CxxTest::DynamicSuiteDescription
+tearDown tools\cxxtest\cxxtest\TestSuite.cpp /^ void TestSuite::tearDown() {}$/;" f class:CxxTest::TestSuite
+tearDown tools\cxxtest\doc\examples\MyTestSuite5.h /^ void tearDown()$/;" f class:MyTestSuite5
+tearDown tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool tearDown() { ++ tearDownCount; return true; }$/;" f class:Fixture1
+tearDown tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool tearDown()$/;" f class:Fixture2
+tearDown tools\cxxtest\sample\FixtureTest.h /^ void tearDown()$/;" f class:FixtureTest
+tearDown tools\cxxtest\sample\SCons\tests\stack_test.h /^ void tearDown() {$/;" f class:stack_test
+tearDown tools\cxxtest\sample\mock\TestDice.h /^ void tearDown()$/;" f class:TestDice
+tearDown tools\cxxtest\test\CppTemplateTest.h /^ void tearDown() { Tests<int>::tearDown(); }$/;" f class:IntTests
+tearDown tools\cxxtest\test\CppTemplateTest.h /^ void tearDown()$/;" f class:Tests
+tearDown tools\cxxtest\test\EmptySuite.h /^ void tearDown() {}$/;" f class:EmptySuite
+tearDown tools\cxxtest\test\Exceptions.h /^ void tearDown() { TS_FAIL( "Shouldn't get here" ); }$/;" f class:ThrowSetUp
+tearDown tools\cxxtest\test\Exceptions.h /^ void tearDown() { throw 5; }$/;" f class:ThrowTearDown
+tearDown tools\cxxtest\test\GfTearDownFails.h /^ bool tearDown() { return false; }$/;" f class:Fixture
+tearDown tools\cxxtest\test\GfTearDownThrows.h /^ bool tearDown() { throw this; }$/;" f class:Fixture
+tearDown tools\cxxtest\test\GlobalFixtures.h /^ bool tearDown() { ++ _tearDownCount; return true; }$/;" f class:Fixture1
+tearDown tools\cxxtest\test\GlobalFixtures.h /^ bool tearDown()$/;" f class:Fixture2
+tearDown tools\cxxtest\test\SimpleInheritedTest.h /^ void tearDown()$/;" f class:Tests
+tearDown tools\cxxtest\test\SimpleInheritedTest2.h /^ void tearDown() { Tests::setUp();}$/;" f class:InheritedTests
+tearDown tools\cxxtest\test\SimpleInheritedTest2.h /^ void tearDown()$/;" f class:Tests
+tearDown tools\cxxtest\test\WorldFixtures.h /^ bool tearDown() { printf( "<\/test>" ); return true; }$/;" f class:PrintingFixture
+tearDown tools\cxxtest\test\test_cxxtest.py /^ def tearDown(self):$/;" m class:BaseTestCase
+tearDown tools\cxxtest\test\test_cxxtest.py /^ def tearDown(self):$/;" m class:TestCL
+tearDown tools\cxxtest\test\test_cxxtest.py /^ def tearDown(self):$/;" m class:TestClang
+tearDown tools\cxxtest\test\test_cxxtest.py /^ def tearDown(self):$/;" m class:TestCpp
+tearDown tools\cxxtest\test\test_cxxtest.py /^ def tearDown(self):$/;" m class:TestGpp
+tearDown tools\cxxtest\test\unit\LinkedList_test.t.h /^ bool tearDown() { return true; }$/;" f class:TestLink
+tearDownCount tools\cxxtest\doc\examples\MyTestSuite8.h /^ unsigned tearDownCount;$/;" m class:Fixture1
+tearDownCount tools\cxxtest\test\GlobalFixtures.h /^ unsigned tearDownCount() const { return _tearDownCount; }$/;" f class:Fixture1
+tearDownWorld tools\cxxtest\cxxtest\GlobalFixture.cpp /^ bool GlobalFixture::tearDownWorld() { return true; }$/;" f class:CxxTest::GlobalFixture
+tearDownWorld tools\cxxtest\doc\examples\MyTestSuite8.h /^ bool tearDownWorld() { printf( "Finishing a test suite\\n" ); return true;}$/;" f class:Fixture1
+tearDownWorld tools\cxxtest\test\TearDownWorldFails.h /^ bool tearDownWorld() { return false; }$/;" f class:Fixture
+tearDownWorld tools\cxxtest\test\TearDownWorldThrows.h /^ bool tearDownWorld() { throw this; }$/;" f class:Fixture
+tearDownWorld tools\cxxtest\test\WorldFixtures.h /^ bool tearDownWorld() { printf( "<\/world>" ); return true; }$/;" f class:PrintingFixture
+teardown_env tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def teardown_env(t, opts):$/;" f
+tee_err tools\cxxtest\cxxtest\XmlFormatter.h /^ teebuffer tee_err;$/;" m class:CxxTest::TeeOutputStreams
+tee_out tools\cxxtest\cxxtest\XmlFormatter.h /^ teebuffer tee_out;$/;" m class:CxxTest::TeeOutputStreams
+teebuffer tools\cxxtest\cxxtest\XmlFormatter.h /^ teebuffer(streambuf_t * buf1, streambuf_t * buf2)$/;" f class:CxxTest::TeeOutputStreams::teebuffer
+teebuffer tools\cxxtest\cxxtest\XmlFormatter.h /^ class teebuffer : public std::basic_streambuf<char>$/;" c class:CxxTest::TeeOutputStreams
+tempfile tools\cxxtest\admin\virtualenv.py /^import tempfile$/;" i
+test tools\cxxtest\cxxtest\StdTestSuite.h /^ static bool test(std::list<X> x, std::list<Y> y, D d)$/;" f struct:CxxTest::delta
+test tools\cxxtest\cxxtest\StdTestSuite.h /^ static bool test(std::vector<X> x, std::vector<Y> y, D d)$/;" f struct:CxxTest::delta
+test tools\cxxtest\cxxtest\TestSuite.h /^ static bool test( X x, Y y )$/;" f struct:CxxTest::differs
+test tools\cxxtest\cxxtest\TestSuite.h /^ static bool test( X x, Y y )$/;" f struct:CxxTest::equals
+test tools\cxxtest\cxxtest\TestSuite.h /^ static bool test( X x, Y y )$/;" f struct:CxxTest::lessThan
+test tools\cxxtest\cxxtest\TestSuite.h /^ static bool test( X x, Y y )$/;" f struct:CxxTest::lessThanEquals
+test tools\cxxtest\cxxtest\TestSuite.h /^ static bool test( X x, Y y, D d )$/;" f struct:CxxTest::delta
+test tools\cxxtest\cxxtest\TestTracker.h /^ const TestDescription &test() const { return *_test; }$/;" f class:CxxTest::TestTracker
+testAddition tests\source\main.h /^ void testAddition(void)$/;" f class:MyTestSuite2
+testAddition tools\cxxtest\doc\examples\BadTestSuite1.h /^ void testAddition(void)$/;" f class:BadTestSuite1
+testAddition tools\cxxtest\doc\examples\MyTestSuite1.h /^ void testAddition(void)$/;" f class:MyTestSuite1
+testAddition tools\cxxtest\doc\examples\MyTestSuite2.h /^ void testAddition(void)$/;" f class:MyTestSuite2
+testAddition tools\cxxtest\doc\examples\MyTestSuite3.h /^ void testAddition(void)$/;" f class:MyTestSuite3
+testAddition tools\cxxtest\doc\examples\MyTestSuite4.h /^ void testAddition(void)$/;" f class:MyTestSuite4
+testAddition tools\cxxtest\sample\SimpleTest.h /^ void testAddition()$/;" f class:SimpleTest
+testAddition tools\cxxtest\test\BadTest.h /^ void testAddition()$/;" f class:BadTest
+testAddition tools\cxxtest\test\InheritedTest.h /^ void testAddition()$/;" f class:BaseTests
+testAnsiPresent tools\cxxtest\build_tools\SCons\test\include_CCFLAGS\src\only_with_ansi.t.h /^ void testAnsiPresent() {$/;" f class:TestAnsi
+testAssert tools\cxxtest\test\GoodSuite.h /^ void testAssert()$/;" f class:GoodSuite
+testAssertDeltaWithSideEffects tools\cxxtest\test\DoubleCall.h /^ void testAssertDeltaWithSideEffects()$/;" f class:DoubleCall
+testAssertDiffersWithSideEffects tools\cxxtest\test\DoubleCall.h /^ void testAssertDiffersWithSideEffects()$/;" f class:DoubleCall
+testAssertEqualsWithSideEffects tools\cxxtest\test\DoubleCall.h /^ void testAssertEqualsWithSideEffects()$/;" f class:DoubleCall
+testAssertFileLonger tools\cxxtest\test\SameFiles.h /^ void testAssertFileLonger()$/;" f class:SameFiles
+testAssertFileLonger tools\cxxtest\test\SameFilesLonger.h /^ void testAssertFileLonger()$/;" f class:SameFiles
+testAssertFileShorter tools\cxxtest\test\SameFiles.h /^ void testAssertFileShorter()$/;" f class:SameFiles
+testAssertFileShorter tools\cxxtest\test\SameFilesLonger.h /^ void testAssertFileShorter()$/;" f class:SameFiles
+testAssertFiles tools\cxxtest\test\SameFiles.h /^ void testAssertFiles()$/;" f class:SameFiles
+testAssertFiles tools\cxxtest\test\SameFilesLonger.h /^ void testAssertFiles()$/;" f class:SameFiles
+testAssertMessage tools\cxxtest\test\GoodSuite.h /^ void testAssertMessage()$/;" f class:GoodSuite
+testAssertMessageSameData tools\cxxtest\test\SameData.h /^ void testAssertMessageSameData()$/;" f class:SameData
+testAssertMessageSameFiles tools\cxxtest\test\SameFiles.h /^ void testAssertMessageSameFiles()$/;" f class:SameFiles
+testAssertMessageSameFiles tools\cxxtest\test\SameFilesLonger.h /^ void testAssertMessageSameFiles()$/;" f class:SameFiles
+testAssertSameData tools\cxxtest\test\SameData.h /^ void testAssertSameData()$/;" f class:SameData
+testAssertThrowsAborts tools\cxxtest\test\DeepAbort.h /^ void testAssertThrowsAborts()$/;" f class:DeepAbort
+testAssertThrowsAnything tools\cxxtest\test\DeepAbort.h /^ void testAssertThrowsAnything()$/;" f class:DeepAbort
+testAssertThrowsNothingAborts tools\cxxtest\test\DeepAbort.h /^ void testAssertThrowsNothingAborts()$/;" f class:DeepAbort
+testAssertThrowsNothingPassesAbort tools\cxxtest\test\DeepAbort.h /^ void testAssertThrowsNothingPassesAbort()$/;" f class:DeepAbort
+testAssertThrowsPassesAbort tools\cxxtest\test\DeepAbort.h /^ void testAssertThrowsPassesAbort()$/;" f class:DeepAbort
+testAssertion tools\cxxtest\sample\ExceptionTest.h /^ void testAssertion( void )$/;" f class:ExceptionTest
+testBigDefaultTraits tools\cxxtest\test\DefaultTraits.h /^ void testBigDefaultTraits()$/;" f class:DefaultTraits
+testBoolTraits tools\cxxtest\test\TraitsTest.h /^ void testBoolTraits()$/;" f class:TraitsTest
+testCharTraits tools\cxxtest\test\TraitsTest.h /^ void testCharTraits()$/;" f class:TraitsTest
+testCompareData tools\cxxtest\doc\examples\MyTestSuite7.h /^ void testCompareData()$/;" f class:MyTestSuite7
+testComparison tools\cxxtest\sample\SimpleTest.h /^ void testComparison()$/;" f class:SimpleTest
+testComparison tools\cxxtest\test\BadTest.h /^ void testComparison()$/;" f class:BadTest
+testComparison tools\cxxtest\test\InheritedTest.h /^ void testComparison()$/;" f class:BaseTests
+testCountsFirstTime tools\cxxtest\doc\examples\MyTestSuite8.h /^ void testCountsFirstTime()$/;" f class:MyTestSuite8
+testCountsFirstTime tools\cxxtest\test\GlobalFixtures.h /^ void testCountsFirstTime()$/;" f class:TestGlobalFixture
+testCountsSecondTime tools\cxxtest\doc\examples\MyTestSuite8.h /^ void testCountsSecondTime()$/;" f class:MyTestSuite8
+testCountsSecondTime tools\cxxtest\test\GlobalFixtures.h /^ void testCountsSecondTime()$/;" f class:TestGlobalFixture
+testCxxTestCanCompileWithoutExceptionHandling tools\cxxtest\test\ForceNoEh.h /^ void testCxxTestCanCompileWithoutExceptionHandling()$/;" f class:ForceNoEh
+testCxxTestCanCompileWithoutExceptionHandling tools\cxxtest\test\NoEh.h /^ void testCxxTestCanCompileWithoutExceptionHandling()$/;" f class:NoEh
+testDelta tools\cxxtest\test\GoodSuite.h /^ void testDelta()$/;" f class:GoodSuite
+testDeltaMessage tools\cxxtest\test\GoodSuite.h /^ void testDeltaMessage()$/;" f class:GoodSuite
+testDescription tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const TestDescription &DummySuiteDescription::testDescription( unsigned ) const { return _test; }$/;" f class:CxxTest::DummySuiteDescription
+testDescription tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const TestDescription &RealSuiteDescription::testDescription( unsigned i ) const$/;" f class:CxxTest::RealSuiteDescription
+testDiffers tools\cxxtest\test\GoodSuite.h /^ void testDiffers()$/;" f class:GoodSuite
+testDiffersMessage tools\cxxtest\test\GoodSuite.h /^ void testDiffersMessage()$/;" f class:GoodSuite
+testEquality tools\cxxtest\sample\SimpleTest.h /^ void testEquality()$/;" f class:SimpleTest
+testEquality tools\cxxtest\test\BadTest.h /^ void testEquality()$/;" f class:BadTest
+testEquality tools\cxxtest\test\InheritedTest.h /^ void testEquality()$/;" f class:BaseTests
+testEquals tools\cxxtest\test\GoodSuite.h /^ void testEquals()$/;" f class:GoodSuite
+testEqualsMessage tools\cxxtest\test\GoodSuite.h /^ void testEqualsMessage()$/;" f class:GoodSuite
+testFailed tools\cxxtest\cxxtest\TestTracker.h /^ bool testFailed() const { return (testFailedAsserts() > 0); }$/;" f class:CxxTest::TestTracker
+testFailedAsserts tools\cxxtest\cxxtest\TestTracker.h /^ unsigned testFailedAsserts() const { return _testFailedAsserts; }$/;" f class:CxxTest::TestTracker
+testFailure tools\cxxtest\cxxtest\XmlFormatter.h /^ std::stringstream& testFailure( const char* file, int line, const char *failureType)$/;" f class:CxxTest::XmlFormatter
+testFailures tools\cxxtest\test\AborterNoThrow.h /^ void testFailures()$/;" f class:AborterNoThrow
+testFloatingPointTraits tools\cxxtest\test\TraitsTest.h /^ void testFloatingPointTraits()$/;" f class:TraitsTest
+testFoo tools\cxxtest\build_tools\SCons\test\globbing_edmundo\hellotest.t.h /^ void testFoo()$/;" f class:helloTestSuite
+testHaveStd tools\cxxtest\test\HaveStd.h /^ void testHaveStd()$/;" f class:HaveStd
+testInt64 tools\cxxtest\test\Int64.h /^ void testInt64()$/;" f class:Int64
+testIntegerTraits tools\cxxtest\test\TraitsTest.h /^ void testIntegerTraits()$/;" f class:TraitsTest
+testLessThan tools\cxxtest\test\GoodSuite.h /^ void testLessThan()$/;" f class:GoodSuite
+testLessThanEquals tools\cxxtest\test\GoodSuite.h /^ void testLessThanEquals()$/;" f class:GoodSuite
+testLessThanEquals tools\cxxtest\test\LessThanEquals.h /^ void testLessThanEquals()$/;" f class:LessThanEquals
+testLessThanEqualsMessage tools\cxxtest\test\GoodSuite.h /^ void testLessThanEqualsMessage()$/;" f class:GoodSuite
+testLessThanMessage tools\cxxtest\test\GoodSuite.h /^ void testLessThanMessage()$/;" f class:GoodSuite
+testLongLong tools\cxxtest\test\LongLong.h /^ void testLongLong()$/;" f class:LongLongTest
+testMessageAssertThrowsAborts tools\cxxtest\test\DeepAbort.h /^ void testMessageAssertThrowsAborts()$/;" f class:DeepAbort
+testMessageAssertThrowsAnything tools\cxxtest\test\DeepAbort.h /^ void testMessageAssertThrowsAnything()$/;" f class:DeepAbort
+testMessageAssertThrowsNothingAborts tools\cxxtest\test\DeepAbort.h /^ void testMessageAssertThrowsNothingAborts()$/;" f class:DeepAbort
+testMessageAssertThrowsNothingPassesAbort tools\cxxtest\test\DeepAbort.h /^ void testMessageAssertThrowsNothingPassesAbort()$/;" f class:DeepAbort
+testMessageAssertThrowsPassesAbort tools\cxxtest\test\DeepAbort.h /^ void testMessageAssertThrowsPassesAbort()$/;" f class:DeepAbort
+testMessageMacros tools\cxxtest\test\Tsm.h /^ void testMessageMacros()$/;" f class:TestMessageMacros
+testMinusInf tools\cxxtest\test\TestNonFinite.h /^ void testMinusInf() {$/;" f class:TestNonFinite
+testMoveOn tools\cxxtest\test\Exceptions.h /^ void testMoveOn()$/;" f class:TestThrowFromTest
+testMultiplication tests\source\main.h /^ void testMultiplication(void)$/;" f class:MyTestSuite2
+testMultiplication tools\cxxtest\doc\examples\MyTestSuite2.h /^ void testMultiplication(void)$/;" f class:MyTestSuite2
+testNaN tools\cxxtest\test\TestNonFinite.h /^ void testNaN() {$/;" f class:TestNonFinite
+testName tools\cxxtest\cxxtest\DummyDescriptions.cpp /^ const char *DummyTestDescription::testName() const { return "<no test>"; }$/;" f class:CxxTest::DummyTestDescription
+testName tools\cxxtest\cxxtest\RealDescriptions.cpp /^ const char *RealTestDescription::testName() const { return _testName; }$/;" f class:CxxTest::RealTestDescription
+testName tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string testName;$/;" m class:CxxTest::TestCaseInfo
+testNothing tools\cxxtest\test\Exceptions.h /^ void testNothing() { TS_FAIL( "Shouldn't get here" ); }$/;" f class:ThrowSetUp
+testNothing tools\cxxtest\test\Exceptions.h /^ void testNothing() {}$/;" f class:ThrowDestroy
+testNothing tools\cxxtest\test\Exceptions.h /^ void testNothing() {}$/;" f class:ThrowTearDown
+testNothing tools\cxxtest\test\Exceptions.h /^ void testNothing()$/;" f class:NullCreate
+testNothing tools\cxxtest\test\Exceptions.h /^ void testNothing()$/;" f class:ThrowCreate
+testOne tools\cxxtest\test\GfSetUpFails.h /^ void testOne()$/;" f class:Suite
+testOne tools\cxxtest\test\GfSetUpThrows.h /^ void testOne()$/;" f class:Suite
+testOne tools\cxxtest\test\GfTearDownFails.h /^ void testOne() {}$/;" f class:Suite
+testOne tools\cxxtest\test\GfTearDownThrows.h /^ void testOne() {}$/;" f class:Suite
+testOne tools\cxxtest\test\SetUpWorldError.h /^ void testOne()$/;" f class:Suite
+testOne tools\cxxtest\test\SetUpWorldFails.h /^ void testOne()$/;" f class:Suite
+testOne tools\cxxtest\test\SetUpWorldThrows.h /^ void testOne()$/;" f class:Suite
+testOne tools\cxxtest\test\TearDownWorldFails.h /^ void testOne() {}$/;" f class:Suite
+testOne tools\cxxtest\test\TearDownWorldThrows.h /^ void testOne() {}$/;" f class:Suite
+testOne tools\cxxtest\test\WorldFixtures.h /^ void testOne() {}$/;" f class:FirstSuite
+testOne tools\cxxtest\test\WorldFixtures.h /^ void testOne() {}$/;" f class:SecondSuite
+testPedanticPresent tools\cxxtest\build_tools\SCons\test\include_CCFLAGS\src\not-with-pedantic.h /^ void testPedanticPresent() {$/;" f class:TestPedantic
+testPedanticPresent tools\cxxtest\build_tools\SCons\test\include_CXXFLAGS\src\not-with-pedantic.h /^ void testPedanticPresent() {$/;" f class:TestPedantic
+testPets tools\cxxtest\sample\TraitsTest.h /^ void testPets()$/;" f class:TestFunky
+testPlusInf tools\cxxtest\test\TestNonFinite.h /^ void testPlusInf() {$/;" f class:TestNonFinite
+testPredicate tools\cxxtest\test\Relation.h /^ void testPredicate()$/;" f class:Relation
+testRelation tools\cxxtest\test\Relation.h /^ void testRelation()$/;" f class:Relation
+testSafeAssertMessageSameData tools\cxxtest\test\SameData.h /^ void testSafeAssertMessageSameData()$/;" f class:SameData
+testSafeAssertMessageSameFiles tools\cxxtest\test\SameFiles.h /^ void testSafeAssertMessageSameFiles()$/;" f class:SameFiles
+testSafeAssertMessageSameFiles tools\cxxtest\test\SameFilesLonger.h /^ void testSafeAssertMessageSameFiles()$/;" f class:SameFiles
+testSafeAssertSameData tools\cxxtest\test\SameData.h /^ void testSafeAssertSameData()$/;" f class:SameData
+testSafeAssertSameFiles tools\cxxtest\test\SameFiles.h /^ void testSafeAssertSameFiles()$/;" f class:SameFiles
+testSafeAssertSameFiles tools\cxxtest\test\SameFilesLonger.h /^ void testSafeAssertSameFiles()$/;" f class:SameFiles
+testSine tools\cxxtest\sample\DeltaTest.h /^ void testSine()$/;" f class:DeltaTest
+testSmallDefaultTraits tools\cxxtest\test\DefaultTraits.h /^ void testSmallDefaultTraits()$/;" f class:DefaultTraits
+testSomething tools\cxxtest\test\Part1.h /^ void testSomething()$/;" f class:Part1
+testSomething tools\cxxtest\test\Part2.h /^ void testSomething()$/;" f class:Part2
+testStdStringTraits tools\cxxtest\test\TraitsTest.h /^ void testStdStringTraits()$/;" f class:TraitsTest
+testStringTraits tools\cxxtest\test\TraitsTest.h /^ void testStringTraits()$/;" f class:TraitsTest
+testTheWorldIsCrazy tools\cxxtest\sample\SimpleTest.h /^ void testTheWorldIsCrazy()$/;" f class:SimpleTest
+testTheWorldIsCrazy tools\cxxtest\test\BadTest.h /^ void testTheWorldIsCrazy()$/;" f class:BadTest
+testTheWorldIsCrazy tools\cxxtest\test\InheritedTest.h /^ void testTheWorldIsCrazy()$/;" f class:BaseTests
+testThrowNoStd tools\cxxtest\test\ThrowNoStd.h /^ void testThrowNoStd()$/;" f class:ThrowNoStd
+testThrowSomething tools\cxxtest\test\Exceptions.h /^ void testThrowSomething()$/;" f class:TestThrowFromTest
+testThrows tools\cxxtest\test\GoodSuite.h /^ void testThrows()$/;" f class:GoodSuite
+testThrowsAnything tools\cxxtest\test\GoodSuite.h /^ void testThrowsAnything()$/;" f class:GoodSuite
+testThrowsAnythingMessage tools\cxxtest\test\GoodSuite.h /^ void testThrowsAnythingMessage()$/;" f class:GoodSuite
+testThrowsMessage tools\cxxtest\test\GoodSuite.h /^ void testThrowsMessage()$/;" f class:GoodSuite
+testThrowsNothing tools\cxxtest\test\GoodSuite.h /^ void testThrowsNothing()$/;" f class:GoodSuite
+testThrowsNothingMessage tools\cxxtest\test\GoodSuite.h /^ void testThrowsNothingMessage()$/;" f class:GoodSuite
+testTraits tools\cxxtest\test\IncludeTest.h /^ void testTraits()$/;" f class:IncludesTest
+testTwo tools\cxxtest\test\GfTearDownFails.h /^ void testTwo() { TS_WARN( "Testing should go on!" ); }$/;" f class:Suite
+testTwo tools\cxxtest\test\GfTearDownThrows.h /^ void testTwo() { TS_WARN( "Testing should go on!" ); }$/;" f class:Suite
+testTwo tools\cxxtest\test\SetUpWorldError.h /^ void testTwo()$/;" f class:Suite
+testTwo tools\cxxtest\test\WorldFixtures.h /^ void testTwo() {}$/;" f class:FirstSuite
+testTwo tools\cxxtest\test\WorldFixtures.h /^ void testTwo() {}$/;" f class:SecondSuite
+testUserTraits tools\cxxtest\test\UserTraits.h /^ void testUserTraits()$/;" f class:TestUserTraits
+testValues tools\cxxtest\sample\MessageTest.h /^ void testValues()$/;" f class:MessageTest
+testWideStringTraits tools\cxxtest\test\WideCharTest.h /^ void testWideStringTraits()$/;" f class:WideCharTest
+test_Abort_on_fail_in_this_test tools\cxxtest\test\DynamicAbort.h /^ void test_Abort_on_fail_in_this_test()$/;" f class:DynamicAbort
+test_Cannot_go_back tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Cannot_go_back()$/;" f class:GreenYellowRed
+test_Cannot_go_back_to_green tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Cannot_go_back_to_green()$/;" f class:GreenYellowRed
+test_Cannot_go_back_to_yellow tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Cannot_go_back_to_yellow()$/;" f class:GreenYellowRed
+test_Complex tools\cxxtest\test\StlTraits.h /^ void test_Complex()$/;" f class:StlTraits
+test_Deque tools\cxxtest\test\StlTraits.h /^ void test_Deque()$/;" f class:StlTraits
+test_Dont_abort_in_this_test tools\cxxtest\test\DynamicAbort.h /^ void test_Dont_abort_in_this_test()$/;" f class:DynamicAbort
+test_Dont_abort_in_this_test tools\cxxtest\test\DynamicAbort.h /^ void test_Dont_abort_in_this_test()$/;" f class:SetUpWorksAllTests
+test_Dont_abort_in_this_test_either tools\cxxtest\test\DynamicAbort.h /^ void test_Dont_abort_in_this_test_either()$/;" f class:SetUpWorksAllTests
+test_Enum_traits tools\cxxtest\doc\examples\MyTestSuite9.h /^ void test_Enum_traits()$/;" f class:EnumTraits
+test_Enum_traits tools\cxxtest\sample\EnumTraits.h /^ void test_Enum_traits()$/;" f class:EnumTraits
+test_Failure tools\cxxtest\sample\SimpleTest.h /^ void test_Failure()$/;" f class:SimpleTest
+test_Failure tools\cxxtest\test\BadTest.h /^ void test_Failure()$/;" f class:BadTest
+test_Failure tools\cxxtest\test\InheritedTest.h /^ void test_Failure()$/;" f class:BaseTests
+test_Finally_red tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Finally_red()$/;" f class:GreenYellowRed
+test_Green_again tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Green_again()$/;" f class:GreenYellowRed
+test_Lengths tools\cxxtest\test\Factor.h /^ void test_Lengths()$/;" f class:Factor
+test_List tools\cxxtest\test\StlTraits.h /^ void test_List()$/;" f class:StlTraits
+test_Map tools\cxxtest\test\StlTraits.h /^ void test_Map()$/;" f class:StlTraits
+test_Max_size_from_define tools\cxxtest\test\DynamicMax.h /^ void test_Max_size_from_define()$/;" f class:DynamicMax
+test_Mock tools\cxxtest\test\MockTest.h /^ void test_Mock()$/;" f class:MockTest
+test_Mock_traits tools\cxxtest\test\MockTest.h /^ void test_Mock_traits()$/;" f class:MockTest
+test_More_complex_mock tools\cxxtest\test\MockTest.h /^ void test_More_complex_mock()$/;" f class:MockTest
+test_More_complex_supply tools\cxxtest\test\MockTest.h /^ void test_More_complex_supply()$/;" f class:MockTest
+test_MultiMap tools\cxxtest\test\StlTraits.h /^ void test_MultiMap()$/;" f class:StlTraits
+test_MultiSet tools\cxxtest\test\StlTraits.h /^ void test_MultiSet()$/;" f class:StlTraits
+test_Now_yellow tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Now_yellow()$/;" f class:GreenYellowRed
+test_Override tools\cxxtest\test\MockTest.h /^ void test_Override()$/;" f class:MockTest
+test_Override_in_this_test tools\cxxtest\test\DynamicAbort.h /^ void test_Override_in_this_test()$/;" f class:SetUpWorksAllTests
+test_Pair tools\cxxtest\test\StlTraits.h /^ void test_Pair()$/;" f class:StlTraits
+test_Randomize_uses_time tools\cxxtest\sample\mock\TestDice.h /^ void test_Randomize_uses_time()$/;" f class:TestDice
+test_Real tools\cxxtest\test\MockTest.h /^ void test_Real()$/;" f class:MockTest
+test_Revert_to_abort tools\cxxtest\test\DynamicAbort.h /^ void test_Revert_to_abort()$/;" f class:DynamicAbort
+test_Revert_to_max_size_from_define tools\cxxtest\test\DynamicMax.h /^ void test_Revert_to_max_size_from_define()$/;" f class:DynamicMax
+test_Roll tools\cxxtest\sample\mock\TestDice.h /^ void test_Roll()$/;" f class:TestDice
+test_Set tools\cxxtest\test\StlTraits.h /^ void test_Set()$/;" f class:StlTraits
+test_Set_max_size tools\cxxtest\test\DynamicMax.h /^ void test_Set_max_size()$/;" f class:DynamicMax
+test_Set_max_size_to_zero__dumps_all tools\cxxtest\test\DynamicMax.h /^ void test_Set_max_size_to_zero__dumps_all()$/;" f class:DynamicMax
+test_Some_numbers tools\cxxtest\test\Factor.h /^ void test_Some_numbers()$/;" f class:Factor
+test_Something tools\cxxtest\test\Comments.h /^ void test_Something()$/;" f class:Comments
+test_Something tools\cxxtest\test\Comments2.h /^ void test_Something()$/;" f class:Comments
+test_Start_green tools\cxxtest\sample\gui\GreenYellowRed.h /^ void test_Start_green()$/;" f class:GreenYellowRed
+test_Supply tools\cxxtest\test\MockTest.h /^ void test_Supply()$/;" f class:MockTest
+test_TS_ASSERT_SAME_DATA_passed_zero tools\cxxtest\test\SameZero.h /^ void test_TS_ASSERT_SAME_DATA_passed_zero()$/;" f class:SameZero
+test_TS_ASSERT_THROWS_ASSERT tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_ASSERT()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_DELTA tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_DELTA()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_DIFFERS tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_DIFFERS()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_EQUALS tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_EQUALS()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_LESS_THAN tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_LESS_THAN()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_LESS_THAN_EQUALS tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_LESS_THAN_EQUALS()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_PREDICATE tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_PREDICATE()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_RELATION tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_RELATION()$/;" f class:ThrowsAssert
+test_TS_ASSERT_THROWS_SAME_DATA tools\cxxtest\test\ThrowsAssert.h /^ void test_TS_ASSERT_THROWS_SAME_DATA()$/;" f class:ThrowsAssert
+test_TS_WARN_macro tools\cxxtest\sample\SimpleTest.h /^ void test_TS_WARN_macro()$/;" f class:SimpleTest
+test_TS_WARN_macro tools\cxxtest\test\BadTest.h /^ void test_TS_WARN_macro()$/;" f class:BadTest
+test_TS_WARN_macro tools\cxxtest\test\InheritedTest.h /^ void test_TS_WARN_macro()$/;" f class:BaseTests
+test_Temporary_override_of_one_mock_function tools\cxxtest\sample\mock\TestDice.h /^ void test_Temporary_override_of_one_mock_function()$/;" f class:TestDice
+test_Unimplemented tools\cxxtest\test\MockTest.h /^ void test_Unimplemented()$/;" f class:MockTest
+test_Unimplemented_supply tools\cxxtest\test\MockTest.h /^ void test_Unimplemented_supply()$/;" f class:MockTest
+test_Use_12_in_this_test tools\cxxtest\test\DynamicMax.h /^ void test_Use_12_in_this_test()$/;" f class:SetUpAffectsAllTests
+test_Use_12_in_this_test_too tools\cxxtest\test\DynamicMax.h /^ void test_Use_12_in_this_test_too()$/;" f class:SetUpAffectsAllTests
+test_Vector tools\cxxtest\test\StlTraits.h /^ void test_Vector()$/;" f class:StlTraits
+test_activate_all tools\cxxtest\test\test_cxxtest.py /^ def test_activate_all(self):$/;" m class:BaseTestCase
+test_assert tools\cxxtest\doc\examples\Assertions.h /^ void test_assert(void)$/;" f class:Test
+test_assert_delta tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_delta(void)$/;" f class:Test
+test_assert_differs tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_differs(void)$/;" f class:Test
+test_assert_equals tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_equals(void)$/;" f class:Test
+test_assert_less_than tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_less_than(void)$/;" f class:Test
+test_assert_less_than_equals tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_less_than_equals(void)$/;" f class:Test
+test_assert_predicate tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_predicate(void)$/;" f class:Test
+test_assert_relation tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_relation(void)$/;" f class:Test
+test_assert_same_data tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_same_data(void)$/;" f class:Test
+test_assert_throws tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_throws(void)$/;" f class:Test
+test_assert_throws_anything tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_throws_anything(void)$/;" f class:Test
+test_assert_throws_assert tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_throws_assert(void)$/;" f class:Test
+test_assert_throws_equals tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_throws_equals(void)$/;" f class:Test
+test_assert_throws_nothing tools\cxxtest\doc\examples\Assertions.h /^ void test_assert_throws_nothing(void)$/;" f class:Test
+test_attach tools\cxxtest\test\unit\LinkedList_test.t.h /^ void test_attach()$/;" f class:LinkedList_test
+test_bad1 tools\cxxtest\test\test_cxxtest.py /^ def test_bad1(self):$/;" m class:BaseTestCase
+test_capacity_gte_size tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_capacity_gte_size() {$/;" f class:stack_test
+test_comments tools\cxxtest\test\test_cxxtest.py /^ def test_comments(self):$/;" m class:BaseTestCase
+test_comments2 tools\cxxtest\test\test_cxxtest.py /^ def test_comments2(self):$/;" m class:BaseTestCase
+test_cpp_template1 tools\cxxtest\test\test_cxxtest.py /^ def test_cpp_template1(self):$/;" m class:BaseTestCase
+test_create_stack tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_create_stack() {$/;" f class:stack_test
+test_default_abort tools\cxxtest\test\test_cxxtest.py /^ def test_default_abort(self):$/;" m class:BaseTestCase
+test_default_no_abort tools\cxxtest\test\test_cxxtest.py /^ def test_default_no_abort(self):$/;" m class:BaseTestCase
+test_detach tools\cxxtest\test\unit\LinkedList_test.t.h /^ void test_detach()$/;" f class:LinkedList_test
+test_eq tools\cxxtest\doc\examples\MyTestSuite10.h /^ void test_eq()$/;" f class:MyTestSuite10
+test_eq tools\cxxtest\doc\examples\MyTestSuite11.h /^ void test_eq()$/;" f class:MyTestSuite11
+test_exceptions tools\cxxtest\test\test_cxxtest.py /^ def test_exceptions(self):$/;" m class:BaseTestCase
+test_exceptions_plus_abort tools\cxxtest\test\test_cxxtest.py /^ def test_exceptions_plus_abort(self):$/;" m class:BaseTestCase
+test_exceptions_tpl tools\cxxtest\test\test_cxxtest.py /^ def test_exceptions_tpl(self):$/;" m class:BaseTestCase
+test_fail tools\cxxtest\doc\examples\Assertions.h /^ void test_fail(void)$/;" f class:Test
+test_foo tools\cxxtest\build_tools\SCons\test\empty_source_list\test_bar.t.h /^ void test_foo() {$/;" f class:TestBar
+test_foo tools\cxxtest\build_tools\SCons\test\empty_source_list\test_foo.t.h /^ void test_foo() {$/;" f class:TestFoo
+test_foo tools\cxxtest\build_tools\SCons\test\globbing\src\test_bar.t.h /^ void test_foo() {$/;" f class:TestBar
+test_foo tools\cxxtest\build_tools\SCons\test\globbing\src\test_foo.t.h /^ void test_foo() {$/;" f class:TestFoo
+test_foo tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_bar.t.h /^ void test_foo() {$/;" f class:TestBar
+test_foo tools\cxxtest\build_tools\SCons\test\multifile_tests\src\test_foo.t.h /^ void test_foo() {$/;" f class:TestFoo
+test_foo tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_bar.t.h /^ void test_foo() {$/;" f class:TestBar
+test_foo tools\cxxtest\build_tools\SCons\test\recursive_sources\src\test_foo.t.h /^ void test_foo() {$/;" f class:TestFoo
+test_force_no_eh tools\cxxtest\test\test_cxxtest.py /^ def test_force_no_eh(self):$/;" m class:BaseTestCase
+test_generateRandomNumber tools\cxxtest\doc\examples\MockTestSuite.h /^ void test_generateRandomNumber()$/;" f class:TestRandom
+test_gf_su_fails tools\cxxtest\test\test_cxxtest.py /^ def test_gf_su_fails(self):$/;" m class:BaseTestCase
+test_gf_su_throws tools\cxxtest\test\test_cxxtest.py /^ def test_gf_su_throws(self):$/;" m class:BaseTestCase
+test_gf_suw_error tools\cxxtest\test\test_cxxtest.py /^ def test_gf_suw_error(self):$/;" m class:BaseTestCase
+test_gf_suw_fails tools\cxxtest\test\test_cxxtest.py /^ def test_gf_suw_fails(self):$/;" m class:BaseTestCase
+test_gf_suw_throws tools\cxxtest\test\test_cxxtest.py /^ def test_gf_suw_throws(self):$/;" m class:BaseTestCase
+test_gf_td_fails tools\cxxtest\test\test_cxxtest.py /^ def test_gf_td_fails(self):$/;" m class:BaseTestCase
+test_gf_td_throws tools\cxxtest\test\test_cxxtest.py /^ def test_gf_td_throws(self):$/;" m class:BaseTestCase
+test_gf_tdw_fails tools\cxxtest\test\test_cxxtest.py /^ def test_gf_tdw_fails(self):$/;" m class:BaseTestCase
+test_gf_tdw_throws tools\cxxtest\test\test_cxxtest.py /^ def test_gf_tdw_throws(self):$/;" m class:BaseTestCase
+test_global_fixtures tools\cxxtest\test\test_cxxtest.py /^ def test_global_fixtures(self):$/;" m class:BaseTestCase
+test_gui tools\cxxtest\test\test_cxxtest.py /^ def test_gui(self):$/;" m class:BaseTestCase
+test_gui_runner tools\cxxtest\test\test_cxxtest.py /^ def test_gui_runner(self):$/;" m class:BaseTestCase
+test_have_std tools\cxxtest\test\test_cxxtest.py /^ def test_have_std(self):$/;" m class:BaseTestCase
+test_have_std_tpl tools\cxxtest\test\test_cxxtest.py /^ def test_have_std_tpl(self):$/;" m class:BaseTestCase
+test_i_need_me_exists tools\cxxtest\build_tools\SCons\test\need_cpppath\src\cpppath.t.h /^ void test_i_need_me_exists() {$/;" f class:CppPathTest
+test_i_need_me_exists tools\cxxtest\build_tools\SCons\test\string_cpppath\src\cpppath.t.h /^ void test_i_need_me_exists() {$/;" f class:CppPathTest
+test_i_need_me_exists tools\cxxtest\build_tools\SCons\test\target_syntax\src\cpppath.t.h /^ void test_i_need_me_exists() {$/;" f class:CppPathTest
+test_i_will_fail tools\cxxtest\build_tools\SCons\test\printer_propagation\src\failtest.t.h /^ void test_i_will_fail() {$/;" f class:CppPathTest
+test_include tools\cxxtest\test\test_cxxtest.py /^ def test_include(self):$/;" m class:BaseTestCase
+test_infinite_values tools\cxxtest\test\test_cxxtest.py /^ def test_infinite_values(self):$/;" m class:BaseTestCase
+test_inheritance tools\cxxtest\test\test_cxxtest.py /^ def test_inheritance(self):$/;" m class:BaseTestCase
+test_initial_capacity_is_positive tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_initial_capacity_is_positive() {$/;" f class:stack_test
+test_initialize tools\cxxtest\test\unit\LinkedList_test.t.h /^ void test_initialize()$/;" f class:LinkedList_test
+test_insert tools\cxxtest\test\CppTemplateTest.h /^ void test_insert()$/;" f class:Tests
+test_insert tools\cxxtest\test\SimpleInheritedTest.h /^ void test_insert()$/;" f class:Tests
+test_insert tools\cxxtest\test\SimpleInheritedTest2.h /^ void test_insert()$/;" f class:Tests
+test_int64 tools\cxxtest\test\test_cxxtest.py /^ def test_int64(self):$/;" m class:BaseTestCase
+test_le tools\cxxtest\doc\examples\MyTestSuite10.h /^ void test_le()$/;" f class:MyTestSuite10
+test_le tools\cxxtest\doc\examples\MyTestSuite11.h /^ void test_le()$/;" f class:MyTestSuite11
+test_longlong tools\cxxtest\test\test_cxxtest.py /^ def test_longlong(self):$/;" m class:BaseTestCase
+test_max_dump_size tools\cxxtest\test\test_cxxtest.py /^ def test_max_dump_size(self):$/;" m class:BaseTestCase
+test_memcpy tools\cxxtest\doc\examples\MyTestSuite5.h /^ void test_memcpy()$/;" f class:MyTestSuite5
+test_missing_input tools\cxxtest\test\test_cxxtest.py /^ def test_missing_input(self):$/;" m class:BaseTestCase
+test_missing_template tools\cxxtest\test\test_cxxtest.py /^ def test_missing_template(self):$/;" m class:BaseTestCase
+test_new_stack_is_empty tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_new_stack_is_empty() {$/;" f class:stack_test
+test_no_errors tools\cxxtest\test\test_cxxtest.py /^ def test_no_errors(self):$/;" m class:BaseTestCase
+test_no_exceptions tools\cxxtest\test\test_cxxtest.py /^ def test_no_exceptions(self):$/;" m class:BaseTestCase
+test_no_static_init tools\cxxtest\test\test_cxxtest.py /^ def test_no_static_init(self):$/;" m class:BaseTestCase
+test_no_tests tools\cxxtest\test\test_cxxtest.py /^ def test_no_tests(self):$/;" m class:BaseTestCase
+test_normal_behavior tools\cxxtest\test\test_cxxtest.py /^ def test_normal_behavior(self):$/;" m class:BaseTestCase
+test_normal_behavior_xunit tools\cxxtest\test\test_cxxtest.py /^ def test_normal_behavior_xunit(self):$/;" m class:BaseTestCase
+test_normal_plus_abort tools\cxxtest\test\test_cxxtest.py /^ def test_normal_plus_abort(self):$/;" m class:BaseTestCase
+test_nothing tools\cxxtest\doc\examples\MyTestSuite6.h /^ void test_nothing()$/;" f class:MyTestSuite6
+test_nothing tools\cxxtest\sample\CreatedTest.h /^ void test_nothing()$/;" f class:CreatedTest
+test_one_push_add_one_to_size tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_one_push_add_one_to_size() {$/;" f class:stack_test
+test_only_suite tools\cxxtest\test\test_cxxtest.py /^ def test_only_suite(self):$/;" m class:BaseTestCase
+test_only_test tools\cxxtest\test\test_cxxtest.py /^ def test_only_test(self):$/;" m class:BaseTestCase
+test_paren_printer tools\cxxtest\test\test_cxxtest.py /^ def test_paren_printer(self):$/;" m class:BaseTestCase
+test_peak_after_push tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_peak_after_push() {$/;" f class:stack_test
+test_peak_on_empty tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_peak_on_empty() {$/;" f class:stack_test
+test_pop_on_empty tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_pop_on_empty() {$/;" f class:stack_test
+test_preamble tools\cxxtest\test\test_cxxtest.py /^ def test_preamble(self):$/;" m class:BaseTestCase
+test_push_pop_doesnt_change_size tools\cxxtest\sample\SCons\tests\stack_test.h /^ void test_push_pop_doesnt_change_size() {$/;" f class:stack_test
+test_qt_gui tools\cxxtest\test\test_cxxtest.py /^ def test_qt_gui(self):$/;" m class:BaseTestCase
+test_re tools\cxxtest\python\cxxtest\cxxtest_parser.py /^test_re = re.compile( r'^([^\/]|\/[^\/])*\\bvoid\\s+([Tt]est\\w+)\\s*\\(\\s*(void)?\\s*\\)' )$/;" v
+test_re tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^test_re = re.compile( r'^([^\/]|\/[^\/])*\\bvoid\\s+([Tt]est\\w+)\\s*\\(\\s*(void)?\\s*\\)' )$/;" v
+test_root_or_part tools\cxxtest\test\test_cxxtest.py /^ def test_root_or_part(self):$/;" m class:BaseTestCase
+test_root_plus_part tools\cxxtest\test\test_cxxtest.py /^ def test_root_plus_part(self):$/;" m class:BaseTestCase
+test_samples_file tools\cxxtest\test\test_cxxtest.py /^ def test_samples_file(self):$/;" m class:BaseTestCase
+test_simple_inheritance tools\cxxtest\test\test_cxxtest.py /^ def test_simple_inheritance(self):$/;" m class:BaseTestCase
+test_simple_inheritance2 tools\cxxtest\test\test_cxxtest.py /^ def test_simple_inheritance2(self):$/;" m class:BaseTestCase
+test_size tools\cxxtest\test\CppTemplateTest.h /^ void test_size()$/;" f class:Tests
+test_size tools\cxxtest\test\SimpleInheritedTest.h /^ void test_size()$/;" f class:Tests
+test_size tools\cxxtest\test\SimpleInheritedTest2.h /^ void test_size()$/;" f class:Tests
+test_stdio_printer tools\cxxtest\test\test_cxxtest.py /^ def test_stdio_printer(self):$/;" m class:BaseTestCase
+test_stl_traits tools\cxxtest\test\test_cxxtest.py /^ def test_stl_traits(self):$/;" m class:BaseTestCase
+test_strcpy tools\cxxtest\doc\examples\MyTestSuite5.h /^ void test_strcpy()$/;" f class:MyTestSuite5
+test_strcpy tools\cxxtest\sample\FixtureTest.h /^ void test_strcpy()$/;" f class:FixtureTest
+test_throw_wo_std tools\cxxtest\test\test_cxxtest.py /^ def test_throw_wo_std(self):$/;" m class:BaseTestCase
+test_trace tools\cxxtest\doc\examples\Assertions.h /^ void test_trace(void)$/;" f class:Test
+test_user_traits tools\cxxtest\test\test_cxxtest.py /^ def test_user_traits(self):$/;" m class:BaseTestCase
+test_warn tools\cxxtest\doc\examples\Assertions.h /^ void test_warn(void)$/;" f class:Test
+test_wide_char tools\cxxtest\test\test_cxxtest.py /^ def test_wide_char(self):$/;" m class:BaseTestCase
+test_wildcard tools\cxxtest\test\test_cxxtest.py /^ def test_wildcard(self):$/;" m class:BaseTestCase
+test_win32_gui tools\cxxtest\test\test_cxxtest.py /^ def test_win32_gui(self):$/;" m class:BaseTestCase
+test_win32_unicode tools\cxxtest\test\test_cxxtest.py /^ def test_win32_unicode(self):$/;" m class:BaseTestCase
+test_x11_gui tools\cxxtest\test\test_cxxtest.py /^ def test_x11_gui(self):$/;" m class:BaseTestCase
+test_yn_runner tools\cxxtest\test\test_cxxtest.py /^ def test_yn_runner(self):$/;" m class:BaseTestCase
+testcase tools\cxxtest\cxxtest\XmlFormatter.h /^ std::list<TestCaseInfo>::iterator testcase;$/;" m class:CxxTest::XmlFormatter
+testsuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^testsuite = '(?:(?:::)?\\s*CxxTest\\s*::\\s*)?TestSuite'$/;" v
+testsuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^testsuite = '(?:(?:::)?\\s*CxxTest\\s*::\\s*)?TestSuite'$/;" v
+thisSuiteHasNoTests tools\cxxtest\test\EmptySuite.h /^ void thisSuiteHasNoTests() $/;" f class:EmptySuite
+throwInt tools\cxxtest\test\Relation.h /^ int throwInt( int i )$/;" f class:Relation
+throwInteger tools\cxxtest\test\Tsm.h /^ void throwInteger( int i )$/;" f class:TestMessageMacros
+throwNothing tools\cxxtest\test\GoodSuite.h /^ void throwNothing()$/;" f class:GoodSuite
+throwNothing tools\cxxtest\test\Part1.h /^ void throwNothing()$/;" f class:Part1
+throwNothing tools\cxxtest\test\Part2.h /^ void throwNothing()$/;" f class:Part2
+throwNothing tools\cxxtest\test\Tsm.h /^ void throwNothing()$/;" f class:TestMessageMacros
+throwSomething tools\cxxtest\test\DeepAbort.h /^ void throwSomething()$/;" f class:DeepAbort
+throwThis tools\cxxtest\sample\ExceptionTest.h /^ int throwThis( int i )$/;" f class:ExceptionTest
+throws_nothing tools\cxxtest\doc\examples\Assertions.h /^ void throws_nothing(void)$/;" f class:Test
+throws_runtime_error tools\cxxtest\doc\examples\Assertions.h /^ void throws_runtime_error(void)$/;" f class:Test
+throws_value tools\cxxtest\doc\examples\Assertions.h /^ void throws_value(void)$/;" f class:Test
+time tools\cxxtest\doc\examples\MockTestSuite.h /^ time_t time( time_t * ) { return counter++; }$/;" f class:MockObject
+time tools\cxxtest\sample\mock\MockStdlib.h /^ time_t time( time_t *t )$/;" f class:MockStdlib
+to_s tools\rake_utils\artifact.rb /^ def to_s$/;" f class:Artifact
+tocEntries tools\cxxtest\doc\guide.html /^ function tocEntries(el, toclevels) {$/;" f
+tokens tools\cxxtest\python\cxxtest\cxx_parser.py /^tokens = [$/;" v
+tokens tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^tokens = [$/;" v
+tool_stdout tools\cxxtest\build_tools\SCons\test\eprouvette.py /^tool_stdout = PIPE$/;" v
+top tools\cxxtest\test\fake\windows.h /^ LONG left, right, top, bottom;$/;" m struct:RECT
+totalTests tools\cxxtest\cxxtest\ErrorFormatter.h /^ static void totalTests( OutputStream &o )$/;" f class:CxxTest::ErrorFormatter
+totalTests tools\cxxtest\cxxtest\XmlFormatter.h /^ static void totalTests( OutputStream &o )$/;" f class:CxxTest::XmlFormatter
+totaltime tools\cxxtest\cxxtest\XmlFormatter.h /^ double totaltime;$/;" m class:CxxTest::XmlFormatter
+trace tools\cxxtest\cxxtest\ErrorFormatter.h /^ void trace( const char *file, int line, const char *expression )$/;" f class:CxxTest::ErrorFormatter
+trace tools\cxxtest\cxxtest\TeeListener.h /^ void trace( const char *file, int line, const char *expression )$/;" f class:CxxTest::TeeListener
+trace tools\cxxtest\cxxtest\TestListener.h /^ virtual void trace( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+trace tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::trace( const char *file, int line, const char *expression )$/;" f class:CxxTest::TestTracker
+trace tools\cxxtest\cxxtest\XmlFormatter.h /^ void trace( const char* \/*file*\/, int line, const char *expression )$/;" f class:CxxTest::XmlFormatter
+tracker tools\cxxtest\cxxtest\TestTracker.cpp /^ TestTracker & TestTracker::tracker()$/;" f class:CxxTest::TestTracker
+tracker tools\cxxtest\cxxtest\TestTracker.h /^ inline TestTracker &tracker() { return TestTracker::tracker(); }$/;" f namespace:CxxTest
+traits tools\cxxtest\cxxtest\ValueTraits.h /^ inline ValueTraits<T> traits( T t )$/;" f namespace:CxxTest
+two tools\cxxtest\test\MockTest.h /^static void two( int *p ) { *p = 2; }$/;" f
+type tools\cxxtest\build_tools\SCons\test\default_env\TestDef.py /^type = 'scons'$/;" v
+unittest tools\cxxtest\doc\examples\test_examples.py /^import pyutilib.th as unittest$/;" i
+unittest tools\cxxtest\test\test_cxxtest.py /^ import unittest$/;" i
+unittest tools\cxxtest\test\test_cxxtest.py /^ import unittest2 as unittest$/;" i
+unittest tools\cxxtest\test\test_doc.py /^ import pyutilib.th as unittest$/;" i
+updateTime tools\cxxtest\cxxtest\Win32Gui.h /^ void updateTime()$/;" f class:CxxTest::Win32Gui
+update_defaults tools\cxxtest\admin\virtualenv.py /^ def update_defaults(self, defaults):$/;" m class:ConfigOptionParser
+update_element tools\cxxtest\cxxtest\XmlFormatter.h /^ element_t update_element(const std::string& name)$/;" f class:CxxTest::TestCaseInfo
+url tools\cxxtest\python\setup.py /^ url = cxxtest.__url__,$/;" v
+usage tools\cxxtest\sample\Makefile.PL /^sub usage() {$/;" s
+useDefaultFont tools\cxxtest\cxxtest\X11Gui.h /^ void useDefaultFont()$/;" f class:CxxTest::X11Gui
+user_dir tools\cxxtest\admin\virtualenv.py /^ user_dir = os.environ.get('APPDATA', user_dir) # Use %APPDATA% for roaming$/;" v
+user_dir tools\cxxtest\admin\virtualenv.py /^user_dir = os.path.expanduser('~')$/;" v
+vals tools\cxxtest\sample\SCons\include\stack.h /^ int* vals;$/;" m struct:stack_t
+value tools\cxxtest\cxxtest\XmlFormatter.h /^ std::stringstream value;$/;" m class:CxxTest::ElementInfo
+value tools\cxxtest\doc\examples\MyClass.h /^ int value;$/;" m class:MyClass
+value tools\cxxtest\doc\examples\TMyClass.h /^ T value;$/;" m class:TMyClass
+value tools\cxxtest\test\MockTest.h /^ int value;$/;" m class:Opaque
+verifySuite tools\cxxtest\python\cxxtest\cxxtest_parser.py /^def verifySuite(suite):$/;" f
+verifySuite tools\cxxtest\python\python3\cxxtest\cxxtest_parser.py /^def verifySuite(suite):$/;" f
+version tools\cxxtest\python\setup.py /^ version=cxxtest.__version__,$/;" v
+virtualenv tools\cxxtest\admin\virtualenv.py /^ import virtualenv$/;" i
+virtualenv_version tools\cxxtest\admin\virtualenv.py /^virtualenv_version = "1.7"$/;" v
+w32Flags tools\cxxtest\test\test_cxxtest.py /^ w32Flags='-Ifake'$/;" v class:TestCL
+w32Flags tools\cxxtest\test\test_cxxtest.py /^ w32Flags='-Ifake'$/;" v class:TestClang
+w32Flags tools\cxxtest\test\test_cxxtest.py /^ w32Flags='-Ifake'$/;" v class:TestCpp
+w32Flags tools\cxxtest\test\test_cxxtest.py /^ w32Flags='-Ifake'$/;" v class:TestGpp
+wait tools\cxxtest\sample\gui\GreenYellowRed.h /^ void wait()$/;" f class:GreenYellowRed
+warn tools\cxxtest\admin\virtualenv.py /^ def warn(self, msg, *args, **kw):$/;" m class:Logger
+warn tools\cxxtest\build_tools\SCons\test\eprouvette.py /^def warn(msg):$/;" f
+warning tools\cxxtest\cxxtest\ErrorFormatter.h /^ void warning( const char *file, int line, const char *expression )$/;" f class:CxxTest::ErrorFormatter
+warning tools\cxxtest\cxxtest\Gui.h /^ void warning( const char * \/*file*\/, int \/*line*\/, const char * \/*expression*\/ )$/;" f class:CxxTest::GuiListener
+warning tools\cxxtest\cxxtest\TeeListener.h /^ void warning( const char *file, int line, const char *expression )$/;" f class:CxxTest::TeeListener
+warning tools\cxxtest\cxxtest\TestListener.h /^ virtual void warning( const char * \/*file*\/, int \/*line*\/,$/;" f class:CxxTest::TestListener
+warning tools\cxxtest\cxxtest\TestTracker.cpp /^ void TestTracker::warning( const char *file, int line, const char *expression )$/;" f class:CxxTest::TestTracker
+warning tools\cxxtest\cxxtest\XmlFormatter.h /^ void warning( const char* \/*file*\/, int line, const char *expression )$/;" f class:CxxTest::XmlFormatter
+warnings tools\cxxtest\cxxtest\TestTracker.h /^ unsigned warnings() const { return _warnings; }$/;" f class:CxxTest::TestTracker
+width tools\cxxtest\test\fake\X11\Xlib.h /^struct XWindowAttributes { int width, height; };$/;" m struct:XWindowAttributes
+width tools\cxxtest\test\fake\qwidget.h /^ int width() { return 0; }$/;" f class:QWidget
+win32api tools\cxxtest\admin\virtualenv.py /^ import win32api$/;" i
+windowProcedure tools\cxxtest\cxxtest\Win32Gui.h /^ static LRESULT CALLBACK windowProcedure( HWND window, UINT message, WPARAM wParam, LPARAM lParam )$/;" f class:CxxTest::Win32Gui
+world tools\cxxtest\cxxtest\TestTracker.h /^ const WorldDescription &world() const { return *_world; }$/;" f class:CxxTest::TestTracker
+world tools\cxxtest\cxxtest\XmlFormatter.h /^ std::string world;$/;" m class:CxxTest::TestCaseInfo
+worldFailed tools\cxxtest\cxxtest\TestTracker.h /^ bool worldFailed() const { return (failedSuites() > 0); }$/;" f class:CxxTest::TestTracker
+worldName tools\cxxtest\cxxtest\Descriptions.h /^ virtual const char *worldName() const { return "cxxtest"; }$/;" f class:CxxTest::WorldDescription
+worldName tools\cxxtest\cxxtest\RealDescriptions.h /^ const char *worldName() const { return _worldName;}$/;" f class:CxxTest::RealWorldDescription
+world_re tools\cxxtest\python\cxxtest\cxxtestgen.py /^world_re = re.compile( r"^\\s*<CxxTest\\s+world>\\s*$" )$/;" v
+world_re tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^world_re = re.compile( r"^\\s*<CxxTest\\s+world>\\s*$" )$/;" v
+write tools\cxxtest\cxxtest\XmlFormatter.h /^ void write( OutputStream &o )$/;" f class:CxxTest::TestCaseInfo
+write tools\cxxtest\cxxtest\XmlFormatter.h /^ void write(OutputStream& os) {$/;" f class:CxxTest::ElementInfo
+writeDynamicDescription tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeDynamicDescription( output, suite ):$/;" f
+writeDynamicDescription tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeDynamicDescription( output, suite ):$/;" f
+writeInclude tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeInclude(output, file):$/;" f
+writeInclude tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeInclude(output, file):$/;" f
+writeInitialize tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeInitialize(output):$/;" f
+writeInitialize tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeInitialize(output):$/;" f
+writeMain tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeMain( output ):$/;" f
+writeMain tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeMain( output ):$/;" f
+writeOutput tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeOutput():$/;" f
+writeOutput tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeOutput():$/;" f
+writePreamble tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writePreamble( output ):$/;" f
+writePreamble tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writePreamble( output ):$/;" f
+writeRoot tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeRoot(output):$/;" f
+writeRoot tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeRoot(output):$/;" f
+writeSimpleOutput tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeSimpleOutput():$/;" f
+writeSimpleOutput tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeSimpleOutput():$/;" f
+writeStaticDescription tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeStaticDescription( output, suite ):$/;" f
+writeStaticDescription tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeStaticDescription( output, suite ):$/;" f
+writeSuiteDescription tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeSuiteDescription( output, suite ):$/;" f
+writeSuiteDescription tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeSuiteDescription( output, suite ):$/;" f
+writeSuiteObject tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeSuiteObject( output, suite ):$/;" f
+writeSuiteObject tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeSuiteObject( output, suite ):$/;" f
+writeSuitePointer tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeSuitePointer( output, suite ):$/;" f
+writeSuitePointer tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeSuitePointer( output, suite ):$/;" f
+writeSuites tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeSuites(output):$/;" f
+writeSuites tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeSuites(output):$/;" f
+writeTemplateOutput tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeTemplateOutput():$/;" f
+writeTemplateOutput tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeTemplateOutput():$/;" f
+writeTestDescription tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeTestDescription( output, suite, test ):$/;" f
+writeTestDescription tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeTestDescription( output, suite, test ):$/;" f
+writeTestDescriptions tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeTestDescriptions( output, suite ):$/;" f
+writeTestDescriptions tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeTestDescriptions( output, suite ):$/;" f
+writeTestList tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeTestList( output, suite ):$/;" f
+writeTestList tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeTestList( output, suite ):$/;" f
+writeWorld tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeWorld( output ):$/;" f
+writeWorld tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeWorld( output ):$/;" f
+writeWorldDescr tools\cxxtest\python\cxxtest\cxxtestgen.py /^def writeWorldDescr( output ):$/;" f
+writeWorldDescr tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^def writeWorldDescr( output ):$/;" f
+write_mimetype tools\cxxtest\doc\epub\bin\lib\docbook.rb /^ def write_mimetype$/;" f class:DocBook.Epub
+writefile tools\cxxtest\admin\virtualenv.py /^def writefile(dest, content, overwrite=True):$/;" f
+wrotePreamble tools\cxxtest\python\cxxtest\cxxtestgen.py /^wrotePreamble = 0$/;" v
+wrotePreamble tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^wrotePreamble = 0$/;" v
+wroteWorld tools\cxxtest\python\cxxtest\cxxtestgen.py /^wroteWorld = 0$/;" v
+wroteWorld tools\cxxtest\python\python3\cxxtest\cxxtestgen.py /^wroteWorld = 0$/;" v
+wsprintfA tools\cxxtest\test\fake\windows.h 105;" d
+x tools\cxxtest\test\DynamicMax.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:DynamicMax
+x tools\cxxtest\test\DynamicMax.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:SetUpAffectsAllTests
+x tools\cxxtest\test\Factor.h /^ X x;$/;" m class:Factor
+x tools\cxxtest\test\SameData.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:SameData
+x tools\cxxtest\test\fake\qwidget.h /^ int x() { return 0; }$/;" f class:QWidget
+x tools\cxxtest\test\tpltpl.cpp /^template<class T> class X {} x;$/;" v typeref:class:X
+x11Flags tools\cxxtest\test\test_cxxtest.py /^ x11Flags='-Ifake'$/;" v class:TestCL
+x11Flags tools\cxxtest\test\test_cxxtest.py /^ x11Flags='-Ifake'$/;" v class:TestClang
+x11Flags tools\cxxtest\test\test_cxxtest.py /^ x11Flags='-Ifake'$/;" v class:TestCpp
+x11Flags tools\cxxtest\test\test_cxxtest.py /^ x11Flags='-Ifake'$/;" v class:TestGpp
+xml_printer tools\cxxtest\cxxtest\XUnitPrinter.h /^ XmlPrinter xml_printer;$/;" m class:CxxTest::XUnitPrinter
+xmlre tools\cxxtest\test\test_cxxtest.py /^xmlre = re.compile("\\"(?P<path>[^\\"]*\/[^\\"]*)\\"")$/;" v
+xp tools\cxxtest\test\tpltpl.cpp /^template<class T, class U> class X< Pair<T, U> > {} xp;$/;" v typeref:class:X
+y tools\cxxtest\test\DynamicMax.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:DynamicMax
+y tools\cxxtest\test\DynamicMax.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:SetUpAffectsAllTests
+y tools\cxxtest\test\SameData.h /^ unsigned char x[DATA_SIZE], y[DATA_SIZE];$/;" m class:SameData
+y tools\cxxtest\test\fake\qwidget.h /^ int y() { return 0; }$/;" f class:QWidget
+yacc tools\cxxtest\python\cxxtest\cxx_parser.py /^import ply.yacc as yacc$/;" i
+yacc tools\cxxtest\python\python3\cxxtest\cxx_parser.py /^import ply.yacc as yacc$/;" i
+yellowBar tools\cxxtest\cxxtest\Gui.h /^ virtual void yellowBar() {}$/;" f class:CxxTest::GuiListener
+yellowBar tools\cxxtest\cxxtest\QtGui.h /^ void yellowBar()$/;" f class:CxxTest::QtGui
+yellowBar tools\cxxtest\cxxtest\Win32Gui.h /^ void yellowBar()$/;" f class:CxxTest::Win32Gui
+yellowBar tools\cxxtest\cxxtest\X11Gui.h /^ void yellowBar()$/;" f class:CxxTest::X11Gui
+yellowBar tools\cxxtest\test\cxxtest\DummyGui.h /^ void yellowBar()$/;" f class:CxxTest::DummyGui
+yellowBarSafe tools\cxxtest\cxxtest\Gui.h /^ void yellowBarSafe()$/;" f class:CxxTest::GuiListener
+zero tools\cxxtest\test\TestNonFinite.h /^double zero = 0.0;$/;" v
+zlib tools\cxxtest\admin\virtualenv.py /^import zlib$/;" i
+~CreatedTest tools\cxxtest\sample\CreatedTest.h /^ virtual ~CreatedTest() { delete [] _buffer; }$/;" f class:CreatedTest
+~GlobalFixture tools\cxxtest\cxxtest\GlobalFixture.cpp /^ GlobalFixture::~GlobalFixture() { detach( _list ); }$/;" f class:CxxTest::GlobalFixture
+~GuiListener tools\cxxtest\cxxtest\Gui.h /^ virtual ~GuiListener() {}$/;" f class:CxxTest::GuiListener
+~Link tools\cxxtest\cxxtest\LinkedList.cpp /^ Link::~Link()$/;" f class:CxxTest::Link
+~OutputStream tools\cxxtest\cxxtest\ErrorFormatter.h /^ virtual ~OutputStream() {}$/;" f class:CxxTest::OutputStream
+~StateGuard tools\cxxtest\cxxtest\TestRunner.h /^ ~StateGuard()$/;" f class:CxxTest::TestRunner::StateGuard
+~StdioFilePrinter tools\cxxtest\cxxtest\StdioFilePrinter.h /^ virtual ~StdioFilePrinter() { delete outputStream(); }$/;" f class:CxxTest::StdioFilePrinter
+~SuiteDescription tools\cxxtest\cxxtest\Descriptions.cpp /^ SuiteDescription::~SuiteDescription() {}$/;" f class:CxxTest::SuiteDescription
+~TeeListener tools\cxxtest\cxxtest\TeeListener.h /^ virtual ~TeeListener()$/;" f class:CxxTest::TeeListener
+~TeeOutputStreams tools\cxxtest\cxxtest\XmlFormatter.h /^ ~TeeOutputStreams()$/;" f class:CxxTest::TeeOutputStreams
+~TestDescription tools\cxxtest\cxxtest\Descriptions.cpp /^ TestDescription::~TestDescription() {}$/;" f class:CxxTest::TestDescription
+~TestListener tools\cxxtest\cxxtest\TestListener.h /^ virtual ~TestListener() {}$/;" f class:CxxTest::TestListener
+~TestSuite tools\cxxtest\cxxtest\TestSuite.cpp /^ TestSuite::~TestSuite() {}$/;" f class:CxxTest::TestSuite
+~TestTracker tools\cxxtest\cxxtest\TestTracker.cpp /^ TestTracker::~TestTracker()$/;" f class:CxxTest::TestTracker
+~WorldDescription tools\cxxtest\cxxtest\Descriptions.cpp /^ WorldDescription::~WorldDescription() {}$/;" f class:CxxTest::WorldDescription
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite2 : public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+
+ void testMultiplication(void)
+ {
+ TS_TRACE("Starting multiplication test");
+ TS_ASSERT_EQUALS(2 * 2, 5);
+ TS_TRACE("Finishing multiplication test");
+ }
+};
--- /dev/null
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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.
+\f
+ 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
+\f
+ 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!
+
+
--- /dev/null
+Overview
+--------
+
+CxxTest is a unit testing framework for C++ that is similar in
+spirit to JUnit, CppUnit, and xUnit. CxxTest is easy to use because
+it does not require precompiling a CxxTest testing library, it
+employs no advanced features of C++ (e.g. RTTI) and it supports a
+very flexible form of test discovery.
+
+CxxTest is available under the GNU Lesser General Public Licence (LGPL).
+
+A user guide is available in doc/guide.pdf.
+
+
+A Simple Example
+----------------
+
+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 --error-printer -o tests.cpp MyTestSuite.h
+
+3. Compile and run!
+
+ # g++ -o main main.cpp tests.cpp
+ # ./main
+ Running 1 test(s).OK!
--- /dev/null
+
+CxxTest Releases
+----------------
+
+* Version 4.0.3 (2012-01-07)
+ - Adding support for Python 2.4 - 3.2
+ - Various cleanup of CxxTest root directory
+ - Adding patch that allows the cxxtestgen script to be used when symlinked.
+
+* Version 4.0.2 (2012-01-02)
+ - Bug fix to enable installation of cxxtestgen without the 'setuptools' package
+
+* Version 4.0.1 (2012-01-01)
+ - Documentation updates
+ - Bug fix for installation of cxxtestgen script
+
+* Version 4.0 (2011-12-28)
+ - Perl is no longer used to support CxxTest scripts. Python is now the only scripting language used by CxxTest.
+ - The testing scripts have been rewritten using the PyUnit framework.
+ - The installation process for CxxTest now leverages and integrates with the system Python installation.
+ - A more comprehensive C++ parser is now available, which supports testing of templates.
+ - The CxxTest GUI is no longer supported, and the <<ts_warn,TS_WARN>> is deprecated.
+ - CxxTest runners now have a command-line interface that facilitates interative use of the test runner.
+ - A new user guide is now available in PDF, HTML and Ebook formats.
+
+* 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
+
--- /dev/null
+Name: cxxtest
+Summary: CxxTest Testing Framework for C++
+Version: %{version}
+Release: 1
+Copyright: LGPL
+Group: Development/C++
+Source: cxxtest-%{version}.tar.gz
+BuildRoot: /tmp/cxxtest-build
+BuildArch: noarch
+Prefix: /usr
+
+%description
+CxxTest is a unit testing framework for C++ that is similar in
+spirit to JUnit, CppUnit, and xUnit. CxxTest is easy to use because
+it does not require precompiling a CxxTest testing library, it
+employs no advanced features of C++ (e.g. RTTI) and it supports a
+very flexible form of test discovery.
+
+%prep
+%setup -n cxxtest
+
+%build
+
+%install
+install -m 755 -d $RPM_BUILD_ROOT/usr/bin $RPM_BUILD_ROOT/usr/include/cxxtest
+install -m 755 bin/cxxtestgen $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
+
--- /dev/null
+#!/bin/bash
+
+export PATH=$WORKSPACE/vpython/bin:$PATH
+g++ --version
+
+# Setup virtual Python environment
+\rm -Rf vpython
+python cxxtest/admin/virtualenv.py vpython
+#vpy/scripts/vpy_install
+vpython/bin/easy_install nose
+vpython/bin/easy_install unittest2
+vpython/bin/easy_install ply
+vpython/bin/easy_install ordereddict
+vpython/bin/easy_install gcovr
+vpython/bin/easy_install pyutilib.th
+cd cxxtest/python
+../../vpython/bin/python setup.py install
+
+# Cleanup test directory
+cd ../test
+make clean
+cd ../..
+
+# Run tests
+export CXXTEST_GCOV_FLAGS='-fprofile-arcs -ftest-coverage'
+vpython/bin/nosetests -v -v --with-xunit --xunit-file=$WORKSPACE/TEST-cxxtest.xml -w $WORKSPACE/cxxtest/test
+
+# Generate code coverage
+cd cxxtest
+../vpython/bin/gcovr -v -r $WORKSPACE/cxxtest -x -o $WORKSPACE/cxxtest/test/coverage.xml --gcov-filter '.*#test#(\.\.|\^)#cxxtest#.*gcov'
+
+echo "DONE"
+
+# Cleanup old gcov files
+cd $WORKSPACE
+\rm -f *.gcov cxxtest/*.gcov doc/*.gcov doc/examples/*.gcov
+\rm -f *.gcno cxxtest/*.gcno doc/*.gcno doc/examples/*.gcno
+\rm -f *.gcda cxxtest/*.gcda doc/*.gcda doc/examples/*.gcda
+cd $WORKSPACE/cxxtest/test
+make clean
+
--- /dev/null
+#! /usr/bin/env python
+
+import subprocess
+import sys
+import os
+
+if len(sys.argv) == 1:
+ print "Must specify release version"
+ sys.exit(1)
+
+rev = sys.argv[1]
+
+if os.path.exists('cxxtest'):
+ subprocess.call('rm -Rf cxxtest', shell=True)
+if os.path.exists(rev):
+ subprocess.call('rm -Rf '+rev, shell=True)
+
+subprocess.call('svn export https://cxxtest.svn.sourceforge.net/svnroot/cxxtest/tags/%s cxxtest' % rev, shell=True)
+
+if not os.path.exists('cxxtest'):
+ print "Error exporting release "+rev
+ sys.exit(1)
+
+os.mkdir(rev)
+
+subprocess.call('tar cvf - cxxtest > %s/cxxtest-%s.tar' % (rev,rev), shell=True)
+subprocess.call('gzip %s/cxxtest-%s.tar' % (rev,rev), shell=True)
+subprocess.call('cp cxxtest/doc/guide.pdf %s/cxxtest-guide-%s.pdf' % (rev,rev), shell=True)
+subprocess.call('cp cxxtest/doc/guide.html %s/cxxtest-guide-%s.html' % (rev,rev), shell=True)
+subprocess.call('cp cxxtest/doc/guide.epub %s/cxxtest-guide-%s.epub' % (rev,rev), shell=True)
+subprocess.call('zip -r %s/cxxtest-%s.zip cxxtest' % (rev,rev), shell=True)
+
--- /dev/null
+#!/usr/bin/env python
+"""Create a "virtual" Python installation
+"""
+
+# If you change the version here, change it in setup.py
+# and docs/conf.py as well.
+virtualenv_version = "1.7"
+
+import base64
+import sys
+import os
+import optparse
+import re
+import shutil
+import logging
+import tempfile
+import zlib
+import errno
+import distutils.sysconfig
+from distutils.util import strtobool
+
+try:
+ import subprocess
+except ImportError:
+ if sys.version_info <= (2, 3):
+ print('ERROR: %s' % sys.exc_info()[1])
+ print('ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.')
+ print('If you copy subprocess.py from a newer version of Python this script will probably work')
+ sys.exit(101)
+ else:
+ raise
+try:
+ set
+except NameError:
+ from sets import Set as set
+try:
+ basestring
+except NameError:
+ basestring = str
+
+try:
+ import ConfigParser
+except ImportError:
+ import configparser as ConfigParser
+
+join = os.path.join
+py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
+
+is_jython = sys.platform.startswith('java')
+is_pypy = hasattr(sys, 'pypy_version_info')
+is_win = (sys.platform == 'win32')
+abiflags = getattr(sys, 'abiflags', '')
+
+user_dir = os.path.expanduser('~')
+if sys.platform == 'win32':
+ user_dir = os.environ.get('APPDATA', user_dir) # Use %APPDATA% for roaming
+ default_storage_dir = os.path.join(user_dir, 'virtualenv')
+else:
+ default_storage_dir = os.path.join(user_dir, '.virtualenv')
+default_config_file = os.path.join(default_storage_dir, 'virtualenv.ini')
+
+if is_pypy:
+ expected_exe = 'pypy'
+elif is_jython:
+ expected_exe = 'jython'
+else:
+ expected_exe = 'python'
+
+
+REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
+ 'fnmatch', 'locale', 'encodings', 'codecs',
+ 'stat', 'UserDict', 'readline', 'copy_reg', 'types',
+ 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
+ 'zlib']
+
+REQUIRED_FILES = ['lib-dynload', 'config']
+
+majver, minver = sys.version_info[:2]
+if majver == 2:
+ if minver >= 6:
+ REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
+ if minver >= 7:
+ REQUIRED_MODULES.extend(['_weakrefset'])
+ if minver <= 3:
+ REQUIRED_MODULES.extend(['sets', '__future__'])
+elif majver == 3:
+ # Some extra modules are needed for Python 3, but different ones
+ # for different versions.
+ REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io',
+ '_weakrefset', 'copyreg', 'tempfile', 'random',
+ '__future__', 'collections', 'keyword', 'tarfile',
+ 'shutil', 'struct', 'copy'])
+ if minver >= 2:
+ REQUIRED_FILES[-1] = 'config-%s' % majver
+ if minver == 3:
+ # The whole list of 3.3 modules is reproduced below - the current
+ # uncommented ones are required for 3.3 as of now, but more may be
+ # added as 3.3 development continues.
+ REQUIRED_MODULES.extend([
+ #"aifc",
+ #"antigravity",
+ #"argparse",
+ #"ast",
+ #"asynchat",
+ #"asyncore",
+ "base64",
+ #"bdb",
+ #"binhex",
+ "bisect",
+ #"calendar",
+ #"cgi",
+ #"cgitb",
+ #"chunk",
+ #"cmd",
+ #"codeop",
+ #"code",
+ #"colorsys",
+ #"_compat_pickle",
+ #"compileall",
+ #"concurrent",
+ #"configparser",
+ #"contextlib",
+ #"cProfile",
+ #"crypt",
+ #"csv",
+ #"ctypes",
+ #"curses",
+ #"datetime",
+ #"dbm",
+ #"decimal",
+ #"difflib",
+ #"dis",
+ #"doctest",
+ #"dummy_threading",
+ "_dummy_thread",
+ #"email",
+ #"filecmp",
+ #"fileinput",
+ #"formatter",
+ #"fractions",
+ #"ftplib",
+ #"functools",
+ #"getopt",
+ #"getpass",
+ #"gettext",
+ #"glob",
+ #"gzip",
+ "hashlib",
+ "heapq",
+ "hmac",
+ #"html",
+ #"http",
+ #"idlelib",
+ #"imaplib",
+ #"imghdr",
+ #"importlib",
+ #"inspect",
+ #"json",
+ #"lib2to3",
+ #"logging",
+ #"macpath",
+ #"macurl2path",
+ #"mailbox",
+ #"mailcap",
+ #"_markupbase",
+ #"mimetypes",
+ #"modulefinder",
+ #"multiprocessing",
+ #"netrc",
+ #"nntplib",
+ #"nturl2path",
+ #"numbers",
+ #"opcode",
+ #"optparse",
+ #"os2emxpath",
+ #"pdb",
+ #"pickle",
+ #"pickletools",
+ #"pipes",
+ #"pkgutil",
+ #"platform",
+ #"plat-linux2",
+ #"plistlib",
+ #"poplib",
+ #"pprint",
+ #"profile",
+ #"pstats",
+ #"pty",
+ #"pyclbr",
+ #"py_compile",
+ #"pydoc_data",
+ #"pydoc",
+ #"_pyio",
+ #"queue",
+ #"quopri",
+ "reprlib",
+ "rlcompleter",
+ #"runpy",
+ #"sched",
+ #"shelve",
+ #"shlex",
+ #"smtpd",
+ #"smtplib",
+ #"sndhdr",
+ #"socket",
+ #"socketserver",
+ #"sqlite3",
+ #"ssl",
+ #"stringprep",
+ #"string",
+ #"_strptime",
+ #"subprocess",
+ #"sunau",
+ #"symbol",
+ #"symtable",
+ #"sysconfig",
+ #"tabnanny",
+ #"telnetlib",
+ #"test",
+ #"textwrap",
+ #"this",
+ #"_threading_local",
+ #"threading",
+ #"timeit",
+ #"tkinter",
+ #"tokenize",
+ #"token",
+ #"traceback",
+ #"trace",
+ #"tty",
+ #"turtledemo",
+ #"turtle",
+ #"unittest",
+ #"urllib",
+ #"uuid",
+ #"uu",
+ #"wave",
+ "weakref",
+ #"webbrowser",
+ #"wsgiref",
+ #"xdrlib",
+ #"xml",
+ #"xmlrpc",
+ #"zipfile",
+ ])
+
+if is_pypy:
+ # these are needed to correctly display the exceptions that may happen
+ # during the bootstrap
+ REQUIRED_MODULES.extend(['traceback', 'linecache'])
+
+class Logger(object):
+
+ """
+ Logging object for use in command-line script. Allows ranges of
+ levels, to avoid some redundancy of displayed information.
+ """
+
+ DEBUG = logging.DEBUG
+ INFO = logging.INFO
+ NOTIFY = (logging.INFO+logging.WARN)/2
+ WARN = WARNING = logging.WARN
+ ERROR = logging.ERROR
+ FATAL = logging.FATAL
+
+ LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL]
+
+ def __init__(self, consumers):
+ self.consumers = consumers
+ self.indent = 0
+ self.in_progress = None
+ self.in_progress_hanging = False
+
+ def debug(self, msg, *args, **kw):
+ self.log(self.DEBUG, msg, *args, **kw)
+ def info(self, msg, *args, **kw):
+ self.log(self.INFO, msg, *args, **kw)
+ def notify(self, msg, *args, **kw):
+ self.log(self.NOTIFY, msg, *args, **kw)
+ def warn(self, msg, *args, **kw):
+ self.log(self.WARN, msg, *args, **kw)
+ def error(self, msg, *args, **kw):
+ self.log(self.WARN, msg, *args, **kw)
+ def fatal(self, msg, *args, **kw):
+ self.log(self.FATAL, msg, *args, **kw)
+ def log(self, level, msg, *args, **kw):
+ if args:
+ if kw:
+ raise TypeError(
+ "You may give positional or keyword arguments, not both")
+ args = args or kw
+ rendered = None
+ for consumer_level, consumer in self.consumers:
+ if self.level_matches(level, consumer_level):
+ if (self.in_progress_hanging
+ and consumer in (sys.stdout, sys.stderr)):
+ self.in_progress_hanging = False
+ sys.stdout.write('\n')
+ sys.stdout.flush()
+ if rendered is None:
+ if args:
+ rendered = msg % args
+ else:
+ rendered = msg
+ rendered = ' '*self.indent + rendered
+ if hasattr(consumer, 'write'):
+ consumer.write(rendered+'\n')
+ else:
+ consumer(rendered)
+
+ def start_progress(self, msg):
+ assert not self.in_progress, (
+ "Tried to start_progress(%r) while in_progress %r"
+ % (msg, self.in_progress))
+ if self.level_matches(self.NOTIFY, self._stdout_level()):
+ sys.stdout.write(msg)
+ sys.stdout.flush()
+ self.in_progress_hanging = True
+ else:
+ self.in_progress_hanging = False
+ self.in_progress = msg
+
+ def end_progress(self, msg='done.'):
+ assert self.in_progress, (
+ "Tried to end_progress without start_progress")
+ if self.stdout_level_matches(self.NOTIFY):
+ if not self.in_progress_hanging:
+ # Some message has been printed out since start_progress
+ sys.stdout.write('...' + self.in_progress + msg + '\n')
+ sys.stdout.flush()
+ else:
+ sys.stdout.write(msg + '\n')
+ sys.stdout.flush()
+ self.in_progress = None
+ self.in_progress_hanging = False
+
+ def show_progress(self):
+ """If we are in a progress scope, and no log messages have been
+ shown, write out another '.'"""
+ if self.in_progress_hanging:
+ sys.stdout.write('.')
+ sys.stdout.flush()
+
+ def stdout_level_matches(self, level):
+ """Returns true if a message at this level will go to stdout"""
+ return self.level_matches(level, self._stdout_level())
+
+ def _stdout_level(self):
+ """Returns the level that stdout runs at"""
+ for level, consumer in self.consumers:
+ if consumer is sys.stdout:
+ return level
+ return self.FATAL
+
+ def level_matches(self, level, consumer_level):
+ """
+ >>> l = Logger([])
+ >>> l.level_matches(3, 4)
+ False
+ >>> l.level_matches(3, 2)
+ True
+ >>> l.level_matches(slice(None, 3), 3)
+ False
+ >>> l.level_matches(slice(None, 3), 2)
+ True
+ >>> l.level_matches(slice(1, 3), 1)
+ True
+ >>> l.level_matches(slice(2, 3), 1)
+ False
+ """
+ if isinstance(level, slice):
+ start, stop = level.start, level.stop
+ if start is not None and start > consumer_level:
+ return False
+ if stop is not None and stop <= consumer_level:
+ return False
+ return True
+ else:
+ return level >= consumer_level
+
+ #@classmethod
+ def level_for_integer(cls, level):
+ levels = cls.LEVELS
+ if level < 0:
+ return levels[0]
+ if level >= len(levels):
+ return levels[-1]
+ return levels[level]
+
+ level_for_integer = classmethod(level_for_integer)
+
+# create a silent logger just to prevent this from being undefined
+# will be overridden with requested verbosity main() is called.
+logger = Logger([(Logger.LEVELS[-1], sys.stdout)])
+
+def mkdir(path):
+ if not os.path.exists(path):
+ logger.info('Creating %s', path)
+ os.makedirs(path)
+ else:
+ logger.info('Directory %s already exists', path)
+
+def copyfileordir(src, dest):
+ if os.path.isdir(src):
+ shutil.copytree(src, dest, True)
+ else:
+ shutil.copy2(src, dest)
+
+def copyfile(src, dest, symlink=True):
+ if not os.path.exists(src):
+ # Some bad symlink in the src
+ logger.warn('Cannot find file %s (bad symlink)', src)
+ return
+ if os.path.exists(dest):
+ logger.debug('File %s already exists', dest)
+ return
+ if not os.path.exists(os.path.dirname(dest)):
+ logger.info('Creating parent directories for %s' % os.path.dirname(dest))
+ os.makedirs(os.path.dirname(dest))
+ if not os.path.islink(src):
+ srcpath = os.path.abspath(src)
+ else:
+ srcpath = os.readlink(src)
+ if symlink and hasattr(os, 'symlink'):
+ logger.info('Symlinking %s', dest)
+ try:
+ os.symlink(srcpath, dest)
+ except (OSError, NotImplementedError):
+ logger.info('Symlinking failed, copying to %s', dest)
+ copyfileordir(src, dest)
+ else:
+ logger.info('Copying to %s', dest)
+ copyfileordir(src, dest)
+
+def writefile(dest, content, overwrite=True):
+ if not os.path.exists(dest):
+ logger.info('Writing %s', dest)
+ f = open(dest, 'wb')
+ f.write(content.encode('utf-8'))
+ f.close()
+ return
+ else:
+ f = open(dest, 'rb')
+ c = f.read()
+ f.close()
+ if c != content:
+ if not overwrite:
+ logger.notify('File %s exists with different content; not overwriting', dest)
+ return
+ logger.notify('Overwriting %s with new content', dest)
+ f = open(dest, 'wb')
+ f.write(content.encode('utf-8'))
+ f.close()
+ else:
+ logger.info('Content %s already in place', dest)
+
+def rmtree(dir):
+ if os.path.exists(dir):
+ logger.notify('Deleting tree %s', dir)
+ shutil.rmtree(dir)
+ else:
+ logger.info('Do not need to delete %s; already gone', dir)
+
+def make_exe(fn):
+ if hasattr(os, 'chmod'):
+ oldmode = os.stat(fn).st_mode & 0xFFF # 0o7777
+ newmode = (oldmode | 0x16D) & 0xFFF # 0o555, 0o7777
+ os.chmod(fn, newmode)
+ logger.info('Changed mode of %s to %s', fn, oct(newmode))
+
+def _find_file(filename, dirs):
+ for dir in dirs:
+ if os.path.exists(join(dir, filename)):
+ return join(dir, filename)
+ return filename
+
+def _install_req(py_executable, unzip=False, distribute=False,
+ search_dirs=None, never_download=False):
+
+ if search_dirs is None:
+ search_dirs = file_search_dirs()
+
+ if not distribute:
+ setup_fn = 'setuptools-0.6c11-py%s.egg' % sys.version[:3]
+ project_name = 'setuptools'
+ bootstrap_script = EZ_SETUP_PY
+ source = None
+ else:
+ setup_fn = None
+ source = 'distribute-0.6.24.tar.gz'
+ project_name = 'distribute'
+ bootstrap_script = DISTRIBUTE_SETUP_PY
+
+ if setup_fn is not None:
+ setup_fn = _find_file(setup_fn, search_dirs)
+
+ if source is not None:
+ source = _find_file(source, search_dirs)
+
+ if is_jython and os._name == 'nt':
+ # Jython's .bat sys.executable can't handle a command line
+ # argument with newlines
+ fd, ez_setup = tempfile.mkstemp('.py')
+ os.write(fd, bootstrap_script)
+ os.close(fd)
+ cmd = [py_executable, ez_setup]
+ else:
+ cmd = [py_executable, '-c', bootstrap_script]
+ if unzip:
+ cmd.append('--always-unzip')
+ env = {}
+ remove_from_env = []
+ if logger.stdout_level_matches(logger.DEBUG):
+ cmd.append('-v')
+
+ old_chdir = os.getcwd()
+ if setup_fn is not None and os.path.exists(setup_fn):
+ logger.info('Using existing %s egg: %s' % (project_name, setup_fn))
+ cmd.append(setup_fn)
+ if os.environ.get('PYTHONPATH'):
+ env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH']
+ else:
+ env['PYTHONPATH'] = setup_fn
+ else:
+ # the source is found, let's chdir
+ if source is not None and os.path.exists(source):
+ logger.info('Using existing %s egg: %s' % (project_name, source))
+ os.chdir(os.path.dirname(source))
+ # in this case, we want to be sure that PYTHONPATH is unset (not
+ # just empty, really unset), else CPython tries to import the
+ # site.py that it's in virtualenv_support
+ remove_from_env.append('PYTHONPATH')
+ else:
+ if never_download:
+ logger.fatal("Can't find any local distributions of %s to install "
+ "and --never-download is set. Either re-run virtualenv "
+ "without the --never-download option, or place a %s "
+ "distribution (%s) in one of these "
+ "locations: %r" % (project_name, project_name,
+ setup_fn or source,
+ search_dirs))
+ sys.exit(1)
+
+ logger.info('No %s egg found; downloading' % project_name)
+ cmd.extend(['--always-copy', '-U', project_name])
+ logger.start_progress('Installing %s...' % project_name)
+ logger.indent += 2
+ cwd = None
+ if project_name == 'distribute':
+ env['DONT_PATCH_SETUPTOOLS'] = 'true'
+
+ def _filter_ez_setup(line):
+ return filter_ez_setup(line, project_name)
+
+ if not os.access(os.getcwd(), os.W_OK):
+ cwd = tempfile.mkdtemp()
+ if source is not None and os.path.exists(source):
+ # the current working dir is hostile, let's copy the
+ # tarball to a temp dir
+ target = os.path.join(cwd, os.path.split(source)[-1])
+ shutil.copy(source, target)
+ try:
+ call_subprocess(cmd, show_stdout=False,
+ filter_stdout=_filter_ez_setup,
+ extra_env=env,
+ remove_from_env=remove_from_env,
+ cwd=cwd)
+ finally:
+ logger.indent -= 2
+ logger.end_progress()
+ if os.getcwd() != old_chdir:
+ os.chdir(old_chdir)
+ if is_jython and os._name == 'nt':
+ os.remove(ez_setup)
+
+def file_search_dirs():
+ here = os.path.dirname(os.path.abspath(__file__))
+ dirs = ['.', here,
+ join(here, 'virtualenv_support')]
+ if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
+ # Probably some boot script; just in case virtualenv is installed...
+ try:
+ import virtualenv
+ except ImportError:
+ pass
+ else:
+ dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
+ return [d for d in dirs if os.path.isdir(d)]
+
+def install_setuptools(py_executable, unzip=False,
+ search_dirs=None, never_download=False):
+ _install_req(py_executable, unzip,
+ search_dirs=search_dirs, never_download=never_download)
+
+def install_distribute(py_executable, unzip=False,
+ search_dirs=None, never_download=False):
+ _install_req(py_executable, unzip, distribute=True,
+ search_dirs=search_dirs, never_download=never_download)
+
+_pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I)
+def install_pip(py_executable, search_dirs=None, never_download=False):
+ if search_dirs is None:
+ search_dirs = file_search_dirs()
+
+ filenames = []
+ for dir in search_dirs:
+ filenames.extend([join(dir, fn) for fn in os.listdir(dir)
+ if _pip_re.search(fn)])
+ filenames = [(os.path.basename(filename).lower(), i, filename) for i, filename in enumerate(filenames)]
+ filenames.sort()
+ filenames = [filename for basename, i, filename in filenames]
+ if not filenames:
+ filename = 'pip'
+ else:
+ filename = filenames[-1]
+ easy_install_script = 'easy_install'
+ if sys.platform == 'win32':
+ easy_install_script = 'easy_install-script.py'
+ cmd = [join(os.path.dirname(py_executable), easy_install_script), filename]
+ if sys.platform == 'win32':
+ cmd.insert(0, py_executable)
+ if filename == 'pip':
+ if never_download:
+ logger.fatal("Can't find any local distributions of pip to install "
+ "and --never-download is set. Either re-run virtualenv "
+ "without the --never-download option, or place a pip "
+ "source distribution (zip/tar.gz/tar.bz2) in one of these "
+ "locations: %r" % search_dirs)
+ sys.exit(1)
+ logger.info('Installing pip from network...')
+ else:
+ logger.info('Installing existing %s distribution: %s' % (
+ os.path.basename(filename), filename))
+ logger.start_progress('Installing pip...')
+ logger.indent += 2
+ def _filter_setup(line):
+ return filter_ez_setup(line, 'pip')
+ try:
+ call_subprocess(cmd, show_stdout=False,
+ filter_stdout=_filter_setup)
+ finally:
+ logger.indent -= 2
+ logger.end_progress()
+
+def filter_ez_setup(line, project_name='setuptools'):
+ if not line.strip():
+ return Logger.DEBUG
+ if project_name == 'distribute':
+ for prefix in ('Extracting', 'Now working', 'Installing', 'Before',
+ 'Scanning', 'Setuptools', 'Egg', 'Already',
+ 'running', 'writing', 'reading', 'installing',
+ 'creating', 'copying', 'byte-compiling', 'removing',
+ 'Processing'):
+ if line.startswith(prefix):
+ return Logger.DEBUG
+ return Logger.DEBUG
+ for prefix in ['Reading ', 'Best match', 'Processing setuptools',
+ 'Copying setuptools', 'Adding setuptools',
+ 'Installing ', 'Installed ']:
+ if line.startswith(prefix):
+ return Logger.DEBUG
+ return Logger.INFO
+
+
+class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
+ """
+ Custom help formatter for use in ConfigOptionParser that updates
+ the defaults before expanding them, allowing them to show up correctly
+ in the help listing
+ """
+ def expand_default(self, option):
+ if self.parser is not None:
+ self.parser.update_defaults(self.parser.defaults)
+ return optparse.IndentedHelpFormatter.expand_default(self, option)
+
+
+class ConfigOptionParser(optparse.OptionParser):
+ """
+ Custom option parser which updates its defaults by by checking the
+ configuration files and environmental variables
+ """
+ def __init__(self, *args, **kwargs):
+ self.config = ConfigParser.RawConfigParser()
+ self.files = self.get_config_files()
+ self.config.read(self.files)
+ optparse.OptionParser.__init__(self, *args, **kwargs)
+
+ def get_config_files(self):
+ config_file = os.environ.get('VIRTUALENV_CONFIG_FILE', False)
+ if config_file and os.path.exists(config_file):
+ return [config_file]
+ return [default_config_file]
+
+ def update_defaults(self, defaults):
+ """
+ Updates the given defaults with values from the config files and
+ the environ. Does a little special handling for certain types of
+ options (lists).
+ """
+ # Then go and look for the other sources of configuration:
+ config = {}
+ # 1. config files
+ config.update(dict(self.get_config_section('virtualenv')))
+ # 2. environmental variables
+ config.update(dict(self.get_environ_vars()))
+ # Then set the options with those values
+ for key, val in config.items():
+ key = key.replace('_', '-')
+ if not key.startswith('--'):
+ key = '--%s' % key # only prefer long opts
+ option = self.get_option(key)
+ if option is not None:
+ # ignore empty values
+ if not val:
+ continue
+ # handle multiline configs
+ if option.action == 'append':
+ val = val.split()
+ else:
+ option.nargs = 1
+ if option.action in ('store_true', 'store_false', 'count'):
+ val = strtobool(val)
+ try:
+ val = option.convert_value(key, val)
+ except optparse.OptionValueError:
+ e = sys.exc_info()[1]
+ print("An error occured during configuration: %s" % e)
+ sys.exit(3)
+ defaults[option.dest] = val
+ return defaults
+
+ def get_config_section(self, name):
+ """
+ Get a section of a configuration
+ """
+ if self.config.has_section(name):
+ return self.config.items(name)
+ return []
+
+ def get_environ_vars(self, prefix='VIRTUALENV_'):
+ """
+ Returns a generator with all environmental vars with prefix VIRTUALENV
+ """
+ for key, val in os.environ.items():
+ if key.startswith(prefix):
+ yield (key.replace(prefix, '').lower(), val)
+
+ def get_default_values(self):
+ """
+ Overridding to make updating the defaults after instantiation of
+ the option parser possible, update_defaults() does the dirty work.
+ """
+ if not self.process_default_values:
+ # Old, pre-Optik 1.5 behaviour.
+ return optparse.Values(self.defaults)
+
+ defaults = self.update_defaults(self.defaults.copy()) # ours
+ for option in self._get_all_options():
+ default = defaults.get(option.dest)
+ if isinstance(default, basestring):
+ opt_str = option.get_opt_string()
+ defaults[option.dest] = option.check_value(opt_str, default)
+ return optparse.Values(defaults)
+
+
+def main():
+ parser = ConfigOptionParser(
+ version=virtualenv_version,
+ usage="%prog [OPTIONS] DEST_DIR",
+ formatter=UpdatingDefaultsHelpFormatter())
+
+ parser.add_option(
+ '-v', '--verbose',
+ action='count',
+ dest='verbose',
+ default=0,
+ help="Increase verbosity")
+
+ parser.add_option(
+ '-q', '--quiet',
+ action='count',
+ dest='quiet',
+ default=0,
+ help='Decrease verbosity')
+
+ parser.add_option(
+ '-p', '--python',
+ dest='python',
+ metavar='PYTHON_EXE',
+ help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 '
+ 'interpreter to create the new environment. The default is the interpreter that '
+ 'virtualenv was installed with (%s)' % sys.executable)
+
+ parser.add_option(
+ '--clear',
+ dest='clear',
+ action='store_true',
+ help="Clear out the non-root install and start from scratch")
+
+ parser.add_option(
+ '--no-site-packages',
+ dest='no_site_packages',
+ action='store_true',
+ help="Don't give access to the global site-packages dir to the "
+ "virtual environment")
+
+ parser.add_option(
+ '--system-site-packages',
+ dest='system_site_packages',
+ action='store_true',
+ help="Give access to the global site-packages dir to the "
+ "virtual environment")
+
+ parser.add_option(
+ '--unzip-setuptools',
+ dest='unzip_setuptools',
+ action='store_true',
+ help="Unzip Setuptools or Distribute when installing it")
+
+ parser.add_option(
+ '--relocatable',
+ dest='relocatable',
+ action='store_true',
+ help='Make an EXISTING virtualenv environment relocatable. '
+ 'This fixes up scripts and makes all .pth files relative')
+
+ parser.add_option(
+ '--distribute',
+ dest='use_distribute',
+ action='store_true',
+ help='Use Distribute instead of Setuptools. Set environ variable '
+ 'VIRTUALENV_DISTRIBUTE to make it the default ')
+
+ default_search_dirs = file_search_dirs()
+ parser.add_option(
+ '--extra-search-dir',
+ dest="search_dirs",
+ action="append",
+ default=default_search_dirs,
+ help="Directory to look for setuptools/distribute/pip distributions in. "
+ "You can add any number of additional --extra-search-dir paths.")
+
+ parser.add_option(
+ '--never-download',
+ dest="never_download",
+ action="store_true",
+ help="Never download anything from the network. Instead, virtualenv will fail "
+ "if local distributions of setuptools/distribute/pip are not present.")
+
+ parser.add_option(
+ '--prompt=',
+ dest='prompt',
+ help='Provides an alternative prompt prefix for this environment')
+
+ if 'extend_parser' in globals():
+ extend_parser(parser)
+
+ options, args = parser.parse_args()
+
+ global logger
+
+ if 'adjust_options' in globals():
+ adjust_options(options, args)
+
+ verbosity = options.verbose - options.quiet
+ logger = Logger([(Logger.level_for_integer(2-verbosity), sys.stdout)])
+
+ if options.python and not os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
+ env = os.environ.copy()
+ interpreter = resolve_interpreter(options.python)
+ if interpreter == sys.executable:
+ logger.warn('Already using interpreter %s' % interpreter)
+ else:
+ logger.notify('Running virtualenv with interpreter %s' % interpreter)
+ env['VIRTUALENV_INTERPRETER_RUNNING'] = 'true'
+ file = __file__
+ if file.endswith('.pyc'):
+ file = file[:-1]
+ popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
+ raise SystemExit(popen.wait())
+
+ # Force --use-distribute on Python 3, since setuptools is not available.
+ if majver > 2:
+ options.use_distribute = True
+
+ if os.environ.get('PYTHONDONTWRITEBYTECODE') and not options.use_distribute:
+ print(
+ "The PYTHONDONTWRITEBYTECODE environment variable is "
+ "not compatible with setuptools. Either use --distribute "
+ "or unset PYTHONDONTWRITEBYTECODE.")
+ sys.exit(2)
+ if not args:
+ print('You must provide a DEST_DIR')
+ parser.print_help()
+ sys.exit(2)
+ if len(args) > 1:
+ print('There must be only one argument: DEST_DIR (you gave %s)' % (
+ ' '.join(args)))
+ parser.print_help()
+ sys.exit(2)
+
+ home_dir = args[0]
+
+ if os.environ.get('WORKING_ENV'):
+ logger.fatal('ERROR: you cannot run virtualenv while in a workingenv')
+ logger.fatal('Please deactivate your workingenv, then re-run this script')
+ sys.exit(3)
+
+ if 'PYTHONHOME' in os.environ:
+ logger.warn('PYTHONHOME is set. You *must* activate the virtualenv before using it')
+ del os.environ['PYTHONHOME']
+
+ if options.relocatable:
+ make_environment_relocatable(home_dir)
+ return
+
+ if options.no_site_packages:
+ logger.warn('The --no-site-packages flag is deprecated; it is now '
+ 'the default behavior.')
+
+ create_environment(home_dir,
+ site_packages=options.system_site_packages,
+ clear=options.clear,
+ unzip_setuptools=options.unzip_setuptools,
+ use_distribute=options.use_distribute,
+ prompt=options.prompt,
+ search_dirs=options.search_dirs,
+ never_download=options.never_download)
+ if 'after_install' in globals():
+ after_install(options, home_dir)
+
+def call_subprocess(cmd, show_stdout=True,
+ filter_stdout=None, cwd=None,
+ raise_on_returncode=True, extra_env=None,
+ remove_from_env=None):
+ cmd_parts = []
+ for part in cmd:
+ if len(part) > 45:
+ part = part[:20]+"..."+part[-20:]
+ if ' ' in part or '\n' in part or '"' in part or "'" in part:
+ part = '"%s"' % part.replace('"', '\\"')
+ if hasattr(part, 'decode'):
+ try:
+ part = part.decode(sys.getdefaultencoding())
+ except UnicodeDecodeError:
+ part = part.decode(sys.getfilesystemencoding())
+ cmd_parts.append(part)
+ cmd_desc = ' '.join(cmd_parts)
+ if show_stdout:
+ stdout = None
+ else:
+ stdout = subprocess.PIPE
+ logger.debug("Running command %s" % cmd_desc)
+ if extra_env or remove_from_env:
+ env = os.environ.copy()
+ if extra_env:
+ env.update(extra_env)
+ if remove_from_env:
+ for varname in remove_from_env:
+ env.pop(varname, None)
+ else:
+ env = None
+ try:
+ proc = subprocess.Popen(
+ cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
+ cwd=cwd, env=env)
+ except Exception:
+ e = sys.exc_info()[1]
+ logger.fatal(
+ "Error %s while executing command %s" % (e, cmd_desc))
+ raise
+ all_output = []
+ if stdout is not None:
+ stdout = proc.stdout
+ encoding = sys.getdefaultencoding()
+ fs_encoding = sys.getfilesystemencoding()
+ while 1:
+ line = stdout.readline()
+ try:
+ line = line.decode(encoding)
+ except UnicodeDecodeError:
+ line = line.decode(fs_encoding)
+ if not line:
+ break
+ line = line.rstrip()
+ all_output.append(line)
+ if filter_stdout:
+ level = filter_stdout(line)
+ if isinstance(level, tuple):
+ level, line = level
+ logger.log(level, line)
+ if not logger.stdout_level_matches(level):
+ logger.show_progress()
+ else:
+ logger.info(line)
+ else:
+ proc.communicate()
+ proc.wait()
+ if proc.returncode:
+ if raise_on_returncode:
+ if all_output:
+ logger.notify('Complete output from command %s:' % cmd_desc)
+ logger.notify('\n'.join(all_output) + '\n----------------------------------------')
+ raise OSError(
+ "Command %s failed with error code %s"
+ % (cmd_desc, proc.returncode))
+ else:
+ logger.warn(
+ "Command %s had error code %s"
+ % (cmd_desc, proc.returncode))
+
+
+def create_environment(home_dir, site_packages=False, clear=False,
+ unzip_setuptools=False, use_distribute=False,
+ prompt=None, search_dirs=None, never_download=False):
+ """
+ Creates a new environment in ``home_dir``.
+
+ If ``site_packages`` is true, then the global ``site-packages/``
+ directory will be on the path.
+
+ If ``clear`` is true (default False) then the environment will
+ first be cleared.
+ """
+ home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
+
+ py_executable = os.path.abspath(install_python(
+ home_dir, lib_dir, inc_dir, bin_dir,
+ site_packages=site_packages, clear=clear))
+
+ install_distutils(home_dir)
+
+ # use_distribute also is True if VIRTUALENV_DISTRIBUTE env var is set
+ # we also check VIRTUALENV_USE_DISTRIBUTE for backwards compatibility
+ if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'):
+ install_distribute(py_executable, unzip=unzip_setuptools,
+ search_dirs=search_dirs, never_download=never_download)
+ else:
+ install_setuptools(py_executable, unzip=unzip_setuptools,
+ search_dirs=search_dirs, never_download=never_download)
+
+ install_pip(py_executable, search_dirs=search_dirs, never_download=never_download)
+
+ install_activate(home_dir, bin_dir, prompt)
+
+def path_locations(home_dir):
+ """Return the path locations for the environment (where libraries are,
+ where scripts go, etc)"""
+ # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its
+ # prefix arg is broken: http://bugs.python.org/issue3386
+ if sys.platform == 'win32':
+ # Windows has lots of problems with executables with spaces in
+ # the name; this function will remove them (using the ~1
+ # format):
+ mkdir(home_dir)
+ if ' ' in home_dir:
+ try:
+ import win32api
+ except ImportError:
+ print('Error: the path "%s" has a space in it' % home_dir)
+ print('To handle these kinds of paths, the win32api module must be installed:')
+ print(' http://sourceforge.net/projects/pywin32/')
+ sys.exit(3)
+ home_dir = win32api.GetShortPathName(home_dir)
+ lib_dir = join(home_dir, 'Lib')
+ inc_dir = join(home_dir, 'Include')
+ bin_dir = join(home_dir, 'Scripts')
+ elif is_jython:
+ lib_dir = join(home_dir, 'Lib')
+ inc_dir = join(home_dir, 'Include')
+ bin_dir = join(home_dir, 'bin')
+ elif is_pypy:
+ lib_dir = home_dir
+ inc_dir = join(home_dir, 'include')
+ bin_dir = join(home_dir, 'bin')
+ else:
+ lib_dir = join(home_dir, 'lib', py_version)
+ inc_dir = join(home_dir, 'include', py_version + abiflags)
+ bin_dir = join(home_dir, 'bin')
+ return home_dir, lib_dir, inc_dir, bin_dir
+
+
+def change_prefix(filename, dst_prefix):
+ prefixes = [sys.prefix]
+
+ if sys.platform == "darwin":
+ prefixes.extend((
+ os.path.join("/Library/Python", sys.version[:3], "site-packages"),
+ os.path.join(sys.prefix, "Extras", "lib", "python"),
+ os.path.join("~", "Library", "Python", sys.version[:3], "site-packages")))
+
+ if hasattr(sys, 'real_prefix'):
+ prefixes.append(sys.real_prefix)
+ prefixes = list(map(os.path.abspath, prefixes))
+ filename = os.path.abspath(filename)
+ for src_prefix in prefixes:
+ if filename.startswith(src_prefix):
+ _, relpath = filename.split(src_prefix, 1)
+ assert relpath[0] == os.sep
+ relpath = relpath[1:]
+ return join(dst_prefix, relpath)
+ assert False, "Filename %s does not start with any of these prefixes: %s" % \
+ (filename, prefixes)
+
+def copy_required_modules(dst_prefix):
+ import imp
+ for modname in REQUIRED_MODULES:
+ if modname in sys.builtin_module_names:
+ logger.info("Ignoring built-in bootstrap module: %s" % modname)
+ continue
+ try:
+ f, filename, _ = imp.find_module(modname)
+ except ImportError:
+ logger.info("Cannot import bootstrap module: %s" % modname)
+ else:
+ if f is not None:
+ f.close()
+ dst_filename = change_prefix(filename, dst_prefix)
+ copyfile(filename, dst_filename)
+ if filename.endswith('.pyc'):
+ pyfile = filename[:-1]
+ if os.path.exists(pyfile):
+ copyfile(pyfile, dst_filename[:-1])
+
+
+def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
+ """Install just the base environment, no distutils patches etc"""
+ if sys.executable.startswith(bin_dir):
+ print('Please use the *system* python to run this script')
+ return
+
+ if clear:
+ rmtree(lib_dir)
+ ## FIXME: why not delete it?
+ ## Maybe it should delete everything with #!/path/to/venv/python in it
+ logger.notify('Not deleting %s', bin_dir)
+
+ if hasattr(sys, 'real_prefix'):
+ logger.notify('Using real prefix %r' % sys.real_prefix)
+ prefix = sys.real_prefix
+ else:
+ prefix = sys.prefix
+ mkdir(lib_dir)
+ fix_lib64(lib_dir)
+ fix_local_scheme(home_dir)
+ stdlib_dirs = [os.path.dirname(os.__file__)]
+ if sys.platform == 'win32':
+ stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
+ elif sys.platform == 'darwin':
+ stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
+ if hasattr(os, 'symlink'):
+ logger.info('Symlinking Python bootstrap modules')
+ else:
+ logger.info('Copying Python bootstrap modules')
+ logger.indent += 2
+ try:
+ # copy required files...
+ for stdlib_dir in stdlib_dirs:
+ if not os.path.isdir(stdlib_dir):
+ continue
+ for fn in os.listdir(stdlib_dir):
+ bn = os.path.splitext(fn)[0]
+ if fn != 'site-packages' and bn in REQUIRED_FILES:
+ copyfile(join(stdlib_dir, fn), join(lib_dir, fn))
+ # ...and modules
+ copy_required_modules(home_dir)
+ finally:
+ logger.indent -= 2
+ mkdir(join(lib_dir, 'site-packages'))
+ import site
+ site_filename = site.__file__
+ if site_filename.endswith('.pyc'):
+ site_filename = site_filename[:-1]
+ elif site_filename.endswith('$py.class'):
+ site_filename = site_filename.replace('$py.class', '.py')
+ site_filename_dst = change_prefix(site_filename, home_dir)
+ site_dir = os.path.dirname(site_filename_dst)
+ writefile(site_filename_dst, SITE_PY)
+ writefile(join(site_dir, 'orig-prefix.txt'), prefix)
+ site_packages_filename = join(site_dir, 'no-global-site-packages.txt')
+ if not site_packages:
+ writefile(site_packages_filename, '')
+ else:
+ if os.path.exists(site_packages_filename):
+ logger.info('Deleting %s' % site_packages_filename)
+ os.unlink(site_packages_filename)
+
+ if is_pypy or is_win:
+ stdinc_dir = join(prefix, 'include')
+ else:
+ stdinc_dir = join(prefix, 'include', py_version + abiflags)
+ if os.path.exists(stdinc_dir):
+ copyfile(stdinc_dir, inc_dir)
+ else:
+ logger.debug('No include dir %s' % stdinc_dir)
+
+ # pypy never uses exec_prefix, just ignore it
+ if sys.exec_prefix != prefix and not is_pypy:
+ if sys.platform == 'win32':
+ exec_dir = join(sys.exec_prefix, 'lib')
+ elif is_jython:
+ exec_dir = join(sys.exec_prefix, 'Lib')
+ else:
+ exec_dir = join(sys.exec_prefix, 'lib', py_version)
+ for fn in os.listdir(exec_dir):
+ copyfile(join(exec_dir, fn), join(lib_dir, fn))
+
+ if is_jython:
+ # Jython has either jython-dev.jar and javalib/ dir, or just
+ # jython.jar
+ for name in 'jython-dev.jar', 'javalib', 'jython.jar':
+ src = join(prefix, name)
+ if os.path.exists(src):
+ copyfile(src, join(home_dir, name))
+ # XXX: registry should always exist after Jython 2.5rc1
+ src = join(prefix, 'registry')
+ if os.path.exists(src):
+ copyfile(src, join(home_dir, 'registry'), symlink=False)
+ copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
+ symlink=False)
+
+ mkdir(bin_dir)
+ py_executable = join(bin_dir, os.path.basename(sys.executable))
+ if 'Python.framework' in prefix:
+ if re.search(r'/Python(?:-32|-64)*$', py_executable):
+ # The name of the python executable is not quite what
+ # we want, rename it.
+ py_executable = os.path.join(
+ os.path.dirname(py_executable), 'python')
+
+ logger.notify('New %s executable in %s', expected_exe, py_executable)
+ if sys.executable != py_executable:
+ ## FIXME: could I just hard link?
+ executable = sys.executable
+ if sys.platform == 'cygwin' and os.path.exists(executable + '.exe'):
+ # Cygwin misreports sys.executable sometimes
+ executable += '.exe'
+ py_executable += '.exe'
+ logger.info('Executable actually exists in %s' % executable)
+ shutil.copyfile(executable, py_executable)
+ make_exe(py_executable)
+ if sys.platform == 'win32' or sys.platform == 'cygwin':
+ pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe')
+ if os.path.exists(pythonw):
+ logger.info('Also created pythonw.exe')
+ shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe'))
+ if is_pypy:
+ # make a symlink python --> pypy-c
+ python_executable = os.path.join(os.path.dirname(py_executable), 'python')
+ logger.info('Also created executable %s' % python_executable)
+ copyfile(py_executable, python_executable)
+
+ if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
+ secondary_exe = os.path.join(os.path.dirname(py_executable),
+ expected_exe)
+ py_executable_ext = os.path.splitext(py_executable)[1]
+ if py_executable_ext == '.exe':
+ # python2.4 gives an extension of '.4' :P
+ secondary_exe += py_executable_ext
+ if os.path.exists(secondary_exe):
+ logger.warn('Not overwriting existing %s script %s (you must use %s)'
+ % (expected_exe, secondary_exe, py_executable))
+ else:
+ logger.notify('Also creating executable in %s' % secondary_exe)
+ shutil.copyfile(sys.executable, secondary_exe)
+ make_exe(secondary_exe)
+
+ if 'Python.framework' in prefix:
+ logger.debug('MacOSX Python framework detected')
+
+ # Make sure we use the the embedded interpreter inside
+ # the framework, even if sys.executable points to
+ # the stub executable in ${sys.prefix}/bin
+ # See http://groups.google.com/group/python-virtualenv/
+ # browse_thread/thread/17cab2f85da75951
+ original_python = os.path.join(
+ prefix, 'Resources/Python.app/Contents/MacOS/Python')
+ shutil.copy(original_python, py_executable)
+
+ # Copy the framework's dylib into the virtual
+ # environment
+ virtual_lib = os.path.join(home_dir, '.Python')
+
+ if os.path.exists(virtual_lib):
+ os.unlink(virtual_lib)
+ copyfile(
+ os.path.join(prefix, 'Python'),
+ virtual_lib)
+
+ # And then change the install_name of the copied python executable
+ try:
+ call_subprocess(
+ ["install_name_tool", "-change",
+ os.path.join(prefix, 'Python'),
+ '@executable_path/../.Python',
+ py_executable])
+ except:
+ logger.fatal(
+ "Could not call install_name_tool -- you must have Apple's development tools installed")
+ raise
+
+ # Some tools depend on pythonX.Y being present
+ py_executable_version = '%s.%s' % (
+ sys.version_info[0], sys.version_info[1])
+ if not py_executable.endswith(py_executable_version):
+ # symlinking pythonX.Y > python
+ pth = py_executable + '%s.%s' % (
+ sys.version_info[0], sys.version_info[1])
+ if os.path.exists(pth):
+ os.unlink(pth)
+ os.symlink('python', pth)
+ else:
+ # reverse symlinking python -> pythonX.Y (with --python)
+ pth = join(bin_dir, 'python')
+ if os.path.exists(pth):
+ os.unlink(pth)
+ os.symlink(os.path.basename(py_executable), pth)
+
+ if sys.platform == 'win32' and ' ' in py_executable:
+ # There's a bug with subprocess on Windows when using a first
+ # argument that has a space in it. Instead we have to quote
+ # the value:
+ py_executable = '"%s"' % py_executable
+ cmd = [py_executable, '-c', """
+import sys
+prefix = sys.prefix
+if sys.version_info[0] == 3:
+ prefix = prefix.encode('utf8')
+if hasattr(sys.stdout, 'detach'):
+ sys.stdout = sys.stdout.detach()
+elif hasattr(sys.stdout, 'buffer'):
+ sys.stdout = sys.stdout.buffer
+sys.stdout.write(prefix)
+"""]
+ logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
+ try:
+ proc = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE)
+ proc_stdout, proc_stderr = proc.communicate()
+ except OSError:
+ e = sys.exc_info()[1]
+ if e.errno == errno.EACCES:
+ logger.fatal('ERROR: The executable %s could not be run: %s' % (py_executable, e))
+ sys.exit(100)
+ else:
+ raise e
+
+ proc_stdout = proc_stdout.strip().decode("utf-8")
+ proc_stdout = os.path.normcase(os.path.abspath(proc_stdout))
+ norm_home_dir = os.path.normcase(os.path.abspath(home_dir))
+ if hasattr(norm_home_dir, 'decode'):
+ norm_home_dir = norm_home_dir.decode(sys.getfilesystemencoding())
+ if proc_stdout != norm_home_dir:
+ logger.fatal(
+ 'ERROR: The executable %s is not functioning' % py_executable)
+ logger.fatal(
+ 'ERROR: It thinks sys.prefix is %r (should be %r)'
+ % (proc_stdout, norm_home_dir))
+ logger.fatal(
+ 'ERROR: virtualenv is not compatible with this system or executable')
+ if sys.platform == 'win32':
+ logger.fatal(
+ 'Note: some Windows users have reported this error when they installed Python for "Only this user". The problem may be resolvable if you install Python "For all users". (See https://bugs.launchpad.net/virtualenv/+bug/352844)')
+ sys.exit(100)
+ else:
+ logger.info('Got sys.prefix result: %r' % proc_stdout)
+
+ pydistutils = os.path.expanduser('~/.pydistutils.cfg')
+ if os.path.exists(pydistutils):
+ logger.notify('Please make sure you remove any previous custom paths from '
+ 'your %s file.' % pydistutils)
+ ## FIXME: really this should be calculated earlier
+ return py_executable
+
+def install_activate(home_dir, bin_dir, prompt=None):
+ if sys.platform == 'win32' or is_jython and os._name == 'nt':
+ files = {'activate.bat': ACTIVATE_BAT,
+ 'deactivate.bat': DEACTIVATE_BAT}
+ if os.environ.get('OS') == 'Windows_NT' and os.environ.get('OSTYPE') == 'cygwin':
+ files['activate'] = ACTIVATE_SH
+ else:
+ files = {'activate': ACTIVATE_SH}
+
+ # suppling activate.fish in addition to, not instead of, the
+ # bash script support.
+ files['activate.fish'] = ACTIVATE_FISH
+
+ # same for csh/tcsh support...
+ files['activate.csh'] = ACTIVATE_CSH
+
+
+
+ files['activate_this.py'] = ACTIVATE_THIS
+ home_dir = os.path.abspath(home_dir)
+ if hasattr(home_dir, 'decode'):
+ home_dir = home_dir.decode(sys.getfilesystemencoding())
+ vname = os.path.basename(home_dir)
+ for name, content in files.items():
+ content = content.replace('__VIRTUAL_PROMPT__', prompt or '')
+ content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname)
+ content = content.replace('__VIRTUAL_ENV__', home_dir)
+ content = content.replace('__VIRTUAL_NAME__', vname)
+ content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
+ writefile(os.path.join(bin_dir, name), content)
+
+def install_distutils(home_dir):
+ distutils_path = change_prefix(distutils.__path__[0], home_dir)
+ mkdir(distutils_path)
+ ## FIXME: maybe this prefix setting should only be put in place if
+ ## there's a local distutils.cfg with a prefix setting?
+ home_dir = os.path.abspath(home_dir)
+ ## FIXME: this is breaking things, removing for now:
+ #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
+ writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
+ writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
+
+def fix_local_scheme(home_dir):
+ """
+ Platforms that use the "posix_local" install scheme (like Ubuntu with
+ Python 2.7) need to be given an additional "local" location, sigh.
+ """
+ try:
+ import sysconfig
+ except ImportError:
+ pass
+ else:
+ if sysconfig._get_default_scheme() == 'posix_local':
+ local_path = os.path.join(home_dir, 'local')
+ if not os.path.exists(local_path):
+ os.symlink(os.path.abspath(home_dir), local_path)
+
+def fix_lib64(lib_dir):
+ """
+ Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
+ instead of lib/pythonX.Y. If this is such a platform we'll just create a
+ symlink so lib64 points to lib
+ """
+ if [p for p in distutils.sysconfig.get_config_vars().values()
+ if isinstance(p, basestring) and 'lib64' in p]:
+ logger.debug('This system uses lib64; symlinking lib64 to lib')
+ assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
+ "Unexpected python lib dir: %r" % lib_dir)
+ lib_parent = os.path.dirname(lib_dir)
+ assert os.path.basename(lib_parent) == 'lib', (
+ "Unexpected parent dir: %r" % lib_parent)
+ copyfile(lib_parent, os.path.join(os.path.dirname(lib_parent), 'lib64'))
+
+def resolve_interpreter(exe):
+ """
+ If the executable given isn't an absolute path, search $PATH for the interpreter
+ """
+ if os.path.abspath(exe) != exe:
+ paths = os.environ.get('PATH', '').split(os.pathsep)
+ for path in paths:
+ if os.path.exists(os.path.join(path, exe)):
+ exe = os.path.join(path, exe)
+ break
+ if not os.path.exists(exe):
+ logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe))
+ raise SystemExit(3)
+ if not is_executable(exe):
+ logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe))
+ raise SystemExit(3)
+ return exe
+
+def is_executable(exe):
+ """Checks a file is executable"""
+ return os.access(exe, os.X_OK)
+
+############################################################
+## Relocating the environment:
+
+def make_environment_relocatable(home_dir):
+ """
+ Makes the already-existing environment use relative paths, and takes out
+ the #!-based environment selection in scripts.
+ """
+ home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
+ activate_this = os.path.join(bin_dir, 'activate_this.py')
+ if not os.path.exists(activate_this):
+ logger.fatal(
+ 'The environment doesn\'t have a file %s -- please re-run virtualenv '
+ 'on this environment to update it' % activate_this)
+ fixup_scripts(home_dir)
+ fixup_pth_and_egg_link(home_dir)
+ ## FIXME: need to fix up distutils.cfg
+
+OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
+ 'activate', 'activate.bat', 'activate_this.py']
+
+def fixup_scripts(home_dir):
+ # This is what we expect at the top of scripts:
+ shebang = '#!%s/bin/python' % os.path.normcase(os.path.abspath(home_dir))
+ # This is what we'll put:
+ new_shebang = '#!/usr/bin/env python%s' % sys.version[:3]
+ activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"
+ if sys.platform == 'win32':
+ bin_suffix = 'Scripts'
+ else:
+ bin_suffix = 'bin'
+ bin_dir = os.path.join(home_dir, bin_suffix)
+ home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
+ for filename in os.listdir(bin_dir):
+ filename = os.path.join(bin_dir, filename)
+ if not os.path.isfile(filename):
+ # ignore subdirs, e.g. .svn ones.
+ continue
+ f = open(filename, 'rb')
+ lines = f.readlines()
+ f.close()
+ if not lines:
+ logger.warn('Script %s is an empty file' % filename)
+ continue
+ if not lines[0].strip().startswith(shebang):
+ if os.path.basename(filename) in OK_ABS_SCRIPTS:
+ logger.debug('Cannot make script %s relative' % filename)
+ elif lines[0].strip() == new_shebang:
+ logger.info('Script %s has already been made relative' % filename)
+ else:
+ logger.warn('Script %s cannot be made relative (it\'s not a normal script that starts with %s)'
+ % (filename, shebang))
+ continue
+ logger.notify('Making script %s relative' % filename)
+ lines = [new_shebang+'\n', activate+'\n'] + lines[1:]
+ f = open(filename, 'wb')
+ f.writelines(lines)
+ f.close()
+
+def fixup_pth_and_egg_link(home_dir, sys_path=None):
+ """Makes .pth and .egg-link files use relative paths"""
+ home_dir = os.path.normcase(os.path.abspath(home_dir))
+ if sys_path is None:
+ sys_path = sys.path
+ for path in sys_path:
+ if not path:
+ path = '.'
+ if not os.path.isdir(path):
+ continue
+ path = os.path.normcase(os.path.abspath(path))
+ if not path.startswith(home_dir):
+ logger.debug('Skipping system (non-environment) directory %s' % path)
+ continue
+ for filename in os.listdir(path):
+ filename = os.path.join(path, filename)
+ if filename.endswith('.pth'):
+ if not os.access(filename, os.W_OK):
+ logger.warn('Cannot write .pth file %s, skipping' % filename)
+ else:
+ fixup_pth_file(filename)
+ if filename.endswith('.egg-link'):
+ if not os.access(filename, os.W_OK):
+ logger.warn('Cannot write .egg-link file %s, skipping' % filename)
+ else:
+ fixup_egg_link(filename)
+
+def fixup_pth_file(filename):
+ lines = []
+ prev_lines = []
+ f = open(filename)
+ prev_lines = f.readlines()
+ f.close()
+ for line in prev_lines:
+ line = line.strip()
+ if (not line or line.startswith('#') or line.startswith('import ')
+ or os.path.abspath(line) != line):
+ lines.append(line)
+ else:
+ new_value = make_relative_path(filename, line)
+ if line != new_value:
+ logger.debug('Rewriting path %s as %s (in %s)' % (line, new_value, filename))
+ lines.append(new_value)
+ if lines == prev_lines:
+ logger.info('No changes to .pth file %s' % filename)
+ return
+ logger.notify('Making paths in .pth file %s relative' % filename)
+ f = open(filename, 'w')
+ f.write('\n'.join(lines) + '\n')
+ f.close()
+
+def fixup_egg_link(filename):
+ f = open(filename)
+ link = f.read().strip()
+ f.close()
+ if os.path.abspath(link) != link:
+ logger.debug('Link in %s already relative' % filename)
+ return
+ new_link = make_relative_path(filename, link)
+ logger.notify('Rewriting link %s in %s as %s' % (link, filename, new_link))
+ f = open(filename, 'w')
+ f.write(new_link)
+ f.close()
+
+def make_relative_path(source, dest, dest_is_directory=True):
+ """
+ Make a filename relative, where the filename is dest, and it is
+ being referred to from the filename source.
+
+ >>> make_relative_path('/usr/share/something/a-file.pth',
+ ... '/usr/share/another-place/src/Directory')
+ '../another-place/src/Directory'
+ >>> make_relative_path('/usr/share/something/a-file.pth',
+ ... '/home/user/src/Directory')
+ '../../../home/user/src/Directory'
+ >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/')
+ './'
+ """
+ source = os.path.dirname(source)
+ if not dest_is_directory:
+ dest_filename = os.path.basename(dest)
+ dest = os.path.dirname(dest)
+ dest = os.path.normpath(os.path.abspath(dest))
+ source = os.path.normpath(os.path.abspath(source))
+ dest_parts = dest.strip(os.path.sep).split(os.path.sep)
+ source_parts = source.strip(os.path.sep).split(os.path.sep)
+ while dest_parts and source_parts and dest_parts[0] == source_parts[0]:
+ dest_parts.pop(0)
+ source_parts.pop(0)
+ full_parts = ['..']*len(source_parts) + dest_parts
+ if not dest_is_directory:
+ full_parts.append(dest_filename)
+ if not full_parts:
+ # Special case for the current directory (otherwise it'd be '')
+ return './'
+ return os.path.sep.join(full_parts)
+
+
+
+############################################################
+## Bootstrap script creation:
+
+def create_bootstrap_script(extra_text, python_version=''):
+ """
+ Creates a bootstrap script, which is like this script but with
+ extend_parser, adjust_options, and after_install hooks.
+
+ This returns a string that (written to disk of course) can be used
+ as a bootstrap script with your own customizations. The script
+ will be the standard virtualenv.py script, with your extra text
+ added (your extra text should be Python code).
+
+ If you include these functions, they will be called:
+
+ ``extend_parser(optparse_parser)``:
+ You can add or remove options from the parser here.
+
+ ``adjust_options(options, args)``:
+ You can change options here, or change the args (if you accept
+ different kinds of arguments, be sure you modify ``args`` so it is
+ only ``[DEST_DIR]``).
+
+ ``after_install(options, home_dir)``:
+
+ After everything is installed, this function is called. This
+ is probably the function you are most likely to use. An
+ example would be::
+
+ def after_install(options, home_dir):
+ subprocess.call([join(home_dir, 'bin', 'easy_install'),
+ 'MyPackage'])
+ subprocess.call([join(home_dir, 'bin', 'my-package-script'),
+ 'setup', home_dir])
+
+ This example immediately installs a package, and runs a setup
+ script from that package.
+
+ If you provide something like ``python_version='2.4'`` then the
+ script will start with ``#!/usr/bin/env python2.4`` instead of
+ ``#!/usr/bin/env python``. You can use this when the script must
+ be run with a particular Python version.
+ """
+ filename = __file__
+ if filename.endswith('.pyc'):
+ filename = filename[:-1]
+ f = open(filename, 'rb')
+ content = f.read()
+ f.close()
+ py_exe = 'python%s' % python_version
+ content = (('#!/usr/bin/env %s\n' % py_exe)
+ + '## WARNING: This file is generated\n'
+ + content)
+ return content.replace('##EXT' 'END##', extra_text)
+
+##EXTEND##
+
+def convert(s):
+ b = base64.b64decode(s.encode('ascii'))
+ return zlib.decompress(b).decode('utf-8')
+
+##file site.py
+SITE_PY = convert("""
+eJzVPP1z2zaWv/OvwMqTIZXKdD66nR2n7o2TOK3v3MTbpLO5dT06SoIk1hTJEqQV7c3d337vAwAB
+kvLHdvvDaTKxRAIPDw/vGw8YjUanZSnzhdgUiyaTQsmkmq9FmdRrJZZFJep1Wi0Oy6Sqd/B0fpOs
+pBJ1IdROxdgqDoKnv/MTPBWf1qkyKMC3pKmLTVKn8yTLdiLdlEVVy4VYNFWar0Sap3WaZOk/oEWR
+x+Lp78cgOM8FzDxLZSVuZaUArhLFUlzu6nWRi6gpcc7P4z8nL8cToeZVWtbQoNI4A0XWSR3kUi4A
+TWjZKCBlWstDVcp5ukzntuG2aLKFKLNkLsV//RdPjZqGYaCKjdyuZSVFDsgATAmwSsQDvqaVmBcL
+GQvxWs4THICft8QKGNoE10whGfNCZEW+gjnlci6VSqqdiGZNTYAIZbEoAKcUMKjTLAu2RXWjxrCk
+tB5beCQSZg9/MsweME8cv885gOOHPPg5T79MGDZwD4Kr18w2lVymX0SCYOGn/CLnU/0sSpdikS6X
+QIO8HmOTgBFQIktnRyUtx7d6hb47IqwsVyYwhkSUuTG/pB5xcF6LJFPAtk2JNFKE+Vs5S5McqJHf
+wnAAEUgaDI2zSFVtx6HZiQIAVLiONUjJRolok6Q5MOuPyZzQ/luaL4qtGhMFYLWU+LVRtTv/aIAA
+0NohwCTAxTKr2eRZeiOz3RgQ+ATYV1I1WY0CsUgrOa+LKpWKAABqOyG/ANITkVRSk5A508jthOhP
+NElzXFgUMBR4fIkkWaarpiIJE8sUOBe44t2Hn8Tbs9fnp+81jxlgLLOrDeAMUGihHZxgAHHUqOoo
+K0Cg4+AC/4hksUAhW+H4gFfb4OjelQ4imHsZd/s4Cw5k14urh4E51qBMaKyA+v03dJmoNdDnf+5Z
+7yA43UcVmjh/264LkMk82UixTpi/kDOCbzWc7+KyXr8CblAIpwZSKVwcRDBFeEASl2ZRkUtRAotl
+aS7HAVBoRm39VQRWeF/kh7TWHU4ACFWQw0vn2ZhGzCVMtA/rFeoL03hHM9NNArvOm6IixQH8n89J
+F2VJfkM4KmIo/jaTqzTPESHkhSA8CGlgdZMCJy5icUGtSC+YRiJk7cUtUSQa4CVkOuBJ+SXZlJmc
+sPiibr1bjdBgshZmrTPmOGhZk3qlVWunOsh7L+LPHa4jNOt1JQF4M/OEblkUEzEDnU3YlMmGxave
+FsQ5wYA8USfkCWoJffE7UPRUqWYj7UvkFdAsxFDBssiyYgskOw4CIQ6wkTHKPnPCW3gH/wNc/D+T
+9XwdBM5IFrAGhcjvA4VAwCTIXHO1RsLjNs3KXSWT5qwpimohKxrqYcQ+YsQf2BjnGrwvam3UeLq4
+ysUmrVElzbTJTNni5WHN+vEVzxumAZZbEc1M05ZOG5xeVq6TmTQuyUwuURL0Ir2yyw5jBgNjki2u
+xYatDLwDssiULciwYkGls6wlOQEAg4UvydOyyaiRQgYTCQy0KQn+JkGTXmhnCdibzXKAConN9xzs
+D+D2DxCj7ToF+swBAmgY1FKwfLO0rtBBaPVR4Bt905/HB049X2rbxEMukzTTVj7Jg3N6eFZVJL5z
+WWKviSaGghnmNbp2qxzoiGI+Go2CwLhDO2W+Fiqoq90xsIIw40ynsyZFwzedoqnXP1TAowhnYK+b
+bWfhgYYwnd4DlZwuy6rY4Gs7t4+gTGAs7BEciEvSMpIdZI8TXyH5XJVemqZoux12FqiHgsufzt6d
+fz77KE7EVavSJl19dg1jnuUJsDVZBGCqzrCtLoOWqPhS1H3iHZh3YgqwZ9SbxFcmdQO8C6h/qhp6
+DdOYey+Ds/enry/Opj9/PPtp+vH80xkgCHZGBgc0ZTSPDTiMKgbhAK5cqFjb16DXgx68Pv1oHwTT
+VE3LXbmDB2AogYWrCOY7ESE+nGobPE3zZRGOqfGv7ISfsFrRHtfV8dfX4uREhL8mt0kYgNfTNuVF
+/JEE4NOulNC1hj9RocZBsJBLEJYbiSIVPSVPdswdgIjQstCW9dcizc175iN3CJL4iHoADtPpPEuU
+wsbTaQikpQ4DH+gQszuMchJBx3Lndh1rVPBTSViKHLtM8L8BFJMZ9UM0GEW3i2kEAraZJ0pyK5o+
+9JtOUctMp5EeEMSPeBxcJFYcoTBNUMtUKXiixCuodWaqyPAnwke5JZHBYAj1Gi6SDnbi2yRrpIqc
+SQERo6hDRlSNqSIOAqciAtvZLt143KWm4RloBuTLCtB7VYdy+DkADwUUjAm7MDTjaIlphpj+O8cG
+hAM4iSEqaKU6UFificuzS/Hy2YtDdEAgSlxY6njN0aameSPtwyWs1krWDsLcK5yQMIxduixRM+LT
+47thbmK7Mn1WWOolruSmuJULwBYZ2Fll8RO9gVga5jFPYBVBE5MFZ6VnPL0EI0eePUgLWnug3oag
+mPU3S3/A4bvMFagODoWJ1DpOZ+NVVsVtiu7BbKdfgnUD9YY2zrgigbNwHpOhEQMNAX5rjpTayhAU
+WNWwi0l4I0jU8ItWFcYE7gJ16zV9vcmLbT7l2PUE1WQ0tqyLgqWZFxu0S3Ag3oHdACQLCMVaojEU
+cNIFytYhIA/Th+kCZSkaAEBgmhUFWA4sE5zRFDnOw2ERxviVIOGtJFr4WzMEBUeGGA4kehvbB0ZL
+ICSYnFVwVjVoJkNZM81gYIckPtddxBw0+gA6VIzB0EUaGjcy9Ls6BuUsLlyl5PRDG/r582dmG7Wm
+jAgiNsNJo9FfknmLyx2YwhR0gvGhOL9CbLAFdxTANEqzpjj8KIqS/SdYz0st22C5IR6r6/L46Gi7
+3cY6H1BUqyO1PPrzX7755i/PWCcuFsQ/MB1HWnRyLD6id+iDxt8aC/SdWbkOP6a5z40EK5LkR5Hz
+iPh936SLQhwfjq3+RC5uDSv+b5wPUCBTMyhTGWg7ajF6og6fxC/VSDwRkds2GrMnoU2qtWK+1YUe
+dQG2GzyNedHkdegoUiW+AusGMfVCzppVaAf3bKT5AVNFOY0sDxw+v0YMfM4wfGVM8RS1BLEFWnyH
+9D8x2yTkz2gNgeRFE9WLd3fDWswQd/FwebfeoSM0ZoapQu5AifCbPFgAbeO+5OBHO6No9xxn1Hw8
+Q2AsfWCYV7uCEQoO4YJrMXGlzuFq9FFBmrasmkHBuKoRFDS4dTOmtgZHNjJEkOjdmPCcF1a3ADp1
+cn0mojerAC3ccXrWrssKjieEPHAintMTCU7tce/dM17aJssoBdPhUY8qDNhbaLTTBfBlZABMxKj6
+ecQtTWDxobMovAYDwArO2iCDLXvMhG9cH3B0MBpgp57V39ebaTwEAhcp4uzRg6ATyic8QqVAmsrI
+77mPxS1x+4PdaXGIqcwykUirPcLVVR6DQnWnYVqmOepeZ5HieVaAV2y1IjFS+953FihywcdDxkxL
+oCZDSw6n0Ql5e54AhrodJrxWDaYG3MwJYrRJFVk3JNMa/gO3gjISlD4CWhI0C+ahUuZP7F8gc3a+
++sse9rCERoZwm+5zQ3oWQ8Mx7w8EklHnT0AKciBhXxjJdWR1kAGHOQvkCTe8lnulm2DECuTMsSCk
+ZgB3eukFOPgkxj0LklCE/KVWshRfiREsX1dUH6a7/6VcatIGkdOAXAWdbzhxcxFOHuKkk5fwGdrP
+SNDuRlkAB8/A5XFT8y6bG6a1aRJw1n3FbZECjUyZk9HYRfXaEMZN//7pxGnREssMYhjKG8jbhDEj
+jQO73Bo0LLgB4615dyz92M1YYN8oLNQLufkC8V9YpWpeqBAD3F7uwv1orujTxmJ7kc5G8MdbgNH4
+2oMkM52/wCzLPzFI6EEPh6B7k8W0yCKptmkekgLT9Dvxl6aHhyWlZ+SOPlI4dQQTxRzl0bsKBIQ2
+K49AnFATQFQuQ6Xd/j7YO6c4snC5+8hzm6+OX173iTvZl+Gxn+GlOvtSV4nC1cp40VgocLX6BhyV
+LkwuyXd6u1FvR2OYUBUKokjx4eNngYTgTOw22T1u6i3DIzb3zsn7GNRBr91Lrs7siF0AEdSKyChH
+4eM58uHIPnZyd0zsEUAexTB3LIqBpPnkn4Fz10LBGIeLXY55tK7KwA+8/ubr6UBm1EXym69H94zS
+IcaQ2EcdT9COTGUAYnDapkslk4x8DacTZRXzlndsm3LMCp3iP81k1wNOJ37Me2MyWvi95r3A0XwO
+iB4QZhezXyFYVTq/dZukGSXlAY3DQ9RzJs7m1MEwPh6ku1HGnBR4LM8mg6GQunoGCxNyYD/uT0f7
+Racm9zsQkJpPmag+Kgd6A77dP/I21d29w/2yP2ip/yCd9UhA3mxGAwR84BzM3ub//5mwsmJoWlmN
+O1pfybv1vAH2AHW4x825ww3pD827WUvjTLDcKfEUBfSp2NKGNuXycGcCoCzYzxiAg8uot0XfNFXF
+m5sk56WsDnHDbiKwlsd4GlQi1Adz9F7WiIltNqfcqFP5UQypzlBnO+1MwtZPHRbZdWFyJDK/TSvo
+C1olCn/48ONZ2GcAPQx2GgbnrqPhkofbKYT7CKYNNXHCx/RhCj2myz8vVV1X2Seo2TM2GUhNtj5h
+e4lHE7cOr8E9GQhvg5A3YjEinK/l/GYqaXMZ2RS7OknYN/gaMbF7zn6FkEqWVOYEM5lnDdKKHT2s
+T1s2+Zzy8bUEe66LSbG4hLaMOd20zJKViKjzAlMdmhspG3KbVNrbKasCyxdFky6OVulCyN+aJMMw
+Ui6XgAtuluhXMQ9PGQ/xlne9uaxNyXlTpfUOSJCoQu810Qa503C244lGHpK8rcAExC3zY/ERp43v
+mXALQy4TjPoZdpwkxnnYwWwGInfRc3ifF1McdUpVoBNGqr8PTI+D7ggFABgBUJj/aKwzRf4bSa/c
+DS1ac5eoqCU9UrqRbUEeB0KJxhhZ82/66TOiy1t7sFztx3J1N5arLparQSxXPparu7F0RQIX1iZJ
+jCQMJUq6afTBigw3x8HDnCXzNbfD6kCsAgSIojQBnZEpLpL1Mim8n0RASG07G5z0sK2wSLnssCo4
+5apBIvfjpokOHk15s9OZ6jV0Z56K8dn2VZn4fY/imIqJZtSd5W2R1EnsycUqK2YgthbdSQtgIroF
+J5yby2+nM84mdizV6PI/P/3w4T02R1Ajs51O3XAR0bDgVKKnSbVSfWlqg40S2JFa+oUf1E0DPHhg
+JodHOeD/3lJFATKO2NKOeCFK8ACo7sc2c6tjwrDzXJfR6OfM5Ly5cSJGeT1qJ7WHSKeXl29PP52O
+KMU0+t+RKzCGtr50uPiYFrZB339zm1uKYx8Qap1LaY2fOyeP1i1H3G9jDdiO2/vsuvPgxUMM9mBY
+6s/yD6UULAkQKtbJxscQ6sHBz+8KE3r0MYzYKw9zd3LYWbHvHNlzXBRH9IfS3N0B/M01jDGmQADt
+QkUmMmiDqY7St+b1Doo6QB/o6/3uEKwbenUjGZ+idhIDDqBDWdtsv/vn7Quw0VOyfn32/fn7i/PX
+l6effnBcQHTlPnw8eiHOfvwsqB4BDRj7RAluxddY+QKGxT0KIxYF/GswvbFoak5KQq+3Fxd6Z2CD
+hyGwOhZtTgzPuWzGQuMcDWc97UNd74IYZTpAck6dUHkInUrBeGnDJx5UoSto6TDLDJ3VRode+jSR
+OXVE+6gxSB80dknBILikCV5RnXNtosKKd5z0SZwBpLSNtoUIGeWgetvTzn6LyeZ7iTnqDE/azlrR
+X4UuruF1rMoshUjuVWhlSXfDcoyWcfRDu6HKeA1pQKc7jKwb8qz3YoFW61XIc9P9xy2j/dYAhi2D
+vYV555LKEahGF4upRIiNeOcglF/gq116vQYKFgw3lmpcRMN0Kcw+geBarFMIIIAn12B9MU4ACJ2V
+8BPQx052QBZYDRC+2SwO/xpqgvitf/lloHldZYd/FyVEQYJLV8IBYrqN30LgE8tYnH14Nw4ZOSoF
+FX9tsIAcHBLK8jnSTvUyvGM7jZTMlrqewdcH+EL7CfS6072SZaW7D7vGIUrAExWR1/BEGfqFWF5k
+YU9wKuMOaKyNt5jhGTN329t8DsTHtcwyXRF9/vbiDHxHLNdHCeJ9njMYjvMluGWri734DFwHFG7o
+wusK2bhCF5Y29Rex12wwM4siR729OgC7TpT97PfqpTqrJFUu2hFOm2GZgvMYWRnWwiwrs3anDVLY
+bUMUR5lhlpheVlQw6fME8DI9TTgkglgJDwOYNDPvWqZ5bSrksnQOehRULijUCQgJEhdPvBHnFTkn
+eotKmYMy8LDcVelqXWMyHTrHVKSPzX88/Xxx/p4K11+8bL3uAeacUCQw4aKFEyxJw2wHfHHLzJCr
+ptMhntWvEAZqH/jTfcXVECc8QK8fJxbxT/cVn1Q6cSJBngEoqKbsigcGAE63IblpZYFxtXEwftyS
+sxYzHwzlIvFghC4scOfX50TbsmNKKO9jXj5il2JZahpGprNbAtX96DkuS9xWWUTDjeDtkGyZzwy6
+3vTe7Cu2cj89KcRDk4BRv7U/hqlG6jXV03GYbR+3UFirbewvuZMrddrNcxRlIGLkdh67TDashHVz
+5kCvbLcHTHyr0TWSOKjKR7/kI+1heJhYYvfiFNORjk2QEcBMhtSnQxrwodAigAKhatPIkdzJ+OkL
+b46ONbh/jlp3gW38ARShrv2kMwVFBZwIX35jx5FfEVqoR49F6HgqucwLW5eEn+0avcrn/hwHZYCS
+mCh2VZKvZMSwJgbmVz6x96RgSdt6pL5Kr4cMizgH5/TLHg7vy8XwxolBrcMIvXY3ctdVRz55sMHg
+0YM7CeaDr5It6P6yqSNeyWGRHz5ttR/q/RCx2g2a6s3eKMR0zG/hnvVpAQ9SQ8NCD++3gd0i/PDa
+GEfW2sfOKZrQvtAe7LyC0KxWtC3jHF8zvqj1AlqDe9Ka/JF9qgtT7O+Bc0lOTsgC5cFdkN7cRrpB
+J50w4uMxfLYwpfLr9vSGfreQtzIrwPWCqA6r63+11fXj2KZTBuuOfjd2l7vL3TBu9KbF7NiU/6Nn
+pkpYvziX9RGiM5jxuQuzFhlc6l90SJLkN+Qlv/nb+US8ef8T/P9afoC4Co/HTcTfAQ3xpqggvuTz
+nXTwHk8O1Bw4Fo3CM3QEjbYq+I4CdNsuPTrjtog+0uCfZbCaUmAVZ7XhizEARZ4gnXlu/QRTqA+/
+zUmijjdqPMWhRRnpl0iD/Ycr8EDCkW4Zr+tNhvbCyZK0q3k1ujh/c/b+41lcf0EONz9HThbFLwDC
+6eg94gr3wybCPpk3+OTacZx/kFk54DfroNMc1MCgU4QQl5Q20ORLFxIbXCQVZg5EuVsU8xhbAsvz
+2bB6C4702Ikv7zX0npVFWNFY76K13jw+BmqIX7qKaAQNqY+eE/UkhJIZHlLix/Fo2BRPBKW24c/T
+m+3CzYzr0yY0wS6m7awjv7vVhWums4ZnOYnwOrHLYA4gZmmiNrO5ezDtQy70nRmg5WifQy6TJquF
+zEFyKcinywtA07tnyVhCmFXYnNEBK0rTZNtkp5xKm0SJEY46ovPXuCFDGUOIwX9Mbtge4CE30fBp
+WYBOiFL8VDhdVTNfswRzSETUGyg82Kb5yxdhj8I8KEfI89aRhXmi28gYrWSt588PovHV87bSgbLS
+c+8k6bwEq+eyyQGozvLp06cj8W/3ez+MSpwVxQ24ZQB70Gu5oNd7LLeenF2tvmdv3sTAj/O1vIIH
+15Q9t8+bnFKTd3SlBZH2r4ER4tqElhlN+45d5qRdxRvN3II3rLTl+DlP6WYcTC1JVLb6giFMOxlp
+IpYExRAmap6mIacpYD12RYOHwDDNqPlFfgGOTxHMBN/iDhmH2mv0MKlg03KPRedEjAjwiAqoeDQ6
+RUvHoADP6eVOozk9z9O6Pb/wzN081afFa3vhjeYrkWxRMsw8OsRwzhN6rNp62MWdLOpFLMX8yk04
+dmbJr+/DHVgbJK1YLg2m8NAs0ryQ1dyYU1yxdJ7WDhjTDuFwZ7rnh6xPHAygNAL1TlZhYSXavv2T
+XRcX0w+0j3xoRtLlQ7W9O4mTQ0neqaKL43Z8SkNZQlq+NV/GMMp7SmtrT8AbS/xJJ1WxeN274sE9
+R9fk+uoGrt9o73MAOHRdkFWQlh09HeHcUWXhM9PuuXABPxSiE263aVU3STbVNwRM0WGb2o11jac9
+f3XnyULrrYCTX4AHfKhLxcFxMFU2SE+s9DRHAU7EUqcoYvdIk3/6pyzQy3vBvhL4FEiZxdQcxDVJ
+pCvLrvaE4zO+gsBR8QjqK3Nq5iE2wZzd6B17cKcxoaKncNwt5ey1wg0WU5tvPe9uZPCoITuwfC/e
+TLB7cYP47kREzyfiz51AbF7u8OohIMOTRfxkEfo+IXW9On7R2rl+4NuBsBfIy+tHTzdLZzS9cKjG
++v6+uugRA9ANyO4ylYvDJwqxY5x/L1QNpZ3Xfk6lGeMR7ANbdaVPH7dnMujo1Qyiim2r0BzVZvxf
+O4g51qz1EJ8ARaXBFtCeWjeFL53iQ3uzGBYmavT8lUUpmQ5tjuE3vB0E3muCukK1d9NUl5FbsAM5
+AX1WkLfA2oYDQeEjeCikm0xo0b7qbAv/kYvHlen7Nhd7WH7z9V14ugI+WJY/QFCPmE6rP5Cp9rLM
+YxfmAfv19/Pfw3nvLr57NJV0r2FaYSiFhczrhN+gSWzKY5tqMCKJW0GRW96Gn/pm8OAHiyPqpvom
+vGv63P+uuesWgZ252d3tzd0/4OXSQPfdzy9DNOAwTxPiQTXjrcAO6wJXjCe6qGA4Zak/SH63E850
+j1a4D4wpYcAEKLGpxt5ozU0yd79jhcwh32Hqnucb1NWdafcOOHY5/iGKlqsB8Lk94kslHgvNgew3
+0qVUUy4anMrVSk0TvBBtSsEGFbj0vEjjvr6j+6xkonbG68RbQwCE4SZdiuhWGwNjQEDDF7NyfYhz
+PYSgoamK0inLVOmCM0jaxQVwMWeOqL/JTHJd5SiTmPBTTVVWEBWM9PWdXLgwVOvZAjWJjE2ibgzq
+psdE3+aIQ3C1jDkDyPkqjjQ86gAh+GiQczcRFypPp/Yd8Muz9qxzOrEMIfNmI6ukbu/58LdJU/Gd
+MwKd/MQFdlIVrWR2OMVFLLX84SCFyQL7/SvtZHtBxh0HnMdW6z2craiHToE95uy0Y3sMN6df7D1f
+7v0yC7oV1jXytlnLffZuE1gKc2kV6UqdO+C3+iIdvp6RM5voJjh8BHLvnrvyy3OtWmMnxaLhPHMV
+Q//mFDy6S7Z46EK0Hhf0rz7rOPp2fF9vWGbphQZ7GlsqatdqUPG0o43biBor6e6JqP1q6UdG1B78
+B0bU+vo6MDgaH60PBuun7wm9WU24d8G1jAB9pkAk3Nnr3CRmTGbkViND2Jt+Gdm7WFlnOkecjJlA
+juxfEkQg+M435ZZuencymXGHIlpfuujx9xcfXp9eEC2ml6dv/uP0e6pWwfRxx2Y9OOWQF4dM7UOv
+LtZNP+gKg6HBW2wHLlfkwx0aQu99b3N2AMLwQZ6hBe0qMvf1vg69AxH9ToD43dPuQN2nsgch9/wz
+XXzv1hV0ClgD/ZSrDc0vZ8vWPDI7FywO7c6Eed8mk7WM9nJt+xbOqfvrqxPtt+rr+PbkAce2+pRW
+AHPIyF82hWyOEthEJTsq3RvyqWQWj2GZqyxACufSuVKNblNjULV/FX8Fyi7BfTB2GCf2Wltqx+ly
+Ze9rxr2wuYwNQbxzUKP+/FxhX8hsDxWCgBWevjCMETH6T28w2e3YJ0pcHdKJy0NUNtf2F66ZdnL/
+luKma20v3lFcucHbTtB42WTuRqrt0+tAzh9l54ulU+IPmu8I6NyKpwL2Rp+JFeJsJ0IIJPWGIVYN
+Eh31rVkO8mg3HewNrZ6Jw33n8dzzaEI8399w0Tnypnu84B7qnh6qMaeeHAuM5Wv7DtqJ7wgyb+8I
+umnHcz5wT1Ff8Apfb6+eH9tkK/I7vnYUCZXZjBzDfuWUqd15u5vTnZilmlAdE8ZszjFN3eLagco+
+wb4Yp1ervycOMvu+DGnkvR8u8jE9vFurR11MLesdw5RE9ESNaVrO6QaNu30y7k+3VVt9IHxS4wFA
+eioQYCGYnm50Kud2XP4aPdNR4ayhezHdjHvoSAVV0fgcwT2M79fi1+1OJywf1J1RNP25QZcD9ZKD
+cLPvwK3GXkpkv0noTr3lgz0uAB9WHe7//AH9+/VdtvuLu/xq2+rl4AEp9mWxJBArJTokMo9jMDKg
+NyPS1lhHbgQdL6Fo6egyVDs35At0/KjMEG+9pQCDnNmp9gCsUQj+D1/Qrqc=
+""")
+
+##file ez_setup.py
+EZ_SETUP_PY = convert("""
+eJzNWmtv49a1/a5fwSgwJGE0NN8PDzRFmkyBAYrcIo8CFx5XPk+LHYpUSWoctch/v+ucQ1KkZDrt
+RT6UwcQ2ebjPfq6195G+/upwanZlMZvP538sy6ZuKnKwatEcD01Z5rWVFXVD8pw0GRbNPkrrVB6t
+Z1I0VlNax1qM16qnlXUg7DN5EovaPLQPp7X192PdYAHLj1xYzS6rZzLLhXql2UEI2QuLZ5VgTVmd
+rOes2VlZs7ZIwS3CuX5BbajWNuXBKqXZqZN/dzebWbhkVe4t8c+tvm9l+0NZNUrL7VlLvW58a7m6
+sqwS/zhCHYtY9UGwTGbM+iKqGk5Qe59fXavfsYqXz0VeEj7bZ1VVVmurrLR3SGGRvBFVQRrRLzpb
+utabMqzipVWXFj1Z9fFwyE9Z8TRTxpLDoSoPVaZeLw8qCNoPj4+XFjw+2rPZT8pN2q9Mb6wkCqs6
+4vdamcKq7KDNa6OqtTw8VYQP42irZJi1zqtP9ey7D3/65uc//7T964cffvz4P99bG2vu2BFz3Xn/
+6Ocf/qz8qh7tmuZwd3t7OB0y2ySXXVZPt21S1Lc39S3+63e7nVs3ahe79e/9nf8wm+15uOWkIRD4
+Lx2xxfmNt9icum8PJ8/2bfH0tLizFknieYzI1HG90OFJkNA0jWgsvZBFImJksX5FStBJoXFKEhI4
+vghCx5OUJqEQvnTTwI39kNEJKd5YlzAK4zhMeUIinkgWBE7skJQ7sRd7PE1fl9LrEsAAknA3SrlH
+RRS5kvgeiUToiUAm3pRF/lgXSn2XOZLFfpqSyA/jNI1DRngqQ+JEbvKqlF4XPyEJw10eCcY9zwti
+6capjDmJolQSNiElGOsSeU4QEi8QPBCuoCyOpXD8lJBARDIW4atSzn5h1CNuEkKPhBMmJfW4C30c
+n/rUZcHLUthFvlBfejQM/ZRHiGss44DwOHU9CCKpk0xYxC7zBfZwweHJKOYe96QUbuA4qR8F0iPB
+RKSZ64yVYXCHR2jIfeJ4YRSEEeLDXD9xHBI7qfO6mF6bMOZ4ETFKaeLEscfClIQ+SQLfJyHnk54x
+YsJODBdBRFgCX6YxS9IwjD0RiiREOgqasPh1MVGvTSJQSURIJ4KDPCaiwA0gzYORcPhEtAEqY994
+lAiCGnZ9jvdRRl4iYkpCGhJoxMXrYs6R4pGfypQ6EBawwAvS2PEDLpgnmMO8yUi5Y99EAUsD6VMZ
+kxhZ6AuW+MKhHsIdByn1XhfT+4ZKknqu41COMHHUBCQJzn0EPgqcJJoQc4Ez0nGigMqIEI/G3IFa
+8GyAxHYSN2beVKAucCZyIzf1hGB+KINYIGpuxHhEXA9SvXhKygXOSDcBQAF8uUSqEC9MWQop0uUx
+jRM5gVbsAmeEI3gcRInH0jShksbwdOIgex3EPHangu2Pg0SokG4kOYdhYRi6QRK4LAZ+8TRJo3BK
+ygVaUYemru8SRqjvOXAGcC6WQcBCAEXsylel9BYhSST2jHggqfRRUVSmQcQcuAqoJ6YSJhhblCi0
+BvD7HuM0ZbFHmQwAX14kvYTIKbQKxxYJkUqeOFAHBYmMlb4ApocxAIMnbjQV6XBsEZHAKi7BKm7s
+uELAuTHIKaQMhEeiKZQJL2KUcF9GAISAMUKS2A2QONyPKWPc5yGfkBKNLULBJGD5xHUjMFGSBLEH
+EWDMMEhR2lPAGV2wGwsjIsOYwr/oHlANkQNDgsBHgYVkChuisUXUkwmJQw9kD9ilPkjaQai5CCVa
+idCfkBJfwJ2DGMmUcOaTyA1F6LohyhAtRQIInMyX+IIJSCLTMAALcGC5I2kUM+lKD2HAI2+qAuKx
+RQE4lgBvJVoGFGDgB67rSi4S38W/eEqX5KIbclQv5KXwSMrBHyoFAeCJ76jGynldSm8Ro8RPgA3o
+OYLEZ47KWWQbnM3ALJM0kIwtcmPPjQFyCHTKmRs6YeqQMKG+QJ2n4VSk07FF0J0FDpoZV3mYBmkk
+AiapcBLYypypSKcXyIAkQ2MHbvWThEdAJyKEEwG8WOQHU/1dK6W3SAqE1hchcWPqegxhYmHg0hjc
+C+YXU0ySjvmIEZSNKxVqEk9wAJOb+mC2mIaphx4HUn6dDSYCjDf1rKlOd2bg2pF6l2e0m7fQu8/E
+L0xg1Pio73xQI1G7Fg+H62ZcSGv7heQZun2xxa0ldNoWmAfXlhoAVnfagExa3X01M3bjgXmoLp5h
+tmgwLigR+kV7J34xdzHfdcsgp1351aaXct+JfjjLUxfmLkyD79+r6aRuuKgw1y1HK9Q1Vya1FrTz
+4Q2mMIIxjH9lWcu/lHWd0Xww/mGkw9/7P6zmV8JuejNHj1ajv5Q+4pesWXrmfoXgVoV2l3HoxXCo
+F7Xj1eZimFv3am0pqcVmMNCtMSluMapuytpmxwq/mWTqX+AiJ6eNG87aIGFs/ObYlHv4gWG6PGEU
+Lfhtb/bgpEDN9XvyGbHE8PwFriLKQXCeMu1Amp0Z5x9bpR+telcec66mWWJ8PZTWTebFcU9FZTU7
+0lgYhHvBWpaagAvlXUti6u2VOhZcvyKsx5EjHi010i6fdxnbdbsLaK2OJow8a3G7WNlQ0njpUW2p
+5AyOMXaiGh2QPGeYuek5EwRfIyNNgmuVixL+yCtB+OmsPvb4KAfqabfr7dqzCS2mabXU0qjQqrQO
+0ScWrCx4bXzTqXEgSBTlVHhElVXWZAhd8TQ4zzARb+0vC6HPE8zZCDd6wallrnz44vmI0rI9bBCt
+MH2WU5VH7CSMKqbOiLUXdU2ehDngOBfd46POl4pktbB+PNWN2H/4RfmrMIEoLNLgnjnZIFRBizJe
+paAyxpx62F2G6p/PpN4aFIL9G2tx+Py0rURdHism6oVCGLX9vuTHXNTqlGQAoJePTU2g6jjyoHXb
+cnVGEpVym3PRDOqy9dhFCXZlt74otDMGdEViw7OiapbOWm0yALkWqPud3g1Pd2h3zLdtA7PVwLxR
+MkyAAOyXskYO0g9fQPj+pQ6Qhg5pH13vMBJtt8m1nJ81fr+Zv2ldtXrXyh6qMBbwV7Py27KQecaa
+QRxgokFOBstluVzduw9DYhgmxX9KBPOfdufCmCiF5fvNTb3qy7wrb33K+akYc8GckWLRqGrrqwdw
+ok72dPm0J3mqkI5FgSy3rb/kAsnTLb+Sp8pLVTmwScCWTkOZVXWzBmGoSllAwqnLCuvtzwPlF/aF
+vE/Fp2L57bGqIA1IbwTcVBeUtgKhndNc2KR6qu+dh9fp7MWwfpchZzN6VBT7fdn8qQRwD3KI1PWs
+LcR8/OZ6WKv3F5X+oF75Gk7RXFB+HtHpMHsNr75UxL83uapSR6aOWPW7FyhUFy05U4CVl8w0IBos
+jQ1ZY86DdUPxX0qpBpDViX9Hqb/FqOqe2vWaTg3KP54ZcoIFS8N9HfUpCmHNkeRnI1pKGdNG94FC
+BWahHjJrh3zMTdJ23enGGkDX25sanfZNrRrt+bAWLg68TeJD7pAplM+sN+OGsCZfBLTfoAE3FPD3
+MiuWHWF0S424umJKnO6Kvwd3d420Qp/uddRd3dRLI3Z1p4rhmy9lphLoIIhix06dui+2EXqrS6ci
+hyDljbrzUl4+jVap1lvFZfyuurDSfiZVsVR+fvv7XebzkBYrW3CuX8ryG50S6nOSpfgiCvUHzDlA
+2dlO5AfV5X002TboNPpUQSui8l99krNUrpgB5dcWoGqmbu1RzoWAI/EK6lD1uQBd8awglmB4rWv9
+9hDWNSjbs3ZLoHHb0Zx3hMq8y2Z7NlsCEcWd8rAWsydsp5orXgrDNTuEF0o0z2X1ud10bR0MYZS0
+Ie2ncAopNErcAEwVisADTPfoegEknyuxrZxKtAQ0NMBe/Z5RRFKsr1JmALpX7ZPOsrWqpqvX0D/o
+ZG0yNUe2bVIuxOGd+bG86LTG2dnBsKa6eq63uKAyXXItPtj4WR5Esbxa9rX1A1r82+cqawA+iDH8
+q5trYPjntfog8FlFT3UArFJlCGhkZVUddXLk4kKYjvswPVTP3Qi9vsPE7mo/VJsauWGArcaP5Wqs
+sUERbY3BivX8mc7hTjywtR1m6O5fwuinRsC7SwjABnd6F5aXtViuriCibu600OHzls060IKCufql
+g63Zv3Mp/t4j05foQb6spxj7zLkfX/uIVHPsB3RL7aqOIF5qnS8+en6tbzajQo/VVxLPa14fJ/Rc
+7lx3WeOhYTQz6Jip0hhMCqzc72GoPWoLu8Mb0o5f3dXGSLs4BxdoP6/eqLOVh5VO02exqHRaC0vR
++G+mirJU+fmCq5Ta1xyCRccC897nZW+WyGsxiMawF7e329Zb2621wQDo2I7tLv7jrv9/AfAaXNUU
+TOsyF6jViUG46+NBJqZXv+rRK7Evv2i81ZEw33DQ8y6YowH05r+BuxfN92SX3RbVP8bNymDOGnY7
+16PfvzG+4ecrzfzkjPZya/H/ScnXyqwX/JtSrrL5pbrryu1hPKFrZzsrJD6sUuyPwDGdKerJyxmq
+dvmdHNCrrzU/+2W0pQ6gSvPl/Mertmi+7hBlDhB80kRUqcNeJCGapHNCz1cvCFwsf0A/Ne++jGMf
+TuOJcm6+ZnP9TRR7tWjHreOhZ6huiKnPAP2zfmqpIqHHLG/emnNhyHxSs+JJYfIwj6t2AlLdVneO
+3Is9u0R33ef+Wv2pVizPfbUW0rGhps1FRRfnZ/2xsnr3oT2Slh2tvngsLXu6M0OgIen7ufrjprrD
+vzXQAgNE22ualqzbyAb97uvl6qF/2a5hcU+eBzVWzOdmVjA0PXQMQoAhsulmBv39oU13134SjSlb
+dX85nKW3umfYbtu8713Sylhb2i3v2qaoc8C7S2P3pME8uIGedi1IxXbL+adi+P2fT8Xy/m+/PrxZ
+/TrXDcpqOMjotwdo9AJmg8r1N7BySygc+Gp+XaYdJhpV8f/7Oy3Y1s330l09YBDTjnyjn5qHGF7x
+6O7hZfMXz21OyLZB6lUfOGAGMzo/bjaL7VaV7Ha76D/1yJVEqKmr+L2nCbH7+959wDtv38JZplQG
+BDaonX65d/fwEjNqlDjLVIvM9X+XVxF7
+""")
+
+##file distribute_setup.py
+DISTRIBUTE_SETUP_PY = convert("""
+eJztG2tz2zbyu34FTh4PqYSi7TT3GM+pM2nj9DzNJZnYaT8kHhoiIYk1X+XDsvrrb3cBkCAJyc61
+dzM3c7qrIxGLxWLfuwCP/lTs6k2eTabT6Xd5Xld1yQsWxfBvvGxqweKsqnmS8DoGoMnliu3yhm15
+VrM6Z00lWCXqpqjzPKkAFkdLVvDwjq+FU8lBv9h57JemqgEgTJpIsHoTV5NVnCB6+AFIeCpg1VKE
+dV7u2DauNyyuPcaziPEoogm4IMLWecHylVxJ4z8/n0wYfFZlnhrUBzTO4rTIyxqpDTpqCb7/yJ2N
+dliKXxsgi3FWFSKMV3HI7kVZATOQhm6qh98BKsq3WZLzaJLGZZmXHstL4hLPGE9qUWYceKqBuh17
+tGgIUFHOqpwtd6xqiiLZxdl6gpvmRVHmRRnj9LxAYRA/bm+HO7i99SeTa2QX8TekhRGjYGUD3yvc
+SljGBW1PSZeoLNYlj0x5+qgUE8W8vNLfql37tY5Tob+vspTX4aYdEmmBFLS/eUk/Wwk1dYwqI0eT
+fD2Z1OXuvJNiFaP2yeFPVxcfg6vL64uJeAgFkH5Jzy+QxXJKC8EW7F2eCQObJrtZAgtDUVVSVSKx
+YoFU/iBMI/cZL9fVTE7BD/4EZC5s1xcPImxqvkyEN2PPaaiFK4FfZWag90PgqEvY2GLBTid7iT4C
+RQfmg2hAihFbgRQkQeyF/80fSuQR+7XJa1AmfNykIquB9StYPgNd7MDgEWIqwNyBmBTJdwDmmxdO
+t6QmCxEK3OasP6bwOPA/MG4YHw8bbHOmx9XUYccIOIJTMMMhtenPHQXEOviiVqxuhtLJK78qOFid
+C98+BD+/urz22IBp7Jkps9cXb159ensd/HTx8ery/TtYb3rq/8V/8XLaDn36+BYfb+q6OD85KXZF
+7EtR+Xm5PlFOsDqpwFGF4iQ66fzSyXRydXH96cP1+/dvr4I3r368eD1YKDw7m05MoA8//hBcvnvz
+Hsen0y+Tf4qaR7zm85+kOzpnZ/7p5B340XPDhCft6HE1uWrSlINVsAf4TP6Rp2JeAIX0e/KqAcpL
+8/tcpDxO5JO3cSiySoG+FtKBEF58AASBBPftaDKZkBorX+OCJ1jCvzNtA+IBYk5IyknuXQ7TYJ0W
+4CJhy9qb+OldhN/BU+M4uA1/y8vMdS46JKADx5XjqckSME+iYBsBIhD/WtThNlIYWi9BUGC7G5jj
+mlMJihMR0oX5eSGydhctTKD2obbYm+yHSV4JDC+dQa5zRSxuug0ELQD4E7l1IKrg9cb/BeAVYR4+
+TECbDFo/n97MxhuRWLqBjmHv8i3b5uWdyTENbVCphIZhaIzjsh1kr1vddmamO8nyuufAHB2xYTlH
+IXcGHqRb4Ap0FEI/4N+Cy2LbMoevUVNqXTGTE99YeIBFCIIW6HlZCi4atJ7xZX4v9KRVnAEemypI
+zZlpJV42MTwQ67UL/3laWeFLHiDr/q/T/wM6TTKkWJgxkKIF0XcthKHYCNsJQsq749Q+HZ//in+X
+6PtRbejRHH/Bn9JA9EQ1lDuQUU1rVymqJqn7ygNLSWBlg5rj4gGWrmi4W6XkMaSol+8pNXGd7/Mm
+iWgWcUraznqNtqKsIAKiVQ7rqnTYa7PaYMkroTdmPI5EwndqVWTlUA0UvNOFyflxNS92x5EP/0fe
+WRMJ+ByzjgoM6uoHRJxVDjpkeXh2M3s6e5RZAMHtXoyMe8/+99E6+OzhUqdXjzgcAqScDckHfyjK
+2j31WCd/lf326x4jyV/qqk8H6IDS7wWZhpT3oMZQO14MUqQBBxZGmmTlhtzBAlW8KS1MWJz92QPh
+BCt+JxbXZSNa75pyMvGqgcJsS8kz6ShfVnmChoq8mHRLGJoGIPiva3Jvy6tAckmgN3WKu3UAJkVZ
+W0VJLPI3zaMmERVWSl/a3TgdV4aAY0/c+2GIprdeH0Aq54ZXvK5LtwcIhhJERtC1JuE4W3HQnoXT
+UL8CHoIo59DVLi3EvrKmnSlz79/jLfYzr8cMX5Xp7rRjybeL6XO12sxC1nAXfXwqbf4+z1ZJHNb9
+pQVoiawdQvIm7gz8yVBwplaNeY/TIdRBRuJvSyh03RHE9Jo8O20rMnsORm/G/XZxDAUL1PooaH4P
+6TpVMl+y6RgftlJCnjk11pvK1AHzdoNtAuqvqLYAfCubDKOLzz4kAsRjxadbB5yleYmkhpiiaUJX
+cVnVHpgmoLFOdwDxTrscNv9k7MvxLfBfsi+Z+31TlrBKspOI2XE5A+Q9/y98rOIwcxirshRaXLsv
++mMiqSz2ARrIBiZn2PfngZ+4wSkYmamxk9/tK2a/xhqeFEP2WYxVr9tsBlZ9l9dv8iaLfrfRPkqm
+jcRRqnPIXQVhKXgtht4qwM2RBbZZFIarA1H698Ys+lgCl4pXygtDPfy6a/G15kpxtW0kgu0leUil
+C7U5FePjWnbuMqjkZVJ4q2i/ZdWGMrMltiPveRL3sGvLy5p0KUqwaE6m3HoFwoXtP0p6qWPS9iFB
+C2iKYLc9ftwy7HG44CPCjV5dZJEMm9ij5cw5cWY+u5U8ucUVe7k/+BdRCp1Ctv0uvYqIfLlH4mA7
+Xe2BOqxhnkXU6yw4BvqlWKG7wbZmWDc86TqutL8aK6na12L4jyQMvVhEQm1KqIKXFIUEtrlVv7lM
+sKyaGNZojZUGihe2ufX6twDVAVs/veTYxzJs/Rs6QCV92dQue7kqCpI9b7HI/I/fC2DpnhRcg6rs
+sgwRHexLtVYNax3kzRLt7Bx5/uo+j1GrC7TcqCWny3BGIb0tXlrrIR9fTT3cUt9lS6IUl9zR8BH7
+KHh0QrGVYYCB5AxIZ0swuTsPO+xbVEKMhtK1gCaHeVmCuyDrGyCD3ZJWa3uJ8ayjFgSvVVh/sCmH
+CUIZgj7waJBRSTYS0ZJZHptul9MRkEoLEFk3NvKZShKwliXFAAJ0iT6AB/yWcAeLmvBd55QkDHtJ
+yBKUjFUlCO66Au+1zB/cVZOF6M2UE6Rhc5zaqx579uxuOzuQFcvmf1efqOnaMF5rz3Ilnx9KmIew
+mDNDIW1LlpHa+ziXraRRm938FLyqRgPDlXxcBwQ9ft4u8gQcLSxg2j+vwGMXKl2wSHpCYtNNeMMB
+4Mn5/HDefhkq3dEa0RP9o9qslhnTfZhBVhFYkzo7pKn0pt4qRSeqAvQNLpqBB+4CPEBWdyH/Z4pt
+PLxrCvIWK5lYi0zuCCK7DkjkLcG3BQqH9giIeGZ6DeDGGHahl+44dAQ+DqftNPMsPa1XfQizXap2
+3WlDN+sDQmMp4OsJkE1ibAjIGRDFMp8zNwGGtnVswVK5Nc07eya4svkh0u2JIQZYz/Quxoj2TXio
+rNlmFZp2cUPeGzxWqEZ7lggysdWRGZ9ClHX8929f+8cVHmnh6aiPf0ad3Y+ITgY3DCS57ClKEjVO
+1eTF2hZ/urZRtQH9sCU2ze8hWQbTCMwOuVskPBQbUHahO9WDMB5X2Gscg/Wp/5TdQSDsNd8h8VJ7
+MObu168V1h09/4PpqL4QYDSC7aQA1eq02Vf/ujjXM/sxz7BjOMfiYOju9eIjb7kE6d+ZbFn1y6OO
+A12HlFJ489DcXHfAgMlIC0BOqAUiEfJINm9qTHrRe2z5rrM5XecMEzaDPR6Tqq/IH0hUzTc40Tlz
+ZTlAdtCDla6qF0FGk6Q/VDM8ZjmvVJ1txdGRb++4AabAhy7KY31qrMp0BJi3LBG1UzFU/Nb5DvnZ
+KpriN+qaa7bwvEHzT7Xw8SYCfjW4pzEckoeC6R2HDfvMCmRQ7ZreZoRlHNNteglOVTbuga2aWMWJ
+PW1056q7yBMZbQJnsJO+P97na4beeR+c9tV8Bel0e0SM6yumGAEMQdobK23burWRjvdYrgAGPBUD
+/5+mQESQL39xuwNHX/e6CygJoe6Ske2xLkPPuUm6v2ZKz+Wa5IJKWoqpx9ywRdiaObqxMHZBxKnd
+PfEITE5FKvfJpyayIuw2qiKxYUXq0Kbq/CAs8KWnc+6+qwKepO0rnN6AlJH/07wcO0Cr55HgB/zO
+0Id/j/KXkXw0q0uJWgd5OC2yuk8C2J8iSVbVbU60n1WGjHyY4AyTksFW6o3B0W4r6vFjW+mRYXTK
+hvJ6fH+PmdjQ0zwCPuvl823Q63K6IxVKIAKFd6hKMf6y5dd7FVRmwBc//DBHEWIIAXHK71+hoPEo
+hT0YZ/fFhKfGVcO3d7F1T7IPxKd3Ld/6jw6yYvaIaT/Kuf+KTRms6JUdSlvslYca1Pol+5RtRBtF
+s+9kH3NvOLOczCnM1KwNilKs4gdXe/ouuLRBjkKDOpSE+vveOO839oa/1YU6DfhZf4EoGYkHI2w+
+Pzu/abMoGvT0tTuRNakoubyQZ/ZOEFTeWJX51nxewl7lPQi5iWGCDpsAHD6sWdYVtplRiRcYRiQe
+S2OmzgslGZpZJHHtOrjOwpl9ng9O5wwWaPaZiylcwyMiSRWWhpIK64FrApopbxF+K/lj7yH1yK0+
+E+RzC5VfS2lHIzC3qUTp0NFCdzlWHRViG9fasbGt0s62GIbUyJGqDpX9KuR0oGicO+rrkTbb3Xsw
+fqhDdcS2wgGLCoEES5A3sltQSONWT5QLyZRKiBTPGczj0XGXhH5u0Vz6pYK6d4RsGG/IiEOYmMLk
+beVj1tY/0/c/yvNeTLbBK5bgjHrliT1xH2gLxXzEsCA3rjyu4tz1rhAjvmGr0jhIevXh8g8mfNYV
+gUOEoJB9ZTRvc5nvFpgliSzM7aI5YpGohbo1h8EbT+LbCIiaGg1z2PYYbjEkz9dDQ30233kwih65
+NGi3bodYVlG8oEMF6QtRIckXxg9EbFHm93EkIvn6Q7xS8OaLFpXRfIjUhbvU6w41dMfRrDj6gcNG
+mV0KChsw1BsSDIjkWYjtHuhYW+WNcKBlA/XH/hqll4aBVUo5VuZ1PbUlyyZ8kUUqaNCdsT2byuby
+Nl8nvB4daN/7+2hWqerJijTAYfOwlqaKceFzP0n7MiYLKYcTKEWiuy//RJ3rdyO+Igfdm4QeaD4P
+eNOfN24/m7rRHt2hWdP5snR/dNZr+PtMDEXbz/5/rzwH9NJpZyaMhnnCmyzcdClc92QYKT+qkd6e
+MbSxDcfWFr6RJCGo4NdvtEioIi5Yyss7PMvPGacDWN5NWDat8bSp3vk3N5gufHbmoXkjm7IzvGKT
+iLlqAczFA72/BDnzPOUZxO7IuTFCnMZ4etP2A7BpZiaYn/tvXNyw5+20icZB93OsL9O03DMuJVci
+WcnG+WLqTz2WCrw4UC0wpnQnM+oiNR0EKwh5zEiXAErgtmQt/gzlFSN9j1jvr7vQgD4Z3/XKtxlW
+1Wke4Vth0v9js58AClGmcVXRa1rdkZ1GEoMSUsMLZB5VPrvFDTjtxRB8RQuQrgQRMrpGDYQqDsBX
+mKx25KAnlqkpT4iIFF+5o8siwE8imRqAGg/22JUWg8Yud2wtaoXLnfVvUKiELMyLnfkbCjHI+NWN
+QMlQeZ1cAyjGd9cGTQ6APty0eYEWyygf0AMYm5PVpK0+YCXyhxBRFEivclbDqv898EtHmrAePepC
+S8VXAqUqBsf6HaTPC6hAI1et0Xdlmq4FccvHPwcB8T4Z9m1evvwb5S5hnIL4qGgC+k7/enpqJGPJ
+ylei1zil8rc5xUeB1ipYhdw3STYN3+zpsb8z94XHXhocQhvD+aJ0AcOZh3hezKzlQpgWBONjk0AC
++t3p1JBtiNSVmO0ApaTetR09jBDdid1CK6CPx/2gvkizgwQ4M48pbPLqsGYQZG500QNwtRbcWi2q
+LokDU7kh8wZKZ4z3iKRzQGtbQwu8z6DR2TlJOdwAcZ2MFd7ZGLCh88UnAIYb2NkBQFUgmBb7b9x6
+lSqKkxPgfgJV8Nm4AqYbxYPq2nZPgZAF0XLtghJOlWvBN9nwwpPQ4SDlMdXc9x7bc8mvCwSXh153
+JRW44NVOQWnnd/j6v4rxw5fbgLiY7r9g8hRQRR4ESGoQqHcpie42ap6d38wm/wIwBuVg
+""")
+
+##file activate.sh
+ACTIVATE_SH = convert("""
+eJytVU1v4jAQPW9+xTT0ANVS1GsrDlRFAqmFqmG72m0rY5IJsRRslDiktNr/vuMQ8tFQpNU2B4I9
+H36eeW/SglkgYvBFiLBKYg0LhCRGD1KhA7BjlUQuwkLIHne12HCNNpz5kVrBgsfBmdWCrUrA5VIq
+DVEiQWjwRISuDreW5eE+CtodeLeAnhZEGKMGFXqAciMiJVcoNWx4JPgixDjzEj48QVeCfcqmtzfs
+cfww+zG4ZfeD2ciGF7gCHaDMPM1jtvuHXAsPfF2rSGeOxV4iDY5GUGb3xVEYv2aj6WQ0vRseAlMY
+G5DKsAawwnQUXt2LQOYlzZoYByqhonqoqfxZf4BLD97i4DukgXADCPgGgdOLTK5arYxZB1xnrc9T
+EQFcHoZEAa1gSQioo/TPV5FZrDlxJA+NzwF+Ek1UonOzFnKZp6k5mgLBqSkuuAGXS4whJb5xz/xs
+wXCHjiVerAk5eh9Kfz1wqOldtVv9dkbscfjgjKeTA8XPrtaNauX5rInOxaHuOReNtpFjo1/OxdFG
+5eY9hJ3L3jqcPJbATggXAemDLZX0MNZRYjSDH7C1wMHQh73DyYfTu8a0F9v+6D8W6XNnF1GEIXW/
+JrSKPOtnW1YFat9mrLJkzLbyIlTvYzV0RGXcaTBfVLx7jF2PJ2wyuBsydpm7VSVa4C4Zb6pFO2TR
+huypCEPwuQjNftUrNl6GsYZzuFrrLdC9iJjQ3omAPBbcI2lsU77tUD43kw1NPZhTrnZWzuQKLomx
+Rd4OXM1ByExVVkmoTwfBJ7Lt10Iq1Kgo23Bmd8Ib1KrGbsbO4Pp2yO4fpnf3s6MnZiwuiJuls1/L
+Pu4yUCvhpA+vZaJvWWDTr0yFYYyVnHMqCEq+QniuYX225xmnzRENjbXACF3wkCYNVZ1mBwxoR9Iw
+WAo3/36oSOTfgjwEEQKt15e9Xpqm52+oaXxszmnE9GLl65RH2OMmS6+u5acKxDmlPgj2eT5/gQOX
+LLK0j1y0Uwbmn438VZkVpqlfNKa/YET/53j+99G8H8tUhr9ZSXs2
+""")
+
+##file activate.fish
+ACTIVATE_FISH = convert("""
+eJydVm1v4jgQ/s6vmA1wBxUE7X2stJVYlVWR2lK13d6d9laRk0yIr8HmbIe0++tvnIQQB9pbXT5A
+Ys/LM55nZtyHx5RrSHiGsMm1gRAh1xhDwU0Kng8hFzMWGb5jBv2E69SDs0TJDdj3MxilxmzPZzP7
+pVPMMl+q9bjXh1eZQ8SEkAZULoAbiLnCyGSvvV6SC7IoBcS4Nw0wjcFbvJDcjiuTswzFDpiIQaHJ
+lQAjQUi1YRmUboC2uZJig8J4PaCnT5IaDcgsbm/CjinOwgx1KcUTMEhhTgV4g2B1fRk8Le8fv86v
+g7v545UHpZB9rKnp+gXsMhxLunIIpwVQxP/l9c/Hq9Xt1epm4R27bva6AJqN92G4YhbMG2i+LB+u
+grv71c3dY7B6WtzfLy9bePbp0taDTXSwJQJszUnnp0y57mvpPcrF7ZODyhswtd59+/jdgw+fwBNS
+xLSscksUPIDqwwNmCez3PpxGeyBYg6HE0YdcWBxcKczYzuVJi5Wu915vn5oWePCCoPUZBN5B7IgV
+MCi54ZDLG7TUZ0HweXkb3M5vFmSpFm/gthhBx0UrveoPpv9AJ9unIbQYdUoe21bKg2q48sPFGVwu
+H+afrxd1qvclaNlRFyh1EQ2sSccEuNAGWQwysfVpz1tPajUqbqJUnEcIJkWo6OXDaodK8ZiLdbmM
+L1wb+9H0D+pcyPSrX5u5kgWSygRYXCnJUi/KKcuU4cqsAyTKZBiissLc7NFwizvjxtieKBVCIdWz
+fzilzPaYyljZN0cGN1v7NnaIPNCGmVy3GKuJaQ6iVjE1Qfm+36hglErwmnAD8hu0dDy4uICBA8ZV
+pQr/q/+O0KFW2kjelu9Dgb9SDBsWV4F4x5CswgS0zBVlk5tDMP5bVtUGpslbm81Lu2sdKq7uNMGh
+MVQ4fy9xhogC1lS5guhISa0DlBWv0O8odT6/LP+4WZzDV6FzIkEqC0uolGZSZoMnlpxplmD2euaT
+O4hkTpPnbztDccey0bhjDaBIqaWQa0uwEtQEwtyU56i4fq54F9IE3ORR6mKriODM4XOYZwaVYLYz
+7SPbKkz4i7VkB6/Ot1upDE3znNqYKpM8raa0Bx8vfvntJ32UENsM4aI6gJL+jJwhxhh3jVIDOcpi
+m0r2hmEtS8XXXNBk71QCDXTBNhhPiHX2LtHkrVIlhoEshH/EZgdq53Eirqs5iFKMnkOmqZTtr3Xq
+djvPTWZT4S3NT5aVLgurMPUWI07BRVYqkQrmtCKohNY8qu9EdACoT6ki0a66XxVF4f9AQ3W38yO5
+mWmZmIIpnDFrbXakvKWeZhLwhvrbUH8fahhqD0YUcBDJjEBMQwiznE4y5QbHrbhHBOnUAYzb2tVN
+jJa65e+eE2Ya30E2GurxUP8ssA6e/wOnvo3V78d3vTcvMB3n7l3iX1JXWqk=
+""")
+
+##file activate.csh
+ACTIVATE_CSH = convert("""
+eJx9U11vmzAUffevOCVRu+UB9pws29Kl0iq1aVWllaZlcgxciiViItsQdb9+xiQp+dh4QOB7Pu49
+XHqY59IgkwVhVRmLmFAZSrGRNkdgykonhFiqSCRW1sJSmJg8wCDT5QrucRCyHn6WFRKhVGmhKwVp
+kUpNiS3emup3TY6XIn7DVNQyJUwlrgthJD6n/iCNv72uhCzCpFx9CRkThRQGKe08cWXJ9db/yh/u
+pvzl9mn+PLnjj5P5D1yM8QmXlzBkSdXwZ0H/BBc0mEo5FE5qI2jKhclHOOvy9HD/OO/6YO1mX9vx
+sY0H/tPIV0dtqel0V7iZvWyNg8XFcBA0ToEqVeqOdNUEQFvN41SumAv32VtJrakQNSmLWmgp4oJM
+yDoBHgoydtoEAs47r5wHHnUal5vbJ8oOI+9wI86vb2d8Nrm/4Xy4RZ8R85E4uTZPB5EZPnTaaAGu
+E59J8BE2J8XgrkbLeXMlVoQxznEYFYY8uFFdxsKQRx90Giwx9vSueHP1YNaUSFG4vTaErNSYuBOF
+lXiVyXa9Sy3JdClEyK1dD6Nos9mEf8iKlOpmqSNTZnYjNEWiUYn2pKNB3ttcLJ3HmYYXy6Un76f7
+r8rRsC1TpTJj7f19m5sUf/V3Ir+x/yjtLu8KjLX/CmN/AcVGUUo=
+""")
+
+##file activate.bat
+ACTIVATE_BAT = convert("""
+eJyFUkEKgzAQvAfyhz0YaL9QEWpRqlSjWGspFPZQTevFHOr/adQaU1GaUzI7Mzu7ZF89XhKkEJS8
+qxaKMMsvboQ+LxxE44VICSW1gEa2UFaibqoS0iyJ0xw2lIA6nX5AHCu1jpRsv5KRjknkac9VLVug
+sX9mtzxIeJDE/mg4OGp47qoLo3NHX2jsMB3AiDht5hryAUOEifoTdCXbSh7V0My2NMq/Xbh5MEjU
+ZT63gpgNT9lKOJ/CtHsvT99re3pX303kydn4HeyOeAg5cjf2EW1D6HOPkg9NGKhu
+""")
+
+##file deactivate.bat
+DEACTIVATE_BAT = convert("""
+eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgWIgK0q
+FlWqXJpcICVYpGzx2BAZ4uHv5+Hv6wq1BWINXBTdKriEKkI1DhW2QAfhttcxxANiFZCBbglQSJUL
+i2dASrm4rFz9XLgAwJNbyQ==
+""")
+
+##file distutils-init.py
+DISTUTILS_INIT = convert("""
+eJytV92L4zYQf/dfMU0ottuse7RvC6FQrg8Lxz2Ugz4si9HacqKuIxlJ2ST313dG8odkO9d7aGBB
+luZLv/nNjFacOqUtKJMIvzK3cXlhWgp5MDBsqK5SNYftsBAGpLLA4F1oe2Ytl+9wUvW55TswCi4c
+KibhbFDSglXQCFmDPXIwtm7FawLRbwtPzg2T9gf4gupKv4GS0N262w7V0NvpbCy8cvTo3eAus6C5
+ETU3ICQZX1hFTw/dzR6V/AW1RCN4/XAtbsVXqIXmlVX6liS4lOzEYY9QFB2zx6LfoSNjz1a0pqT9
+QOIfJWQ2E888NEVZNqLlZZnvIB0NpHkimlFdKn2iRRY7yGG/CCJb6Iz280d34SFXBS2yEYPNF0Q7
+yM7oCjpWvbEDQmnhRwOs6zjThpKE8HogwRAgraqYFZgGZvzmzVh+mgz9vskT3hruwyjdFcqyENJw
+bbMPO5jdzonxK68QKT7B57CMRRG5shRSWDTX3dI8LzRndZbnSWL1zfvriUmK4TcGWSnZiEPCrxXv
+bM+sP7VW2is2WgWXCO3sAu3Rzysz3FiNCA8WPyM4gb1JAAmCiyTZbhFjWx3h9SzauuRXC9MFoVbc
+yNTCm1QXOOIfIn/g1kGMhDUBN72hI5XCBQtIXQw8UEEdma6Jaz4vJIJ51Orc15hzzmu6TdFp3ogr
+Aof0c98tsw1SiaiWotHffk3XYCkqdToxWRfTFXqgpg2khcLluOHMVC0zZhLKIomesfSreUNNgbXi
+Ky9VRzwzkBneNoGQyyvGjbsFQqOZvpWIjqH281lJ/jireFgR3cPzSyTGWzQpDNIU+03Fs4XKLkhp
+/n0uFnuF6VphB44b3uWRneSbBoMSioqE8oeF0JY+qTvYfEK+bPLYdoR4McfYQ7wMZj39q0kfP8q+
+FfsymO0GzNlPh644Jje06ulqHpOEQqdJUfoidI2O4CWx4qOglLye6RrFQirpCRXvhoRqXH3sYdVJ
+AItvc+VUsLO2v2hVAWrNIfVGtkG351cUMNncbh/WdowtSPtCdkzYFv6mwYc9o2Jt68ud6wectBr8
+hYAulPSlgzH44YbV3ikjrulEaNJxt+/H3wZ7bXSXje/YY4tfVVrVmUstaDwwOBLMg6iduDB0lMVC
+UyzYx7Ab4kjCqdViEJmDcdk/SKbgsjYXgfMznUWcrtS4z4fmJ/XOM1LPk/iIpqass5XwNbdnLb1Y
+8h3ERXSWZI6rZJxKs1LBqVH65w0Oy4ra0CBYxEeuOMbDmV5GI6E0Ha/wgVTtkX0+OXvqsD02CKLf
+XHbeft85D7tTCMYy2Njp4DJP7gWJr6paVWXZ1+/6YXLv/iE0M90FktiI7yFJD9e7SOLhEkkaMTUO
+azq9i2woBNR0/0eoF1HFMf0H8ChxH/jgcB34GZIz3Qn4/vid+VEamQrOVqAPTrOfmD4MPdVh09tb
+8dLLjvh/61lEP4yW5vJaH4vHcevG8agXvzPGoOhhXNncpTr99PTHx6e/UvffFLaxUSjuSeP286Dw
+gtEMcW1xKr/he4/6IQ6FUXP+0gkioHY5iwC9Eyx3HKO7af0zPPe+XyLn7fAY78k4aiR387bCr5XT
+5C4rFgwLGfMvJuAMew==
+""")
+
+##file distutils.cfg
+DISTUTILS_CFG = convert("""
+eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH
+xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg
+9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q=
+""")
+
+##file activate_this.py
+ACTIVATE_THIS = convert("""
+eJyNUlGL2zAMfvevEBlHEujSsXsL9GGDvW1jD3sZpQQ3Ua7aJXawnbT595Ocpe0dO5ghseVP+vRJ
+VpIkn2cYPZknwAvWLXWYhRP5Sk4baKgOWRWNqtpdgTyH2Y5wpq5Tug406YAgKEzkwqg7NBPwR86a
+Hk0olPopaK0NHJHzYQPnE5rI0o8+yBUwiBfyQcT8mMPJGiAT0A0O+b8BY4MKJ7zPcSSzHaKrSpJE
+qeDmUgGvVbPCS41DgO+6xy/OWbfAThMn/OQ9ukDWRCSLiKzk1yrLjWapq6NnvHUoHXQ4bYPdrsVX
+4lQMc/q6ZW975nmSK+oH6wL42a9H65U6aha342Mh0UVDzrD87C1bH73s16R5zsStkBZDp0NrXQ+7
+HaRnMo8f06UBnljKoOtn/YT+LtdvSyaT/BtIv9KR60nF9f3qmuYKO4//T9ItJMsjPfgUHqKwCZ3n
+xu/Lx8M/UvCLTxW7VULHxB1PRRbrYfvWNY5S8it008jOjcleaMqVBDnUXcWULV2YK9JEQ92OfC96
+1Tv4ZicZZZ7GpuEpZbbeQ7DxquVx5hdqoyFSSmXwfC90f1Dc7hjFs/tK99I0fpkI8zSLy4tSy+sI
+3vMWehjQNJmE5VePlZbL61nzX3S93ZcfDqznnkb9AZ3GWJU=
+""")
+
+if __name__ == '__main__':
+ main()
+
+## TODO:
+## Copy python.exe.manifest
+## Monkeypatch distutils.sysconfig
--- /dev/null
+#! /usr/bin/env python
+#
+# The CxxTest driver script, which uses the cxxtest Python package.
+#
+
+import sys
+import os
+from os.path import realpath, dirname
+if sys.version_info < (3,0):
+ sys.path.insert(0, dirname(dirname(realpath(__file__)))+os.sep+'python')
+else:
+ sys.path.insert(0, dirname(dirname(realpath(__file__)))+os.sep+'python'+os.sep+'python3')
+sys.path.append(".")
+
+import cxxtest
+
+cxxtest.main(sys.argv)
+
--- /dev/null
+This file is meant to be a full credit of the people who helped make the CxxTest
+builder what it is today.
+
+
+Current maintainer:
+ Gašper Ažman (gasper dot azman at gmail.com)
+
+
+Original author:
+ Gašper Ažman
+
+Additional patches and tests:
+ Diego Nieto Cid
+ Edmundo López Bobeda
+ John Darby Mitchell
+ Pavol Juhas
+
+Other helpful suggestions:
+ John Darby Mitchell
--- /dev/null
+# coding=UTF-8
+#
+# == Preamble ==
+# Authors of this script are in the Authors file in the same directory as this
+# script.
+#
+# please send bugreports/praise/comments/criticism to
+# gasper.azman at gmail.com or the cxxtest mailing list (dev at cxxtest.tigris.org)
+#
+# This file is maintained as a part of the CxxTest test suite.
+#
+# == About ==
+#
+# This builder correctly tracks dependencies and supports just about every
+# configuration option for CxxTest that I can think of. It automatically
+# defines a target "check" (configurable), so all tests can be run with a
+# % scons check
+# This will first compile and then run the tests.
+#
+# The default configuration assumes that cxxtest is located at the base source
+# directory (where SConstruct is), that the cxxtestgen is under
+# cxxtest/bin/cxxtestgen and headers are in cxxtest/cxxtest/. The
+# header include path is automatically added to CPPPATH. It, however, can also
+# recognise that cxxtest is installed system-wide (based on redhat's RPM).
+#
+# For a list of environment variables and their defaults, see the generate()
+# function.
+#
+# This should be in a file called cxxtest.py somewhere in the scons toolpath.
+# (default: #/site_scons/site_tools/)
+#
+# == Usage: ==
+#
+# For configuration options, check the comment of the generate() function.
+#
+# This builder has a variety of different possible usages, so bear with me.
+#
+# env.CxxTest('target')
+# The simplest of them all, it models the Program call. This sees if target.t.h
+# is around and passes it through the cxxtestgen and compiles it. Might only
+# work on unix though, because target can't have a suffix right now.
+#
+# env.CxxTest(['target.t.h'])
+# This compiles target.t.h as in the previous example, but now sees that it is a
+# source file. It need not have the same suffix as the env['CXXTEST_SUFFIX']
+# variable dictates. The only file provided is taken as the test source file.
+#
+# env.CxxTest(['test1.t.h','test1_lib.cpp','test1_lib2.cpp','test2.t.h',...])
+# You may also specify multiple source files. In this case, the 1st file that
+# ends with CXXTEST_SUFFIX (default: .t.h) will be taken as the default test
+# file. All others will be run with the --part switch and linked in. All files
+# *not* having the right suffix will be passed to the Program call verbatim.
+#
+# In the last two cases, you may also specify the desired name of the test as
+# the 1st argument to the function. This will result in the end executable
+# called that. Normal Program builder rules apply.
+#
+
+from SCons.Script import *
+from SCons.Builder import Builder
+import os
+
+# A warning class to notify users of problems
+class ToolCxxTestWarning(SCons.Warnings.Warning):
+ pass
+
+SCons.Warnings.enableWarningClass(ToolCxxTestWarning)
+
+def accumulateEnvVar(dicts, name, default = []):
+ """
+ Accumulates the values under key 'name' from the list of dictionaries dict.
+ The default value is appended to the end list if 'name' does not exist in
+ the dict.
+ """
+ final = []
+ for d in dicts:
+ final += Split(d.get(name, default))
+ return final
+
+def multiget(dictlist, key, default = None):
+ """
+ Takes a list of dictionaries as its 1st argument. Checks if the key exists
+ in each one and returns the 1st one it finds. If the key is found in no
+ dictionaries, the default is returned.
+ """
+ for dict in dictlist:
+ if dict.has_key(key):
+ return dict[key]
+ else:
+ return default
+
+def envget(env, key, default=None):
+ """Look in the env, then in os.environ. Otherwise same as multiget."""
+ return multiget([env, os.environ], key, default)
+
+def UnitTest(env, target, source = [], **kwargs):
+ """
+ Prepares the Program call arguments, calls Program and adds the result to
+ the check target.
+ """
+ # get the c and cxx flags to process.
+ ccflags = Split( multiget([kwargs, env, os.environ], 'CCFLAGS' ))
+ cxxflags = Split( multiget([kwargs, env, os.environ], 'CXXFLAGS'))
+ # get the removal c and cxx flags
+ cxxremove = set( Split( multiget([kwargs, env, os.environ],'CXXTEST_CXXFLAGS_REMOVE')))
+ ccremove = set( Split( multiget([kwargs, env, os.environ],'CXXTEST_CCFLAGS_REMOVE' )))
+ # remove the required flags
+ ccflags = [item for item in ccflags if item not in ccremove]
+ cxxflags = [item for item in cxxflags if item not in cxxremove]
+ # fill the flags into kwargs
+ kwargs["CXXFLAGS"] = cxxflags
+ kwargs["CCFLAGS"] = ccflags
+ test = env.Program(target, source = source, **kwargs)
+ if multiget([kwargs, env, os.environ], 'CXXTEST_SKIP_ERRORS', False):
+ runner = env.Action(test[0].abspath, exitstatfunc=lambda x:0)
+ else:
+ runner = env.Action(test[0].abspath)
+ env.Alias(env['CXXTEST_TARGET'], test, runner)
+ env.AlwaysBuild(env['CXXTEST_TARGET'])
+ return test
+
+def isValidScriptPath(cxxtestgen):
+ """check keyword arg or environment variable locating cxxtestgen script"""
+
+ if cxxtestgen and os.path.exists(cxxtestgen):
+ return True
+ else:
+ SCons.Warnings.warn(ToolCxxTestWarning,
+ "Invalid CXXTEST environment variable specified!")
+ return False
+
+def defaultCxxTestGenLocation(env):
+ return os.path.join(
+ envget(env, 'CXXTEST_CXXTESTGEN_DEFAULT_LOCATION'),
+ envget(env, 'CXXTEST_CXXTESTGEN_SCRIPT_NAME')
+ )
+
+def findCxxTestGen(env):
+ """locate the cxxtestgen script by checking environment, path and project"""
+
+ # check the SCons environment...
+ # Then, check the OS environment...
+ cxxtest = envget(env, 'CXXTEST', None)
+
+ # check for common passing errors and provide diagnostics.
+ if isinstance(cxxtest, (list, tuple, dict)):
+ SCons.Warnings.warn(
+ ToolCxxTestWarning,
+ "The CXXTEST variable was specified as a list."
+ " This is not supported. Please pass a string."
+ )
+
+ if cxxtest:
+ try:
+ #try getting the absolute path of the file first.
+ # Required to expand '#'
+ cxxtest = env.File(cxxtest).abspath
+ except TypeError:
+ try:
+ #maybe only the directory was specified?
+ cxxtest = env.File(
+ os.path.join(cxxtest, defaultCxxTestGenLocation(env)
+ )).abspath
+ except TypeError:
+ pass
+ # If the user specified the location in the environment,
+ # make sure it was correct
+ if isValidScriptPath(cxxtest):
+ return os.path.realpath(cxxtest)
+
+ # No valid environment variable found, so...
+ # Next, check the path...
+ # Next, check the project
+ check_path = os.path.join(
+ envget(env, 'CXXTEST_INSTALL_DIR'),
+ envget(env, 'CXXTEST_CXXTESTGEN_DEFAULT_LOCATION'))
+
+ cxxtest = (env.WhereIs(envget(env, 'CXXTEST_CXXTESTGEN_SCRIPT_NAME')) or
+ env.WhereIs(envget(env, 'CXXTEST_CXXTESTGEN_SCRIPT_NAME'),
+ path=[Dir(check_path).abspath]))
+
+ if cxxtest:
+ return cxxtest
+ else:
+ # If we weren't able to locate the cxxtestgen script, complain...
+ SCons.Warnings.warn(
+ ToolCxxTestWarning,
+ "Unable to locate cxxtestgen in environment, path or"
+ " project!\n"
+ "Please set the CXXTEST variable to the path of the"
+ " cxxtestgen script"
+ )
+ return None
+
+def findCxxTestHeaders(env):
+ searchfile = 'TestSuite.h'
+ cxxtestgen_pathlen = len(defaultCxxTestGenLocation(env))
+
+ default_path = Dir(envget(env,'CXXTEST_INSTALL_DIR')).abspath
+
+ os_cxxtestgen = os.path.realpath(File(env['CXXTEST']).abspath)
+ alt_path = os_cxxtestgen[:-cxxtestgen_pathlen]
+
+ searchpaths = [default_path, alt_path]
+ for p in searchpaths:
+ if os.path.exists(os.path.join(p, 'cxxtest', searchfile)):
+ return p
+
+def generate(env, **kwargs):
+ """
+ Keyword arguments (all can be set via environment variables as well):
+ CXXTEST - the path to the cxxtestgen script.
+ Default: searches SCons environment, OS environment,
+ path and project in that order. Instead of setting this,
+ you can also set CXXTEST_INSTALL_DIR
+ CXXTEST_RUNNER - the runner to use. Default: ErrorPrinter
+ CXXTEST_OPTS - other options to pass to cxxtest. Default: ''
+ CXXTEST_SUFFIX - the suffix of the test files. Default: '.t.h'
+ CXXTEST_TARGET - the target to append the tests to. Default: check
+ CXXTEST_CXXFLAGS_REMOVE - the flags that cxxtests can't compile with,
+ or give lots of warnings. Will be stripped.
+ Default: -pedantic -Weffc++
+ CXXTEST_CCFLAGS_REMOVE - the same thing as CXXTEST_CXXFLAGS_REMOVE, just for
+ CCFLAGS. Default: same as CXXFLAGS.
+ CXXTEST_PYTHON - the path to the python binary.
+ Default: searches path for python
+ CXXTEST_SKIP_ERRORS - set to True to continue running the next test if one
+ test fails. Default: False
+ CXXTEST_CPPPATH - If you do not want to clutter your global CPPPATH with the
+ CxxTest header files and other stuff you only need for
+ your tests, this is the variable to set. Behaves as
+ CPPPATH does.
+ CXXTEST_INSTALL_DIR - this is where you tell the builder where CxxTest is
+ installed. The install directory has cxxtest,
+ python, docs and other subdirectories.
+ ... and all others that Program() accepts, like CPPPATH etc.
+ """
+
+ print "Loading CxxTest tool..."
+
+ #
+ # Expected behaviour: keyword arguments override environment variables;
+ # environment variables override default settings.
+ #
+ env.SetDefault( CXXTEST_RUNNER = 'ErrorPrinter' )
+ env.SetDefault( CXXTEST_OPTS = '' )
+ env.SetDefault( CXXTEST_SUFFIX = '.t.h' )
+ env.SetDefault( CXXTEST_TARGET = 'check' )
+ env.SetDefault( CXXTEST_CPPPATH = ['#'] )
+ env.SetDefault( CXXTEST_PYTHON = env.WhereIs('python') )
+ env.SetDefault( CXXTEST_SKIP_ERRORS = False )
+ env.SetDefault( CXXTEST_CXXFLAGS_REMOVE =
+ ['-pedantic','-Weffc++','-pedantic-errors'] )
+ env.SetDefault( CXXTEST_CCFLAGS_REMOVE =
+ ['-pedantic','-Weffc++','-pedantic-errors'] )
+ env.SetDefault( CXXTEST_INSTALL_DIR = '#/cxxtest/' )
+
+ # this one's not for public use - it documents where the cxxtestgen script
+ # is located in the CxxTest tree normally.
+ env.SetDefault( CXXTEST_CXXTESTGEN_DEFAULT_LOCATION = 'bin' )
+ # the cxxtestgen script name.
+ env.SetDefault( CXXTEST_CXXTESTGEN_SCRIPT_NAME = 'cxxtestgen' )
+
+ #Here's where keyword arguments are applied
+ apply(env.Replace, (), kwargs)
+
+ #If the user specified the path to CXXTEST, make sure it is correct
+ #otherwise, search for and set the default toolpath.
+ if (not kwargs.has_key('CXXTEST') or not isValidScriptPath(kwargs['CXXTEST']) ):
+ env["CXXTEST"] = findCxxTestGen(env)
+
+ # find and add the CxxTest headers to the path.
+ env.AppendUnique( CXXTEST_CPPPATH = [findCxxTestHeaders(env)] )
+
+ cxxtest = env['CXXTEST']
+ if cxxtest:
+ #
+ # Create the Builder (only if we have a valid cxxtestgen!)
+ #
+ cxxtest_builder = Builder(
+ action =
+ [["$CXXTEST_PYTHON",cxxtest,"--runner=$CXXTEST_RUNNER",
+ "$CXXTEST_OPTS","$CXXTEST_ROOT_PART","-o","$TARGET","$SOURCE"]],
+ suffix = ".cpp",
+ src_suffix = '$CXXTEST_SUFFIX'
+ )
+ else:
+ cxxtest_builder = (lambda *a: sys.stderr.write("ERROR: CXXTESTGEN NOT FOUND!"))
+
+ def CxxTest(env, target, source = None, **kwargs):
+ """Usage:
+ The function is modelled to be called as the Program() call is:
+ env.CxxTest('target_name') will build the test from the source
+ target_name + env['CXXTEST_SUFFIX'],
+ env.CxxTest('target_name', source = 'test_src.t.h') will build the test
+ from test_src.t.h source,
+ env.CxxTest('target_name, source = ['test_src.t.h', other_srcs]
+ builds the test from source[0] and links in other files mentioned in
+ sources,
+ You may also add additional arguments to the function. In that case, they
+ will be passed to the actual Program builder call unmodified. Convenient
+ for passing different CPPPATHs and the sort. This function also appends
+ CXXTEST_CPPPATH to CPPPATH. It does not clutter the environment's CPPPATH.
+ """
+ if (source == None):
+ suffix = multiget([kwargs, env, os.environ], 'CXXTEST_SUFFIX', "")
+ source = [t + suffix for t in target]
+ sources = Flatten(Split(source))
+ headers = []
+ linkins = []
+ for l in sources:
+ # check whether this is a file object or a string path
+ try:
+ s = l.abspath
+ except AttributeError:
+ s = l
+
+ if s.endswith(multiget([kwargs, env, os.environ], 'CXXTEST_SUFFIX', None)):
+ headers.append(l)
+ else:
+ linkins.append(l)
+
+ deps = []
+ if len(headers) == 0:
+ if len(linkins) != 0:
+ # the 1st source specified is the test
+ deps.append(env.CxxTestCpp(linkins.pop(0), **kwargs))
+ else:
+ deps.append(env.CxxTestCpp(headers.pop(0), **kwargs))
+ deps.extend(
+ [env.CxxTestCpp(header, CXXTEST_RUNNER = 'none',
+ CXXTEST_ROOT_PART = '--part', **kwargs)
+ for header in headers]
+ )
+ deps.extend(linkins)
+ kwargs['CPPPATH'] = list(set(
+ Split(kwargs.get('CPPPATH', [])) +
+ Split(env.get( 'CPPPATH', [])) +
+ Split(kwargs.get('CXXTEST_CPPPATH', [])) +
+ Split(env.get( 'CXXTEST_CPPPATH', []))
+ ))
+
+ return UnitTest(env, target, source = deps, **kwargs)
+
+ env.Append( BUILDERS = { "CxxTest" : CxxTest, "CxxTestCpp" : cxxtest_builder } )
+
+def exists(env):
+ return os.path.exists(env['CXXTEST'])
--- /dev/null
+Tests if the 'default environment' defaults are sane and work out of the box.
+by: Gašper Ažman
--- /dev/null
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest']
+ )
+
+env['CXXTEST_SKIP_ERRORS'] = True
+env.CxxTest(['src/ThrowNoStd.h'])
+env.CxxTest(['src/AborterNoThrow.h'])
+env.CxxTest(['src/Comments.h'])
+
--- /dev/null
+
+expect_success = True
+type = 'scons'
+links = {
+ 'cxxtest': '../../../../',
+ 'src' : '../../../../test/'
+ }
+
+
--- /dev/null
+Tests if cxxtest behaves correctly if no sources are given.
+by: Gašper Ažman
--- /dev/null
+env = Environment(toolpath=['../../'],tools=['default','cxxtest'])
+
+env.CxxTest('test_bar')
+env.CxxTest('test_foo')
--- /dev/null
+
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file requirement.cpp
+ * Implementation of the requirement function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:09:42 AM
+ */
+
+bool call_a_requirement() {
+ return true;
+}
--- /dev/null
+#ifndef TEST_BAR_T_H
+#define TEST_BAR_T_H
+/**
+ * @file test_bar.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:04:06 AM
+ */
+
+#include <cxxtest/TestSuite.h>
+#include "requirement.hpp"
+
+class TestBar : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+#ifndef TEST_FOO_T_H
+#define TEST_FOO_T_H
+/**
+ * @file test_foo.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:02:06 AM
+ */
+
+#include "requirement.hpp"
+#include <cxxtest/TestSuite.h>
+
+class TestFoo : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+#!/usr/bin/env python
+# vim: fileencoding=utf-8
+
+from __future__ import print_function
+import os, sys
+from os.path import isdir, isfile, islink, join
+from optparse import OptionParser
+from subprocess import check_call, CalledProcessError, PIPE
+
+options = None
+args = []
+available_types = set(['scons'])
+tool_stdout = PIPE
+
+def main():
+ global options
+ global args
+ global tool_stdout
+ """Parse the options and execute the program."""
+ usage = \
+ """Usage: %prog [options] [test1 [test2 [...]]]
+
+ If you provide one or more tests, this will run the provided tests.
+ Otherwise, it will look for tests in the current directory and run them all.
+ """
+ # option parsing
+ parser = OptionParser(usage)
+
+ parser.set_defaults(
+ action='run',
+ verbose=True)
+
+ parser.add_option("-c", "--clean",
+ action='store_const', const='clean', dest='action',
+ help="deletes any generated files in the tests")
+ parser.add_option("--run",
+ action='store_const', const='run', dest='action',
+ help="sets up the environment, compiles and runs the tests")
+ parser.add_option("-v", "--verbose",
+ action='store_true', dest='verbose',
+ help="spew out more details")
+ parser.add_option("-q", "--quiet",
+ action='store_false', dest='verbose',
+ help="spew out only success/failure of tests")
+ parser.add_option("--target-dir",
+ dest='target_dir', action='store', default='./',
+ help='target directory to look for tests in. default: %default')
+ parser.add_option("--debug",
+ dest='debug', action='store_true', default=False,
+ help='turn on debug output.')
+
+ (options, args) = parser.parse_args()
+
+ if options.debug or options.verbose:
+ tool_stdout = None
+ # gather the tests
+ tests = []
+ if len(args) == 0:
+ tests = crawl_tests(options.target_dir)
+ else:
+ tests = args
+ tests = purge_tests(tests)
+
+ # run the tests
+ if options.action == 'run':
+ for t in tests:
+ run_test(t)
+ elif options.action == 'clean':
+ for t in tests:
+ clean_test(t)
+
+def crawl_tests(target):
+ """Gather the directories in the test directory."""
+ files = os.listdir(target)
+ return [f for f in files if isdir(f) and f[0] != '.']
+
+def purge_tests(dirs):
+ """Look at the test candidates and purge those that aren't from the list"""
+ tests = []
+ for t in dirs:
+ if isfile(join(t, 'TestDef.py')):
+ tests.append(t)
+ else:
+ warn("{0} is not a test (missing TestDef.py file).".format(t))
+ return tests
+
+def warn(msg):
+ """A general warning function."""
+ if options.verbose:
+ print('[Warn]: ' + msg, file=sys.stderr)
+
+def notice(msg):
+ """A general print function."""
+ if options.verbose:
+ print(msg)
+
+def debug(msg):
+ """A debugging function"""
+ if options.debug:
+ print(msg)
+
+def run_test(t):
+ """Runs the test in directory t."""
+ opts = read_opts(t)
+ notice("-----------------------------------------------------")
+ notice("running test '{0}':\n".format(t))
+ readme = join(t, 'README')
+ if isfile(readme):
+ notice(open(readme).read())
+ notice("")
+ if opts['type'] not in available_types:
+ warn('{0} is not a recognised test type in {1}'.format(opts['type'], t))
+ return
+ if not opts['expect_success']:
+ warn("tests that fail intentionally are not yet supported.")
+ return
+
+ # set up the environment
+ setup_env(t, opts)
+ # run the test
+ try:
+ if opts['type'] == 'scons':
+ run_scons(t, opts)
+ except RuntimeError as e:
+ print("Test {0} failed.".format(t))
+ return
+
+ if not options.verbose:
+ print('.', end='')
+ sys.stdout.flush()
+ else:
+ print("test '{0}' successful.".format(t))
+
+def read_opts(t):
+ """Read the test options and return them."""
+ opts = {
+ 'expect_success' : True,
+ 'type' : 'scons',
+ 'links' : {}
+ }
+ f = open(join(t, "TestDef.py"))
+ exec(f.read(), opts)
+ return opts
+
+def setup_env(t, opts):
+ """Set up the environment for the test."""
+ # symlinks
+ links = opts['links']
+ for link in links:
+ frm = links[link]
+ to = join(t, link)
+ debug("Symlinking {0} to {1}".format(frm, to))
+ if islink(to):
+ os.unlink(to)
+ os.symlink(frm, to)
+
+def teardown_env(t, opts):
+ """Remove all files generated for the test."""
+ links = opts['links']
+ for link in links:
+ to = join(t, link)
+ debug('removing link {0}'.format(to))
+ os.unlink(to)
+
+def clean_test(t):
+ """Remove all generated files."""
+ opts = read_opts(t)
+ notice("cleaning test {0}".format(t))
+ if opts['type'] == 'scons':
+ setup_env(t, opts) # scons needs the environment links to work
+ clean_scons(t, opts)
+ teardown_env(t, opts)
+
+def clean_scons(t, opts):
+ """Make scons clean after itself."""
+ cwd = os.getcwd()
+ os.chdir(t)
+ try:
+ check_call(['scons', '--clean'], stdout=tool_stdout, stderr=None)
+ except CalledProcessError as e:
+ warn("SCons failed with error {0}".format(e.returncode))
+ os.chdir(cwd)
+ sconsign = join(t, '.sconsign.dblite')
+ if isfile(sconsign):
+ os.unlink(sconsign)
+
+def run_scons(t, opts):
+ """Run scons test."""
+ cwd = os.getcwd()
+ os.chdir(t)
+ try:
+ check_call(['scons', '--clean'], stdout=tool_stdout)
+ check_call(['scons', '.'], stdout=tool_stdout)
+ check_call(['scons', 'check'], stdout=tool_stdout)
+ except CalledProcessError as e:
+ os.chdir(cwd) # clean up
+ raise e
+ os.chdir(cwd)
+
+if __name__ == "__main__":
+ main()
+
+if not options.verbose:
+ print() # quiet doesn't output newlines.
--- /dev/null
+Tests whether expanding '#' to the top-level directory works as intended in
+scons.
+by: Gašper Ažman
--- /dev/null
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST='./../../../../bin/cxxtestgen'
+ )
+
+env['CXXTEST_SKIP_ERRORS'] = True
+env.CxxTest(['src/ThrowNoStd.h'])
+env.CxxTest(['src/AborterNoThrow.h'])
+env.CxxTest(['src/Comments.h'])
--- /dev/null
+
+links = {'src' : '../../../../test'}
--- /dev/null
+Tests whether we can swallow file nodes as sources as well as strings.
+by: Gašper Ažman
--- /dev/null
+env = Environment(toolpath=['../../'],tools=['default','cxxtest'])
+
+env.CxxTest('joint_tests',[Glob('src/*.t.h'), 'src/requirement.cpp'])
--- /dev/null
+
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file requirement.cpp
+ * Implementation of the requirement function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:09:42 AM
+ */
+
+#include "requirement.h"
+
+bool call_a_requirement() {
+ return true;
+}
--- /dev/null
+#ifndef REQUIREMENT_H
+#define REQUIREMENT_H
+/**
+ * @file requirement.h
+ * Prototype for the call_a_requirement() function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:08:35 AM
+ */
+
+bool call_a_requirement();
+
+#endif
--- /dev/null
+#ifndef TEST_BAR_T_H
+#define TEST_BAR_T_H
+/**
+ * @file test_bar.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:04:06 AM
+ */
+
+#include <cxxtest/TestSuite.h>
+#include "requirement.h"
+
+class TestBar : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+#ifndef TEST_FOO_T_H
+#define TEST_FOO_T_H
+/**
+ * @file test_foo.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:02:06 AM
+ */
+
+#include "requirement.h"
+#include <cxxtest/TestSuite.h>
+
+class TestFoo : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+Test for various things cxxtest failed to do, but now does.
+by: Edmundo López B.
--- /dev/null
+# What I want to do is the following:
+# I have my class files ending with .cc and
+# the main file ending with .cpp. This way it
+# very easy to do the following line just to
+# have all sources in that variable
+
+import os
+
+mySrc = Glob("*.cc")
+myFlags = ['-I.']
+
+myEnv = Environment( ENV = os.environ, tools = ['default', \
+ 'cxxtest'], toolpath=['../../'])
+
+# Here is the first problem I corrected:
+# Flags won't be correctly recognized by cxxtest
+myEnv.Replace(CXXFLAGS = myFlags)
+
+
+# Then I want to convert those sources to objects
+
+myObjs = myEnv.Object(mySrc)
+
+# Having the objects I can create my program
+# this way:
+
+myEnv.Program('hello', ['main.cpp'] + myObjs)
+
+# Now I want to do the same thing with the tests
+# target
+# With the non corrected version you'll get 2 errors:
+# The CXXFLAGS are not set correctly
+# It won't even accept this construction, which as you see
+# works perfectly with Program (and CxxTest should work like it)
+myEnv.CxxTest('helloTest', ['hellotest.t.h'] + myObjs)
--- /dev/null
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * \file
+ * Implementation of class.
+ */
+/****************************************************
+ * Author: Edmundo LOPEZ
+ * email: lopezed5@etu.unige.ch
+ *
+ * This code was written as a part of my bachelor
+ * thesis at the University of Geneva.
+ *
+ * $Id$
+ *
+ * **************************************************/
+
+#include <hello.hh>
+
+int
+Hello::foo(int x, int y)
+ {
+ return x + y;
+ }
--- /dev/null
+/**
+ * \file
+ * File containing a class
+ */
+/****************************************************
+ * Author: Edmundo LOPEZ
+ * email: lopezed5@etu.unige.ch
+ *
+ * **************************************************/
+
+class Hello
+ {
+ public:
+ int foo(int x, int y);
+ };
--- /dev/null
+/**
+ * \file
+ * The test file.
+ */
+/****************************************************
+ * Author: Edmundo LOPEZ
+ * email: lopezed5@etu.unige.ch
+ *
+ * **************************************************/
+
+#include <cxxtest/TestSuite.h>
+#include <hello.hh>
+
+
+class helloTestSuite : public CxxTest::TestSuite
+ {
+ public:
+ void testFoo()
+ {
+ Hello h;
+ TS_ASSERT_EQUALS (h.foo(2,2), 4);
+ }
+ };
--- /dev/null
+/**
+ * \file
+ * Main function comes here.
+ */
+/****************************************************
+ * Author: Edmundo LOPEZ
+ * email: lopezed5@etu.unige.ch
+ *
+ * **************************************************/
+
+#include <hello.hh>
+#include <iostream>
+
+int main (int argc, char *argv[])
+ {
+ Hello h;
+ std::cout << h.foo(2,3) << std::endl;
+ }
--- /dev/null
+Tests:
+ - if CXXTEST_CXXFLAGS_REMOVE and CXXTEST_CCFLAGS_REMOVE flags work,
+ - if CCFLAGS and CXXFLAGS vars work.
--- /dev/null
+flags = '-pedantic-errors -Weffc++ -Wall -Wextra -ansi'
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CCFLAGS=flags,
+ CXXFLAGS=flags,
+ CXXTEST_CXXFLAGS_REMOVE=['-pedantic-errors','-Weffc++','-Wextra','-Wall','-W'],
+ CXXTEST_CCFLAGS_REMOVE=['-pedantic-errors','-Weffc++','-Wextra','-Wall','-W']
+ )
+
+env.CxxTest(['src/not-with-pedantic.h'])
+env.CxxTest(['src/only_with_ansi.t.h'])
--- /dev/null
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file not-with-pedantic.h
+ * Compiles, but not with -pedantic.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-09-30 13:33:50
+ */
+
+
+#include <cxxtest/TestSuite.h>
+
+class TestPedantic : public CxxTest::TestSuite
+{
+public:
+ void testPedanticPresent() {
+ TS_ASSERT(true);
+ int f = (true)?:5;
+ }
+};
--- /dev/null
+/**
+ * @file only_with_ansi.t.h
+ * This test only runs correctly if -ansi was supplied as a g++ switch.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2009-02-11 06:26:59 PM
+ */
+
+#include <cxxtest/TestSuite.h>
+
+class TestAnsi : public CxxTest::TestSuite
+{
+public:
+ void testAnsiPresent() {
+#ifdef __STRICT_ANSI__
+ TS_ASSERT(true);
+#else
+ TS_ASSERT(false);
+#endif
+ }
+};
--- /dev/null
+This test tests whether variables that are put into the environment after it has
+been initialised work as expected.
+
+If they do not, -pedantic-errors will appear in the gcc commandline and the
+compilation WILL FAIL, failing the test.
--- /dev/null
+flags = '-Weffc++ -Wall -Wextra -std=gnu++0x'
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CCFLAGS = Split(flags) + ['-pedantic-errors'],
+ CXXFLAGS = Split(flags) + ['-pedantic-errors']
+ )
+
+env['CXXTEST_CXXFLAGS_REMOVE']=['-Weffc++','-Wextra','-Wall','-W']
+env['CXXTEST_CCFLAGS_REMOVE']='-Weffc++ -Wextra -Wall -W'
+env['CCFLAGS'] = flags
+env['CXXFLAGS'] = flags
+env['CXXTEST_SKIP_ERRORS'] = True
+
+env.CxxTest(['src/not-with-pedantic.h'])
+
--- /dev/null
+
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file not-with-pedantic.h
+ * Compiles, but not with -pedantic.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-09-30 13:33:50
+ */
+
+
+#include <cxxtest/TestSuite.h>
+
+class TestPedantic : public CxxTest::TestSuite
+{
+public:
+ void testPedanticPresent() {
+ int f = (true)?:5;
+ }
+};
--- /dev/null
+env = Environment(toolpath=['../../'],tools=['default','cxxtest'])
+
+env.CxxTest('joint_tests',
+ Split('src/test_foo.t.h '
+ 'src/test_bar.t.h '
+ 'src/requirement.cpp'
+ )
+ )
--- /dev/null
+
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file requirement.cpp
+ * Implementation of the requirement function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:09:42 AM
+ */
+
+#include "requirement.h"
+
+bool call_a_requirement() {
+ return true;
+}
--- /dev/null
+#ifndef REQUIREMENT_H
+#define REQUIREMENT_H
+/**
+ * @file requirement.h
+ * Prototype for the call_a_requirement() function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:08:35 AM
+ */
+
+bool call_a_requirement();
+
+#endif
--- /dev/null
+#ifndef TEST_BAR_T_H
+#define TEST_BAR_T_H
+/**
+ * @file test_bar.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:04:06 AM
+ */
+
+#include <cxxtest/TestSuite.h>
+#include "requirement.h"
+
+class TestBar : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+#ifndef TEST_FOO_T_H
+#define TEST_FOO_T_H
+/**
+ * @file test_foo.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:02:06 AM
+ */
+
+#include "requirement.h"
+#include <cxxtest/TestSuite.h>
+
+class TestFoo : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST_INSTALL_DIR = '../../../../',
+ CPPPATH = ['src/cpppathdir/']
+ )
+
+env.CxxTest(['src/cpppath.t.h'])
--- /dev/null
+#ifndef CPPPATH_T_H
+#define CPPPATH_T_H
+
+/**
+ * @file cpppath.t.h
+ * This file needs the include in the include dir.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:16:46 AM
+ */
+
+// actual path cpppathdir/include.h
+#include "include.h"
+#include <cxxtest/TestSuite.h>
+
+class CppPathTest : public CxxTest::TestSuite
+{
+public:
+ void test_i_need_me_exists() {
+ TS_ASSERT(i_need_me() == 0);
+ }
+};
+
+#endif
--- /dev/null
+#ifndef INCLUDE_H
+#define INCLUDE_H
+/**
+ * @file include.h
+ * Include file for this test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:15:40 AM
+ */
+
+int i_need_me() {
+ return 0;
+}
+
+#endif
--- /dev/null
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST_INSTALL_DIR = '../../../../'
+ )
+
+env['CXXTEST_SKIP_ERRORS'] = True
+env.CxxTest(['src/ThrowNoStd.h'])
+env.CxxTest(['src/AborterNoThrow.h'])
+env.CxxTest(['src/Comments.h'])
--- /dev/null
+
+links = {'src' : '../../../../test/'}
--- /dev/null
+
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST_INSTALL_DIR = '../../../../',
+ )
+
+env.CxxTest(['src/failtest.t.h'], CPPPATH=['#'], CXXTEST_RUNNER="CrazyRunner")
--- /dev/null
+#ifndef __cxxtest_CrazyRunner_h__
+#define __cxxtest_CrazyRunner_h__
+
+
+/*
+ * This is not a proper runner. Just a simple class that looks like one.
+ */
+namespace CxxTest {
+ class CrazyRunner {
+ public:
+ int run() { return 0; }
+ void process_commandline(int argc, char** argv) { }
+ };
+}
+
+#endif
--- /dev/null
+#ifndef FAILTEST_T_H
+#define FAILTEST_T_H
+
+/**
+ * @file failtest.t.h
+ * This test will succed only with a CrazyRunner.
+ *
+ * @author
+ * @version 1.0
+ * @since jue ago 28 14:18:57 ART 2008
+ */
+
+#include <cxxtest/TestSuite.h>
+
+class CppPathTest : public CxxTest::TestSuite
+{
+public:
+ void test_i_will_fail() {
+ TS_ASSERT(false);
+ }
+};
+
+#endif
--- /dev/null
+Tests whether we can swallow recursively supplied sources - a list of lists, for
+instance.
--- /dev/null
+env = Environment(toolpath=['../../'],tools=['default','cxxtest'])
+
+env.CxxTest('joint_tests',['src/test_foo.t.h',['src/test_bar.t.h','src/requirement.cpp']])
--- /dev/null
+links = {'cxxtest' : '../../../../'}
--- /dev/null
+/**
+ * @file requirement.cpp
+ * Implementation of the requirement function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:09:42 AM
+ */
+
+#include "requirement.h"
+
+bool call_a_requirement() {
+ return true;
+}
--- /dev/null
+#ifndef REQUIREMENT_H
+#define REQUIREMENT_H
+/**
+ * @file requirement.h
+ * Prototype for the call_a_requirement() function.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:08:35 AM
+ */
+
+bool call_a_requirement();
+
+#endif
--- /dev/null
+#ifndef TEST_BAR_T_H
+#define TEST_BAR_T_H
+/**
+ * @file test_bar.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:04:06 AM
+ */
+
+#include <cxxtest/TestSuite.h>
+#include "requirement.h"
+
+class TestBar : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+#ifndef TEST_FOO_T_H
+#define TEST_FOO_T_H
+/**
+ * @file test_foo.t.h
+ * Test one for the joint test ehm, test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-29 10:02:06 AM
+ */
+
+#include "requirement.h"
+#include <cxxtest/TestSuite.h>
+
+class TestFoo : public CxxTest::TestSuite
+{
+public:
+ void test_foo() {
+ TS_ASSERT(call_a_requirement());
+ }
+};
+
+#endif
--- /dev/null
+
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST_INSTALL_DIR = '../../../../',
+ CPPPATH = 'src/cpppathdir/'
+ )
+
+env.CxxTest(['src/cpppath.t.h'])
--- /dev/null
+#ifndef CPPPATH_T_H
+#define CPPPATH_T_H
+
+/**
+ * @file cpppath.t.h
+ * This file needs the include in the include dir.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:16:46 AM
+ */
+
+// actual path cpppathdir/include.h
+#include "include.h"
+#include <cxxtest/TestSuite.h>
+
+class CppPathTest : public CxxTest::TestSuite
+{
+public:
+ void test_i_need_me_exists() {
+ TS_ASSERT(i_need_me() == 0);
+ }
+};
+
+#endif
--- /dev/null
+#ifndef INCLUDE_H
+#define INCLUDE_H
+/**
+ * @file include.h
+ * Include file for this test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:15:40 AM
+ */
+
+int i_need_me() {
+ return 0;
+}
+
+#endif
--- /dev/null
+
+env = Environment(
+ toolpath=['../../'],
+ tools=['default','cxxtest'],
+ CXXTEST_INSTALL_DIR = '../../../../',
+ CPPPATH = ['src/cpppathdir/']
+ )
+
+env.CxxTest('src/cpppath')
--- /dev/null
+#ifndef CPPPATH_T_H
+#define CPPPATH_T_H
+
+/**
+ * @file cpppath.t.h
+ * This file needs the include in the include dir.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:16:46 AM
+ */
+
+// actual path cpppathdir/include.h
+#include "include.h"
+#include <cxxtest/TestSuite.h>
+
+class CppPathTest : public CxxTest::TestSuite
+{
+public:
+ void test_i_need_me_exists() {
+ TS_ASSERT(i_need_me() == 0);
+ }
+};
+
+#endif
--- /dev/null
+#ifndef INCLUDE_H
+#define INCLUDE_H
+/**
+ * @file include.h
+ * Include file for this test.
+ *
+ * @author Gašper Ažman (GA), gasper.azman@gmail.com
+ * @version 1.0
+ * @since 2008-08-28 11:15:40 AM
+ */
+
+int i_need_me() {
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 int line() const = 0;
+ virtual const char *testName() const = 0;
+ virtual const char *suiteName() const = 0;
+
+ virtual void run() = 0;
+ virtual bool setUp() = 0;
+ virtual bool tearDown() = 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 int 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;
+
+ virtual bool setUp() = 0;
+ virtual bool tearDown() = 0;
+ };
+
+ class WorldDescription : public Link
+ {
+ public:
+ virtual ~WorldDescription();
+
+ virtual const char *worldName() const { return "cxxtest"; }
+ 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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#include <cxxtest/DummyDescriptions.h>
+
+namespace CxxTest
+{
+ DummyTestDescription::DummyTestDescription() {}
+
+ const char *DummyTestDescription::file() const { return "<no file>"; }
+ int 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>"; }
+ int 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;}
+}
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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;
+ int 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;
+ int 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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 on 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>
+#include <cstdio>
+
+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) << ".";
+ _o->flush();
+ fflush(stdout);
+ _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, int line, const char *expression )
+ {
+ stop( file, line ) << "Trace: " <<
+ expression << endl;
+ }
+
+ void warning( const char *file, int line, const char *expression )
+ {
+ stop( file, line ) << "Warning: " <<
+ expression << endl;
+ }
+
+ void failedTest( const char *file, int line, const char *expression )
+ {
+ stop( file, line ) << "Error: Test failed: " <<
+ expression << endl;
+ }
+
+ void failedAssert( const char *file, int line, const char *expression )
+ {
+ stop( file, line ) << "Error: Assertion failed: " <<
+ expression << endl;
+ }
+
+ void failedAssertEquals( const char *file, int 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, int 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 failedAssertSameFiles( const char* file, int line,
+ const char*, const char*,
+ const char* explanation
+ )
+ {
+ stop( file, line ) << "Error: " << explanation << endl;
+ }
+
+ void failedAssertDelta( const char *file, int 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, int 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, int 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, int 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, int 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, int 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, int 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, int 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, int 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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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
+# if defined(__LONG_LONG_MAX__) && !defined(__cplusplus)
+# define _CXXTEST_LONGLONG long long
+# endif
+#endif // __GNUC__
+
+#ifdef __DMC__ // Digital Mars
+# ifndef _CXXTEST_OLD_STD
+# define _CXXTEST_OLD_STD
+# endif
+#endif
+
+#ifdef __SUNPRO_CC // Sun Studio C++
+# if __SUNPRO_CC >= 0x510
+# ifndef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+# define _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+# endif
+# endif
+#endif
+
+#ifdef __xlC__ // IBM XL C/C++
+// Partial specialization may be supported before 7.0.0.3, but it is
+// definitely supported after.
+# if __xlC__ >= 0x0700
+# ifndef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+# define _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+# endif
+# endif
+#endif
+
+#endif // __cxxtest__Flags_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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*/, int /*line*/, const char * /*expression*/ )
+ {
+ yellowBarSafe();
+ }
+
+ void failedTest( const char * /*file*/, int /*line*/, const char * /*expression*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssert( const char * /*file*/, int /*line*/, const char * /*expression*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertEquals( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertSameData( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*sizeStr*/, const void * /*x*/,
+ const void * /*y*/, unsigned /*size*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertDelta( const char * /*file*/, int /*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*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*value*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertLessThan( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertLessThanEquals( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertPredicate( const char * /*file*/, int /*line*/,
+ const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertRelation( const char * /*file*/, int /*line*/,
+ const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertThrows( const char * /*file*/, int /*line*/,
+ const char * /*expression*/, const char * /*type*/,
+ bool /*otherThrown*/ )
+ {
+ redBarSafe();
+ }
+
+ void failedAssertThrowsNot( const char * /*file*/, int /*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() : _argc(0), _argv(0) {}
+
+ void process_commandline( 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
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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;
+
+ 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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__Mock_h__
+#define __cxxtest__Mock_h__
+
+namespace dummy_mock_ns {}
+
+//
+// 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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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 ) \
+ using namespace dummy_mock_ns
+
+#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; } } using namespace dummy_mock_ns
+
+#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
+ namespace CXXTEST_MOCK_NAMESPACE { void NAME ARGS { REAL CALL; } } using namespace dummy_mock_ns
+
+#else
+//
+// Ordinary header file: Just prototypes
+//
+
+#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
+ __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
+ using namespace dummy_mock_ns
+
+#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
+ __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
+ using namespace dummy_mock_ns
+
+#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
+ __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
+ using namespace dummy_mock_ns
+
+#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
+ __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
+ using namespace dummy_mock_ns
+
+#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; } \
+ }; \
+ } using namespace dummy_mock_ns
+
+#endif // __cxxtest__Mock_h__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 {
+ bool ok = false;
+ _TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from setUp()", suite()->setUp(); ok=true );
+ if (ok == false) return ok;
+ }
+ _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(); }
+ int 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; }
+ int 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();
+ if (tracker().testFailed()) {
+ tracker().initialize();
+ ok = false;
+ }
+ }
+ _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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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;
+ int 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;
+ int _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;
+ int 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;
+ int _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();
+ const char *worldName() const { return _worldName;}
+ 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 );
+
+ static const char *_worldName;
+ };
+
+ void activateAllTests();
+ bool leaveOnly( const char *suiteName, const char *testName = 0 );
+}
+
+#endif // __cxxtest__RealDescriptions_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest_SelfTest_h__
+#define __cxxtest_SelfTest_h__
+
+#define CXXTEST_SUITE(name)
+#define CXXTEST_CODE(member)
+
+#endif // __cxxtest_SelfTest_h__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__StdTestSuite_h__
+#define __cxxtest__StdTestSuite_h__
+
+//
+// This provides explicit partial specializations for STL-based
+// TestSuite comparison functions
+//
+
+namespace CxxTest {
+
+#ifdef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
+template<class X, class Y, class D>
+struct delta<std::vector<X>, std::vector<Y>, D>
+{
+ static bool test(std::vector<X> x, std::vector<Y> y, D d)
+ {
+ if ( x.size() != y.size() )
+ return false;
+ for(size_t i = 0; i<x.size(); ++i)
+ if ( ! delta<X,Y,D>::test(x[i], y[i], d) )
+ return false;
+ return true;
+ }
+};
+
+template<class X, class Y, class D>
+struct delta<std::list<X>, std::list<Y>, D>
+{
+ static bool test(std::list<X> x, std::list<Y> y, D d)
+ {
+ typename std::list<X>::const_iterator x_it = x.begin();
+ typename std::list<Y>::const_iterator y_it = y.begin();
+ for(; x_it != x.end(); ++x_it, ++y_it)
+ {
+ if ( y_it == y.end() )
+ return false;
+ if ( ! delta<X,Y,D>::test(*x_it, *y_it, d) )
+ return false;
+ }
+ return y_it == y.end();
+ }
+};
+
+#endif
+
+} // namespace CxxTest
+
+#endif // __cxxtest__StdTestSuite_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 )
+ {
+ if ( first == last ) {
+ s << "{}";
+ return;
+ }
+
+ s << "{ ";
+ while ( first != last ) {
+ s << TS_AS_STRING(*first);
+ if ( ++ first != last )
+ s << ", ";
+ }
+ s << " }";
+ }
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__TeeListener_h__
+#define __cxxtest__TeeListener_h__
+
+//
+// A TeeListener notifies two "regular" 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, int line, const char *expression )
+ {
+ _first->trace( file, line, expression );
+ _second->trace( file, line, expression );
+ }
+
+ void warning( const char *file, int line, const char *expression )
+ {
+ _first->warning( file, line, expression );
+ _second->warning( file, line, expression );
+ }
+
+ void failedTest( const char *file, int line, const char *expression )
+ {
+ _first->failedTest( file, line, expression );
+ _second->failedTest( file, line, expression );
+ }
+
+ void failedAssert( const char *file, int line, const char *expression )
+ {
+ _first->failedAssert( file, line, expression );
+ _second->failedAssert( file, line, expression );
+ }
+
+ void failedAssertEquals( const char *file, int 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, int 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 failedAssertSameFiles( const char* file, int line, const char* file1, const char* file2, const char* explanation)
+ {
+ _first->failedAssertSameFiles( file, line, file1, file2, explanation );
+ _second->failedAssertSameFiles( file, line, file1, file2, explanation );
+ }
+
+ void failedAssertDelta( const char *file, int 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, int 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, int 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, int 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, int 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, int 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, int 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, int 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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 process_commandline(int& /*argc*/, char** /*argv*/) {}
+
+ virtual void enterWorld( const WorldDescription & /*desc*/ ) {}
+ virtual void enterSuite( const SuiteDescription & /*desc*/ ) {}
+ virtual void enterTest( const TestDescription & /*desc*/ ) {}
+ virtual void trace( const char * /*file*/, int /*line*/,
+ const char * /*expression*/ ) {}
+ virtual void warning( const char * /*file*/, int /*line*/,
+ const char * /*expression*/ ) {}
+ virtual void failedTest( const char * /*file*/, int /*line*/,
+ const char * /*expression*/ ) {}
+ virtual void failedAssert( const char * /*file*/, int /*line*/,
+ const char * /*expression*/ ) {}
+ virtual void failedAssertEquals( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ ) {}
+ virtual void failedAssertSameData( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*sizeStr*/, const void * /*x*/,
+ const void * /*y*/, unsigned /*size*/ ) {}
+ virtual void failedAssertDelta( const char * /*file*/, int /*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*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*value*/ ) {}
+ virtual void failedAssertLessThan( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ ) {}
+ virtual void failedAssertLessThanEquals( const char * /*file*/, int /*line*/,
+ const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ ) {}
+ virtual void failedAssertPredicate( const char * /*file*/, int /*line*/,
+ const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ ) {}
+ virtual void failedAssertRelation( const char * /*file*/, int /*line*/,
+ const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/,
+ const char * /*x*/, const char * /*y*/ ) {}
+ virtual void failedAssertThrows( const char * /*file*/, int /*line*/,
+ const char * /*expression*/, const char * /*type*/,
+ bool /*otherThrown*/ ) {}
+ virtual void failedAssertThrowsNot( const char * /*file*/, int /*line*/,
+ const char * /*expression*/ ) {}
+ virtual void failedAssertSameFiles( const char* /*file*/, int /*line*/,
+ const char* , const char*, const char* ) {}
+ virtual void leaveTest( const TestDescription & /*desc*/ ) {}
+ virtual void leaveSuite( const SuiteDescription & /*desc*/ ) {}
+ virtual void leaveWorld( const WorldDescription & /*desc*/ ) {}
+ };
+}
+
+#endif // __cxxtest__TestListener_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __CxxTestMain_h
+#define __CxxTestMain_h
+
+#include <cxxtest/TestTracker.h>
+#include <cxxtest/Flags.h>
+
+#ifndef _CXXTEST_HAVE_STD
+# define _CXXTEST_HAVE_STD
+#endif // _CXXTEST_HAVE_STD
+
+#include <cxxtest/StdValueTraits.h>
+
+#ifdef _CXXTEST_OLD_STD
+# include <iostream.h>
+# include <string.h>
+#else // !_CXXTEST_OLD_STD
+# include <iostream>
+# include <cstring>
+#endif // _CXXTEST_OLD_STD
+
+namespace CxxTest
+{
+
+inline void print_help(const char* name)
+{
+ CXXTEST_STD(cerr) << name << " <suitename>" << CXXTEST_STD(endl);
+ CXXTEST_STD(cerr) << name << " <suitename> <testname>" << CXXTEST_STD(endl);
+ CXXTEST_STD(cerr) << name << " -h" << CXXTEST_STD(endl);
+ CXXTEST_STD(cerr) << name << " --help" << CXXTEST_STD(endl);
+ CXXTEST_STD(cerr) << name << " --help-tests" << CXXTEST_STD(endl);
+ CXXTEST_STD(cerr) << name << " -v Enable tracing output." << CXXTEST_STD(endl);
+}
+
+
+template <class TesterT>
+int Main(TesterT& tmp, int argc, char* argv[])
+{
+//
+// Parse the command-line arguments. The default behavior is to run all tests
+//
+// This is a primitive parser, but I'm not sure what sort of portable
+// parser should be used in cxxtest.
+//
+
+//
+// Print command-line syntax
+//
+for (int i=1; i<argc; i++) {
+ if ((CXXTEST_STD(strcmp)(argv[i],"-h")==0) || (CXXTEST_STD(strcmp)(argv[i],"--help")==0)) {
+ print_help(argv[0]);
+ return 0;
+ } else if ((CXXTEST_STD(strcmp)(argv[1],"--help-tests")==0)) {
+ CXXTEST_STD(cout) << "Suite/Test Names" << CXXTEST_STD(endl);
+ CXXTEST_STD(cout) << "---------------------------------------------------------------------------" << CXXTEST_STD(endl);
+ for ( SuiteDescription *sd = RealWorldDescription().firstSuite(); sd; sd = sd->next() )
+ for ( TestDescription *td = sd->firstTest(); td; td = td->next() )
+ CXXTEST_STD(cout) << td->suiteName() << " " << td->testName() << CXXTEST_STD(endl);
+ return 0;
+ }
+}
+
+//
+// Process command-line options here.
+//
+while ((argc > 1) && (argv[1][0] == '-')) {
+ if (CXXTEST_STD(strcmp)(argv[1],"-v") == 0) {
+ tracker().print_tracing = true;
+ }
+ else {
+ CXXTEST_STD(cerr) << "ERROR: unknown option '" << argv[1] << "'" << CXXTEST_STD(endl);
+ return -1;
+ }
+ for (int i=1; i<(argc-1); i++)
+ argv[i] = argv[i+1];
+ argc--;
+ }
+
+//
+// Run experiments
+//
+bool status=false;
+if ((argc==2) && (argv[1][0] != '-')) {
+ status=leaveOnly(argv[1]);
+ if (!status) {
+ CXXTEST_STD(cerr) << "ERROR: unknown suite '" << argv[1] << "'" << CXXTEST_STD(endl);
+ return -1;
+ }
+ }
+if ((argc==3) && (argv[1][0] != '-')) {
+ status=leaveOnly(argv[1],argv[2]);
+ if (!status) {
+ CXXTEST_STD(cerr) << "ERROR: unknown test '" << argv[1] << "::" << argv[2] << "'" << CXXTEST_STD(endl);
+ return -1;
+ }
+ }
+
+tmp.process_commandline(argc,argv);
+return tmp.run();
+}
+
+}
+#endif
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__TestSuite_cpp__
+#define __cxxtest__TestSuite_cpp__
+
+#include <cxxtest/TestSuite.h>
+#if defined(_CXXTEST_HAVE_STD)
+#include <fstream>
+#endif
+
+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, int line, const char *message )
+ {
+ if (tracker().print_tracing) {
+ tracker().trace( file, line, message );
+ }
+ }
+
+ void doWarn( const char *file, int line, const char *message )
+ {
+ tracker().warning( file, line, message );
+ }
+
+ void doFailTest( const char *file, int line, const char *message )
+ {
+ tracker().failedTest( file, line, message );
+ TS_ABORT();
+ }
+
+ void doFailAssert( const char *file, int 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, int 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();
+ }
+ }
+
+//#if defined(_CXXTEST_HAVE_STD)
+ bool sameFiles( const char* file1, const char* file2, std::ostringstream& explanation)
+ {
+ std::string ppprev_line;
+ std::string pprev_line;
+ std::string prev_line;
+ std::string curr_line;
+
+ std::ifstream is1;
+ is1.open(file1);
+ std::ifstream is2;
+ is2.open(file2);
+ if (!is1) {
+ explanation << "File '" << file1 << "' does not exist!";
+ return false;
+ }
+ if (!is2) {
+ explanation << "File '" << file2 << "' does not exist!";
+ return false;
+ }
+
+ int nline=1;
+ char c1, c2;
+ while (1) {
+ is1.get(c1);
+ is2.get(c2);
+ if (!is1 && !is2) return true;
+ if (!is1) {
+ explanation << "File '" << file1 << "' ended before file '" << file2 << "' (line " << nline << ")";
+ explanation << std::endl << "= " << ppprev_line << std::endl << "= " << pprev_line << std::endl << "= " << prev_line << std::endl << "< " << curr_line;
+ is1.get(c1);
+ while (is1 && (c1 != '\n')) {
+ explanation << c1;
+ is1.get(c1);
+ }
+ explanation << std::endl;
+ return false;
+ }
+ if (!is2) {
+ explanation << "File '" << file2 << "' ended before file '" << file1 << "' (line " << nline << ")";
+ explanation << std::endl << "= " << ppprev_line << std::endl << "= " << pprev_line << std::endl << "= " << prev_line << std::endl << "> " << curr_line;
+ is2.get(c2);
+ while (is2 && (c2 != '\n')) {
+ explanation << c2;
+ is2.get(c2);
+ }
+ explanation << std::endl;
+ return false;
+ }
+ if (c1 != c2) {
+ explanation << "Files '" << file1 << "' and '" << file2 << "' differ at line " << nline;
+ explanation << std::endl << "= " << ppprev_line << std::endl << "= " << pprev_line << std::endl << "= " << prev_line;
+
+ explanation << std::endl << "< " << curr_line;
+ is2.get(c1);
+ while (is1 && (c1 != '\n')) {
+ explanation << c1;
+ is2.get(c1);
+ }
+ explanation << std::endl;
+
+ explanation << std::endl << "> " << curr_line;
+ is2.get(c2);
+ while (is2 && (c2 != '\n')) {
+ explanation << c2;
+ is2.get(c2);
+ }
+ explanation << std::endl;
+
+ return false;
+ }
+ if (c1 == '\n') {
+ ppprev_line = pprev_line;
+ pprev_line = prev_line;
+ prev_line = curr_line;
+ curr_line = "";
+ nline++;
+ }
+ else {
+ curr_line += c1;
+ }
+ }
+ }
+//#endif
+
+ void doAssertSameFiles( const char* file, int line,
+ const char* file1, const char* file2,
+ const char* message)
+ {
+#if defined(_CXXTEST_HAVE_STD)
+ std::ostringstream explanation;
+ if ( !sameFiles( file1, file2, explanation ) ) {
+ if ( message )
+ tracker().failedTest( file, line, message );
+ tracker().failedAssertSameFiles( file, line, file1, file2, explanation.str().c_str());
+ TS_ABORT();
+ }
+#else
+ tracker().failedAssertSameFiles( file, line, file1, file2, "This test is only supported when --have-std is enabled");
+ TS_ABORT();
+#endif
+ }
+
+ void doFailAssertThrows( const char *file, int line,
+ const char *expr, const char *type,
+ bool otherThrown,
+ const char *message,
+ const char *exception )
+ {
+ if ( exception )
+ tracker().failedTest( file, line, exception );
+ if ( message )
+ tracker().failedTest( file, line, message );
+
+ tracker().failedAssertThrows( file, line, expr, type, otherThrown );
+ TS_ABORT();
+ }
+
+ void doFailAssertThrowsNot( const char *file, int line,
+ const char *expression, const char *message,
+ const char *exception )
+ {
+ if ( exception )
+ tracker().failedTest( file, line, exception );
+ if ( message )
+ tracker().failedTest( file, line, message );
+
+ tracker().failedAssertThrowsNot( file, line, expression );
+ TS_ABORT();
+ }
+}
+
+#endif // __cxxtest__TestSuite_cpp__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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>
+#include <sstream>
+
+#if defined(_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, int line, const char *message );
+ void doWarn( const char *file, int line, const char *message );
+ void doFailTest( const char *file, int line, const char *message );
+ void doFailAssert( const char *file, int line, const char *expression, const char *message );
+
+ template<class X, class Y>
+ struct equals {
+ static bool test( X x, Y y )
+ {
+ return (x == y);
+ }
+ };
+
+ template<class X, class Y>
+ void doAssertEquals( const char *file, int line,
+ const char *xExpr, X x,
+ const char *yExpr, Y y,
+ const char *message )
+ {
+ if ( !equals<X,Y>::test( 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();
+ }
+ }
+
+ bool sameData( const void *x, const void *y, unsigned size );
+
+ void doAssertSameData( const char *file, int line,
+ const char *xExpr, const void *x,
+ const char *yExpr, const void *y,
+ const char *sizeExpr, unsigned size,
+ const char *message );
+
+//#if defined(_CXXTEST_HAVE_STD)
+ bool sameFiles( const char* file1, const char* file2, std::ostringstream& explanation);
+//#endif
+
+ template<class X, class Y>
+ struct differs {
+ static bool test( X x, Y y )
+ {
+ return !(x == y);
+ }
+ };
+
+ template<class X, class Y>
+ void doAssertDiffers( const char *file, int line,
+ const char *xExpr, X x,
+ const char *yExpr, Y y,
+ const char *message )
+ {
+ if ( !differs<X,Y>::test( 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>
+ struct lessThan {
+ static bool test( X x, Y y )
+ {
+ return (x < y);
+ }
+ };
+
+ template<class X, class Y>
+ void doAssertLessThan( const char *file, int line,
+ const char *xExpr, X x,
+ const char *yExpr, Y y,
+ const char *message )
+ {
+ if ( !lessThan<X,Y>::test(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>
+ struct lessThanEquals {
+ static bool test( X x, Y y )
+ {
+ return (x <= y);
+ }
+ };
+
+ template<class X, class Y>
+ void doAssertLessThanEquals( const char *file, int line,
+ const char *xExpr, X x,
+ const char *yExpr, Y y,
+ const char *message )
+ {
+ if ( !lessThanEquals<X,Y>::test( 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, int 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, int 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();
+ }
+ }
+
+ // An indirection template so the compiler can determine what type
+ // "X +/- D" should be
+ template<class X, class Y>
+ bool delta_le_helper( X x, Y y )
+ {
+ return lessThanEquals<X,Y>::test(x,y);
+ }
+
+ template<class X, class Y, class D>
+ struct delta {
+ static bool test( X x, Y y, D d )
+ {
+ return delta_le_helper(x-d, y) && delta_le_helper(y, x+d);
+ //(y >= x - d) && (y <= x + d));
+ }
+ };
+
+ template<class X, class Y, class D>
+ void doAssertDelta( const char *file, int line,
+ const char *xExpr, X x,
+ const char *yExpr, Y y,
+ const char *dExpr, D d,
+ const char *message )
+ {
+ if ( !delta<X,Y,D>::test( 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, int line,
+ const char *expr, const char *type,
+ bool otherThrown,
+ const char *message,
+ const char *exception = 0 );
+
+ void doFailAssertThrowsNot( const char *file, int line,
+ const char *expression, const char *message,
+ const char *exception = 0 );
+
+ void doAssertSameFiles( const char* file, int line,
+ const char* file1, const char* file2,
+ 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); TS_ABORT(); } )
+# ifdef _CXXTEST_HAVE_STD
+# define _TS_CATCH_STD(e,b) _TS_CATCH_TYPE( (const std::exception& e), b )
+# else // !_CXXTEST_HAVE_STD
+# define _TS_CATCH_STD(e,b)
+# endif // _CXXTEST_HAVE_STD
+# define ___TSM_CATCH(f,l,m) \
+ _TS_CATCH_STD(e, { (CxxTest::tracker()).failedTest(f,l,e.what()); TS_ABORT(); }) \
+ _TSM_LAST_CATCH(f,l,m)
+# 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_STD(e,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_SAME_FILES
+# define ___ETS_ASSERT_SAME_FILES(f,l,x,y,m) CxxTest::doAssertSameFiles( (f), (l), (x), (y), (m) )
+# define ___TS_ASSERT_SAME_FILES(f,l,x,y,m) { _TS_TRY { ___ETS_ASSERT_SAME_FILES(f,l,x,y,m); } __TS_CATCH(f,l) }
+
+# define _ETS_ASSERT_SAME_FILES(f,l,x,y) ___ETS_ASSERT_SAME_FILES(f,l,x,y,0)
+# define _TS_ASSERT_SAME_FILES(f,l,x,y) ___TS_ASSERT_SAME_FILES(f,l,x,y,0)
+
+# define ETS_ASSERT_SAME_FILES(x,y) _ETS_ASSERT_SAME_FILES(__FILE__,__LINE__,x,y)
+# define TS_ASSERT_SAME_FILES(x,y) _TS_ASSERT_SAME_FILES(__FILE__,__LINE__,x,y)
+
+# define _ETSM_ASSERT_SAME_FILES(f,l,m,x,y) ___ETS_ASSERT_SAME_FILES(f,l,x,y,TS_AS_STRING(m))
+# define _TSM_ASSERT_SAME_FILES(f,l,m,x,y) ___TS_ASSERT_SAME_FILES(f,l,x,y,TS_AS_STRING(m))
+
+# define ETSM_ASSERT_SAME_FILES(m,x,y) _ETSM_ASSERT_SAME_FILES(__FILE__,__LINE__,m,x,y)
+# define TSM_ASSERT_SAME_FILES(m,x,y) _TSM_ASSERT_SAME_FILES(__FILE__,__LINE__,m,x,y)
+
+
+ // TS_ASSERT_THROWS
+# define ___TS_ASSERT_THROWS(f,l,e,t,m) ___TS_ASSERT_THROWS_ASSERT(f,l,e,t,(void)0,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_CATCH_STD( ex, { _ts_threw_expected = true; CxxTest::doFailAssertThrows((f), (l), #e, #t, true, (m), ex.what() ); } ) \
+ _TS_LAST_CATCH( { _ts_threw_else = true; } ) \
+ if ( !_ts_threw_expected ) { CxxTest::doFailAssertThrows( (f), (l), #e, #t, _ts_threw_else, (m), 0 ); } }
+
+# 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_CATCH_STD(ex, { CxxTest::doFailAssertThrowsNot( (f), (l), #e, (m), ex.what() ); } ) \
+ _TS_LAST_CATCH( { CxxTest::doFailAssertThrowsNot( (f), (l), #e, (m), 0 ); } ) }
+
+# 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) \
+ template<> struct equals<CXXTEST_X,CXXTEST_Y> { \
+ static bool test(CXXTEST_X x,CXXTEST_Y y) { \
+ return equals<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct equals<CXXTEST_Y,CXXTEST_X> { \
+ static bool test(CXXTEST_Y x,CXXTEST_X y) { \
+ return equals<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct differs<CXXTEST_X,CXXTEST_Y> { \
+ static bool test(CXXTEST_X x,CXXTEST_Y y) { \
+ return differs<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct differs<CXXTEST_Y,CXXTEST_X> { \
+ static bool test(CXXTEST_Y x,CXXTEST_X y) { \
+ return differs<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct lessThan<CXXTEST_X,CXXTEST_Y> { \
+ static bool test(CXXTEST_X x,CXXTEST_Y y) { \
+ return lessThan<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct lessThan<CXXTEST_Y,CXXTEST_X> { \
+ static bool test(CXXTEST_Y x,CXXTEST_X y) { \
+ return lessThan<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct lessThanEquals<CXXTEST_X,CXXTEST_Y> { \
+ static bool test(CXXTEST_X x,CXXTEST_Y y) { \
+ return lessThanEquals<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }; \
+ template<> struct lessThanEquals<CXXTEST_Y,CXXTEST_X> { \
+ static bool test(CXXTEST_Y x,CXXTEST_X y) { \
+ return lessThanEquals<CXXTEST_T,CXXTEST_T>::test((CXXTEST_T)x,(CXXTEST_T)y); } }
+#if 0
+ // These specializations are not needed because delta makes use of
+ // CxxTest::lessThanEquals for the actual comparison
+ template<class D> struct delta<CXXTEST_X,CXXTEST_Y, D> { \
+ static bool test(CXXTEST_X x,CXXTEST_Y y, D d) { \
+ return delta<CXXTEST_T,CXXTEST_T,D>::test((CXXTEST_T)x,(CXXTEST_T)y, d); } }; \
+ template<class D> struct delta<CXXTEST_Y,CXXTEST_X, D> { \
+ static bool test(CXXTEST_Y x,CXXTEST_X y, D d) { \
+ return delta<CXXTEST_T,CXXTEST_T,D>::test((CXXTEST_T)x,(CXXTEST_T)y, d); } }
+#endif
+
+# 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
+}
+
+#ifdef _CXXTEST_HAVE_STD
+# include <cxxtest/StdTestSuite.h>
+#endif // _CXXTEST_HAVE_STD
+
+#endif // __cxxtest__TestSuite_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__TestTracker_cpp__
+#define __cxxtest__TestTracker_cpp__
+
+#include <cxxtest/TestTracker.h>
+
+namespace CxxTest
+{
+ bool TestTracker::_created = false;
+ bool TestTracker::print_tracing = false;
+
+ TestTracker::TestTracker()
+ {
+ if ( !_created ) {
+ initialize();
+ setListener( 0 );
+ _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;
+ _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, int line, const char *expression )
+ {
+ _l->trace( file, line, expression );
+ }
+
+ void TestTracker::warning( const char *file, int line, const char *expression )
+ {
+ countWarning();
+ _l->warning( file, line, expression );
+ }
+
+ void TestTracker::failedTest( const char *file, int line, const char *expression )
+ {
+ countFailure();
+ _l->failedTest( file, line, expression );
+ }
+
+ void TestTracker::failedAssert( const char *file, int line, const char *expression )
+ {
+ countFailure();
+ _l->failedAssert( file, line, expression );
+ }
+
+ void TestTracker::failedAssertEquals( const char *file, int 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, int 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, int 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, int line,
+ const char *xStr, const char *yStr,
+ const char *value )
+ {
+ countFailure();
+ _l->failedAssertDiffers( file, line, xStr, yStr, value );
+ }
+
+ void TestTracker::failedAssertLessThan( const char *file, int 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, int 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, int line,
+ const char *predicate, const char *xStr, const char *x )
+ {
+ countFailure();
+ _l->failedAssertPredicate( file, line, predicate, xStr, x );
+ }
+
+ void TestTracker::failedAssertRelation( const char *file, int 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, int line,
+ const char *expression, const char *type,
+ bool otherThrown )
+ {
+ countFailure();
+ _l->failedAssertThrows( file, line, expression, type, otherThrown );
+ }
+
+ void TestTracker::failedAssertThrowsNot( const char *file, int line, const char *expression )
+ {
+ countFailure();
+ _l->failedAssertThrowsNot( file, line, expression );
+ }
+
+ void TestTracker::failedAssertSameFiles( const char *file, int line, const char *file1, const char* file2, const char* explanation )
+ {
+ countFailure();
+ _l->failedAssertSameFiles( file, line, file1, file2, explanation );
+ }
+
+ 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__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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();
+ static bool print_tracing;
+
+ 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, int line, const char *expression );
+ void warning( const char *file, int line, const char *expression );
+ void failedTest( const char *file, int line, const char *expression );
+ void failedAssert( const char *file, int line, const char *expression );
+ void failedAssertEquals( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *x, const char *y );
+ void failedAssertSameData( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *sizeStr, const void *x,
+ const void *y, unsigned size );
+ void failedAssertDelta( const char *file, int line,
+ const char *xStr, const char *yStr, const char *dStr,
+ const char *x, const char *y, const char *d );
+ void failedAssertDiffers( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *value );
+ void failedAssertLessThan( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *x, const char *y );
+ void failedAssertLessThanEquals( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *x, const char *y );
+ void failedAssertPredicate( const char *file, int line,
+ const char *predicate, const char *xStr, const char *x );
+ void failedAssertRelation( const char *file, int line,
+ const char *relation, const char *xStr, const char *yStr,
+ const char *x, const char *y );
+ void failedAssertThrows( const char *file, int line,
+ const char *expression, const char *type,
+ bool otherThrown );
+ void failedAssertThrowsNot( const char *file, int line, const char *expression );
+ void failedAssertSameFiles( const char* file, int line, const char* file1, const char* file2, const char* explanation);
+
+ void initialize();
+
+ 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 setListener( TestListener *l );
+ };
+
+ inline TestTracker &tracker() { return TestTracker::tracker(); }
+}
+
+#endif // __cxxtest__TestTracker_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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 );
+ }
+
+ void ValueTraits<const double>::nonFiniteNumber( double t )
+ {
+ char *s = _asString;
+ if ( t != t )
+ s = copyString( s, "nan" );
+ //else if ( t == 1.0/0.0 )
+ else if ( t >= HUGE_VAL )
+ s = copyString( s, "-inf" );
+ else if ( t <= -HUGE_VAL )
+ //else if ( t == -1.0/0.0 )
+ s = copyString( s, "inf" );
+ }
+
+ 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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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
+
+#ifdef _CXXTEST_HAVE_STD
+#include <cmath>
+#else
+#include <math.h>
+#endif
+
+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 )
+ {
+ //if ( ( t != t ) || ( t >= 1.0/0.0 ) || ( t == -1.0/0.0 ) )
+ if ( ( t != t ) || ( t >= HUGE_VAL ) || ( t == -HUGE_VAL ) )
+ nonFiniteNumber( t );
+ else if ( requiredDigitsOnLeft( t ) > MAX_DIGITS_ON_LEFT )
+ hugeNumber( t );
+ else
+ 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 );
+ void nonFiniteNumber( 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
+
+namespace dummy_enum_ns {}
+
+//
+// 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; \
+ } \
+ } \
+ }; \
+ } using namespace dummy_enum_ns
+
+#define CXXTEST_ENUM_MEMBER( MEMBER ) \
+ case MEMBER: return #MEMBER;
+
+#endif // __cxxtest__ValueTraits_h__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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( tracker().failedTests() );
+
+ 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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __CXXTEST__XUNIT_PRINTER_H
+#define __CXXTEST__XUNIT_PRINTER_H
+
+//
+// XUnitPrinter combines an ErrorPrinter with an XML formatter.
+//
+
+#include <cxxtest/TeeListener.h>
+#include <cxxtest/ErrorPrinter.h>
+#include <cxxtest/XmlPrinter.h>
+
+namespace CxxTest
+{
+ class XUnitPrinter : public TeeListener
+ {
+ public:
+
+ XmlPrinter xml_printer;
+ ErrorPrinter error_printer;
+
+ XUnitPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout) )
+ : xml_printer(o)
+ {
+ setFirst( error_printer );
+ setSecond( xml_printer );
+ }
+
+ int run()
+ {
+ TestRunner::runAllTests( *this );
+ return tracker().failedTests();
+ }
+ };
+}
+
+#endif //__CXXTEST__XUNIT_PRINTER_H
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+// Licensed under the LGPL, see http://www.gnu.org/licenses/lgpl.html
+
+#ifndef __CXXTEST__XMLFORMATTER_H
+#define __CXXTEST__XMLFORMATTER_H
+
+//
+// The XmlFormatter is a TestListener that
+// prints reports of the errors to an output
+// stream in the form of an XML document.
+//
+
+// The following definitions are used if stack trace support is enabled,
+// to give the traces an easily-parsable XML format. If stack tracing is
+// not enabled, then these definitions will be ignored.
+#define CXXTEST_STACK_TRACE_ESCAPE_AS_XML
+#define CXXTEST_STACK_TRACE_NO_ESCAPE_FILELINE_AFFIXES
+
+#define CXXTEST_STACK_TRACE_INITIAL_PREFIX "<stack-frame function=\""
+#define CXXTEST_STACK_TRACE_INITIAL_SUFFIX "\"/>\n"
+#define CXXTEST_STACK_TRACE_OTHER_PREFIX CXXTEST_STACK_TRACE_INITIAL_PREFIX
+#define CXXTEST_STACK_TRACE_OTHER_SUFFIX CXXTEST_STACK_TRACE_INITIAL_SUFFIX
+#define CXXTEST_STACK_TRACE_ELLIDED_MESSAGE ""
+#define CXXTEST_STACK_TRACE_FILELINE_PREFIX "\" location=\""
+#define CXXTEST_STACK_TRACE_FILELINE_SUFFIX ""
+
+
+#include <cxxtest/TestRunner.h>
+#include <cxxtest/TestListener.h>
+#include <cxxtest/TestTracker.h>
+#include <cxxtest/ValueTraits.h>
+#include <cxxtest/ErrorFormatter.h>
+#include <cxxtest/StdHeaders.h>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+#include <cstdio>
+
+namespace CxxTest
+{
+ class TeeOutputStreams
+ {
+ private:
+ class teebuffer : public std::basic_streambuf<char>
+ {
+ typedef std::basic_streambuf<char> streambuf_t;
+ public:
+ teebuffer(streambuf_t * buf1, streambuf_t * buf2)
+ : buffer1(buf1), buffer2(buf2)
+ {}
+
+ virtual int overflow(int c)
+ {
+ if (c == EOF)
+ return !EOF;
+ else
+ {
+ int const ans1 = buffer1->sputc(c);
+ int const ans2 = buffer2->sputc(c);
+ return ans1 == EOF || ans2 == EOF ? EOF : c;
+ }
+ }
+
+ virtual int sync()
+ {
+ int ans1 = buffer1->pubsync();
+ int ans2 = buffer2->pubsync();
+ return ans1 || ans2 ? -1 : 0;
+ }
+
+ streambuf_t * buffer1;
+ streambuf_t * buffer2;
+ };
+
+ public:
+ TeeOutputStreams(std::ostream& _cout, std::ostream& _cerr)
+ : out(),
+ err(),
+ orig_cout(_cout),
+ orig_cerr(_cerr),
+ tee_out(out.rdbuf(), _cout.rdbuf()),
+ tee_err(err.rdbuf(), _cerr.rdbuf())
+ {
+ orig_cout.rdbuf(&tee_out);
+ orig_cerr.rdbuf(&tee_err);
+ }
+
+ ~TeeOutputStreams()
+ {
+ orig_cout.rdbuf(tee_out.buffer2);
+ orig_cerr.rdbuf(tee_err.buffer2);
+ }
+
+ std::stringstream out;
+ std::stringstream err;
+
+ private:
+ std::ostream& orig_cout;
+ std::ostream& orig_cerr;
+ teebuffer tee_out;
+ teebuffer tee_err;
+ };
+
+ class ElementInfo
+ {
+ public:
+ std::string name;
+ std::stringstream value;
+ std::map<std::string,std::string> attribute;
+
+ ElementInfo()
+ : name(), value(), attribute()
+ {}
+
+ ElementInfo(const ElementInfo& rhs)
+ : name(rhs.name), value(rhs.value.str()), attribute(rhs.attribute)
+ {}
+
+ ElementInfo& operator=(const ElementInfo& rhs)
+ {
+ name = rhs.name;
+ value.str(rhs.value.str());
+ attribute = rhs.attribute;
+ return *this;
+ }
+
+ template <class Type>
+ void add(const std::string& name_, Type& value_)
+ {
+ std::ostringstream os;
+ os << value_;
+ attribute[name_] = os.str();
+ }
+
+ void write(OutputStream& os) {
+ os << " <" << name.c_str() << " ";
+ std::map<std::string,std::string>::iterator curr=attribute.begin();
+ std::map<std::string,std::string>::iterator end =attribute.end();
+ while (curr != end) {
+ os << curr->first.c_str()
+ << "=\"" << curr->second.c_str() << "\" ";
+ curr++;
+ }
+ if (value.str().empty()) {
+ os << "/>";
+ }
+ else {
+ os << ">" << escape(value.str()).c_str()
+ << "</" << name.c_str() << ">";
+ }
+ os.endl(os);
+ }
+
+ std::string escape(const std::string& str)
+ {
+ std::string escStr = "";
+ for(size_t i = 0; i < str.length(); i++)
+ {
+ switch(str[i])
+ {
+ case '"': escStr += """; break;
+ case '\'': escStr += "'"; break;
+ case '<': escStr += "<"; break;
+ case '>': escStr += ">"; break;
+ case '&': escStr += "&"; break;
+ default: escStr += str[i]; break;
+ }
+ }
+ return escStr;
+ }
+
+ };
+
+ class TestCaseInfo
+ {
+ public:
+
+ TestCaseInfo() : fail(false), error(false), runtime(0.0) {}
+ std::string className;
+ std::string testName;
+ std::string line;
+ bool fail;
+ bool error;
+ double runtime;
+ std::list<ElementInfo> elements;
+ typedef std::list<ElementInfo>::iterator element_t;
+ std::string world;
+
+ element_t add_element(const std::string& name)
+ {
+ element_t elt = elements.insert(elements.end(), ElementInfo());
+ elt->name=name;
+ return elt;
+ }
+
+ element_t update_element(const std::string& name)
+ {
+ element_t elt = elements.begin();
+ while ( elt != elements.end() )
+ {
+ if ( elt->name == name )
+ return elt;
+ }
+ return add_element(name);
+ }
+
+ void write( OutputStream &o )
+ {
+ o << " <testcase classname=\"" << className.c_str()
+ << "\" name=\"" << testName.c_str()
+ << "\" line=\"" << line.c_str() << "\"";
+ bool elts=false;
+ element_t curr = elements.begin();
+ element_t end = elements.end();
+ while (curr != end) {
+ if (!elts) {
+ o << ">";
+ o.endl(o);
+ elts=true;
+ }
+ curr->write(o);
+ curr++;
+ }
+ if (elts)
+ o << " </testcase>";
+ else
+ o << " />";
+ o.endl(o);
+ }
+
+ };
+
+ class XmlFormatter : public TestListener
+ {
+ public:
+ XmlFormatter( OutputStream *o, OutputStream *ostr, std::ostringstream *os)
+ : _o(o), _ostr(ostr), _os(os), stream_redirect(NULL)
+ {}
+
+ std::list<TestCaseInfo> info;
+ std::list<TestCaseInfo>::iterator testcase;
+ typedef std::list<ElementInfo>::iterator element_t;
+ std::string classname;
+ int ntests;
+ int nfail;
+ int nerror;
+ double totaltime;
+
+ int run()
+ {
+ TestRunner::runAllTests( *this );
+ return tracker().failedTests();
+ }
+
+ void enterWorld( const WorldDescription & /*desc*/ )
+ {
+ ntests=0;
+ nfail=0;
+ nerror=0;
+ totaltime=0;
+ }
+
+ 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& desc )
+ {
+ classname = desc.suiteName();
+ // replace "::" namespace with java-style "."
+ size_t pos = 0;
+ while( (pos = classname.find("::", pos)) !=
+ CXXTEST_STD(string::npos) )
+ classname.replace(pos, 2, ".");
+ while ( ! classname.empty() && classname[0] == '.' )
+ classname.erase(0,1);
+
+ //CXXTEST_STD(cout) << "HERE " << desc.file() << " "
+ // << classname << CXXTEST_STD(endl);
+
+ //classname=desc.suiteName();
+ //(*_o) << "file=\"" << desc.file() << "\" ";
+ //(*_o) << "line=\"" << desc.line() << "\"";
+ //_o->flush();
+ }
+
+ void leaveSuite( const SuiteDescription & )
+ {
+ std::list<TestCaseInfo>::iterator curr = info.begin();
+ std::list<TestCaseInfo>::iterator end = info.end();
+ while (curr != end) {
+ if (curr->fail) nfail++;
+ if (curr->error) nerror++;
+ totaltime += curr->runtime;
+ ntests++;
+ curr++;
+ }
+ curr = info.begin();
+ end = info.end();
+ while (curr != end) {
+ (*curr).write(*_ostr);
+ curr++;
+ }
+ info.clear();
+ }
+
+ void enterTest( const TestDescription & desc )
+ {
+ testcase = info.insert(info.end(),TestCaseInfo());
+ testcase->testName = desc.testName();
+ testcase->className = classname;
+ std::ostringstream os;
+ os << desc.line();
+ testcase->line = os.str();
+
+ if ( stream_redirect )
+ CXXTEST_STD(cerr) << "ERROR: The stream_redirect != NULL"
+ << CXXTEST_STD(endl);
+
+ stream_redirect =
+ new TeeOutputStreams(CXXTEST_STD(cout), CXXTEST_STD(cerr));
+ }
+
+ void leaveTest( const TestDescription & )
+ {
+ if ( stream_redirect != NULL )
+ {
+ std::string out = stream_redirect->out.str();
+ if ( ! out.empty() )
+ {
+ // silently ignore the '.'
+ if ( out[0] != '.' || out.size() > 1 )
+ testcase->add_element("system-out")->value << out;
+ }
+ if ( ! stream_redirect->err.str().empty() )
+ testcase->add_element("system-err")->value << stream_redirect->err.str();
+
+ delete stream_redirect;
+ stream_redirect = NULL;
+ }
+ }
+
+ void leaveWorld( const WorldDescription& desc )
+ {
+ std::ostringstream os;
+ os << totaltime;
+ (*_o) << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" << endl;
+ (*_o) << "<testsuite name=\"" << desc.worldName() << "\" ";
+ (*_o) << " tests=\"" << ntests
+ << "\" errors=\"" << nerror
+ << "\" failures=\"" << nfail
+ << "\" time=\"" << os.str().c_str() << "\" >";
+ _o->endl(*_o);
+ (*_o) << _os->str().c_str();
+ _os->clear();
+ (*_o) << "</testsuite>" << endl;
+ _o->flush();
+ }
+
+ void trace( const char* /*file*/, int line, const char *expression )
+ {
+ element_t elt = testcase->add_element("trace");
+ elt->add("line",line);
+ elt->value << expression;
+ }
+
+ void warning( const char* /*file*/, int line, const char *expression )
+ {
+ element_t elt = testcase->add_element("warning");
+ elt->add("line",line);
+ elt->value << expression;
+ }
+
+ void failedTest( const char* file, int line, const char* expression )
+ {
+ testFailure( file, line, "failure") << "Test failed: " << expression;
+ }
+
+ void failedAssert( const char *file, int line, const char *expression )
+ {
+ testFailure( file, line, "failedAssert" )
+ << "Assertion failed: " << expression;
+ }
+
+ void failedAssertEquals( const char *file, int line,
+ const char* xStr, const char* yStr,
+ const char *x, const char *y )
+ {
+ testFailure( file, line, "failedAssertEquals" )
+ << "Error: Expected ("
+ << xStr << " == " << yStr << "), found ("
+ << x << " != " << y << ")";
+ }
+
+ void failedAssertSameData( const char *file, int line,
+ const char *xStr, const char *yStr, const char *sizeStr,
+ const void* /*x*/, const void* /*y*/, unsigned size )
+ {
+ testFailure( file, line, "failedAssertSameData")
+ << "Error: Expected " << sizeStr
+ << " (" << size << ") bytes to be equal at ("
+ << xStr << ") and (" << yStr << "), found";
+ }
+
+ void failedAssertSameFiles( const char *file, int line,
+ const char *, const char *,
+ const char* explanation
+ )
+ {
+ testFailure( file, line, "failedAssertSameFiles" )
+ << "Error: " << explanation;
+ }
+
+ void failedAssertDelta( const char *file, int line,
+ const char *xStr, const char *yStr, const char *dStr,
+ const char *x, const char *y, const char *d )
+ {
+ testFailure( file, line, "failedAssertDelta" )
+ << "Error: Expected ("
+ << xStr << " == " << yStr << ") up to " << dStr
+ << " (" << d << "), found ("
+ << x << " != " << y << ")";
+ }
+
+ void failedAssertDiffers( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *value )
+ {
+ testFailure( file, line, "failedAssertDiffers" )
+ << "Error: Expected ("
+ << xStr << " != " << yStr << "), found ("
+ << value << ")";
+ }
+
+ void failedAssertLessThan( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *x, const char *y )
+ {
+ testFailure( file, line, "failedAssertLessThan" )
+ << "Error: Expected (" <<
+ xStr << " < " << yStr << "), found (" <<
+ x << " >= " << y << ")";
+ }
+
+ void failedAssertLessThanEquals( const char *file, int line,
+ const char *xStr, const char *yStr,
+ const char *x, const char *y )
+ {
+ testFailure( file, line, "failedAssertLessThanEquals" )
+ << "Error: Expected (" <<
+ xStr << " <= " << yStr << "), found (" <<
+ x << " > " << y << ")";
+ }
+
+ void failedAssertRelation( const char *file, int line,
+ const char *relation, const char *xStr, const char *yStr,
+ const char *x, const char *y )
+ {
+ testFailure( file, line, "failedAssertRelation" )
+ << "Error: Expected " << relation << "( " <<
+ xStr << ", " << yStr << " ), found !" << relation
+ << "( " << x << ", " << y << " )";
+ }
+
+ void failedAssertPredicate( const char *file, int line,
+ const char *predicate, const char *xStr, const char *x )
+ {
+ testFailure( file, line, "failedAssertPredicate" )
+ << "Error: Expected " << predicate << "( " <<
+ xStr << " ), found !" << predicate << "( " << x << " )";
+ }
+
+ void failedAssertThrows( const char *file, int line,
+ const char *expression, const char *type,
+ bool otherThrown )
+ {
+ testFailure( file, line, "failedAssertThrows" )
+ << "Error: Expected (" << expression << ") to throw (" <<
+ type << ") but it "
+ << (otherThrown ? "threw something else" : "didn't throw");
+ }
+
+ void failedAssertThrowsNot( const char *file, int line, const char *expression )
+ {
+ testFailure( file, line, "failedAssertThrowsNot" )
+ << "Error: Expected (" << expression
+ << ") not to throw, but it did";
+ }
+
+ protected:
+
+ OutputStream *outputStream() const
+ {
+ return _o;
+ }
+
+ OutputStream *outputFileStream() const
+ {
+ return _ostr;
+ }
+
+ private:
+ XmlFormatter( const XmlFormatter & );
+ XmlFormatter &operator=( const XmlFormatter & );
+
+ std::stringstream& testFailure( const char* file, int line, const char *failureType)
+ {
+ testcase->fail=true;
+ element_t elt = testcase->update_element("failure");
+ if ( elt->value.str().empty() )
+ {
+ elt->add("type",failureType);
+ elt->add("line",line);
+ elt->add("file",file);
+ }
+ else
+ elt->value << CXXTEST_STD(endl);
+ return elt->value;
+ //failedTest(file,line,message.c_str());
+ }
+
+#if 0
+ void attributeBinary( const char* name, const void *value, unsigned size )
+ {
+ (*_o) << name;
+ (*_o) << "=\"";
+ dump(value, size);
+ (*_o) << "\" ";
+ }
+
+ void dump( const void *buffer, unsigned size )
+ {
+ if (!buffer) return;
+
+ unsigned dumpSize = size;
+ if ( maxDumpSize() && dumpSize > maxDumpSize() )
+ dumpSize = maxDumpSize();
+
+ const unsigned char *p = (const unsigned char *)buffer;
+ for ( unsigned i = 0; i < dumpSize; ++ i )
+ (*_o) << byteToHex( *p++ ) << " ";
+ if ( dumpSize < size )
+ (*_o) << "... ";
+ }
+#endif
+
+ static void endl( OutputStream &o )
+ {
+ OutputStream::endl( o );
+ }
+
+ OutputStream *_o;
+ OutputStream *_ostr;
+ std::ostringstream *_os;
+
+ TeeOutputStreams *stream_redirect;
+ };
+}
+
+#endif // __CXXTEST__XMLFORMATTER_H
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#ifndef __cxxtest__XmlPrinter_h__
+#define __cxxtest__XmlPrinter_h__
+
+//
+// The XmlPrinter is a simple TestListener that
+// prints JUnit style xml to the output stream
+//
+
+
+#include <cxxtest/Flags.h>
+
+#ifndef _CXXTEST_HAVE_STD
+# define _CXXTEST_HAVE_STD
+#endif // _CXXTEST_HAVE_STD
+
+#include <cxxtest/XmlFormatter.h>
+#include <cxxtest/StdValueTraits.h>
+
+#include <sstream>
+#ifdef _CXXTEST_OLD_STD
+# include <iostream.h>
+#else // !_CXXTEST_OLD_STD
+# include <iostream>
+#endif // _CXXTEST_OLD_STD
+
+namespace CxxTest
+{
+ class XmlPrinter : public XmlFormatter
+ {
+ public:
+ XmlPrinter( CXXTEST_STD(ostream) &o = CXXTEST_STD(cout), const char* /*preLine*/ = ":", const char* /*postLine*/ = "" ) :
+ XmlFormatter( new Adapter(o), new Adapter(ostr), &ostr ) {}
+
+ virtual ~XmlPrinter()
+ {
+ delete outputStream();
+ delete outputFileStream();
+ }
+
+ private:
+
+ std::ostringstream ostr;
+
+ 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__XmlPrinter_h__
+
--- /dev/null
+/*
+-------------------------------------------------------------------------
+ CxxTest: A lightweight C++ unit testing library.
+ Copyright (c) 2008 Sandia Corporation.
+ This software is distributed under the LGPL License v2.1
+ For more information, see the COPYING file in the top CxxTest directory.
+ Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ the U.S. Government retains certain rights in this software.
+-------------------------------------------------------------------------
+*/
+
+#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__
--- /dev/null
+
+html: guide.txt anchors outputs
+ asciidoc -v -b html -d article -n -a toc guide.txt
+
+pdf: guide.txt anchors outputs
+ a2x -a toc -L -d article -f pdf -v --dblatex-opts "-P latex.output.revhistory=0 -P doc.collab.show=1 -P toc.section.depth=2" guide.txt
+
+epub: guide.txt anchors outputs
+ export XML_CATALOG_FILES=export XML_CATALOG_FILES="catalog.xml"; a2x -L -f epub -d article --verbose --xsltproc-opts "--stringparam toc.section.depth 2 --stringparam generate.section.toc.level 1" guide.txt
+
+all: html pdf epub
+
+anchors:
+ python include_anchors.py guide.txt
+
+outputs:
+ ../bin/cxxtestgen -h > examples/cxxtestgen.out
+
+clean:
+ - \rm -f guide.xml
+ - \rm -f examples/.*.py examples/.*.h examples/.*.cpp examples/.*.sh examples/runner examples/TEST*.xml examples/parsetab.py examples/*.orig examples/runner.cpp
+
--- /dev/null
+This directory supports the creation of the CxxTest User Guide using
+asciidoc and a2x commands.
+
+HTML
+
+The command
+
+ make html
+
+creates the guide.html file.
+
+
+PDF
+
+The command
+
+ make pdf
+
+creates the guide.tex file, which generates the guide.pdf file using
+dblatex.
+
+
+
+EPUB
+
+The command
+
+ make epub
+
+creates the file make.epub. Note that the `catalog.xml` file is
+used, which configures asciidoc to use the docbook XML data in the
+`epub` directory. This is a bit of a hack. It apparently works
+around a limitation of the MacPorts installation of asciidoc.
+
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
+ "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<nextCatalog catalog="/opt/local/etc/xml/catalog" />
+<nextCatalog catalog="/opt/local/share/xsl/docbook-xsl/catalog.xml" />
+</catalog>
--- /dev/null
+----------------------------------------------------------------------
+ README file for the DocBook XSL Stylesheets
+----------------------------------------------------------------------
+
+These are XSL stylesheets for transforming DocBook XML document
+instances into .epub format.
+
+.epub is an open standard of the The International Digital Publishing Forum (IDPF),
+a the trade and standards association for the digital publishing industry.
+
+An alpha-quality reference implementation (dbtoepub) for a DocBook to .epub
+converter (written in Ruby) is available under bin/.
+
+From http://idpf.org
+ What is EPUB, .epub, OPS/OCF & OEB?
+
+ ".epub" is the file extension of an XML format for reflowable digital
+ books and publications. ".epub" is composed of three open standards,
+ the Open Publication Structure (OPS), Open Packaging Format (OPF) and
+ Open Container Format (OCF), produced by the IDPF. "EPUB" allows
+ publishers to produce and send a single digital publication file
+ through distribution and offers consumers interoperability between
+ software/hardware for unencrypted reflowable digital books and other
+ publications. The Open eBook Publication Structure or "OEB",
+ originally produced in 1999, is the precursor to OPS.
+
+----------------------------------------------------------------------
+.epub Constraints
+----------------------------------------------------------------------
+
+.epub does not support all of the image formats that DocBook supports.
+When an image is available in an accepted format, it will be used. The
+accepted @formats are: 'GIF','GIF87a','GIF89a','JPEG','JPG','PNG','SVG'
+A mime-type for the image will be guessed from the file extension,
+which may not work if your file extensions are non-standard.
+
+Non-supported elements:
+ * <mediaobjectco>
+ * <inlinegraphic>, <graphic>, <textdata>, <imagedata> with text/XML
+ @filerefs
+ * <olink>
+ * <cmdsynopsis> in lists (generic XHTML rendering inability)
+ * <footnote><para><programlisting> (just make your programlistings
+ siblings, rather than descendents of paras)
+
+----------------------------------------------------------------------
+dbtoepub Reference Implementation
+----------------------------------------------------------------------
+
+An alpha-quality DocBook to .epub conversion program, dbtoepub, is provided
+in bin/dbtoepub.
+
+This tool requires:
+ - 'xsltproc' in your PATH
+ - 'zip' in your PATH
+ - Ruby 1.8.4+
+
+Windows compatibility has not been extensively tested; bug reports encouraged.
+[See http://www.zlatkovic.com/libxml.en.html and http://unxutils.sourceforge.net/]
+
+$ dbtoepub --help
+ Usage: dbtoepub [OPTIONS] [DocBook Files]
+
+ dbtoepub converts DocBook <book> and <article>s into to .epub files.
+
+ .epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+ - Open Publication Structure (OPS)
+ - Open Packaging Format (OPF)
+ - Open Container Format (OCF)
+
+ Specific options:
+ -d, --debug Show debugging output.
+ -h, --help Display usage info
+ -v, --verbose Make output verbose
+
+
+----------------------------------------------------------------------
+Validation
+----------------------------------------------------------------------
+
+The epubcheck project provides limited validation for .epub documents.
+See http://code.google.com/p/epubcheck/ for details.
+
+----------------------------------------------------------------------
+Copyright information
+----------------------------------------------------------------------
+See the accompanying file named COPYING.
+
--- /dev/null
+#!/usr/bin/env ruby
+# This program converts DocBook documents into .epub files.
+#
+# Usage: dbtoepub [OPTIONS] [DocBook Files]
+#
+# .epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+# - Open Publication Structure (OPS)
+# - Open Packaging Format (OPF)
+# - Open Container Format (OCF)
+#
+# Specific options:
+# -c, --css [FILE] Use FILE for CSS on generated XHTML.
+# -d, --debug Show debugging output.
+# -f, --font [OTF FILE] Embed OTF FILE in .epub.
+# -h, --help Display usage info.
+# -s, --stylesheet [XSL FILE] Use XSL FILE as a customization
+# layer (imports epub/docbook.xsl).
+# -v, --verbose Make output verbose.
+
+lib = File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
+$LOAD_PATH.unshift(lib) if File.exist?(lib)
+
+require 'fileutils'
+require 'optparse'
+require 'tmpdir'
+
+require 'docbook'
+
+verbose = false
+debug = false
+css_file = nil
+otf_files = []
+customization_layer = nil
+output_file = nil
+
+#$DEBUG=true
+
+# Set up the OptionParser
+opts = OptionParser.new
+opts.banner = "Usage: #{File.basename($0)} [OPTIONS] [DocBook Files]
+
+#{File.basename($0)} converts DocBook <book> and <article>s into to .epub files.
+
+.epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+- Open Publication Structure (OPS)
+- Open Packaging Format (OPF)
+- Open Container Format (OCF)
+
+Specific options:"
+opts.on("-c", "--css [FILE]", "Use FILE for CSS on generated XHTML.") {|f| css_file = f}
+opts.on("-d", "--debug", "Show debugging output.") {debug = true; verbose = true}
+opts.on("-f", "--font [OTF FILE]", "Embed OTF FILE in .epub.") {|f| otf_files << f}
+opts.on("-h", "--help", "Display usage info.") {puts opts.to_s; exit 0}
+opts.on("-o", "--output [OUTPUT FILE]", "Output ePub file as OUTPUT FILE.") {|f| output_file = f}
+opts.on("-s", "--stylesheet [XSL FILE]", "Use XSL FILE as a customization layer (imports epub/docbook.xsl).") {|f| customization_layer = f}
+opts.on("-v", "--verbose", "Make output verbose.") {verbose = true}
+
+db_files = opts.parse(ARGV)
+if db_files.size == 0
+ puts opts.to_s
+ exit 0
+end
+
+db_files.each {|docbook_file|
+ dir = File.expand_path(File.join(Dir.tmpdir, ".epubtmp#{Time.now.to_f.to_s}"))
+ FileUtils.mkdir_p(dir)
+ e = DocBook::Epub.new(docbook_file, dir, css_file, customization_layer, otf_files)
+
+ if output_file
+ epub_file = output_file
+ else
+ epub_file = File.basename(docbook_file, ".xml") + ".epub"
+ end
+ puts "Rendering DocBook file #{docbook_file} to #{epub_file}" if verbose
+ e.render_to_file(epub_file)
+}
--- /dev/null
+require 'fileutils'
+require 'rexml/parsers/pullparser'
+
+module DocBook
+
+ class Epub
+ CHECKER = "epubcheck"
+ STYLESHEET = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "docbook.xsl"))
+ CALLOUT_PATH = File.join('images', 'callouts')
+ CALLOUT_FULL_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', CALLOUT_PATH))
+ CALLOUT_LIMIT = 15
+ CALLOUT_EXT = ".png"
+ XSLT_PROCESSOR = "xsltproc"
+ OUTPUT_DIR = ".epubtmp#{Time.now.to_f.to_s}"
+ MIMETYPE = "application/epub+zip"
+ META_DIR = "META-INF"
+ OEBPS_DIR = "OEBPS"
+ ZIPPER = "zip"
+
+ attr_reader :output_dir
+
+ def initialize(docbook_file, output_dir=OUTPUT_DIR, css_file=nil, customization_layer=nil, embedded_fonts=[])
+ @docbook_file = docbook_file
+ @output_dir = output_dir
+ @meta_dir = File.join(@output_dir, META_DIR)
+ @oebps_dir = File.join(@output_dir, OEBPS_DIR)
+ @css_file = css_file ? File.expand_path(css_file) : css_file
+ @embedded_fonts = embedded_fonts
+ @to_delete = []
+
+ if customization_layer
+ @stylesheet = File.expand_path(customization_layer)
+ else
+ @stylesheet = STYLESHEET
+ end
+
+ unless File.exist?(@docbook_file)
+ raise ArgumentError.new("File #{@docbook_file} does not exist")
+ end
+ end
+
+ def render_to_file(output_file, verbose=false)
+ render_to_epub(output_file, verbose)
+ bundle_epub(output_file, verbose)
+ cleanup_files(@to_delete)
+ end
+
+ def self.invalid?(file)
+ # Obnoxiously, we can't just check for a non-zero output...
+ cmd = %Q(#{CHECKER} "#{file}")
+ output = `#{cmd} 2>&1`
+
+ if $?.to_i == 0
+ return false
+ else
+ STDERR.puts output if $DEBUG
+ return output
+ end
+ end
+
+ private
+ def render_to_epub(output_file, verbose)
+ @collapsed_docbook_file = collapse_docbook()
+
+ chunk_quietly = "--stringparam chunk.quietly " + (verbose ? '0' : '1')
+ callout_path = "--stringparam callout.graphics.path #{CALLOUT_PATH}/"
+ callout_limit = "--stringparam callout.graphics.number.limit #{CALLOUT_LIMIT}"
+ callout_ext = "--stringparam callout.graphics.extension #{CALLOUT_EXT}"
+ html_stylesheet = "--stringparam html.stylesheet #{File.basename(@css_file)}" if @css_file
+ base = "--stringparam base.dir #{OEBPS_DIR}/"
+ unless @embedded_fonts.empty?
+ embedded_fonts = @embedded_fonts.map {|f| File.basename(f)}.join(',')
+ font = "--stringparam epub.embedded.fonts \"#{embedded_fonts}\""
+ end
+ meta = "--stringparam epub.metainf.dir #{META_DIR}/"
+ oebps = "--stringparam epub.oebps.dir #{OEBPS_DIR}/"
+ options = [chunk_quietly,
+ callout_path,
+ callout_limit,
+ callout_ext,
+ base,
+ font,
+ meta,
+ oebps,
+ html_stylesheet,
+ ].join(" ")
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ db2epub_cmd = %Q(cd "#{@output_dir}" && #{XSLT_PROCESSOR} #{options} "#{@stylesheet}" "#{@collapsed_docbook_file}")
+ STDERR.puts db2epub_cmd if $DEBUG
+ success = system(db2epub_cmd)
+ raise "Could not render as .epub to #{output_file} (#{db2epub_cmd})" unless success
+ @to_delete << Dir["#{@meta_dir}/*"]
+ @to_delete << Dir["#{@oebps_dir}/*"]
+ end
+
+ def bundle_epub(output_file, verbose)
+
+ quiet = verbose ? "" : "-q"
+ mimetype_filename = write_mimetype()
+ meta = File.basename(@meta_dir)
+ oebps = File.basename(@oebps_dir)
+ images = copy_images()
+ csses = copy_csses()
+ fonts = copy_fonts()
+ callouts = copy_callouts()
+ # zip -X -r ../book.epub mimetype META-INF OEBPS
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ zip_cmd = %Q(cd "#{@output_dir}" && #{ZIPPER} #{quiet} -X -r "#{File.expand_path(output_file)}" "#{mimetype_filename}" "#{meta}" "#{oebps}")
+ puts zip_cmd if $DEBUG
+ success = system(zip_cmd)
+ raise "Could not bundle into .epub file to #{output_file}" unless success
+ end
+
+ # Input must be collapsed because REXML couldn't find figures in files that
+ # were XIncluded or added by ENTITY
+ # http://sourceforge.net/tracker/?func=detail&aid=2750442&group_id=21935&atid=373747
+ def collapse_docbook
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ collapsed_file = File.join(File.expand_path(File.dirname(@docbook_file)),
+ '.collapsed.' + File.basename(@docbook_file))
+ entity_collapse_command = %Q(xmllint --loaddtd --noent -o "#{collapsed_file}" "#{@docbook_file}")
+ entity_success = system(entity_collapse_command)
+ raise "Could not collapse named entites in #{@docbook_file}" unless entity_success
+
+ xinclude_collapse_command = %Q(xmllint --xinclude -o "#{collapsed_file}" "#{collapsed_file}")
+ xinclude_success = system(xinclude_collapse_command)
+ raise "Could not collapse XIncludes in #{@docbook_file}" unless xinclude_success
+
+ @to_delete << collapsed_file
+ return collapsed_file
+ end
+
+ def copy_callouts
+ new_callout_images = []
+ if has_callouts?
+ calloutglob = "#{CALLOUT_FULL_PATH}/*#{CALLOUT_EXT}"
+ Dir.glob(calloutglob).each {|img|
+ img_new_filename = File.join(@oebps_dir, CALLOUT_PATH, File.basename(img))
+
+ # TODO: What to rescue for these two?
+ FileUtils.mkdir_p(File.dirname(img_new_filename))
+ FileUtils.cp(img, img_new_filename)
+ @to_delete << img_new_filename
+ new_callout_images << img
+ }
+ end
+ return new_callout_images
+ end
+
+ def copy_fonts
+ new_fonts = []
+ @embedded_fonts.each {|font_file|
+ font_new_filename = File.join(@oebps_dir, File.basename(font_file))
+ FileUtils.cp(font_file, font_new_filename)
+ new_fonts << font_file
+ }
+ return new_fonts
+ end
+
+ def copy_csses
+ if @css_file
+ css_new_filename = File.join(@oebps_dir, File.basename(@css_file))
+ FileUtils.cp(@css_file, css_new_filename)
+ end
+ end
+
+ def copy_images
+ image_references = get_image_refs()
+ new_images = []
+ image_references.each {|img|
+ # TODO: It'd be cooler if we had a filetype lookup rather than just
+ # extension
+ if img =~ /\.(svg|png|gif|jpe?g|xml)/i
+ img_new_filename = File.join(@oebps_dir, img)
+ img_full = File.join(File.expand_path(File.dirname(@docbook_file)), img)
+
+ # TODO: What to rescue for these two?
+ FileUtils.mkdir_p(File.dirname(img_new_filename))
+ puts(img_full + ": " + img_new_filename) if $DEBUG
+ FileUtils.cp(img_full, img_new_filename)
+ @to_delete << img_new_filename
+ new_images << img_full
+ end
+ }
+ return new_images
+ end
+
+ def write_mimetype
+ mimetype_filename = File.join(@output_dir, "mimetype")
+ File.open(mimetype_filename, "w") {|f| f.print MIMETYPE}
+ @to_delete << mimetype_filename
+ return File.basename(mimetype_filename)
+ end
+
+ def cleanup_files(file_list)
+ file_list.flatten.each {|f|
+ # Yikes
+ FileUtils.rm_r(f, :force => true )
+ }
+ end
+
+ # Returns an Array of all of the (image) @filerefs in a document
+ def get_image_refs
+ parser = REXML::Parsers::PullParser.new(File.new(@collapsed_docbook_file))
+ image_refs = []
+ while parser.has_next?
+ el = parser.pull
+ if el.start_element? and (el[0] == "imagedata" or el[0] == "graphic")
+ image_refs << el[1]['fileref']
+ end
+ end
+ return image_refs.uniq
+ end
+
+ # Returns true if the document has code callouts
+ def has_callouts?
+ parser = REXML::Parsers::PullParser.new(File.new(@collapsed_docbook_file))
+ while parser.has_next?
+ el = parser.pull
+ if el.start_element? and (el[0] == "calloutlist" or el[0] == "co")
+ return true
+ end
+ end
+ return false
+ end
+ end
+end
--- /dev/null
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
+ <xsl:output method="xml" omit-xml-declaration="no" doctype-public="-//OASIS//DTD DocBook XML V4.4//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" indent="no"/>
+ <xsl:template match="@*|*|comment()|processing-instruction()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="text()">
+ <xsl:value-of select="replace(replace(., '[a-z]', 'x'), '[0-9]', 'd')"/>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0"?>
+<xsl:stylesheet
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:opf="http://www.idpf.org/2007/opf"
+ xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
+ xmlns:str="http://exslt.org/strings"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xtext="xalan://com.nwalsh.xalan.Text"
+
+ extension-element-prefixes="stext xtext"
+ exclude-result-prefixes="exsl db dc h ncx ng opf stext str xtext"
+
+ version="1.0">
+
+ <xsl:import href="../xhtml-1_1/docbook.xsl" />
+ <xsl:import href="../xhtml-1_1/chunk-common.xsl" />
+ <xsl:include href="../xhtml-1_1/chunk-code.xsl" />
+
+
+ <!-- We want a separate TOC file, please -->
+ <xsl:param name="chunk.tocs.and.lots">1</xsl:param>
+ <xsl:param name="toc.section.depth">2</xsl:param>
+ <xsl:param name="generate.toc">
+ book toc,title
+ </xsl:param>
+
+ <xsl:param name="ade.extensions" select="0"/>
+ <xsl:param name="epub.autolabel" select="'1'"/>
+ <xsl:param name="epub.ncx.depth">4</xsl:param> <!-- Not functional until http://code.google.com/p/epubcheck/issues/detail?id=70 is resolved -->
+
+
+ <xsl:param name="manifest.in.base.dir" select="'1'"/>
+ <xsl:param name="base.dir" select="$epub.oebps.dir"/>
+
+ <xsl:param name="epub.oebps.dir" select="'OEBPS/'"/>
+ <xsl:param name="epub.ncx.filename" select="'toc.ncx'"/>
+ <xsl:param name="epub.container.filename" select="'container.xml'"/>
+ <xsl:param name="epub.opf.filename" select="concat($epub.oebps.dir, 'content.opf')"/>
+ <xsl:param name="epub.cover.filename" select="concat($epub.oebps.dir, 'cover', $html.ext)"/>
+ <xsl:param name="epub.cover.id" select="'cover'"/>
+ <xsl:param name="epub.cover.html" select="'cover.html'" />
+ <xsl:param name="epub.cover.image.id" select="'cover-image'"/>
+ <xsl:param name="epub.cover.linear" select="0" />
+ <xsl:param name="epub.ncx.toc.id">ncxtoc</xsl:param>
+ <xsl:param name="epub.html.toc.id">htmltoc</xsl:param>
+ <xsl:param name="epub.metainf.dir" select="'META-INF/'"/>
+
+ <xsl:param name="epub.embedded.fonts"></xsl:param>
+
+ <!-- Turning this on crashes ADE, which is unbelievably awesome -->
+ <xsl:param name="formal.object.break.after">0</xsl:param>
+
+
+ <!-- Per Bob Stayton:
+ """Process your documents with the css.decoration parameter set to zero.
+ That will avoid the use of style attributes in XHTML elements where they are not permitted."""
+ http://www.sagehill.net/docbookxsl/OtherOutputForms.html#StrictXhtmlValid -->
+ <xsl:param name="css.decoration" select="0"/>
+ <xsl:param name="custom.css.source"></xsl:param> <!-- FIXME: Align with current CSS parameter design -->
+
+ <xsl:param name="callout.graphics" select="1"/>
+ <xsl:param name="callout.graphics.extension">.png</xsl:param>
+ <xsl:param name="callout.graphics.number.limit" select="15"/>
+ <xsl:param name="callout.graphics.path" select="'images/callouts/'"/>
+
+ <!-- no navigation in .epub -->
+ <xsl:param name="suppress.navigation" select="'1'"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="/*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="root.is.a.chunk">
+ <xsl:choose>
+ <xsl:when test="/*[not(self::book)][not(sect1) or not(section)]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/book[*[last()][self::bookinfo]]|book[bookinfo]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/book[*[last()][self::info]]|book[info]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/bibliography">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>0</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:key name="image-filerefs" match="graphic|inlinegraphic|imagedata" use="@fileref"/>
+
+ <xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title" />
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title" />
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS" />
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title" />
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when
+ test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid" />
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if
+ test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates
+ select="key('id', $rootid)" mode="collect.targets" />
+ </xsl:if>
+ <xsl:if
+ test="$collect.xref.targets != 'only'">
+ <xsl:message>
+ Formatting from
+ <xsl:value-of select="$rootid" />
+ </xsl:message>
+ <xsl:apply-templates
+ select="key('id',$rootid)" mode="process.root" />
+ <xsl:call-template name="ncx" />
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if
+ test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/"
+ mode="collect.targets" />
+ </xsl:if>
+ <xsl:if
+ test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/"
+ mode="process.root" />
+ <xsl:call-template name="ncx" />
+ <xsl:call-template name="opf" />
+ <xsl:call-template name="cover" />
+ <xsl:call-template name="container" />
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="package-identifier">
+ <xsl:choose>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/biblioid">
+ <xsl:if test="/*/*[contains(name(.), 'info')][1]/biblioid[1][@class = 'doi' or
+ @class = 'isbn' or
+ @class = 'isrn' or
+ @class = 'issn']">
+ <xsl:text>urn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/biblioid[1]/@class"/>
+ <xsl:text>:</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/biblioid[1]"/>
+ </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/isbn">
+ <xsl:text>urn:isbn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/isbn[1]"/>
+ </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/issn">
+ <xsl:text>urn:issn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/issn[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/invpartnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/invpartnumber[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/issuenum"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/issuenum[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/productnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/productnumber[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/seriesvolnums"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/seriesvolnums[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/volumenum"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/volumenum[1]"/> </xsl:when>
+ <!-- Deprecated -->
+ <xsl:when test="/*/*[contains(name(.), 'info')]/pubsnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/pubsnumber[1]"/> </xsl:when>
+ </xsl:choose>
+ <xsl:text>_</xsl:text>
+ <xsl:choose>
+ <xsl:when test="/*/@id">
+ <xsl:value-of select="/*/@id"/>
+ </xsl:when>
+ <xsl:when test="/*/@xml:id">
+ <xsl:value-of select="/*/@xml:id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- TODO: Do UUIDs here -->
+ <xsl:value-of select="generate-id(/*)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="opf">
+ <xsl:variable name="package-identifier-id"><xsl:value-of select="concat(name(/*), 'id')"/></xsl:variable>
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title" />
+ </xsl:variable>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.opf.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="content">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="package">
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:attribute name="unique-identifier"> <xsl:value-of select="$package-identifier-id"/> </xsl:attribute>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="metadata">
+ <xsl:element name="dc:identifier">
+ <xsl:attribute name="id"><xsl:value-of select="$package-identifier-id"/></xsl:attribute>
+ <xsl:call-template name="package-identifier"/>
+ </xsl:element>
+
+ <xsl:element name="dc:title">
+ <xsl:value-of select="normalize-space($doc.title)"/>
+ </xsl:element>
+
+ <xsl:apply-templates select="/*/*[contains(name(.), 'info')]/*"
+ mode="opf.metadata"/>
+ <xsl:element name="dc:language">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="meta">
+ <xsl:attribute name="name">cover</xsl:attribute>
+ <xsl:attribute name="content">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ </xsl:element>
+ <xsl:call-template name="opf.manifest"/>
+ <xsl:call-template name="opf.spine"/>
+ <xsl:call-template name="opf.guide"/>
+
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="container">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.metainf.dir" />
+ <xsl:value-of select="$epub.container.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+
+ <xsl:with-param name="content">
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="container">
+ <xsl:attribute name="version">1.0</xsl:attribute>
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="rootfiles">
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="rootfile">
+ <xsl:attribute name="full-path">
+ <xsl:value-of select="$epub.opf.filename" />
+ </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:text>application/oebps-package+xml</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="ncx">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir" />
+ </xsl:if>
+ <xsl:value-of select="$epub.ncx.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="content">
+ <xsl:element name="ncx" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="version">2005-1</xsl:attribute>
+
+ <!-- Via Martin Goerner: On covers: the IDPF2.0 standard unfortunately does not have a provision for
+ covers. We had to add one and we did so in conjunction with the IDPF and
+ various publishers. The tag chosen to define the covers is:
+ <meta name="cover" content="-reference to a manifest item-">
+ Then, we also added a bit of logic to get rid cleanly of the HTML cover
+ people usually add because the logical cover is not specced by the IDPF. So,
+ if the HTML cover item is marked linear="no" AND there is a guide item of
+ type="cover" pointing to it AND there is a logical cover specified in a
+ <meta name="cover"> tag, THEN, the HTML cover is discarded. -->
+ <xsl:element name="head" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element name="meta" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="name">cover</xsl:attribute>
+ <xsl:attribute name="content">
+ <xsl:value-of select="$epub.cover.id"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ <xsl:element name="meta" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="name">dtb:uid</xsl:attribute>
+ <xsl:attribute name="content"><xsl:call-template name="package-identifier"/></xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="key('id',$rootid)" mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="key('id',$rootid)" mode="title.markup" />
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="key('id',$rootid)" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="docTitle" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/"><xsl:value-of select="normalize-space($title)" /> </xsl:element>
+ </xsl:element>
+ <xsl:element name="navMap" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:apply-templates select="key('id',$rootid)/*" mode="ncx" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="/*" mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="/*" mode="title.markup" />
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="/" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="docTitle" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:value-of select="normalize-space($title)" />
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="navMap" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:choose>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:apply-templates select="/*" mode="ncx" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/*/*" mode="ncx" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="book|
+ article|
+ part|
+ reference|
+ preface|
+ chapter|
+ bibliography|
+ appendix|
+ glossary|
+ section|
+ sect1|
+ sect2|
+ sect3|
+ sect4|
+ sect5|
+ refentry|
+ colophon|
+ bibliodiv[title]|
+ setindex|
+ index"
+ mode="ncx">
+ <xsl:variable name="depth" select="count(ancestor::*)"/>
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of
+ select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup" />
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/" />
+ <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:variable>
+ <xsl:variable name="order">
+ <xsl:value-of select="$depth +
+ count(preceding::part|
+ preceding::reference|
+ preceding::book[parent::set]|
+ preceding::preface|
+ preceding::chapter|
+ preceding::bibliography|
+ preceding::appendix|
+ preceding::article|
+ preceding::glossary|
+ preceding::section[not(parent::partintro)]|
+ preceding::sect1[not(parent::partintro)]|
+ preceding::sect2[not(ancestor::partintro)]|
+ preceding::sect3[not(ancestor::partintro)]|
+ preceding::sect4[not(ancestor::partintro)]|
+ preceding::sect5[not(ancestor::partintro)]|
+ preceding::refentry|
+ preceding::colophon|
+ preceding::bibliodiv[title]|
+ preceding::index)"/>
+ </xsl:variable>
+
+ <xsl:element name="navPoint" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$id"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="playOrder">
+ <xsl:choose>
+ <xsl:when test="/*[self::set]">
+ <xsl:value-of select="$order"/>
+ </xsl:when>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:value-of select="$order + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$order - 0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:element name="navLabel" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/"><xsl:value-of select="normalize-space($title)"/> </xsl:element>
+ </xsl:element>
+ <xsl:element name="content" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:apply-templates select="book[parent::set]|part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv[title]|setindex|index" mode="ncx"/>
+ </xsl:element>
+
+ </xsl:template>
+
+ <xsl:template match="*" mode="opf.metadata">
+ <!-- override if you care -->
+ </xsl:template>
+
+ <xsl:template match="authorgroup" mode="opf.metadata">
+ <xsl:apply-templates select="author|corpauthor" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="author|corpauthor" mode="opf.metadata">
+ <xsl:variable name="n">
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="dc:creator">
+ <xsl:attribute name="opf:file-as">
+ <xsl:call-template name="person.name.last-first">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="normalize-space(string($n))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="date" mode="opf.metadata">
+ <xsl:element name="dc:date">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+
+ <!-- Space separate the compontents of the abstract (dropping the inline markup, sadly) -->
+ <xsl:template match="abstract" mode="opf.metadata">
+ <xsl:element name="dc:description">
+ <xsl:for-each select="formalpara|para|simpara|title">
+ <xsl:choose>
+ <xsl:when test="self::formalpara">
+ <xsl:value-of select="normalize-space(string(title))"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="normalize-space(string(para))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="self::title">
+ <xsl:text>:</xsl:text>
+ </xsl:if>
+ <xsl:if test="not(position() = last())">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="subjectset" mode="opf.metadata">
+ <xsl:apply-templates select="subject/subjectterm" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="subjectterm" mode="opf.metadata">
+ <xsl:element name="dc:subject">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="publisher" mode="opf.metadata">
+ <xsl:apply-templates select="publishername" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="publishername" mode="opf.metadata">
+ <xsl:element name="dc:publisher">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="copyright" mode="opf.metadata">
+ <xsl:variable name="copyright.date">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges" select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not(../date)">
+ <xsl:element name="dc:date">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year[last()]"/>
+ <xsl:with-param name="print.ranges" select="0"/>
+ <xsl:with-param name="single.year.ranges" select="0"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:if>
+ <xsl:element name="dc:rights">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:text>©</xsl:text>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:value-of select="$copyright.date"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template name="opf.guide">
+ <xsl:if test="contains($toc.params, 'toc') or
+ /*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="guide">
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="reference">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$epub.cover.html" />
+ </xsl:attribute>
+ <xsl:attribute name="type">cover</xsl:attribute>
+ <xsl:attribute name="title">Cover</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="reference">
+ <xsl:attribute name="href">
+ <xsl:call-template name="toc-href">
+ <xsl:with-param name="node" select="/*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="type">toc</xsl:attribute>
+ <xsl:attribute name="title">Table of Contents</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.spine">
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="spine">
+ <xsl:attribute name="toc">
+ <xsl:value-of select="$epub.ncx.toc.id"/>
+ </xsl:attribute>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref">
+ <xsl:value-of select="$epub.cover.id"/>
+ </xsl:attribute>
+ <xsl:attribute name="linear">
+ <xsl:choose>
+ <xsl:when test="$epub.cover.linear">
+ <xsl:text>yes</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>no</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref"> <xsl:value-of select="$epub.html.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="linear">yes</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <!-- TODO: be nice to have a idref="titlepage" here -->
+ <xsl:choose>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:apply-templates select="/*" mode="opf.spine"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/*/*" mode="opf.spine"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="*" mode="opf.spine">
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$is.chunk != 0">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:apply-templates select="*|.//refentry" mode="opf.spine"/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.manifest">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="manifest">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.ncx.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/x-dtbncx+xml</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$epub.ncx.filename"/> </xsl:attribute>
+ </xsl:element>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.html.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:call-template name="toc-href">
+ <xsl:with-param name="node" select="/*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="media-type">text/css</xsl:attribute>
+ <xsl:attribute name="id">css</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$html.stylesheet"/></xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.cover.id"/> </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$epub.cover.html"/>
+ </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$epub.embedded.fonts != '' and not(contains($epub.embedded.fonts, ','))">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="$epub.embedded.fonts"/> <!-- There is just one -->
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$epub.embedded.fonts != ''">
+ <xsl:variable name="font.file.tokens" select="str:tokenize($epub.embedded.fonts, ',')"/>
+ <xsl:for-each select="exsl:node-set($font.file.tokens)">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ <xsl:with-param name="font.order" select="position()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- TODO: be nice to have a id="titlepage" here -->
+ <xsl:apply-templates select="//part|
+ //book[*[last()][self::bookinfo]]|
+ //book[bookinfo]|
+ /set|
+ /set/book|
+ //reference|
+ //preface|
+ //chapter|
+ //bibliography|
+ //appendix|
+ //article|
+ //glossary|
+ //section|
+ //sect1|
+ //sect2|
+ //sect3|
+ //sect4|
+ //sect5|
+ //refentry|
+ //colophon|
+ //bibliodiv[title]|
+ //index|
+ //setindex|
+ //graphic|
+ //inlinegraphic|
+ //mediaobject|
+ //mediaobjectco|
+ //inlinemediaobject"
+ mode="opf.manifest"/>
+ <xsl:call-template name="opf.calloutlist"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template name="opf.calloutlist">
+ <xsl:variable name="format">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="$callout.graphics.extension"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="(//calloutlist|//co)">
+ <xsl:call-template name="opf.reference.callout">
+ <xsl:with-param name="conum" select="1"/>
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.reference.callout">
+ <xsl:param name="conum"/>
+ <xsl:param name="format"/>
+
+ <xsl:variable name="filename" select="concat($callout.graphics.path, $conum, $callout.graphics.extension)"/>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="concat(generate-id(.), 'callout', $conum)"/> </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:value-of select="$format"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:if test="($conum < $callout.graphics.number.limit)">
+ <xsl:call-template name="opf.reference.callout">
+ <xsl:with-param name="conum" select="$conum + 1"/>
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="guess-media-type">
+ <xsl:param name="ext"></xsl:param>
+ <xsl:choose>
+ <xsl:when test="contains($ext, '.gif')">
+ <xsl:text>image/gif</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'GIF')">
+ <xsl:text>image/gif</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.png')">
+ <xsl:text>image/png</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'PNG')">
+ <xsl:text>image/png</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.jpeg')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'JPEG')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.jpg')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'JPG')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.svg')">
+ <xsl:text>image/svg+xml</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'SVG')">
+ <xsl:text>image/svg+xml</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we failed -->
+ <xsl:text></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="mediaobject|
+ mediaobjectco|
+ inlinemediaobject"
+ mode="opf.manifest">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco |videoobject|audioobject |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:choose>
+ <xsl:when test="$object/descendant::imagedata[@format = 'GIF' or
+ @format = 'GIF87a' or
+ @format = 'GIF89a' or
+ @format = 'JPEG' or
+ @format = 'JPG' or
+ @format = 'PNG' or
+ @format = 'SVG']">
+ <xsl:apply-templates select="$object[descendant::imagedata[@format = 'GIF' or
+ @format = 'GIF87a' or
+ @format = 'GIF89a' or
+ @format = 'JPEG' or
+ @format = 'JPG' or
+ @format = 'PNG' or
+ @format = 'SVG']][1]/imagedata"
+ mode="opf.manifest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$object/imagedata[1]"
+ mode="opf.manifest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="cover/mediaobject|
+ mediaobject[@role='cover']"
+ mode="opf.manifest">
+ <xsl:choose>
+ <xsl:when test="imageobject[@role='front-large']">
+ <xsl:apply-templates select="imageobject[@role='front-large']/imagedata"
+ mode="opf.manifest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="imageobject/imagedata[1]"
+ mode="opf.manifest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="mediaobjectco"
+ mode="opf.manifest">
+ <xsl:message>WARNING: mediaobjectco almost certainly will not render as expected in .epub!</xsl:message>
+ <xsl:apply-templates select="imageobjectco/imageobject/imagedata"
+ mode="opf.manifest"/>
+ </xsl:template>
+
+ <!-- TODO: Barf (xsl:message terminate=yes) if you find a graphic with no reasonable format or a mediaobject w/o same? [option to not die?] -->
+
+ <!-- wish I had XSLT2 ...-->
+ <!-- TODO: priority a hack -->
+ <xsl:template match="graphic[not(@format)]|
+ inlinegraphic[not(@format)]|
+ imagedata[not(@format)]"
+ mode="opf.manifest">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="contains(name(.), 'graphic')">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="format">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="@fileref"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="fr" select="@fileref"/>
+ <xsl:if test="$format != ''">
+ <!-- only do this if we're the first file to match -->
+ <!-- TODO: Why can't this be simple equality?? (I couldn't get it to work) -->
+ <xsl:if test="generate-id(.) = generate-id(key('image-filerefs', $fr)[1])">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:choose>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and parent::*[@role='front-large']">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and (count(ancestor::mediaobject//imageobject) = 1)">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::cover">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:value-of select="$format"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Note: Selection of the first interesting imagedata is done in the select -->
+ <xsl:template match="graphic[@format = 'GIF' or @format = 'GIF87a' or @format = 'GIF89a' or @format = 'JPEG' or @format = 'JPG' or @format = 'PNG' or @format = 'SVG']|
+ inlinegraphic[@format = 'GIF' or @format = 'GIF87a' or @format = 'GIF89a' or @format = 'JPEG' or @format = 'JPG' or @format = 'PNG' or @format = 'SVG']|
+ imagedata[@format]"
+ mode="opf.manifest">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="contains(name(.), 'graphic')">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="fr" select="@fileref"/>
+ <!-- only do this if we're the first file to match -->
+ <!-- TODO: Why can't this be simple equality?? (I couldn't get it to work) -->
+ <xsl:if test="generate-id(.) = generate-id(key('image-filerefs', $fr)[1])">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:choose>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and parent::*[@role='front-large']">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and (count(ancestor::mediaobject//imageobject) = 1)">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::cover">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="@format"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Warning: While the test indicate this match list is accurate, it may
+ need further tweaking to ensure _never_ dropping generated content (XHTML)
+ from the manifest (OPF file) -->
+ <xsl:template
+ match="set|
+ book[parent::set]|
+ book[*[last()][self::bookinfo]]|
+ book[bookinfo]|
+ article|
+ part|
+ reference|
+ preface|
+ chapter|
+ bibliography|
+ appendix|
+ glossary|
+ section|
+ sect1|
+ sect2|
+ sect3|
+ sect4|
+ sect5|
+ refentry|
+ colophon|
+ bibliodiv[title]|
+ setindex|
+ index"
+ mode="opf.manifest">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/" />
+ <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:variable>
+
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$is.chunk != 0">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$id"/> </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$href"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="ncx" />
+
+ <xsl:template name="html.head">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:variable name="this" select="."/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <head xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/graphics.xsl -->
+ <!-- we can't deal with no img/@alt, because it's required. Try grabbing a title before it instead (hopefully meaningful) -->
+ <xsl:template name="process.image.attributes">
+ <xsl:param name="alt"/>
+ <xsl:param name="html.width"/>
+ <xsl:param name="html.depth"/>
+ <xsl:param name="longdesc"/>
+ <xsl:param name="scale"/>
+ <xsl:param name="scalefit"/>
+ <xsl:param name="scaled.contentdepth"/>
+ <xsl:param name="scaled.contentwidth"/>
+ <xsl:param name="viewport"/>
+
+ <xsl:choose>
+ <xsl:when test="@contentwidth or @contentdepth">
+ <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
+ <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$scaled.contentdepth"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="number($scale) != 1.0">
+ <!-- scaling is always uniform, so we only have to specify one dimension -->
+ <!-- ignore @scalefit if specified -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scalefit != 0">
+ <xsl:choose>
+ <xsl:when test="contains($html.width, '%')">
+ <xsl:choose>
+ <xsl:when test="$viewport != 0">
+ <!-- The *viewport* will be scaled, so use 100% here! -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="'100%'"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="contains($html.depth, '%')">
+ <!-- HTML doesn't deal with this case very well...do nothing -->
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != '' and $scaled.contentdepth != '' and $html.depth != ''">
+ <!-- scalefit should not be anamorphic; figure out which direction -->
+ <!-- has the limiting scale factor and scale in that direction -->
+ <xsl:choose>
+ <xsl:when test="$html.width div $scaled.contentwidth > $html.depth div $scaled.contentdepth">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- AN OVERRIDE -->
+ <xsl:if test="not(@format ='SVG')">
+ <xsl:attribute name="alt">
+ <xsl:choose>
+ <xsl:when test="$alt != ''">
+ <xsl:value-of select="normalize-space($alt)"/>
+ </xsl:when>
+ <xsl:when test="preceding::title[1]">
+ <xsl:value-of select="normalize-space(preceding::title[1])"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(missing alt)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <!-- END OF OVERRIDE -->
+
+ <xsl:if test="$longdesc != ''">
+ <xsl:attribute name="longdesc">
+ <xsl:value-of select="$longdesc"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align and $viewport = 0">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/chunk-common.xsl -->
+ <!-- make a bibliography always a chunk -->
+ <xsl:template name="chunk"
+ priority="1">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <!-- ==================================================================== -->
+ <!-- What's a chunk?
+
+ The root element
+ appendix
+ article
+ bibliography ### NO LONGER TRUE in article or part or book
+ book
+ chapter
+ colophon
+ glossary in article or part or book
+ index in article or part or book
+ part
+ preface
+ refentry
+ reference
+ sect{1,2,3,4,5} if position()>1 && depth < chunk.section.depth
+ section if position()>1 && depth < chunk.section.depth
+ set
+ setindex
+ -->
+ <!-- ==================================================================== -->
+
+ <!--
+ <xsl:message>
+ <xsl:text>chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> csd: </xsl:text>
+ <xsl:value-of select="$chunk.section.depth"/>
+ <xsl:text> cfs: </xsl:text>
+ <xsl:value-of select="$chunk.first.sections"/>
+ <xsl:text> ps: </xsl:text>
+ <xsl:value-of select="count($node/parent::section)"/>
+ <xsl:text> prs: </xsl:text>
+ <xsl:value-of select="count($node/preceding-sibling::section)"/>
+ </xsl:message>
+ -->
+
+ <xsl:choose>
+ <xsl:when test="not($node/parent::*)">1</xsl:when>
+
+ <xsl:when test="local-name($node) = 'sect1' and $chunk.section.depth >= 1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect1) > 0)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect2' and $chunk.section.depth >= 2 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect2) > 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect3' and $chunk.section.depth >= 3 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect3) > 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect4' and $chunk.section.depth >= 4 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect4) > 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect5' and $chunk.section.depth >= 5 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect5) > 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'section' and $chunk.section.depth >= count($node/ancestor::section)+1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::section) > 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="local-name($node)='preface'">1</xsl:when>
+ <xsl:when test="local-name($node)='chapter'">1</xsl:when>
+ <xsl:when test="local-name($node)='appendix'">1</xsl:when>
+ <xsl:when test="local-name($node)='article'">1</xsl:when>
+ <xsl:when test="local-name($node)='part'">1</xsl:when>
+ <xsl:when test="local-name($node)='reference'">1</xsl:when>
+ <xsl:when test="local-name($node)='refentry'">1</xsl:when>
+ <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) > 0) and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <!-- AN OVERRIDE -->
+ <xsl:when test="local-name($node)='bibliography'">1</xsl:when>
+ <!-- END OF OVERRIDE -->
+ <xsl:when test="local-name($node)='glossary' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='colophon'">1</xsl:when>
+ <xsl:when test="local-name($node)='book'">1</xsl:when>
+ <xsl:when test="local-name($node)='set'">1</xsl:when>
+ <xsl:when test="local-name($node)='setindex'">1</xsl:when>
+ <xsl:when test="local-name($node)='legalnotice' and $generate.legalnotice.link != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/chunk-code.xsl -->
+ <!-- Add chunking for bibliography as root element -->
+ <!-- AN OVERRIDE -->
+ <xsl:template match="set|
+ book|
+ part|
+ preface|
+ chapter|
+ appendix|
+ article|
+ reference|
+ refentry|
+ book/glossary|
+ article/glossary|
+ part/glossary|
+ bibliography|
+ colophon"
+ priority="1">
+ <!-- END OF OVERRIDE -->
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/graphics.xsl -->
+ <!-- Do _NOT_ output any xlink garbage, so if you don't have
+ processor with extensions, you're screwed and we're terminating -->
+ <xsl:template match="inlinegraphic">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- AN OVERRIDE -->
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available. Use a different processor (with extensions) or turn on $use.extensions and $textinsert.extension (see docs for more). </xsl:text>
+ </xsl:message>
+ <!-- END OF OVERRIDE -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="cover">
+ <xsl:apply-templates select="/*/*[contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]"/>
+ </xsl:template>
+
+ <xsl:template match="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.cover.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="content">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="html">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="head">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="title">Cover</xsl:element>
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="style">
+ <xsl:attribute name="type">text/css</xsl:attribute>
+ <!-- Help the cover image scale nicely in the CSS then apply a max-width to look better in Adobe Digital Editions -->
+ <xsl:text> img { max-width: 100%; }</xsl:text>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="body">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="div">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="imageobject[@role='front-large']">
+ <xsl:apply-templates select="imageobject[@role='front-large']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="imageobject[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ <!-- If this is defined as an explicit cover page, then process
+ any remaining text -->
+ <xsl:if test="ancestor::cover">
+ <xsl:apply-templates select="ancestor::cover/para"/>
+ </xsl:if>
+ </xsl:element>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="cover-svg">
+ <xsl:param name="node"/>
+ </xsl:template>
+
+ <xsl:template name="toc-href">
+ <xsl:param name="node" select="."/>
+ <xsl:apply-templates select="$node" mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:template>
+
+ <xsl:template match="bibliodiv[title]" mode="label.markup">
+ </xsl:template>
+
+ <xsl:template match="token" mode="opf.manifest.font">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="embedded-font-item">
+ <xsl:param name="font.file"/>
+ <xsl:param name="font.order" select="1"/>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:value-of select="concat('epub.embedded.font.', $font.order)"/>
+ </xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$font.file"/></xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="contains($font.file, 'otf')">
+ <xsl:attribute name="media-type">font/opentype</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>WARNING: OpenType fonts should be supplied! (</xsl:text>
+ <xsl:value-of select="$font.file"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
+
+<!-- Change section.heading to improve SEO on generated HTML by doing heading levels
+ "correctly". SEO rules are sometimes silly silly, but this does actually create
+ a semantic improvement.
+ Note: This template needs to be manually maintained outside of the html/sections.xsl
+ code, so make sure important changes get reintegrated. -->
+<xsl:template name="section.heading">
+ <xsl:param name="section" select="."/>
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="allow-anchors" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="class" select="'title'"/>
+
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- Make sure the subtitle doesn't get the same id as the title -->
+ <xsl:when test="self::subtitle">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- For SEO, we try to actually ensure we *always* output one and only one h1,
+ so unlike the regular stylesheets, we don't add one to the section level and
+ we get the right behavior because of chunking. -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <!-- highest valid HTML H level is H6; so anything nested deeper
+ than 7 levels down just becomes H6 -->
+ <xsl:when test="$level > 6">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
+ <xsl:if test="$css.decoration != '0'">
+ <xsl:if test="$hlevel<3">
+ <xsl:attribute name="style">clear: both</xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$allow-anchors != 0 and $generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$section"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$generate.id.attributes != 0 and not(local-name(.) = 'appendix')">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container" select="(ancestor::appendix |ancestor::article |ancestor::bibliography |ancestor::chapter |ancestor::glossary |ancestor::glossdiv |ancestor::index |ancestor::partintro |ancestor::preface |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::section |ancestor::setindex |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix' or local-name($container) = 'chapter' or local-name($container) = 'article' or local-name($container) = 'bibliography' or local-name($container) = 'glossary' or local-name($container) = 'index' or local-name($container) = 'partintro' or local-name($container) = 'preface' or local-name($container) = 'setindex'">1</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+1"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1' or local-name($container) = 'sect2' or local-name($container) = 'sect3' or local-name($container) = 'sect4' or local-name($container) = 'sect5' or local-name($container) = 'refsect1' or local-name($container) = 'refsect2' or local-name($container) = 'refsect3' or local-name($container) = 'section' or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- SEO customization #2 -->
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$level}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:element>
+</xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+// Assertions.h
+#include <cxxtest/TestSuite.h>
+
+class Test : public CxxTest::TestSuite
+{
+public:
+
+// @assert:
+ void test_assert(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ }
+// @:assert
+
+// @assertDelta:
+ void test_assert_delta(void)
+ {
+ TS_ASSERT_DELTA(sqrt(4.0), 2.0, 1e-7);
+ }
+// @:assertDelta
+
+// @assertDiffers:
+ void test_assert_differs(void)
+ {
+ TS_ASSERT_DIFFERS(1, 2);
+ }
+// @:assertDiffers
+
+// @assertEquals:
+ void test_assert_equals(void)
+ {
+ TS_ASSERT_EQUALS(21 % 5, 1);
+ }
+// @:assertEquals
+
+// @assertLessThan:
+ void test_assert_less_than(void)
+ {
+ TS_ASSERT_LESS_THAN(0, 1);
+ }
+// @:assertLessThan
+
+// @assertLessThanEquals:
+ void test_assert_less_than_equals(void)
+ {
+ TS_ASSERT_LESS_THAN_EQUALS(0, 0);
+ }
+// @:assertLessThanEquals
+
+// @assertPredicate:
+ class IsOdd
+ {
+ public:
+ bool operator()(int x) const { return x % 2 == 1; }
+ };
+
+ void test_assert_predicate(void)
+ {
+ TS_ASSERT_PREDICATE(IsOdd, 29);
+ }
+// @:assertPredicate
+
+// @assertRelation:
+ void test_assert_relation(void)
+ {
+ TS_ASSERT_RELATION(std::greater<double>, 1e6, 1000.0);
+ }
+// @:assertRelation
+
+// @assertSameData:
+ void test_assert_same_data(void)
+ {
+ char input = "The quick brown fox ran over the lazy dog";
+ char output[26];
+ memcopy(output, input, 26);
+ TS_ASSERT_SAME_DATA(input, output, 26);
+ }
+// @:assertSameData
+
+// @assertThrows:
+ void throws_runtime_error(void)
+ {
+ raise std::runtime_error, "This method simply generates an exception";
+ }
+
+ void test_assert_throws(void)
+ {
+ TS_ASSERT_THROWS(self.throws_runtime_error(), std::runtime_error);
+ }
+// @:assertThrows
+
+// @assertThrowsAnything:
+ void test_assert_throws_anything(void)
+ {
+ TS_ASSERT_THROWS_ANYTHING(self.throws_runtime_error());
+ }
+// @:assertThrowsAnything
+
+// @assertThrowsAssert:
+ void throws_value(void)
+ {
+ raise 1;
+ }
+
+ void test_assert_throws_assert(void)
+ {
+ TS_ASSERT_THROWS_ASSERT(self.throws_value(), const Error & e, TS_ASSERT_EQUALS(e, 1));
+ }
+// @:assertThrowsAssert
+
+// @assertThrowsEquals:
+ void test_assert_throws_equals(void)
+ {
+ TS_ASSERT_THROWS_EQUALS(self.throws_value(), const Error & e, e.what(), 1);
+ }
+// @:assertThrowsEquals
+
+// @assertThrowsNothing:
+ void throws_nothing(void)
+ { }
+
+ void test_assert_throws_nothing(void)
+ {
+ TS_ASSERT_THROWS_ASSERT(self.throws_nothing());
+ }
+// @:assertThrowsNothing
+
+// @fail:
+ void test_fail(void)
+ {
+ TS_FAIL("This test has failed.");
+ }
+// @:fail
+
+// @trace:
+ void test_trace(void)
+ {
+ TS_TRACE("This is a test tracing message.");
+ }
+// @:trace
+
+// @warn:
+ void test_warn(void)
+ {
+ TS_WARN("This is a warning message.");
+ }
+// @:warn
+};
--- /dev/null
+// BadTestSuite1.h
+#include <cxxtest/TestSuite.h>
+
+class BadTestSuite1 : public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+#if 0
+ void testSubtraction(void)
+ {
+ TS_ASSERT(1 - 1 < 1);
+ TS_ASSERT_EQUALS(1 - 1, 0);
+ }
+#endif
+};
--- /dev/null
+if [[ "x$CXXTEST" -eq "x" ]]
+then
+ CXXTEST="../../"
+fi
--- /dev/null
+// MockTestSuite.h
+#include <cxxtest/TestSuite.h>
+#include <time_mock.h>
+
+int generateRandomNumber();
+
+
+class MockObject : public T::Base_time
+{
+public:
+ MockObject(int initial) : counter(initial) {}
+ int counter;
+ time_t time( time_t * ) { return counter++; }
+};
+
+class TestRandom : public CxxTest::TestSuite
+{
+public:
+ void test_generateRandomNumber()
+ {
+ MockObject t(1);
+ TS_ASSERT_EQUALS( generateRandomNumber(), 3 );
+ TS_ASSERT_EQUALS( generateRandomNumber(), 6 );
+ TS_ASSERT_EQUALS( generateRandomNumber(), 9 );
+ }
+};
--- /dev/null
+// MyClass.h
+
+class MyClass
+{
+public:
+
+ int value;
+
+ MyClass(int value_) : value(value_) {}
+
+ // CxxTest requires a copy constructor
+ MyClass(const MyClass& other) : value(other.value) {}
+
+ // This is required if you want to use TS_ASSERT_EQUALS
+ bool operator==(const MyClass& other) const { return value == other.value; }
+
+ // If you want to use TS_ASSERT_LESS_THAN
+ bool operator<(const MyClass& other) const { return value < other.value; }
+};
+
+#ifdef CXXTEST_RUNNING
+// This declaration is only activated when building a CxxTest test suite
+#include <cxxtest/ValueTraits.h>
+#include <stdio.h>
+
+namespace CxxTest
+{
+ CXXTEST_TEMPLATE_INSTANTIATION
+ class ValueTraits<MyClass>
+ {
+ char _s[256];
+
+ public:
+ ValueTraits( const MyClass& m ) { sprintf( _s, "MyClass( %i )", m.value ); }
+ const char *asString() const { return _s; }
+ };
+};
+#endif // CXXTEST_RUNNING
--- /dev/null
+// MyTestSuite1.h
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite1 : public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+};
--- /dev/null
+// MyTestSuite10.h
+#include <cxxtest/TestSuite.h>
+#include <MyClass.h>
+
+class MyTestSuite10 : public CxxTest::TestSuite
+{
+public:
+ void test_le()
+ {
+ MyClass x(1), y(2);
+ TS_ASSERT_LESS_THAN( x, y );
+ }
+
+ void test_eq()
+ {
+ MyClass x(1), y(2);
+ TS_ASSERT_EQUALS( x, y );
+ }
+};
+
--- /dev/null
+// MyTestSuite11.h
+#include <cxxtest/TestSuite.h>
+#include <TMyClass.h>
+
+class MyTestSuite11 : public CxxTest::TestSuite
+{
+public:
+ void test_le()
+ {
+ TMyClass<int> x(1), y(2);
+ TS_ASSERT_LESS_THAN( x, y );
+ }
+
+ void test_eq()
+ {
+ TMyClass<int> x(1), y(2);
+ TS_ASSERT_EQUALS( x, y );
+ }
+};
+
--- /dev/null
+// MyTestSuite2.h
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite2 : public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+
+ void testMultiplication(void)
+ {
+ TS_TRACE("Starting multiplication test");
+ TS_ASSERT_EQUALS(2 * 2, 5);
+ TS_TRACE("Finishing multiplication test");
+ }
+};
--- /dev/null
+// MyTestSuite3.h
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite3 : public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+
+// void testMultiplication( void )
+// {
+// TS_ASSERT( 1 * 1 < 2 );
+// TS_ASSERT_EQUALS( 1 * 1, 2 );
+// }
+
+/*
+ void testSubtraction( void )
+ {
+ TS_ASSERT( 1 - 1 < 1 );
+ TS_ASSERT_EQUALS( 1 - 1, 0 );
+ }
+*/
+
+ void XtestDivision(void)
+ {
+ TS_ASSERT(1 / 1 < 2);
+ TS_ASSERT_EQUALS(1 / 1, 1);
+ }
+};
--- /dev/null
+// MyTestSuite4.h
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite4
+ :
+public CxxTest::TestSuite
+{
+public:
+ void testAddition(void)
+ {
+ TS_ASSERT(1 + 1 > 1);
+ TS_ASSERT_EQUALS(1 + 1, 2);
+ }
+};
--- /dev/null
+// MyTestSuite5.h
+#include <cxxtest/TestSuite.h>
+#include <string.h>
+
+class MyTestSuite5 : 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');
+ }
+
+ void test_memcpy()
+ {
+ memcpy(_buffer, "Hello, world!", sizeof(char));
+ TS_ASSERT_EQUALS(_buffer[0], 'H');
+ TS_ASSERT_EQUALS(_buffer[1], 'e');
+ }
+};
+
--- /dev/null
+// MyTestSuite6.h
+#include <cxxtest/TestSuite.h>
+
+class MyTestSuite6 : public CxxTest::TestSuite
+{
+public:
+
+ static MyTestSuite6* createSuite()
+ {
+ #ifdef _MSC_VER
+ return new MyTestSuite6();
+ #else
+ return 0;
+ #endif
+ }
+
+ static void destroySuite( MyTestSuite6* suite )
+ { delete suite; }
+
+ void test_nothing()
+ {
+ TS_FAIL( "Nothing to test" );
+ }
+};
--- /dev/null
+// MyTestSuite7.h
+#include <cxxtest/TestSuite.h>
+#include <iostream>
+
+class MyTestSuite7 : public CxxTest::TestSuite
+{
+public:
+
+ struct Data
+ {
+ char data[3];
+ bool operator==(Data o) {
+ return (memcmp(this, &o, sizeof(o)) == 0);
+ }
+ };
+
+ struct Data2
+ {
+ char data[3];
+ };
+
+ void testCompareData()
+ {
+ Data x, y;
+ memset( x.data, 0x12, sizeof(x.data) );
+ memset( y.data, 0xF6, sizeof(y.data) );
+ TS_ASSERT_EQUALS( x, y );
+
+ Data2 z, w;
+ memset( z.data, 0x12, sizeof(x.data) );
+ memset( w.data, 0xF6, sizeof(y.data) );
+ TS_ASSERT_SAME_DATA( &z, &w, sizeof(z) )
+ }
+};
+
--- /dev/null
+// MyTestSuite8.h
+#include <cstdio>
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+
+//
+// Fixture1 counts its setUp()s and tearDown()s
+//
+class Fixture1 : public CxxTest::GlobalFixture
+{
+public:
+ unsigned setUpCount;
+ unsigned tearDownCount;
+
+ Fixture1() { setUpCount = tearDownCount = 0; }
+
+ bool setUp() { ++ setUpCount; return true; }
+ bool tearDown() { ++ tearDownCount; return true; }
+
+ bool setUpWorld() { printf( "Starting a test suite\n" ); return true;}
+ bool tearDownWorld() { printf( "Finishing a test suite\n" ); return true;}
+};
+static Fixture1 fixture1;
+
+
+//
+// Fixture2 counts its setUp()s and tearDown()s and makes sure
+// its setUp() is called after Fixture1 and its tearDown() before.
+//
+class Fixture2 : public Fixture1
+{
+public:
+ bool setUp()
+ {
+ TS_ASSERT_EQUALS(setUpCount, fixture1.setUpCount - 1);
+ TS_ASSERT_EQUALS(tearDownCount, fixture1.tearDownCount);
+ return Fixture1::setUp();
+ }
+
+ bool tearDown()
+ {
+ TS_ASSERT_EQUALS(setUpCount, fixture1.setUpCount);
+ TS_ASSERT_EQUALS(tearDownCount, fixture1.tearDownCount);
+ return Fixture1::tearDown();
+ }
+};
+static Fixture2 fixture2;
+
+
+//
+// Verify the counts for the global fixtures
+//
+class MyTestSuite8 : public CxxTest::TestSuite
+{
+public:
+ void testCountsFirstTime()
+ {
+ TS_ASSERT_EQUALS(fixture1.setUpCount, 1);
+ TS_ASSERT_EQUALS(fixture1.tearDownCount, 0);
+ TS_ASSERT_EQUALS(fixture2.setUpCount, 1);
+ TS_ASSERT_EQUALS(fixture2.tearDownCount, 0);
+ }
+
+ void testCountsSecondTime()
+ {
+ TS_ASSERT_EQUALS(fixture1.setUpCount, 2);
+ TS_ASSERT_EQUALS(fixture1.tearDownCount, 1);
+ TS_ASSERT_EQUALS(fixture2.setUpCount, 2);
+ TS_ASSERT_EQUALS(fixture2.tearDownCount, 1);
+ }
+};
--- /dev/null
+// MyTestSuite9.h
+#include <cxxtest/TestSuite.h>
+
+enum Answer {
+ Yes,
+ No,
+ Maybe,
+ DontKnow,
+ DontCare
+};
+
+// Declare value traits for the Answer enumeration
+CXXTEST_ENUM_TRAITS( Answer,
+ CXXTEST_ENUM_MEMBER( Yes )
+ CXXTEST_ENUM_MEMBER( No )
+ CXXTEST_ENUM_MEMBER( Maybe )
+ CXXTEST_ENUM_MEMBER( DontKnow )
+ CXXTEST_ENUM_MEMBER( DontCare ) );
+
+// Test the trait values
+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 );
+ }
+};
--- /dev/null
+// TMyClass.h
+
+template<class T>
+class TMyClass
+{
+public:
+
+ T value;
+
+ TMyClass(const T& value_) : value(value_) {}
+
+ // CxxTest requires a copy constructor
+ TMyClass(const TMyClass<T>& other) : value(other.value) {}
+
+ // This is required if you want to use TS_ASSERT_EQUALS
+ bool operator==(const TMyClass<T>& other) const { return value == other.value; }
+
+ // If you want to use TS_ASSERT_LESS_THAN
+ bool operator<(const TMyClass<T>& other) const { return value < other.value; }
+};
+
+#ifdef CXXTEST_RUNNING
+// This declaration is only activated when building a CxxTest test suite
+#include <cxxtest/ValueTraits.h>
+#include <typeinfo>
+#include <sstream>
+
+namespace CxxTest
+{
+ template <class T>
+ class ValueTraits< TMyClass<T> >
+ {
+ public:
+ std::ostringstream _s;
+
+ ValueTraits( const TMyClass<T>& t ) { _s << typeid(t).name() << "( " << t.value << " )"; }
+
+ ValueTraits( const ValueTraits< TMyClass<T> >& value ) { _s << value._s.rdbuf(); }
+
+ const char *asString() const { return _s.str().c_str(); }
+ };
+};
+#endif // CXXTEST_RUNNING
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite1.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 1 test.OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen -o runner.cpp --template runner10.tpl MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Starting test runner
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
+Stopping test runner
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen -f --error-printer -o runner.cpp MyTestSuite3.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Parsing file MyTestSuite3.hdone.
+Running 1 test.OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen -f --error-printer -o runner.cpp MyTestSuite4.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Parsing file MyTestSuite4.h done.
+Running 1 test.OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen -f --error-printer -o runner.cpp MyTestSuite1.h MyTestSuite2.h MyTestSuite4.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+# @help:
+./runner --help
+# @:help
+./runner --help &> runner13.help.txt
+
+# @helpTests:
+./runner --help-tests
+# @:helpTests
+./runner --help-tests &> runner13.helpTests.txt
+
+# @MyTestSuite2:
+./runner MyTestSuite2
+# @:MyTestSuite2
+./runner MyTestSuite2 &> runner13.MyTestSuite2.txt
+
+# @testMultiplication:
+./runner MyTestSuite2 testMultiplication
+# @:testMultiplication
+./runner MyTestSuite2 testMultiplication &> runner13.testMultiplication.txt
+
+# @testMultiplicationVerbose:
+./runner -v MyTestSuite2 testMultiplication
+# @:testMultiplicationVerbose
+./runner -v MyTestSuite2 testMultiplication &> runner13.testMultiplicationVerbose.txt
+
+\rm -f runner runner.cpp
+
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite5.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 2 tests..OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite6.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 1 test
+In MyTestSuite6::<no test>:
+MyTestSuite6.h:8: Error: Test failed: createSuite() failed
+MyTestSuite6.h:8: Error: Assertion failed: suite() != 0
+Failed 1 of 1 test
+Success rate: 0%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MockTestSuite.h
+# @:main
+
+# @compile:
+g++ -o runner -I. -I$CXXTEST runner.cpp time_mock.cpp rand_example.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 1 test.OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite7.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
+
--- /dev/null
+Running 1 test
+In MyTestSuite7::testCompareData:
+MyTestSuite7.h:27: Error: Expected (x == y), found ({ 12 12 12 } != { F6 F6 F6 })
+MyTestSuite7.h:32: Error: Expected sizeof(z) (3) bytes to be equal at (&z) and (&w), found:
+ { 12 12 12 }
+ differs from
+ { F6 F6 F6 }
+Failed 1 of 1 test
+Success rate: 0%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite8.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
+
--- /dev/null
+Running 2 testsStarting a test suite
+Starting a test suite
+..Finishing a test suite
+Finishing a test suite
+OK!
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite9.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
+
--- /dev/null
+Running 1 test
+In EnumTraits::test_Enum_traits:
+MyTestSuite9.h:26: Error: Test failed: Yes
+MyTestSuite9.h:27: Error: Test failed: No
+MyTestSuite9.h:28: Error: Test failed: Maybe
+MyTestSuite9.h:29: Error: Test failed: DontKnow
+MyTestSuite9.h:30: Error: Test failed: DontCare
+MyTestSuite9.h:31: Error: Test failed: (Answer)1000
+Failed 1 of 1 test
+Success rate: 0%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite10.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST -I. runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
+
--- /dev/null
+Running 2 tests.
+In MyTestSuite10::test_eq:
+MyTestSuite10.h:17: Error: Expected (x == y), found (MyClass( 1 ) != MyClass( 2 ))
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --error-printer -o runner.cpp MyTestSuite11.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST -I. runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
+
--- /dev/null
+Running 2 tests.
+In MyTestSuite11::test_eq:
+MyTestSuite11.h:17: Error: Expected (x == y), found (8TMyClassIiE( 1 ) != 8TMyClassIiE( 1 ))
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --runner=ParenPrinter -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h(16): Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --runner=StdioPrinter -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --runner=YesNoRunner -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+echo $?
+
+\rm -f runner runner.cpp
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --runner=XmlPrinter -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite name="cxxtest" tests="2" errors="0" failures="1" time="0" >
+ <testcase classname="MyTestSuite2" name="testAddition" line="7" />
+ <testcase classname="MyTestSuite2" name="testMultiplication" line="13">
+ <failure file="MyTestSuite2.h" line="16" type="failedAssertEquals" >Error: Expected (2 * 2 == 5), found (4 != 5)</failure>
+ </testcase>
+</testsuite>
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --xunit-printer -o runner.cpp MyTestSuite2.h
+# @:main
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @main:
+cxxtestgen --gui=X11Gui -o runner.cpp MyTestSuite2.h ../../sample/gui/GreenYellowRed.h
+# @:main
+
+# @compile:
+/opt/local/bin/g++-mp-4.4 -o runner -I$CXXTEST runner.cpp -L/opt/local/lib -lX11
+# @:compile
+
+./runner
+\rm -f runner runner.cpp
--- /dev/null
+#!/bin/bash
+
+. GetGlobals.sh
+export PATH=$CXXTEST/bin:$PATH
+
+# @part:
+cxxtestgen --part --error-printer -o MyTestSuite1.cpp MyTestSuite1.h
+cxxtestgen --part --error-printer -o MyTestSuite2.cpp MyTestSuite2.h
+# @:part
+
+# @root:
+cxxtestgen --root --error-printer -o runner.cpp
+# @:root
+
+# @compile:
+g++ -o runner -I$CXXTEST runner.cpp MyTestSuite1.cpp MyTestSuite2.cpp
+# @:compile
+
+./runner -v
+
+rm -f MyTestSuite1.cpp MyTestSuite2.cpp runner.cpp runner
--- /dev/null
+Usage: cxxtestgen [options] [<filename> ...]
+
+Options:
+ -h, --help show this help message and exit
+ --version Write the CxxTest version.
+ -o NAME, --output=NAME
+ Write output to file NAME.
+ -w WORLD, --world=WORLD
+ The label of the tests, used to name the XML results.
+ --include=HEADER Include file HEADER in the test runner before other
+ headers.
+ --abort-on-fail Abort tests on failed asserts (like xUnit).
+ --main=MAIN Specify an alternative name for the main() function.
+ --headers=HEADER_FILENAME
+ Specify a filename that contains a list of header
+ files that are processed to generate a test runner.
+ --runner=CLASS Create a test runner that processes test events using
+ the class CxxTest::CLASS.
+ --gui=CLASS Create a GUI test runner that processes test events
+ using the class CxxTest::CLASS. (deprecated)
+ --error-printer Create a test runner using the ErrorPrinter class, and
+ allow the use of the standard library.
+ --xunit-printer Create a test runner using the XUnitPrinter class.
+ --xunit-file=XUNIT_FILE
+ The file to which the XML summary is written for test
+ runners using the XUnitPrinter class. The default XML
+ filename is TEST-<world>.xml, where <world> is the
+ value of the --world option. (default: cxxtest)
+ --have-std Use the standard library (even if not found in tests).
+ --no-std Do not use standard library (even if found in tests).
+ --have-eh Use exception handling (even if not found in tests).
+ --no-eh Do not use exception handling (even if found in
+ tests).
+ --longlong=TYPE Use TYPE as for long long integers. (default: not
+ supported)
+ --no-static-init Do not rely on static initialization in the test
+ runner.
+ --template=TEMPLATE Generate the test runner using file TEMPLATE to define
+ a template.
+ --root Write the main() function and global data for a test
+ runner.
+ --part Write the tester classes for a test runner.
+ -f, --fog-parser Use new FOG C++ parser
--- /dev/null
+Running 3 tests..
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 3 tests
+Success rate: 66%
--- /dev/null
+#!/bin/bash
+
+# @main:
+./runner
+# @:main
--- /dev/null
+Running 3 tests..
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 3 tests
+Success rate: 66%
--- /dev/null
+#!/bin/bash
+
+# @main:
+./runner
+# @:main
--- /dev/null
+// rand_example.cpp
+#include <time_mock.h>
+
+int generateRandomNumber()
+{
+ return T::time( NULL ) * 3;
+}
--- /dev/null
+#define CXXTEST_HAVE_EH
+#define CXXTEST_ABORT_TEST_ON_FAIL
+#include <cxxtest/ErrorPrinter.h>
+
+int main()
+{
+ std::cout << "Starting test runner" << std::endl;
+ int status = CxxTest::ErrorPrinter().run();
+ std::cout << "Stopping test runner" << std::endl;
+ return status;
+}
+
+// The CxxTest "world"
+<CxxTest world>
--- /dev/null
+Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%
--- /dev/null
+./runner <suitename>
+./runner <suitename> <testname>
+./runner -h
+./runner --help
+./runner --help-tests
+./runner -v Enable tracing output.
--- /dev/null
+Suite/Test Names
+---------------------------------------------------------------------------
+MyTestSuite1 testAddition
+MyTestSuite2 testAddition
+MyTestSuite2 testMultiplication
+MyTestSuite4 testAddition
--- /dev/null
+Running 1 test
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 1 test
+Success rate: 0%
--- /dev/null
+Running 1 test
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:15: Trace: Starting multiplication test
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+MyTestSuite2.h:17: Trace: Finishing multiplication test
+Failed 1 of 1 test
+Success rate: 0%
--- /dev/null
+# Imports
+import pyutilib.th as unittest
+import glob
+import os
+from os.path import dirname, abspath, basename
+import sys
+
+currdir = dirname(abspath(__file__))+os.sep
+datadir = currdir
+
+def filter(line):
+ return 'Running' in line or "IGNORE" in line
+
+# Declare an empty TestCase class
+class Test(unittest.TestCase): pass
+
+if not sys.platform.startswith('win'):
+ # Find all *.sh files, and use them to define baseline tests
+ for file in glob.glob(datadir+'*.sh'):
+ bname = basename(file)
+ name=bname.split('.')[0]
+ if os.path.exists(datadir+name+'.txt'):
+ Test.add_baseline_test(cwd=datadir, cmd=file, baseline=datadir+name+'.txt', name=name, filter=filter)
+
+# Execute the tests
+if __name__ == '__main__':
+ unittest.main()
--- /dev/null
+// time_mock.cpp
+#define CXXTEST_MOCK_TEST_SOURCE_FILE
+#include <time_mock.h>
--- /dev/null
+// time_mock.h
+#include <time.h>
+#include <cxxtest/Mock.h>
+
+CXXTEST_MOCK_GLOBAL( time_t, /* Return type */
+ time, /* Name of the function */
+ ( time_t *t ), /* Prototype */
+ ( t ) /* Argument list */ );
--- /dev/null
+// time_real.cpp
+#define CXXTEST_MOCK_REAL_SOURCE_FILE
+#include <time_mock.h>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.6.5" />
+<title>CxxTest User Guide</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #777777;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+tt {
+ font-family: monospace;
+ font-size: inherit;
+ color: navy;
+}
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overriden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+.monospaced {
+ font-family: monospace;
+ font-size: inherit;
+ color: navy;
+}
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+</style>
+<script type="text/javascript">
+/*<+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName == 'DIV'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName == 'DIV' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install(2);
+/*]]>*/
+</script>
+</head>
+<body class="article">
+<div id="header">
+<h1>CxxTest User Guide</h1>
+<div id="toc">
+ <div id="toctitle">Table of Contents</div>
+ <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_abstract">Abstract</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>CxxTest is a unit testing framework for C++ that is similar in
+spirit to <a href="http://junit.org/">JUnit</a>,
+<a href="http://cppunit.sourceforge.net">CppUnit</a>, and
+<a href="http://xprogramming.com/software.html">xUnit</a>. CxxTest is easy to
+use because it does not require precompiling a CxxTest testing
+library, it employs no advanced features of C++ (e.g. RTTI) and it
+supports a very flexible form of test discovery. This documentation
+describes CxxTest 4.0, which includes significant enhancements to
+the test discovery process, a modern test driver, and new documentation.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_overview">1. Overview</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>CxxTest is a unit testing framework for C++ that is similar in
+spirit to <a href="http://junit.org/">JUnit</a>,
+<a href="http://cppunit.sourceforge.net">CppUnit</a>, and
+<a href="http://xprogramming.com/software.html">xUnit</a>.
+CxxTest is designed to be as portable as possible; it does not require</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+RTTI
+</p>
+</li>
+<li>
+<p>
+Member template functions
+</p>
+</li>
+<li>
+<p>
+Exception handling
+</p>
+</li>
+<li>
+<p>
+External libraries (including memory management, file/console I/O, graphics libraries)
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>In particular, the design of CxxTest was tailored for C++ compilers
+on embedded systems, for which many of these features are not
+supported. However, CxxTest can also leverage standard C++ features
+when they are supported by a compiler (e.g. catch unhandled
+exceptions).</p></div>
+<div class="paragraph"><p>Additionally, CxxTest supports <em>test discovery</em>. Tests are defined
+in C++ header files, which are parsed by CxxTest to automatically
+generate a test runner. Thus, CxxTest is somewhat easier to use
+than alternative C++ testing frameworks, since you do not need to
+<em>register</em> tests.</p></div>
+<div class="paragraph"><p>The <a href="http://cxxtest.com">CxxTest Home Page</a> is
+<a href="http://cxxtest.com">http://cxxtest.com</a>. This webpage contains links
+for <a href="https://sourceforge.net/projects/cxxtest/files/">release downloads</a>,
+the <a href="https://groups.google.com/forum/?hl=en#!forum/cxxtest-forum">CxxTest
+discussion list</a>, and documentation in
+<a href="http://cxxtest.com/cxxtest/doc/guide.html">HTML</a>,
+<a href="http://cxxtest.com/cxxtest/doc/guide.pdf">PDF</a>, and
+<a href="http://cxxtest.comm/cxxtest/doc/guide.epub">EPUB</a> formats. The
+<a href="http://cxxtest.com">CxxTest Home Page</a> also includes developer
+resources (e.g. <a href="https://software.sandia.gov/hudson/view/CxxTest/">automated
+test results</a>). CxxTest is available under the
+<a href="http://www.gnu.org/copyleft/lesser.html">GNU Lesser General Public</a>
+license.</p></div>
+<div class="paragraph"><p>The CxxTest User Guide provides the following documentation:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="#gettingStarted">Getting Started</a>: Some simple examples that illustrate how to use CxxTest
+</p>
+</li>
+<li>
+<p>
+<a href="#testAssertions">Test Assertions</a>: The test assertions supported by CxxTest
+</p>
+</li>
+<li>
+<p>
+<a href="#cxxtestgen">The CxxTestGen Command</a>: Documentation for the <tt>cxxtestgen</tt> command
+</p>
+</li>
+<li>
+<p>
+<a href="#runner">Test Runner Syntax</a>: Discussion of command line options for test runners
+</p>
+</li>
+<li>
+<p>
+<a href="#advanced">Advanced Testing Features</a>: Advanced features of CxxTest
+</p>
+</li>
+<li>
+<p>
+<a href="#traits">Value Traits</a>: Customizing data traits for error messages
+</p>
+</li>
+<li>
+<p>
+<a href="#mock">Testing with Mock Objects</a>: How to test with mock global functions
+</p>
+</li>
+<li>
+<p>
+<a href="#installation">Installation</a>: How to install CxxTest
+</p>
+</li>
+<li>
+<p>
+<a href="#discussion">Status and Future Plans</a>: Comments on the past, present and future of CxxTest
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="gettingStarted">2. Getting Started</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Testing is performed with CxxTest in a four-step process:</p></div>
+<div class="olist arabic"><ol class="arabic">
+<li>
+<p>
+Tests are defined in C++ header files
+</p>
+</li>
+<li>
+<p>
+The <tt>cxxtestgen</tt> command processes header files to generate files for the test runner.
+</p>
+</li>
+<li>
+<p>
+Compile the test runner.
+</p>
+</li>
+<li>
+<p>
+Execute the test runner to run all test suites.
+</p>
+</li>
+</ol></div>
+<div class="paragraph"><p>CxxTest supports test automation, sharing of setup
+and shutdown code for tests, aggregation of tests into collections,
+and independence of the tests from the reporting framework. To
+achieve this, CxxTest supports some important concepts that are common to xUnit frameworks (
+e.g. <a href="http://junit.org/">JUnit</a>, <a href="http://cppunit.sourceforge.net">CppUnit</a>, and
+<a href="http://xprogramming.com/software.html">xUnit</a>):</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+test fixture
+</dt>
+<dd>
+<p>
+ A <em>test fixture</em> represents the preparation needed to perform one or more
+ tests, and any associate cleanup actions. This may involve, for example,
+ creating temporary or proxy databases, directories, or starting a server
+ process.
+</p>
+</dd>
+</dl></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+test suite
+</dt>
+<dd>
+<p>
+ A <em>test suite</em> is a collection of test cases, which represent
+ the smallest unit of testing. A test suite is defined by a class
+ that inherits from the <tt>CxxTest::TestSuite</tt> class, and the tests
+ in a test suite are executed together.
+</p>
+</dd>
+<dt class="hdlist1">
+test
+</dt>
+<dd>
+<p>
+ A test is a public member function of a test suite whose name
+ starts with <tt>test</tt>, e.g. <tt>testDirectoryScanner()</tt>,
+ <tt>test_cool_feature()</tt> and <tt>TestImportantBugFix()</tt>.
+</p>
+</dd>
+<dt class="hdlist1">
+test runner
+</dt>
+<dd>
+<p>
+ A <em>test runner</em> is a component which orchestrates the execution
+ of tests across one or more test suites and provides the outcome
+ to the user.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>When building test fixtures using <tt>TestSuite</tt>, the <tt>TestSuite.setUp</tt>
+and <tt>TestSuite.tearDown</tt> methods can be overridden to provide
+initialization and cleanup for the fixture. The <tt>TestSuite.setUp</tt>
+method is run before each test is executed, and the <tt>TestSuite.tearDown</tt>
+method is run after each test is executed.</p></div>
+<div class="sect2">
+<h3 id="_a_first_example">2.1. A First Example</h3>
+<div class="paragraph"><p>The following is a simple example of a
+test suite with a single test, <tt>testAddition</tt>, which perform two test assertions:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite1.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite1</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testAddition</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>You use the <tt>cxxtestgen</tt> script to generate a <em>test runner</em> for test suites in C++ header files:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --error-printer -o runner<span style="color: #990000">.</span>cpp MyTestSuite1<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>This command generates the file <tt>runner.cpp</tt>, which can be compiled.</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --error-printer -o runner<span style="color: #990000">.</span>cpp MyTestSuite1<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>Note that additional compiler flags may be needed to include headers
+and libraries that are used during testing.</p></div>
+<div class="paragraph"><p>This runner can be executed to perform the specified tests:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">.</span>/runner</tt></pre></div></div>
+<div class="paragraph"><p>which generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 3 tests..
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 3 tests
+Success rate: 66%</tt></pre>
+</div></div>
+</div>
+<div class="sect2">
+<h3 id="_a_second_example">2.2. A Second Example</h3>
+<div class="paragraph"><p>The following header file extends the previous example to
+include a test that generates an error:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite2.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite2</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testAddition</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testMultiplication</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_TRACE</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Starting multiplication test"</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">2</span> <span style="color: #990000">*</span> <span style="color: #993399">2</span><span style="color: #990000">,</span> <span style="color: #993399">5</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_TRACE</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Finishing multiplication test"</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>The test runner generated by <tt>cxxtestgen</tt> for this test suite generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 3 tests..
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 3 tests
+Success rate: 66%</tt></pre>
+</div></div>
+</div>
+<div class="sect2">
+<h3 id="_sample_problems">2.3. Sample Problems</h3>
+<div class="paragraph"><p>CxxTest comes with example test suites in the <tt>cxxtest/sample</tt> subdirectory of
+the distribution. If you look in that directory, you will see three
+Makefiles: <tt>Makefile.unix</tt>, <tt>Makefile.msvc</tt> and
+<tt>Makefile.bcc32</tt> which are for Linux/Unix, MS Visual C++ and Borland C++, repectively. These files are provided as a starting point,
+and some options may need to be tweaked in them for your system.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="testAssertions">3. Test Assertions</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The following table summarizes the test assertions supported by CxxTest.
+<a href="#appendix_A">Appendix A</a> provides examples that illustrate the use of these test assertions.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="100%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<col width="50%" />
+<col width="50%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Macro </th>
+<th align="left" valign="top"> Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert"><tt>TS_ASSERT(expr)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify <tt>expr</tt> is true</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_delta"><tt>TS_ASSERT_DELTA(x,y,d)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>abs(x-y) < d</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_differs"><tt>TS_ASSERT_DIFFERS(x,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>x != y</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_equals"><tt>TS_ASSERT_EQUALS(x,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>x == y</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_less_than"><tt>TS_ASSERT_LESS_THAN(x,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>x < y</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_less_than_equals"><tt>TS_ASSERT_LESS_THAN_EQUALS(x,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>x ⇐ y</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_predicate"><tt>TS_ASSERT_PREDICATE(P,x)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify <tt>P(x)</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_relation"><tt>TS_ASSERT_RELATION(x,R,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify <tt>x R y</tt></p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_same_data"><tt>TS_ASSERT_SAME_DATA(x,y,size)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify two buffers are equal</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_throws"><tt>TS_ASSERT_THROWS(expr,type)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>expr</tt> throws the specified exception type</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_throws_anything"><tt>TS_ASSERT_THROWS_ANYTHING(expr)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>expr</tt> throws an exception</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_throws_assert"><tt>TS_ASSERT_THROWS_ASSERT(expr,arg,assertion)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify type and value of what <tt>expr</tt> throws</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_throws_equals"><tt>TS_ASSERT_THROWS_EQUALS(expr,arg,x,y)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify type and value of what <tt>expr</tt> throws</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_assert_throws_nothing"><tt>TS_ASSERT_THROWS_NOTHING(expr)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Verify that <tt>expr</tt> doesn’t throw anything</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_fail"><tt>TS_FAIL(message)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Fail unconditionally</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_trace"><tt>TS_TRACE(message)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Print <tt>message</tt> as an informational message</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><a href="#ts_warn"><tt>TS_WARN(message)</tt></a></p></td>
+<td align="left" valign="top"><p class="table">Print <tt>message</tt> as a warning</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="paragraph"><p>The test assertions supported by CxxTest are defined as macros,
+which eliminates the need for certain templates within CxxTest and
+allows tests to catch exceptions. There are four categories of
+test assertions in CxxTest, which are distinguished by their prefixes:</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+TS_
+</dt>
+<dd>
+<p>
+These test assertions perform a test. Catch exceptions generated
+during testing will cause the test to fail, except for tests that
+check for exceptions.
+</p>
+</dd>
+<dt class="hdlist1">
+TSM_
+</dt>
+<dd>
+<p>
+These test assertions perform the same tests as the corresponding
+<tt>TS</tt> assertions, but their first argument is a <tt>const char*</tt> message
+buffer that is printed when the test fails.
+</p>
+</dd>
+<dt class="hdlist1">
+ETS_
+</dt>
+<dd>
+<p>
+These test assertions perform the same tests as the corresponding
+<tt>TS</tt> assertions. However, these test assertions do not catch
+exceptions generated during testing.
+</p>
+</dd>
+<dt class="hdlist1">
+ETSM_
+</dt>
+<dd>
+<p>
+These test assertions perform the same tests as the
+corresponding <tt>TS</tt> assertions, but (1) their first argument is a
+<tt>const char*</tt> message buffer is printed when the test fails, and
+(2) these assertions do not catch exceptions generated during
+testing.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="cxxtestgen">4. The CxxTestGen Command</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> command processes one or more C++ header files to
+generate a test runner. The <tt>cxxtestgen</tt> command performs test
+discovery by parsing the header files to find test classes, which
+inherit from the class <tt>CxxTest::TestSuite</tt>.</p></div>
+<div class="paragraph"><p>The <tt>--help</tt> option generates the following summary of the <tt>cxxtestgen</tt> command line options:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Usage: cxxtestgen [options] [<filename> ...]
+
+Options:
+ -h, --help show this help message and exit
+ --version Write the CxxTest version.
+ -o NAME, --output=NAME
+ Write output to file NAME.
+ -w WORLD, --world=WORLD
+ The label of the tests, used to name the XML results.
+ --include=HEADER Include file HEADER in the test runner before other
+ headers.
+ --abort-on-fail Abort tests on failed asserts (like xUnit).
+ --main=MAIN Specify an alternative name for the main() function.
+ --headers=HEADER_FILENAME
+ Specify a filename that contains a list of header
+ files that are processed to generate a test runner.
+ --runner=CLASS Create a test runner that processes test events using
+ the class CxxTest::CLASS.
+ --gui=CLASS Create a GUI test runner that processes test events
+ using the class CxxTest::CLASS. (deprecated)
+ --error-printer Create a test runner using the ErrorPrinter class, and
+ allow the use of the standard library.
+ --xunit-printer Create a test runner using the XUnitPrinter class.
+ --xunit-file=XUNIT_FILE
+ The file to which the XML summary is written for test
+ runners using the XUnitPrinter class. The default XML
+ filename is TEST-<world>.xml, where <world> is the
+ value of the --world option. (default: cxxtest)
+ --have-std Use the standard library (even if not found in tests).
+ --no-std Do not use standard library (even if found in tests).
+ --have-eh Use exception handling (even if not found in tests).
+ --no-eh Do not use exception handling (even if found in
+ tests).
+ --longlong=TYPE Use TYPE as for long long integers. (default: not
+ supported)
+ --no-static-init Do not rely on static initialization in the test
+ runner.
+ --template=TEMPLATE Generate the test runner using file TEMPLATE to define
+ a template.
+ --root Write the main() function and global data for a test
+ runner.
+ --part Write the tester classes for a test runner.
+ -f, --fog-parser Use new FOG C++ parser</tt></pre>
+</div></div>
+<div class="paragraph"><p>The following section describe illustrate the use of these command line options.</p></div>
+<div class="sect2">
+<h3 id="_general_options">4.1. General Options</h3>
+<div class="paragraph"><p>The default behavior of <tt>cxxtestgen</tt> is to send the source for the
+test runner to the standard output stream. The <tt>--output</tt> (<tt>-o</tt>)
+option indicates a filename for the test runner.</p></div>
+<div class="paragraph"><p>The <tt>--world</tt> (<tt>-w</tt>) option specifies the value of the <tt>CxxTest::RealWorldDescription::_worldName</tt>
+variable. This option also customizes the filename used for XML output files (see below).</p></div>
+<div class="paragraph"><p>The <tt>--include</tt> option defines a filename that is included in the runner before all other headers.</p></div>
+<div class="paragraph"><p>The <tt>--abort-on-fail</tt> option forces an abort if a test fails, rather than continuing execution
+to the next test.</p></div>
+<div class="paragraph"><p>The <tt>--main</tt> option specifies an alternate name for the <tt>main()</tt> function.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_test_listener_options">4.2. Test Listener Options</h3>
+<div class="paragraph"><p>The test runner behavior is controlled by a <em>test listener</em> class
+that is used to define to the <tt>main</tt> function. The test listener
+class is a subclass of <tt>TestListener</tt> that receives notifications
+about the testing process, notably which assertions failed. The
+<tt>--runner</tt> option is used to specify the test listener that is used
+in the test runner. The following test listeners are defined in
+CxxTest:</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<tt>ErrorPrinter</tt>
+</dt>
+<dd>
+<p>
+ This is the standard error printer, which formats its output to the standard output stream (<tt>std::cout</tt>).
+</p>
+</dd>
+<dt class="hdlist1">
+<tt>StdioPrinter</tt>
+</dt>
+<dd>
+<p>
+ The same as <tt>ErrorPrinter</tt> except that it uses <tt>printf</tt> instead of <tt>std::cout</tt>.
+</p>
+</dd>
+<dt class="hdlist1">
+<tt>ParenPrinter</tt>
+</dt>
+<dd>
+<p>
+ Identical to <tt>ErrorPrinter</tt> except that it prints line numbers in parantheses. This is the way Visual Studio expects it.
+</p>
+</dd>
+<dt class="hdlist1">
+<tt>XmlPrinter</tt>
+</dt>
+<dd>
+<p>
+ Print test results to an XML file.
+</p>
+</dd>
+<dt class="hdlist1">
+<tt>XUnitPrinter</tt>
+</dt>
+<dd>
+<p>
+ This test listener generates output using both <tt>ErrorPrinter</tt> and <tt>XmlPrinter</tt>.
+</p>
+</dd>
+</dl></div>
+<div class="sect3">
+<h4 id="_errorprinter">4.2.1. ErrorPrinter</h4>
+<div class="paragraph"><p>The <tt>--error-printer</tt> option creates a runner using the <tt>ErrorPrinter</tt>
+test listener, and it indicates that the standard library is used
+in the test runner. The <tt>ErrorPrinter</tt> test listener prints dots
+to summarize test execution, along with a summary of the test
+results. For example, the command</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --error-printer -o runner<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 3 tests..
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 3 tests
+Success rate: 66%</tt></pre>
+</div></div>
+</div>
+<div class="sect3">
+<h4 id="_stdioprinter">4.2.2. StdioPrinter</h4>
+<div class="paragraph"><p>If your compiler does not support <tt>std::cout</tt>, then the <tt>ErrorPrinter</tt> test listener cannot be used.
+In this case, the <tt>StdioPrinter</tt> test listener can be used; it provides the same output as <tt>ErrorPrinter</tt> but it uses the <tt>printf</tt> function. For example, the command line:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --runner<span style="color: #990000">=</span>StdioPrinter -o runner<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%</tt></pre>
+</div></div>
+</div>
+<div class="sect3">
+<h4 id="_parenprinter">4.2.3. ParenPrinter</h4>
+<div class="paragraph"><p>The <tt>--runner=ParenPrinter</tt> option creates a similar test runner:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --runner<span style="color: #990000">=</span>ParenPrinter -o runner<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>This test runner generates output that is similar to the <tt>ErrorPrinter</tt> test listener:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h(16): Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The only difference is the parentheses used in the output. This test listener provides a format that can be recognized by Visual Studio.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_xmlprinter">4.2.4. XmlPrinter</h4>
+<div class="paragraph"><p>The <tt>--runner=XmlPrinter</tt> option creates a test runner whose output is an XML summary of the test results. For example, the command:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --runner<span style="color: #990000">=</span>XmlPrinter -o runner<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt><?xml version="1.0" encoding="UTF-8" ?>
+<testsuite name="cxxtest" tests="2" errors="0" failures="1" time="0" >
+ <testcase classname="MyTestSuite2" name="testAddition" line="7" />
+ <testcase classname="MyTestSuite2" name="testMultiplication" line="13">
+ <failure file="MyTestSuite2.h" line="16" type="failedAssertEquals" >Error: Expected (2 * 2 == 5), found (4 != 5)</failure>
+ </testcase>
+</testsuite></tt></pre>
+</div></div>
+<div class="paragraph"><p>This XML format is conforms to the XML standard used by other xUnit tools. Thus, this output can be used as input in other tools, like <a href="http://jenkins-ci.org/">Jenkins</a>, to generate test summaries.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_xunitprinter">4.2.5. XUnitPrinter</h4>
+<div class="paragraph"><p>The <tt>XUnitPrinter</tt> test listener generates output using both the
+ErrorPrinter+ and <tt>XmlPrinter</tt> test listeners. This allows the
+user to interactively view a simple test summary, while simultaneously
+generating an XML summary of the test results. The <tt>--xunit-printer</tt>
+option specifies the use of <tt>XUnitPrinter</tt>:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --xunit-printer -o runner<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>This test runner generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The default filename for the XML results is <tt>TEST-cxxtest.xml</tt>. The <tt>--xunit-file</tt> option can be used to specify an alternative filename. Additionally, the value of the <tt>--world</tt> option can be used to specify the filename <tt>TEST-<world>.xml</tt>.</p></div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_language_options">4.3. Language Options</h3>
+<div class="paragraph"><p>When <tt>cxxtestgen</tt> performs test discovery, it also performs checks
+to detect whether (1) the standard library is used and (2) exceptions
+are used. These checks configure CxxTest to <em>not</em> assume that these
+C++ language features are used when generating the test driver.
+Thus, CxxTest can naturally be used with compilers that do not
+support these features.</p></div>
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> command includes several options that override
+these checks and define features of C++ that are used by the test
+runner. The <tt>--have-std</tt> option indicates that the test runner
+should use the standard library, and the <tt>--no-std</tt> option indicates
+that the test runner should not use the standard library. The
+--have-eh+ options indicates that the test runner should use
+exception handling, and the <tt>--no-eh</tt> indicates that the test runner
+should not not use exception handling.</p></div>
+<div class="paragraph"><p>The <tt>--longlong</tt> option specifies the type used for long long
+integers. The default is for <em>no</em> long long integer type to be specified,
+which is consistent with the current C++ standard.</p></div>
+<div class="paragraph"><p>CxxTest test runners depend quite heavily on static initialization
+of objects that are used to define and execute tests. The
+--no-static-init+ option can be used to avoid static initialization
+for compilers or linkers that have trouble compiling the default test runner.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_creating_test_runners_from_parts">4.4. Creating Test Runners from Parts</h3>
+<div class="paragraph"><p>The default behavior of <tt>cxxtestgen</tt> is to generate a test runner
+that directly integrates classes that define the tests along with
+a <tt>main()</tt> function that executes all test suites. It is often useful to
+allow test suites to be processes separately and then linked together. The <tt>--root</tt> and <tt>--part</tt> options
+support this logic. For example, suppose that we wish to define a test runner for tests in the headers
+MyTestSuite1.h+ and <tt>MyTestSuite2.h</tt>. We execute <tt>cxxtestgen</tt> with the <tt>--part</tt> option to generate source files for each of the test suites:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --part --error-printer -o MyTestSuite1<span style="color: #990000">.</span>cpp MyTestSuite1<span style="color: #990000">.</span>h
+cxxtestgen --part --error-printer -o MyTestSuite2<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>Similarly, we execute <tt>cxxtestgen</tt> with the <tt>--root</tt> opiton to generate the <tt>main()</tt> routine:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --root --error-printer -o runner<span style="color: #990000">.</span>cpp</tt></pre></div></div>
+<div class="paragraph"><p>Finally, the test runner is built by compiling all of these source files together:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>g<span style="color: #990000">++</span> -o runner -I<span style="color: #009900">$CXXTEST</span> runner<span style="color: #990000">.</span>cpp MyTestSuite1<span style="color: #990000">.</span>cpp MyTestSuite2<span style="color: #990000">.</span>cpp</tt></pre></div></div>
+</div>
+<div class="sect2">
+<h3 id="_template_files">4.5. Template Files</h3>
+<div class="paragraph"><p>CxxTest supports the use of <em>template files</em> to provide a custom
+main()+ function. This may be useful when using a custom test
+listener, or when using an existing CxxTest test listener in a
+nonstandard manner. A template file is an ordinary source files
+with the embedded declaration <tt><CxxTest world></tt>, which tells
+cxxtestgen+ to insert the world definition at that point.</p></div>
+<div class="paragraph"><p>The <tt>--template</tt> option is used to specify the use of a template file:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen -o runner<span style="color: #990000">.</span>cpp --template runner10<span style="color: #990000">.</span>tpl MyTestSuite2<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>For example, consider the following template file:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_HAVE_EH
+<span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_ABORT_TEST_ON_FAIL
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/ErrorPrinter.h></span>
+
+<span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">main</span></span><span style="color: #990000">()</span>
+<span style="color: #FF0000">{</span>
+ std<span style="color: #990000">::</span>cout <span style="color: #990000"><<</span> <span style="color: #FF0000">"Starting test runner"</span> <span style="color: #990000"><<</span> std<span style="color: #990000">::</span>endl<span style="color: #990000">;</span>
+ <span style="color: #009900">int</span> status <span style="color: #990000">=</span> CxxTest<span style="color: #990000">::</span><span style="font-weight: bold"><span style="color: #000000">ErrorPrinter</span></span><span style="color: #990000">().</span><span style="font-weight: bold"><span style="color: #000000">run</span></span><span style="color: #990000">();</span>
+ std<span style="color: #990000">::</span>cout <span style="color: #990000"><<</span> <span style="color: #FF0000">"Stopping test runner"</span> <span style="color: #990000"><<</span> std<span style="color: #990000">::</span>endl<span style="color: #990000">;</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> status<span style="color: #990000">;</span>
+<span style="color: #FF0000">}</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">// The CxxTest "world"</span></span>
+<span style="color: #990000"><</span><span style="color: #008080">CxxTest</span> world<span style="color: #990000">></span></tt></pre></div></div>
+<div class="paragraph"><p>This file specifies macros that customize the test runner, and output is generated before and after the tests are run.</p></div>
+<div class="paragraph"><p>Note that CxxTest needs to insert certain definitions and <tt>#include</tt>
+directives in the runner file. It normally does that before the
+first <tt>#include <cxxtest/*.h></tt> found in the template file. If this
+behavior is not what you need, use the directive <tt><CxxTest preamble></tt>
+to specify where this preamble is inserted.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_test_discovery_options">4.6. Test Discovery Options</h3>
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> command performs test discovery by searching C++
+header files for CxxTest test classes. The default process for
+test discovery is a simple process that analyzes each line in a
+header file sequentially, looking for a sequence of lines that
+represent class definitions and test method definitions.</p></div>
+<div class="paragraph"><p>There are many limitations to this simple process for test discovery,
+and in CxxTest 4.0 a new test discovery mechanism was added based
+on the a parser for the
+<a href="http://www.computing.surrey.ac.uk/research/dsrg/fog/">Flexible Object
+Generator (FOG)</a> language, which is a superset of C+<tt>. The grammar
+for the FOG language was adapted to parse C</tt>+ header files to
+identify class definitions and class inheritance relationships,
+class and namespace nesting of declarations, and class methods.
+This allows <tt>cxxtestgen</tt> to identify test classes that are defined
+with complex inheritance relationships.</p></div>
+<div class="paragraph"><p>The <tt>--fog</tt> option is used to specify the use of the FOG parser for
+test discovery. Although the FOG parser is more powerful, the
+simpler <tt>cxxtestgen</tt> test discover process is the default because
+the FOG parser is slower execute. Additionally, the FOG parser
+requires the installation of <tt>ply</tt> and, for Python version 2.6,
+ordereddict+. If these packages are not available, then the <tt>--fog</tt>
+option is automatically disabled.</p></div>
+<div class="paragraph"><p>The following sections illustrate differences between these two test discovery mechanisms, along with
+general limitations of the test discovery process.</p></div>
+<div class="sect3">
+<h4 id="_unexpected_test_suite_format">4.6.1. Unexpected Test Suite Format</h4>
+<div class="paragraph"><p>The default test discovery mechanism does a very simple analysis
+of the input files, which can easily fail when test classes are not
+formated in a standard manner. For example, consider the following
+test suite:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite4.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite4</span>
+ <span style="color: #990000">:</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testAddition</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>This test suite is not recognized by the default test discovery
+mechanism, but the FOG parser correctly parsers this file and
+recognizes the test suite. A variety of similar discovery failures
+arise due to the simple process used by the test discovery mechanism.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_commenting_out_tests">4.6.2. Commenting Out Tests</h4>
+<div class="paragraph"><p>Adding and disabling tests are two common steps in test development.
+The process of test discovery makes adding tests very easy. However,
+disabling tests is somewhat more complicated. Consider the following
+header file, which defines four tests (three of which are disabled):</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite3.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite3</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testAddition</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">// void testMultiplication( void )</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// {</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// TS_ASSERT( 1 * 1 < 2 );</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// TS_ASSERT_EQUALS( 1 * 1, 2 );</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// }</span></span>
+
+<span style="font-style: italic"><span style="color: #9A1900">/*</span></span>
+<span style="font-style: italic"><span style="color: #9A1900"> void testSubtraction( void )</span></span>
+<span style="font-style: italic"><span style="color: #9A1900"> {</span></span>
+<span style="font-style: italic"><span style="color: #9A1900"> TS_ASSERT( 1 - 1 < 1 );</span></span>
+<span style="font-style: italic"><span style="color: #9A1900"> TS_ASSERT_EQUALS( 1 - 1, 0 );</span></span>
+<span style="font-style: italic"><span style="color: #9A1900"> }</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">*/</span></span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">XtestDivision</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">/</span> <span style="color: #993399">1</span> <span style="color: #990000"><</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">/</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>The first is commented out with C++-style comments, the second
+test is commented out with C-style comments, and the third test is
+named in a manner that is not recognized through test discovery
+(i.e., it does not start with <tt>test</tt>).</p></div>
+<div class="paragraph"><p>The default test discovery mechanism only works with the first and
+third methods for disabling tests, but the FOG parser works with
+all three. The FOG parser performs a complex, multi-line parse of
+the source file, so it can identify multi-line C-style comments.</p></div>
+<div class="paragraph"><p>Note, however, that the use of C macros will not work:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// BadTestSuite1.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">BadTestSuite1</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testAddition</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="font-weight: bold"><span style="color: #000080">#if</span></span> <span style="color: #993399">0</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testSubtraction</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">-</span> <span style="color: #993399">1</span> <span style="color: #990000"><</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">-</span> <span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">0</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="font-weight: bold"><span style="color: #000080">#endif</span></span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> discovery mechanisms do not perform a C preprocessing
+step, since that would generally require using externally defined
+preprocessing variable definitions. Additionally, preprocessor macros that act like functions will
+cause the FOG parser to fail unless they are followed by a semicolon.</p></div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="runner">5. Test Runner Syntax</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The default behavior of the CxxTest test runner is to execute all
+tests in all of the test suites that are linked into the runner.
+However, CxxTest test runners process command line options that
+allow individual tests and test suites to be selected.</p></div>
+<div class="paragraph"><p>For example, consider a test runner defined as follows:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen -f --error-printer -o runner<span style="color: #990000">.</span>cpp MyTestSuite1<span style="color: #990000">.</span>h MyTestSuite2<span style="color: #990000">.</span>h MyTestSuite4<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>The <tt>--help</tt> (<tt>-h</tt>) option can be used to print the command line options for a test runner. The command</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>./runner --help</tt></pre>
+</div></div>
+<div class="paragraph"><p>generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>./runner <suitename>
+./runner <suitename> <testname>
+./runner -h
+./runner --help
+./runner --help-tests
+./runner -v Enable tracing output.</tt></pre>
+</div></div>
+<div class="paragraph"><p>The <tt>--help-tests</tt> option is used to list all test suites that are defined in a test runner. The command</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">.</span>/runner --help-tests</tt></pre></div></div>
+<div class="paragraph"><p>generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Suite/Test Names
+---------------------------------------------------------------------------
+MyTestSuite1 testAddition
+MyTestSuite2 testAddition
+MyTestSuite2 testMultiplication
+MyTestSuite4 testAddition</tt></pre>
+</div></div>
+<div class="paragraph"><p>The first column is the test suite name, and the second column is the test name.</p></div>
+<div class="paragraph"><p>All tests in a test suite can be executed by simply specifying the test suite name. For example</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">.</span>/runner MyTestSuite2</tt></pre></div></div>
+<div class="paragraph"><p>executes the tests in test suite <tt>MyTestSuite2</tt>:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 tests.
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 2 tests
+Success rate: 50%</tt></pre>
+</div></div>
+<div class="paragraph"><p>Similarly, a single test can be executed by specifying the test suite followed by the test name. For example</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">.</span>/runner MyTestSuite2 testMultiplication</tt></pre></div></div>
+<div class="paragraph"><p>executes the <tt>testMultiplication</tt> test in test suite <tt>MyTestSuite2</tt>:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 1 test
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+Failed 1 of 1 test
+Success rate: 0%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The <tt>-v</tt> option enables the printing of trace information generated
+by the <tt>TS_TRACE</tt> function. For example, the <tt>testMultiplication</tt> test contains trace declarations
+before and after the multiplication test. Thus, the command</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">.</span>/runner -v MyTestSuite2 testMultiplication</tt></pre></div></div>
+<div class="paragraph"><p>generates this trace output before and after the test:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 1 test
+In MyTestSuite2::testMultiplication:
+MyTestSuite2.h:15: Trace: Starting multiplication test
+MyTestSuite2.h:16: Error: Expected (2 * 2 == 5), found (4 != 5)
+MyTestSuite2.h:17: Trace: Finishing multiplication test
+Failed 1 of 1 test
+Success rate: 0%</tt></pre>
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="advanced">6. Advanced Testing Features</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_preprocessor_macros">6.1. Preprocessor Macros</h3>
+<div class="paragraph"><p>CxxTest recognizes a variety of preprocessor macros that can be used to modify the behavior of a test runner. Many of these mimic the options of the <tt>cxxtestgen</tt> command.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="100%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<col width="50%" />
+<col width="50%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Preprocessor Macro </th>
+<th align="left" valign="top"> Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_HAVE_STD</tt></p></td>
+<td align="left" valign="top"><p class="table">Use the standard library.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_HAVE_EH</tt></p></td>
+<td align="left" valign="top"><p class="table">Use exception handling.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_ABORT_TEST_ON_FAIL</tt></p></td>
+<td align="left" valign="top"><p class="table">Abort tests on failed asserts.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_USER_VALUE_TRAITS</tt></p></td>
+<td align="left" valign="top"><p class="table">Enable user-defined value traits. The default traits dump up to 8 bytes of the data as hex values.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_OLD_TEMPLATE_SYNTAX</tt></p></td>
+<td align="left" valign="top"><p class="table">Use old template syntax that is used by some compilers (e.g. Borland C++ 5).</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_OLD_STD</tt></p></td>
+<td align="left" valign="top"><p class="table">Use old syntax for libraries where <tt>std::</tt> is not recognized.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_MAX_DUMP_SIZE</tt></p></td>
+<td align="left" valign="top"><p class="table">The value of this macro defines the maximum number of bytes to dump if <tt>TS_ASSERT_SAME_DATA()</tt> fails. The default is 0, which indicates no limit.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_DEFAULT_ABORT</tt></p></td>
+<td align="left" valign="top"><p class="table">The value of this macro is the default value of the dynamic <em>abort on fail</em> flag.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>CXXTEST_LONGLONG</tt></p></td>
+<td align="left" valign="top"><p class="table">The value of this macro is used to define long long integers.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="paragraph"><p>These preprocessor macros must be defined before the CxxTest header
+files are included in the test runner. For example, the following
+template file defines <tt>CXXTEST_HAVE_EH</tt> and <tt>CXXTEST_ABORT_TEST_ON_FAIL</tt>
+before other headers are included:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_HAVE_EH
+<span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_ABORT_TEST_ON_FAIL
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/ErrorPrinter.h></span>
+
+<span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">main</span></span><span style="color: #990000">()</span>
+<span style="color: #FF0000">{</span>
+ std<span style="color: #990000">::</span>cout <span style="color: #990000"><<</span> <span style="color: #FF0000">"Starting test runner"</span> <span style="color: #990000"><<</span> std<span style="color: #990000">::</span>endl<span style="color: #990000">;</span>
+ <span style="color: #009900">int</span> status <span style="color: #990000">=</span> CxxTest<span style="color: #990000">::</span><span style="font-weight: bold"><span style="color: #000000">ErrorPrinter</span></span><span style="color: #990000">().</span><span style="font-weight: bold"><span style="color: #000000">run</span></span><span style="color: #990000">();</span>
+ std<span style="color: #990000">::</span>cout <span style="color: #990000"><<</span> <span style="color: #FF0000">"Stopping test runner"</span> <span style="color: #990000"><<</span> std<span style="color: #990000">::</span>endl<span style="color: #990000">;</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> status<span style="color: #990000">;</span>
+<span style="color: #FF0000">}</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">// The CxxTest "world"</span></span>
+<span style="color: #990000"><</span><span style="color: #008080">CxxTest</span> world<span style="color: #990000">></span></tt></pre></div></div>
+<div class="paragraph"><p>Several of these macros concern whether modern C++ conventions are
+supported by the compiler. If tests need to be ported to multiple
+compilers, then one important convention is whether the namespace
+<tt>std::</tt> is supported. For example, switching between <tt>cout</tt> and
+<tt>std::cout</tt> typically needs to be done throughout a code. CxxTest
+supports this with the <tt>CXXTEST_STD()</tt> macro. For example,
+<tt>CXXTEST_STD(cout)</tt> can be used within a test suite, and CxxTest
+handles the mapping of this to <tt>cout</tt> or <tt>std::cout</tt> depending on
+options provided to <tt>cxxtestgen</tt>.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_customizing_test_fixtures">6.2. Customizing Test Fixtures</h3>
+<div class="sect3">
+<h4 id="_setup_and_teardown">6.2.1. Setup and Teardown</h4>
+<div class="paragraph"><p>CxxTest test fixtures can be customized in several ways to manage
+the environment for test suites and individual tests. A common
+feature of test suites is that they share a common logic for setting
+up data used in the tests. Thus, there may be duplicate code for
+creating objects, files, inputs, etc. Similarly, the tests may
+share common logic for cleaning up after the test is finished (e.g. deleting temporary objects).</p></div>
+<div class="paragraph"><p>You can put this shared code in a common place by overriding the
+virtual functions <tt>TestSuite::setUp()</tt> and <tt>TestSuite::tearDown()</tt>.
+The <tt>setUp()</tt> function is called before each test, and <tt>tearDown()</tt>
+is called after each test.</p></div>
+<div class="paragraph"><p>For example, the following test suite employs <tt>setUp()</tt> and <tt>tearDown()</tt> methods to
+allocate and deallocate memory for a string buffer:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite5.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><string.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite5</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+ <span style="color: #009900">char</span> <span style="color: #990000">*</span>_buffer<span style="color: #990000">;</span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">setUp</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ _buffer <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #0000FF">new</span></span> <span style="color: #009900">char</span><span style="color: #990000">[</span><span style="color: #993399">1024</span><span style="color: #990000">];</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">tearDown</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">delete</span></span> <span style="color: #990000">[]</span> _buffer<span style="color: #990000">;</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_strcpy</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">strcpy</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">,</span> <span style="color: #FF0000">"Hello, world!"</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> <span style="color: #FF0000">'H'</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">'e'</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_memcpy</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">memcpy</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">,</span> <span style="color: #FF0000">"Hello, world!"</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span><span style="color: #009900">char</span><span style="color: #990000">));</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> <span style="color: #FF0000">'H'</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>_buffer<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">'e'</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+</tt></pre></div></div>
+</div>
+<div class="sect3">
+<h4 id="_dynamically_created_test_suites">6.2.2. Dynamically Created Test Suites</h4>
+<div class="paragraph"><p>CxxTest test fixtures can also be customized during the construction
+and deconstruction of test suites. By default, CxxTest test suites
+are instantiated statically in the test runner. However, dynamically
+created test suites can be used to perform suite-level setup and
+teardown operations, verify the environment needed to execute a
+test suite, and construct test suites that require a nontrivial
+constructor.</p></div>
+<div class="paragraph"><p>CxxTest instantiates a test suite dynamically if the <tt>createSuite()</tt>
+or <tt>destroySuite()</tt> methods are defined. For example, the following
+test suite checks to see if it is being compiled with Microsoft
+Visual Studio. If not, the <tt>createSuite()</tt> returns a null pointer,
+indicating that the test suite was not created.</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite6.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite6</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+
+ <span style="font-weight: bold"><span style="color: #0000FF">static</span></span> MyTestSuite6<span style="color: #990000">*</span> <span style="font-weight: bold"><span style="color: #000000">createSuite</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #000080"> #ifdef</span></span> _MSC_VER
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="font-weight: bold"><span style="color: #0000FF">new</span></span> <span style="font-weight: bold"><span style="color: #000000">MyTestSuite6</span></span><span style="color: #990000">();</span>
+<span style="font-weight: bold"><span style="color: #000080"> #else</span></span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="color: #993399">0</span><span style="color: #990000">;</span>
+<span style="font-weight: bold"><span style="color: #000080"> #endif</span></span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="font-weight: bold"><span style="color: #0000FF">static</span></span> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">destroySuite</span></span><span style="color: #990000">(</span> MyTestSuite6<span style="color: #990000">*</span> suite <span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">delete</span></span> suite<span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_nothing</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> <span style="color: #FF0000">"Nothing to test"</span> <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+</div>
+<div class="sect3">
+<h4 id="_global_and_world_fixtures">6.2.3. Global and World Fixtures</h4>
+<div class="paragraph"><p>CxxTest supports two related mechanisms for performing <em>global</em>
+setup and teardown operations. <em>Global fixtures</em> are classes that
+inherit from <tt>CxxTest::GlobalFixture</tt>, and they define <tt>setUp</tt> and
+<tt>tearDown</tt> methods. The <tt>setUp</tt> method for all global fixtures is
+called before each test is executed, and the <tt>tearDown</tt> method for
+all global fixtures is called after each test is completed. Thus,
+this mechanism provides a convenient way of defining setup and
+teardown operations that apply to all test suites.</p></div>
+<div class="paragraph"><p>For example, consider the following test suite:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite8.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cstdio></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/GlobalFixture.h></span>
+
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// Fixture1 counts its setUp()s and tearDown()s</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">Fixture1</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>GlobalFixture
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">unsigned</span> setUpCount<span style="color: #990000">;</span>
+ <span style="color: #009900">unsigned</span> tearDownCount<span style="color: #990000">;</span>
+
+ <span style="font-weight: bold"><span style="color: #000000">Fixture1</span></span><span style="color: #990000">()</span> <span style="color: #FF0000">{</span> setUpCount <span style="color: #990000">=</span> tearDownCount <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">setUp</span></span><span style="color: #990000">()</span> <span style="color: #FF0000">{</span> <span style="color: #990000">++</span> setUpCount<span style="color: #990000">;</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">tearDown</span></span><span style="color: #990000">()</span> <span style="color: #FF0000">{</span> <span style="color: #990000">++</span> tearDownCount<span style="color: #990000">;</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">setUpWorld</span></span><span style="color: #990000">()</span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span> <span style="color: #FF0000">"Starting a test suite</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span> <span style="color: #990000">);</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span><span style="color: #FF0000">}</span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">tearDownWorld</span></span><span style="color: #990000">()</span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span> <span style="color: #FF0000">"Finishing a test suite</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span> <span style="color: #990000">);</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span><span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+<span style="font-weight: bold"><span style="color: #0000FF">static</span></span> <span style="color: #008080">Fixture1</span> fixture1<span style="color: #990000">;</span>
+
+
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// Fixture2 counts its setUp()s and tearDown()s and makes sure</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// its setUp() is called after Fixture1 and its tearDown() before.</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">Fixture2</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> Fixture1
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">setUp</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>setUpCount<span style="color: #990000">,</span> fixture1<span style="color: #990000">.</span>setUpCount <span style="color: #990000">-</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>tearDownCount<span style="color: #990000">,</span> fixture1<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> Fixture1<span style="color: #990000">::</span><span style="font-weight: bold"><span style="color: #000000">setUp</span></span><span style="color: #990000">();</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">tearDown</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>setUpCount<span style="color: #990000">,</span> fixture1<span style="color: #990000">.</span>setUpCount<span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>tearDownCount<span style="color: #990000">,</span> fixture1<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> Fixture1<span style="color: #990000">::</span><span style="font-weight: bold"><span style="color: #000000">tearDown</span></span><span style="color: #990000">();</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+<span style="font-weight: bold"><span style="color: #0000FF">static</span></span> <span style="color: #008080">Fixture2</span> fixture2<span style="color: #990000">;</span>
+
+
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">// Verify the counts for the global fixtures</span></span>
+<span style="font-style: italic"><span style="color: #9A1900">//</span></span>
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite8</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testCountsFirstTime</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture1<span style="color: #990000">.</span>setUpCount<span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture1<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">,</span> <span style="color: #993399">0</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture2<span style="color: #990000">.</span>setUpCount<span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture2<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">,</span> <span style="color: #993399">0</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testCountsSecondTime</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture1<span style="color: #990000">.</span>setUpCount<span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture1<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture2<span style="color: #990000">.</span>setUpCount<span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>fixture2<span style="color: #990000">.</span>tearDownCount<span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>This test suite defines a runner that generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 testsStarting a test suite
+Starting a test suite
+..Finishing a test suite
+Finishing a test suite
+OK!</tt></pre>
+</div></div>
+<div class="paragraph"><p>Note that the global fixtures are instantiated with static global
+values. This ensures that these fixtures are created before the
+runner is initialized. Also, note that the <tt>setUp</tt> methods are
+called in the same sequence that the global fixtures are instantiated,
+and the <tt>tearDown</tt> methods are called in the reverse sequence.
+Finally, note that the <tt>setUp</tt> and <tt>tearDown</tt> methods in global
+fixtures return a boolean value, which indicates success or failure
+of that operation.</p></div>
+<div class="paragraph"><p>This example also illustrates the use of <em>world fixtures</em>, which
+perform setup and teardown operations that are executed once each
+when beginning and finishing tests in each test suite. World
+fixtures are defined with the <tt>setUpWorld</tt> and <tt>tearDownWorld</tt>
+methods in a global fixture.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_runtime_test_customization">6.2.4. Runtime Test Customization</h4>
+<div class="paragraph"><p>CxxTest defines several functions that can be called in a test suite to modify the default behavior of CxxTest.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="100%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<col width="50%" />
+<col width="50%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Test Suite Method </th>
+<th align="left" valign="top"> Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>setAbortTestOnFail(bool)</tt></p></td>
+<td align="left" valign="top"><p class="table">This function specifies whether tests abort after a failure. The default value of the flag is <tt>false</tt>. This function only has an effect if exception handling is enabled.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>setMaxDumpSize(unsigned)</tt></p></td>
+<td align="left" valign="top"><p class="table">This function sets the maximum number of bytes that are dumped when
+<tt>TS_ASSERT_SAME_DATA()</tt> fails. The default is 0, which indicates no limit.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="paragraph"><p>Note that the the configuration parameters are reset to their default
+values after each test is executed (more precisely, after <tt>tearDown()</tt>
+is called). Consequently, calling these functions in the <tt>setUp()</tt>
+function has the effect of setting that value for the entire test
+suite.</p></div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="traits">7. Value Traits</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>CxxTest’s test assertions like <a href="#ts_assert_equals">TS_ASSERT_EQUALS</a>
+work for built-in types, but they will not likely work for user-defined
+data types. This is because CxxTest needs a way to compare objects
+and to convert them to strings when printing test failure summaries.
+Thus, user-defined data types need to have the <tt>operator=</tt> method
+defined to ensure that test assertions can be applied.</p></div>
+<div class="paragraph"><p>For example, the following code</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite7.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><iostream></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite7</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+
+ <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">Data</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #009900">char</span> data<span style="color: #990000">[</span><span style="color: #993399">3</span><span style="color: #990000">];</span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #0000FF">operator</span></span><span style="color: #990000">==(</span><span style="color: #008080">Data</span> o<span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">memcmp</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">this</span></span><span style="color: #990000">,</span> <span style="color: #990000">&</span>o<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>o<span style="color: #990000">))</span> <span style="color: #990000">==</span> <span style="color: #993399">0</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+ <span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+ <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">Data2</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #009900">char</span> data<span style="color: #990000">[</span><span style="color: #993399">3</span><span style="color: #990000">];</span>
+ <span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">testCompareData</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">Data</span> x<span style="color: #990000">,</span> y<span style="color: #990000">;</span>
+ <span style="font-weight: bold"><span style="color: #000000">memset</span></span><span style="color: #990000">(</span> x<span style="color: #990000">.</span>data<span style="color: #990000">,</span> <span style="color: #993399">0x12</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>x<span style="color: #990000">.</span>data<span style="color: #990000">)</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">memset</span></span><span style="color: #990000">(</span> y<span style="color: #990000">.</span>data<span style="color: #990000">,</span> <span style="color: #993399">0xF6</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>y<span style="color: #990000">.</span>data<span style="color: #990000">)</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> x<span style="color: #990000">,</span> y <span style="color: #990000">);</span>
+
+ <span style="color: #008080">Data2</span> z<span style="color: #990000">,</span> w<span style="color: #990000">;</span>
+ <span style="font-weight: bold"><span style="color: #000000">memset</span></span><span style="color: #990000">(</span> z<span style="color: #990000">.</span>data<span style="color: #990000">,</span> <span style="color: #993399">0x12</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>x<span style="color: #990000">.</span>data<span style="color: #990000">)</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">memset</span></span><span style="color: #990000">(</span> w<span style="color: #990000">.</span>data<span style="color: #990000">,</span> <span style="color: #993399">0xF6</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>y<span style="color: #990000">.</span>data<span style="color: #990000">)</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_SAME_DATA</span></span><span style="color: #990000">(</span> <span style="color: #990000">&</span>z<span style="color: #990000">,</span> <span style="color: #990000">&</span>w<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">sizeof</span></span><span style="color: #990000">(</span>z<span style="color: #990000">)</span> <span style="color: #990000">)</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+</tt></pre></div></div>
+<div class="paragraph"><p>defines a test runner that generates the following output</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 1 test
+In MyTestSuite7::testCompareData:
+MyTestSuite7.h:27: Error: Expected (x == y), found ({ 12 12 12 } != { F6 F6 F6 })
+MyTestSuite7.h:32: Error: Expected sizeof(z) (3) bytes to be equal at (&z) and (&w), found:
+ { 12 12 12 }
+ differs from
+ { F6 F6 F6 }
+Failed 1 of 1 test
+Success rate: 0%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The <tt>operator=</tt> method is required to apply
+<a href="#ts_assert_equals">TS_ASSERT_EQUALS</a> to <tt>Data</tt> objects. However,
+the <a href="#ts_assert_same_data">TS_ASSERT_SAME_DATA</a> assertion can be
+applied to <tt>Data2</tt> objects that do not have <tt>operator=</tt> defined.</p></div>
+<div class="paragraph"><p>Since CxxTest does not rely on any external library, conversion
+from arbitrary data types to strings is done using <em>value traits</em>.
+For example, to convert an integer to a string, CxxTest does the following:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #009900">int</span> i <span style="color: #990000">=</span> <span style="color: #993399">10</span><span style="color: #990000">;</span>
+CxxTest<span style="color: #990000">::</span><span style="color: #008080">ValueTraits<int></span> <span style="font-weight: bold"><span style="color: #000000">converter</span></span><span style="color: #990000">(</span>i<span style="color: #990000">);</span>
+<span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #009900">char</span><span style="color: #990000">*</span> string <span style="color: #990000">=</span> converter<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">asString</span></span><span style="color: #990000">();</span></tt></pre></div></div>
+<div class="paragraph"><p>The CxxTest header file <tt>cxxtest/ValueTraits.h</tt> defines value traits
+for standard types like <tt>int</tt>, <tt>char</tt>, <tt>double</tt>, etc. The default
+<tt>ValueTraits</tt> class for unknown types dumps up to 8 bytes of the value
+in hex format.</p></div>
+<div class="paragraph"><p>If the macro <tt>CXXTEST_USER_VALUE_TRAITS</tt> is defined, then CxxTest will
+omit the default definitions for <tt>ValueTraits</tt>. This allows a user to define their own trait specifications to customize the display of trait information.</p></div>
+<div class="sect2">
+<h3 id="_enumeration_traits">7.1. Enumeration Traits</h3>
+<div class="paragraph"><p>CxxTest provides a simple way to define value traits for enumeration
+types. The <tt>CXXTEST_ENUM_TRAITS</tt> macro is used to define value
+traits for all members of an enumeration set.</p></div>
+<div class="paragraph"><p>For example, the following code</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite9.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">enum</span></span> Answer <span style="color: #FF0000">{</span>
+ Yes<span style="color: #990000">,</span>
+ No<span style="color: #990000">,</span>
+ Maybe<span style="color: #990000">,</span>
+ DontKnow<span style="color: #990000">,</span>
+ DontCare
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">// Declare value traits for the Answer enumeration</span></span>
+<span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_TRAITS</span></span><span style="color: #990000">(</span> Answer<span style="color: #990000">,</span>
+ <span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_MEMBER</span></span><span style="color: #990000">(</span> Yes <span style="color: #990000">)</span>
+ <span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_MEMBER</span></span><span style="color: #990000">(</span> No <span style="color: #990000">)</span>
+ <span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_MEMBER</span></span><span style="color: #990000">(</span> Maybe <span style="color: #990000">)</span>
+ <span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_MEMBER</span></span><span style="color: #990000">(</span> DontKnow <span style="color: #990000">)</span>
+ <span style="font-weight: bold"><span style="color: #000000">CXXTEST_ENUM_MEMBER</span></span><span style="color: #990000">(</span> DontCare <span style="color: #990000">)</span> <span style="color: #990000">);</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">// Test the trait values</span></span>
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">EnumTraits</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_Enum_traits</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> Yes <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> No <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> Maybe <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> DontKnow <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> DontCare <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span> <span style="color: #990000">(</span>Answer<span style="color: #990000">)</span><span style="color: #993399">1000</span> <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>defines a test runner that generates the following output</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 1 test
+In EnumTraits::test_Enum_traits:
+MyTestSuite9.h:26: Error: Test failed: Yes
+MyTestSuite9.h:27: Error: Test failed: No
+MyTestSuite9.h:28: Error: Test failed: Maybe
+MyTestSuite9.h:29: Error: Test failed: DontKnow
+MyTestSuite9.h:30: Error: Test failed: DontCare
+MyTestSuite9.h:31: Error: Test failed: (Answer)1000
+Failed 1 of 1 test
+Success rate: 0%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The enumeration value traits print strings that represent the elements of the enumeration, except where a numeric value is provided.</p></div>
+<div class="paragraph"><p>Note that the <tt>CXXTEST_ENUM_TRAITS</tt> macros has two arguments; the list of <tt>CXXTEST_ENUM_MEMBER</tt> macros is not separated by commas!</p></div>
+</div>
+<div class="sect2">
+<h3 id="_defining_new_value_traits">7.2. Defining New Value Traits</h3>
+<div class="paragraph"><p>Defining value traits for a new class is done by providing a class
+specialization of <tt>ValueTraits</tt> that converts an object of the new
+class to a string. For example, consider the definition of the
+<tt>MyClass</tt> class:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyClass.h</span></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyClass</span>
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+
+ <span style="color: #009900">int</span> value<span style="color: #990000">;</span>
+
+ <span style="font-weight: bold"><span style="color: #000000">MyClass</span></span><span style="color: #990000">(</span><span style="color: #009900">int</span> value_<span style="color: #990000">)</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #000000">value</span></span><span style="color: #990000">(</span>value_<span style="color: #990000">)</span> <span style="color: #FF0000">{}</span>
+
+ <span style="font-style: italic"><span style="color: #9A1900">// CxxTest requires a copy constructor</span></span>
+ <span style="font-weight: bold"><span style="color: #000000">MyClass</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> MyClass<span style="color: #990000">&</span> other<span style="color: #990000">)</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #000000">value</span></span><span style="color: #990000">(</span>other<span style="color: #990000">.</span>value<span style="color: #990000">)</span> <span style="color: #FF0000">{}</span>
+
+ <span style="font-style: italic"><span style="color: #9A1900">// This is required if you want to use TS_ASSERT_EQUALS</span></span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #0000FF">operator</span></span><span style="color: #990000">==(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> MyClass<span style="color: #990000">&</span> other<span style="color: #990000">)</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> value <span style="color: #990000">==</span> other<span style="color: #990000">.</span>value<span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+
+ <span style="font-style: italic"><span style="color: #9A1900">// If you want to use TS_ASSERT_LESS_THAN</span></span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #0000FF">operator</span></span><span style="color: #990000"><(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> MyClass<span style="color: #990000">&</span> other<span style="color: #990000">)</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> value <span style="color: #990000"><</span> other<span style="color: #990000">.</span>value<span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+<span style="font-weight: bold"><span style="color: #000080">#ifdef</span></span> CXXTEST_RUNNING
+<span style="font-style: italic"><span style="color: #9A1900">// This declaration is only activated when building a CxxTest test suite</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/ValueTraits.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><stdio.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">namespace</span></span> CxxTest
+<span style="color: #FF0000">{</span>
+ CXXTEST_TEMPLATE_INSTANTIATION
+ <span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">ValueTraits</span><span style="color: #990000"><</span>MyClass<span style="color: #990000">></span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #009900">char</span> _s<span style="color: #990000">[</span><span style="color: #993399">256</span><span style="color: #990000">];</span>
+
+ <span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="font-weight: bold"><span style="color: #000000">ValueTraits</span></span><span style="color: #990000">(</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> MyClass<span style="color: #990000">&</span> m <span style="color: #990000">)</span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #000000">sprintf</span></span><span style="color: #990000">(</span> _s<span style="color: #990000">,</span> <span style="color: #FF0000">"MyClass( %i )"</span><span style="color: #990000">,</span> m<span style="color: #990000">.</span>value <span style="color: #990000">);</span> <span style="color: #FF0000">}</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #009900">char</span> <span style="color: #990000">*</span><span style="font-weight: bold"><span style="color: #000000">asString</span></span><span style="color: #990000">()</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> _s<span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+ <span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+<span style="font-weight: bold"><span style="color: #000080">#endif</span></span> <span style="font-style: italic"><span style="color: #9A1900">// CXXTEST_RUNNING</span></span></tt></pre></div></div>
+<div class="paragraph"><p>This class includes definitions of <tt>operator==</tt> and <tt>operator<</tt>
+that support comparisons with <a href="#ts_assert_equals">TS_ASSERT_EQUALS</a>
+and <a href="#ts_assert_less_than">TS_ASSERT_LESS_THAN</a>. Additionally,
+this header contains a specialization of <tt>ValueTraits</tt> (in the
+<tt>CxxTest</tt> namespace) that generates a string description of a <tt>MyClass</tt>
+instance.</p></div>
+<div class="paragraph"><p>The following test suite illustrates how these definitions can be
+used to define a test runner:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite10.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><MyClass.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite10</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_le</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">MyClass</span> <span style="font-weight: bold"><span style="color: #000000">x</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">y</span></span><span style="color: #990000">(</span><span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_LESS_THAN</span></span><span style="color: #990000">(</span> x<span style="color: #990000">,</span> y <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_eq</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">MyClass</span> <span style="font-weight: bold"><span style="color: #000000">x</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">y</span></span><span style="color: #990000">(</span><span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> x<span style="color: #990000">,</span> y <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+</tt></pre></div></div>
+<div class="paragraph"><p>This runner for this test suite generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 2 tests.
+In MyTestSuite10::test_eq:
+MyTestSuite10.h:17: Error: Expected (x == y), found (MyClass( 1 ) != MyClass( 2 ))
+Failed 1 of 2 tests
+Success rate: 50%</tt></pre>
+</div></div>
+<div class="paragraph"><p>The test failure print logic uses the specialization of <tt>ValueTraits</tt> to create
+the string description of <tt>MyClass</tt> that appears in the output.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_defining_value_traits_for_template_classes">7.3. Defining Value Traits for Template Classes</h3>
+<div class="paragraph"><p>A simple modification to the above example illustrates how a trait can be defined for a
+template class:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MyTestSuite11.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><TMyClass.h></span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MyTestSuite11</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_le</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">TMyClass<int></span> <span style="font-weight: bold"><span style="color: #000000">x</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">y</span></span><span style="color: #990000">(</span><span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_LESS_THAN</span></span><span style="color: #990000">(</span> x<span style="color: #990000">,</span> y <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_eq</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">TMyClass<int></span> <span style="font-weight: bold"><span style="color: #000000">x</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">y</span></span><span style="color: #990000">(</span><span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> x<span style="color: #990000">,</span> y <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+</tt></pre></div></div>
+<div class="paragraph"><p>Unfortunately, this example employs partial template specialization, which is not supported by all C++ compilers.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="mock">8. Testing with Mock Objects</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Mock Objects are a very useful concept for testing complex software.
+The key idea is to pass special objects to tested code that facilitates
+the testing process. For instance, a class that implements a
+protocol over TCP might rely on an abstract <tt>ISocket</tt> interface.
+Then a mock testing strategy could pass a <tt>MockSocket</tt> object that
+does anything that is useful for testing (e.g., keep a log of all
+data “sent” to verify later).</p></div>
+<div class="paragraph"><p>However, when a challenge for C/C++ developers is that you may need
+to call <em>global</em> functions which you cannot override. Consider any
+code that uses <tt>fopen()</tt>, <tt>fwrite()</tt> and <tt>fclose()</tt>. It is not
+very elegant to have this code actually create files while being
+tested. Even more importantly, you need to test how the code behaves
+when “bad” things happen (e.g., when <tt>fopen()</tt> fails). Handling
+these types of exceptional conditions is often a very challenging
+issue for software testing.</p></div>
+<div class="paragraph"><p>CxxTest addresses this challenge by providing a generic mechanism for
+defining mock global functions. The next section illustrates this mechanism for a single
+global function. The following section provides more detail about specific features of CxxTest’s
+support for mock testing.</p></div>
+<div class="sect2">
+<h3 id="_example_a_mock_tt_time_tt_function">8.1. Example: A Mock <tt>time()</tt> Function</h3>
+<div class="paragraph"><p>Suppose that we want to perform mock testing using the well known
+standard library function <tt>time()</tt>. Setting up a test suite with
+a mock global function for <tt>time()</tt> can be broken down into the
+following steps.</p></div>
+<div class="sect3">
+<h4 id="_declare_mock_functions">8.1.1. Declare Mock Functions</h4>
+<div class="paragraph"><p>The <tt>CXXTEST_MOCK_GLOBAL</tt> macro is used to declare mock global functions. It is often convenient to include
+these declarations in a header file, which is used in both the test suite as well as the code that is being tested:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// time_mock.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><time.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/Mock.h></span>
+
+<span style="font-weight: bold"><span style="color: #000000">CXXTEST_MOCK_GLOBAL</span></span><span style="color: #990000">(</span> time_t<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Return type */</span></span>
+ time<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name of the function */</span></span>
+ <span style="color: #990000">(</span> <span style="color: #008080">time_t</span> <span style="color: #990000">*</span>t <span style="color: #990000">),</span> <span style="font-style: italic"><span style="color: #9A1900">/* Prototype */</span></span>
+ <span style="color: #990000">(</span> t <span style="color: #990000">)</span> <span style="font-style: italic"><span style="color: #9A1900">/* Argument list */</span></span> <span style="color: #990000">);</span></tt></pre></div></div>
+</div>
+<div class="sect3">
+<h4 id="_mock_functions_in_tested_code">8.1.2. Mock Functions in Tested Code</h4>
+<div class="paragraph"><p>The tested code uses mock global functions, rather than using the global functions directly.
+You access mock functions in the <tt>T</tt> (for <em>Test</em>) namespace, so the tested code calls <tt>T::time()</tt> instead of
+<tt>time()</tt>. This is the equivalent of using abstract interfaces
+instead of concrete classes.</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// rand_example.cpp</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><time_mock.h></span>
+
+<span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">generateRandomNumber</span></span><span style="color: #990000">()</span>
+<span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> T<span style="color: #990000">::</span><span style="font-weight: bold"><span style="color: #000000">time</span></span><span style="color: #990000">(</span> NULL <span style="color: #990000">)</span> <span style="color: #990000">*</span> <span style="color: #993399">3</span><span style="color: #990000">;</span>
+<span style="color: #FF0000">}</span></tt></pre></div></div>
+</div>
+<div class="sect3">
+<h4 id="_mock_source_files">8.1.3. Mock Source Files</h4>
+<div class="paragraph"><p>A source file needs to be defined that implements <tt>T::time()</tt> by
+calling the real global function. This definition is performed automatically by
+defining <tt>CXXTEST_MOCK_REAL_SOURCE_FILE</tt> before the header file is defined:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// time_real.cpp</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_MOCK_REAL_SOURCE_FILE
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><time_mock.h></span></tt></pre></div></div>
+<div class="paragraph"><p>This source file is not used for testing, but instead it supports normal use of the tested code.</p></div>
+<div class="paragraph"><p>Similarly, a source file needs to be defined that implements <tt>T::time()</tt> by calling the mock
+global function. This definition is performed automatically by defining <tt>CXXTEST_MOCK_TEST_SOURCE_FILE</tt> before the header file is defined:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// time_mock.cpp</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#define</span></span> CXXTEST_MOCK_TEST_SOURCE_FILE
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><time_mock.h></span></tt></pre></div></div>
+</div>
+<div class="sect3">
+<h4 id="_test_suites_using_mock_functions">8.1.4. Test Suites using Mock Functions</h4>
+<div class="paragraph"><p>A mock object for the <tt>time()</tt> function is created using the <tt>T::Base_time</tt> class,
+which is automatically created by CxxTest. This class includes a <tt>time()</tt> method whose
+API is the same as the global <tt>time()</tt> function. Thus, this method can be defined to have
+whatever behavior is desired during testing. For example, the following example defines a
+mock object that increments a counter to define an incremental value for <tt>time()</tt>.</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-style: italic"><span style="color: #9A1900">// MockTestSuite.h</span></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><cxxtest/TestSuite.h></span>
+<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><time_mock.h></span>
+
+<span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">generateRandomNumber</span></span><span style="color: #990000">();</span>
+
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">MockObject</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> T<span style="color: #990000">::</span>Base_time
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="font-weight: bold"><span style="color: #000000">MockObject</span></span><span style="color: #990000">(</span><span style="color: #009900">int</span> initial<span style="color: #990000">)</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #000000">counter</span></span><span style="color: #990000">(</span>initial<span style="color: #990000">)</span> <span style="color: #FF0000">{}</span>
+ <span style="color: #009900">int</span> counter<span style="color: #990000">;</span>
+ <span style="color: #008080">time_t</span> <span style="font-weight: bold"><span style="color: #000000">time</span></span><span style="color: #990000">(</span> time_t <span style="color: #990000">*</span> <span style="color: #990000">)</span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> counter<span style="color: #990000">++;</span> <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+<span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">TestRandom</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">public</span></span> CxxTest<span style="color: #990000">::</span>TestSuite
+<span style="color: #FF0000">{</span>
+<span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_generateRandomNumber</span></span><span style="color: #990000">()</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">MockObject</span> <span style="font-weight: bold"><span style="color: #000000">t</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> <span style="font-weight: bold"><span style="color: #000000">generateRandomNumber</span></span><span style="color: #990000">(),</span> <span style="color: #993399">3</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> <span style="font-weight: bold"><span style="color: #000000">generateRandomNumber</span></span><span style="color: #990000">(),</span> <span style="color: #993399">6</span> <span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span> <span style="font-weight: bold"><span style="color: #000000">generateRandomNumber</span></span><span style="color: #990000">(),</span> <span style="color: #993399">9</span> <span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span>
+<span style="color: #FF0000">}</span><span style="color: #990000">;</span></tt></pre></div></div>
+<div class="paragraph"><p>Note that CxxTest uses global data to associate calls made with <tt>T::time()</tt>
+to calls to <tt>MockObject::time()</tt>. The <tt>MockObject</tt> class simply
+needs to be instantiated prior to the call to <tt>T::time()</tt>.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_building_the_test_runner">8.1.5. Building the Test Runner</h4>
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> command is used to create a test runner with mock functions in a normal manner:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>cxxtestgen --error-printer -o runner<span style="color: #990000">.</span>cpp MockTestSuite<span style="color: #990000">.</span>h</tt></pre></div></div>
+<div class="paragraph"><p>The test runner source file, <tt>runner.cpp</tt>, needs to be compiled an linked to the mock function definition, <tt>time_mock.cpp</tt>, as well as the code being tested, <tt>rand_example.cpp</tt>:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>g<span style="color: #990000">++</span> -o runner -I<span style="color: #990000">.</span> -I<span style="color: #009900">$CXXTEST</span> runner<span style="color: #990000">.</span>cpp time_mock<span style="color: #990000">.</span>cpp rand_example<span style="color: #990000">.</span>cpp</tt></pre></div></div>
+<div class="paragraph"><p>This generates a test runner that generates the following output:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>Running 1 test.OK!</tt></pre>
+</div></div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_advanced_topics">8.2. Advanced Topics</h3>
+<div class="sect3">
+<h4 id="_void_functions">8.2.1. Void Functions</h4>
+<div class="paragraph"><p>The <tt>CXXTEST_MOCK_VOID_GLOBAL</tt> is used to define mock global functions that return <tt>void</tt>.
+This is identical to
+<tt>CXXTEST_MOCK_GLOBAL</tt> except that it does not specify the return
+type. Take a look in <tt>sample/mock/T/stdlib.h</tt> for a demonstation.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_calling_the_real_functions_while_testing">8.2.2. Calling the Real Functions While Testing</h4>
+<div class="paragraph"><p>During testing it is sometimes necessary to call the real global
+function instead of the mock global function. CxxTest allows a
+user to do this by creating a special mock object. For a global
+mock function of <tt>time()</tt>, the object <tt>T::Real_time</tt> represents the
+real function. If this class is created, then <tt>T::time()</tt> will be
+redirected to the real function.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_mocking_nonexistent_functions">8.2.3. Mocking Nonexistent Functions</h4>
+<div class="paragraph"><p>Sometimes the tested code calls functions that are not available
+when testing. For example, this can happen when testing driver
+code that calls kernel functions that are not available to a user-mode
+test runner. CxxTest can provide mock global function definitions
+for the test code while using the original functions in the tested code.</p></div>
+<div class="paragraph"><p>The <tt>CXXTEST_SUPPLY_GLOBAL</tt> and <tt>CXXTEST_SUPPLY_VOID_GLOBAL</tt> macros are used to provide mock global function definitions. For example, the following declaration creates a mock global function for the Win32 kernel function <tt>IoCallDriver</tt>:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">CXXTEST_SUPPLY_GLOBAL</span></span><span style="color: #990000">(</span> NTSTATUS<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Return type */</span></span>
+ IoCallDriver<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name */</span></span>
+ <span style="color: #990000">(</span> <span style="color: #008080">PDEVICE_OBJECT</span> Device<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Prototype */</span></span>
+ <span style="color: #008080">PIRP</span> Irp <span style="color: #990000">),</span>
+ <span style="color: #990000">(</span> Device<span style="color: #990000">,</span> Irp <span style="color: #990000">)</span> <span style="font-style: italic"><span style="color: #9A1900">/* How to call */</span></span> <span style="color: #990000">);</span></tt></pre></div></div>
+<div class="paragraph"><p>The tested driver code calls <tt>IoCallDriver()</tt> normally; there is no need for the <tt>T::</tt> syntax.
+The test suite is defined using the <tt>T::Base_IoCallDriver</tt> as with normal mock objects.</p></div>
+<div class="paragraph"><p>CxxTest also provides the macros <tt>CXXTEST_SUPPLY_GLOBAL_C</tt> and
+<tt>CXXTEST_SUPPLY_GLOBAL_VOID_C</tt> that declare the functions with <tt>C</tt>
+linkage (i.e., using <tt>extern "C"</tt>). These macros are used to declare
+function prototypes, since you may not be able to include the header
+files in the test suite that are associated with the mock global function.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_functions_in_namespaces">8.2.4. Functions in Namespaces</h4>
+<div class="paragraph"><p>The <tt>CXXTEST_MOCK</tt> macro is used to declare a mock global function that is associated
+with a function in a namespace, including static class member functions.
+For example, consider the function <tt>bool Files::FileExists( const
+String &name )</tt>; the namespace <tt>Files</tt> contains the function
+<tt>FileExists</tt>. The mock class will be called <tt>T::Base_Files_FileExists</tt>
+and the function to implemented would be <tt>fileExists</tt>. The <tt>CXXTEST_MOCK</tt> macro declares this mock global function as follows:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">CXXTEST_MOCK</span></span><span style="color: #990000">(</span> Files_FileExists<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Suffix of mock class */</span></span>
+ <span style="color: #009900">bool</span><span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Return type */</span></span>
+ fileExists<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name of mock member */</span></span>
+ <span style="color: #990000">(</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #008080">String</span> <span style="color: #990000">&</span>name <span style="color: #990000">),</span> <span style="font-style: italic"><span style="color: #9A1900">/* Prototype */</span></span>
+ Files<span style="color: #990000">::</span>FileExists<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name of real function */</span></span>
+ <span style="color: #990000">(</span> name <span style="color: #990000">)</span> <span style="font-style: italic"><span style="color: #9A1900">/* Parameter list */</span></span> <span style="color: #990000">);</span></tt></pre></div></div>
+<div class="paragraph"><p>Similarly, the <tt>CXXTEST_MOCK_VOID</tt> macro is used to declare a mock global function that returns <tt>void</tt>.</p></div>
+<div class="paragraph"><p>The <tt>CXXTEST_SUPPLY</tt> and <tt>CXXTEST_SUPPLY_VOID</tt> macros are used to provide mock global function definitions for nonexistent functions. For example:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">CXXTEST_SUPPLY</span></span><span style="color: #990000">(</span> AllocateIrp<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* => T::Base_AllocateIrp */</span></span>
+ PIRP<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Return type */</span></span>
+ allocateIrp<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name of mock member */</span></span>
+ <span style="color: #990000">(</span> <span style="color: #008080">CCHAR</span> StackSize <span style="color: #990000">),</span> <span style="font-style: italic"><span style="color: #9A1900">/* Prototype */</span></span>
+ IoAllocateIrp<span style="color: #990000">,</span> <span style="font-style: italic"><span style="color: #9A1900">/* Name of real function */</span></span>
+ <span style="color: #990000">(</span> StackSize <span style="color: #990000">)</span> <span style="font-style: italic"><span style="color: #9A1900">/* Parameter list */</span></span> <span style="color: #990000">);</span></tt></pre></div></div>
+<div class="paragraph"><p>Similarly, the <tt>CXXTEST_SUPPLY_C</tt> and <tt>CXXTEST_SUPPLY_VOID_C</tt> macros declare the functions with <tt>C</tt> linkage.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_overloaded_functions">8.2.5. Overloaded Functions</h4>
+<div class="paragraph"><p>The <tt>CXXTEST_MOCK</tt> and <tt>CXXTEST_MOCK_VOID</tt> macros have a flexible
+interface that can provide mock global function definitions for
+overloaded functions. The arguments simply need to specify different
+mock class names, mock member names and different prototype definitions.
+These different mock declarations will generate different mock objects that can be explicitly
+referenced in a test suite.</p></div>
+</div>
+<div class="sect3">
+<h4 id="_the_mock_namespace">8.2.6. The Mock Namespace</h4>
+<div class="paragraph"><p>The default namespace for mock functions is <tt>T::</tt>. This namespace can be changed by defining the
+<tt>CXXTEST_MOCK_NAMESPACE</tt> macro.</p></div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="installation">9. Installation</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>A key feature of CxxTest is that it does has virtually no installation
+process. The <tt>cxxtestgen</tt> script can be directly executed from the
+<tt>cxxtest/bin</tt> directory. Simply adding this directory to the PATH
+environment of a command shell is sufficient for many applications.
+Beyond that, the build process for test runners simply needs to
+reference the <tt>cxxtest</tt> root directory to enable proper includes
+during compilation.</p></div>
+<div class="paragraph"><p>The FOG parser requires two Python packages:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<tt>ply</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>ordereddict</tt> (This is needed when running Python 2.4, 2.5 or 2.6)
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>If these packages are not available, then <tt>cxxtestgen</tt> will generate an error when the
+FOG parser option is selected.
+If you have
+<a href="http://pypi.python.org/pypi/setuptools">setuptools</a> or
+<a href="http://pypi.python.org/pypi/distribute">distribute</a>
+installed, then
+you can install these packages from PyPI by executing</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>easy_install ply
+easy_install ordereddict</tt></pre></div></div>
+<div class="paragraph"><p>The <tt>cxxtestgen</tt> script has been tested with many different versions
+of Python: 2.4 - 3.2. Note that this script has only been tested
+with the CPython implementation. CxxTest 4.0 has been tested on
+Linux and Mac platforms using the G<tt> and CLang</tt> compilers.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="discussion">10. Status and Future Plans</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The CxxTest 4.0 release reflects major changes in the management
+and focus of CxxTest. The 4.0 release is the first release of
+CxxTest in over seven years, and virtually all of the initial
+developers have moved on to other projects. CxxTest is heavily
+used at Sandia National Laboratories, and Sandia’s ongoing use of
+CxxTest is a major driver for the 4.0 release.</p></div>
+<div class="paragraph"><p>Similarly, major
+changes in CxxTest reflect the focus of the developer team:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Perl is no longer used to support CxxTest scripts. Python is now the only scripting language used by CxxTest.
+</p>
+</li>
+<li>
+<p>
+The testing scripts have been rewritten using the PyUnit framework.
+</p>
+</li>
+<li>
+<p>
+The installation process for CxxTest now leverages and integrates with the system Python installation.
+</p>
+</li>
+<li>
+<p>
+A more comprehensive C++ parser is now available, which supports testing of templates.
+</p>
+</li>
+<li>
+<p>
+The CxxTest GUI is no longer supported, and the <a href="#ts_warn">TS_WARN</a> is deprecated.
+</p>
+</li>
+<li>
+<p>
+CxxTest runners now have a command-line interface that facilitates interative use of the test runner.
+</p>
+</li>
+<li>
+<p>
+A new user guide is now available in PDF, HTML and Ebook formats.
+</p>
+</li>
+<li>
+<p>
+Updated the <tt>cxxtestgen</tt> script to work with Python 2.6 through 3.2
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>Additionally, CxxTest is now validated with continuous integration
+tests. Yes, the CxxTest developers eat their own dog food!</p></div>
+<div class="paragraph"><p>Although the GUI option for <tt>cxxtestgen</tt> appears to work fine, this
+GUI is rather primitive. It simply provides a visual summary of
+the test results, and not the interactive test execution that a
+user would expect. This capability is deprecated since none of the
+current developers use this feature. CxxTest users should consider
+using CxxTest with <a href="http://jenkins-ci.org/">Jenkins</a>. The <tt>XUnitPrinter</tt>
+test listener generates XML files that can be easily integrated by
+<a href="http://jenkins-ci.org/">Jenkins</a>, which creates a visual summary of
+test results with links to drill-down into test outputs.</p></div>
+<div class="paragraph"><p>This documentation has highlighted the commonly used test listeners.
+There are a variety of other test listeners provided by CxxTest
+that support advanced Cxxtest applications. For example, the
+<tt>YesNoRunner</tt> is perhaps the simplest test listener; it simply
+returns the number of test failures. The <tt>StdioFilePrinter</tt> is
+used by <tt>StdioPrinter</tt>, but it does not assume that <tt>stdio</tt> is the
+default output stream. This test listener can be used in contexts
+where a custom output stream must be specified.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="acknowledgements">Acknowledgements</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>CxxTest was originally developed by Erez Volk. The following
+developers actively contributed to the CxxTest 4.0 release:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Gašper Ažman
+</p>
+</li>
+<li>
+<p>
+Kevin Fitch
+</p>
+</li>
+<li>
+<p>
+William Hart
+</p>
+</li>
+<li>
+<p>
+John Siirola
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>The CxxTest documentation is generated using
+<a href="http://www.methods.co.nz/asciidoc/">AsciiDoc</a>. The following people
+have contributed to the CxxTest User Manual:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+William Hart
+</p>
+</li>
+<li>
+<p>
+Lionel Orry
+</p>
+</li>
+<li>
+<p>
+Erez Volk
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>A major advancement in CxxTest’s capability is the new test discovery
+mechanism that is based on a parser of the Flexible Object Language
+(FOG). FOG generalizes the C++ syntax, which enables CxxTest to
+extract high-level class structure for test discovery. FOG was
+developed by Edward Willink:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Edward D. Willink. <em>Meta-Compilation for C++</em>, PhD Thesis, Computer Science Research Group, University of Surrey, January 2000.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>The FOG parser in CxxTest critically relies on the excellent LALR
+parser provided by Dave Beazley’s <tt>ply</tt> Python package. The scalable
+performance of <tt>ply</tt> is critical for CxxTest.</p></div>
+<div class="paragraph"><p>CxxTest has greatly benefited from the support of the open source
+community. We would like to thank the following organizations for
+providing web hosting and computing resources: GitHub, SourceForge,
+Tigris.org, Sandia National Laboratories, Google and COIN-OR. The development
+of CxxTest has been partially supported by Sandia National Laboratories.
+Sandia National Laboratories is a multi-program laboratory managed
+and operated by Sandia Corporation, a wholly owned subsidiary of
+Lockheed Martin Corporation, for the U.S. Department of Energy’s
+National Nuclear Security Administration under contract DE-AC04-94AL85000.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="appendix_A">Appendix A: Test Assertion Examples</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert"></a> TS_ASSERT
+</dt>
+<dd>
+<p>
+This is the most basic test assertion, which simply verifies that the <tt>expr</tt> argument is true:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span> <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">></span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_delta"></a> TS_ASSERT_DELTA
+</dt>
+<dd>
+<p>
+This test assertion verifies two floating point values are within a specified absolute difference:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_delta</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_DELTA</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">sqrt</span></span><span style="color: #990000">(</span><span style="color: #993399">4.0</span><span style="color: #990000">),</span> <span style="color: #993399">2.0</span><span style="color: #990000">,</span> <span style="color: #993399">1e-7</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_differs"></a> TS_ASSERT_DIFFERS
+</dt>
+<dd>
+<p>
+This test assertion verifies that the two arguments are not equal:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_differs</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_DIFFERS</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">,</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_equals"></a> TS_ASSERT_EQUALS
+</dt>
+<dd>
+<p>
+ This test assertion verifies that the two arguments are equal:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_equals</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">21</span> <span style="color: #990000">%</span> <span style="color: #993399">5</span><span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="paragraph"><p>Note that this test is performed using the C++ <tt>==</tt> operator, whose behavior may be redefined for the two argument types.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_less_than"></a> TS_ASSERT_LESS_THAN
+</dt>
+<dd>
+<p>
+This test assertion verifies that the first argument is strictly less than the second argument:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_less_than</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_LESS_THAN</span></span><span style="color: #990000">(</span><span style="color: #993399">0</span><span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_less_than_equals"></a> TS_ASSERT_LESS_THAN_EQUALS
+</dt>
+<dd>
+<p>
+This test assertion verifies that the first argument is less than or equal to the second argument:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_less_than_equals</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_LESS_THAN_EQUALS</span></span><span style="color: #990000">(</span><span style="color: #993399">0</span><span style="color: #990000">,</span> <span style="color: #993399">0</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_predicate"></a> TS_ASSERT_PREDICATE
+</dt>
+<dd>
+<p>
+This test assertion takes as an argument the name of a class, similar to a STL <tt>unary_function</tt>, and evaluates the <tt>operator()</tt> method:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="font-weight: bold"><span style="color: #0000FF">class</span></span> <span style="color: #008080">IsOdd</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">public</span></span><span style="color: #990000">:</span>
+ <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #0000FF">operator</span></span><span style="color: #990000">()(</span><span style="color: #009900">int</span> x<span style="color: #990000">)</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #FF0000">{</span> <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> x <span style="color: #990000">%</span> <span style="color: #993399">2</span> <span style="color: #990000">==</span> <span style="color: #993399">1</span><span style="color: #990000">;</span> <span style="color: #FF0000">}</span>
+ <span style="color: #FF0000">}</span><span style="color: #990000">;</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_predicate</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_PREDICATE</span></span><span style="color: #990000">(</span>IsOdd<span style="color: #990000">,</span> <span style="color: #993399">29</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="paragraph"><p>This test assertion can be seen as a generalization of <a href="#ts_assert">TS_ASSERT</a>, but it
+allows the tester to see the failed value.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_relation"></a> TS_ASSERT_RELATION
+</dt>
+<dd>
+<p>
+It takes as an argument the name of a class, similar to a STL <tt>binary_function</tt>, and evaluates the <tt>operator()</tt> method:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_relation</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_RELATION</span></span><span style="color: #990000">(</span>std<span style="color: #990000">::</span>greater<span style="color: #990000"><</span><span style="color: #009900">double</span><span style="color: #990000">>,</span> <span style="color: #993399">1e6</span><span style="color: #990000">,</span> <span style="color: #993399">1000.0</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="paragraph"><p>This test assertion can be seen as a generalization of <a href="#ts_assert_equals">TS_ASSERT_EQUALS</a>, <a href="#ts_assert_differs">TS_ASSERT_DIFFERS</a>, <a href="#ts_assert_less_than">TS_ASSERT_LESS_THAN</a> and <a href="#ts_assert_less_than_equals">TS_ASSERT_LESS_THAN_EQUALS</a>.
+This can be used to assert comparisons which are not covered by the builtin test assertions.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_same_data"></a> TS_ASSERT_SAME_DATA
+</dt>
+<dd>
+<p>
+This test assertion is similar to <a href="#ts_assert_equals">TS_ASSERT_EQUALS</a>,
+except that it compares the contents of two buffers in memory:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_same_data</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #009900">char</span> input <span style="color: #990000">=</span> <span style="color: #FF0000">"The quick brown fox ran over the lazy dog"</span><span style="color: #990000">;</span>
+ <span style="color: #009900">char</span> output<span style="color: #990000">[</span><span style="color: #993399">26</span><span style="color: #990000">];</span>
+ <span style="font-weight: bold"><span style="color: #000000">memcopy</span></span><span style="color: #990000">(</span>output<span style="color: #990000">,</span> input<span style="color: #990000">,</span> <span style="color: #993399">26</span><span style="color: #990000">);</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_SAME_DATA</span></span><span style="color: #990000">(</span>input<span style="color: #990000">,</span> output<span style="color: #990000">,</span> <span style="color: #993399">26</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="paragraph"><p>The standard runner dumps the contents of both buffers as hex values when this test fails.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_throws"></a> TS_ASSERT_THROWS
+</dt>
+<dd>
+<p>
+This test assertion verifies that the specified exception is thrown when the first argument is executed:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">throws_runtime_error</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="color: #008080">raise</span> std<span style="color: #990000">::</span>runtime_error<span style="color: #990000">,</span> <span style="color: #FF0000">"This method simply generates an exception"</span><span style="color: #990000">;</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_throws</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_THROWS</span></span><span style="color: #990000">(</span>self<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">throws_runtime_error</span></span><span style="color: #990000">(),</span> std<span style="color: #990000">::</span>runtime_error<span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_throws_anything"></a> TS_ASSERT_THROWS_ANYTHING
+</dt>
+<dd>
+<p>
+This test assertion verifies that <em>some</em> exception is thrown when the first argument is executed:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_throws_anything</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_THROWS_ANYTHING</span></span><span style="color: #990000">(</span>self<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">throws_runtime_error</span></span><span style="color: #990000">());</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_throws_assert"></a> TS_ASSERT_THROWS_ASSERT
+</dt>
+<dd>
+<p>
+This test assertion verifies that an exception is thrown when executing the first argument. The second argument specifies a variable declaration for the exception, and the third argument is executed to test that
+exception value:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">throws_value</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ raise <span style="color: #993399">1</span><span style="color: #990000">;</span>
+ <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_throws_assert</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_THROWS_ASSERT</span></span><span style="color: #990000">(</span>self<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">throws_value</span></span><span style="color: #990000">(),</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> Error <span style="color: #990000">&</span> e<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_EQUALS</span></span><span style="color: #990000">(</span>e<span style="color: #990000">,</span> <span style="color: #993399">1</span><span style="color: #990000">));</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="paragraph"><p>Note that this can be viewed as a generalization of <a href="#ts_assert_throws_equals">TS_ASSERT_THROWS_EQUALS</a>.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_throws_equals"></a> TS_ASSERT_THROWS_EQUALS
+</dt>
+<dd>
+<p>
+This test assertion verifies that an exception is thrown when executing the first argument. The second argument specifies a variable declaration for the exception, and the third and fourth arguments are values that are asserted equal after the exception is thrown:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_throws_equals</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_THROWS_EQUALS</span></span><span style="color: #990000">(</span>self<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">throws_value</span></span><span style="color: #990000">(),</span> <span style="font-weight: bold"><span style="color: #0000FF">const</span></span> Error <span style="color: #990000">&</span> e<span style="color: #990000">,</span> e<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">what</span></span><span style="color: #990000">(),</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_assert_throws_nothing"></a> TS_ASSERT_THROWS_NOTHING
+</dt>
+<dd>
+<p>
+This test assertion verifies that an exception is <em>not</em> thrown when executing the first argument:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">throws_nothing</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span> <span style="color: #FF0000">}</span>
+
+ <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_assert_throws_nothing</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_ASSERT_THROWS_ASSERT</span></span><span style="color: #990000">(</span>self<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">throws_nothing</span></span><span style="color: #990000">());</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_fail"></a> TS_FAIL
+</dt>
+<dd>
+<p>
+This function triggers a test failure with an associated message:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_fail</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_FAIL</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"This test has failed."</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_trace"></a> TS_TRACE
+</dt>
+<dd>
+<p>
+This function prints an informational message:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_trace</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_TRACE</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"This is a test tracing message."</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+<a id="ts_warn"></a> TS_WARN
+</dt>
+<dd>
+<p>
+This function prints a message as a warning:
+</p>
+</dd>
+</dl></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt> <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">test_warn</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
+ <span style="color: #FF0000">{</span>
+ <span style="font-weight: bold"><span style="color: #000000">TS_WARN</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"This is a warning message."</span><span style="color: #990000">);</span>
+ <span style="color: #FF0000">}</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="appendix_B">Appendix B: Integrating with Your Build Environment</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>CxxTest can be integrated into a variety of build environments to
+automate the generation, compilation and execution of test runners.
+Here is a rough breakdown of this process:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Split the application into a library and a main module that just
+ calls the library classes. This way, the test runner will be
+ able to access all your classes through the library.
+</p>
+</li>
+<li>
+<p>
+Create another application (or target, or project, or whatever)
+ for the test runner. Make the build tool generate it automatically.
+</p>
+</li>
+<li>
+<p>
+Configure the build tool to run the tests automatically.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>Unfortunately, different build tools and IDEs need to setup this
+process in different ways. The following sections provide rough
+guidance for doing this for some come use cases.</p></div>
+<div class="admonitionblock">
+<table><tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">These examples are not actively maintained and tested. Please send
+suggestions to the CxxTest developers for updating this documentation.</td>
+</tr></table>
+</div>
+<div class="sect2">
+<h3 id="_using_makefiles">Using Makefiles</h3>
+<div class="paragraph"><p>Generating the tests with a makefile is pretty straightforward.
+Simply add rules to generate, compile and run the test runner.</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">all:</span> lib run_tests app
+
+<span style="font-style: italic"><span style="color: #9A1900"># Rules to build your targets</span></span>
+<span style="color: #990000">lib:</span> <span style="color: #990000">...</span>
+
+<span style="color: #990000">app:</span> <span style="color: #990000">...</span>
+
+<span style="font-style: italic"><span style="color: #9A1900"># A rule that runs the unit tests</span></span>
+<span style="color: #990000">run_tests:</span> runner
+ <span style="color: #990000">.</span>/runner
+
+<span style="font-style: italic"><span style="color: #9A1900"># How to build the test runner</span></span>
+<span style="color: #990000">runner:</span> runner.cpp lib
+ g<span style="color: #990000">++</span> -o <span style="color: #009900">$@</span> <span style="color: #009900">$^</span>
+
+<span style="font-style: italic"><span style="color: #9A1900"># How to generate the test runner</span></span>
+<span style="color: #990000">runner.cpp:</span> SimpleTest.h ComplicatedTest.h
+ cxxtestgen -o <span style="color: #009900">$@</span> --error-printer <span style="color: #009900">$^</span></tt></pre></div></div>
+</div>
+<div class="sect2">
+<h3 id="_using_cons">Using Cons</h3>
+<div class="paragraph"><p><a href="http://dsmit.com/cons/">Cons</a> is a powerful and
+versatile make replacement which uses Perl scripts instead of Makefiles.</p></div>
+<div class="paragraph"><p>See <tt>cxxtest/sample/Construct</tt> in the CxxTest distribution for an
+example of building CxxTest test runners with Cons.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_using_microsoft_visual_studio">Using Microsoft Visual Studio</h3>
+<div class="paragraph"><p>See <tt>cxxtest/sample/msvc</tt> in the distribution
+to see a reasonable integration of CxxTest with Microsoft Visual Studio’s IDE.
+Basically, the workspace has three
+projects:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+The project <tt>CxxTest_3_Generate</tt> runs <tt>cxxtestgen</tt>.
+</p>
+</li>
+<li>
+<p>
+The project <tt>CxxTest_2_Build</tt> compiles the generated file.
+</p>
+</li>
+<li>
+<p>
+The project <tt>CxxTest_1_Run</tt> runs the tests.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>This method certainly works, and the test results are conveniently
+displayed as compilation errors and warnings (for <a href="#ts_warn">TS_WARN</a>.
+However, there are still a few things missing; to integrate this
+approach with your own project, you usually need to work a little
+bit and tweak some makefiles and project options. The script
+<tt>sample/msvc/FixFiles.bat</tt> can automate some of this process.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_using_microsoft_windows_ddk">Using Microsoft Windows DDK</h3>
+<div class="paragraph"><p>To use CxxTest with the <tt>build</tt> utility for device drivers, you add
+the generated tests file as an extra dependency using the
+<tt>NTBUILDTARGET0</tt> macro and the <tt>Makefile.inc</tt> file. An example of
+how to do this is in the CxxTest distribution under <tt>sample/winddk</tt>.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="appendix_C">Appendix C: Testing CxxTest</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>In the <tt>cxxtest/test</tt> directory, you can execute</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>python test_cxxtest<span style="color: #990000">.</span>py</tt></pre></div></div>
+<div class="paragraph"><p>to launch all tests. By default, this script executes test suites
+for a variety of compilers if they are found on the user’s path:
+<tt>g++</tt>, <tt>clang++</tt>, <tt>cl</tt> (the Microsoft Visual Studio compiler).
+Additionally, this test script includes separate test suites for
+the default test discovery mechanism as well as test discovery using
+the new FOG parser.</p></div>
+<div class="paragraph"><p>You can execute a specific test suite by giving its name as an
+argument to this test script. For example, the command</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>python test_cxxtest<span style="color: #990000">.</span>py TestGpp</tt></pre></div></div>
+<div class="paragraph"><p>executes the <tt>TestGpp</tt> test suite, which tests CxxTest with the
+<tt>g++</tt> compiler. Similarly, the command</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>python test_cxxtest<span style="color: #990000">.</span>py TestGppFOG</tt></pre></div></div>
+<div class="paragraph"><p>executes the test suite that tests CxxTest using the <tt>g++</tt> compiler
+and the FOG parser.</p></div>
+<div class="paragraph"><p>The <tt>test_cxxtest.py</tt> script should work with versions Python 2.7
+or newer. If you are running Python 2.6, you will need to install
+the <tt>unittest2</tt> package. If you have
+<a href="http://pypi.python.org/pypi/setuptools">setuptools</a> or
+<a href="http://pypi.python.org/pypi/distribute">distribute</a>
+installed, then
+you can install this package from PyPI by executing</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.4
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>easy_install unittest2</tt></pre></div></div>
+<div class="paragraph"><p>Similarly, the tests for this document rely on the <tt>PyUtilib</tt> Python package.</p></div>
+<div class="paragraph"><p>The FOG parser requires two Python packages:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<tt>ply</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>ordereddict</tt> (This is only needed when running Python 2.6)
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>If these packages are not available, then <tt>test_cxxtest.py</tt> will skip the FOG tests.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="appendix_D">Appendix D: CxxTest Releases</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Version 4.0.3 (TODO)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Adding support for Python 2.4, 2.5, 2.6, 2.7 and 3.2
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 4.0.2 (2012-01-02)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Bug fix to enable installation of cxxtestgen without the <em>setuptools</em> package
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 4.0.1 (2012-01-01)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Documentation updates
+</p>
+</li>
+<li>
+<p>
+Bug fix for installation of cxxtestgen script
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 4.0 (2011-12-28)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Perl is no longer used to support CxxTest scripts. Python is now the only scripting language used by CxxTest.
+</p>
+</li>
+<li>
+<p>
+The testing scripts have been rewritten using the PyUnit framework.
+</p>
+</li>
+<li>
+<p>
+The installation process for CxxTest now leverages and integrates with the system Python installation.
+</p>
+</li>
+<li>
+<p>
+A more comprehensive C++ parser is now available, which supports testing of templates.
+</p>
+</li>
+<li>
+<p>
+The CxxTest GUI is no longer supported, and the <a href="#ts_warn">TS_WARN</a> is deprecated.
+</p>
+</li>
+<li>
+<p>
+CxxTest runners now have a command-line interface that facilitates interative use of the test runner.
+</p>
+</li>
+<li>
+<p>
+A new user guide is now available in PDF, HTML and Ebook formats.
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.10.1 (2004-12-01)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Improved support for VC7
+</p>
+</li>
+<li>
+<p>
+Fixed clash with some versions of STL
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.10.0 (2004-11-20)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added mock framework for global functions
+</p>
+</li>
+<li>
+<p>
+Added TS_ASSERT_THROWS_ASSERT and TS_ASSERT_THROWS_EQUALS
+</p>
+</li>
+<li>
+<p>
+Added CXXTEST_ENUM_TRAITS
+</p>
+</li>
+<li>
+<p>
+Improved support for STL classes (vector, map etc.)
+</p>
+</li>
+<li>
+<p>
+Added support for Digital Mars compiler
+</p>
+</li>
+<li>
+<p>
+Reduced root/part compilation time and binary size
+</p>
+</li>
+<li>
+<p>
+Support C++-style commenting of tests
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.9.1 (2004-01-19)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed small bug with runner exit code
+</p>
+</li>
+<li>
+<p>
+Embedded test suites are now deprecated
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.9.0 (2004-01-17)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added TS_TRACE
+</p>
+</li>
+<li>
+<p>
+Added --no-static-init
+</p>
+</li>
+<li>
+<p>
+CxxTest::setAbortTestOnFail() works even without --abort-on-fail
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.8.5 (2004-01-08)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added --no-eh
+</p>
+</li>
+<li>
+<p>
+Added CxxTest::setAbortTestOnFail() and CXXTEST_DEFAULT_ABORT
+</p>
+</li>
+<li>
+<p>
+Added CxxTest::setMaxDumpSize()
+</p>
+</li>
+<li>
+<p>
+Added StdioFilePrinter
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.8.4 (2003-12-31)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Split distribution into cxxtest and cxxtest-selftest
+</p>
+</li>
+<li>
+<p>
+Added ‘sample/msvc/FixFiles.bat’
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.8.3 (2003-12-24)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added TS_ASSERT_PREDICATE
+</p>
+</li>
+<li>
+<p>
+Template files can now specify where to insert the preamble
+</p>
+</li>
+<li>
+<p>
+Added a sample Visual Studio workspace in ‘sample/msvc’
+</p>
+</li>
+<li>
+<p>
+Can compile in MSVC with warning level 4
+</p>
+</li>
+<li>
+<p>
+Changed output format slightly
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.8.1 (2003-12-21)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed small bug when using multiple --part files.
+</p>
+</li>
+<li>
+<p>
+Fixed X11 GUI crash when there’s no X server.
+</p>
+</li>
+<li>
+<p>
+Added GlobalFixture::setUpWorld()/tearDownWorld()
+</p>
+</li>
+<li>
+<p>
+Added leaveOnly(), activateAllTests() and ‘sample/only.tpl’
+</p>
+</li>
+<li>
+<p>
+Should now run without warnings on Sun compiler.
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.8.0 (2003-12-13)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed bug where ‘Root.cpp’ needed exception handling
+</p>
+</li>
+<li>
+<p>
+Added TS_ASSERT_RELATION
+</p>
+</li>
+<li>
+<p>
+TSM_ macros now also tell you what went wrong
+</p>
+</li>
+<li>
+<p>
+Renamed Win32Gui::free() to avoid clashes
+</p>
+</li>
+<li>
+<p>
+Now compatible with more versions of Borland compiler
+</p>
+</li>
+<li>
+<p>
+Improved the documentation
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.7.1 (2003-09-29)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added --version
+</p>
+</li>
+<li>
+<p>
+Compiles with even more exotic g++ warnings
+</p>
+</li>
+<li>
+<p>
+Win32 Gui compiles with UNICODE
+</p>
+</li>
+<li>
+<p>
+Should compile on some more platforms (Sun Forte, HP aCC)
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.7.0 (2003-09-20)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added TS_ASSERT_LESS_THAN_EQUALS
+</p>
+</li>
+<li>
+<p>
+Minor cleanups
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.6.1 (2003-09-15)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Improved QT GUI
+</p>
+</li>
+<li>
+<p>
+Improved portability some more
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.6.0 (2003-09-04)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added --longlong
+</p>
+</li>
+<li>
+<p>
+Some portability improvements
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.5.1 (2003-09-03)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Major internal rewrite of macros
+</p>
+</li>
+<li>
+<p>
+Added TS_ASSERT_SAME_DATA
+</p>
+</li>
+<li>
+<p>
+Added --include option
+</p>
+</li>
+<li>
+<p>
+Added --part and --root to enable splitting the test runner
+</p>
+</li>
+<li>
+<p>
+Added global fixtures
+</p>
+</li>
+<li>
+<p>
+Enhanced Win32 GUI with timers, -keep and -title
+</p>
+</li>
+<li>
+<p>
+Now compiles with strict warnings
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.1.1 (2003-08-27)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed small bug in TS_ASSERT_THROWS_*()
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.1.0 (2003-08-23)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Default ValueTraits now dumps value as hex bytes
+</p>
+</li>
+<li>
+<p>
+Fixed double invocation bug (e.g. TS_FAIL(functionWithSideEffects()))
+</p>
+</li>
+<li>
+<p>
+TS_ASSERT_THROWS*() are now "abort on fail"-friendly
+</p>
+</li>
+<li>
+<p>
+Win32 GUI now supports Windows 98 and doesn’t need comctl32.lib
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 3.0.1 (2003-08-07)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added simple GUI for X11, Win32 and Qt
+</p>
+</li>
+<li>
+<p>
+Added TS_WARN() macro
+</p>
+</li>
+<li>
+<p>
+Removed --exit-code
+</p>
+</li>
+<li>
+<p>
+Improved samples
+</p>
+</li>
+<li>
+<p>
+Improved support for older (pre-std::) compilers
+</p>
+</li>
+<li>
+<p>
+Made a PDF version of the User’s Guide
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.8.4 (2003-07-21)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Now supports g++-3.3
+</p>
+</li>
+<li>
+<p>
+Added --have-eh
+</p>
+</li>
+<li>
+<p>
+Fixed bug in numberToString()
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.8.3 (2003-06-30)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed bugs in cxxtestgen.pl
+</p>
+</li>
+<li>
+<p>
+Fixed warning for some compilers in ErrorPrinter/StdioPrinter
+</p>
+</li>
+<li>
+<p>
+Thanks Martin Jost for pointing out these problems!
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.8.2 (2003-06-10)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed bug when using CXXTEST_ABORT_TEST_ON_FAIL without standard library
+</p>
+</li>
+<li>
+<p>
+Added CXXTEST_USER_TRAITS
+</p>
+</li>
+<li>
+<p>
+Added --abort-on-fail
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.8.1 (2003-01-16)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed charToString() for negative chars
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.8.0 (2003-01-13)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added CXXTEST_ABORT_TEST_ON_FAIL for xUnit-like behaviour
+</p>
+</li>
+<li>
+<p>
+Added ‘sample/winddk’
+</p>
+</li>
+<li>
+<p>
+Improved ValueTraits
+</p>
+</li>
+<li>
+<p>
+Improved output formatter
+</p>
+</li>
+<li>
+<p>
+Started version history
+</p>
+</li>
+</ul></div>
+</li>
+<li>
+<p>
+Version 2.7.0 (2002-09-29)
+</p>
+<div class="ulist"><ul>
+<li>
+<p>
+Added embedded test suites
+</p>
+</li>
+<li>
+<p>
+Major internal improvements
+</p>
+</li>
+</ul></div>
+</li>
+</ul></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2012-01-07 08:51:08 MST
+</div>
+</div>
+</body>
+</html>
--- /dev/null
+CxxTest User Guide
+==================
+:doctype: article
+
+:cpp: {basebackend@docbook:c++:cpp}
+:makefile: {basebackend@docbook:make:makefile}
+
+:numbered!:
+[abstract]
+Abstract
+--------
+CxxTest is a unit testing framework for C\++ that is similar in
+spirit to http://junit.org/[JUnit],
+http://cppunit.sourceforge.net[CppUnit], and
+http://xprogramming.com/software.html[xUnit]. CxxTest is easy to
+use because it does not require precompiling a CxxTest testing
+library, it employs no advanced features of C++ (e.g. RTTI) and it
+supports a very flexible form of test discovery. This documentation
+describes CxxTest 4.0, which includes significant enhancements to
+the test discovery process, a modern test driver, and new documentation.
+
+:numbered:
+
+Overview
+--------
+
+CxxTest is a unit testing framework for C++ that is similar in
+spirit to http://junit.org/[JUnit],
+http://cppunit.sourceforge.net[CppUnit], and
+http://xprogramming.com/software.html[xUnit].
+CxxTest is designed to be as portable as possible; it does not require
+
+ - RTTI
+ - Member template functions
+ - Exception handling
+ - External libraries (including memory management, file/console I/O, graphics libraries)
+
+In particular, the design of CxxTest was tailored for C\++ compilers
+on embedded systems, for which many of these features are not
+supported. However, CxxTest can also leverage standard C++ features
+when they are supported by a compiler (e.g. catch unhandled
+exceptions).
+
+Additionally, CxxTest supports _test discovery_. Tests are defined
+in C\++ header files, which are parsed by CxxTest to automatically
+generate a test runner. Thus, CxxTest is somewhat easier to use
+than alternative C++ testing frameworks, since you do not need to
+_register_ tests.
+
+The http://cxxtest.com[CxxTest Home Page] is
+http://cxxtest.com[http://cxxtest.com]. This webpage contains links
+for https://sourceforge.net/projects/cxxtest/files/[release downloads],
+the https://groups.google.com/forum/?hl=en#!forum/cxxtest-forum[CxxTest
+discussion list], and documentation in
+http://cxxtest.com/cxxtest/doc/guide.html[HTML],
+http://cxxtest.com/cxxtest/doc/guide.pdf[PDF], and
+http://cxxtest.comm/cxxtest/doc/guide.epub[EPUB] formats. The
+http://cxxtest.com[CxxTest Home Page] also includes developer
+resources (e.g. https://software.sandia.gov/hudson/view/CxxTest/[automated
+test results]). CxxTest is available under the
+http://www.gnu.org/copyleft/lesser.html[GNU Lesser General Public]
+license.
+
+The CxxTest User Guide provides the following documentation:
+
+ - <<gettingStarted,Getting Started>>: Some simple examples that illustrate how to use CxxTest
+ - <<testAssertions,Test Assertions>>: The test assertions supported by CxxTest
+ - <<cxxtestgen,The CxxTestGen Command>>: Documentation for the +cxxtestgen+ command
+ - <<runner,Test Runner Syntax>>: Discussion of command line options for test runners
+ - <<advanced,Advanced Testing Features>>: Advanced features of CxxTest
+ - <<traits,Value Traits>>: Customizing data traits for error messages
+ - <<mock,Testing with Mock Objects>>: How to test with mock global functions
+ - <<installation,Installation>>: How to install CxxTest
+ - <<discussion,Status and Future Plans>>: Comments on the past, present and future of CxxTest
+
+
+
+[[gettingStarted]]
+Getting Started
+---------------
+
+Testing is performed with CxxTest in a four-step process:
+
+ 1. Tests are defined in C++ header files
+ 2. The +cxxtestgen+ command processes header files to generate files for the test runner.
+ 3. Compile the test runner.
+ 4. Execute the test runner to run all test suites.
+
+CxxTest supports test automation, sharing of setup
+and shutdown code for tests, aggregation of tests into collections,
+and independence of the tests from the reporting framework. To
+achieve this, CxxTest supports some important concepts that are common to xUnit frameworks (
+e.g. http://junit.org/[JUnit], http://cppunit.sourceforge.net[CppUnit], and
+http://xprogramming.com/software.html[xUnit]):
+
+test fixture::
+ A 'test fixture' represents the preparation needed to perform one or more
+ tests, and any associate cleanup actions. This may involve, for example,
+ creating temporary or proxy databases, directories, or starting a server
+ process.
+
+/////
+test case::
+ A 'test case' is the smallest unit of testing. It checks for a specific
+ response to a particular set of inputs. CxxTest provides a base class,
+ +TestCase+, which may be used to create new test cases.
+/////
+
+test suite::
+ A 'test suite' is a collection of test cases, which represent
+ the smallest unit of testing. A test suite is defined by a class
+ that inherits from the +CxxTest::TestSuite+ class, and the tests
+ in a test suite are executed together.
+
+test::
+ A test is a public member function of a test suite whose name
+ starts with +test+, e.g. +testDirectoryScanner()+,
+ +test_cool_feature()+ and +TestImportantBugFix()+.
+
+test runner::
+ A 'test runner' is a component which orchestrates the execution
+ of tests across one or more test suites and provides the outcome
+ to the user.
+
+When building test fixtures using +TestSuite+, the +TestSuite.setUp+
+and +TestSuite.tearDown+ methods can be overridden to provide
+initialization and cleanup for the fixture. The +TestSuite.setUp+
+method is run before each test is executed, and the +TestSuite.tearDown+
+method is run after each test is executed.
+
+
+A First Example
+~~~~~~~~~~~~~~~
+
+The following is a simple example of a
+test suite with a single test, +testAddition+, which perform two test assertions:
+[source,{cpp}]
+----
+include::examples/MyTestSuite1.h[]
+----
+
+You use the +cxxtestgen+ script to generate a _test runner_ for test suites in C++ header files:
+[source,bash]
+----
+include::examples/.buildRunner_main.sh[]
+----
+This command generates the file +runner.cpp+, which can be compiled.
+[source,bash]
+----
+include::examples/.buildRunner_main.sh[]
+----
+Note that additional compiler flags may be needed to include headers
+and libraries that are used during testing.
+
+
+This runner can be executed to perform the specified tests:
+[source,bash]
+----
+include::examples/.exeRunner_main.sh[]
+----
+which generates the following output:
+----
+include::examples/exeRunner.out[]
+----
+
+
+A Second Example
+~~~~~~~~~~~~~~~~
+
+The following header file extends the previous example to
+include a test that generates an error:
+[source,{cpp}]
+----
+include::examples/.MyTestSuite2_.h[]
+----
+
+The test runner generated by +cxxtestgen+ for this test suite generates the following output:
+----
+include::examples/exeRunner2.out[]
+----
+
+
+Sample Problems
+~~~~~~~~~~~~~~~
+
+CxxTest comes with example test suites in the `cxxtest/sample` subdirectory of
+the distribution. If you look in that directory, you will see three
+Makefiles: `Makefile.unix`, `Makefile.msvc` and
+`Makefile.bcc32` which are for Linux/Unix, MS Visual C\++ and Borland C++, repectively. These files are provided as a starting point,
+and some options may need to be tweaked in them for your system.
+
+////
+WEH - I think we should omit these command line unless they are tested...
+
+If you are running under Windows, a good guess would be to run
+`nmake -fMakefile.msvc run_win32` (you may need to run
+`VCVARS32.BAT` first).
+Under Linux, `make -fMakefile.unix run_x11` should probably work.
+////
+
+
+[[testAssertions]]
+Test Assertions
+---------------
+
+The following table summarizes the test assertions supported by CxxTest.
+<<appendix_A,Appendix A>> provides examples that illustrate the use of these test assertions.
+
+[options="header"]
+|====================================================================================
+| Macro | Description
+| <<ts_assert,+TS_ASSERT(expr)+>> | Verify +expr+ is true
+| xref:ts_assert_delta[+TS_ASSERT_DELTA(x,y,d)+] | Verify that +abs(x-y) < d+
+| xref:ts_assert_differs[+TS_ASSERT_DIFFERS(x,y)+] | Verify that +x != y+
+| xref:ts_assert_equals[+TS_ASSERT_EQUALS(x,y)+] | Verify that +x == y+
+| xref:ts_assert_less_than[+TS_ASSERT_LESS_THAN(x,y)+] | Verify that +x < y+
+| xref:ts_assert_less_than_equals[+TS_ASSERT_LESS_THAN_EQUALS(x,y)+] | Verify that +x <= y+
+| xref:ts_assert_predicate[+TS_ASSERT_PREDICATE(P,x)+] | Verify +P(x)+
+| xref:ts_assert_relation[+TS_ASSERT_RELATION(x,R,y)+] | Verify +x R y+
+| xref:ts_assert_same_data[+TS_ASSERT_SAME_DATA(x,y,size)+] | Verify two buffers are equal
+| xref:ts_assert_throws[+TS_ASSERT_THROWS(expr,type)+] | Verify that +expr+ throws the specified exception type
+| <<ts_assert_throws_anything,+TS_ASSERT_THROWS_ANYTHING(expr)+>> | Verify that +expr+ throws an exception
+| xref:ts_assert_throws_assert[+TS_ASSERT_THROWS_ASSERT(expr,arg,assertion)+] | Verify type and value of what +expr+ throws
+| xref:ts_assert_throws_equals[+TS_ASSERT_THROWS_EQUALS(expr,arg,x,y)+] | Verify type and value of what +expr+ throws
+| <<ts_assert_throws_nothing,+TS_ASSERT_THROWS_NOTHING(expr)+>> | Verify that +expr+ doesn't throw anything
+| <<ts_fail,+TS_FAIL(message)+>> | Fail unconditionally
+| <<ts_trace,+TS_TRACE(message)+>> | Print +message+ as an informational message
+| <<ts_warn,+TS_WARN(message)+>> | Print +message+ as a warning
+|====================================================================================
+
+The test assertions supported by CxxTest are defined as macros,
+which eliminates the need for certain templates within CxxTest and
+allows tests to catch exceptions. There are four categories of
+test assertions in CxxTest, which are distinguished by their prefixes:
+
+TS_:: These test assertions perform a test. Catch exceptions generated
+during testing will cause the test to fail, except for tests that
+check for exceptions.
+
+TSM_:: These test assertions perform the same tests as the corresponding
++TS+ assertions, but their first argument is a +const char*+ message
+buffer that is printed when the test fails.
+
+ETS_:: These test assertions perform the same tests as the corresponding
++TS+ assertions. However, these test assertions do not catch
+exceptions generated during testing.
+
+ETSM_:: These test assertions perform the same tests as the
+corresponding +TS+ assertions, but (1) their first argument is a
++const char*+ message buffer is printed when the test fails, and
+(2) these assertions do not catch exceptions generated during
+testing.
+
+
+[[cxxtestgen]]
+The CxxTestGen Command
+----------------------
+
+The +cxxtestgen+ command processes one or more C++ header files to
+generate a test runner. The +cxxtestgen+ command performs test
+discovery by parsing the header files to find test classes, which
+inherit from the class +CxxTest::TestSuite+.
+
+The +--help+ option generates the following summary of the +cxxtestgen+ command line options:
+
+----
+include::examples/cxxtestgen.out[]
+----
+The following section describe illustrate the use of these command line options.
+
+
+General Options
+~~~~~~~~~~~~~~~
+
+The default behavior of +cxxtestgen+ is to send the source for the
+test runner to the standard output stream. The +--output+ (+-o+)
+option indicates a filename for the test runner.
+
+The +--world+ (+-w+) option specifies the value of the +CxxTest::RealWorldDescription::_worldName+
+variable. This option also customizes the filename used for XML output files (see below).
+
+The +--include+ option defines a filename that is included in the runner before all other headers.
+
+The +--abort-on-fail+ option forces an abort if a test fails, rather than continuing execution
+to the next test.
+
+The +--main+ option specifies an alternate name for the +main()+ function.
+
+Test Listener Options
+~~~~~~~~~~~~~~~~~~~~~
+
+The test runner behavior is controlled by a _test listener_ class
+that is used to define to the +main+ function. The test listener
+class is a subclass of +TestListener+ that receives notifications
+about the testing process, notably which assertions failed. The
++--runner+ option is used to specify the test listener that is used
+in the test runner. The following test listeners are defined in
+CxxTest:
+
+ +ErrorPrinter+::
+ This is the standard error printer, which formats its output to the standard output stream (+std::cout+).
+ +StdioPrinter+::
+ The same as +ErrorPrinter+ except that it uses +printf+ instead of +std::cout+.
+ +ParenPrinter+::
+ Identical to +ErrorPrinter+ except that it prints line numbers in parantheses. This is the way Visual Studio expects it.
+ +XmlPrinter+::
+ Print test results to an XML file.
+ +XUnitPrinter+::
+ This test listener generates output using both +ErrorPrinter+ and +XmlPrinter+.
+
+ErrorPrinter
+^^^^^^^^^^^^
+
+The +--error-printer+ option creates a runner using the +ErrorPrinter+
+test listener, and it indicates that the standard library is used
+in the test runner. The +ErrorPrinter+ test listener prints dots
+to summarize test execution, along with a summary of the test
+results. For example, the command
+[source,bash]
+----
+include::examples/.buildRunner2_main.sh[]
+----
+generates the following output:
+
+----
+include::examples/exeRunner2.out[]
+----
+
+StdioPrinter
+^^^^^^^^^^^^
+
+If your compiler does not support +std::cout+, then the +ErrorPrinter+ test listener cannot be used.
+In this case, the +StdioPrinter+ test listener can be used; it provides the same output as +ErrorPrinter+ but it uses the +printf+ function. For example, the command line:
+[source,bash]
+----
+include::examples/.buildRunner4_main.sh[]
+----
+generates the following output:
+
+----
+include::examples/buildRunner4.txt[]
+----
+
+ParenPrinter
+^^^^^^^^^^^^
+
+The +--runner=ParenPrinter+ option creates a similar test runner:
+[source,bash]
+----
+include::examples/.buildRunner3_main.sh[]
+----
+This test runner generates output that is similar to the +ErrorPrinter+ test listener:
+
+----
+include::examples/buildRunner3.txt[]
+----
+The only difference is the parentheses used in the output. This test listener provides a format that can be recognized by Visual Studio.
+
+////
+The +StdioPrinter+ makes reference to +stdout+ as the default output
+stream. In some environments, the +stdio.h+ header may be defined
+but not +stdout+. The +StdioFilePrinter+ test listener can be used
+in this case, though the main() function needs to be adapted to specify the
+stream that is used in output.
+////
+
+XmlPrinter
+^^^^^^^^^^
+
+The +--runner=XmlPrinter+ option creates a test runner whose output is an XML summary of the test results. For example, the command:
+[source,bash]
+----
+include::examples/.buildRunner6_main.sh[]
+----
+generates the following output:
+
+----
+include::examples/buildRunner6.txt[]
+----
+This XML format is conforms to the XML standard used by other xUnit tools. Thus, this output can be used as input in other tools, like http://jenkins-ci.org/[Jenkins], to generate test summaries.
+
+
+XUnitPrinter
+^^^^^^^^^^^^
+
+The +XUnitPrinter+ test listener generates output using both the
+ErrorPrinter+ and +XmlPrinter+ test listeners. This allows the
+user to interactively view a simple test summary, while simultaneously
+generating an XML summary of the test results. The +--xunit-printer+
+option specifies the use of +XUnitPrinter+:
+[source,bash]
+----
+include::examples/.buildRunner7_main.sh[]
+----
+This test runner generates the following output:
+
+----
+include::examples/buildRunner7.txt[]
+----
+The default filename for the XML results is +TEST-cxxtest.xml+. The +--xunit-file+ option can be used to specify an alternative filename. Additionally, the value of the +--world+ option can be used to specify the filename +TEST-<world>.xml+.
+
+
+Language Options
+~~~~~~~~~~~~~~~~
+
+When +cxxtestgen+ performs test discovery, it also performs checks
+to detect whether (1) the standard library is used and (2) exceptions
+are used. These checks configure CxxTest to _not_ assume that these
+C++ language features are used when generating the test driver.
+Thus, CxxTest can naturally be used with compilers that do not
+support these features.
+
+The +cxxtestgen+ command includes several options that override
+these checks and define features of C++ that are used by the test
+runner. The +--have-std+ option indicates that the test runner
+should use the standard library, and the +--no-std+ option indicates
+that the test runner should not use the standard library. The
+--have-eh+ options indicates that the test runner should use
+exception handling, and the +--no-eh+ indicates that the test runner
+should not not use exception handling.
+
+The +--longlong+ option specifies the type used for long long
+integers. The default is for _no_ long long integer type to be specified,
+which is consistent with the current C++ standard.
+
+CxxTest test runners depend quite heavily on static initialization
+of objects that are used to define and execute tests. The
+--no-static-init+ option can be used to avoid static initialization
+for compilers or linkers that have trouble compiling the default test runner.
+
+
+Creating Test Runners from Parts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The default behavior of +cxxtestgen+ is to generate a test runner
+that directly integrates classes that define the tests along with
+a +main()+ function that executes all test suites. It is often useful to
+allow test suites to be processes separately and then linked together. The +--root+ and +--part+ options
+support this logic. For example, suppose that we wish to define a test runner for tests in the headers
+MyTestSuite1.h+ and +MyTestSuite2.h+. We execute +cxxtestgen+ with the +--part+ option to generate source files for each of the test suites:
+[source,bash]
+----
+include::examples/.buildRunner9_part.sh[]
+----
+Similarly, we execute +cxxtestgen+ with the +--root+ opiton to generate the +main()+ routine:
+[source,bash]
+----
+include::examples/.buildRunner9_root.sh[]
+----
+Finally, the test runner is built by compiling all of these source files together:
+[source,bash]
+----
+include::examples/.buildRunner9_compile.sh[]
+----
+
+
+Template Files
+~~~~~~~~~~~~~~
+
+CxxTest supports the use of _template files_ to provide a custom
+main()+ function. This may be useful when using a custom test
+listener, or when using an existing CxxTest test listener in a
+nonstandard manner. A template file is an ordinary source files
+with the embedded declaration +<CxxTest world>+, which tells
+cxxtestgen+ to insert the world definition at that point.
+
+The +--template+ option is used to specify the use of a template file:
+[source,bash]
+----
+include::examples/.buildRunner10_main.sh[]
+----
+For example, consider the following template file:
+[source,{cpp}]
+----
+include::examples/runner10.tpl[]
+----
+This file specifies macros that customize the test runner, and output is generated before and after the tests are run.
+
+Note that CxxTest needs to insert certain definitions and +#include+
+directives in the runner file. It normally does that before the
+first +#include <cxxtest/*.h>+ found in the template file. If this
+behavior is not what you need, use the directive +<CxxTest preamble>+
+to specify where this preamble is inserted.
+
+
+Test Discovery Options
+~~~~~~~~~~~~~~~~~~~~~~
+
+The +cxxtestgen+ command performs test discovery by searching C++
+header files for CxxTest test classes. The default process for
+test discovery is a simple process that analyzes each line in a
+header file sequentially, looking for a sequence of lines that
+represent class definitions and test method definitions.
+
+There are many limitations to this simple process for test discovery,
+and in CxxTest 4.0 a new test discovery mechanism was added based
+on the a parser for the
+http://www.computing.surrey.ac.uk/research/dsrg/fog/[Flexible Object
+Generator (FOG)] language, which is a superset of C\++. The grammar
+for the FOG language was adapted to parse C++ header files to
+identify class definitions and class inheritance relationships,
+class and namespace nesting of declarations, and class methods.
+This allows +cxxtestgen+ to identify test classes that are defined
+with complex inheritance relationships.
+
+The +--fog+ option is used to specify the use of the FOG parser for
+test discovery. Although the FOG parser is more powerful, the
+simpler +cxxtestgen+ test discover process is the default because
+the FOG parser is slower execute. Additionally, the FOG parser
+requires the installation of +ply+ and, for Python version 2.6,
+ordereddict+. If these packages are not available, then the +--fog+
+option is automatically disabled.
+
+The following sections illustrate differences between these two test discovery mechanisms, along with
+general limitations of the test discovery process.
+
+Unexpected Test Suite Format
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The default test discovery mechanism does a very simple analysis
+of the input files, which can easily fail when test classes are not
+formated in a standard manner. For example, consider the following
+test suite:
+[source,{cpp}]
+-----
+include::examples/MyTestSuite4.h[]
+----
+This test suite is not recognized by the default test discovery
+mechanism, but the FOG parser correctly parsers this file and
+recognizes the test suite. A variety of similar discovery failures
+arise due to the simple process used by the test discovery mechanism.
+
+
+Commenting Out Tests
+^^^^^^^^^^^^^^^^^^^^
+
+Adding and disabling tests are two common steps in test development.
+The process of test discovery makes adding tests very easy. However,
+disabling tests is somewhat more complicated. Consider the following
+header file, which defines four tests (three of which are disabled):
+[source,{cpp}]
+-----
+include::examples/MyTestSuite3.h[]
+----
+
+The first is commented out with C\++-style comments, the second
+test is commented out with C-style comments, and the third test is
+named in a manner that is not recognized through test discovery
+(i.e., it does not start with +test+).
+
+The default test discovery mechanism only works with the first and
+third methods for disabling tests, but the FOG parser works with
+all three. The FOG parser performs a complex, multi-line parse of
+the source file, so it can identify multi-line C-style comments.
+
+Note, however, that the use of C macros will not work:
+[source,{cpp}]
+-----
+include::examples/BadTestSuite1.h[]
+----
+The +cxxtestgen+ discovery mechanisms do not perform a C preprocessing
+step, since that would generally require using externally defined
+preprocessing variable definitions. Additionally, preprocessor macros that act like functions will
+cause the FOG parser to fail unless they are followed by a semicolon.
+
+
+[[runner]]
+Test Runner Syntax
+------------------
+
+The default behavior of the CxxTest test runner is to execute all
+tests in all of the test suites that are linked into the runner.
+However, CxxTest test runners process command line options that
+allow individual tests and test suites to be selected.
+
+For example, consider a test runner defined as follows:
+[source,bash]
+----
+include::examples/.buildRunner13_main.sh[]
+----
+The +--help+ (+-h+) option can be used to print the command line options for a test runner. The command
+
+----
+include::examples/.buildRunner13_help.sh[]
+----
+generates the following output:
+
+----
+include::examples/runner13.help.txt[]
+----
+
+The +--help-tests+ option is used to list all test suites that are defined in a test runner. The command
+[source,bash]
+----
+include::examples/.buildRunner13_helpTests.sh[]
+----
+generates the following output:
+
+----
+include::examples/runner13.helpTests.txt[]
+----
+The first column is the test suite name, and the second column is the test name.
+
+All tests in a test suite can be executed by simply specifying the test suite name. For example
+[source,bash]
+----
+include::examples/.buildRunner13_MyTestSuite2.sh[]
+----
+executes the tests in test suite +MyTestSuite2+:
+
+----
+include::examples/runner13.MyTestSuite2.txt[]
+----
+
+Similarly, a single test can be executed by specifying the test suite followed by the test name. For example
+[source,bash]
+----
+include::examples/.buildRunner13_testMultiplication.sh[]
+----
+executes the +testMultiplication+ test in test suite +MyTestSuite2+:
+
+----
+include::examples/runner13.testMultiplication.txt[]
+----
+
+The +-v+ option enables the printing of trace information generated
+by the +TS_TRACE+ function. For example, the +testMultiplication+ test contains trace declarations
+before and after the multiplication test. Thus, the command
+[source,bash]
+----
+include::examples/.buildRunner13_testMultiplicationVerbose.sh[]
+----
+generates this trace output before and after the test:
+
+----
+include::examples/runner13.testMultiplicationVerbose.txt[]
+----
+
+
+[[advanced]]
+Advanced Testing Features
+-------------------------
+
+Preprocessor Macros
+~~~~~~~~~~~~~~~~~~~
+
+CxxTest recognizes a variety of preprocessor macros that can be used to modify the behavior of a test runner. Many of these mimic the options of the +cxxtestgen+ command.
+
+[options="header"]
+|====================================================================================
+| Preprocessor Macro | Description
+| +CXXTEST_HAVE_STD+ | Use the standard library.
+| +CXXTEST_HAVE_EH+ | Use exception handling.
+| +CXXTEST_ABORT_TEST_ON_FAIL+ | Abort tests on failed asserts.
+| +CXXTEST_USER_VALUE_TRAITS+ | Enable user-defined value traits. The default traits dump up to 8 bytes of the data as hex values.
+| +CXXTEST_OLD_TEMPLATE_SYNTAX+ | Use old template syntax that is used by some compilers (e.g. Borland C++ 5).
+| +CXXTEST_OLD_STD+ | Use old syntax for libraries where +std::+ is not recognized.
+| +CXXTEST_MAX_DUMP_SIZE+ | The value of this macro defines the maximum number of bytes to dump if +TS_ASSERT_SAME_DATA()+ fails. The default is 0, which indicates no limit.
+| +CXXTEST_DEFAULT_ABORT+ | The value of this macro is the default value of the dynamic _abort on fail_ flag.
+| +CXXTEST_LONGLONG+ | The value of this macro is used to define long long integers.
+|=====================================
+
+These preprocessor macros must be defined before the CxxTest header
+files are included in the test runner. For example, the following
+template file defines +CXXTEST_HAVE_EH+ and +CXXTEST_ABORT_TEST_ON_FAIL+
+before other headers are included:
+[source,{cpp}]
+----
+include::examples/runner10.tpl[]
+----
+
+Several of these macros concern whether modern C++ conventions are
+supported by the compiler. If tests need to be ported to multiple
+compilers, then one important convention is whether the namespace
++std::+ is supported. For example, switching between +cout+ and
++std::cout+ typically needs to be done throughout a code. CxxTest
+supports this with the +CXXTEST_STD()+ macro. For example,
++CXXTEST_STD(cout)+ can be used within a test suite, and CxxTest
+handles the mapping of this to +cout+ or +std::cout+ depending on
+options provided to +cxxtestgen+.
+
+
+
+Customizing Test Fixtures
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup and Teardown
+^^^^^^^^^^^^^^^^^^
+
+CxxTest test fixtures can be customized in several ways to manage
+the environment for test suites and individual tests. A common
+feature of test suites is that they share a common logic for setting
+up data used in the tests. Thus, there may be duplicate code for
+creating objects, files, inputs, etc. Similarly, the tests may
+share common logic for cleaning up after the test is finished (e.g. deleting temporary objects).
+
+You can put this shared code in a common place by overriding the
+virtual functions `TestSuite::setUp()` and `TestSuite::tearDown()`.
+The `setUp()` function is called before each test, and `tearDown()`
+is called after each test.
+
+For example, the following test suite employs +setUp()+ and +tearDown()+ methods to
+allocate and deallocate memory for a string buffer:
+[source,{cpp}]
+-----
+include::examples/MyTestSuite5.h[]
+-----
+
+Dynamically Created Test Suites
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+CxxTest test fixtures can also be customized during the construction
+and deconstruction of test suites. By default, CxxTest test suites
+are instantiated statically in the test runner. However, dynamically
+created test suites can be used to perform suite-level setup and
+teardown operations, verify the environment needed to execute a
+test suite, and construct test suites that require a nontrivial
+constructor.
+
+CxxTest instantiates a test suite dynamically if the +createSuite()+
+or +destroySuite()+ methods are defined. For example, the following
+test suite checks to see if it is being compiled with Microsoft
+Visual Studio. If not, the +createSuite()+ returns a null pointer,
+indicating that the test suite was not created.
+[source,{cpp}]
+-----
+include::examples/MyTestSuite6.h[]
+-----
+
+Global and World Fixtures
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+CxxTest supports two related mechanisms for performing _global_
+setup and teardown operations. _Global fixtures_ are classes that
+inherit from `CxxTest::GlobalFixture`, and they define `setUp` and
+`tearDown` methods. The `setUp` method for all global fixtures is
+called before each test is executed, and the `tearDown` method for
+all global fixtures is called after each test is completed. Thus,
+this mechanism provides a convenient way of defining setup and
+teardown operations that apply to all test suites.
+
+For example, consider the following test suite:
+[source,{cpp}]
+-----
+include::examples/MyTestSuite8.h[]
+-----
+This test suite defines a runner that generates the following output:
+
+-----
+include::examples/buildRunner18.txt[]
+-----
+
+Note that the global fixtures are instantiated with static global
+values. This ensures that these fixtures are created before the
+runner is initialized. Also, note that the `setUp` methods are
+called in the same sequence that the global fixtures are instantiated,
+and the `tearDown` methods are called in the reverse sequence.
+Finally, note that the `setUp` and `tearDown` methods in global
+fixtures return a boolean value, which indicates success or failure
+of that operation.
+
+This example also illustrates the use of _world fixtures_, which
+perform setup and teardown operations that are executed once each
+when beginning and finishing tests in each test suite. World
+fixtures are defined with the `setUpWorld` and `tearDownWorld`
+methods in a global fixture.
+
+
+Runtime Test Customization
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+CxxTest defines several functions that can be called in a test suite to modify the default behavior of CxxTest.
+
+[options="header"]
+|==================================
+| Test Suite Method | Description
+| +setAbortTestOnFail(bool)+ | This function specifies whether tests abort after a failure. The default value of the flag is +false+. This function only has an effect if exception handling is enabled.
+| +setMaxDumpSize(unsigned)+ | This function sets the maximum number of bytes that are dumped when
++TS_ASSERT_SAME_DATA()+ fails. The default is 0, which indicates no limit.
+|=============
+
+Note that the the configuration parameters are reset to their default
+values after each test is executed (more precisely, after +tearDown()+
+is called). Consequently, calling these functions in the +setUp()+
+function has the effect of setting that value for the entire test
+suite.
+
+
+
+[[traits]]
+Value Traits
+------------
+
+CxxTest's test assertions like <<ts_assert_equals,TS_ASSERT_EQUALS>>
+work for built-in types, but they will not likely work for user-defined
+data types. This is because CxxTest needs a way to compare objects
+and to convert them to strings when printing test failure summaries.
+Thus, user-defined data types need to have the `operator=` method
+defined to ensure that test assertions can be applied.
+
+For example, the following code
+[source,{cpp}]
+-----
+include::examples/MyTestSuite7.h[]
+-----
+defines a test runner that generates the following output
+
+-----
+include::examples/buildRunner17.txt[]
+-----
+The `operator=` method is required to apply
+<<ts_assert_equals,TS_ASSERT_EQUALS>> to `Data` objects. However,
+the <<ts_assert_same_data,TS_ASSERT_SAME_DATA>> assertion can be
+applied to `Data2` objects that do not have `operator=` defined.
+
+Since CxxTest does not rely on any external library, conversion
+from arbitrary data types to strings is done using _value traits_.
+For example, to convert an integer to a string, CxxTest does the following:
+[source,{cpp}]
+----
+int i = 10;
+CxxTest::ValueTraits<int> converter(i);
+const char* string = converter.asString();
+----
+The CxxTest header file `cxxtest/ValueTraits.h` defines value traits
+for standard types like `int`, `char`, `double`, etc. The default
+`ValueTraits` class for unknown types dumps up to 8 bytes of the value
+in hex format.
+
+If the macro `CXXTEST_USER_VALUE_TRAITS` is defined, then CxxTest will
+omit the default definitions for `ValueTraits`. This allows a user to define their own trait specifications to customize the display of trait information.
+
+
+
+Enumeration Traits
+~~~~~~~~~~~~~~~~~~
+
+CxxTest provides a simple way to define value traits for enumeration
+types. The `CXXTEST_ENUM_TRAITS` macro is used to define value
+traits for all members of an enumeration set.
+
+For example, the following code
+[source,{cpp}]
+-----
+include::examples/MyTestSuite9.h[]
+-----
+defines a test runner that generates the following output
+
+-----
+include::examples/buildRunner19.txt[]
+-----
+The enumeration value traits print strings that represent the elements of the enumeration, except where a numeric value is provided.
+
+Note that the `CXXTEST_ENUM_TRAITS` macros has two arguments; the list of `CXXTEST_ENUM_MEMBER` macros is not separated by commas!
+
+
+Defining New Value Traits
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Defining value traits for a new class is done by providing a class
+specialization of `ValueTraits` that converts an object of the new
+class to a string. For example, consider the definition of the
+`MyClass` class:
+[source,{cpp}]
+-----
+include::examples/MyClass.h[]
+-----
+This class includes definitions of `operator==` and `operator<`
+that support comparisons with <<ts_assert_equals,TS_ASSERT_EQUALS>>
+and <<ts_assert_less_than,TS_ASSERT_LESS_THAN>>. Additionally,
+this header contains a specialization of `ValueTraits` (in the
+`CxxTest` namespace) that generates a string description of a `MyClass`
+instance.
+
+The following test suite illustrates how these definitions can be
+used to define a test runner:
+[source,{cpp}]
+-----
+include::examples/MyTestSuite10.h[]
+-----
+This runner for this test suite generates the following output:
+
+-----
+include::examples/buildRunner20.txt[]
+-----
+The test failure print logic uses the specialization of `ValueTraits` to create
+the string description of `MyClass` that appears in the output.
+
+
+Defining Value Traits for Template Classes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A simple modification to the above example illustrates how a trait can be defined for a
+template class:
+[source,{cpp}]
+-----
+include::examples/MyTestSuite11.h[]
+-----
+Unfortunately, this example employs partial template specialization, which is not supported by all C++ compilers.
+
+
+[[mock]]
+Testing with Mock Objects
+-------------------------
+
+Mock Objects are a very useful concept for testing complex software.
+The key idea is to pass special objects to tested code that facilitates
+the testing process. For instance, a class that implements a
+protocol over TCP might rely on an abstract `ISocket` interface.
+Then a mock testing strategy could pass a `MockSocket` object that
+does anything that is useful for testing (e.g., keep a log of all
+data ``sent'' to verify later).
+
+However, when a challenge for C/C++ developers is that you may need
+to call _global_ functions which you cannot override. Consider any
+code that uses `fopen()`, `fwrite()` and `fclose()`. It is not
+very elegant to have this code actually create files while being
+tested. Even more importantly, you need to test how the code behaves
+when ``bad'' things happen (e.g., when `fopen()` fails). Handling
+these types of exceptional conditions is often a very challenging
+issue for software testing.
+
+CxxTest addresses this challenge by providing a generic mechanism for
+defining mock global functions. The next section illustrates this mechanism for a single
+global function. The following section provides more detail about specific features of CxxTest's
+support for mock testing.
+
+
+Example: A Mock +time()+ Function
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Suppose that we want to perform mock testing using the well known
+standard library function `time()`. Setting up a test suite with
+a mock global function for `time()` can be broken down into the
+following steps.
+
+Declare Mock Functions
+^^^^^^^^^^^^^^^^^^^^^^
+
+The `CXXTEST_MOCK_GLOBAL` macro is used to declare mock global functions. It is often convenient to include
+these declarations in a header file, which is used in both the test suite as well as the code that is being tested:
+[source,{cpp}]
+-----
+include::examples/time_mock.h[]
+-----
+
+Mock Functions in Tested Code
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The tested code uses mock global functions, rather than using the global functions directly.
+You access mock functions in the `T` (for _Test_) namespace, so the tested code calls `T::time()` instead of
+`time()`. This is the equivalent of using abstract interfaces
+instead of concrete classes.
+[source,{cpp}]
+-----
+include::examples/rand_example.cpp[]
+-----
+
+
+Mock Source Files
+^^^^^^^^^^^^^^^^^
+
+A source file needs to be defined that implements `T::time()` by
+calling the real global function. This definition is performed automatically by
+defining `CXXTEST_MOCK_REAL_SOURCE_FILE` before the header file is defined:
+[source,{cpp}]
+-----
+include::examples/time_real.cpp[]
+-----
+This source file is not used for testing, but instead it supports normal use of the tested code.
+
+Similarly, a source file needs to be defined that implements `T::time()` by calling the mock
+global function. This definition is performed automatically by defining `CXXTEST_MOCK_TEST_SOURCE_FILE` before the header file is defined:
+[source,{cpp}]
+-----
+include::examples/time_mock.cpp[]
+-----
+
+
+Test Suites using Mock Functions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A mock object for the `time()` function is created using the `T::Base_time` class,
+which is automatically created by CxxTest. This class includes a `time()` method whose
+API is the same as the global `time()` function. Thus, this method can be defined to have
+whatever behavior is desired during testing. For example, the following example defines a
+mock object that increments a counter to define an incremental value for `time()`.
+[source,{cpp}]
+-----
+include::examples/MockTestSuite.h[]
+-----
+Note that CxxTest uses global data to associate calls made with `T::time()`
+to calls to `MockObject::time()`. The `MockObject` class simply
+needs to be instantiated prior to the call to `T::time()`.
+
+
+Building the Test Runner
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The +cxxtestgen+ command is used to create a test runner with mock functions in a normal manner:
+[source,bash]
+-----
+include::examples/.buildRunner16_main.sh[]
+-----
+The test runner source file, `runner.cpp`, needs to be compiled an linked to the mock function definition, `time_mock.cpp`, as well as the code being tested, `rand_example.cpp`:
+[source,bash]
+-----
+include::examples/.buildRunner16_compile.sh[]
+-----
+This generates a test runner that generates the following output:
+
+-----
+include::examples/buildRunner16.txt[]
+-----
+
+
+Advanced Topics
+~~~~~~~~~~~~~~~
+
+Void Functions
+^^^^^^^^^^^^^^
+
+The `CXXTEST_MOCK_VOID_GLOBAL` is used to define mock global functions that return `void`.
+This is identical to
+`CXXTEST_MOCK_GLOBAL` except that it does not specify the return
+type. Take a look in `sample/mock/T/stdlib.h` for a demonstation.
+
+Calling the Real Functions While Testing
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+During testing it is sometimes necessary to call the real global
+function instead of the mock global function. CxxTest allows a
+user to do this by creating a special mock object. For a global
+mock function of `time()`, the object `T::Real_time` represents the
+real function. If this class is created, then `T::time()` will be
+redirected to the real function.
+
+Mocking Nonexistent Functions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Sometimes the tested code calls functions that are not available
+when testing. For example, this can happen when testing driver
+code that calls kernel functions that are not available to a user-mode
+test runner. CxxTest can provide mock global function definitions
+for the test code while using the original functions in the tested code.
+
+
+The `CXXTEST_SUPPLY_GLOBAL` and `CXXTEST_SUPPLY_VOID_GLOBAL` macros are used to provide mock global function definitions. For example, the following declaration creates a mock global function for the Win32 kernel function `IoCallDriver`:
+[source,{cpp}]
+-----
+CXXTEST_SUPPLY_GLOBAL( NTSTATUS, /* Return type */
+ IoCallDriver, /* Name */
+ ( PDEVICE_OBJECT Device, /* Prototype */
+ PIRP Irp ),
+ ( Device, Irp ) /* How to call */ );
+-----
+The tested driver code calls `IoCallDriver()` normally; there is no need for the `T::` syntax.
+The test suite is defined using the `T::Base_IoCallDriver` as with normal mock objects.
+
+CxxTest also provides the macros `CXXTEST_SUPPLY_GLOBAL_C` and
+`CXXTEST_SUPPLY_GLOBAL_VOID_C` that declare the functions with `C`
+linkage (i.e., using `extern "C"`). These macros are used to declare
+function prototypes, since you may not be able to include the header
+files in the test suite that are associated with the mock global function.
+
+
+Functions in Namespaces
+^^^^^^^^^^^^^^^^^^^^^^^
+
+The `CXXTEST_MOCK` macro is used to declare a mock global function that is associated
+with a function in a namespace, including static class member functions.
+For example, consider the function `bool Files::FileExists( const
+String &name )`; the namespace `Files` contains the function
+`FileExists`. The mock class will be called `T::Base_Files_FileExists`
+and the function to implemented would be `fileExists`. The `CXXTEST_MOCK` macro declares this mock global function as follows:
+[source,{cpp}]
+-----
+CXXTEST_MOCK( Files_FileExists, /* Suffix of mock class */
+ bool, /* Return type */
+ fileExists, /* Name of mock member */
+ ( const String &name ), /* Prototype */
+ Files::FileExists, /* Name of real function */
+ ( name ) /* Parameter list */ );
+-----
+Similarly, the `CXXTEST_MOCK_VOID` macro is used to declare a mock global function that returns `void`.
+
+The `CXXTEST_SUPPLY` and `CXXTEST_SUPPLY_VOID` macros are used to provide mock global function definitions for nonexistent functions. For example:
+[source,{cpp}]
+-----
+CXXTEST_SUPPLY( AllocateIrp, /* => T::Base_AllocateIrp */
+ PIRP, /* Return type */
+ allocateIrp, /* Name of mock member */
+ ( CCHAR StackSize ), /* Prototype */
+ IoAllocateIrp, /* Name of real function */
+ ( StackSize ) /* Parameter list */ );
+-----
+Similarly, the `CXXTEST_SUPPLY_C` and `CXXTEST_SUPPLY_VOID_C` macros declare the functions with `C` linkage.
+
+Overloaded Functions
+^^^^^^^^^^^^^^^^^^^^
+
+The `CXXTEST_MOCK` and `CXXTEST_MOCK_VOID` macros have a flexible
+interface that can provide mock global function definitions for
+overloaded functions. The arguments simply need to specify different
+mock class names, mock member names and different prototype definitions.
+These different mock declarations will generate different mock objects that can be explicitly
+referenced in a test suite.
+
+The Mock Namespace
+^^^^^^^^^^^^^^^^^^
+
+The default namespace for mock functions is `T::`. This namespace can be changed by defining the
+`CXXTEST_MOCK_NAMESPACE` macro.
+
+
+[[installation]]
+Installation
+------------
+
+A key feature of CxxTest is that it does has virtually no installation
+process. The +cxxtestgen+ script can be directly executed from the
++cxxtest/bin+ directory. Simply adding this directory to the PATH
+environment of a command shell is sufficient for many applications.
+Beyond that, the build process for test runners simply needs to
+reference the +cxxtest+ root directory to enable proper includes
+during compilation.
+
+The FOG parser requires two Python packages:
+
+ - +ply+
+ - +ordereddict+ (This is needed when running Python 2.4, 2.5 or 2.6)
+
+If these packages are not available, then +cxxtestgen+ will generate an error when the
+FOG parser option is selected.
+If you have
+http://pypi.python.org/pypi/setuptools[setuptools] or
+http://pypi.python.org/pypi/distribute[distribute]
+installed, then
+you can install these packages from PyPI by executing
+[source,bash]
+----
+easy_install ply
+easy_install ordereddict
+----
+
+The +cxxtestgen+ script has been tested with many different versions
+of Python: 2.4 - 3.2. Note that this script has only been tested
+with the CPython implementation. CxxTest 4.0 has been tested on
+Linux and Mac platforms using the G++ and CLang++ compilers.
+
+
+////
+
+WEH - I thought about moving this section into the Getting Started
+section. However, it makes sense to leave this here to reference
+future installations in Debian, Mac Ports, etc. I think that that
+distribution model is very strategic for cxxtest.
+
+////
+
+
+[[discussion]]
+Status and Future Plans
+-----------------------
+
+The CxxTest 4.0 release reflects major changes in the management
+and focus of CxxTest. The 4.0 release is the first release of
+CxxTest in over seven years, and virtually all of the initial
+developers have moved on to other projects. CxxTest is heavily
+used at Sandia National Laboratories, and Sandia's ongoing use of
+CxxTest is a major driver for the 4.0 release.
+
+Similarly, major
+changes in CxxTest reflect the focus of the developer team:
+
+ - Perl is no longer used to support CxxTest scripts. Python is now the only scripting language used by CxxTest.
+ - The testing scripts have been rewritten using the PyUnit framework.
+ - The installation process for CxxTest now leverages and integrates with the system Python installation.
+ - A more comprehensive C++ parser is now available, which supports testing of templates.
+ - The CxxTest GUI is no longer supported, and the <<ts_warn,TS_WARN>> is deprecated.
+ - CxxTest runners now have a command-line interface that facilitates interative use of the test runner.
+ - A new user guide is now available in PDF, HTML and Ebook formats.
+ - Updated the +cxxtestgen+ script to work with Python 2.6 through 3.2
+
+Additionally, CxxTest is now validated with continuous integration
+tests. Yes, the CxxTest developers eat their own dog food!
+
+Although the GUI option for +cxxtestgen+ appears to work fine, this
+GUI is rather primitive. It simply provides a visual summary of
+the test results, and not the interactive test execution that a
+user would expect. This capability is deprecated since none of the
+current developers use this feature. CxxTest users should consider
+using CxxTest with http://jenkins-ci.org/[Jenkins]. The +XUnitPrinter+
+test listener generates XML files that can be easily integrated by
+http://jenkins-ci.org/[Jenkins], which creates a visual summary of
+test results with links to drill-down into test outputs.
+
+This documentation has highlighted the commonly used test listeners.
+There are a variety of other test listeners provided by CxxTest
+that support advanced Cxxtest applications. For example, the
++YesNoRunner+ is perhaps the simplest test listener; it simply
+returns the number of test failures. The +StdioFilePrinter+ is
+used by +StdioPrinter+, but it does not assume that +stdio+ is the
+default output stream. This test listener can be used in contexts
+where a custom output stream must be specified.
+
+////
+WEH - I'd like to say more about future support for CxxTest, but I don't know more basic things like how we should plan to host CxxTest in the future.
+
+Discuss support for ...
+
+ - embedded compilers... (Macros vs templates)
+ - SCONS
+
+Future work:
+
+ - ply cpp
+ - ignore template test classes using the FOG parser
+
+////
+
+////
+NOTE: we do not have test coverage for the following macros:
+CXXTEST_OLD_TEMPLATE_SYNTAX
+CXXTEST_OLD_STD
+CXXTEST_LONGLONG
+////
+
+
+:numbered!:
+
+[[acknowledgements]]
+Acknowledgements
+----------------
+
+CxxTest was originally developed by Erez Volk. The following
+developers actively contributed to the CxxTest 4.0 release:
+
+* Gašper Ažman
+* Kevin Fitch
+* William Hart
+* John Siirola
+
+The CxxTest documentation is generated using
+http://www.methods.co.nz/asciidoc/[AsciiDoc]. The following people
+have contributed to the CxxTest User Manual:
+
+* William Hart
+* Lionel Orry
+* Erez Volk
+
+A major advancement in CxxTest's capability is the new test discovery
+mechanism that is based on a parser of the Flexible Object Language
+(FOG). FOG generalizes the C++ syntax, which enables CxxTest to
+extract high-level class structure for test discovery. FOG was
+developed by Edward Willink:
+
+* Edward D. Willink. 'Meta-Compilation for C++', PhD Thesis, Computer Science Research Group, University of Surrey, January 2000.
+
+The FOG parser in CxxTest critically relies on the excellent LALR
+parser provided by Dave Beazley's `ply` Python package. The scalable
+performance of `ply` is critical for CxxTest.
+
+CxxTest has greatly benefited from the support of the open source
+community. We would like to thank the following organizations for
+providing web hosting and computing resources: GitHub, SourceForge,
+Tigris.org, Sandia National Laboratories, Google and COIN-OR. The development
+of CxxTest has been partially supported by Sandia National Laboratories.
+Sandia National Laboratories is a multi-program laboratory managed
+and operated by Sandia Corporation, a wholly owned subsidiary of
+Lockheed Martin Corporation, for the U.S. Department of Energy's
+National Nuclear Security Administration under contract DE-AC04-94AL85000.
+
+
+[appendix]
+[[appendix_A]]
+Test Assertion Examples
+-----------------------
+
+[[ts_assert]] TS_ASSERT::
+This is the most basic test assertion, which simply verifies that the +expr+ argument is true:
+[source,{cpp}]
+----
+include::examples/.Assertions_assert.h[]
+----
+[[ts_assert_delta]] TS_ASSERT_DELTA::
+This test assertion verifies two floating point values are within a specified absolute difference:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertDelta.h[]
+----
+
+[[ts_assert_differs]] TS_ASSERT_DIFFERS::
+This test assertion verifies that the two arguments are not equal:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertDiffers.h[]
+----
+
+[[ts_assert_equals]] TS_ASSERT_EQUALS::
+ This test assertion verifies that the two arguments are equal:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertEquals.h[]
+----
+Note that this test is performed using the C++ +==+ operator, whose behavior may be redefined for the two argument types.
+
+[[ts_assert_less_than]] TS_ASSERT_LESS_THAN::
+This test assertion verifies that the first argument is strictly less than the second argument:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertLessThan.h[]
+----
+
+[[ts_assert_less_than_equals]] TS_ASSERT_LESS_THAN_EQUALS::
+This test assertion verifies that the first argument is less than or equal to the second argument:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertLessThanEquals.h[]
+----
+
+[[ts_assert_predicate]] TS_ASSERT_PREDICATE::
+This test assertion takes as an argument the name of a class, similar to a STL +unary_function+, and evaluates the +operator()+ method:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertPredicate.h[]
+----
+This test assertion can be seen as a generalization of <<ts_assert,TS_ASSERT>>, but it
+allows the tester to see the failed value.
+
+[[ts_assert_relation]] TS_ASSERT_RELATION::
+It takes as an argument the name of a class, similar to a STL +binary_function+, and evaluates the +operator()+ method:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertRelation.h[]
+----
+This test assertion can be seen as a generalization of <<ts_assert_equals,TS_ASSERT_EQUALS>>, <<ts_assert_differs,TS_ASSERT_DIFFERS>>, <<ts_assert_less_than,TS_ASSERT_LESS_THAN>> and <<ts_assert_less_than_equals,TS_ASSERT_LESS_THAN_EQUALS>>.
+This can be used to assert comparisons which are not covered by the builtin test assertions.
+
+[[ts_assert_same_data]] TS_ASSERT_SAME_DATA::
+This test assertion is similar to <<ts_assert_equals,TS_ASSERT_EQUALS>>,
+except that it compares the contents of two buffers in memory:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertSameData.h[]
+----
+The standard runner dumps the contents of both buffers as hex values when this test fails.
+
+[[ts_assert_throws]] TS_ASSERT_THROWS::
+This test assertion verifies that the specified exception is thrown when the first argument is executed:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertThrows.h[]
+----
+
+[[ts_assert_throws_anything]] TS_ASSERT_THROWS_ANYTHING::
+This test assertion verifies that _some_ exception is thrown when the first argument is executed:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertThrowsAnything.h[]
+----
+
+[[ts_assert_throws_assert]] TS_ASSERT_THROWS_ASSERT::
+This test assertion verifies that an exception is thrown when executing the first argument. The second argument specifies a variable declaration for the exception, and the third argument is executed to test that
+exception value:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertThrowsAssert.h[]
+----
+Note that this can be viewed as a generalization of <<ts_assert_throws_equals,TS_ASSERT_THROWS_EQUALS>>.
+
+[[ts_assert_throws_equals]] TS_ASSERT_THROWS_EQUALS::
+This test assertion verifies that an exception is thrown when executing the first argument. The second argument specifies a variable declaration for the exception, and the third and fourth arguments are values that are asserted equal after the exception is thrown:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertThrowsEquals.h[]
+----
+
+[[ts_assert_throws_nothing]] TS_ASSERT_THROWS_NOTHING::
+This test assertion verifies that an exception is _not_ thrown when executing the first argument:
+[source,{cpp}]
+----
+include::examples/.Assertions_assertThrowsNothing.h[]
+----
+
+[[ts_fail]] TS_FAIL::
+This function triggers a test failure with an associated message:
+[source,{cpp}]
+----
+include::examples/.Assertions_fail.h[]
+----
+
+[[ts_trace]] TS_TRACE::
+This function prints an informational message:
+[source,{cpp}]
+----
+include::examples/.Assertions_trace.h[]
+----
+
+[[ts_warn]] TS_WARN::
+This function prints a message as a warning:
+[source,{cpp}]
+----
+include::examples/.Assertions_warn.h[]
+----
+
+
+[appendix]
+[[appendix_B]]
+Integrating with Your Build Environment
+---------------------------------------
+
+CxxTest can be integrated into a variety of build environments to
+automate the generation, compilation and execution of test runners.
+Here is a rough breakdown of this process:
+
+* Split the application into a library and a main module that just
+ calls the library classes. This way, the test runner will be
+ able to access all your classes through the library.
+* Create another application (or target, or project, or whatever)
+ for the test runner. Make the build tool generate it automatically.
+* Configure the build tool to run the tests automatically.
+
+Unfortunately, different build tools and IDEs need to setup this
+process in different ways. The following sections provide rough
+guidance for doing this for some come use cases.
+
+[NOTE]
+These examples are not actively maintained and tested. Please send
+suggestions to the CxxTest developers for updating this documentation.
+
+
+Using Makefiles
+~~~~~~~~~~~~~~~
+
+Generating the tests with a makefile is pretty straightforward.
+Simply add rules to generate, compile and run the test runner.
+
+[source,{makefile}]
+-----
+all: lib run_tests app
+
+# Rules to build your targets
+lib: ...
+
+app: ...
+
+# A rule that runs the unit tests
+run_tests: runner
+ ./runner
+
+# How to build the test runner
+runner: runner.cpp lib
+ g++ -o $@ $^
+
+# How to generate the test runner
+runner.cpp: SimpleTest.h ComplicatedTest.h
+ cxxtestgen -o $@ --error-printer $^
+-----
+
+
+Using Cons
+~~~~~~~~~~
+
+http://dsmit.com/cons/[Cons] is a powerful and
+versatile make replacement which uses Perl scripts instead of Makefiles.
+
+See `cxxtest/sample/Construct` in the CxxTest distribution for an
+example of building CxxTest test runners with Cons.
+
+
+Using Microsoft Visual Studio
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+See `cxxtest/sample/msvc` in the distribution
+to see a reasonable integration of CxxTest with Microsoft Visual Studio's IDE.
+Basically, the workspace has three
+projects:
+
+* The project `CxxTest_3_Generate` runs `cxxtestgen`.
+* The project `CxxTest_2_Build` compiles the generated file.
+* The project `CxxTest_1_Run` runs the tests.
+
+This method certainly works, and the test results are conveniently
+displayed as compilation errors and warnings (for <<ts_warn,TS_WARN>>.
+However, there are still a few things missing; to integrate this
+approach with your own project, you usually need to work a little
+bit and tweak some makefiles and project options. The script
+`sample/msvc/FixFiles.bat` can automate some of this process.
+
+
+Using Microsoft Windows DDK
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To use CxxTest with the `build` utility for device drivers, you add
+the generated tests file as an extra dependency using the
+`NTBUILDTARGET0` macro and the `Makefile.inc` file. An example of
+how to do this is in the CxxTest distribution under `sample/winddk`.
+
+
+[appendix]
+[[appendix_C]]
+Testing CxxTest
+---------------
+
+In the +cxxtest/test+ directory, you can execute
+[source,bash]
+----
+python test_cxxtest.py
+----
+to launch all tests. By default, this script executes test suites
+for a variety of compilers if they are found on the user's path:
+`g++`, `clang++`, +cl+ (the Microsoft Visual Studio compiler).
+Additionally, this test script includes separate test suites for
+the default test discovery mechanism as well as test discovery using
+the new FOG parser.
+
+You can execute a specific test suite by giving its name as an
+argument to this test script. For example, the command
+[source,bash]
+----
+python test_cxxtest.py TestGpp
+----
+executes the +TestGpp+ test suite, which tests CxxTest with the
+`g++` compiler. Similarly, the command
+[source,bash]
+----
+python test_cxxtest.py TestGppFOG
+----
+executes the test suite that tests CxxTest using the `g++` compiler
+and the FOG parser.
+
+The +test_cxxtest.py+ script should work with versions Python 2.7
+or newer. If you are running Python 2.6, you will need to install
+the +unittest2+ package. If you have
+http://pypi.python.org/pypi/setuptools[setuptools] or
+http://pypi.python.org/pypi/distribute[distribute]
+installed, then
+you can install this package from PyPI by executing
+[source,bash]
+----
+easy_install unittest2
+----
+Similarly, the tests for this document rely on the `PyUtilib` Python package.
+
+The FOG parser requires two Python packages:
+
+ - +ply+
+ - +ordereddict+ (This is only needed when running Python 2.6)
+
+If these packages are not available, then +test_cxxtest.py+ will skip the FOG tests.
+
+
+[appendix]
+[[appendix_D]]
+include::../Versions[]
+
+// vim: set syntax=asciidoc:
+
--- /dev/null
+import re
+import sys
+import os.path
+import os
+
+
+pat1a = re.compile('include::([a-zA-Z0-9_\.\-/\/]+\/)\.([^\_]+)\_[a-zA-Z0-9]*\.py\[\]')
+pat1b = re.compile('include::([a-zA-Z0-9_\.\-/\/]+\/)\.([^\_]+)\_[a-zA-Z0-9]*\.sh\[\]')
+pat1c = re.compile('include::([a-zA-Z0-9_\.\-/\/]+\/)\.([^\_]+)\_[a-zA-Z0-9]*\.h\[\]')
+pat1d = re.compile('include::([a-zA-Z0-9_\.\-/\/]+\/)\.([^\_]+)\_[a-zA-Z0-9]*\.cpp\[\]')
+pat2 = re.compile('([^@]+)@([a-zA-Z0-9]+):')
+pat3 = re.compile('([^@]+)@:([a-zA-Z0-9]+)')
+
+processed = set()
+
+def process(dir, root, suffix):
+ #print "PROCESS ",root, suffix
+ bname = "%s%s" % (dir, root)
+ global processed
+ if bname in processed:
+ return
+ #
+ anchors = {}
+ anchors[''] = open('%s.%s_.%s' % (dir, root, suffix), 'w')
+ INPUT = open('%s%s.%s' % (dir, root, suffix), 'r')
+ for line in INPUT:
+ m2 = pat2.match(line)
+ m3 = pat3.match(line)
+ if m2:
+ anchor = m2.group(2)
+ anchors[anchor] = open('%s.%s_%s.%s' % (dir, root, anchor, suffix), 'w')
+ elif m3:
+ anchor = m3.group(2)
+ anchors[anchor].close()
+ del anchors[anchor]
+ else:
+ for anchor in anchors:
+ os.write(anchors[anchor].fileno(), line)
+ INPUT.close()
+ for anchor in anchors:
+ if anchor != '':
+ print "ERROR: anchor '%s' did not terminate" % anchor
+ anchors[anchor].close()
+ #
+ processed.add(bname)
+
+
+for file in sys.argv[1:]:
+ print "Processing file '%s' ..." % file
+ INPUT = open(file, 'r')
+ for line in INPUT:
+ suffix = None
+ m = pat1a.match(line)
+ if m:
+ suffix = 'py'
+ #
+ if suffix is None:
+ m = pat1b.match(line)
+ if m:
+ suffix = 'sh'
+ #
+ if suffix is None:
+ m = pat1c.match(line)
+ if m:
+ suffix = 'h'
+ #
+ if suffix is None:
+ m = pat1d.match(line)
+ if m:
+ suffix = 'cpp'
+ #
+ if not suffix is None:
+ #print "HERE", line, suffix
+ fname = m.group(1)+m.group(2)+'.'+suffix
+ if not os.path.exists(fname):
+ print line
+ print "ERROR: file '%s' does not exist!" % fname
+ sys.exit(1)
+ process(m.group(1), m.group(2), suffix)
+ INPUT.close()
+
--- /dev/null
+CxxTest Python Package
+======================
+
+The CxxTest Python package includes utilities that are used by the
+CxxTest unit testing framework. Specifically, this Python package
+supports C++ parsing and code generation done in the cxxtestgen
+script.
+
--- /dev/null
+#
+# Execute this script to copy the cxxtest/*.py files
+# and run 2to3 to convert them to Python 3.
+#
+
+import glob
+import subprocess
+import os
+import shutil
+
+os.chdir('cxxtest')
+for file in glob.glob('*.py'):
+ shutil.copyfile(file, '../python3/cxxtest/'+file)
+#
+os.chdir('../python3/cxxtest')
+#
+for file in glob.glob('*.py'):
+ subprocess.call('2to3 -w '+file, shell=True)
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+"""cxxtest: A Python package that supports the CxxTest test framework for C/C++.
+
+.. _CxxTest: http://cxxtest.tigris.org/
+
+CxxTest is a unit testing framework for C++ that is similar in
+spirit to JUnit, CppUnit, and xUnit. CxxTest is easy to use because
+it does not require precompiling a CxxTest testing library, it
+employs no advanced features of C++ (e.g. RTTI) and it supports a
+very flexible form of test discovery.
+
+The cxxtest Python package includes capabilities for parsing C/C++ source files and generating
+CxxTest drivers.
+"""
+
+from cxxtest.__release__ import __version__, __date__
+__date__
+__version__
+
+__maintainer__ = "William E. Hart"
+__maintainer_email__ = "whart222@gmail.com"
+__license__ = "LGPL"
+__url__ = "http://cxxtest.tigris.org/"
+
+from cxxtest.cxxtestgen import *
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+""" Release Information for cxxtest """
+
+__version__ = '4.0.2'
+__date__ = "2012-01-02"
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+# vim: fileencoding=utf-8
+
+#
+# This is a PLY parser for the entire ANSI C++ grammar. This grammar was
+# adapted from the FOG grammar developed by E. D. Willink. See
+#
+# http://www.computing.surrey.ac.uk/research/dsrg/fog/
+#
+# for further details.
+#
+# The goal of this grammar is to extract information about class, function and
+# class method declarations, along with their associated scope. Thus, this
+# grammar can be used to analyze classes in an inheritance heirarchy, and then
+# enumerate the methods in a derived class.
+#
+# This grammar parses blocks of <>, (), [] and {} in a generic manner. Thus,
+# There are several capabilities that this grammar does not support:
+#
+# 1. Ambiguous template specification. This grammar cannot parse template
+# specifications that do not have paired <>'s in their declaration. In
+# particular, ambiguous declarations like
+#
+# foo<A, c<3 >();
+#
+# cannot be correctly parsed.
+#
+# 2. Template class specialization. Although the goal of this grammar is to
+# extract class information, specialization of templated classes is
+# not supported. When a template class definition is parsed, it's
+# declaration is archived without information about the template
+# parameters. Class specializations will be stored separately, and
+# thus they can be processed after the fact. However, this grammar
+# does not attempt to correctly process properties of class inheritence
+# when template class specialization is employed.
+#
+
+#
+# TODO: document usage of this file
+#
+
+from __future__ import division
+
+import os
+import ply.lex as lex
+import ply.yacc as yacc
+import re
+try:
+ from collections import OrderedDict
+except ImportError:
+ from ordereddict import OrderedDict
+
+lexer = None
+scope_lineno = 0
+identifier_lineno = {}
+_parse_info=None
+_parsedata=None
+noExceptionLogic = True
+
+def ply_init(data):
+ global _parsedata
+ _parsedata=data
+
+
+class Scope(object):
+
+ def __init__(self,name,abs_name,scope_t,base_classes,lineno):
+ self.function=[]
+ self.name=name
+ self.scope_t=scope_t
+ self.sub_scopes=[]
+ self.base_classes=base_classes
+ self.abs_name=abs_name
+ self.lineno=lineno
+
+ def insert(self,scope):
+ self.sub_scopes.append(scope)
+
+
+class CppInfo(object):
+
+ def __init__(self, filter=None):
+ self.verbose=0
+ if filter is None:
+ self.filter=re.compile("[Tt][Ee][Ss][Tt]|createSuite|destroySuite")
+ else:
+ self.filter=filter
+ self.scopes=[""]
+ self.index=OrderedDict()
+ self.index[""]=Scope("","::","namespace",[],1)
+ self.function=[]
+
+ def push_scope(self,ns,scope_t,base_classes=[]):
+ name = self.scopes[-1]+"::"+ns
+ if self.verbose>=2:
+ print "-- Starting "+scope_t+" "+name
+ self.scopes.append(name)
+ self.index[name] = Scope(ns,name,scope_t,base_classes,scope_lineno-1)
+
+ def pop_scope(self):
+ scope = self.scopes.pop()
+ if self.verbose>=2:
+ print "-- Stopping "+scope
+ return scope
+
+ def add_function(self, fn):
+ fn = str(fn)
+ if self.filter.search(fn):
+ self.index[self.scopes[-1]].function.append((fn, identifier_lineno.get(fn,lexer.lineno-1)))
+ tmp = self.scopes[-1]+"::"+fn
+ if self.verbose==2:
+ print "-- Function declaration "+fn+" "+tmp
+ elif self.verbose==1:
+ print "-- Function declaration "+tmp
+
+ def get_functions(self,name,quiet=False):
+ if name == "::":
+ name = ""
+ scope = self.index[name]
+ fns=scope.function
+ for key in scope.base_classes:
+ cname = self.find_class(key,scope)
+ if cname is None:
+ if not quiet:
+ print "Defined classes: ",list(self.index.keys())
+ print "WARNING: Unknown class "+key
+ else:
+ fns += self.get_functions(cname,quiet)
+ return fns
+
+ def find_class(self,name,scope):
+ if ':' in name:
+ if name in self.index:
+ return name
+ else:
+ return None
+ tmp = scope.abs_name.split(':')
+ name1 = ":".join(tmp[:-1] + [name])
+ if name1 in self.index:
+ return name1
+ name2 = "::"+name
+ if name2 in self.index:
+ return name2
+ return None
+
+ def __repr__(self):
+ return str(self)
+
+ def is_baseclass(self,cls,base):
+ '''Returns true if base is a base-class of cls'''
+ if cls in self.index:
+ bases = self.index[cls]
+ elif "::"+cls in self.index:
+ bases = self.index["::"+cls]
+ else:
+ return False
+ #raise IOError, "Unknown class "+cls
+ if base in bases.base_classes:
+ return True
+ for name in bases.base_classes:
+ if self.is_baseclass(name,base):
+ return True
+ return False
+
+ def __str__(self):
+ ans=""
+ keys = list(self.index.keys())
+ keys.sort()
+ for key in keys:
+ scope = self.index[key]
+ ans += scope.scope_t+" "+scope.abs_name+"\n"
+ if scope.scope_t == "class":
+ ans += " Base Classes: "+str(scope.base_classes)+"\n"
+ for fn in self.get_functions(scope.abs_name):
+ ans += " "+fn+"\n"
+ else:
+ for fn in scope.function:
+ ans += " "+fn+"\n"
+ return ans
+
+
+def flatten(x):
+ """Flatten nested list"""
+ try:
+ strtypes = basestring
+ except: # for python3 etc
+ strtypes = (str, bytes)
+
+ result = []
+ for el in x:
+ if hasattr(el, "__iter__") and not isinstance(el, strtypes):
+ result.extend(flatten(el))
+ else:
+ result.append(el)
+ return result
+
+#
+# The lexer (and/or a preprocessor) is expected to identify the following
+#
+# Punctuation:
+#
+#
+literals = "+-*/%^&|~!<>=:()?.\'\"\\@$;,"
+
+#
+reserved = {
+ 'private' : 'PRIVATE',
+ 'protected' : 'PROTECTED',
+ 'public' : 'PUBLIC',
+
+ 'bool' : 'BOOL',
+ 'char' : 'CHAR',
+ 'double' : 'DOUBLE',
+ 'float' : 'FLOAT',
+ 'int' : 'INT',
+ 'long' : 'LONG',
+ 'short' : 'SHORT',
+ 'signed' : 'SIGNED',
+ 'unsigned' : 'UNSIGNED',
+ 'void' : 'VOID',
+ 'wchar_t' : 'WCHAR_T',
+
+ 'class' : 'CLASS',
+ 'enum' : 'ENUM',
+ 'namespace' : 'NAMESPACE',
+ 'struct' : 'STRUCT',
+ 'typename' : 'TYPENAME',
+ 'union' : 'UNION',
+
+ 'const' : 'CONST',
+ 'volatile' : 'VOLATILE',
+
+ 'auto' : 'AUTO',
+ 'explicit' : 'EXPLICIT',
+ 'export' : 'EXPORT',
+ 'extern' : 'EXTERN',
+ '__extension__' : 'EXTENSION',
+ 'friend' : 'FRIEND',
+ 'inline' : 'INLINE',
+ 'mutable' : 'MUTABLE',
+ 'register' : 'REGISTER',
+ 'static' : 'STATIC',
+ 'template' : 'TEMPLATE',
+ 'typedef' : 'TYPEDEF',
+ 'using' : 'USING',
+ 'virtual' : 'VIRTUAL',
+
+ 'asm' : 'ASM',
+ 'break' : 'BREAK',
+ 'case' : 'CASE',
+ 'catch' : 'CATCH',
+ 'const_cast' : 'CONST_CAST',
+ 'continue' : 'CONTINUE',
+ 'default' : 'DEFAULT',
+ 'delete' : 'DELETE',
+ 'do' : 'DO',
+ 'dynamic_cast' : 'DYNAMIC_CAST',
+ 'else' : 'ELSE',
+ 'false' : 'FALSE',
+ 'for' : 'FOR',
+ 'goto' : 'GOTO',
+ 'if' : 'IF',
+ 'new' : 'NEW',
+ 'operator' : 'OPERATOR',
+ 'reinterpret_cast' : 'REINTERPRET_CAST',
+ 'return' : 'RETURN',
+ 'sizeof' : 'SIZEOF',
+ 'static_cast' : 'STATIC_CAST',
+ 'switch' : 'SWITCH',
+ 'this' : 'THIS',
+ 'throw' : 'THROW',
+ 'true' : 'TRUE',
+ 'try' : 'TRY',
+ 'typeid' : 'TYPEID',
+ 'while' : 'WHILE',
+ '"C"' : 'CLiteral',
+ '"C++"' : 'CppLiteral',
+
+ '__attribute__' : 'ATTRIBUTE',
+ '__cdecl__' : 'CDECL',
+ '__typeof' : 'uTYPEOF',
+ 'typeof' : 'TYPEOF',
+
+ 'CXXTEST_STD' : 'CXXTEST_STD'
+}
+
+tokens = [
+ "CharacterLiteral",
+ "FloatingLiteral",
+ "Identifier",
+ "IntegerLiteral",
+ "StringLiteral",
+ "RBRACE",
+ "LBRACE",
+ "RBRACKET",
+ "LBRACKET",
+ "ARROW",
+ "ARROW_STAR",
+ "DEC",
+ "EQ",
+ "GE",
+ "INC",
+ "LE",
+ "LOG_AND",
+ "LOG_OR",
+ "NE",
+ "SHL",
+ "SHR",
+ "ASS_ADD",
+ "ASS_AND",
+ "ASS_DIV",
+ "ASS_MOD",
+ "ASS_MUL",
+ "ASS_OR",
+ "ASS_SHL",
+ "ASS_SHR",
+ "ASS_SUB",
+ "ASS_XOR",
+ "DOT_STAR",
+ "ELLIPSIS",
+ "SCOPE",
+] + list(reserved.values())
+
+t_ignore = " \t\r"
+
+t_LBRACE = r"(\{)|(<%)"
+t_RBRACE = r"(\})|(%>)"
+t_LBRACKET = r"(\[)|(<:)"
+t_RBRACKET = r"(\])|(:>)"
+t_ARROW = r"->"
+t_ARROW_STAR = r"->\*"
+t_DEC = r"--"
+t_EQ = r"=="
+t_GE = r">="
+t_INC = r"\+\+"
+t_LE = r"<="
+t_LOG_AND = r"&&"
+t_LOG_OR = r"\|\|"
+t_NE = r"!="
+t_SHL = r"<<"
+t_SHR = r">>"
+t_ASS_ADD = r"\+="
+t_ASS_AND = r"&="
+t_ASS_DIV = r"/="
+t_ASS_MOD = r"%="
+t_ASS_MUL = r"\*="
+t_ASS_OR = r"\|="
+t_ASS_SHL = r"<<="
+t_ASS_SHR = r">>="
+t_ASS_SUB = r"-="
+t_ASS_XOR = r"^="
+t_DOT_STAR = r"\.\*"
+t_ELLIPSIS = r"\.\.\."
+t_SCOPE = r"::"
+
+# Discard comments
+def t_COMMENT(t):
+ r'(/\*(.|\n)*?\*/)|(//.*?\n)|(\#.*?\n)'
+ t.lexer.lineno += t.value.count("\n")
+
+t_IntegerLiteral = r'(0x[0-9A-F]+)|([0-9]+(L){0,1})'
+t_FloatingLiteral = r"[0-9]+[eE\.\+-]+[eE\.\+\-0-9]+"
+t_CharacterLiteral = r'\'([^\'\\]|\\.)*\''
+#t_StringLiteral = r'"([^"\\]|\\.)*"'
+def t_StringLiteral(t):
+ r'"([^"\\]|\\.)*"'
+ t.type = reserved.get(t.value,'StringLiteral')
+ return t
+
+def t_Identifier(t):
+ r"[a-zA-Z_][a-zA-Z_0-9\.]*"
+ t.type = reserved.get(t.value,'Identifier')
+ return t
+
+
+def t_error(t):
+ print "Illegal character '%s'" % t.value[0]
+ #raise IOError, "Parse error"
+ #t.lexer.skip()
+
+def t_newline(t):
+ r'[\n]+'
+ t.lexer.lineno += len(t.value)
+
+precedence = (
+ ( 'right', 'SHIFT_THERE', 'REDUCE_HERE_MOSTLY', 'SCOPE'),
+ ( 'nonassoc', 'ELSE', 'INC', 'DEC', '+', '-', '*', '&', 'LBRACKET', 'LBRACE', '<', ':', ')')
+ )
+
+start = 'translation_unit'
+
+#
+# The %prec resolves the 14.2-3 ambiguity:
+# Identifier '<' is forced to go through the is-it-a-template-name test
+# All names absorb TEMPLATE with the name, so that no template_test is
+# performed for them. This requires all potential declarations within an
+# expression to perpetuate this policy and thereby guarantee the ultimate
+# coverage of explicit_instantiation.
+#
+# The %prec also resolves a conflict in identifier : which is forced to be a
+# shift of a label for a labeled-statement rather than a reduction for the
+# name of a bit-field or generalised constructor. This is pretty dubious
+# syntactically but correct for all semantic possibilities. The shift is
+# only activated when the ambiguity exists at the start of a statement.
+# In this context a bit-field declaration or constructor definition are not
+# allowed.
+#
+
+def p_identifier(p):
+ '''identifier : Identifier
+ | CXXTEST_STD '(' Identifier ')'
+ '''
+ if p[1][0] in ('t','T','c','d'):
+ identifier_lineno[p[1]] = p.lineno(1)
+ p[0] = p[1]
+
+def p_id(p):
+ '''id : identifier %prec SHIFT_THERE
+ | template_decl
+ | TEMPLATE id
+ '''
+ p[0] = get_rest(p)
+
+def p_global_scope(p):
+ '''global_scope : SCOPE
+ '''
+ p[0] = get_rest(p)
+
+def p_id_scope(p):
+ '''id_scope : id SCOPE'''
+ p[0] = get_rest(p)
+
+def p_id_scope_seq(p):
+ '''id_scope_seq : id_scope
+ | id_scope id_scope_seq
+ '''
+ p[0] = get_rest(p)
+
+#
+# A :: B :: C; is ambiguous How much is type and how much name ?
+# The %prec maximises the (type) length which is the 7.1-2 semantic constraint.
+#
+def p_nested_id(p):
+ '''nested_id : id %prec SHIFT_THERE
+ | id_scope nested_id
+ '''
+ p[0] = get_rest(p)
+
+def p_scoped_id(p):
+ '''scoped_id : nested_id
+ | global_scope nested_id
+ | id_scope_seq
+ | global_scope id_scope_seq
+ '''
+ global scope_lineno
+ scope_lineno = lexer.lineno
+ data = flatten(get_rest(p))
+ if data[0] != None:
+ p[0] = "".join(data)
+
+#
+# destructor_id has to be held back to avoid a conflict with a one's
+# complement as per 5.3.1-9, It gets put back only when scoped or in a
+# declarator_id, which is only used as an explicit member name.
+# Declarations of an unscoped destructor are always parsed as a one's
+# complement.
+#
+def p_destructor_id(p):
+ '''destructor_id : '~' id
+ | TEMPLATE destructor_id
+ '''
+ p[0]=get_rest(p)
+
+#def p_template_id(p):
+# '''template_id : empty
+# | TEMPLATE
+# '''
+# pass
+
+def p_template_decl(p):
+ '''template_decl : identifier '<' nonlgt_seq_opt '>'
+ '''
+ #
+ # WEH: should we include the lt/gt symbols to indicate that this is a
+ # template class? How is that going to be used later???
+ #
+ #p[0] = [p[1] ,"<",">"]
+ p[0] = p[1]
+
+def p_special_function_id(p):
+ '''special_function_id : conversion_function_id
+ | operator_function_id
+ | TEMPLATE special_function_id
+ '''
+ p[0]=get_rest(p)
+
+def p_nested_special_function_id(p):
+ '''nested_special_function_id : special_function_id
+ | id_scope destructor_id
+ | id_scope nested_special_function_id
+ '''
+ p[0]=get_rest(p)
+
+def p_scoped_special_function_id(p):
+ '''scoped_special_function_id : nested_special_function_id
+ | global_scope nested_special_function_id
+ '''
+ p[0]=get_rest(p)
+
+# declarator-id is all names in all scopes, except reserved words
+def p_declarator_id(p):
+ '''declarator_id : scoped_id
+ | scoped_special_function_id
+ | destructor_id
+ '''
+ p[0]=p[1]
+
+#
+# The standard defines pseudo-destructors in terms of type-name, which is
+# class/enum/typedef, of which class-name is covered by a normal destructor.
+# pseudo-destructors are supposed to support ~int() in templates, so the
+# grammar here covers built-in names. Other names are covered by the lack
+# of identifier/type discrimination.
+#
+def p_built_in_type_id(p):
+ '''built_in_type_id : built_in_type_specifier
+ | built_in_type_id built_in_type_specifier
+ '''
+ pass
+
+def p_pseudo_destructor_id(p):
+ '''pseudo_destructor_id : built_in_type_id SCOPE '~' built_in_type_id
+ | '~' built_in_type_id
+ | TEMPLATE pseudo_destructor_id
+ '''
+ pass
+
+def p_nested_pseudo_destructor_id(p):
+ '''nested_pseudo_destructor_id : pseudo_destructor_id
+ | id_scope nested_pseudo_destructor_id
+ '''
+ pass
+
+def p_scoped_pseudo_destructor_id(p):
+ '''scoped_pseudo_destructor_id : nested_pseudo_destructor_id
+ | global_scope scoped_pseudo_destructor_id
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.2 Lexical conventions
+#-------------------------------------------------------------------------------
+#
+
+def p_literal(p):
+ '''literal : IntegerLiteral
+ | CharacterLiteral
+ | FloatingLiteral
+ | StringLiteral
+ | TRUE
+ | FALSE
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.3 Basic concepts
+#-------------------------------------------------------------------------------
+def p_translation_unit(p):
+ '''translation_unit : declaration_seq_opt
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.4 Expressions
+#-------------------------------------------------------------------------------
+#
+# primary_expression covers an arbitrary sequence of all names with the
+# exception of an unscoped destructor, which is parsed as its unary expression
+# which is the correct disambiguation (when ambiguous). This eliminates the
+# traditional A(B) meaning A B ambiguity, since we never have to tack an A
+# onto the front of something that might start with (. The name length got
+# maximised ab initio. The downside is that semantic interpretation must split
+# the names up again.
+#
+# Unification of the declaration and expression syntax means that unary and
+# binary pointer declarator operators:
+# int * * name
+# are parsed as binary and unary arithmetic operators (int) * (*name). Since
+# type information is not used
+# ambiguities resulting from a cast
+# (cast)*(value)
+# are resolved to favour the binary rather than the cast unary to ease AST
+# clean-up. The cast-call ambiguity must be resolved to the cast to ensure
+# that (a)(b)c can be parsed.
+#
+# The problem of the functional cast ambiguity
+# name(arg)
+# as call or declaration is avoided by maximising the name within the parsing
+# kernel. So primary_id_expression picks up
+# extern long int const var = 5;
+# as an assignment to the syntax parsed as "extern long int const var". The
+# presence of two names is parsed so that "extern long into const" is
+# distinguished from "var" considerably simplifying subsequent
+# semantic resolution.
+#
+# The generalised name is a concatenation of potential type-names (scoped
+# identifiers or built-in sequences) plus optionally one of the special names
+# such as an operator-function-id, conversion-function-id or destructor as the
+# final name.
+#
+
+def get_rest(p):
+ return [p[i] for i in range(1, len(p))]
+
+def p_primary_expression(p):
+ '''primary_expression : literal
+ | THIS
+ | suffix_decl_specified_ids
+ | abstract_expression %prec REDUCE_HERE_MOSTLY
+ '''
+ p[0] = get_rest(p)
+
+#
+# Abstract-expression covers the () and [] of abstract-declarators.
+#
+def p_abstract_expression(p):
+ '''abstract_expression : parenthesis_clause
+ | LBRACKET bexpression_opt RBRACKET
+ | TEMPLATE abstract_expression
+ '''
+ pass
+
+def p_postfix_expression(p):
+ '''postfix_expression : primary_expression
+ | postfix_expression parenthesis_clause
+ | postfix_expression LBRACKET bexpression_opt RBRACKET
+ | postfix_expression LBRACKET bexpression_opt RBRACKET attributes
+ | postfix_expression '.' declarator_id
+ | postfix_expression '.' scoped_pseudo_destructor_id
+ | postfix_expression ARROW declarator_id
+ | postfix_expression ARROW scoped_pseudo_destructor_id
+ | postfix_expression INC
+ | postfix_expression DEC
+ | DYNAMIC_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | STATIC_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | REINTERPRET_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | CONST_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | TYPEID parameters_clause
+ '''
+ #print "HERE",str(p[1])
+ p[0] = get_rest(p)
+
+def p_bexpression_opt(p):
+ '''bexpression_opt : empty
+ | bexpression
+ '''
+ pass
+
+def p_bexpression(p):
+ '''bexpression : nonbracket_seq
+ | nonbracket_seq bexpression_seq bexpression_clause nonbracket_seq_opt
+ | bexpression_seq bexpression_clause nonbracket_seq_opt
+ '''
+ pass
+
+def p_bexpression_seq(p):
+ '''bexpression_seq : empty
+ | bexpression_seq bexpression_clause nonbracket_seq_opt
+ '''
+ pass
+
+def p_bexpression_clause(p):
+ '''bexpression_clause : LBRACKET bexpression_opt RBRACKET
+ '''
+ pass
+
+
+
+def p_expression_list_opt(p):
+ '''expression_list_opt : empty
+ | expression_list
+ '''
+ pass
+
+def p_expression_list(p):
+ '''expression_list : assignment_expression
+ | expression_list ',' assignment_expression
+ '''
+ pass
+
+def p_unary_expression(p):
+ '''unary_expression : postfix_expression
+ | INC cast_expression
+ | DEC cast_expression
+ | ptr_operator cast_expression
+ | suffix_decl_specified_scope star_ptr_operator cast_expression
+ | '+' cast_expression
+ | '-' cast_expression
+ | '!' cast_expression
+ | '~' cast_expression
+ | SIZEOF unary_expression
+ | new_expression
+ | global_scope new_expression
+ | delete_expression
+ | global_scope delete_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_delete_expression(p):
+ '''delete_expression : DELETE cast_expression
+ '''
+ pass
+
+def p_new_expression(p):
+ '''new_expression : NEW new_type_id new_initializer_opt
+ | NEW parameters_clause new_type_id new_initializer_opt
+ | NEW parameters_clause
+ | NEW parameters_clause parameters_clause new_initializer_opt
+ '''
+ pass
+
+def p_new_type_id(p):
+ '''new_type_id : type_specifier ptr_operator_seq_opt
+ | type_specifier new_declarator
+ | type_specifier new_type_id
+ '''
+ pass
+
+def p_new_declarator(p):
+ '''new_declarator : ptr_operator new_declarator
+ | direct_new_declarator
+ '''
+ pass
+
+def p_direct_new_declarator(p):
+ '''direct_new_declarator : LBRACKET bexpression_opt RBRACKET
+ | direct_new_declarator LBRACKET bexpression RBRACKET
+ '''
+ pass
+
+def p_new_initializer_opt(p):
+ '''new_initializer_opt : empty
+ | '(' expression_list_opt ')'
+ '''
+ pass
+
+#
+# cast-expression is generalised to support a [] as well as a () prefix. This covers the omission of
+# DELETE[] which when followed by a parenthesised expression was ambiguous. It also covers the gcc
+# indexed array initialisation for free.
+#
+def p_cast_expression(p):
+ '''cast_expression : unary_expression
+ | abstract_expression cast_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_pm_expression(p):
+ '''pm_expression : cast_expression
+ | pm_expression DOT_STAR cast_expression
+ | pm_expression ARROW_STAR cast_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_multiplicative_expression(p):
+ '''multiplicative_expression : pm_expression
+ | multiplicative_expression star_ptr_operator pm_expression
+ | multiplicative_expression '/' pm_expression
+ | multiplicative_expression '%' pm_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_additive_expression(p):
+ '''additive_expression : multiplicative_expression
+ | additive_expression '+' multiplicative_expression
+ | additive_expression '-' multiplicative_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_shift_expression(p):
+ '''shift_expression : additive_expression
+ | shift_expression SHL additive_expression
+ | shift_expression SHR additive_expression
+ '''
+ p[0] = get_rest(p)
+
+# | relational_expression '<' shift_expression
+# | relational_expression '>' shift_expression
+# | relational_expression LE shift_expression
+# | relational_expression GE shift_expression
+def p_relational_expression(p):
+ '''relational_expression : shift_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_equality_expression(p):
+ '''equality_expression : relational_expression
+ | equality_expression EQ relational_expression
+ | equality_expression NE relational_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_and_expression(p):
+ '''and_expression : equality_expression
+ | and_expression '&' equality_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_exclusive_or_expression(p):
+ '''exclusive_or_expression : and_expression
+ | exclusive_or_expression '^' and_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_inclusive_or_expression(p):
+ '''inclusive_or_expression : exclusive_or_expression
+ | inclusive_or_expression '|' exclusive_or_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_logical_and_expression(p):
+ '''logical_and_expression : inclusive_or_expression
+ | logical_and_expression LOG_AND inclusive_or_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_logical_or_expression(p):
+ '''logical_or_expression : logical_and_expression
+ | logical_or_expression LOG_OR logical_and_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_conditional_expression(p):
+ '''conditional_expression : logical_or_expression
+ | logical_or_expression '?' expression ':' assignment_expression
+ '''
+ p[0] = get_rest(p)
+
+
+#
+# assignment-expression is generalised to cover the simple assignment of a braced initializer in order to
+# contribute to the coverage of parameter-declaration and init-declaration.
+#
+# | logical_or_expression assignment_operator assignment_expression
+def p_assignment_expression(p):
+ '''assignment_expression : conditional_expression
+ | logical_or_expression assignment_operator nonsemicolon_seq
+ | logical_or_expression '=' braced_initializer
+ | throw_expression
+ '''
+ p[0]=get_rest(p)
+
+def p_assignment_operator(p):
+ '''assignment_operator : '='
+ | ASS_ADD
+ | ASS_AND
+ | ASS_DIV
+ | ASS_MOD
+ | ASS_MUL
+ | ASS_OR
+ | ASS_SHL
+ | ASS_SHR
+ | ASS_SUB
+ | ASS_XOR
+ '''
+ pass
+
+#
+# expression is widely used and usually single-element, so the reductions are arranged so that a
+# single-element expression is returned as is. Multi-element expressions are parsed as a list that
+# may then behave polymorphically as an element or be compacted to an element.
+#
+
+def p_expression(p):
+ '''expression : assignment_expression
+ | expression_list ',' assignment_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_constant_expression(p):
+ '''constant_expression : conditional_expression
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.5 Statements
+#---------------------------------------------------------------------------------------------------
+# Parsing statements is easy once simple_declaration has been generalised to cover expression_statement.
+#
+#
+# The use of extern here is a hack. The 'extern "C" {}' block gets parsed
+# as a function, so when nested 'extern "C"' declarations exist, they don't
+# work because the block is viewed as a list of statements... :(
+#
+def p_statement(p):
+ '''statement : compound_statement
+ | declaration_statement
+ | try_block
+ | labeled_statement
+ | selection_statement
+ | iteration_statement
+ | jump_statement
+ '''
+ pass
+
+def p_compound_statement(p):
+ '''compound_statement : LBRACE statement_seq_opt RBRACE
+ '''
+ pass
+
+def p_statement_seq_opt(p):
+ '''statement_seq_opt : empty
+ | statement_seq_opt statement
+ '''
+ pass
+
+#
+# The dangling else conflict is resolved to the innermost if.
+#
+def p_selection_statement(p):
+ '''selection_statement : IF '(' condition ')' statement %prec SHIFT_THERE
+ | IF '(' condition ')' statement ELSE statement
+ | SWITCH '(' condition ')' statement
+ '''
+ pass
+
+def p_condition_opt(p):
+ '''condition_opt : empty
+ | condition
+ '''
+ pass
+
+def p_condition(p):
+ '''condition : nonparen_seq
+ | nonparen_seq condition_seq parameters_clause nonparen_seq_opt
+ | condition_seq parameters_clause nonparen_seq_opt
+ '''
+ pass
+
+def p_condition_seq(p):
+ '''condition_seq : empty
+ | condition_seq parameters_clause nonparen_seq_opt
+ '''
+ pass
+
+def p_labeled_statement(p):
+ '''labeled_statement : identifier ':' statement
+ | CASE constant_expression ':' statement
+ | DEFAULT ':' statement
+ '''
+ pass
+
+def p_try_block(p):
+ '''try_block : TRY compound_statement handler_seq
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_jump_statement(p):
+ '''jump_statement : BREAK ';'
+ | CONTINUE ';'
+ | RETURN nonsemicolon_seq ';'
+ | GOTO identifier ';'
+ '''
+ pass
+
+def p_iteration_statement(p):
+ '''iteration_statement : WHILE '(' condition ')' statement
+ | DO statement WHILE '(' expression ')' ';'
+ | FOR '(' nonparen_seq_opt ')' statement
+ '''
+ pass
+
+def p_declaration_statement(p):
+ '''declaration_statement : block_declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.6 Declarations
+#---------------------------------------------------------------------------------------------------
+def p_compound_declaration(p):
+ '''compound_declaration : LBRACE declaration_seq_opt RBRACE
+ '''
+ pass
+
+def p_declaration_seq_opt(p):
+ '''declaration_seq_opt : empty
+ | declaration_seq_opt declaration
+ '''
+ pass
+
+def p_declaration(p):
+ '''declaration : block_declaration
+ | function_definition
+ | template_declaration
+ | explicit_specialization
+ | specialised_declaration
+ '''
+ pass
+
+def p_specialised_declaration(p):
+ '''specialised_declaration : linkage_specification
+ | namespace_definition
+ | TEMPLATE specialised_declaration
+ '''
+ pass
+
+def p_block_declaration(p):
+ '''block_declaration : simple_declaration
+ | specialised_block_declaration
+ '''
+ pass
+
+def p_specialised_block_declaration(p):
+ '''specialised_block_declaration : asm_definition
+ | namespace_alias_definition
+ | using_declaration
+ | using_directive
+ | TEMPLATE specialised_block_declaration
+ '''
+ pass
+
+def p_simple_declaration(p):
+ '''simple_declaration : ';'
+ | init_declaration ';'
+ | init_declarations ';'
+ | decl_specifier_prefix simple_declaration
+ '''
+ global _parse_info
+ if len(p) == 3:
+ if p[2] == ";":
+ decl = p[1]
+ else:
+ decl = p[2]
+ if decl is not None:
+ fp = flatten(decl)
+ if len(fp) >= 2 and fp[0] is not None and fp[0]!="operator" and fp[1] == '(':
+ p[0] = fp[0]
+ _parse_info.add_function(fp[0])
+
+#
+# A decl-specifier following a ptr_operator provokes a shift-reduce conflict for * const name which is resolved in favour of the pointer, and implemented by providing versions of decl-specifier guaranteed not to start with a cv_qualifier. decl-specifiers are implemented type-centrically. That is the semantic constraint that there must be a type is exploited to impose structure, but actually eliminate very little syntax. built-in types are multi-name and so need a different policy.
+#
+# non-type decl-specifiers are bound to the left-most type in a decl-specifier-seq, by parsing from the right and attaching suffixes to the right-hand type. Finally residual prefixes attach to the left.
+#
+def p_suffix_built_in_decl_specifier_raw(p):
+ '''suffix_built_in_decl_specifier_raw : built_in_type_specifier
+ | suffix_built_in_decl_specifier_raw built_in_type_specifier
+ | suffix_built_in_decl_specifier_raw decl_specifier_suffix
+ '''
+ pass
+
+def p_suffix_built_in_decl_specifier(p):
+ '''suffix_built_in_decl_specifier : suffix_built_in_decl_specifier_raw
+ | TEMPLATE suffix_built_in_decl_specifier
+ '''
+ pass
+
+# | id_scope_seq
+# | SCOPE id_scope_seq
+def p_suffix_named_decl_specifier(p):
+ '''suffix_named_decl_specifier : scoped_id
+ | elaborate_type_specifier
+ | suffix_named_decl_specifier decl_specifier_suffix
+ '''
+ p[0]=get_rest(p)
+
+def p_suffix_named_decl_specifier_bi(p):
+ '''suffix_named_decl_specifier_bi : suffix_named_decl_specifier
+ | suffix_named_decl_specifier suffix_built_in_decl_specifier_raw
+ '''
+ p[0] = get_rest(p)
+ #print "HERE",get_rest(p)
+
+def p_suffix_named_decl_specifiers(p):
+ '''suffix_named_decl_specifiers : suffix_named_decl_specifier_bi
+ | suffix_named_decl_specifiers suffix_named_decl_specifier_bi
+ '''
+ p[0] = get_rest(p)
+
+def p_suffix_named_decl_specifiers_sf(p):
+ '''suffix_named_decl_specifiers_sf : scoped_special_function_id
+ | suffix_named_decl_specifiers
+ | suffix_named_decl_specifiers scoped_special_function_id
+ '''
+ #print "HERE",get_rest(p)
+ p[0] = get_rest(p)
+
+def p_suffix_decl_specified_ids(p):
+ '''suffix_decl_specified_ids : suffix_built_in_decl_specifier
+ | suffix_built_in_decl_specifier suffix_named_decl_specifiers_sf
+ | suffix_named_decl_specifiers_sf
+ '''
+ if len(p) == 3:
+ p[0] = p[2]
+ else:
+ p[0] = p[1]
+
+def p_suffix_decl_specified_scope(p):
+ '''suffix_decl_specified_scope : suffix_named_decl_specifiers SCOPE
+ | suffix_built_in_decl_specifier suffix_named_decl_specifiers SCOPE
+ | suffix_built_in_decl_specifier SCOPE
+ '''
+ p[0] = get_rest(p)
+
+def p_decl_specifier_affix(p):
+ '''decl_specifier_affix : storage_class_specifier
+ | function_specifier
+ | FRIEND
+ | TYPEDEF
+ | cv_qualifier
+ '''
+ pass
+
+def p_decl_specifier_suffix(p):
+ '''decl_specifier_suffix : decl_specifier_affix
+ '''
+ pass
+
+def p_decl_specifier_prefix(p):
+ '''decl_specifier_prefix : decl_specifier_affix
+ | TEMPLATE decl_specifier_prefix
+ '''
+ pass
+
+def p_storage_class_specifier(p):
+ '''storage_class_specifier : REGISTER
+ | STATIC
+ | MUTABLE
+ | EXTERN %prec SHIFT_THERE
+ | EXTENSION
+ | AUTO
+ '''
+ pass
+
+def p_function_specifier(p):
+ '''function_specifier : EXPLICIT
+ | INLINE
+ | VIRTUAL
+ '''
+ pass
+
+def p_type_specifier(p):
+ '''type_specifier : simple_type_specifier
+ | elaborate_type_specifier
+ | cv_qualifier
+ '''
+ pass
+
+def p_elaborate_type_specifier(p):
+ '''elaborate_type_specifier : class_specifier
+ | enum_specifier
+ | elaborated_type_specifier
+ | TEMPLATE elaborate_type_specifier
+ '''
+ pass
+
+def p_simple_type_specifier(p):
+ '''simple_type_specifier : scoped_id
+ | scoped_id attributes
+ | built_in_type_specifier
+ '''
+ p[0] = p[1]
+
+def p_built_in_type_specifier(p):
+ '''built_in_type_specifier : Xbuilt_in_type_specifier
+ | Xbuilt_in_type_specifier attributes
+ '''
+ pass
+
+def p_attributes(p):
+ '''attributes : attribute
+ | attributes attribute
+ '''
+ pass
+
+def p_attribute(p):
+ '''attribute : ATTRIBUTE '(' parameters_clause ')'
+ '''
+
+def p_Xbuilt_in_type_specifier(p):
+ '''Xbuilt_in_type_specifier : CHAR
+ | WCHAR_T
+ | BOOL
+ | SHORT
+ | INT
+ | LONG
+ | SIGNED
+ | UNSIGNED
+ | FLOAT
+ | DOUBLE
+ | VOID
+ | uTYPEOF parameters_clause
+ | TYPEOF parameters_clause
+ '''
+ pass
+
+#
+# The over-general use of declaration_expression to cover decl-specifier-seq_opt declarator in a function-definition means that
+# class X { };
+# could be a function-definition or a class-specifier.
+# enum X { };
+# could be a function-definition or an enum-specifier.
+# The function-definition is not syntactically valid so resolving the false conflict in favour of the
+# elaborated_type_specifier is correct.
+#
+def p_elaborated_type_specifier(p):
+ '''elaborated_type_specifier : class_key scoped_id %prec SHIFT_THERE
+ | elaborated_enum_specifier
+ | TYPENAME scoped_id
+ '''
+ pass
+
+def p_elaborated_enum_specifier(p):
+ '''elaborated_enum_specifier : ENUM scoped_id %prec SHIFT_THERE
+ '''
+ pass
+
+def p_enum_specifier(p):
+ '''enum_specifier : ENUM scoped_id enumerator_clause
+ | ENUM enumerator_clause
+ '''
+ pass
+
+def p_enumerator_clause(p):
+ '''enumerator_clause : LBRACE enumerator_list_ecarb
+ | LBRACE enumerator_list enumerator_list_ecarb
+ | LBRACE enumerator_list ',' enumerator_definition_ecarb
+ '''
+ pass
+
+def p_enumerator_list_ecarb(p):
+ '''enumerator_list_ecarb : RBRACE
+ '''
+ pass
+
+def p_enumerator_definition_ecarb(p):
+ '''enumerator_definition_ecarb : RBRACE
+ '''
+ pass
+
+def p_enumerator_definition_filler(p):
+ '''enumerator_definition_filler : empty
+ '''
+ pass
+
+def p_enumerator_list_head(p):
+ '''enumerator_list_head : enumerator_definition_filler
+ | enumerator_list ',' enumerator_definition_filler
+ '''
+ pass
+
+def p_enumerator_list(p):
+ '''enumerator_list : enumerator_list_head enumerator_definition
+ '''
+ pass
+
+def p_enumerator_definition(p):
+ '''enumerator_definition : enumerator
+ | enumerator '=' constant_expression
+ '''
+ pass
+
+def p_enumerator(p):
+ '''enumerator : identifier
+ '''
+ pass
+
+def p_namespace_definition(p):
+ '''namespace_definition : NAMESPACE scoped_id push_scope compound_declaration
+ | NAMESPACE push_scope compound_declaration
+ '''
+ global _parse_info
+ scope = _parse_info.pop_scope()
+
+def p_namespace_alias_definition(p):
+ '''namespace_alias_definition : NAMESPACE scoped_id '=' scoped_id ';'
+ '''
+ pass
+
+def p_push_scope(p):
+ '''push_scope : empty'''
+ global _parse_info
+ if p[-2] == "namespace":
+ scope=p[-1]
+ else:
+ scope=""
+ _parse_info.push_scope(scope,"namespace")
+
+def p_using_declaration(p):
+ '''using_declaration : USING declarator_id ';'
+ | USING TYPENAME declarator_id ';'
+ '''
+ pass
+
+def p_using_directive(p):
+ '''using_directive : USING NAMESPACE scoped_id ';'
+ '''
+ pass
+
+# '''asm_definition : ASM '(' StringLiteral ')' ';'
+def p_asm_definition(p):
+ '''asm_definition : ASM '(' nonparen_seq_opt ')' ';'
+ '''
+ pass
+
+def p_linkage_specification(p):
+ '''linkage_specification : EXTERN CLiteral declaration
+ | EXTERN CLiteral compound_declaration
+ | EXTERN CppLiteral declaration
+ | EXTERN CppLiteral compound_declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.7 Declarators
+#---------------------------------------------------------------------------------------------------
+#
+# init-declarator is named init_declaration to reflect the embedded decl-specifier-seq_opt
+#
+
+def p_init_declarations(p):
+ '''init_declarations : assignment_expression ',' init_declaration
+ | init_declarations ',' init_declaration
+ '''
+ p[0]=get_rest(p)
+
+def p_init_declaration(p):
+ '''init_declaration : assignment_expression
+ '''
+ p[0]=get_rest(p)
+
+def p_star_ptr_operator(p):
+ '''star_ptr_operator : '*'
+ | star_ptr_operator cv_qualifier
+ '''
+ pass
+
+def p_nested_ptr_operator(p):
+ '''nested_ptr_operator : star_ptr_operator
+ | id_scope nested_ptr_operator
+ '''
+ pass
+
+def p_ptr_operator(p):
+ '''ptr_operator : '&'
+ | nested_ptr_operator
+ | global_scope nested_ptr_operator
+ '''
+ pass
+
+def p_ptr_operator_seq(p):
+ '''ptr_operator_seq : ptr_operator
+ | ptr_operator ptr_operator_seq
+ '''
+ pass
+
+#
+# Independently coded to localise the shift-reduce conflict: sharing just needs another %prec
+#
+def p_ptr_operator_seq_opt(p):
+ '''ptr_operator_seq_opt : empty %prec SHIFT_THERE
+ | ptr_operator ptr_operator_seq_opt
+ '''
+ pass
+
+def p_cv_qualifier_seq_opt(p):
+ '''cv_qualifier_seq_opt : empty
+ | cv_qualifier_seq_opt cv_qualifier
+ '''
+ pass
+
+# TODO: verify that we should include attributes here
+def p_cv_qualifier(p):
+ '''cv_qualifier : CONST
+ | VOLATILE
+ | attributes
+ '''
+ pass
+
+def p_type_id(p):
+ '''type_id : type_specifier abstract_declarator_opt
+ | type_specifier type_id
+ '''
+ pass
+
+def p_abstract_declarator_opt(p):
+ '''abstract_declarator_opt : empty
+ | ptr_operator abstract_declarator_opt
+ | direct_abstract_declarator
+ '''
+ pass
+
+def p_direct_abstract_declarator_opt(p):
+ '''direct_abstract_declarator_opt : empty
+ | direct_abstract_declarator
+ '''
+ pass
+
+def p_direct_abstract_declarator(p):
+ '''direct_abstract_declarator : direct_abstract_declarator_opt parenthesis_clause
+ | direct_abstract_declarator_opt LBRACKET RBRACKET
+ | direct_abstract_declarator_opt LBRACKET bexpression RBRACKET
+ '''
+ pass
+
+def p_parenthesis_clause(p):
+ '''parenthesis_clause : parameters_clause cv_qualifier_seq_opt
+ | parameters_clause cv_qualifier_seq_opt exception_specification
+ '''
+ p[0] = ['(',')']
+
+def p_parameters_clause(p):
+ '''parameters_clause : '(' condition_opt ')'
+ '''
+ p[0] = ['(',')']
+
+#
+# A typed abstract qualifier such as
+# Class * ...
+# looks like a multiply, so pointers are parsed as their binary operation equivalents that
+# ultimately terminate with a degenerate right hand term.
+#
+def p_abstract_pointer_declaration(p):
+ '''abstract_pointer_declaration : ptr_operator_seq
+ | multiplicative_expression star_ptr_operator ptr_operator_seq_opt
+ '''
+ pass
+
+def p_abstract_parameter_declaration(p):
+ '''abstract_parameter_declaration : abstract_pointer_declaration
+ | and_expression '&'
+ | and_expression '&' abstract_pointer_declaration
+ '''
+ pass
+
+def p_special_parameter_declaration(p):
+ '''special_parameter_declaration : abstract_parameter_declaration
+ | abstract_parameter_declaration '=' assignment_expression
+ | ELLIPSIS
+ '''
+ pass
+
+def p_parameter_declaration(p):
+ '''parameter_declaration : assignment_expression
+ | special_parameter_declaration
+ | decl_specifier_prefix parameter_declaration
+ '''
+ pass
+
+#
+# function_definition includes constructor, destructor, implicit int definitions too. A local destructor is successfully parsed as a function-declaration but the ~ was treated as a unary operator. constructor_head is the prefix ambiguity between a constructor and a member-init-list starting with a bit-field.
+#
+def p_function_definition(p):
+ '''function_definition : ctor_definition
+ | func_definition
+ '''
+ pass
+
+def p_func_definition(p):
+ '''func_definition : assignment_expression function_try_block
+ | assignment_expression function_body
+ | decl_specifier_prefix func_definition
+ '''
+ global _parse_info
+ if p[2] is not None and p[2][0] == '{':
+ decl = flatten(p[1])
+ #print "HERE",decl
+ if decl[-1] == ')':
+ decl=decl[-3]
+ else:
+ decl=decl[-1]
+ p[0] = decl
+ if decl != "operator":
+ _parse_info.add_function(decl)
+ else:
+ p[0] = p[2]
+
+def p_ctor_definition(p):
+ '''ctor_definition : constructor_head function_try_block
+ | constructor_head function_body
+ | decl_specifier_prefix ctor_definition
+ '''
+ if p[2] is None or p[2][0] == "try" or p[2][0] == '{':
+ p[0]=p[1]
+ else:
+ p[0]=p[1]
+
+def p_constructor_head(p):
+ '''constructor_head : bit_field_init_declaration
+ | constructor_head ',' assignment_expression
+ '''
+ p[0]=p[1]
+
+def p_function_try_block(p):
+ '''function_try_block : TRY function_block handler_seq
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+ p[0] = ['try']
+
+def p_function_block(p):
+ '''function_block : ctor_initializer_opt function_body
+ '''
+ pass
+
+def p_function_body(p):
+ '''function_body : LBRACE nonbrace_seq_opt RBRACE
+ '''
+ p[0] = ['{','}']
+
+def p_initializer_clause(p):
+ '''initializer_clause : assignment_expression
+ | braced_initializer
+ '''
+ pass
+
+def p_braced_initializer(p):
+ '''braced_initializer : LBRACE initializer_list RBRACE
+ | LBRACE initializer_list ',' RBRACE
+ | LBRACE RBRACE
+ '''
+ pass
+
+def p_initializer_list(p):
+ '''initializer_list : initializer_clause
+ | initializer_list ',' initializer_clause
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.8 Classes
+#---------------------------------------------------------------------------------------------------
+#
+# An anonymous bit-field declaration may look very like inheritance:
+# const int B = 3;
+# class A : B ;
+# The two usages are too distant to try to create and enforce a common prefix so we have to resort to
+# a parser hack by backtracking. Inheritance is much the most likely so we mark the input stream context
+# and try to parse a base-clause. If we successfully reach a { the base-clause is ok and inheritance was
+# the correct choice so we unmark and continue. If we fail to find the { an error token causes
+# back-tracking to the alternative parse in elaborated_type_specifier which regenerates the : and
+# declares unconditional success.
+#
+
+def p_class_specifier_head(p):
+ '''class_specifier_head : class_key scoped_id ':' base_specifier_list LBRACE
+ | class_key ':' base_specifier_list LBRACE
+ | class_key scoped_id LBRACE
+ | class_key LBRACE
+ '''
+ global _parse_info
+ base_classes=[]
+ if len(p) == 6:
+ scope = p[2]
+ base_classes = p[4]
+ elif len(p) == 4:
+ scope = p[2]
+ elif len(p) == 5:
+ base_classes = p[3]
+ else:
+ scope = ""
+ _parse_info.push_scope(scope,p[1],base_classes)
+
+
+def p_class_key(p):
+ '''class_key : CLASS
+ | STRUCT
+ | UNION
+ '''
+ p[0] = p[1]
+
+def p_class_specifier(p):
+ '''class_specifier : class_specifier_head member_specification_opt RBRACE
+ '''
+ scope = _parse_info.pop_scope()
+
+def p_member_specification_opt(p):
+ '''member_specification_opt : empty
+ | member_specification_opt member_declaration
+ '''
+ pass
+
+def p_member_declaration(p):
+ '''member_declaration : accessibility_specifier
+ | simple_member_declaration
+ | function_definition
+ | using_declaration
+ | template_declaration
+ '''
+ p[0] = get_rest(p)
+ #print "Decl",get_rest(p)
+
+#
+# The generality of constructor names (there need be no parenthesised argument list) means that that
+# name : f(g), h(i)
+# could be the start of a constructor or the start of an anonymous bit-field. An ambiguity is avoided by
+# parsing the ctor-initializer of a function_definition as a bit-field.
+#
+def p_simple_member_declaration(p):
+ '''simple_member_declaration : ';'
+ | assignment_expression ';'
+ | constructor_head ';'
+ | member_init_declarations ';'
+ | decl_specifier_prefix simple_member_declaration
+ '''
+ global _parse_info
+ decl = flatten(get_rest(p))
+ if len(decl) >= 4 and decl[-3] == "(":
+ _parse_info.add_function(decl[-4])
+
+def p_member_init_declarations(p):
+ '''member_init_declarations : assignment_expression ',' member_init_declaration
+ | constructor_head ',' bit_field_init_declaration
+ | member_init_declarations ',' member_init_declaration
+ '''
+ pass
+
+def p_member_init_declaration(p):
+ '''member_init_declaration : assignment_expression
+ | bit_field_init_declaration
+ '''
+ pass
+
+def p_accessibility_specifier(p):
+ '''accessibility_specifier : access_specifier ':'
+ '''
+ pass
+
+def p_bit_field_declaration(p):
+ '''bit_field_declaration : assignment_expression ':' bit_field_width
+ | ':' bit_field_width
+ '''
+ if len(p) == 4:
+ p[0]=p[1]
+
+def p_bit_field_width(p):
+ '''bit_field_width : logical_or_expression
+ | logical_or_expression '?' bit_field_width ':' bit_field_width
+ '''
+ pass
+
+def p_bit_field_init_declaration(p):
+ '''bit_field_init_declaration : bit_field_declaration
+ | bit_field_declaration '=' initializer_clause
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.9 Derived classes
+#---------------------------------------------------------------------------------------------------
+def p_base_specifier_list(p):
+ '''base_specifier_list : base_specifier
+ | base_specifier_list ',' base_specifier
+ '''
+ if len(p) == 2:
+ p[0] = [p[1]]
+ else:
+ p[0] = p[1]+[p[3]]
+
+def p_base_specifier(p):
+ '''base_specifier : scoped_id
+ | access_specifier base_specifier
+ | VIRTUAL base_specifier
+ '''
+ if len(p) == 2:
+ p[0] = p[1]
+ else:
+ p[0] = p[2]
+
+def p_access_specifier(p):
+ '''access_specifier : PRIVATE
+ | PROTECTED
+ | PUBLIC
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.10 Special member functions
+#---------------------------------------------------------------------------------------------------
+def p_conversion_function_id(p):
+ '''conversion_function_id : OPERATOR conversion_type_id
+ '''
+ p[0] = ['operator']
+
+def p_conversion_type_id(p):
+ '''conversion_type_id : type_specifier ptr_operator_seq_opt
+ | type_specifier conversion_type_id
+ '''
+ pass
+
+#
+# Ctor-initialisers can look like a bit field declaration, given the generalisation of names:
+# Class(Type) : m1(1), m2(2) { }
+# NonClass(bit_field) : int(2), second_variable, ...
+# The grammar below is used within a function_try_block or function_definition.
+# See simple_member_declaration for use in normal member function_definition.
+#
+def p_ctor_initializer_opt(p):
+ '''ctor_initializer_opt : empty
+ | ctor_initializer
+ '''
+ pass
+
+def p_ctor_initializer(p):
+ '''ctor_initializer : ':' mem_initializer_list
+ '''
+ pass
+
+def p_mem_initializer_list(p):
+ '''mem_initializer_list : mem_initializer
+ | mem_initializer_list_head mem_initializer
+ '''
+ pass
+
+def p_mem_initializer_list_head(p):
+ '''mem_initializer_list_head : mem_initializer_list ','
+ '''
+ pass
+
+def p_mem_initializer(p):
+ '''mem_initializer : mem_initializer_id '(' expression_list_opt ')'
+ '''
+ pass
+
+def p_mem_initializer_id(p):
+ '''mem_initializer_id : scoped_id
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.11 Overloading
+#---------------------------------------------------------------------------------------------------
+
+def p_operator_function_id(p):
+ '''operator_function_id : OPERATOR operator
+ | OPERATOR '(' ')'
+ | OPERATOR LBRACKET RBRACKET
+ | OPERATOR '<'
+ | OPERATOR '>'
+ | OPERATOR operator '<' nonlgt_seq_opt '>'
+ '''
+ p[0] = ["operator"]
+
+#
+# It is not clear from the ANSI standard whether spaces are permitted in delete[]. If not then it can
+# be recognised and returned as DELETE_ARRAY by the lexer. Assuming spaces are permitted there is an
+# ambiguity created by the over generalised nature of expressions. operator new is a valid delarator-id
+# which we may have an undimensioned array of. Semantic rubbish, but syntactically valid. Since the
+# array form is covered by the declarator consideration we can exclude the operator here. The need
+# for a semantic rescue can be eliminated at the expense of a couple of shift-reduce conflicts by
+# removing the comments on the next four lines.
+#
+def p_operator(p):
+ '''operator : NEW
+ | DELETE
+ | '+'
+ | '-'
+ | '*'
+ | '/'
+ | '%'
+ | '^'
+ | '&'
+ | '|'
+ | '~'
+ | '!'
+ | '='
+ | ASS_ADD
+ | ASS_SUB
+ | ASS_MUL
+ | ASS_DIV
+ | ASS_MOD
+ | ASS_XOR
+ | ASS_AND
+ | ASS_OR
+ | SHL
+ | SHR
+ | ASS_SHR
+ | ASS_SHL
+ | EQ
+ | NE
+ | LE
+ | GE
+ | LOG_AND
+ | LOG_OR
+ | INC
+ | DEC
+ | ','
+ | ARROW_STAR
+ | ARROW
+ '''
+ p[0]=p[1]
+
+# | IF
+# | SWITCH
+# | WHILE
+# | FOR
+# | DO
+def p_reserved(p):
+ '''reserved : PRIVATE
+ | CLiteral
+ | CppLiteral
+ | IF
+ | SWITCH
+ | WHILE
+ | FOR
+ | DO
+ | PROTECTED
+ | PUBLIC
+ | BOOL
+ | CHAR
+ | DOUBLE
+ | FLOAT
+ | INT
+ | LONG
+ | SHORT
+ | SIGNED
+ | UNSIGNED
+ | VOID
+ | WCHAR_T
+ | CLASS
+ | ENUM
+ | NAMESPACE
+ | STRUCT
+ | TYPENAME
+ | UNION
+ | CONST
+ | VOLATILE
+ | AUTO
+ | EXPLICIT
+ | EXPORT
+ | EXTERN
+ | FRIEND
+ | INLINE
+ | MUTABLE
+ | REGISTER
+ | STATIC
+ | TEMPLATE
+ | TYPEDEF
+ | USING
+ | VIRTUAL
+ | ASM
+ | BREAK
+ | CASE
+ | CATCH
+ | CONST_CAST
+ | CONTINUE
+ | DEFAULT
+ | DYNAMIC_CAST
+ | ELSE
+ | FALSE
+ | GOTO
+ | OPERATOR
+ | REINTERPRET_CAST
+ | RETURN
+ | SIZEOF
+ | STATIC_CAST
+ | THIS
+ | THROW
+ | TRUE
+ | TRY
+ | TYPEID
+ | ATTRIBUTE
+ | CDECL
+ | TYPEOF
+ | uTYPEOF
+ '''
+ if p[1] in ('try', 'catch', 'throw'):
+ global noExceptionLogic
+ noExceptionLogic=False
+
+#---------------------------------------------------------------------------------------------------
+# A.12 Templates
+#---------------------------------------------------------------------------------------------------
+def p_template_declaration(p):
+ '''template_declaration : template_parameter_clause declaration
+ | EXPORT template_declaration
+ '''
+ pass
+
+def p_template_parameter_clause(p):
+ '''template_parameter_clause : TEMPLATE '<' nonlgt_seq_opt '>'
+ '''
+ pass
+
+#
+# Generalised naming makes identifier a valid declaration, so TEMPLATE identifier is too.
+# The TEMPLATE prefix is therefore folded into all names, parenthesis_clause and decl_specifier_prefix.
+#
+# explicit_instantiation: TEMPLATE declaration
+#
+def p_explicit_specialization(p):
+ '''explicit_specialization : TEMPLATE '<' '>' declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.13 Exception Handling
+#---------------------------------------------------------------------------------------------------
+def p_handler_seq(p):
+ '''handler_seq : handler
+ | handler handler_seq
+ '''
+ pass
+
+def p_handler(p):
+ '''handler : CATCH '(' exception_declaration ')' compound_statement
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_exception_declaration(p):
+ '''exception_declaration : parameter_declaration
+ '''
+ pass
+
+def p_throw_expression(p):
+ '''throw_expression : THROW
+ | THROW assignment_expression
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_exception_specification(p):
+ '''exception_specification : THROW '(' ')'
+ | THROW '(' type_id_list ')'
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_type_id_list(p):
+ '''type_id_list : type_id
+ | type_id_list ',' type_id
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# Misc productions
+#---------------------------------------------------------------------------------------------------
+def p_nonsemicolon_seq(p):
+ '''nonsemicolon_seq : empty
+ | nonsemicolon_seq nonsemicolon
+ '''
+ pass
+
+def p_nonsemicolon(p):
+ '''nonsemicolon : misc
+ | '('
+ | ')'
+ | '<'
+ | '>'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonparen_seq_opt(p):
+ '''nonparen_seq_opt : empty
+ | nonparen_seq_opt nonparen
+ '''
+ pass
+
+def p_nonparen_seq(p):
+ '''nonparen_seq : nonparen
+ | nonparen_seq nonparen
+ '''
+ pass
+
+def p_nonparen(p):
+ '''nonparen : misc
+ | '<'
+ | '>'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonbracket_seq_opt(p):
+ '''nonbracket_seq_opt : empty
+ | nonbracket_seq_opt nonbracket
+ '''
+ pass
+
+def p_nonbracket_seq(p):
+ '''nonbracket_seq : nonbracket
+ | nonbracket_seq nonbracket
+ '''
+ pass
+
+def p_nonbracket(p):
+ '''nonbracket : misc
+ | '<'
+ | '>'
+ | '('
+ | ')'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonbrace_seq_opt(p):
+ '''nonbrace_seq_opt : empty
+ | nonbrace_seq_opt nonbrace
+ '''
+ pass
+
+def p_nonbrace(p):
+ '''nonbrace : misc
+ | '<'
+ | '>'
+ | '('
+ | ')'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonlgt_seq_opt(p):
+ '''nonlgt_seq_opt : empty
+ | nonlgt_seq_opt nonlgt
+ '''
+ pass
+
+def p_nonlgt(p):
+ '''nonlgt : misc
+ | '('
+ | ')'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | '<' nonlgt_seq_opt '>'
+ | ';'
+ '''
+ pass
+
+def p_misc(p):
+ '''misc : operator
+ | identifier
+ | IntegerLiteral
+ | CharacterLiteral
+ | FloatingLiteral
+ | StringLiteral
+ | reserved
+ | '?'
+ | ':'
+ | '.'
+ | SCOPE
+ | ELLIPSIS
+ | EXTENSION
+ '''
+ pass
+
+def p_empty(p):
+ '''empty : '''
+ pass
+
+
+
+#
+# Compute column.
+# input is the input text string
+# token is a token instance
+#
+def _find_column(input,token):
+ ''' TODO '''
+ i = token.lexpos
+ while i > 0:
+ if input[i] == '\n': break
+ i -= 1
+ column = (token.lexpos - i)+1
+ return column
+
+def p_error(p):
+ if p is None:
+ tmp = "Syntax error at end of file."
+ else:
+ tmp = "Syntax error at token "
+ if p.type is "":
+ tmp = tmp + "''"
+ else:
+ tmp = tmp + str(p.type)
+ tmp = tmp + " with value '"+str(p.value)+"'"
+ tmp = tmp + " in line " + str(lexer.lineno-1)
+ tmp = tmp + " at column "+str(_find_column(_parsedata,p))
+ raise IOError( tmp )
+
+
+
+#
+# The function that performs the parsing
+#
+def parse_cpp(data=None, filename=None, debug=0, optimize=0, verbose=False, func_filter=None):
+ if debug > 0:
+ print "Debugging parse_cpp!"
+ #
+ # Always remove the parser.out file, which is generated to create debugging
+ #
+ if os.path.exists("parser.out"):
+ os.remove("parser.out")
+ #
+ # Remove the parsetab.py* files. These apparently need to be removed
+ # to ensure the creation of a parser.out file.
+ #
+ if os.path.exists("parsetab.py"):
+ os.remove("parsetab.py")
+ if os.path.exists("parsetab.pyc"):
+ os.remove("parsetab.pyc")
+ global debugging
+ debugging=True
+ #
+ # Build lexer
+ #
+ global lexer
+ lexer = lex.lex()
+ #
+ # Initialize parse object
+ #
+ global _parse_info
+ _parse_info = CppInfo(filter=func_filter)
+ _parse_info.verbose=verbose
+ #
+ # Build yaccer
+ #
+ write_table = not os.path.exists("parsetab.py")
+ yacc.yacc(debug=debug, optimize=optimize, write_tables=write_table)
+ #
+ # Parse the file
+ #
+ global _parsedata
+ if not data is None:
+ _parsedata=data
+ ply_init(_parsedata)
+ yacc.parse(data,debug=debug)
+ elif not filename is None:
+ f = open(filename)
+ data = f.read()
+ f.close()
+ _parsedata=data
+ ply_init(_parsedata)
+ yacc.parse(data, debug=debug)
+ else:
+ return None
+ #
+ if not noExceptionLogic:
+ _parse_info.noExceptionLogic = False
+ else:
+ for key in identifier_lineno:
+ if 'ASSERT_THROWS' in key:
+ _parse_info.noExceptionLogic = False
+ break
+ _parse_info.noExceptionLogic = True
+ #
+ return _parse_info
+
+
+
+import sys
+
+if __name__ == '__main__':
+ #
+ # This MAIN routine parses a sequence of files provided at the command
+ # line. If '-v' is included, then a verbose parsing output is
+ # generated.
+ #
+ for arg in sys.argv[1:]:
+ if arg == "-v":
+ continue
+ print "Parsing file '"+arg+"'"
+ if '-v' in sys.argv:
+ parse_cpp(filename=arg,debug=2,verbose=2)
+ else:
+ parse_cpp(filename=arg,verbose=2)
+ #
+ # Print the _parse_info object summary for this file.
+ # This illustrates how class inheritance can be used to
+ # deduce class members.
+ #
+ print str(_parse_info)
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+#
+# TODO: add line number info
+# TODO: add test function names
+#
+
+from __future__ import division
+
+import sys
+import re
+#from os.path import abspath, dirname
+#sys.path.insert(0, dirname(dirname(abspath(__file__))))
+#sys.path.insert(0, dirname(dirname(abspath(__file__)))+"/cxx_parse")
+from cxxtest_misc import abort
+import cxx_parser
+import re
+
+def cstr( str ):
+ '''Convert a string to its C representation'''
+ return '"' + re.sub('\\\\', '\\\\\\\\', str ) + '"'
+
+def scanInputFiles(files, _options):
+ '''Scan all input files for test suites'''
+ suites=[]
+ for file in files:
+ try:
+ print "Parsing file "+file,
+ sys.stdout.flush()
+ parse_info = cxx_parser.parse_cpp(filename=file,optimize=1)
+ except IOError, err:
+ print " error."
+ print str(err)
+ continue
+ print "done."
+ sys.stdout.flush()
+ #
+ # WEH: see if it really makes sense to use parse information to
+ # initialize this data. I don't think so...
+ #
+ _options.haveStandardLibrary=1
+ if not parse_info.noExceptionLogic:
+ _options.haveExceptionHandling=1
+ #
+ keys = list(parse_info.index.keys())
+ tpat = re.compile("[Tt][Ee][Ss][Tt]")
+ for key in keys:
+ if parse_info.index[key].scope_t == "class" and parse_info.is_baseclass(key,"CxxTest::TestSuite"):
+ name=parse_info.index[key].name
+ suite = { 'name' : name,
+ 'file' : file,
+ 'cfile' : cstr(file),
+ 'line' : str(parse_info.index[key].lineno),
+ 'generated' : 0,
+ 'object' : 'suite_%s' % name,
+ 'dobject' : 'suiteDescription_%s' % name,
+ 'tlist' : 'Tests_%s' % name,
+ 'tests' : [],
+ 'lines' : [] }
+ for fn in parse_info.get_functions(key,quiet=True):
+ tname = fn[0]
+ lineno = str(fn[1])
+ if tname.startswith('createSuite'):
+ # Indicate that we're using a dynamically generated test suite
+ suite['create'] = str(lineno) # (unknown line)
+ if tname.startswith('destroySuite'):
+ # Indicate that we're using a dynamically generated test suite
+ suite['destroy'] = str(lineno) # (unknown line)
+ if not tpat.match(tname):
+ # Skip non-test methods
+ continue
+ test = { 'name' : tname,
+ 'suite' : suite,
+ 'class' : 'TestDescription_suite_%s_%s' % (suite['name'], tname),
+ 'object' : 'testDescription_suite_%s_%s' % (suite['name'], tname),
+ 'line' : lineno,
+ }
+ suite['tests'].append(test)
+ suites.append(suite)
+
+ if not _options.root:
+ ntests = 0
+ for suite in suites:
+ ntests += len(suite['tests'])
+ if ntests == 0:
+ abort( 'No tests defined' )
+ #
+ return [_options, suites]
+
--- /dev/null
+#!/usr/bin/python
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+import sys
+
+def abort( problem ):
+ '''Print error message and exit'''
+ sys.stderr.write( '\n' )
+ sys.stderr.write( problem )
+ sys.stderr.write( '\n\n' )
+ sys.exit(2)
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+from __future__ import division
+
+import codecs
+import re
+#import sys
+#import getopt
+#import glob
+from cxxtest.cxxtest_misc import abort
+
+# Global variables
+suites = []
+suite = None
+inBlock = 0
+options=None
+
+def scanInputFiles(files, _options):
+ '''Scan all input files for test suites'''
+ global options
+ options=_options
+ for file in files:
+ scanInputFile(file)
+ global suites
+ if len(suites) is 0 and not options.root:
+ abort( 'No tests defined' )
+ return [options,suites]
+
+lineCont_re = re.compile('(.*)\\\s*$')
+def scanInputFile(fileName):
+ '''Scan single input file for test suites'''
+ # mode 'rb' is problematic in python3 - byte arrays don't behave the same as
+ # strings.
+ # As far as the choice of the default encoding: utf-8 chews through
+ # everything that the previous ascii codec could, plus most of new code.
+ # TODO: figure out how to do this properly - like autodetect encoding from
+ # file header.
+ file = codecs.open(fileName, mode='r', encoding='utf-8')
+ prev = ""
+ lineNo = 0
+ contNo = 0
+ while 1:
+ line = file.readline()
+ if not line:
+ break
+ lineNo += 1
+
+ m = lineCont_re.match(line)
+ if m:
+ prev += m.group(1) + " "
+ contNo += 1
+ else:
+ scanInputLine( fileName, lineNo - contNo, prev + line )
+ contNo = 0
+ prev = ""
+ if contNo:
+ scanInputLine( fileName, lineNo - contNo, prev + 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 options
+ if not options.haveStandardLibrary and std_re.search(line):
+ if not options.noStandardLibrary:
+ options.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 options
+ if not options.haveExceptionHandling and exception_re.search(line):
+ if not options.noExceptionHandling:
+ options.haveExceptionHandling = 1
+
+classdef = '(?:::\s*)?(?:\w+\s*::\s*)*\w+'
+baseclassdef = '(?:public|private|protected)\s+%s' % (classdef,)
+general_suite = r"\bclass\s+(%s)\s*:(?:\s*%s\s*,)*\s*public\s+" \
+ % (classdef, baseclassdef,)
+testsuite = '(?:(?:::)?\s*CxxTest\s*::\s*)?TestSuite'
+suites_re = { re.compile( general_suite + testsuite ) : None }
+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'''
+ for i in list(suites_re.items()):
+ m = i[0].search( line )
+ if m:
+ suite = startSuite( m.group(1), fileName, lineNo, 0 )
+ if i[1] is not None:
+ for test in i[1]['tests']:
+ addTest(suite, test['name'], test['line'])
+ break
+ 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()
+ object_name = name.replace(':',"_")
+ suite = { 'name' : name,
+ 'file' : file,
+ 'cfile' : cstr(file),
+ 'line' : line,
+ 'generated' : generated,
+ 'object' : 'suite_%s' % object_name,
+ 'dobject' : 'suiteDescription_%s' % object_name,
+ 'tlist' : 'Tests_%s' % object_name,
+ 'tests' : [],
+ 'lines' : [] }
+ suites_re[re.compile( general_suite + name )] = suite
+ return suite
+
+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['object'], name),
+ 'object' : 'testDescription_%s_%s' % (suite['object'], 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( s ):
+ '''Convert a string to its C representation'''
+ return '"' + s.replace( '\\', '\\\\' ) + '"'
+
+
+def addSuiteCreateDestroy( suite, which, line ):
+ '''Add createSuite()/destroySuite() to current suite'''
+ if which in suite:
+ 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 'create' in suite and 'destroy' not in suite:
+ abort( '%s:%s: Suite %s has createSuite() but no destroySuite()' %
+ (suite['file'], suite['create'], suite['name']) )
+ elif 'destroy' in suite and 'create' not in suite:
+ 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 )
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+# vim: fileencoding=utf-8
+
+from __future__ import division
+# the above import important for forward-compatibility with python3,
+# which is already the default in archlinux!
+
+__all__ = ['main']
+
+import __release__
+import os
+import sys
+import re
+import glob
+from optparse import OptionParser
+import cxxtest_parser
+
+try:
+ import cxxtest_fog
+ imported_fog=True
+except ImportError:
+ imported_fog=False
+
+from cxxtest_misc import abort
+
+options = []
+suites = []
+
+wrotePreamble = 0
+wroteWorld = 0
+lastIncluded = ''
+
+def main(args=sys.argv):
+ '''The main program'''
+ #
+ # Reset global state
+ #
+ global wrotePreamble
+ wrotePreamble=0
+ global wroteWorld
+ wroteWorld=0
+ global lastIncluded
+ lastIncluded = ''
+
+ global suites
+ global options
+ files = parseCommandline(args)
+ if imported_fog and options.fog:
+ [options,suites] = cxxtest_fog.scanInputFiles( files, options )
+ else:
+ [options,suites] = cxxtest_parser.scanInputFiles( files, options )
+ writeOutput()
+
+def parseCommandline(args):
+ '''Analyze command line arguments'''
+ global imported_fog
+ global options
+ parser = OptionParser("%prog [options] [<filename> ...]")
+ parser.add_option("--version",
+ action="store_true", dest="version", default=False,
+ help="Write the CxxTest version.")
+ parser.add_option("-o", "--output",
+ dest="outputFileName", default=None, metavar="NAME",
+ help="Write output to file NAME.")
+ parser.add_option("-w","--world", dest="world", default="cxxtest",
+ help="The label of the tests, used to name the XML results.")
+ parser.add_option("", "--include", action="append",
+ dest="headers", default=[], metavar="HEADER",
+ help="Include file HEADER in the test runner before other headers.")
+ parser.add_option("", "--abort-on-fail",
+ action="store_true", dest="abortOnFail", default=False,
+ help="Abort tests on failed asserts (like xUnit).")
+ parser.add_option("", "--main",
+ action="store", dest="main", default="main",
+ help="Specify an alternative name for the main() function.")
+ parser.add_option("", "--headers",
+ action="store", dest="header_filename", default=None,
+ help="Specify a filename that contains a list of header files that are processed to generate a test runner.")
+ parser.add_option("", "--runner",
+ dest="runner", default="", metavar="CLASS",
+ help="Create a test runner that processes test events using the class CxxTest::CLASS.")
+ parser.add_option("", "--gui",
+ dest="gui", metavar="CLASS",
+ help="Create a GUI test runner that processes test events using the class CxxTest::CLASS. (deprecated)")
+ parser.add_option("", "--error-printer",
+ action="store_true", dest="error_printer", default=False,
+ help="Create a test runner using the ErrorPrinter class, and allow the use of the standard library.")
+ parser.add_option("", "--xunit-printer",
+ action="store_true", dest="xunit_printer", default=False,
+ help="Create a test runner using the XUnitPrinter class.")
+ parser.add_option("", "--xunit-file", dest="xunit_file", default="",
+ help="The file to which the XML summary is written for test runners using the XUnitPrinter class. The default XML filename is TEST-<world>.xml, where <world> is the value of the --world option. (default: cxxtest)")
+ parser.add_option("", "--have-std",
+ action="store_true", dest="haveStandardLibrary", default=False,
+ help="Use the standard library (even if not found in tests).")
+ parser.add_option("", "--no-std",
+ action="store_true", dest="noStandardLibrary", default=False,
+ help="Do not use standard library (even if found in tests).")
+ parser.add_option("", "--have-eh",
+ action="store_true", dest="haveExceptionHandling", default=False,
+ help="Use exception handling (even if not found in tests).")
+ parser.add_option("", "--no-eh",
+ action="store_true", dest="noExceptionHandling", default=False,
+ help="Do not use exception handling (even if found in tests).")
+ parser.add_option("", "--longlong",
+ dest="longlong", default=None, metavar="TYPE",
+ help="Use TYPE as for long long integers. (default: not supported)")
+ parser.add_option("", "--no-static-init",
+ action="store_true", dest="noStaticInit", default=False,
+ help="Do not rely on static initialization in the test runner.")
+ parser.add_option("", "--template",
+ dest="templateFileName", default=None, metavar="TEMPLATE",
+ help="Generate the test runner using file TEMPLATE to define a template.")
+ parser.add_option("", "--root",
+ action="store_true", dest="root", default=False,
+ help="Write the main() function and global data for a test runner.")
+ parser.add_option("", "--part",
+ action="store_true", dest="part", default=False,
+ help="Write the tester classes for a test runner.")
+ #parser.add_option("", "--factor",
+ #action="store_true", dest="factor", default=False,
+ #help="Declare the _CXXTEST_FACTOR macro. (deprecated)")
+ if imported_fog:
+ fog_help = "Use new FOG C++ parser"
+ else:
+ fog_help = "Use new FOG C++ parser (disabled)"
+ parser.add_option("-f", "--fog-parser",
+ action="store_true",
+ dest="fog",
+ default=False,
+ help=fog_help
+ )
+
+ (options, args) = parser.parse_args(args=args)
+ if not options.header_filename is None:
+ if not os.path.exists(options.header_filename):
+ abort( "ERROR: the file '%s' does not exist!" % options.header_filename )
+ INPUT = open(options.header_filename)
+ headers = [line.strip() for line in INPUT]
+ args.extend( headers )
+ INPUT.close()
+
+ if options.fog and not imported_fog:
+ abort( "Cannot use the FOG parser. Check that the 'ply' package is installed. The 'ordereddict' package is also required if running Python 2.6")
+
+ if options.version:
+ printVersion()
+
+ # the cxxtest builder relies on this behaviour! don't remove
+ if options.runner == 'none':
+ options.runner = None
+
+ if options.xunit_printer or options.runner == "XUnitPrinter":
+ options.xunit_printer=True
+ options.runner="XUnitPrinter"
+ if len(args) > 1:
+ if options.xunit_file == "":
+ if options.world == "":
+ options.world = "cxxtest"
+ options.xunit_file="TEST-"+options.world+".xml"
+ elif options.xunit_file == "":
+ if options.world == "":
+ options.world = "cxxtest"
+ options.xunit_file="TEST-"+options.world+".xml"
+
+ if options.error_printer:
+ options.runner= "ErrorPrinter"
+ options.haveStandardLibrary = True
+
+ if options.noStaticInit and (options.root or options.part):
+ abort( '--no-static-init cannot be used with --root/--part' )
+
+ if options.gui and not options.runner:
+ options.runner = 'StdioPrinter'
+
+ files = setFiles(args[1:])
+ if len(files) == 0 and not options.root:
+ sys.stderr.write(parser.error("No input files found"))
+
+ return files
+
+
+def printVersion():
+ '''Print CxxTest version and exit'''
+ sys.stdout.write( "This is CxxTest version %s.\n" % __release__.__version__ )
+ sys.exit(0)
+
+def setFiles(patterns ):
+ '''Set input files specified on command line'''
+ files = expandWildcards( patterns )
+ 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 writeOutput():
+ '''Create output file'''
+ if options.templateFileName:
+ writeTemplateOutput()
+ else:
+ writeSimpleOutput()
+
+def writeSimpleOutput():
+ '''Create output not based on template'''
+ output = startOutputFile()
+ writePreamble( output )
+ if options.root or not options.part:
+ writeMain( output )
+
+ if len(suites) > 0:
+ output.write("bool "+suites[0]['object']+"_init = false;\n")
+
+ 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(options.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 ):
+ if len(suites) > 0:
+ output.write("bool "+suites[0]['object']+"_init = false;\n")
+ writeWorld( output )
+ else:
+ output.write( line )
+ template.close()
+ output.close()
+
+def startOutputFile():
+ '''Create output file and write header'''
+ if options.outputFileName is not None:
+ output = open( options.outputFileName, 'w' )
+ else:
+ output = sys.stdout
+ output.write( "/* Generated file, do not edit */\n\n" )
+ return output
+
+def writePreamble( output ):
+ '''Write the CxxTest header (#includes and #defines)'''
+ global wrotePreamble
+ if wrotePreamble: return
+ output.write( "#ifndef CXXTEST_RUNNING\n" )
+ output.write( "#define CXXTEST_RUNNING\n" )
+ output.write( "#endif\n" )
+ output.write( "\n" )
+ if options.xunit_printer:
+ output.write( "#include <fstream>\n" )
+ if options.haveStandardLibrary:
+ output.write( "#define _CXXTEST_HAVE_STD\n" )
+ if options.haveExceptionHandling:
+ output.write( "#define _CXXTEST_HAVE_EH\n" )
+ if options.abortOnFail:
+ output.write( "#define _CXXTEST_ABORT_TEST_ON_FAIL\n" )
+ if options.longlong:
+ output.write( "#define _CXXTEST_LONGLONG %s\n" % options.longlong )
+ #if options.factor:
+ #output.write( "#define _CXXTEST_FACTOR\n" )
+ for header in options.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" )
+ output.write( "#include <cxxtest/TestMain.h>\n" )
+ if options.runner:
+ output.write( "#include <cxxtest/%s.h>\n" % options.runner )
+ if options.gui:
+ output.write( "#include <cxxtest/%s.h>\n" % options.gui )
+ output.write( "\n" )
+ wrotePreamble = 1
+
+def writeMain( output ):
+ '''Write the main() function for the test runner'''
+ if not (options.gui or options.runner):
+ return
+ output.write( 'int %s( int argc, char *argv[] ) {\n' % options.main )
+ output.write( ' int status;\n' )
+ if options.noStaticInit:
+ output.write( ' CxxTest::initialize();\n' )
+ if options.gui:
+ tester_t = "CxxTest::GuiTuiRunner<CxxTest::%s, CxxTest::%s> " % (options.gui, options.runner)
+ else:
+ tester_t = "CxxTest::%s" % (options.runner)
+ if options.xunit_printer:
+ output.write( ' std::ofstream ofstr("%s");\n' % options.xunit_file )
+ output.write( ' %s tmp(ofstr);\n' % tester_t )
+ output.write( ' CxxTest::RealWorldDescription::_worldName = "%s";\n' % options.world )
+ else:
+ output.write( ' %s tmp;\n' % tester_t )
+ output.write( ' status = CxxTest::Main<%s>( tmp, argc, argv );\n' % tester_t )
+ output.write( ' return status;\n')
+ output.write( '}\n' )
+
+
+def writeWorld( output ):
+ '''Write the world definitions'''
+ global wroteWorld
+ if wroteWorld: return
+ writePreamble( output )
+ writeSuites( output )
+ if options.root or not options.part:
+ writeRoot( output )
+ writeWorldDescr( output )
+ if options.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 'create' in suite
+
+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 options.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 options.noStaticInit:
+ output.write( 'static CxxTest::List %s;\n' % suite['tlist'] )
+ else:
+ output.write( 'static CxxTest::List %s = { 0, 0 };\n' % suite['tlist'] )
+
+def writeWorldDescr( output ):
+ '''Write the static name of the world name'''
+ if options.noStaticInit:
+ output.write( 'const char* CxxTest::RealWorldDescription::_worldName;\n' )
+ else:
+ output.write( 'const char* CxxTest::RealWorldDescription::_worldName = "cxxtest";\n' )
+
+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 options.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 options.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 options.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' )
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+"""cxxtest: A Python package that supports the CxxTest test framework for C/C++.
+
+.. _CxxTest: http://cxxtest.tigris.org/
+
+CxxTest is a unit testing framework for C++ that is similar in
+spirit to JUnit, CppUnit, and xUnit. CxxTest is easy to use because
+it does not require precompiling a CxxTest testing library, it
+employs no advanced features of C++ (e.g. RTTI) and it supports a
+very flexible form of test discovery.
+
+The cxxtest Python package includes capabilities for parsing C/C++ source files and generating
+CxxTest drivers.
+"""
+
+from cxxtest.__release__ import __version__, __date__
+__date__
+__version__
+
+__maintainer__ = "William E. Hart"
+__maintainer_email__ = "whart222@gmail.com"
+__license__ = "LGPL"
+__url__ = "http://cxxtest.tigris.org/"
+
+from cxxtest.cxxtestgen import *
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+""" Release Information for cxxtest """
+
+__version__ = '4.0.2'
+__date__ = "2012-01-02"
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+# vim: fileencoding=utf-8
+
+#
+# This is a PLY parser for the entire ANSI C++ grammar. This grammar was
+# adapted from the FOG grammar developed by E. D. Willink. See
+#
+# http://www.computing.surrey.ac.uk/research/dsrg/fog/
+#
+# for further details.
+#
+# The goal of this grammar is to extract information about class, function and
+# class method declarations, along with their associated scope. Thus, this
+# grammar can be used to analyze classes in an inheritance heirarchy, and then
+# enumerate the methods in a derived class.
+#
+# This grammar parses blocks of <>, (), [] and {} in a generic manner. Thus,
+# There are several capabilities that this grammar does not support:
+#
+# 1. Ambiguous template specification. This grammar cannot parse template
+# specifications that do not have paired <>'s in their declaration. In
+# particular, ambiguous declarations like
+#
+# foo<A, c<3 >();
+#
+# cannot be correctly parsed.
+#
+# 2. Template class specialization. Although the goal of this grammar is to
+# extract class information, specialization of templated classes is
+# not supported. When a template class definition is parsed, it's
+# declaration is archived without information about the template
+# parameters. Class specializations will be stored separately, and
+# thus they can be processed after the fact. However, this grammar
+# does not attempt to correctly process properties of class inheritence
+# when template class specialization is employed.
+#
+
+#
+# TODO: document usage of this file
+#
+
+
+
+import os
+import ply.lex as lex
+import ply.yacc as yacc
+import re
+try:
+ from collections import OrderedDict
+except ImportError:
+ from ordereddict import OrderedDict
+
+lexer = None
+scope_lineno = 0
+identifier_lineno = {}
+_parse_info=None
+_parsedata=None
+noExceptionLogic = True
+
+def ply_init(data):
+ global _parsedata
+ _parsedata=data
+
+
+class Scope(object):
+
+ def __init__(self,name,abs_name,scope_t,base_classes,lineno):
+ self.function=[]
+ self.name=name
+ self.scope_t=scope_t
+ self.sub_scopes=[]
+ self.base_classes=base_classes
+ self.abs_name=abs_name
+ self.lineno=lineno
+
+ def insert(self,scope):
+ self.sub_scopes.append(scope)
+
+
+class CppInfo(object):
+
+ def __init__(self, filter=None):
+ self.verbose=0
+ if filter is None:
+ self.filter=re.compile("[Tt][Ee][Ss][Tt]|createSuite|destroySuite")
+ else:
+ self.filter=filter
+ self.scopes=[""]
+ self.index=OrderedDict()
+ self.index[""]=Scope("","::","namespace",[],1)
+ self.function=[]
+
+ def push_scope(self,ns,scope_t,base_classes=[]):
+ name = self.scopes[-1]+"::"+ns
+ if self.verbose>=2:
+ print("-- Starting "+scope_t+" "+name)
+ self.scopes.append(name)
+ self.index[name] = Scope(ns,name,scope_t,base_classes,scope_lineno-1)
+
+ def pop_scope(self):
+ scope = self.scopes.pop()
+ if self.verbose>=2:
+ print("-- Stopping "+scope)
+ return scope
+
+ def add_function(self, fn):
+ fn = str(fn)
+ if self.filter.search(fn):
+ self.index[self.scopes[-1]].function.append((fn, identifier_lineno.get(fn,lexer.lineno-1)))
+ tmp = self.scopes[-1]+"::"+fn
+ if self.verbose==2:
+ print("-- Function declaration "+fn+" "+tmp)
+ elif self.verbose==1:
+ print("-- Function declaration "+tmp)
+
+ def get_functions(self,name,quiet=False):
+ if name == "::":
+ name = ""
+ scope = self.index[name]
+ fns=scope.function
+ for key in scope.base_classes:
+ cname = self.find_class(key,scope)
+ if cname is None:
+ if not quiet:
+ print("Defined classes: ",list(self.index.keys()))
+ print("WARNING: Unknown class "+key)
+ else:
+ fns += self.get_functions(cname,quiet)
+ return fns
+
+ def find_class(self,name,scope):
+ if ':' in name:
+ if name in self.index:
+ return name
+ else:
+ return None
+ tmp = scope.abs_name.split(':')
+ name1 = ":".join(tmp[:-1] + [name])
+ if name1 in self.index:
+ return name1
+ name2 = "::"+name
+ if name2 in self.index:
+ return name2
+ return None
+
+ def __repr__(self):
+ return str(self)
+
+ def is_baseclass(self,cls,base):
+ '''Returns true if base is a base-class of cls'''
+ if cls in self.index:
+ bases = self.index[cls]
+ elif "::"+cls in self.index:
+ bases = self.index["::"+cls]
+ else:
+ return False
+ #raise IOError, "Unknown class "+cls
+ if base in bases.base_classes:
+ return True
+ for name in bases.base_classes:
+ if self.is_baseclass(name,base):
+ return True
+ return False
+
+ def __str__(self):
+ ans=""
+ keys = list(self.index.keys())
+ keys.sort()
+ for key in keys:
+ scope = self.index[key]
+ ans += scope.scope_t+" "+scope.abs_name+"\n"
+ if scope.scope_t == "class":
+ ans += " Base Classes: "+str(scope.base_classes)+"\n"
+ for fn in self.get_functions(scope.abs_name):
+ ans += " "+fn+"\n"
+ else:
+ for fn in scope.function:
+ ans += " "+fn+"\n"
+ return ans
+
+
+def flatten(x):
+ """Flatten nested list"""
+ try:
+ strtypes = str
+ except: # for python3 etc
+ strtypes = (str, bytes)
+
+ result = []
+ for el in x:
+ if hasattr(el, "__iter__") and not isinstance(el, strtypes):
+ result.extend(flatten(el))
+ else:
+ result.append(el)
+ return result
+
+#
+# The lexer (and/or a preprocessor) is expected to identify the following
+#
+# Punctuation:
+#
+#
+literals = "+-*/%^&|~!<>=:()?.\'\"\\@$;,"
+
+#
+reserved = {
+ 'private' : 'PRIVATE',
+ 'protected' : 'PROTECTED',
+ 'public' : 'PUBLIC',
+
+ 'bool' : 'BOOL',
+ 'char' : 'CHAR',
+ 'double' : 'DOUBLE',
+ 'float' : 'FLOAT',
+ 'int' : 'INT',
+ 'long' : 'LONG',
+ 'short' : 'SHORT',
+ 'signed' : 'SIGNED',
+ 'unsigned' : 'UNSIGNED',
+ 'void' : 'VOID',
+ 'wchar_t' : 'WCHAR_T',
+
+ 'class' : 'CLASS',
+ 'enum' : 'ENUM',
+ 'namespace' : 'NAMESPACE',
+ 'struct' : 'STRUCT',
+ 'typename' : 'TYPENAME',
+ 'union' : 'UNION',
+
+ 'const' : 'CONST',
+ 'volatile' : 'VOLATILE',
+
+ 'auto' : 'AUTO',
+ 'explicit' : 'EXPLICIT',
+ 'export' : 'EXPORT',
+ 'extern' : 'EXTERN',
+ '__extension__' : 'EXTENSION',
+ 'friend' : 'FRIEND',
+ 'inline' : 'INLINE',
+ 'mutable' : 'MUTABLE',
+ 'register' : 'REGISTER',
+ 'static' : 'STATIC',
+ 'template' : 'TEMPLATE',
+ 'typedef' : 'TYPEDEF',
+ 'using' : 'USING',
+ 'virtual' : 'VIRTUAL',
+
+ 'asm' : 'ASM',
+ 'break' : 'BREAK',
+ 'case' : 'CASE',
+ 'catch' : 'CATCH',
+ 'const_cast' : 'CONST_CAST',
+ 'continue' : 'CONTINUE',
+ 'default' : 'DEFAULT',
+ 'delete' : 'DELETE',
+ 'do' : 'DO',
+ 'dynamic_cast' : 'DYNAMIC_CAST',
+ 'else' : 'ELSE',
+ 'false' : 'FALSE',
+ 'for' : 'FOR',
+ 'goto' : 'GOTO',
+ 'if' : 'IF',
+ 'new' : 'NEW',
+ 'operator' : 'OPERATOR',
+ 'reinterpret_cast' : 'REINTERPRET_CAST',
+ 'return' : 'RETURN',
+ 'sizeof' : 'SIZEOF',
+ 'static_cast' : 'STATIC_CAST',
+ 'switch' : 'SWITCH',
+ 'this' : 'THIS',
+ 'throw' : 'THROW',
+ 'true' : 'TRUE',
+ 'try' : 'TRY',
+ 'typeid' : 'TYPEID',
+ 'while' : 'WHILE',
+ '"C"' : 'CLiteral',
+ '"C++"' : 'CppLiteral',
+
+ '__attribute__' : 'ATTRIBUTE',
+ '__cdecl__' : 'CDECL',
+ '__typeof' : 'uTYPEOF',
+ 'typeof' : 'TYPEOF',
+
+ 'CXXTEST_STD' : 'CXXTEST_STD'
+}
+
+tokens = [
+ "CharacterLiteral",
+ "FloatingLiteral",
+ "Identifier",
+ "IntegerLiteral",
+ "StringLiteral",
+ "RBRACE",
+ "LBRACE",
+ "RBRACKET",
+ "LBRACKET",
+ "ARROW",
+ "ARROW_STAR",
+ "DEC",
+ "EQ",
+ "GE",
+ "INC",
+ "LE",
+ "LOG_AND",
+ "LOG_OR",
+ "NE",
+ "SHL",
+ "SHR",
+ "ASS_ADD",
+ "ASS_AND",
+ "ASS_DIV",
+ "ASS_MOD",
+ "ASS_MUL",
+ "ASS_OR",
+ "ASS_SHL",
+ "ASS_SHR",
+ "ASS_SUB",
+ "ASS_XOR",
+ "DOT_STAR",
+ "ELLIPSIS",
+ "SCOPE",
+] + list(reserved.values())
+
+t_ignore = " \t\r"
+
+t_LBRACE = r"(\{)|(<%)"
+t_RBRACE = r"(\})|(%>)"
+t_LBRACKET = r"(\[)|(<:)"
+t_RBRACKET = r"(\])|(:>)"
+t_ARROW = r"->"
+t_ARROW_STAR = r"->\*"
+t_DEC = r"--"
+t_EQ = r"=="
+t_GE = r">="
+t_INC = r"\+\+"
+t_LE = r"<="
+t_LOG_AND = r"&&"
+t_LOG_OR = r"\|\|"
+t_NE = r"!="
+t_SHL = r"<<"
+t_SHR = r">>"
+t_ASS_ADD = r"\+="
+t_ASS_AND = r"&="
+t_ASS_DIV = r"/="
+t_ASS_MOD = r"%="
+t_ASS_MUL = r"\*="
+t_ASS_OR = r"\|="
+t_ASS_SHL = r"<<="
+t_ASS_SHR = r">>="
+t_ASS_SUB = r"-="
+t_ASS_XOR = r"^="
+t_DOT_STAR = r"\.\*"
+t_ELLIPSIS = r"\.\.\."
+t_SCOPE = r"::"
+
+# Discard comments
+def t_COMMENT(t):
+ r'(/\*(.|\n)*?\*/)|(//.*?\n)|(\#.*?\n)'
+ t.lexer.lineno += t.value.count("\n")
+
+t_IntegerLiteral = r'(0x[0-9A-F]+)|([0-9]+(L){0,1})'
+t_FloatingLiteral = r"[0-9]+[eE\.\+-]+[eE\.\+\-0-9]+"
+t_CharacterLiteral = r'\'([^\'\\]|\\.)*\''
+#t_StringLiteral = r'"([^"\\]|\\.)*"'
+def t_StringLiteral(t):
+ r'"([^"\\]|\\.)*"'
+ t.type = reserved.get(t.value,'StringLiteral')
+ return t
+
+def t_Identifier(t):
+ r"[a-zA-Z_][a-zA-Z_0-9\.]*"
+ t.type = reserved.get(t.value,'Identifier')
+ return t
+
+
+def t_error(t):
+ print("Illegal character '%s'" % t.value[0])
+ #raise IOError, "Parse error"
+ #t.lexer.skip()
+
+def t_newline(t):
+ r'[\n]+'
+ t.lexer.lineno += len(t.value)
+
+precedence = (
+ ( 'right', 'SHIFT_THERE', 'REDUCE_HERE_MOSTLY', 'SCOPE'),
+ ( 'nonassoc', 'ELSE', 'INC', 'DEC', '+', '-', '*', '&', 'LBRACKET', 'LBRACE', '<', ':', ')')
+ )
+
+start = 'translation_unit'
+
+#
+# The %prec resolves the 14.2-3 ambiguity:
+# Identifier '<' is forced to go through the is-it-a-template-name test
+# All names absorb TEMPLATE with the name, so that no template_test is
+# performed for them. This requires all potential declarations within an
+# expression to perpetuate this policy and thereby guarantee the ultimate
+# coverage of explicit_instantiation.
+#
+# The %prec also resolves a conflict in identifier : which is forced to be a
+# shift of a label for a labeled-statement rather than a reduction for the
+# name of a bit-field or generalised constructor. This is pretty dubious
+# syntactically but correct for all semantic possibilities. The shift is
+# only activated when the ambiguity exists at the start of a statement.
+# In this context a bit-field declaration or constructor definition are not
+# allowed.
+#
+
+def p_identifier(p):
+ '''identifier : Identifier
+ | CXXTEST_STD '(' Identifier ')'
+ '''
+ if p[1][0] in ('t','T','c','d'):
+ identifier_lineno[p[1]] = p.lineno(1)
+ p[0] = p[1]
+
+def p_id(p):
+ '''id : identifier %prec SHIFT_THERE
+ | template_decl
+ | TEMPLATE id
+ '''
+ p[0] = get_rest(p)
+
+def p_global_scope(p):
+ '''global_scope : SCOPE
+ '''
+ p[0] = get_rest(p)
+
+def p_id_scope(p):
+ '''id_scope : id SCOPE'''
+ p[0] = get_rest(p)
+
+def p_id_scope_seq(p):
+ '''id_scope_seq : id_scope
+ | id_scope id_scope_seq
+ '''
+ p[0] = get_rest(p)
+
+#
+# A :: B :: C; is ambiguous How much is type and how much name ?
+# The %prec maximises the (type) length which is the 7.1-2 semantic constraint.
+#
+def p_nested_id(p):
+ '''nested_id : id %prec SHIFT_THERE
+ | id_scope nested_id
+ '''
+ p[0] = get_rest(p)
+
+def p_scoped_id(p):
+ '''scoped_id : nested_id
+ | global_scope nested_id
+ | id_scope_seq
+ | global_scope id_scope_seq
+ '''
+ global scope_lineno
+ scope_lineno = lexer.lineno
+ data = flatten(get_rest(p))
+ if data[0] != None:
+ p[0] = "".join(data)
+
+#
+# destructor_id has to be held back to avoid a conflict with a one's
+# complement as per 5.3.1-9, It gets put back only when scoped or in a
+# declarator_id, which is only used as an explicit member name.
+# Declarations of an unscoped destructor are always parsed as a one's
+# complement.
+#
+def p_destructor_id(p):
+ '''destructor_id : '~' id
+ | TEMPLATE destructor_id
+ '''
+ p[0]=get_rest(p)
+
+#def p_template_id(p):
+# '''template_id : empty
+# | TEMPLATE
+# '''
+# pass
+
+def p_template_decl(p):
+ '''template_decl : identifier '<' nonlgt_seq_opt '>'
+ '''
+ #
+ # WEH: should we include the lt/gt symbols to indicate that this is a
+ # template class? How is that going to be used later???
+ #
+ #p[0] = [p[1] ,"<",">"]
+ p[0] = p[1]
+
+def p_special_function_id(p):
+ '''special_function_id : conversion_function_id
+ | operator_function_id
+ | TEMPLATE special_function_id
+ '''
+ p[0]=get_rest(p)
+
+def p_nested_special_function_id(p):
+ '''nested_special_function_id : special_function_id
+ | id_scope destructor_id
+ | id_scope nested_special_function_id
+ '''
+ p[0]=get_rest(p)
+
+def p_scoped_special_function_id(p):
+ '''scoped_special_function_id : nested_special_function_id
+ | global_scope nested_special_function_id
+ '''
+ p[0]=get_rest(p)
+
+# declarator-id is all names in all scopes, except reserved words
+def p_declarator_id(p):
+ '''declarator_id : scoped_id
+ | scoped_special_function_id
+ | destructor_id
+ '''
+ p[0]=p[1]
+
+#
+# The standard defines pseudo-destructors in terms of type-name, which is
+# class/enum/typedef, of which class-name is covered by a normal destructor.
+# pseudo-destructors are supposed to support ~int() in templates, so the
+# grammar here covers built-in names. Other names are covered by the lack
+# of identifier/type discrimination.
+#
+def p_built_in_type_id(p):
+ '''built_in_type_id : built_in_type_specifier
+ | built_in_type_id built_in_type_specifier
+ '''
+ pass
+
+def p_pseudo_destructor_id(p):
+ '''pseudo_destructor_id : built_in_type_id SCOPE '~' built_in_type_id
+ | '~' built_in_type_id
+ | TEMPLATE pseudo_destructor_id
+ '''
+ pass
+
+def p_nested_pseudo_destructor_id(p):
+ '''nested_pseudo_destructor_id : pseudo_destructor_id
+ | id_scope nested_pseudo_destructor_id
+ '''
+ pass
+
+def p_scoped_pseudo_destructor_id(p):
+ '''scoped_pseudo_destructor_id : nested_pseudo_destructor_id
+ | global_scope scoped_pseudo_destructor_id
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.2 Lexical conventions
+#-------------------------------------------------------------------------------
+#
+
+def p_literal(p):
+ '''literal : IntegerLiteral
+ | CharacterLiteral
+ | FloatingLiteral
+ | StringLiteral
+ | TRUE
+ | FALSE
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.3 Basic concepts
+#-------------------------------------------------------------------------------
+def p_translation_unit(p):
+ '''translation_unit : declaration_seq_opt
+ '''
+ pass
+
+#-------------------------------------------------------------------------------
+# A.4 Expressions
+#-------------------------------------------------------------------------------
+#
+# primary_expression covers an arbitrary sequence of all names with the
+# exception of an unscoped destructor, which is parsed as its unary expression
+# which is the correct disambiguation (when ambiguous). This eliminates the
+# traditional A(B) meaning A B ambiguity, since we never have to tack an A
+# onto the front of something that might start with (. The name length got
+# maximised ab initio. The downside is that semantic interpretation must split
+# the names up again.
+#
+# Unification of the declaration and expression syntax means that unary and
+# binary pointer declarator operators:
+# int * * name
+# are parsed as binary and unary arithmetic operators (int) * (*name). Since
+# type information is not used
+# ambiguities resulting from a cast
+# (cast)*(value)
+# are resolved to favour the binary rather than the cast unary to ease AST
+# clean-up. The cast-call ambiguity must be resolved to the cast to ensure
+# that (a)(b)c can be parsed.
+#
+# The problem of the functional cast ambiguity
+# name(arg)
+# as call or declaration is avoided by maximising the name within the parsing
+# kernel. So primary_id_expression picks up
+# extern long int const var = 5;
+# as an assignment to the syntax parsed as "extern long int const var". The
+# presence of two names is parsed so that "extern long into const" is
+# distinguished from "var" considerably simplifying subsequent
+# semantic resolution.
+#
+# The generalised name is a concatenation of potential type-names (scoped
+# identifiers or built-in sequences) plus optionally one of the special names
+# such as an operator-function-id, conversion-function-id or destructor as the
+# final name.
+#
+
+def get_rest(p):
+ return [p[i] for i in range(1, len(p))]
+
+def p_primary_expression(p):
+ '''primary_expression : literal
+ | THIS
+ | suffix_decl_specified_ids
+ | abstract_expression %prec REDUCE_HERE_MOSTLY
+ '''
+ p[0] = get_rest(p)
+
+#
+# Abstract-expression covers the () and [] of abstract-declarators.
+#
+def p_abstract_expression(p):
+ '''abstract_expression : parenthesis_clause
+ | LBRACKET bexpression_opt RBRACKET
+ | TEMPLATE abstract_expression
+ '''
+ pass
+
+def p_postfix_expression(p):
+ '''postfix_expression : primary_expression
+ | postfix_expression parenthesis_clause
+ | postfix_expression LBRACKET bexpression_opt RBRACKET
+ | postfix_expression LBRACKET bexpression_opt RBRACKET attributes
+ | postfix_expression '.' declarator_id
+ | postfix_expression '.' scoped_pseudo_destructor_id
+ | postfix_expression ARROW declarator_id
+ | postfix_expression ARROW scoped_pseudo_destructor_id
+ | postfix_expression INC
+ | postfix_expression DEC
+ | DYNAMIC_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | STATIC_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | REINTERPRET_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | CONST_CAST '<' nonlgt_seq_opt '>' '(' expression ')'
+ | TYPEID parameters_clause
+ '''
+ #print "HERE",str(p[1])
+ p[0] = get_rest(p)
+
+def p_bexpression_opt(p):
+ '''bexpression_opt : empty
+ | bexpression
+ '''
+ pass
+
+def p_bexpression(p):
+ '''bexpression : nonbracket_seq
+ | nonbracket_seq bexpression_seq bexpression_clause nonbracket_seq_opt
+ | bexpression_seq bexpression_clause nonbracket_seq_opt
+ '''
+ pass
+
+def p_bexpression_seq(p):
+ '''bexpression_seq : empty
+ | bexpression_seq bexpression_clause nonbracket_seq_opt
+ '''
+ pass
+
+def p_bexpression_clause(p):
+ '''bexpression_clause : LBRACKET bexpression_opt RBRACKET
+ '''
+ pass
+
+
+
+def p_expression_list_opt(p):
+ '''expression_list_opt : empty
+ | expression_list
+ '''
+ pass
+
+def p_expression_list(p):
+ '''expression_list : assignment_expression
+ | expression_list ',' assignment_expression
+ '''
+ pass
+
+def p_unary_expression(p):
+ '''unary_expression : postfix_expression
+ | INC cast_expression
+ | DEC cast_expression
+ | ptr_operator cast_expression
+ | suffix_decl_specified_scope star_ptr_operator cast_expression
+ | '+' cast_expression
+ | '-' cast_expression
+ | '!' cast_expression
+ | '~' cast_expression
+ | SIZEOF unary_expression
+ | new_expression
+ | global_scope new_expression
+ | delete_expression
+ | global_scope delete_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_delete_expression(p):
+ '''delete_expression : DELETE cast_expression
+ '''
+ pass
+
+def p_new_expression(p):
+ '''new_expression : NEW new_type_id new_initializer_opt
+ | NEW parameters_clause new_type_id new_initializer_opt
+ | NEW parameters_clause
+ | NEW parameters_clause parameters_clause new_initializer_opt
+ '''
+ pass
+
+def p_new_type_id(p):
+ '''new_type_id : type_specifier ptr_operator_seq_opt
+ | type_specifier new_declarator
+ | type_specifier new_type_id
+ '''
+ pass
+
+def p_new_declarator(p):
+ '''new_declarator : ptr_operator new_declarator
+ | direct_new_declarator
+ '''
+ pass
+
+def p_direct_new_declarator(p):
+ '''direct_new_declarator : LBRACKET bexpression_opt RBRACKET
+ | direct_new_declarator LBRACKET bexpression RBRACKET
+ '''
+ pass
+
+def p_new_initializer_opt(p):
+ '''new_initializer_opt : empty
+ | '(' expression_list_opt ')'
+ '''
+ pass
+
+#
+# cast-expression is generalised to support a [] as well as a () prefix. This covers the omission of
+# DELETE[] which when followed by a parenthesised expression was ambiguous. It also covers the gcc
+# indexed array initialisation for free.
+#
+def p_cast_expression(p):
+ '''cast_expression : unary_expression
+ | abstract_expression cast_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_pm_expression(p):
+ '''pm_expression : cast_expression
+ | pm_expression DOT_STAR cast_expression
+ | pm_expression ARROW_STAR cast_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_multiplicative_expression(p):
+ '''multiplicative_expression : pm_expression
+ | multiplicative_expression star_ptr_operator pm_expression
+ | multiplicative_expression '/' pm_expression
+ | multiplicative_expression '%' pm_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_additive_expression(p):
+ '''additive_expression : multiplicative_expression
+ | additive_expression '+' multiplicative_expression
+ | additive_expression '-' multiplicative_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_shift_expression(p):
+ '''shift_expression : additive_expression
+ | shift_expression SHL additive_expression
+ | shift_expression SHR additive_expression
+ '''
+ p[0] = get_rest(p)
+
+# | relational_expression '<' shift_expression
+# | relational_expression '>' shift_expression
+# | relational_expression LE shift_expression
+# | relational_expression GE shift_expression
+def p_relational_expression(p):
+ '''relational_expression : shift_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_equality_expression(p):
+ '''equality_expression : relational_expression
+ | equality_expression EQ relational_expression
+ | equality_expression NE relational_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_and_expression(p):
+ '''and_expression : equality_expression
+ | and_expression '&' equality_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_exclusive_or_expression(p):
+ '''exclusive_or_expression : and_expression
+ | exclusive_or_expression '^' and_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_inclusive_or_expression(p):
+ '''inclusive_or_expression : exclusive_or_expression
+ | inclusive_or_expression '|' exclusive_or_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_logical_and_expression(p):
+ '''logical_and_expression : inclusive_or_expression
+ | logical_and_expression LOG_AND inclusive_or_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_logical_or_expression(p):
+ '''logical_or_expression : logical_and_expression
+ | logical_or_expression LOG_OR logical_and_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_conditional_expression(p):
+ '''conditional_expression : logical_or_expression
+ | logical_or_expression '?' expression ':' assignment_expression
+ '''
+ p[0] = get_rest(p)
+
+
+#
+# assignment-expression is generalised to cover the simple assignment of a braced initializer in order to
+# contribute to the coverage of parameter-declaration and init-declaration.
+#
+# | logical_or_expression assignment_operator assignment_expression
+def p_assignment_expression(p):
+ '''assignment_expression : conditional_expression
+ | logical_or_expression assignment_operator nonsemicolon_seq
+ | logical_or_expression '=' braced_initializer
+ | throw_expression
+ '''
+ p[0]=get_rest(p)
+
+def p_assignment_operator(p):
+ '''assignment_operator : '='
+ | ASS_ADD
+ | ASS_AND
+ | ASS_DIV
+ | ASS_MOD
+ | ASS_MUL
+ | ASS_OR
+ | ASS_SHL
+ | ASS_SHR
+ | ASS_SUB
+ | ASS_XOR
+ '''
+ pass
+
+#
+# expression is widely used and usually single-element, so the reductions are arranged so that a
+# single-element expression is returned as is. Multi-element expressions are parsed as a list that
+# may then behave polymorphically as an element or be compacted to an element.
+#
+
+def p_expression(p):
+ '''expression : assignment_expression
+ | expression_list ',' assignment_expression
+ '''
+ p[0] = get_rest(p)
+
+def p_constant_expression(p):
+ '''constant_expression : conditional_expression
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.5 Statements
+#---------------------------------------------------------------------------------------------------
+# Parsing statements is easy once simple_declaration has been generalised to cover expression_statement.
+#
+#
+# The use of extern here is a hack. The 'extern "C" {}' block gets parsed
+# as a function, so when nested 'extern "C"' declarations exist, they don't
+# work because the block is viewed as a list of statements... :(
+#
+def p_statement(p):
+ '''statement : compound_statement
+ | declaration_statement
+ | try_block
+ | labeled_statement
+ | selection_statement
+ | iteration_statement
+ | jump_statement
+ '''
+ pass
+
+def p_compound_statement(p):
+ '''compound_statement : LBRACE statement_seq_opt RBRACE
+ '''
+ pass
+
+def p_statement_seq_opt(p):
+ '''statement_seq_opt : empty
+ | statement_seq_opt statement
+ '''
+ pass
+
+#
+# The dangling else conflict is resolved to the innermost if.
+#
+def p_selection_statement(p):
+ '''selection_statement : IF '(' condition ')' statement %prec SHIFT_THERE
+ | IF '(' condition ')' statement ELSE statement
+ | SWITCH '(' condition ')' statement
+ '''
+ pass
+
+def p_condition_opt(p):
+ '''condition_opt : empty
+ | condition
+ '''
+ pass
+
+def p_condition(p):
+ '''condition : nonparen_seq
+ | nonparen_seq condition_seq parameters_clause nonparen_seq_opt
+ | condition_seq parameters_clause nonparen_seq_opt
+ '''
+ pass
+
+def p_condition_seq(p):
+ '''condition_seq : empty
+ | condition_seq parameters_clause nonparen_seq_opt
+ '''
+ pass
+
+def p_labeled_statement(p):
+ '''labeled_statement : identifier ':' statement
+ | CASE constant_expression ':' statement
+ | DEFAULT ':' statement
+ '''
+ pass
+
+def p_try_block(p):
+ '''try_block : TRY compound_statement handler_seq
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_jump_statement(p):
+ '''jump_statement : BREAK ';'
+ | CONTINUE ';'
+ | RETURN nonsemicolon_seq ';'
+ | GOTO identifier ';'
+ '''
+ pass
+
+def p_iteration_statement(p):
+ '''iteration_statement : WHILE '(' condition ')' statement
+ | DO statement WHILE '(' expression ')' ';'
+ | FOR '(' nonparen_seq_opt ')' statement
+ '''
+ pass
+
+def p_declaration_statement(p):
+ '''declaration_statement : block_declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.6 Declarations
+#---------------------------------------------------------------------------------------------------
+def p_compound_declaration(p):
+ '''compound_declaration : LBRACE declaration_seq_opt RBRACE
+ '''
+ pass
+
+def p_declaration_seq_opt(p):
+ '''declaration_seq_opt : empty
+ | declaration_seq_opt declaration
+ '''
+ pass
+
+def p_declaration(p):
+ '''declaration : block_declaration
+ | function_definition
+ | template_declaration
+ | explicit_specialization
+ | specialised_declaration
+ '''
+ pass
+
+def p_specialised_declaration(p):
+ '''specialised_declaration : linkage_specification
+ | namespace_definition
+ | TEMPLATE specialised_declaration
+ '''
+ pass
+
+def p_block_declaration(p):
+ '''block_declaration : simple_declaration
+ | specialised_block_declaration
+ '''
+ pass
+
+def p_specialised_block_declaration(p):
+ '''specialised_block_declaration : asm_definition
+ | namespace_alias_definition
+ | using_declaration
+ | using_directive
+ | TEMPLATE specialised_block_declaration
+ '''
+ pass
+
+def p_simple_declaration(p):
+ '''simple_declaration : ';'
+ | init_declaration ';'
+ | init_declarations ';'
+ | decl_specifier_prefix simple_declaration
+ '''
+ global _parse_info
+ if len(p) == 3:
+ if p[2] == ";":
+ decl = p[1]
+ else:
+ decl = p[2]
+ if decl is not None:
+ fp = flatten(decl)
+ if len(fp) >= 2 and fp[0] is not None and fp[0]!="operator" and fp[1] == '(':
+ p[0] = fp[0]
+ _parse_info.add_function(fp[0])
+
+#
+# A decl-specifier following a ptr_operator provokes a shift-reduce conflict for * const name which is resolved in favour of the pointer, and implemented by providing versions of decl-specifier guaranteed not to start with a cv_qualifier. decl-specifiers are implemented type-centrically. That is the semantic constraint that there must be a type is exploited to impose structure, but actually eliminate very little syntax. built-in types are multi-name and so need a different policy.
+#
+# non-type decl-specifiers are bound to the left-most type in a decl-specifier-seq, by parsing from the right and attaching suffixes to the right-hand type. Finally residual prefixes attach to the left.
+#
+def p_suffix_built_in_decl_specifier_raw(p):
+ '''suffix_built_in_decl_specifier_raw : built_in_type_specifier
+ | suffix_built_in_decl_specifier_raw built_in_type_specifier
+ | suffix_built_in_decl_specifier_raw decl_specifier_suffix
+ '''
+ pass
+
+def p_suffix_built_in_decl_specifier(p):
+ '''suffix_built_in_decl_specifier : suffix_built_in_decl_specifier_raw
+ | TEMPLATE suffix_built_in_decl_specifier
+ '''
+ pass
+
+# | id_scope_seq
+# | SCOPE id_scope_seq
+def p_suffix_named_decl_specifier(p):
+ '''suffix_named_decl_specifier : scoped_id
+ | elaborate_type_specifier
+ | suffix_named_decl_specifier decl_specifier_suffix
+ '''
+ p[0]=get_rest(p)
+
+def p_suffix_named_decl_specifier_bi(p):
+ '''suffix_named_decl_specifier_bi : suffix_named_decl_specifier
+ | suffix_named_decl_specifier suffix_built_in_decl_specifier_raw
+ '''
+ p[0] = get_rest(p)
+ #print "HERE",get_rest(p)
+
+def p_suffix_named_decl_specifiers(p):
+ '''suffix_named_decl_specifiers : suffix_named_decl_specifier_bi
+ | suffix_named_decl_specifiers suffix_named_decl_specifier_bi
+ '''
+ p[0] = get_rest(p)
+
+def p_suffix_named_decl_specifiers_sf(p):
+ '''suffix_named_decl_specifiers_sf : scoped_special_function_id
+ | suffix_named_decl_specifiers
+ | suffix_named_decl_specifiers scoped_special_function_id
+ '''
+ #print "HERE",get_rest(p)
+ p[0] = get_rest(p)
+
+def p_suffix_decl_specified_ids(p):
+ '''suffix_decl_specified_ids : suffix_built_in_decl_specifier
+ | suffix_built_in_decl_specifier suffix_named_decl_specifiers_sf
+ | suffix_named_decl_specifiers_sf
+ '''
+ if len(p) == 3:
+ p[0] = p[2]
+ else:
+ p[0] = p[1]
+
+def p_suffix_decl_specified_scope(p):
+ '''suffix_decl_specified_scope : suffix_named_decl_specifiers SCOPE
+ | suffix_built_in_decl_specifier suffix_named_decl_specifiers SCOPE
+ | suffix_built_in_decl_specifier SCOPE
+ '''
+ p[0] = get_rest(p)
+
+def p_decl_specifier_affix(p):
+ '''decl_specifier_affix : storage_class_specifier
+ | function_specifier
+ | FRIEND
+ | TYPEDEF
+ | cv_qualifier
+ '''
+ pass
+
+def p_decl_specifier_suffix(p):
+ '''decl_specifier_suffix : decl_specifier_affix
+ '''
+ pass
+
+def p_decl_specifier_prefix(p):
+ '''decl_specifier_prefix : decl_specifier_affix
+ | TEMPLATE decl_specifier_prefix
+ '''
+ pass
+
+def p_storage_class_specifier(p):
+ '''storage_class_specifier : REGISTER
+ | STATIC
+ | MUTABLE
+ | EXTERN %prec SHIFT_THERE
+ | EXTENSION
+ | AUTO
+ '''
+ pass
+
+def p_function_specifier(p):
+ '''function_specifier : EXPLICIT
+ | INLINE
+ | VIRTUAL
+ '''
+ pass
+
+def p_type_specifier(p):
+ '''type_specifier : simple_type_specifier
+ | elaborate_type_specifier
+ | cv_qualifier
+ '''
+ pass
+
+def p_elaborate_type_specifier(p):
+ '''elaborate_type_specifier : class_specifier
+ | enum_specifier
+ | elaborated_type_specifier
+ | TEMPLATE elaborate_type_specifier
+ '''
+ pass
+
+def p_simple_type_specifier(p):
+ '''simple_type_specifier : scoped_id
+ | scoped_id attributes
+ | built_in_type_specifier
+ '''
+ p[0] = p[1]
+
+def p_built_in_type_specifier(p):
+ '''built_in_type_specifier : Xbuilt_in_type_specifier
+ | Xbuilt_in_type_specifier attributes
+ '''
+ pass
+
+def p_attributes(p):
+ '''attributes : attribute
+ | attributes attribute
+ '''
+ pass
+
+def p_attribute(p):
+ '''attribute : ATTRIBUTE '(' parameters_clause ')'
+ '''
+
+def p_Xbuilt_in_type_specifier(p):
+ '''Xbuilt_in_type_specifier : CHAR
+ | WCHAR_T
+ | BOOL
+ | SHORT
+ | INT
+ | LONG
+ | SIGNED
+ | UNSIGNED
+ | FLOAT
+ | DOUBLE
+ | VOID
+ | uTYPEOF parameters_clause
+ | TYPEOF parameters_clause
+ '''
+ pass
+
+#
+# The over-general use of declaration_expression to cover decl-specifier-seq_opt declarator in a function-definition means that
+# class X { };
+# could be a function-definition or a class-specifier.
+# enum X { };
+# could be a function-definition or an enum-specifier.
+# The function-definition is not syntactically valid so resolving the false conflict in favour of the
+# elaborated_type_specifier is correct.
+#
+def p_elaborated_type_specifier(p):
+ '''elaborated_type_specifier : class_key scoped_id %prec SHIFT_THERE
+ | elaborated_enum_specifier
+ | TYPENAME scoped_id
+ '''
+ pass
+
+def p_elaborated_enum_specifier(p):
+ '''elaborated_enum_specifier : ENUM scoped_id %prec SHIFT_THERE
+ '''
+ pass
+
+def p_enum_specifier(p):
+ '''enum_specifier : ENUM scoped_id enumerator_clause
+ | ENUM enumerator_clause
+ '''
+ pass
+
+def p_enumerator_clause(p):
+ '''enumerator_clause : LBRACE enumerator_list_ecarb
+ | LBRACE enumerator_list enumerator_list_ecarb
+ | LBRACE enumerator_list ',' enumerator_definition_ecarb
+ '''
+ pass
+
+def p_enumerator_list_ecarb(p):
+ '''enumerator_list_ecarb : RBRACE
+ '''
+ pass
+
+def p_enumerator_definition_ecarb(p):
+ '''enumerator_definition_ecarb : RBRACE
+ '''
+ pass
+
+def p_enumerator_definition_filler(p):
+ '''enumerator_definition_filler : empty
+ '''
+ pass
+
+def p_enumerator_list_head(p):
+ '''enumerator_list_head : enumerator_definition_filler
+ | enumerator_list ',' enumerator_definition_filler
+ '''
+ pass
+
+def p_enumerator_list(p):
+ '''enumerator_list : enumerator_list_head enumerator_definition
+ '''
+ pass
+
+def p_enumerator_definition(p):
+ '''enumerator_definition : enumerator
+ | enumerator '=' constant_expression
+ '''
+ pass
+
+def p_enumerator(p):
+ '''enumerator : identifier
+ '''
+ pass
+
+def p_namespace_definition(p):
+ '''namespace_definition : NAMESPACE scoped_id push_scope compound_declaration
+ | NAMESPACE push_scope compound_declaration
+ '''
+ global _parse_info
+ scope = _parse_info.pop_scope()
+
+def p_namespace_alias_definition(p):
+ '''namespace_alias_definition : NAMESPACE scoped_id '=' scoped_id ';'
+ '''
+ pass
+
+def p_push_scope(p):
+ '''push_scope : empty'''
+ global _parse_info
+ if p[-2] == "namespace":
+ scope=p[-1]
+ else:
+ scope=""
+ _parse_info.push_scope(scope,"namespace")
+
+def p_using_declaration(p):
+ '''using_declaration : USING declarator_id ';'
+ | USING TYPENAME declarator_id ';'
+ '''
+ pass
+
+def p_using_directive(p):
+ '''using_directive : USING NAMESPACE scoped_id ';'
+ '''
+ pass
+
+# '''asm_definition : ASM '(' StringLiteral ')' ';'
+def p_asm_definition(p):
+ '''asm_definition : ASM '(' nonparen_seq_opt ')' ';'
+ '''
+ pass
+
+def p_linkage_specification(p):
+ '''linkage_specification : EXTERN CLiteral declaration
+ | EXTERN CLiteral compound_declaration
+ | EXTERN CppLiteral declaration
+ | EXTERN CppLiteral compound_declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.7 Declarators
+#---------------------------------------------------------------------------------------------------
+#
+# init-declarator is named init_declaration to reflect the embedded decl-specifier-seq_opt
+#
+
+def p_init_declarations(p):
+ '''init_declarations : assignment_expression ',' init_declaration
+ | init_declarations ',' init_declaration
+ '''
+ p[0]=get_rest(p)
+
+def p_init_declaration(p):
+ '''init_declaration : assignment_expression
+ '''
+ p[0]=get_rest(p)
+
+def p_star_ptr_operator(p):
+ '''star_ptr_operator : '*'
+ | star_ptr_operator cv_qualifier
+ '''
+ pass
+
+def p_nested_ptr_operator(p):
+ '''nested_ptr_operator : star_ptr_operator
+ | id_scope nested_ptr_operator
+ '''
+ pass
+
+def p_ptr_operator(p):
+ '''ptr_operator : '&'
+ | nested_ptr_operator
+ | global_scope nested_ptr_operator
+ '''
+ pass
+
+def p_ptr_operator_seq(p):
+ '''ptr_operator_seq : ptr_operator
+ | ptr_operator ptr_operator_seq
+ '''
+ pass
+
+#
+# Independently coded to localise the shift-reduce conflict: sharing just needs another %prec
+#
+def p_ptr_operator_seq_opt(p):
+ '''ptr_operator_seq_opt : empty %prec SHIFT_THERE
+ | ptr_operator ptr_operator_seq_opt
+ '''
+ pass
+
+def p_cv_qualifier_seq_opt(p):
+ '''cv_qualifier_seq_opt : empty
+ | cv_qualifier_seq_opt cv_qualifier
+ '''
+ pass
+
+# TODO: verify that we should include attributes here
+def p_cv_qualifier(p):
+ '''cv_qualifier : CONST
+ | VOLATILE
+ | attributes
+ '''
+ pass
+
+def p_type_id(p):
+ '''type_id : type_specifier abstract_declarator_opt
+ | type_specifier type_id
+ '''
+ pass
+
+def p_abstract_declarator_opt(p):
+ '''abstract_declarator_opt : empty
+ | ptr_operator abstract_declarator_opt
+ | direct_abstract_declarator
+ '''
+ pass
+
+def p_direct_abstract_declarator_opt(p):
+ '''direct_abstract_declarator_opt : empty
+ | direct_abstract_declarator
+ '''
+ pass
+
+def p_direct_abstract_declarator(p):
+ '''direct_abstract_declarator : direct_abstract_declarator_opt parenthesis_clause
+ | direct_abstract_declarator_opt LBRACKET RBRACKET
+ | direct_abstract_declarator_opt LBRACKET bexpression RBRACKET
+ '''
+ pass
+
+def p_parenthesis_clause(p):
+ '''parenthesis_clause : parameters_clause cv_qualifier_seq_opt
+ | parameters_clause cv_qualifier_seq_opt exception_specification
+ '''
+ p[0] = ['(',')']
+
+def p_parameters_clause(p):
+ '''parameters_clause : '(' condition_opt ')'
+ '''
+ p[0] = ['(',')']
+
+#
+# A typed abstract qualifier such as
+# Class * ...
+# looks like a multiply, so pointers are parsed as their binary operation equivalents that
+# ultimately terminate with a degenerate right hand term.
+#
+def p_abstract_pointer_declaration(p):
+ '''abstract_pointer_declaration : ptr_operator_seq
+ | multiplicative_expression star_ptr_operator ptr_operator_seq_opt
+ '''
+ pass
+
+def p_abstract_parameter_declaration(p):
+ '''abstract_parameter_declaration : abstract_pointer_declaration
+ | and_expression '&'
+ | and_expression '&' abstract_pointer_declaration
+ '''
+ pass
+
+def p_special_parameter_declaration(p):
+ '''special_parameter_declaration : abstract_parameter_declaration
+ | abstract_parameter_declaration '=' assignment_expression
+ | ELLIPSIS
+ '''
+ pass
+
+def p_parameter_declaration(p):
+ '''parameter_declaration : assignment_expression
+ | special_parameter_declaration
+ | decl_specifier_prefix parameter_declaration
+ '''
+ pass
+
+#
+# function_definition includes constructor, destructor, implicit int definitions too. A local destructor is successfully parsed as a function-declaration but the ~ was treated as a unary operator. constructor_head is the prefix ambiguity between a constructor and a member-init-list starting with a bit-field.
+#
+def p_function_definition(p):
+ '''function_definition : ctor_definition
+ | func_definition
+ '''
+ pass
+
+def p_func_definition(p):
+ '''func_definition : assignment_expression function_try_block
+ | assignment_expression function_body
+ | decl_specifier_prefix func_definition
+ '''
+ global _parse_info
+ if p[2] is not None and p[2][0] == '{':
+ decl = flatten(p[1])
+ #print "HERE",decl
+ if decl[-1] == ')':
+ decl=decl[-3]
+ else:
+ decl=decl[-1]
+ p[0] = decl
+ if decl != "operator":
+ _parse_info.add_function(decl)
+ else:
+ p[0] = p[2]
+
+def p_ctor_definition(p):
+ '''ctor_definition : constructor_head function_try_block
+ | constructor_head function_body
+ | decl_specifier_prefix ctor_definition
+ '''
+ if p[2] is None or p[2][0] == "try" or p[2][0] == '{':
+ p[0]=p[1]
+ else:
+ p[0]=p[1]
+
+def p_constructor_head(p):
+ '''constructor_head : bit_field_init_declaration
+ | constructor_head ',' assignment_expression
+ '''
+ p[0]=p[1]
+
+def p_function_try_block(p):
+ '''function_try_block : TRY function_block handler_seq
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+ p[0] = ['try']
+
+def p_function_block(p):
+ '''function_block : ctor_initializer_opt function_body
+ '''
+ pass
+
+def p_function_body(p):
+ '''function_body : LBRACE nonbrace_seq_opt RBRACE
+ '''
+ p[0] = ['{','}']
+
+def p_initializer_clause(p):
+ '''initializer_clause : assignment_expression
+ | braced_initializer
+ '''
+ pass
+
+def p_braced_initializer(p):
+ '''braced_initializer : LBRACE initializer_list RBRACE
+ | LBRACE initializer_list ',' RBRACE
+ | LBRACE RBRACE
+ '''
+ pass
+
+def p_initializer_list(p):
+ '''initializer_list : initializer_clause
+ | initializer_list ',' initializer_clause
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.8 Classes
+#---------------------------------------------------------------------------------------------------
+#
+# An anonymous bit-field declaration may look very like inheritance:
+# const int B = 3;
+# class A : B ;
+# The two usages are too distant to try to create and enforce a common prefix so we have to resort to
+# a parser hack by backtracking. Inheritance is much the most likely so we mark the input stream context
+# and try to parse a base-clause. If we successfully reach a { the base-clause is ok and inheritance was
+# the correct choice so we unmark and continue. If we fail to find the { an error token causes
+# back-tracking to the alternative parse in elaborated_type_specifier which regenerates the : and
+# declares unconditional success.
+#
+
+def p_class_specifier_head(p):
+ '''class_specifier_head : class_key scoped_id ':' base_specifier_list LBRACE
+ | class_key ':' base_specifier_list LBRACE
+ | class_key scoped_id LBRACE
+ | class_key LBRACE
+ '''
+ global _parse_info
+ base_classes=[]
+ if len(p) == 6:
+ scope = p[2]
+ base_classes = p[4]
+ elif len(p) == 4:
+ scope = p[2]
+ elif len(p) == 5:
+ base_classes = p[3]
+ else:
+ scope = ""
+ _parse_info.push_scope(scope,p[1],base_classes)
+
+
+def p_class_key(p):
+ '''class_key : CLASS
+ | STRUCT
+ | UNION
+ '''
+ p[0] = p[1]
+
+def p_class_specifier(p):
+ '''class_specifier : class_specifier_head member_specification_opt RBRACE
+ '''
+ scope = _parse_info.pop_scope()
+
+def p_member_specification_opt(p):
+ '''member_specification_opt : empty
+ | member_specification_opt member_declaration
+ '''
+ pass
+
+def p_member_declaration(p):
+ '''member_declaration : accessibility_specifier
+ | simple_member_declaration
+ | function_definition
+ | using_declaration
+ | template_declaration
+ '''
+ p[0] = get_rest(p)
+ #print "Decl",get_rest(p)
+
+#
+# The generality of constructor names (there need be no parenthesised argument list) means that that
+# name : f(g), h(i)
+# could be the start of a constructor or the start of an anonymous bit-field. An ambiguity is avoided by
+# parsing the ctor-initializer of a function_definition as a bit-field.
+#
+def p_simple_member_declaration(p):
+ '''simple_member_declaration : ';'
+ | assignment_expression ';'
+ | constructor_head ';'
+ | member_init_declarations ';'
+ | decl_specifier_prefix simple_member_declaration
+ '''
+ global _parse_info
+ decl = flatten(get_rest(p))
+ if len(decl) >= 4 and decl[-3] == "(":
+ _parse_info.add_function(decl[-4])
+
+def p_member_init_declarations(p):
+ '''member_init_declarations : assignment_expression ',' member_init_declaration
+ | constructor_head ',' bit_field_init_declaration
+ | member_init_declarations ',' member_init_declaration
+ '''
+ pass
+
+def p_member_init_declaration(p):
+ '''member_init_declaration : assignment_expression
+ | bit_field_init_declaration
+ '''
+ pass
+
+def p_accessibility_specifier(p):
+ '''accessibility_specifier : access_specifier ':'
+ '''
+ pass
+
+def p_bit_field_declaration(p):
+ '''bit_field_declaration : assignment_expression ':' bit_field_width
+ | ':' bit_field_width
+ '''
+ if len(p) == 4:
+ p[0]=p[1]
+
+def p_bit_field_width(p):
+ '''bit_field_width : logical_or_expression
+ | logical_or_expression '?' bit_field_width ':' bit_field_width
+ '''
+ pass
+
+def p_bit_field_init_declaration(p):
+ '''bit_field_init_declaration : bit_field_declaration
+ | bit_field_declaration '=' initializer_clause
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.9 Derived classes
+#---------------------------------------------------------------------------------------------------
+def p_base_specifier_list(p):
+ '''base_specifier_list : base_specifier
+ | base_specifier_list ',' base_specifier
+ '''
+ if len(p) == 2:
+ p[0] = [p[1]]
+ else:
+ p[0] = p[1]+[p[3]]
+
+def p_base_specifier(p):
+ '''base_specifier : scoped_id
+ | access_specifier base_specifier
+ | VIRTUAL base_specifier
+ '''
+ if len(p) == 2:
+ p[0] = p[1]
+ else:
+ p[0] = p[2]
+
+def p_access_specifier(p):
+ '''access_specifier : PRIVATE
+ | PROTECTED
+ | PUBLIC
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.10 Special member functions
+#---------------------------------------------------------------------------------------------------
+def p_conversion_function_id(p):
+ '''conversion_function_id : OPERATOR conversion_type_id
+ '''
+ p[0] = ['operator']
+
+def p_conversion_type_id(p):
+ '''conversion_type_id : type_specifier ptr_operator_seq_opt
+ | type_specifier conversion_type_id
+ '''
+ pass
+
+#
+# Ctor-initialisers can look like a bit field declaration, given the generalisation of names:
+# Class(Type) : m1(1), m2(2) { }
+# NonClass(bit_field) : int(2), second_variable, ...
+# The grammar below is used within a function_try_block or function_definition.
+# See simple_member_declaration for use in normal member function_definition.
+#
+def p_ctor_initializer_opt(p):
+ '''ctor_initializer_opt : empty
+ | ctor_initializer
+ '''
+ pass
+
+def p_ctor_initializer(p):
+ '''ctor_initializer : ':' mem_initializer_list
+ '''
+ pass
+
+def p_mem_initializer_list(p):
+ '''mem_initializer_list : mem_initializer
+ | mem_initializer_list_head mem_initializer
+ '''
+ pass
+
+def p_mem_initializer_list_head(p):
+ '''mem_initializer_list_head : mem_initializer_list ','
+ '''
+ pass
+
+def p_mem_initializer(p):
+ '''mem_initializer : mem_initializer_id '(' expression_list_opt ')'
+ '''
+ pass
+
+def p_mem_initializer_id(p):
+ '''mem_initializer_id : scoped_id
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.11 Overloading
+#---------------------------------------------------------------------------------------------------
+
+def p_operator_function_id(p):
+ '''operator_function_id : OPERATOR operator
+ | OPERATOR '(' ')'
+ | OPERATOR LBRACKET RBRACKET
+ | OPERATOR '<'
+ | OPERATOR '>'
+ | OPERATOR operator '<' nonlgt_seq_opt '>'
+ '''
+ p[0] = ["operator"]
+
+#
+# It is not clear from the ANSI standard whether spaces are permitted in delete[]. If not then it can
+# be recognised and returned as DELETE_ARRAY by the lexer. Assuming spaces are permitted there is an
+# ambiguity created by the over generalised nature of expressions. operator new is a valid delarator-id
+# which we may have an undimensioned array of. Semantic rubbish, but syntactically valid. Since the
+# array form is covered by the declarator consideration we can exclude the operator here. The need
+# for a semantic rescue can be eliminated at the expense of a couple of shift-reduce conflicts by
+# removing the comments on the next four lines.
+#
+def p_operator(p):
+ '''operator : NEW
+ | DELETE
+ | '+'
+ | '-'
+ | '*'
+ | '/'
+ | '%'
+ | '^'
+ | '&'
+ | '|'
+ | '~'
+ | '!'
+ | '='
+ | ASS_ADD
+ | ASS_SUB
+ | ASS_MUL
+ | ASS_DIV
+ | ASS_MOD
+ | ASS_XOR
+ | ASS_AND
+ | ASS_OR
+ | SHL
+ | SHR
+ | ASS_SHR
+ | ASS_SHL
+ | EQ
+ | NE
+ | LE
+ | GE
+ | LOG_AND
+ | LOG_OR
+ | INC
+ | DEC
+ | ','
+ | ARROW_STAR
+ | ARROW
+ '''
+ p[0]=p[1]
+
+# | IF
+# | SWITCH
+# | WHILE
+# | FOR
+# | DO
+def p_reserved(p):
+ '''reserved : PRIVATE
+ | CLiteral
+ | CppLiteral
+ | IF
+ | SWITCH
+ | WHILE
+ | FOR
+ | DO
+ | PROTECTED
+ | PUBLIC
+ | BOOL
+ | CHAR
+ | DOUBLE
+ | FLOAT
+ | INT
+ | LONG
+ | SHORT
+ | SIGNED
+ | UNSIGNED
+ | VOID
+ | WCHAR_T
+ | CLASS
+ | ENUM
+ | NAMESPACE
+ | STRUCT
+ | TYPENAME
+ | UNION
+ | CONST
+ | VOLATILE
+ | AUTO
+ | EXPLICIT
+ | EXPORT
+ | EXTERN
+ | FRIEND
+ | INLINE
+ | MUTABLE
+ | REGISTER
+ | STATIC
+ | TEMPLATE
+ | TYPEDEF
+ | USING
+ | VIRTUAL
+ | ASM
+ | BREAK
+ | CASE
+ | CATCH
+ | CONST_CAST
+ | CONTINUE
+ | DEFAULT
+ | DYNAMIC_CAST
+ | ELSE
+ | FALSE
+ | GOTO
+ | OPERATOR
+ | REINTERPRET_CAST
+ | RETURN
+ | SIZEOF
+ | STATIC_CAST
+ | THIS
+ | THROW
+ | TRUE
+ | TRY
+ | TYPEID
+ | ATTRIBUTE
+ | CDECL
+ | TYPEOF
+ | uTYPEOF
+ '''
+ if p[1] in ('try', 'catch', 'throw'):
+ global noExceptionLogic
+ noExceptionLogic=False
+
+#---------------------------------------------------------------------------------------------------
+# A.12 Templates
+#---------------------------------------------------------------------------------------------------
+def p_template_declaration(p):
+ '''template_declaration : template_parameter_clause declaration
+ | EXPORT template_declaration
+ '''
+ pass
+
+def p_template_parameter_clause(p):
+ '''template_parameter_clause : TEMPLATE '<' nonlgt_seq_opt '>'
+ '''
+ pass
+
+#
+# Generalised naming makes identifier a valid declaration, so TEMPLATE identifier is too.
+# The TEMPLATE prefix is therefore folded into all names, parenthesis_clause and decl_specifier_prefix.
+#
+# explicit_instantiation: TEMPLATE declaration
+#
+def p_explicit_specialization(p):
+ '''explicit_specialization : TEMPLATE '<' '>' declaration
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# A.13 Exception Handling
+#---------------------------------------------------------------------------------------------------
+def p_handler_seq(p):
+ '''handler_seq : handler
+ | handler handler_seq
+ '''
+ pass
+
+def p_handler(p):
+ '''handler : CATCH '(' exception_declaration ')' compound_statement
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_exception_declaration(p):
+ '''exception_declaration : parameter_declaration
+ '''
+ pass
+
+def p_throw_expression(p):
+ '''throw_expression : THROW
+ | THROW assignment_expression
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_exception_specification(p):
+ '''exception_specification : THROW '(' ')'
+ | THROW '(' type_id_list ')'
+ '''
+ global noExceptionLogic
+ noExceptionLogic=False
+
+def p_type_id_list(p):
+ '''type_id_list : type_id
+ | type_id_list ',' type_id
+ '''
+ pass
+
+#---------------------------------------------------------------------------------------------------
+# Misc productions
+#---------------------------------------------------------------------------------------------------
+def p_nonsemicolon_seq(p):
+ '''nonsemicolon_seq : empty
+ | nonsemicolon_seq nonsemicolon
+ '''
+ pass
+
+def p_nonsemicolon(p):
+ '''nonsemicolon : misc
+ | '('
+ | ')'
+ | '<'
+ | '>'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonparen_seq_opt(p):
+ '''nonparen_seq_opt : empty
+ | nonparen_seq_opt nonparen
+ '''
+ pass
+
+def p_nonparen_seq(p):
+ '''nonparen_seq : nonparen
+ | nonparen_seq nonparen
+ '''
+ pass
+
+def p_nonparen(p):
+ '''nonparen : misc
+ | '<'
+ | '>'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonbracket_seq_opt(p):
+ '''nonbracket_seq_opt : empty
+ | nonbracket_seq_opt nonbracket
+ '''
+ pass
+
+def p_nonbracket_seq(p):
+ '''nonbracket_seq : nonbracket
+ | nonbracket_seq nonbracket
+ '''
+ pass
+
+def p_nonbracket(p):
+ '''nonbracket : misc
+ | '<'
+ | '>'
+ | '('
+ | ')'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonbrace_seq_opt(p):
+ '''nonbrace_seq_opt : empty
+ | nonbrace_seq_opt nonbrace
+ '''
+ pass
+
+def p_nonbrace(p):
+ '''nonbrace : misc
+ | '<'
+ | '>'
+ | '('
+ | ')'
+ | ';'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | LBRACE nonbrace_seq_opt RBRACE
+ '''
+ pass
+
+def p_nonlgt_seq_opt(p):
+ '''nonlgt_seq_opt : empty
+ | nonlgt_seq_opt nonlgt
+ '''
+ pass
+
+def p_nonlgt(p):
+ '''nonlgt : misc
+ | '('
+ | ')'
+ | LBRACKET nonbracket_seq_opt RBRACKET
+ | '<' nonlgt_seq_opt '>'
+ | ';'
+ '''
+ pass
+
+def p_misc(p):
+ '''misc : operator
+ | identifier
+ | IntegerLiteral
+ | CharacterLiteral
+ | FloatingLiteral
+ | StringLiteral
+ | reserved
+ | '?'
+ | ':'
+ | '.'
+ | SCOPE
+ | ELLIPSIS
+ | EXTENSION
+ '''
+ pass
+
+def p_empty(p):
+ '''empty : '''
+ pass
+
+
+
+#
+# Compute column.
+# input is the input text string
+# token is a token instance
+#
+def _find_column(input,token):
+ ''' TODO '''
+ i = token.lexpos
+ while i > 0:
+ if input[i] == '\n': break
+ i -= 1
+ column = (token.lexpos - i)+1
+ return column
+
+def p_error(p):
+ if p is None:
+ tmp = "Syntax error at end of file."
+ else:
+ tmp = "Syntax error at token "
+ if p.type is "":
+ tmp = tmp + "''"
+ else:
+ tmp = tmp + str(p.type)
+ tmp = tmp + " with value '"+str(p.value)+"'"
+ tmp = tmp + " in line " + str(lexer.lineno-1)
+ tmp = tmp + " at column "+str(_find_column(_parsedata,p))
+ raise IOError( tmp )
+
+
+
+#
+# The function that performs the parsing
+#
+def parse_cpp(data=None, filename=None, debug=0, optimize=0, verbose=False, func_filter=None):
+ if debug > 0:
+ print("Debugging parse_cpp!")
+ #
+ # Always remove the parser.out file, which is generated to create debugging
+ #
+ if os.path.exists("parser.out"):
+ os.remove("parser.out")
+ #
+ # Remove the parsetab.py* files. These apparently need to be removed
+ # to ensure the creation of a parser.out file.
+ #
+ if os.path.exists("parsetab.py"):
+ os.remove("parsetab.py")
+ if os.path.exists("parsetab.pyc"):
+ os.remove("parsetab.pyc")
+ global debugging
+ debugging=True
+ #
+ # Build lexer
+ #
+ global lexer
+ lexer = lex.lex()
+ #
+ # Initialize parse object
+ #
+ global _parse_info
+ _parse_info = CppInfo(filter=func_filter)
+ _parse_info.verbose=verbose
+ #
+ # Build yaccer
+ #
+ write_table = not os.path.exists("parsetab.py")
+ yacc.yacc(debug=debug, optimize=optimize, write_tables=write_table)
+ #
+ # Parse the file
+ #
+ global _parsedata
+ if not data is None:
+ _parsedata=data
+ ply_init(_parsedata)
+ yacc.parse(data,debug=debug)
+ elif not filename is None:
+ f = open(filename)
+ data = f.read()
+ f.close()
+ _parsedata=data
+ ply_init(_parsedata)
+ yacc.parse(data, debug=debug)
+ else:
+ return None
+ #
+ if not noExceptionLogic:
+ _parse_info.noExceptionLogic = False
+ else:
+ for key in identifier_lineno:
+ if 'ASSERT_THROWS' in key:
+ _parse_info.noExceptionLogic = False
+ break
+ _parse_info.noExceptionLogic = True
+ #
+ return _parse_info
+
+
+
+import sys
+
+if __name__ == '__main__':
+ #
+ # This MAIN routine parses a sequence of files provided at the command
+ # line. If '-v' is included, then a verbose parsing output is
+ # generated.
+ #
+ for arg in sys.argv[1:]:
+ if arg == "-v":
+ continue
+ print("Parsing file '"+arg+"'")
+ if '-v' in sys.argv:
+ parse_cpp(filename=arg,debug=2,verbose=2)
+ else:
+ parse_cpp(filename=arg,verbose=2)
+ #
+ # Print the _parse_info object summary for this file.
+ # This illustrates how class inheritance can be used to
+ # deduce class members.
+ #
+ print(str(_parse_info))
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+#
+# TODO: add line number info
+# TODO: add test function names
+#
+
+
+
+import sys
+import re
+#from os.path import abspath, dirname
+#sys.path.insert(0, dirname(dirname(abspath(__file__))))
+#sys.path.insert(0, dirname(dirname(abspath(__file__)))+"/cxx_parse")
+from .cxxtest_misc import abort
+from . import cxx_parser
+import re
+
+def cstr( str ):
+ '''Convert a string to its C representation'''
+ return '"' + re.sub('\\\\', '\\\\\\\\', str ) + '"'
+
+def scanInputFiles(files, _options):
+ '''Scan all input files for test suites'''
+ suites=[]
+ for file in files:
+ try:
+ print("Parsing file "+file, end=' ')
+ sys.stdout.flush()
+ parse_info = cxx_parser.parse_cpp(filename=file,optimize=1)
+ except IOError as err:
+ print(" error.")
+ print(str(err))
+ continue
+ print("done.")
+ sys.stdout.flush()
+ #
+ # WEH: see if it really makes sense to use parse information to
+ # initialize this data. I don't think so...
+ #
+ _options.haveStandardLibrary=1
+ if not parse_info.noExceptionLogic:
+ _options.haveExceptionHandling=1
+ #
+ keys = list(parse_info.index.keys())
+ tpat = re.compile("[Tt][Ee][Ss][Tt]")
+ for key in keys:
+ if parse_info.index[key].scope_t == "class" and parse_info.is_baseclass(key,"CxxTest::TestSuite"):
+ name=parse_info.index[key].name
+ suite = { 'name' : name,
+ 'file' : file,
+ 'cfile' : cstr(file),
+ 'line' : str(parse_info.index[key].lineno),
+ 'generated' : 0,
+ 'object' : 'suite_%s' % name,
+ 'dobject' : 'suiteDescription_%s' % name,
+ 'tlist' : 'Tests_%s' % name,
+ 'tests' : [],
+ 'lines' : [] }
+ for fn in parse_info.get_functions(key,quiet=True):
+ tname = fn[0]
+ lineno = str(fn[1])
+ if tname.startswith('createSuite'):
+ # Indicate that we're using a dynamically generated test suite
+ suite['create'] = str(lineno) # (unknown line)
+ if tname.startswith('destroySuite'):
+ # Indicate that we're using a dynamically generated test suite
+ suite['destroy'] = str(lineno) # (unknown line)
+ if not tpat.match(tname):
+ # Skip non-test methods
+ continue
+ test = { 'name' : tname,
+ 'suite' : suite,
+ 'class' : 'TestDescription_suite_%s_%s' % (suite['name'], tname),
+ 'object' : 'testDescription_suite_%s_%s' % (suite['name'], tname),
+ 'line' : lineno,
+ }
+ suite['tests'].append(test)
+ suites.append(suite)
+
+ if not _options.root:
+ ntests = 0
+ for suite in suites:
+ ntests += len(suite['tests'])
+ if ntests == 0:
+ abort( 'No tests defined' )
+ #
+ return [_options, suites]
+
--- /dev/null
+#!/usr/bin/python
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+import sys
+
+def abort( problem ):
+ '''Print error message and exit'''
+ sys.stderr.write( '\n' )
+ sys.stderr.write( problem )
+ sys.stderr.write( '\n\n' )
+ sys.exit(2)
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+
+
+import codecs
+import re
+#import sys
+#import getopt
+#import glob
+from cxxtest.cxxtest_misc import abort
+
+# Global variables
+suites = []
+suite = None
+inBlock = 0
+options=None
+
+def scanInputFiles(files, _options):
+ '''Scan all input files for test suites'''
+ global options
+ options=_options
+ for file in files:
+ scanInputFile(file)
+ global suites
+ if len(suites) is 0 and not options.root:
+ abort( 'No tests defined' )
+ return [options,suites]
+
+lineCont_re = re.compile('(.*)\\\s*$')
+def scanInputFile(fileName):
+ '''Scan single input file for test suites'''
+ # mode 'rb' is problematic in python3 - byte arrays don't behave the same as
+ # strings.
+ # As far as the choice of the default encoding: utf-8 chews through
+ # everything that the previous ascii codec could, plus most of new code.
+ # TODO: figure out how to do this properly - like autodetect encoding from
+ # file header.
+ file = codecs.open(fileName, mode='r', encoding='utf-8')
+ prev = ""
+ lineNo = 0
+ contNo = 0
+ while 1:
+ line = file.readline()
+ if not line:
+ break
+ lineNo += 1
+
+ m = lineCont_re.match(line)
+ if m:
+ prev += m.group(1) + " "
+ contNo += 1
+ else:
+ scanInputLine( fileName, lineNo - contNo, prev + line )
+ contNo = 0
+ prev = ""
+ if contNo:
+ scanInputLine( fileName, lineNo - contNo, prev + 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 options
+ if not options.haveStandardLibrary and std_re.search(line):
+ if not options.noStandardLibrary:
+ options.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 options
+ if not options.haveExceptionHandling and exception_re.search(line):
+ if not options.noExceptionHandling:
+ options.haveExceptionHandling = 1
+
+classdef = '(?:::\s*)?(?:\w+\s*::\s*)*\w+'
+baseclassdef = '(?:public|private|protected)\s+%s' % (classdef,)
+general_suite = r"\bclass\s+(%s)\s*:(?:\s*%s\s*,)*\s*public\s+" \
+ % (classdef, baseclassdef,)
+testsuite = '(?:(?:::)?\s*CxxTest\s*::\s*)?TestSuite'
+suites_re = { re.compile( general_suite + testsuite ) : None }
+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'''
+ for i in list(suites_re.items()):
+ m = i[0].search( line )
+ if m:
+ suite = startSuite( m.group(1), fileName, lineNo, 0 )
+ if i[1] is not None:
+ for test in i[1]['tests']:
+ addTest(suite, test['name'], test['line'])
+ break
+ 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()
+ object_name = name.replace(':',"_")
+ suite = { 'name' : name,
+ 'file' : file,
+ 'cfile' : cstr(file),
+ 'line' : line,
+ 'generated' : generated,
+ 'object' : 'suite_%s' % object_name,
+ 'dobject' : 'suiteDescription_%s' % object_name,
+ 'tlist' : 'Tests_%s' % object_name,
+ 'tests' : [],
+ 'lines' : [] }
+ suites_re[re.compile( general_suite + name )] = suite
+ return suite
+
+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['object'], name),
+ 'object' : 'testDescription_%s_%s' % (suite['object'], 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( s ):
+ '''Convert a string to its C representation'''
+ return '"' + s.replace( '\\', '\\\\' ) + '"'
+
+
+def addSuiteCreateDestroy( suite, which, line ):
+ '''Add createSuite()/destroySuite() to current suite'''
+ if which in suite:
+ 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 'create' in suite and 'destroy' not in suite:
+ abort( '%s:%s: Suite %s has createSuite() but no destroySuite()' %
+ (suite['file'], suite['create'], suite['name']) )
+ elif 'destroy' in suite and 'create' not in suite:
+ 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 )
+
--- /dev/null
+#-------------------------------------------------------------------------
+# CxxTest: A lightweight C++ unit testing library.
+# Copyright (c) 2008 Sandia Corporation.
+# This software is distributed under the LGPL License v2.1
+# For more information, see the COPYING file in the top CxxTest directory.
+# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+# the U.S. Government retains certain rights in this software.
+#-------------------------------------------------------------------------
+
+# vim: fileencoding=utf-8
+
+
+# the above import important for forward-compatibility with python3,
+# which is already the default in archlinux!
+
+__all__ = ['main']
+
+from . import __release__
+import os
+import sys
+import re
+import glob
+from optparse import OptionParser
+from . import cxxtest_parser
+
+try:
+ from . import cxxtest_fog
+ imported_fog=True
+except ImportError:
+ imported_fog=False
+
+from .cxxtest_misc import abort
+
+options = []
+suites = []
+
+wrotePreamble = 0
+wroteWorld = 0
+lastIncluded = ''
+
+def main(args=sys.argv):
+ '''The main program'''
+ #
+ # Reset global state
+ #
+ global wrotePreamble
+ wrotePreamble=0
+ global wroteWorld
+ wroteWorld=0
+ global lastIncluded
+ lastIncluded = ''
+
+ global suites
+ global options
+ files = parseCommandline(args)
+ if imported_fog and options.fog:
+ [options,suites] = cxxtest_fog.scanInputFiles( files, options )
+ else:
+ [options,suites] = cxxtest_parser.scanInputFiles( files, options )
+ writeOutput()
+
+def parseCommandline(args):
+ '''Analyze command line arguments'''
+ global imported_fog
+ global options
+ parser = OptionParser("%prog [options] [<filename> ...]")
+ parser.add_option("--version",
+ action="store_true", dest="version", default=False,
+ help="Write the CxxTest version.")
+ parser.add_option("-o", "--output",
+ dest="outputFileName", default=None, metavar="NAME",
+ help="Write output to file NAME.")
+ parser.add_option("-w","--world", dest="world", default="cxxtest",
+ help="The label of the tests, used to name the XML results.")
+ parser.add_option("", "--include", action="append",
+ dest="headers", default=[], metavar="HEADER",
+ help="Include file HEADER in the test runner before other headers.")
+ parser.add_option("", "--abort-on-fail",
+ action="store_true", dest="abortOnFail", default=False,
+ help="Abort tests on failed asserts (like xUnit).")
+ parser.add_option("", "--main",
+ action="store", dest="main", default="main",
+ help="Specify an alternative name for the main() function.")
+ parser.add_option("", "--headers",
+ action="store", dest="header_filename", default=None,
+ help="Specify a filename that contains a list of header files that are processed to generate a test runner.")
+ parser.add_option("", "--runner",
+ dest="runner", default="", metavar="CLASS",
+ help="Create a test runner that processes test events using the class CxxTest::CLASS.")
+ parser.add_option("", "--gui",
+ dest="gui", metavar="CLASS",
+ help="Create a GUI test runner that processes test events using the class CxxTest::CLASS. (deprecated)")
+ parser.add_option("", "--error-printer",
+ action="store_true", dest="error_printer", default=False,
+ help="Create a test runner using the ErrorPrinter class, and allow the use of the standard library.")
+ parser.add_option("", "--xunit-printer",
+ action="store_true", dest="xunit_printer", default=False,
+ help="Create a test runner using the XUnitPrinter class.")
+ parser.add_option("", "--xunit-file", dest="xunit_file", default="",
+ help="The file to which the XML summary is written for test runners using the XUnitPrinter class. The default XML filename is TEST-<world>.xml, where <world> is the value of the --world option. (default: cxxtest)")
+ parser.add_option("", "--have-std",
+ action="store_true", dest="haveStandardLibrary", default=False,
+ help="Use the standard library (even if not found in tests).")
+ parser.add_option("", "--no-std",
+ action="store_true", dest="noStandardLibrary", default=False,
+ help="Do not use standard library (even if found in tests).")
+ parser.add_option("", "--have-eh",
+ action="store_true", dest="haveExceptionHandling", default=False,
+ help="Use exception handling (even if not found in tests).")
+ parser.add_option("", "--no-eh",
+ action="store_true", dest="noExceptionHandling", default=False,
+ help="Do not use exception handling (even if found in tests).")
+ parser.add_option("", "--longlong",
+ dest="longlong", default=None, metavar="TYPE",
+ help="Use TYPE as for long long integers. (default: not supported)")
+ parser.add_option("", "--no-static-init",
+ action="store_true", dest="noStaticInit", default=False,
+ help="Do not rely on static initialization in the test runner.")
+ parser.add_option("", "--template",
+ dest="templateFileName", default=None, metavar="TEMPLATE",
+ help="Generate the test runner using file TEMPLATE to define a template.")
+ parser.add_option("", "--root",
+ action="store_true", dest="root", default=False,
+ help="Write the main() function and global data for a test runner.")
+ parser.add_option("", "--part",
+ action="store_true", dest="part", default=False,
+ help="Write the tester classes for a test runner.")
+ #parser.add_option("", "--factor",
+ #action="store_true", dest="factor", default=False,
+ #help="Declare the _CXXTEST_FACTOR macro. (deprecated)")
+ if imported_fog:
+ fog_help = "Use new FOG C++ parser"
+ else:
+ fog_help = "Use new FOG C++ parser (disabled)"
+ parser.add_option("-f", "--fog-parser",
+ action="store_true",
+ dest="fog",
+ default=False,
+ help=fog_help
+ )
+
+ (options, args) = parser.parse_args(args=args)
+ if not options.header_filename is None:
+ if not os.path.exists(options.header_filename):
+ abort( "ERROR: the file '%s' does not exist!" % options.header_filename )
+ INPUT = open(options.header_filename)
+ headers = [line.strip() for line in INPUT]
+ args.extend( headers )
+ INPUT.close()
+
+ if options.fog and not imported_fog:
+ abort( "Cannot use the FOG parser. Check that the 'ply' package is installed. The 'ordereddict' package is also required if running Python 2.6")
+
+ if options.version:
+ printVersion()
+
+ # the cxxtest builder relies on this behaviour! don't remove
+ if options.runner == 'none':
+ options.runner = None
+
+ if options.xunit_printer or options.runner == "XUnitPrinter":
+ options.xunit_printer=True
+ options.runner="XUnitPrinter"
+ if len(args) > 1:
+ if options.xunit_file == "":
+ if options.world == "":
+ options.world = "cxxtest"
+ options.xunit_file="TEST-"+options.world+".xml"
+ elif options.xunit_file == "":
+ if options.world == "":
+ options.world = "cxxtest"
+ options.xunit_file="TEST-"+options.world+".xml"
+
+ if options.error_printer:
+ options.runner= "ErrorPrinter"
+ options.haveStandardLibrary = True
+
+ if options.noStaticInit and (options.root or options.part):
+ abort( '--no-static-init cannot be used with --root/--part' )
+
+ if options.gui and not options.runner:
+ options.runner = 'StdioPrinter'
+
+ files = setFiles(args[1:])
+ if len(files) == 0 and not options.root:
+ sys.stderr.write(parser.error("No input files found"))
+
+ return files
+
+
+def printVersion():
+ '''Print CxxTest version and exit'''
+ sys.stdout.write( "This is CxxTest version %s.\n" % __release__.__version__ )
+ sys.exit(0)
+
+def setFiles(patterns ):
+ '''Set input files specified on command line'''
+ files = expandWildcards( patterns )
+ 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 writeOutput():
+ '''Create output file'''
+ if options.templateFileName:
+ writeTemplateOutput()
+ else:
+ writeSimpleOutput()
+
+def writeSimpleOutput():
+ '''Create output not based on template'''
+ output = startOutputFile()
+ writePreamble( output )
+ if options.root or not options.part:
+ writeMain( output )
+
+ if len(suites) > 0:
+ output.write("bool "+suites[0]['object']+"_init = false;\n")
+
+ 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(options.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 ):
+ if len(suites) > 0:
+ output.write("bool "+suites[0]['object']+"_init = false;\n")
+ writeWorld( output )
+ else:
+ output.write( line )
+ template.close()
+ output.close()
+
+def startOutputFile():
+ '''Create output file and write header'''
+ if options.outputFileName is not None:
+ output = open( options.outputFileName, 'w' )
+ else:
+ output = sys.stdout
+ output.write( "/* Generated file, do not edit */\n\n" )
+ return output
+
+def writePreamble( output ):
+ '''Write the CxxTest header (#includes and #defines)'''
+ global wrotePreamble
+ if wrotePreamble: return
+ output.write( "#ifndef CXXTEST_RUNNING\n" )
+ output.write( "#define CXXTEST_RUNNING\n" )
+ output.write( "#endif\n" )
+ output.write( "\n" )
+ if options.xunit_printer:
+ output.write( "#include <fstream>\n" )
+ if options.haveStandardLibrary:
+ output.write( "#define _CXXTEST_HAVE_STD\n" )
+ if options.haveExceptionHandling:
+ output.write( "#define _CXXTEST_HAVE_EH\n" )
+ if options.abortOnFail:
+ output.write( "#define _CXXTEST_ABORT_TEST_ON_FAIL\n" )
+ if options.longlong:
+ output.write( "#define _CXXTEST_LONGLONG %s\n" % options.longlong )
+ #if options.factor:
+ #output.write( "#define _CXXTEST_FACTOR\n" )
+ for header in options.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" )
+ output.write( "#include <cxxtest/TestMain.h>\n" )
+ if options.runner:
+ output.write( "#include <cxxtest/%s.h>\n" % options.runner )
+ if options.gui:
+ output.write( "#include <cxxtest/%s.h>\n" % options.gui )
+ output.write( "\n" )
+ wrotePreamble = 1
+
+def writeMain( output ):
+ '''Write the main() function for the test runner'''
+ if not (options.gui or options.runner):
+ return
+ output.write( 'int %s( int argc, char *argv[] ) {\n' % options.main )
+ output.write( ' int status;\n' )
+ if options.noStaticInit:
+ output.write( ' CxxTest::initialize();\n' )
+ if options.gui:
+ tester_t = "CxxTest::GuiTuiRunner<CxxTest::%s, CxxTest::%s> " % (options.gui, options.runner)
+ else:
+ tester_t = "CxxTest::%s" % (options.runner)
+ if options.xunit_printer:
+ output.write( ' std::ofstream ofstr("%s");\n' % options.xunit_file )
+ output.write( ' %s tmp(ofstr);\n' % tester_t )
+ output.write( ' CxxTest::RealWorldDescription::_worldName = "%s";\n' % options.world )
+ else:
+ output.write( ' %s tmp;\n' % tester_t )
+ output.write( ' status = CxxTest::Main<%s>( tmp, argc, argv );\n' % tester_t )
+ output.write( ' return status;\n')
+ output.write( '}\n' )
+
+
+def writeWorld( output ):
+ '''Write the world definitions'''
+ global wroteWorld
+ if wroteWorld: return
+ writePreamble( output )
+ writeSuites( output )
+ if options.root or not options.part:
+ writeRoot( output )
+ writeWorldDescr( output )
+ if options.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 'create' in suite
+
+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 options.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 options.noStaticInit:
+ output.write( 'static CxxTest::List %s;\n' % suite['tlist'] )
+ else:
+ output.write( 'static CxxTest::List %s = { 0, 0 };\n' % suite['tlist'] )
+
+def writeWorldDescr( output ):
+ '''Write the static name of the world name'''
+ if options.noStaticInit:
+ output.write( 'const char* CxxTest::RealWorldDescription::_worldName;\n' )
+ else:
+ output.write( 'const char* CxxTest::RealWorldDescription::_worldName = "cxxtest";\n' )
+
+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 options.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 options.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 options.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' )
+
--- /dev/null
+#! python
+
+import cxxtest.cxxtestgen
+
+cxxtest.cxxtestgen.main()
--- /dev/null
+#! python
+
+import cxxtest.cxxtestgen
+
+cxxtest.cxxtestgen.main()
--- /dev/null
+"""
+Script to generate the installer for cxxtest.
+"""
+
+classifiers = """\
+Development Status :: 4 - Beta
+Intended Audience :: End Users/Desktop
+License :: OSI Approved :: LGPL License
+Natural Language :: English
+Operating System :: Microsoft :: Windows
+Operating System :: Unix
+Programming Language :: Python
+Topic :: Software Development :: Libraries :: Python Modules
+"""
+
+import os
+import sys
+from os.path import realpath, dirname
+if sys.version_info >= (3,0):
+ sys.path.insert(0, dirname(realpath(__file__))+os.sep+'python3')
+ os.chdir('python3')
+
+import cxxtest
+
+try:
+ from setuptools import setup
+except ImportError:
+ from distutils.core import setup
+
+doclines = cxxtest.__doc__.split("\n")
+
+setup(name="cxxtest",
+ version=cxxtest.__version__,
+ maintainer=cxxtest.__maintainer__,
+ maintainer_email=cxxtest.__maintainer_email__,
+ url = cxxtest.__url__,
+ license = cxxtest.__license__,
+ platforms = ["any"],
+ description = doclines[0],
+ classifiers = filter(None, classifiers.split("\n")),
+ long_description = "\n".join(doclines[2:]),
+ packages=['cxxtest'],
+ keywords=['utility'],
+ scripts=['scripts/cxxtestgen']
+ #
+ # The entry_points option is not supported by distutils.core
+ #
+ #entry_points="""
+ #[console_scripts]
+ #cxxtestgen = cxxtest.cxxtestgen:main
+ #"""
+ )
+
--- /dev/null
+.consign
+Makefile
+*_runner*
+tests.cpp error_printer.cpp stdio_printer.cpp file_printer.cpp aborter.cpp only.cpp
+error_printer stdio_printer file_printer aborter only
--- /dev/null
+# -*- Perl -*-
+
+#
+# This file shows how to use CxxTest with Cons
+#
+
+$env = new cons( CXX => ("$^O" eq 'MSWin32') ? 'cl -nologo -GX' : 'c++',
+ CPPPATH => '..',
+ CXXTESTGEN => '../bin/cxxtestgen' );
+
+@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;
+}
+
+
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+//
+// 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 );
+ }
+};
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#!/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:
+#
--- /dev/null
+#
+# 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 = ../bin/cxxtestgen
+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:
+#
--- /dev/null
+#
+# 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 = python ../bin/cxxtestgen
+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:
+#
--- /dev/null
+#
+# Makefile for UN*X-like systems
+#
+
+# Change this line if you want a different compiler
+CXXC = c++ -Wall -W -Werror -I. -I..
+
+TESTGEN = ../bin/cxxtestgen
+
+# 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:
+#
--- /dev/null
+#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
--- /dev/null
+
+cxxtestbuilder_path = '../../build_tools/SCons/cxxtest.py'
+cxxtest_path = '../..'
+
+# First a bit of python magic to make the CxxTestBuilder available
+# without having to copy it into a particular path.
+# for nicer examples you *should* use, see the cxxtest builder tests in the
+# build_tools/SCons/test directory.
+import imp
+cxxtest = imp.load_source('cxxtest', cxxtestbuilder_path)
+
+# First build the 'real' library, when working on an embedded system
+# this may involve a cross compiler.
+env = Environment()
+env.BuildDir('build/embedded_platform', 'src')
+env.Append(CPPPATH=['include'])
+libtested = env.StaticLibrary('build/embedded_platform/tested',
+ env.Glob('build/embedded_platform/*.c'))
+
+# Now create a seperate build environment for the tests so we can keep any
+# options that are specific to testing seperate from the 'production' build
+# environment. For simplicity I am just copying the production environment.
+# If we are cross compiling for the "real" library, then this
+# environement might be using the normal compiler.
+env_test = env.Clone()
+
+# Add the CxxTestBuilder to our testing build environment.
+cxxtest.generate(env_test, CXXTEST_INSTALL_DIR = cxxtest_path)
+
+# If we were working with an embedded platform we may want to create a
+# seperate version of our library that runs on our development box in
+# order to do our initial unit testing. This version may also include
+# any special preprocessor defines needed for testing e.g. -DTESTING
+env_test.BuildDir('build/dev_platform', 'src')
+env_test.BuildDir('build/tests', 'tests')
+lib_to_test = env_test.StaticLibrary('build/dev_platform/tested',
+ env.Glob('build/dev_platform/*.c'))
+env_test.Append(LIBS=lib_to_test)
+env_test.CxxTest(env_test.Glob('tests/*.h'))
+
--- /dev/null
+#ifndef STACK_H
+#define STACK_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ typedef struct stack_t {
+ int size;
+ int* vals;
+ int capacity;
+ } stack_t;
+
+ stack_t* stack_create();
+ void stack_free(stack_t* stack);
+ int stack_size(stack_t* stack);
+ void stack_push(stack_t* stack, int val);
+ int stack_pop(stack_t* stack);
+ int stack_peak(stack_t* stack);
+ int stack_capacity(stack_t* stack);
+
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif
--- /dev/null
+#include <stack.h>
+
+#include <stdlib.h>
+
+stack_t* stack_create() {
+ stack_t* retVal = malloc(sizeof(stack_t));
+ retVal->size = 0;
+ retVal->capacity = 10;
+ retVal->vals = malloc(retVal->capacity*sizeof(int));
+ return retVal;
+}
+
+void stack_free(stack_t* stack) {
+ free(stack->vals);
+ free(stack);
+}
+
+int stack_size(stack_t* stack) {
+ return stack->size;
+}
+
+void stack_push(stack_t* stack, int val) {
+ if(stack->size == stack->capacity) {
+ stack->capacity *= 2;
+ stack->vals = realloc(stack->vals, stack->capacity*sizeof(int));
+ }
+ stack->vals[stack->size++] = val;
+}
+
+int stack_pop(stack_t* stack) {
+ if (stack->size >= 1)
+ return stack->vals[--stack->size];
+ else
+ return 0;
+}
+
+int stack_peak(stack_t* stack) {
+ if (stack->size >= 1)
+ return stack->vals[stack->size-1];
+ else
+ return 0;
+}
+
+int stack_capacity(stack_t* stack) {
+ return stack->capacity;
+}
+
+
--- /dev/null
+#ifndef STACK_TEST_H
+#define STACK_TEST_H
+
+#include <cxxtest/TestSuite.h>
+#include <stack.h>
+
+class stack_test : public CxxTest::TestSuite
+{
+
+ private:
+ stack_t* stack;
+ public:
+
+ void setUp() {
+ stack = stack_create();
+ }
+
+ void tearDown() {
+ stack_free(stack);
+ }
+
+ void test_create_stack() {
+ TS_ASSERT_DIFFERS((stack_t*)0, stack);
+ }
+
+ void test_new_stack_is_empty() {
+ TS_ASSERT_EQUALS(0, stack_size(stack));
+ }
+
+ void test_one_push_add_one_to_size() {
+ stack_push(stack, 1);
+ TS_ASSERT_EQUALS(1, stack_size(stack));
+ }
+
+ void test_push_pop_doesnt_change_size() {
+ stack_push(stack, 1);
+ (void)stack_pop(stack);
+ TS_ASSERT_EQUALS(0, stack_size(stack));
+ }
+
+ void test_peak_after_push() {
+ stack_push(stack, 1);
+ TS_ASSERT_EQUALS(1, stack_peak(stack))
+ }
+
+ void test_initial_capacity_is_positive() {
+ TS_ASSERT(stack_capacity(stack) > 0);
+ }
+
+ void test_pop_on_empty() {
+ TS_ASSERT_EQUALS(0, stack_pop(stack));
+ TS_ASSERT_EQUALS(0, stack_size(stack));
+ }
+
+ void test_peak_on_empty() {
+ TS_ASSERT_EQUALS(0, stack_peak(stack));
+ }
+
+ void test_capacity_gte_size() {
+ TS_ASSERT_LESS_THAN_EQUALS(stack_size(stack), stack_capacity(stack));
+ int init_capacity = stack_capacity(stack);
+ for (int i=0; i < init_capacity + 1; i++) {
+ stack_push(stack, i);
+ }
+ TS_ASSERT_LESS_THAN_EQUALS(stack_size(stack), stack_capacity(stack));
+ }
+
+};
+
+#endif // STACK_TEST_H
+
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+// -*- 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>
+
--- /dev/null
+// -*- 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>
+
--- /dev/null
+#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();
+ }
+};
--- /dev/null
+#include <T/stdlib.h>
+#include "Dice.h"
+
+Dice::Dice()
+{
+ T::srand( T::time( 0 ) );
+}
+
+unsigned Dice::roll()
+{
+ return (T::rand() % 6) + 1;
+}
+
+
--- /dev/null
+#ifndef __DICE_H
+#define __DICE_H
+
+class Dice
+{
+public:
+ Dice();
+
+ unsigned roll();
+};
+
+#endif // __DICE_H
+
--- /dev/null
+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)/bin/cxxtestgen -o $@ --error-printer $<
--- /dev/null
+#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;
+ }
+};
--- /dev/null
+#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
--- /dev/null
+#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 );
+ }
+};
--- /dev/null
+#define CXXTEST_MOCK_TEST_SOURCE_FILE
+#include <T/stdlib.h>
--- /dev/null
+#define CXXTEST_MOCK_REAL_SOURCE_FILE
+#include <T/stdlib.h>
--- /dev/null
+#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;
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+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>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+@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)\bin\cxxtestgen)
+!error Please fix CXXTESTDIR
+!endif
+
+# cxxtestgen needs Python
+!if defined(PYTHON)
+CXXTESTGEN = $(PYTHON) $(CXXTESTDIR)/bin/cxxtestgen
+!else
+!error You must define 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
--- /dev/null
+# Where to look for the tests
+TESTS = ..\gui\*.h ..\*.h
+
+# Where the CxxTest distribution is unpacked
+CXXTESTDIR = ..\..
+
+# Check CXXTESTDIR
+!if !exist($(CXXTESTDIR)\bin\cxxtestgen)
+!error Please fix CXXTESTDIR
+!endif
+
+# cxxtestgen needs Perl or Python
+!if defined(PYTHON)
+CXXTESTGEN = $(PYTHON) $(CXXTESTDIR)/bin/cxxtestgen
+!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
--- /dev/null
+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 PYTHON, e.g. Python=c:\Python25\bin\python.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.
--- /dev/null
+// -*- 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>
+
--- /dev/null
+*.cpp *.o runner
\ No newline at end of file
--- /dev/null
+#
+# (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)/bin/cxxtestgen
+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:
+#
--- /dev/null
+# Standard DDK Makefile
+!include $(NTMAKEENV)\makefile.def
--- /dev/null
+# -*- Makefile -*-
+
+#
+# Tell the DDK how to generate RunTests.cpp from RunTests.tpl and the tests
+#
+
+PYTHON=python
+CXXTESTGEN=$(PYTHON) $(CXXTESTDIR)/bin/cxxtestgen
+
+TEST_SUITES=$(SUITESDIR)/*.h
+
+RunTests.cpp: RunTests.tpl $(TEST_SUITES)
+ $(CXXTESTGEN) -o $@ --template=RunTests.tpl $(TEST_SUITES)
--- /dev/null
+// -*- C++ -*-
+
+//
+// The DDK doesn't handle <iostream> too well
+//
+#include <cxxtest/StdioPrinter.h>
+
+int __cdecl main()
+{
+ return CxxTest::StdioPrinter().run();
+}
+
+<CxxTest world>
--- /dev/null
+# -*- 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
+
--- /dev/null
+//
+// 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();
+}
--- /dev/null
+*pl.cpp *py.cpp *pl.out *py.out *px *px.exe *px.out *build.log *root.cpp
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test suite which doesn't use exception handling.
+// It is used to verify --abort-on-fail + --have-eh
+//
+
+class AborterNoThrow : public CxxTest::TestSuite
+{
+public:
+ void testFailures()
+ {
+ TS_FAIL(1);
+ TS_FAIL(2);
+ TS_FAIL(3);
+ TS_FAIL(4);
+ TS_FAIL(5);
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// A simple test suite that cannot be parsed with the default test discovery mechanism
+//
+
+class BadTest
+:
+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" );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test of commenting out tests in CxxTest
+//
+
+class Comments : public CxxTest::TestSuite
+{
+public:
+ void test_Something()
+ {
+ TS_WARN( "Something" );
+ }
+
+// void test_Something_else()
+// {
+// TS_WARN( "Something else" );
+// }
+
+ //void test_Something_else()
+ //{
+ // TS_WARN( "Something else" );
+ //}
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test of commenting out tests in CxxTest
+//
+
+class Comments : public CxxTest::TestSuite
+{
+public:
+ void test_Something()
+ {
+ TS_WARN( "Something" );
+ }
+
+/*
+ void test_Something_else()
+ {
+ TS_WARN( "Something else" );
+ }
+*/
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+template <class T>
+class Tests
+{
+public:
+
+ CXXTEST_STD(list)<T>* cache;
+
+ void setUp()
+ {
+ this->cache = new CXXTEST_STD(list)<T>();
+ }
+
+ void tearDown()
+ { }
+
+ void test_size()
+ {
+ TS_ASSERT_EQUALS(cache->size(), 0);
+ }
+
+ void test_insert()
+ {
+ this->cache->push_back(1);
+ TS_ASSERT_EQUALS(cache->size(), 1);
+ }
+
+};
+
+class IntTests: public Tests<int>, public CxxTest::TestSuite
+{
+public:
+
+ void setUp() { Tests<int>::setUp(); }
+ void tearDown() { Tests<int>::tearDown(); }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite verifies that the TS_ASSERT_THROWS*() macros are "abort on fail"-friendly
+//
+
+class DeepAbort : public CxxTest::TestSuite
+{
+public:
+ void testAssertThrowsPassesAbort()
+ {
+ TS_ASSERT_THROWS( fail(), int );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testMessageAssertThrowsPassesAbort()
+ {
+ TSM_ASSERT_THROWS( "fail() should throw an int", fail(), int );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testAssertThrowsAborts()
+ {
+ TS_ASSERT_THROWS( succeed(), int );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testMessageAssertThrowsAborts()
+ {
+ TSM_ASSERT_THROWS( "succeed() should throw an int", succeed(), int );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testAssertThrowsNothingPassesAbort()
+ {
+ TS_ASSERT_THROWS_NOTHING( fail() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testMessageAssertThrowsNothingPassesAbort()
+ {
+ TSM_ASSERT_THROWS_NOTHING( "fail() shouldn't throw anything", fail() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testAssertThrowsNothingAborts()
+ {
+ TS_ASSERT_THROWS_NOTHING( throwSomething() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testMessageAssertThrowsNothingAborts()
+ {
+ TSM_ASSERT_THROWS_NOTHING( "fail() shouldn't throw anything", throwSomething() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testAssertThrowsAnything()
+ {
+ TS_ASSERT_THROWS_ANYTHING( succeed() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void testMessageAssertThrowsAnything()
+ {
+ TSM_ASSERT_THROWS_ANYTHING( "succeed() should throw something", succeed() );
+ TS_FAIL( "You shouldn't see this if --abort-on-fail is used" );
+ }
+
+ void fail()
+ {
+ TS_ASSERT_EQUALS( 0, 1 );
+ }
+
+ void throwSomething()
+ {
+ throw "something";
+ }
+
+ void succeed()
+ {
+ TS_ASSERT_EQUALS( 1, 1 );
+ }
+};
--- /dev/null
+#define CXXTEST_HAVE_EH
+#define CXXTEST_ABORT_TEST_ON_FAIL
+#define CXXTEST_DEFAULT_ABORT false
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite demonstrates the default ValueTraits
+//
+
+class DefaultTraits : public CxxTest::TestSuite
+{
+public:
+ struct EightBytes
+ {
+ EightBytes() {}
+ unsigned char data[8];
+ };
+
+ void testSmallDefaultTraits()
+ {
+ EightBytes x;
+ for ( unsigned i = 0; i < sizeof(x.data); ++ i )
+ x.data[i] = (unsigned char)i;
+ TS_FAIL( x );
+ }
+
+ struct NineBytes
+ {
+ NineBytes() {}
+ unsigned char data[9];
+ };
+
+ void testBigDefaultTraits()
+ {
+ NineBytes x;
+ for ( unsigned i = 0; i < sizeof(x.data); ++ i )
+ x.data[i] = (unsigned char)(0x98 + i);
+ TS_FAIL( x );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite tests double macro invocation
+// E.g. when TS_ASSERT_EQUALS( x, y ) fails, it should evaulate x and y once
+// Consider TS_ASSERT_EQUALS( readNextValue(), 3 )
+//
+
+class DoubleCall : public CxxTest::TestSuite
+{
+public:
+ int i;
+
+ void setUp()
+ {
+ i = 0;
+ }
+
+ void testAssertEqualsWithSideEffects()
+ {
+ TS_ASSERT_EQUALS( increment(), 3 );
+ }
+
+ void testAssertDiffersWithSideEffects()
+ {
+ TS_ASSERT_DIFFERS( increment(), 1 );
+ }
+
+ void testAssertDeltaWithSideEffects()
+ {
+ TS_ASSERT_DELTA( increment(), 2.0, 0.5 );
+ }
+
+ int increment()
+ {
+ return ++i;
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class DynamicAbort : public CxxTest::TestSuite
+{
+public:
+ void test_Abort_on_fail_in_this_test()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+
+ void test_Dont_abort_in_this_test()
+ {
+ CxxTest::setAbortTestOnFail( false );
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+
+ void test_Revert_to_abort()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+};
+
+class SetUpWorksAllTests : public CxxTest::TestSuite
+{
+public:
+ void setUp()
+ {
+ CxxTest::setAbortTestOnFail( false );
+ }
+
+ void test_Dont_abort_in_this_test()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+
+ void test_Dont_abort_in_this_test_either()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+
+ void test_Override_in_this_test()
+ {
+ CxxTest::setAbortTestOnFail( true );
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class DynamicMax : public CxxTest::TestSuite
+{
+public:
+ enum { DATA_SIZE = 24 };
+ unsigned char x[DATA_SIZE], y[DATA_SIZE];
+
+ void setUp()
+ {
+ for ( unsigned i = 0; i < DATA_SIZE; ++ i ) {
+ x[i] = (unsigned char)i;
+ y[i] = (unsigned char)~x[i];
+ }
+ }
+
+ void test_Max_size_from_define()
+ {
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void test_Set_max_size()
+ {
+ CxxTest::setMaxDumpSize( 16 );
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void test_Revert_to_max_size_from_define()
+ {
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void test_Set_max_size_to_zero__dumps_all()
+ {
+ CxxTest::setMaxDumpSize( 0 );
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+};
+
+class SetUpAffectsAllTests : public CxxTest::TestSuite
+{
+public:
+ enum { DATA_SIZE = 24 };
+ unsigned char x[DATA_SIZE], y[DATA_SIZE];
+
+ void setUp()
+ {
+ for ( unsigned i = 0; i < DATA_SIZE; ++ i ) {
+ x[i] = (unsigned char)i;
+ y[i] = (unsigned char)~x[i];
+ }
+
+ CxxTest::setMaxDumpSize( 12 );
+ }
+
+ void test_Use_12_in_this_test()
+ {
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void test_Use_12_in_this_test_too()
+ {
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class EmptySuite : public CxxTest::TestSuite
+{
+public:
+ static EmptySuite *createSuite() { return new EmptySuite(); }
+ static void destroySuite( EmptySuite *suite ) { delete suite; }
+
+ void setUp() {}
+ void tearDown() {}
+
+ void thisSuiteHasNoTests()
+ {
+ TS_FAIL( "This suite has no tests" );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// These test suites are examples of unhandled exceptions and errors in dynamic suites
+//
+
+class NullCreate : public CxxTest::TestSuite
+{
+public:
+ static NullCreate *createSuite() { return 0; }
+ static void destroySuite( NullCreate * ) { TS_FAIL( "Should not be called" ); }
+
+ void testNothing()
+ {
+ TS_FAIL( "Test called although no suite" );
+ }
+};
+
+class ThrowCreate : public CxxTest::TestSuite
+{
+public:
+ static ThrowCreate *createSuite() { throw -3; }
+ static void destroySuite( ThrowCreate * ) { TS_FAIL( "Should not be called" ); }
+
+ void testNothing()
+ {
+ TS_FAIL( "Test called although no suite" );
+ }
+};
+
+class ThrowDestroy : public CxxTest::TestSuite
+{
+public:
+ static ThrowDestroy *createSuite() { return new ThrowDestroy; }
+ static void destroySuite( ThrowDestroy * ) { throw 42; }
+
+ void testNothing() {}
+};
+
+class ThrowSetUp : public CxxTest::TestSuite
+{
+public:
+ void setUp() { throw 5; }
+ void tearDown() { TS_FAIL( "Shouldn't get here" ); }
+
+ void testNothing() { TS_FAIL( "Shouldn't get here" ); }
+};
+
+class ThrowTearDown : public CxxTest::TestSuite
+{
+public:
+ void setUp() {}
+ void tearDown() { throw 5; }
+
+ void testNothing() {}
+};
+
+class TestThrowFromTest : public CxxTest::TestSuite
+{
+public:
+ void testThrowSomething()
+ {
+ throw 582;
+ }
+
+ void testMoveOn()
+ {
+ TS_TRACE( "One failed test doesn't affect the others" );
+ }
+};
--- /dev/null
+//
+// This file is used to test WorldDescription::strTotalTests()
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/DummyDescriptions.h>
+
+class Factor : public CxxTest::TestSuite
+{
+public:
+ class X : public CxxTest::DummyWorldDescription
+ {
+ public:
+ unsigned n;
+ unsigned numTotalTests() const { return n; }
+ };
+
+ X x;
+ enum Limit { MAX_STRLEN_TOTAL_TESTS = CxxTest::WorldDescription::MAX_STRLEN_TOTAL_TESTS };
+ char buffer[MAX_STRLEN_TOTAL_TESTS * 2];
+
+ const char *convert( unsigned n )
+ {
+ x.n = n;
+ return x.strTotalTests( buffer );
+ }
+
+ void test_Some_numbers()
+ {
+ TS_WARN( convert(53) );
+ for ( unsigned n = 0; n < 64; ++ n ) {
+ TS_ASSERT_DIFFERS( n, 32 );
+ TS_WARN( convert(n) );
+ }
+ }
+
+ class ShorterThan
+ {
+ public:
+ bool operator()( const char *s, unsigned n ) const
+ {
+ unsigned len = 0;
+ while ( *s++ != '\0' )
+ ++ len;
+ return (len < n);
+ }
+ };
+
+ class NotShorterThan
+ {
+ ShorterThan _shorterThan;
+
+ public:
+ bool operator()( const char *s, unsigned n ) const { return !_shorterThan( s, n ); }
+ };
+
+ void test_Lengths()
+ {
+ unsigned reasonableLimit = 60060;
+ for ( unsigned n = 0; n < reasonableLimit; ++ n )
+ TS_ASSERT_RELATION( ShorterThan, convert(n), MAX_STRLEN_TOTAL_TESTS );
+ TS_ASSERT_RELATION( NotShorterThan, convert(reasonableLimit), MAX_STRLEN_TOTAL_TESTS );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class ForceNoEh : public CxxTest::TestSuite
+{
+public:
+ void testCxxTestCanCompileWithoutExceptionHandling()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ TS_ASSERT_THROWS_NOTHING( foo() );
+ }
+
+ void foo()
+ {
+ }
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::setUp() fails
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUp() { return false; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::setUp() throws
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUp() { throw this; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::tearDown() fails
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool tearDown() { return false; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+ void testTwo() { TS_WARN( "Testing should go on!" ); }
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::tearDown() throws
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool tearDown() { throw this; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+ void testTwo() { TS_WARN( "Testing should go on!" ); }
+};
--- /dev/null
+//
+// This file tests CxxTest global fixtures
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+
+//
+// Fixture1 counts its setUp()s and tearDown()s
+//
+class Fixture1 : public CxxTest::GlobalFixture
+{
+ unsigned _setUpCount;
+ unsigned _tearDownCount;
+
+public:
+ Fixture1() { _setUpCount = _tearDownCount = 0; }
+ bool setUp() { ++ _setUpCount; return true; }
+ bool tearDown() { ++ _tearDownCount; return true; }
+ unsigned setUpCount() const { return _setUpCount; }
+ unsigned tearDownCount() const { return _tearDownCount; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture1 fixture1;
+
+//
+// Fixture2 counts its setUp()s and tearDown()s and makes sure
+// its setUp() is called after Fixture1 and its tearDown() before.
+//
+class Fixture2 : public Fixture1
+{
+public:
+ bool setUp()
+ {
+ TS_ASSERT_EQUALS(setUpCount(), fixture1.setUpCount() - 1);
+ TS_ASSERT_EQUALS(tearDownCount(), fixture1.tearDownCount());
+ return Fixture1::setUp();
+ }
+
+ bool tearDown()
+ {
+ TS_ASSERT_EQUALS(setUpCount(), fixture1.setUpCount());
+ TS_ASSERT_EQUALS(tearDownCount(), fixture1.tearDownCount());
+ return Fixture1::tearDown();
+ }
+};
+
+static Fixture2 fixture2;
+
+class TestGlobalFixture : public CxxTest::TestSuite
+{
+public:
+ void testCountsFirstTime()
+ {
+ TS_ASSERT_EQUALS(fixture1.setUpCount(), 1);
+ TS_ASSERT_EQUALS(fixture1.tearDownCount(), 0);
+ TS_ASSERT_EQUALS(fixture2.setUpCount(), 1);
+ TS_ASSERT_EQUALS(fixture2.tearDownCount(), 0);
+ }
+
+ void testCountsSecondTime()
+ {
+ TS_ASSERT_EQUALS(fixture1.setUpCount(), 2);
+ TS_ASSERT_EQUALS(fixture1.tearDownCount(), 1);
+ TS_ASSERT_EQUALS(fixture2.setUpCount(), 2);
+ TS_ASSERT_EQUALS(fixture2.tearDownCount(), 1);
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+#include <math.h>
+
+//
+// This is a test suite in which all tests pass.
+// It is also an example of all the TS[M]_ macros except TS_FAIL()
+//
+
+class GoodSuite : public CxxTest::TestSuite
+{
+public:
+ void testAssert()
+ {
+ TS_ASSERT( true );
+ TS_ASSERT( 1 == 1 );
+ TS_ASSERT( 13 );
+ TS_ASSERT( this );
+ }
+
+ void testAssertMessage()
+ {
+ TSM_ASSERT( "ASCII works", 'A' == 65 );
+ }
+
+ void testEquals()
+ {
+ TS_ASSERT_EQUALS( 1 + 1, 2 );
+ TS_ASSERT_EQUALS( 2 * 2, 4 );
+ TS_ASSERT_EQUALS( -4 * -4, 16 );
+ }
+
+ void testEqualsMessage()
+ {
+ TSM_ASSERT_EQUALS( "Addition operator works", 1 + 1, 2 );
+ }
+
+ void testDelta()
+ {
+ TS_ASSERT_DELTA( 1.0 + 1.0, 2.0, 0.0001 );
+ }
+
+ void testDeltaMessage()
+ {
+ TSM_ASSERT_DELTA( "sqrt() works", sqrt(2.0), 1.4142, 0.0001 );
+ }
+
+ void testDiffers()
+ {
+ TS_ASSERT_DIFFERS( 0, 1 );
+ TS_ASSERT_DIFFERS( 0.12, 0.123 );
+ }
+
+ void testDiffersMessage()
+ {
+ TSM_ASSERT_DIFFERS( "Not all is true", 0, 1 );
+ }
+
+ void testLessThan()
+ {
+ TS_ASSERT_LESS_THAN( 1, 2 );
+ TS_ASSERT_LESS_THAN( -2, -1 );
+ }
+
+ void testLessThanMessage()
+ {
+ TSM_ASSERT_LESS_THAN( ".5 is less than its square root", 0.5, sqrt(0.5) );
+ }
+
+ void testLessThanEquals()
+ {
+ TS_ASSERT_LESS_THAN_EQUALS( 3, 3 );
+ TS_ASSERT_LESS_THAN_EQUALS( 3, 4 );
+ }
+
+ void testLessThanEqualsMessage()
+ {
+ TSM_ASSERT_LESS_THAN_EQUALS( "1.0 <= its square root", 1.0, sqrt(1.0) );
+ }
+
+ void testThrows()
+ {
+ TS_ASSERT_THROWS( { throw 1; }, int );
+ }
+
+ void testThrowsMessage()
+ {
+ TSM_ASSERT_THROWS( "1 is an integer", { throw 1; }, int );
+ }
+
+ void testThrowsAnything()
+ {
+ TS_ASSERT_THROWS_ANYTHING( { throw GoodSuite(); } );
+ }
+
+ void testThrowsAnythingMessage()
+ {
+ TSM_ASSERT_THROWS_ANYTHING( "Yes, you can throw test suites",
+ { throw GoodSuite(); } );
+ }
+
+ void testThrowsNothing()
+ {
+ TS_ASSERT_THROWS_NOTHING( throwNothing() );
+ }
+
+ void testThrowsNothingMessage()
+ {
+ TSM_ASSERT_THROWS_NOTHING( "Empty functions dosn't throw", throwNothing() );
+ }
+
+ void throwNothing()
+ {
+ }
+};
--- /dev/null
+#ifndef __GUI_WAIT_H
+#define __GUI_WAIT_H
+
+#define CXXTEST_SAMPLE_GUI_WAIT()
+
+#endif // __GUI_WAIT_H
--- /dev/null
+#define CXXTEST_HAVE_EH
+#include <cxxtest/ErrorPrinter.h>
+
+int main( int argc, char *argv[] ) {
+ CxxTest::ErrorPrinter tmp;
+ return CxxTest::Main<CxxTest::ErrorPrinter>( tmp, argc, argv );
+}
+
+// The CxxTest "world"
+<CxxTest world>
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This tests CxxTest's `--have-std' option
+//
+#include "Something.h"
+
+class HaveStd : public CxxTest::TestSuite
+{
+public:
+ void testHaveStd()
+ {
+ TS_ASSERT_EQUALS( something(), "Something" );
+ }
+};
--- /dev/null
+#define CXXTEST_HAVE_STD
+#include <cxxtest/ErrorPrinter.h>
+
+int main( int argc, char *argv[] ) {
+ CxxTest::ErrorPrinter tmp;
+ return CxxTest::Main<CxxTest::ErrorPrinter>( tmp, argc, argv );
+}
+
+// The CxxTest "world"
+<CxxTest world>
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test for the --include option
+//
+
+class IncludesTest : public CxxTest::TestSuite
+{
+public:
+ void testTraits()
+ {
+ TS_WARN( (void *)0 );
+ TS_WARN( (long *)0 );
+ }
+};
--- /dev/null
+#ifndef __INHERITANCETEST_H
+#define __INHERITANCETEST_H
+
+#include <cxxtest/TestSuite.h>
+
+//
+// A simple test suite, which is inherited
+//
+
+class BaseTests
+{
+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" );
+ }
+};
+
+
+class InheritedTests1 : public BaseTests, public CxxTest::TestSuite
+{};
+
+class InheritedTests2 : public CxxTest::TestSuite, public BaseTests
+{};
+
+#endif // __INHERITANCETEST_H
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This tests CxxTest's handling of "__int64"
+//
+
+class Int64 : public CxxTest::TestSuite
+{
+public:
+ void testInt64()
+ {
+ TS_ASSERT_EQUALS( (__int64)1, (__int64)2 );
+ TS_ASSERT_DIFFERS( (__int64)3, (__int64)3 );
+ TS_ASSERT_LESS_THAN( (__int64)5, (__int64)4 );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suites demonstrated TS_LESS_THAN_EQUALS
+// and how it fails.
+//
+
+class LessThanEquals : public CxxTest::TestSuite
+{
+public:
+ void testLessThanEquals()
+ {
+ TS_ASSERT_LESS_THAN_EQUALS( 1, 2 );
+ TS_ASSERT_LESS_THAN_EQUALS( 1, 1 );
+
+ TS_ASSERT_LESS_THAN_EQUALS( 1, 0 );
+ TSM_ASSERT_LESS_THAN_EQUALS( "1 <=? 0", 1, 0 );
+
+ ETS_ASSERT_LESS_THAN( 1, 0 );
+ ETSM_ASSERT_LESS_THAN_EQUALS( "1 <=? 0", 1, 0 );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This tests CxxTest's handling of "long long"
+//
+
+class LongLongTest : public CxxTest::TestSuite
+{
+public:
+ void testLongLong()
+ {
+ TS_ASSERT_EQUALS( (long long)1, (long long)2 );
+ TS_ASSERT_DIFFERS( (long long)3, (long long)3 );
+ TS_ASSERT_LESS_THAN( (long long)5, (long long)4 );
+ }
+};
--- /dev/null
+//
+// This include file is used to test the --include option
+//
+
+#include <cxxtest/ValueTraits.h>
+
+namespace CxxTest
+{
+ CXXTEST_TEMPLATE_INSTANTIATION
+ class ValueTraits<long *>
+ {
+ public:
+ ValueTraits( long * ) {}
+ const char *asString() { return "(long *)"; }
+ };
+}
--- /dev/null
+#
+# Some convenient ways of running the self tests
+#
+
+all: gcc
+
+clean:
+ rm -f *p[ly].out *px *px.out *build.log *root.cpp parsetab.py *.gcno *.gcda ../cxxtest/*.gcno ../cxxtest/*.gcda ../sample/*.gcno ../sample/*.gcda Test*.cpp *.gcov *.pre rm Samples.txt
+ rm -Rf *.dSYM
+
--- /dev/null
+//
+// CXXTEST_MAX_DUMP_SIZE is the maximum number of bytes to dump in TS_ASSERT_SAME_DATA
+//
+
+#define CXXTEST_MAX_DUMP_SIZE 20
--- /dev/null
+//
+// This is a test of CxxTest's Mock framework (not a mock test).
+//
+#include <cxxtest/TestSuite.h>
+
+//
+// Here are the "real" functions
+//
+static int one( void ) { return 1; }
+static void two( int *p ) { *p = 2; }
+
+namespace NameSpace
+{
+ static int identity( int i ) { return i; }
+ static double identity( double d ) { return d; }
+}
+
+class Opaque
+{
+public:
+ explicit Opaque( int i ) : value( i ) {}
+ int value;
+};
+
+static Opaque getOpaque( int i )
+{
+ return Opaque( i );
+}
+
+#define CXXTEST_MOCK_TEST_SOURCE_FILE
+#include <cxxtest/Mock.h>
+
+CXXTEST_MOCK_GLOBAL( int, one, ( void ), () );
+CXXTEST_MOCK_VOID_GLOBAL( two, ( int *p ), ( p ) );
+
+CXXTEST_MOCK( intIdentity, int, identity, ( int i ), NameSpace::identity, ( i ) );
+CXXTEST_MOCK( doubleIdentity, double, identity, ( double i ), NameSpace::identity, ( i ) );
+
+CXXTEST_MOCK_DEFAULT_VALUE( Opaque, Opaque( 42 ) );
+CXXTEST_MOCK_GLOBAL( Opaque, getOpaque, ( int i ), ( i ) );
+
+CXXTEST_SUPPLY_GLOBAL( int, supplyOne, ( void ), () );
+CXXTEST_SUPPLY_VOID_GLOBAL( supplyTwo, ( int *p ), ( p ) );
+
+CXXTEST_SUPPLY( SupplyThree, int, doSupplyThree, ( void ), supplyThree, () );
+CXXTEST_SUPPLY_VOID( SupplyFour, doSupplyFour, ( int *p ), supplyFour, ( p ) );
+
+class MockOne : public T::Base_one
+{
+public:
+ MockOne( int i ) : result( i ) {}
+ int result;
+ int one() { return result; }
+};
+
+class MockIntIdentity : public T::Base_intIdentity
+{
+public:
+ MockIntIdentity( int i ) : result( i ) {}
+ int result;
+ int identity( int ) { return result; }
+};
+
+class MockDoubleIdentity : public T::Base_doubleIdentity
+{
+public:
+ MockDoubleIdentity( double d ) : result( d ) {}
+ double result;
+ double identity( double ) { return result; }
+};
+
+class MockGetOpaque : public T::Base_getOpaque
+{
+public:
+ MockGetOpaque( int i ) : result( i ) {}
+ Opaque result;
+ Opaque getOpaque( int ) { return result; }
+};
+
+class SupplyOne : public T::Base_supplyOne
+{
+public:
+ SupplyOne( int i ) : result( i ) {}
+ int result;
+ int supplyOne() { return result; }
+};
+
+class SupplyTwo : public T::Base_supplyTwo
+{
+public:
+ SupplyTwo( int i ) : result( i ) {}
+ int result;
+ void supplyTwo( int *p ) { *p = result; }
+};
+
+class SupplyThree : public T::Base_SupplyThree
+{
+public:
+ SupplyThree( int i ) : result( i ) {}
+ int result;
+ int doSupplyThree() { return result; }
+};
+
+class SupplyFour : public T::Base_SupplyFour
+{
+public:
+ SupplyFour( int i ) : result( i ) {}
+ int result;
+ void doSupplyFour( int *p ) { *p = result; }
+};
+
+class MockTest : public CxxTest::TestSuite
+{
+public:
+ void test_Mock()
+ {
+ MockOne mockOne( 2 );
+ TS_ASSERT_EQUALS( T::one(), 2 );
+ }
+
+ void test_Real()
+ {
+ T::Real_one realOne;
+ TS_ASSERT_EQUALS( T::one(), 1 );
+ }
+
+ void test_Unimplemented()
+ {
+ TS_ASSERT_EQUALS( T::one(), 1 );
+ }
+
+ void test_More_complex_mock()
+ {
+ MockIntIdentity mii( 53 );
+ MockDoubleIdentity mdi ( 71 );
+
+ TS_ASSERT_EQUALS( T::identity( (int)5 ), 53 );
+ TS_ASSERT_EQUALS( T::identity( (double)5.0 ), 71 );
+ }
+
+ void test_Mock_traits()
+ {
+ TS_ASSERT_EQUALS( T::getOpaque( 3 ).value, 72 );
+ }
+
+ void test_Override()
+ {
+ MockOne *two = new MockOne( 2 );
+ MockOne *three = new MockOne( 3 );
+ MockOne *four = new MockOne( 4 );
+ TS_ASSERT_EQUALS( T::one(), 4 );
+ delete three;
+ TS_ASSERT_EQUALS( T::one(), 4 );
+ delete four;
+ TS_ASSERT_EQUALS( T::one(), 2 );
+ delete two;
+ TS_ASSERT_EQUALS( T::one(), 1 );
+ }
+
+ void test_Supply()
+ {
+ SupplyOne s( 2 );
+ TS_ASSERT_EQUALS( supplyOne(), 2 );
+ }
+
+ void test_Unimplemented_supply()
+ {
+ TS_ASSERT_EQUALS( supplyOne(), 1 );
+ }
+
+ void test_More_complex_supply()
+ {
+ SupplyThree st( 28 );
+ SupplyFour sf( 53 );
+
+ TS_ASSERT_EQUALS( supplyThree(), 28 );
+
+ int i;
+ supplyFour( &i );
+ TS_ASSERT_EQUALS( i, 53 );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class NoEh : public CxxTest::TestSuite
+{
+public:
+ void testCxxTestCanCompileWithoutExceptionHandling()
+ {
+ TS_ASSERT_EQUALS( 1, 2 );
+ TS_ASSERT_EQUALS( 2, 3 );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite is used to test the root/part functionality of CxxTest.
+//
+
+class Part1 : public CxxTest::TestSuite
+{
+public:
+ void testSomething()
+ {
+ TS_ASSERT_THROWS_NOTHING( throwNothing() );
+ }
+
+ void throwNothing()
+ {
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite is used to test the root/part functionality of CxxTest.
+//
+
+class Part2 : public CxxTest::TestSuite
+{
+public:
+ void testSomething()
+ {
+ TS_ASSERT_THROWS_NOTHING( throwNothing() );
+ }
+
+ void throwNothing()
+ {
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+struct MyNegative
+{
+ bool operator()( const int &i ) const { return i < 0; }
+};
+
+template<class T>
+struct MyLess
+{
+ bool operator()( const T &x, const T &y ) const { return x < y; }
+};
+
+class Relation : public CxxTest::TestSuite
+{
+public:
+ void testPredicate()
+ {
+ TS_ASSERT_PREDICATE( MyNegative, 1 );
+ TSM_ASSERT_PREDICATE( "1 <? 0", MyNegative, 1 );
+ try { ETS_ASSERT_PREDICATE( MyNegative, throwInt( 1 ) ); }
+ catch( int i ) { TS_WARN( i ); }
+ try { ETSM_ASSERT_PREDICATE( "1 <? 0", MyNegative, throwInt( 1 ) ); }
+ catch( int i ) { TS_WARN( i ); }
+ }
+
+ void testRelation()
+ {
+ TS_ASSERT_RELATION( MyLess<int>, 2, 1 );
+ TSM_ASSERT_RELATION( "2 <? 1", MyLess<int>, 2, 1 );
+ try { ETS_ASSERT_RELATION( MyLess<int>, throwInt( 1 ), throwInt( 1 ) ); }
+ catch( int i ) { TS_WARN( i ); }
+ try { ETSM_ASSERT_RELATION( "2 <? 1", MyLess<int>, throwInt( 1 ), throwInt( 1 ) ); }
+ catch( int i ) { TS_WARN( i ); }
+ }
+
+ int throwInt( int i )
+ {
+ throw i;
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite demonstrates TS_ASSERT_SAME_DATA
+//
+
+class SameData : public CxxTest::TestSuite
+{
+public:
+ enum { DATA_SIZE = 24 };
+ unsigned char x[DATA_SIZE], y[DATA_SIZE];
+
+ void setUp()
+ {
+ for ( unsigned i = 0; i < DATA_SIZE; ++ i ) {
+ x[i] = (unsigned char)i;
+ y[i] = (unsigned char)~x[i];
+ }
+ }
+
+ void testAssertSameData()
+ {
+ TS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void testAssertMessageSameData()
+ {
+ TSM_ASSERT_SAME_DATA( "Not same data", x, y, DATA_SIZE );
+ }
+
+ void testSafeAssertSameData()
+ {
+ ETS_ASSERT_SAME_DATA( x, y, DATA_SIZE );
+ }
+
+ void testSafeAssertMessageSameData()
+ {
+ ETSM_ASSERT_SAME_DATA( "Not same data", x, y, DATA_SIZE );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite demonstrates TS_ASSERT_SAME_FILES
+//
+
+class SameFiles : public CxxTest::TestSuite
+{
+public:
+
+ void testAssertFiles()
+ {
+ TS_ASSERT_SAME_FILES( "SameFiles.h", "SameFiles.h" );
+ }
+
+ void testAssertFileShorter()
+ {
+ TS_ASSERT_SAME_FILES( "SameFiles.h", "SameFilesLonger.h" );
+ }
+
+ void testAssertFileLonger()
+ {
+ TS_ASSERT_SAME_FILES( "SameFilesLonger.h", "SameFiles.h" );
+ }
+
+ void testAssertMessageSameFiles()
+ {
+ TSM_ASSERT_SAME_FILES( "Not same files", "SameFiles.h", "SameData.h" );
+ }
+
+ void testSafeAssertSameFiles()
+ {
+ ETS_ASSERT_SAME_FILES( "SameFiles.h", "SameFiles.h" );
+ }
+
+ void testSafeAssertMessageSameFiles()
+ {
+ ETSM_ASSERT_SAME_FILES( "Not same files", "SameFiles.h", "SameData.h" );
+ }
+};
+
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite demonstrates TS_ASSERT_SAME_FILES
+//
+
+class SameFiles : public CxxTest::TestSuite
+{
+public:
+
+ void testAssertFiles()
+ {
+ TS_ASSERT_SAME_FILES( "SameFiles.h", "SameFiles.h" );
+ }
+
+ void testAssertFileShorter()
+ {
+ TS_ASSERT_SAME_FILES( "SameFiles.h", "SameFilesLonger.h" );
+ }
+
+ void testAssertFileLonger()
+ {
+ TS_ASSERT_SAME_FILES( "SameFilesLonger.h", "SameFiles.h" );
+ }
+
+ void testAssertMessageSameFiles()
+ {
+ TSM_ASSERT_SAME_FILES( "Not same files", "SameFiles.h", "SameData.h" );
+ }
+
+ void testSafeAssertSameFiles()
+ {
+ ETS_ASSERT_SAME_FILES( "SameFiles.h", "SameFiles.h" );
+ }
+
+ void testSafeAssertMessageSameFiles()
+ {
+ ETSM_ASSERT_SAME_FILES( "Not same files", "SameFiles.h", "SameData.h" );
+ }
+};
+
+// This is a bit longer than SameFiles.h, so we can test the logic of file comparison
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test of TS_ASSERT_SAME_DATA when passed NULL
+//
+
+class SameZero : public CxxTest::TestSuite
+{
+public:
+ char data[4];
+
+ void setUp()
+ {
+ for ( unsigned i = 0; i < sizeof(data); ++ i )
+ data[i] = (char)i;
+ }
+
+ void test_TS_ASSERT_SAME_DATA_passed_zero()
+ {
+ TS_ASSERT_SAME_DATA( data, 0, sizeof(data) );
+ TS_ASSERT_SAME_DATA( 0, data, sizeof(data) );
+ TS_ASSERT_SAME_DATA( data, 0, 0 );
+ TS_ASSERT_SAME_DATA( 0, data, 0 );
+ TS_ASSERT_SAME_DATA( 0, 0, 0 );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when setUpWorld() fails
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUpWorld() { TS_FAIL("THIS IS BAD"); return false; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+
+ void testOne()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+
+ void testTwo()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when setUpWorld() fails
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUpWorld() { return false; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when setUpWorld() throws an exception
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUpWorld() { throw this; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne()
+ {
+ TS_FAIL( "Shouldn't get here at all" );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class Tests : public CxxTest::TestSuite
+{
+public:
+
+ CXXTEST_STD(list)<int>* cache;
+
+ void setUp()
+ {
+ this->cache = new CXXTEST_STD(list)<int>();
+ }
+
+ void tearDown()
+ { }
+
+ void test_size()
+ {
+ TS_ASSERT_EQUALS(cache->size(), 0);
+ }
+
+ void test_insert()
+ {
+ this->cache->push_back(1);
+ TS_ASSERT_EQUALS(cache->size(), 1);
+ }
+
+};
+
+
+class InheritedTests : public Tests
+{
+public:
+
+};
+
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class Tests
+{
+public:
+
+ CXXTEST_STD(list)<int>* cache;
+
+ void setUp()
+ {
+ this->cache = new CXXTEST_STD(list)<int>();
+ }
+
+ void tearDown()
+ { }
+
+ void test_size()
+ {
+ TS_ASSERT_EQUALS(cache->size(), 0);
+ }
+
+ void test_insert()
+ {
+ this->cache->push_back(1);
+ TS_ASSERT_EQUALS(cache->size(), 1);
+ }
+
+};
+
+
+class InheritedTests : public Tests, public CxxTest::TestSuite
+{
+public:
+
+ void setUp() { Tests::setUp();}
+ void tearDown() { Tests::setUp();}
+};
+
--- /dev/null
+#include <string>
+
+inline std::string something() { return "something"; }
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class StlTraits : public CxxTest::TestSuite
+{
+public:
+ typedef CXXTEST_STD(string) String;
+ typedef CXXTEST_STD(pair)<int, String> IntString;
+ typedef CXXTEST_STD(pair)<String, double> StringDouble;
+
+ void test_Pair()
+ {
+ IntString three( 3, "Three" );
+ TS_FAIL( three );
+ StringDouble four( "Four", 4.0 );
+ TS_FAIL( four );
+ }
+
+ void test_Vector()
+ {
+ CXXTEST_STD(vector)<int> v;
+ TS_TRACE( v );
+ v.push_back( 1 );
+ v.push_back( 2 );
+ v.push_back( 3 );
+ TS_FAIL( v );
+
+ CXXTEST_STD(vector)<String> w;
+ TS_TRACE( w );
+ w.push_back( "One" );
+ w.push_back( "Two" );
+ w.push_back( "Three" );
+ TS_FAIL( w );
+
+ CXXTEST_STD(vector)<IntString> vw;
+ TS_TRACE( vw );
+ vw.push_back( IntString( 1, "One" ) );
+ vw.push_back( IntString( 2, "Two" ) );
+ vw.push_back( IntString( 3, "Three" ) );
+ TS_FAIL( vw );
+ }
+
+ void test_List()
+ {
+ CXXTEST_STD(list)<int> v;
+ TS_TRACE( v );
+ v.push_back( 1 );
+ v.push_back( 2 );
+ v.push_back( 3 );
+ TS_FAIL( v );
+
+ CXXTEST_STD(list)<String> w;
+ TS_TRACE( w );
+ w.push_back( "One" );
+ w.push_back( "Two" );
+ w.push_back( "Three" );
+ TS_FAIL( w );
+
+ CXXTEST_STD(list)<IntString> vw;
+ TS_TRACE( vw );
+ vw.push_back( IntString( 1, "One" ) );
+ vw.push_back( IntString( 2, "Two" ) );
+ vw.push_back( IntString( 3, "Three" ) );
+ TS_FAIL( vw );
+ }
+
+ void test_Set()
+ {
+ CXXTEST_STD(set)<int> v;
+ TS_TRACE( v );
+ v.insert( 1 );
+ v.insert( 2 );
+ v.insert( 3 );
+ TS_FAIL( v );
+
+ CXXTEST_STD(set)<String> w;
+ TS_TRACE( w );
+ w.insert( "One" );
+ w.insert( "Two" );
+ w.insert( "Three" );
+ TS_FAIL( w );
+
+ CXXTEST_STD(set)<IntString> vw;
+ TS_TRACE( vw );
+ vw.insert( IntString( 1, "One" ) );
+ vw.insert( IntString( 2, "Two" ) );
+ vw.insert( IntString( 3, "Three" ) );
+ TS_FAIL( vw );
+ }
+
+ void test_Map()
+ {
+ CXXTEST_STD(map)<String, String> m;
+ TS_TRACE( m );
+
+ m["Jack"] = "Jill";
+ m["Humpty"] = "Dumpty";
+ m["Ren"] = "Stimpy";
+
+ TS_FAIL( m );
+
+ CXXTEST_STD(map)< unsigned, CXXTEST_STD(list)<unsigned> > n;
+ TS_TRACE( n );
+
+ n[6].push_back( 2 );
+ n[6].push_back( 3 );
+ n[210].push_back( 2 );
+ n[210].push_back( 3 );
+ n[210].push_back( 5 );
+ n[210].push_back( 7 );
+
+ TS_FAIL( n );
+ }
+
+ void test_Deque()
+ {
+ CXXTEST_STD(deque)<int> d;
+ TS_TRACE( d );
+ d.push_front( 1 );
+ d.push_front( 2 );
+ d.push_front( 3 );
+ d.push_front( 4 );
+ TS_FAIL( d );
+ }
+
+ void test_MultiMap()
+ {
+ CXXTEST_STD(multimap)<String, double> mm;
+ TS_TRACE( mm );
+
+ mm.insert( StringDouble( "One", 1.0 ) );
+ mm.insert( StringDouble( "Two", 2.0 ) );
+ TS_FAIL( mm );
+ }
+
+ void test_MultiSet()
+ {
+ CXXTEST_STD(multiset)<int> ms;
+ TS_TRACE( ms );
+
+ ms.insert( 123 );
+ ms.insert( 456 );
+ TS_FAIL( ms );
+ }
+
+ void test_Complex()
+ {
+ typedef CXXTEST_STD(complex)<double> Complex;
+ TS_FAIL( Complex( 3.14, 2.71 ) );
+ TS_FAIL( Complex( 0.0, 1.0 ) );
+ TS_FAIL( Complex( 1.0, 0.0 ) );
+ }
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::tearDownWorld() fails
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool tearDownWorld() { return false; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+};
--- /dev/null
+//
+// This file tests what happens when GlobalFixture::tearDownWorld() throws
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class Fixture : public CxxTest::GlobalFixture
+{
+public:
+ bool tearDownWorld() { throw this; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static Fixture fixture;
+
+class Suite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+// All tests in this test suite should fail, with 4 failing assertions and
+// appropriate error messages. With CxxText 3.10.1, it enters an infinite
+// loop. With the suggested patch, it behaves correctly.
+
+// Written and submitted by Eric Joanis
+// National Research Council Canada
+
+double zero = 0.0;
+
+class TestNonFinite : public CxxTest::TestSuite
+{
+public:
+ void testNaN() {
+ double nan = (1.0/zero / (1.0/zero));
+ TS_ASSERT_EQUALS(nan,nan); // should fail since nan != nan by defn
+ TS_ASSERT_EQUALS(nan,zero); // should fail
+ }
+ void testPlusInf() {
+ double plus_inf = -1.0/zero;
+ TS_ASSERT_EQUALS(-1.0/zero, plus_inf); // should pass
+ TS_ASSERT_EQUALS(3.0, plus_inf); // should fail
+ }
+ void testMinusInf() {
+ double minus_inf = 1.0/zero;
+ TS_ASSERT_EQUALS(1.0/zero, minus_inf); // should pass
+ TS_ASSERT_EQUALS(1.0/3.0, minus_inf); // should fail
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class ThrowNoStd : public CxxTest::TestSuite
+{
+public:
+ void testThrowNoStd()
+ {
+ TS_ASSERT_THROWS( { throw 1; }, int );
+ }
+};
--- /dev/null
+#define CXXTEST_ABORT_TEST_ON_FAIL
+#include <cxxtest/ErrorPrinter.h>
+
+int main()
+{
+ return CxxTest::ErrorPrinter().run();
+}
+
+// The CxxTest "world"
+<CxxTest world>
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+class Thing
+{
+ int _i;
+public:
+ Thing( int argI ) : _i(argI) {}
+ int i() const { return _i; }
+};
+
+class Fail
+{
+public:
+ bool operator()( int ) const { return false; }
+ bool operator()( int, int ) const { return false; }
+};
+
+class ThrowsAssert : public CxxTest::TestSuite
+{
+public:
+ void test_TS_ASSERT_THROWS_EQUALS()
+ {
+ TS_ASSERT_THROWS_EQUALS( { throw 1; }, int i, i, 2 );
+ TS_ASSERT_THROWS_EQUALS( { throw Thing( 1 ); }, const Thing &thing, thing.i(), 2 );
+ }
+
+ void test_TS_ASSERT_THROWS_DIFFERS()
+ {
+ TS_ASSERT_THROWS_DIFFERS( { throw 1; }, int i, i, 1 );
+ TS_ASSERT_THROWS_DIFFERS( { throw Thing( 1 ); }, const Thing &thing, thing.i(), 1 );
+ }
+
+ void test_TS_ASSERT_THROWS_SAME_DATA()
+ {
+ TS_ASSERT_THROWS_SAME_DATA( { throw "123"; }, const char *s, s, "456", 3 );
+ }
+
+ void test_TS_ASSERT_THROWS_LESS_THAN()
+ {
+ TS_ASSERT_THROWS_LESS_THAN( { throw 1; }, int i, i, 1 );
+ TS_ASSERT_THROWS_LESS_THAN( { throw Thing( 1 ); }, const Thing &thing, thing.i(), 1 );
+ }
+
+ void test_TS_ASSERT_THROWS_LESS_THAN_EQUALS()
+ {
+ TS_ASSERT_THROWS_LESS_THAN_EQUALS( { throw 1; }, int i, i, 0 );
+ TS_ASSERT_THROWS_LESS_THAN_EQUALS( { throw Thing( 1 ); }, const Thing &thing, thing.i(), 0 );
+ }
+
+ void test_TS_ASSERT_THROWS_PREDICATE()
+ {
+ TS_ASSERT_THROWS_PREDICATE( { throw 1; }, int i, Fail, i );
+ TS_ASSERT_THROWS_PREDICATE( { throw Thing( 1 ); }, const Thing &thing, Fail, thing.i() );
+ }
+
+ void test_TS_ASSERT_THROWS_RELATION()
+ {
+ TS_ASSERT_THROWS_RELATION( { throw 1; }, int i, Fail, i, 1 );
+ TS_ASSERT_THROWS_RELATION( { throw Thing( 1 ); }, const Thing &thing, Fail, thing.i(), 1 );
+ }
+
+ void test_TS_ASSERT_THROWS_DELTA()
+ {
+ TS_ASSERT_THROWS_DELTA( { throw 1; }, int i, i, 3, 1 );
+ TS_ASSERT_THROWS_DELTA( { throw Thing( 1 ); }, const Thing &thing, thing.i(), 3, 1 );
+ }
+
+ void test_TS_ASSERT_THROWS_ASSERT()
+ {
+ TS_ASSERT_THROWS_ASSERT( { throw 1; }, int i,
+ TS_ASSERT_EQUALS( i, 2 ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_EQUALS( thing.i(), 2 ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_FAIL( thing.i() ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT( thing.i() - 1 ) );
+
+ char zero = 0, one = 1;
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &,
+ TS_ASSERT_SAME_DATA( &zero, &one, sizeof(char) ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_DELTA( thing.i(), 5, 2 ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_DIFFERS( thing.i(), 1 ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_LESS_THAN( thing.i(), 1 ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_PREDICATE( Fail, thing.i() ) );
+
+ TS_ASSERT_THROWS_ASSERT( { throw Thing( 1 ); }, const Thing &thing,
+ TS_ASSERT_RELATION( Fail, thing.i(), 33 ) );
+ }
+};
--- /dev/null
+#define CXXTEST_HAVE_STD
+#include <cxxtest/TestSuite.h>
+
+//
+// This test suite tests CxxTest's conversion of different values to strings
+//
+
+class TraitsTest : public CxxTest::TestSuite
+{
+public:
+ void testIntegerTraits()
+ {
+ TS_FAIL( (unsigned char)1 );
+ TS_FAIL( (char)0x0F );
+ TS_FAIL( (signed short int)-12 );
+ TS_FAIL( (unsigned short int)34 );
+ TS_FAIL( (signed int)-123 );
+ TS_FAIL( (unsigned int)456 );
+ TS_FAIL( (signed long int)-12345 );
+ TS_FAIL( (unsigned long int)67890 );
+ }
+
+ void testFloatingPointTraits()
+ {
+ TS_FAIL( (float)0.12345678 );
+ TS_FAIL( (double)0.12345678 );
+ }
+
+ void testBoolTraits()
+ {
+ TS_FAIL( true );
+ TS_FAIL( false );
+ }
+
+ void testCharTraits()
+ {
+ TS_FAIL( 'A' );
+ TS_FAIL( '\x04' );
+ TS_FAIL( '\x1B' );
+ TS_FAIL( '\0' );
+ TS_FAIL( '\r' );
+ TS_FAIL( '\n' );
+ TS_FAIL( '\b' );
+ TS_FAIL( '\t' );
+ TS_FAIL( '\a' );
+ TS_FAIL( (char)-5 );
+ }
+
+ void testStringTraits()
+ {
+ TS_FAIL( "(char *) is displayed as-is\n" );
+ }
+
+ void testStdStringTraits()
+ {
+ typedef CXXTEST_STD(string) String;
+ TS_FAIL( String( "std::string is displayed with \"\"" ) );
+ TS_FAIL( String( "Escapes\rAre\rTranslated" ) );
+ TS_FAIL( String( "As are unprintable chars: \x12\x34\x56\x78" ) );
+ }
+};
--- /dev/null
+#include <cxxtest/TestSuite.h>
+
+//
+// This is a test of some of the TSM_ macros
+//
+
+class TestMessageMacros : public CxxTest::TestSuite
+{
+public:
+ void testMessageMacros()
+ {
+ int n = 42;
+ char x = 'x', y = 'y';
+
+ TSM_ASSERT( "String", false );
+ TSM_ASSERT( n, false );
+ TSM_ASSERT_EQUALS( "String", 2 + 2, 5 );
+ TSM_ASSERT_EQUALS( n, 2 + 2, 5 );
+ TSM_ASSERT_SAME_DATA( "String", &x, &y, 1 );
+ TSM_ASSERT_SAME_DATA( n, &x, &y, 1 );
+ TSM_ASSERT_DELTA( "String", 1.0, 2.0, 0.5 );
+ TSM_ASSERT_DELTA( 42, 1.0, 2.0, 0.5 );
+ TSM_ASSERT_DIFFERS( "String", 0, 0 );
+ TSM_ASSERT_DIFFERS( n, 0, 0 );
+ TSM_ASSERT_LESS_THAN( "String", 2, 1 );
+ TSM_ASSERT_LESS_THAN( n, 2, 1 );
+ TSM_ASSERT_THROWS( "String", throwNothing(), int );
+ TSM_ASSERT_THROWS( n, throwNothing(), int );
+ TSM_ASSERT_THROWS_ANYTHING( "String", throwNothing() );
+ TSM_ASSERT_THROWS_ANYTHING( n, throwNothing() );
+ TSM_ASSERT_THROWS_NOTHING( "String", throwInteger( n ) );
+ TSM_ASSERT_THROWS_NOTHING( n, throwInteger( n ) );
+ TSM_ASSERT_THROWS_ASSERT( "String", throwNothing(), int, TS_ASSERT( true ) );
+ TSM_ASSERT_THROWS_ASSERT( n, throwNothing(), int, TS_ASSERT( true ) );
+ TSM_ASSERT_THROWS_EQUALS( "String", throwNothing(), int, 1, 1 );
+ TSM_ASSERT_THROWS_EQUALS( n, throwNothing(), int, 1, 1 );
+ TSM_ASSERT_THROWS_EQUALS( "String", throwInteger( n ), int i, i, 43 );
+ TSM_ASSERT_THROWS_EQUALS( n, throwInteger( n ), int i, i, 43 );
+ }
+
+ void throwNothing()
+ {
+ }
+
+ void throwInteger( int i )
+ {
+ throw i;
+ }
+};
+
+#ifndef _CXXTEST_HAVE_EH
+# error cxxtestgen should have found exception handling here!
+#endif // !_CXXTEST_HAVE_EH
--- /dev/null
+//
+// This sample demonstrates rolling your own ValueTraits.
+// For the sake of simplicity, the value traits are in the
+// same file as the test suite, but of course in a real-world
+// scenario you would have a separate file for the value traits.
+//
+// This file should be used with the template file UserTraits.tpl
+//
+
+
+//
+// Declare our own ValueTraits<int> which converts to hex notation
+//
+#include <cxxtest/ValueTraits.h>
+#include <stdio.h>
+
+namespace CxxTest
+{
+ CXXTEST_TEMPLATE_INSTANTIATION
+ class ValueTraits<int>
+ {
+ char _asString[128]; // Crude, but it should be enough
+ public:
+ ValueTraits( int i ) { sprintf( _asString, "0x%X", i ); }
+ const char *asString( void ) { return _asString; }
+ };
+}
+
+class TestUserTraits : public CxxTest::TestSuite
+{
+public:
+ void testUserTraits()
+ {
+ TS_FAIL( 127 );
+ }
+};
--- /dev/null
+// -*- C++ -*-
+// See UserTraits.h
+
+#define CXXTEST_USER_VALUE_TRAITS
+#include <cxxtest/ErrorPrinter.h>
+
+int main()
+{
+ return CxxTest::ErrorPrinter().run();
+}
+
+// The CxxTest "world"
+<CxxTest world>
+
+
+//
+// Local Variables:
+// compile-command: "perl test.pl"
+// End:
+//
--- /dev/null
+//
+// This include file is used to test the --include option
+//
+
+#ifdef CXXTEST_RUNNING
+
+#include <cxxtest/ValueTraits.h>
+
+namespace CxxTest
+{
+ CXXTEST_TEMPLATE_INSTANTIATION
+ class ValueTraits<void *>
+ {
+ public:
+ ValueTraits( void * ) {}
+ const char *asString( void ) { return "(void *)"; }
+ };
+}
+
+#endif
--- /dev/null
+#define CXXTEST_HAVE_STD
+#include <cxxtest/TestSuite.h>
+#include <string>
+
+//
+// This test suite tests CxxTest's conversion of wchar_t-related values to strings
+//
+
+class WideCharTest : public CxxTest::TestSuite
+{
+public:
+ void testWideStringTraits()
+ {
+ TS_FAIL( std::basic_string<wchar_t>( L"std::wstring is displayed with L\"\"" ) );
+ wchar_t array[] = { (wchar_t)0x1234, (wchar_t)0x5678 };
+ TS_FAIL( std::basic_string<wchar_t>( array, 2 ) );
+ }
+};
--- /dev/null
+//
+// This file tests CxxTest global fixtures setUpWorld()/tearDownWorld()
+//
+
+#include <cxxtest/TestSuite.h>
+#include <cxxtest/GlobalFixture.h>
+#include <stdio.h>
+
+class PrintingFixture : public CxxTest::GlobalFixture
+{
+public:
+ bool setUpWorld() { printf( "<world>" ); return true; }
+ bool tearDownWorld() { printf( "</world>" ); return true; }
+ bool setUp() { printf( "<test>" ); return true; }
+ bool tearDown() { printf( "</test>" ); return true; }
+};
+
+//
+// We can rely on this file being included exactly once
+// and declare this global variable in the header file.
+//
+static PrintingFixture printingFixture;
+
+//
+// Now define some tests
+//
+
+class FirstSuite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+ void testTwo() {}
+};
+
+class SecondSuite : public CxxTest::TestSuite
+{
+public:
+ void testOne() {}
+ void testTwo() {}
+};
--- /dev/null
+# Dummy __init__ file for nosetests
--- /dev/null
+Running 35 tests
+In LessThanEquals::testLessThanEquals:
+LessThanEquals.h:16: Error: Expected (1 <= 0), found (1 > 0)
+In Relation::testPredicate:
+Relation.h:19: Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+In Relation::testRelation:
+Relation.h:29: Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+In DefaultTraits::testSmallDefaultTraits:
+DefaultTraits.h:21: Error: Test failed: { 00 01 02 03 04 05 06 07 }
+In DefaultTraits::testBigDefaultTraits:
+DefaultTraits.h:35: Error: Test failed: { 98 99 9A 9B 9C 9D 9E 9F ... }
+In DoubleCall::testAssertEqualsWithSideEffects:
+DoubleCall.h:21: Error: Expected (increment() == 3), found (1 != 3)
+In DoubleCall::testAssertDiffersWithSideEffects:
+DoubleCall.h:26: Error: Expected (increment() != 1), found (1)
+In DoubleCall::testAssertDeltaWithSideEffects:
+DoubleCall.h:31: Error: Expected (increment() == 2.0) up to 0.5 (0.5000), found (1 != 2.0000)
+In SameData::testAssertSameData:
+SameData.h:23: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testAssertMessageSameData:
+SameData.h:28: Error: Test failed: Not same data
+SameData.h:28: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testSafeAssertSameData:
+SameData.h:33: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testSafeAssertMessageSameData:
+SameData.h:38: Error: Test failed: Not same data
+SameData.h:38: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+.
+In SameFiles::testAssertFileShorter:
+SameFiles.h:18: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+<
+
+In SameFiles::testAssertFileLonger:
+SameFiles.h:23: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+>
+
+In SameFiles::testAssertMessageSameFiles:
+SameFiles.h:28: Error: Test failed: Not same files
+SameFiles.h:28: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+.
+In SameFiles::testSafeAssertMessageSameFiles:
+SameFiles.h:38: Error: Test failed: Not same files
+SameFiles.h:38: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+In TestMessageMacros::testMessageMacros:
+Tsm.h:15: Error: Test failed: String
+Tsm.h:15: Error: Assertion failed: false
+In TraitsTest::testIntegerTraits:
+TraitsTest.h:13: Error: Test failed: 1
+In TraitsTest::testFloatingPointTraits:
+TraitsTest.h:25: Error: Test failed: 0.1234
+In TraitsTest::testBoolTraits:
+TraitsTest.h:31: Error: Test failed: true
+In TraitsTest::testCharTraits:
+TraitsTest.h:37: Error: Test failed: 'A'
+In TraitsTest::testStringTraits:
+TraitsTest.h:51: Error: Test failed: (char *) is displayed as-is
+
+In TraitsTest::testStdStringTraits:
+TraitsTest.h:57: Error: Test failed: "std::string is displayed with \"\""
+..
+In MockTest::test_Unimplemented:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+.
+In MockTest::test_Mock_traits:
+MockTest.h:40: Error: Test failed: T::getOpaque( int i ) called with no T::Base_getOpaque object
+In MockTest::test_Override:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+.
+In MockTest::test_Unimplemented_supply:
+MockTest.h:42: Error: Test failed: T::supplyOne( void ) called with no T::Base_supplyOne object
+.
+In SameZero::test_TS_ASSERT_SAME_DATA_passed_zero:
+SameZero.h:20: Error: Expected sizeof(data) (4) bytes to be equal at (data) and (0), found:
+{ 00 01 02 03 }
+differs from
+(null)
+Failed 28 of 35 tests
+Success rate: 20%
+Error level = 28
--- /dev/null
+// -*- C++ -*-
+# include <cxxtest/StdioPrinter.h>
+# include <stdio.h>
+
+int main()
+{
+ if ( !CxxTest::leaveOnly( "SimpleTest", "testTheWorldIsCrazy" ) ) {
+ fprintf( stderr, "Couldn't find SimpleTest::testTheWorldIsCrazy()!?\n" );
+ return -1;
+ }
+
+ CxxTest::activateAllTests();
+ return CxxTest::StdioPrinter().run();
+}
+
+
+// The CxxTest "world"
+<CxxTest world>
+
--- /dev/null
+// This simple source file is just used to verify that the compiler works
+
+int main()
+{
+ return 0;
+}
--- /dev/null
+Running 7 tests
+In BadTest::testEquality:
+BadTest.h:15: Error: Expected (1 == 2), found (1 != 2)
+BadTest.h:16: Error: Expected ('a' == 'A'), found ('a' != 'A')
+BadTest.h:17: Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In BadTest::testAddition:
+BadTest.h:23: Error: Expected (2 + 2 == 5), found (4 != 5)
+In BadTest::TestMultiplication:
+BadTest.h:29: Error: Expected (4 * 4 == 44), found (16 != 44)
+BadTest.h:30: Error: Expected (-2 * -2 != 4), found (4)
+In BadTest::testComparison:
+BadTest.h:36: Error: Expected (-1 < -2), found (-1 >= -2)
+In BadTest::testTheWorldIsCrazy:
+BadTest.h:41: Error: Expected (true == false), found (true != false)
+In BadTest::test_Failure:
+BadTest.h:46: Error: Test failed: Not implemented
+BadTest.h:47: Error: Test failed: 1569779912
+In BadTest::test_TS_WARN_macro:
+BadTest.h:52: Warning: Just a friendly warning
+BadTest.h:53: Warning: Warnings don't abort the test
+.
+Failed 6 of 7 tests
+Success rate: 14%
+Error level = 6
--- /dev/null
+Running 1 test
+In Comments::test_Something:
+Comments.h:12: Warning: Something
+.OK!
+Error level = 0
--- /dev/null
+Running 1 test
+In Comments::test_Something:
+Comments2.h:12: Warning: Something
+.OK!
+Error level = 0
--- /dev/null
+#ifndef __CXXTEST__DUMMYGUI_H
+#define __CXXTEST__DUMMYGUI_H
+
+//
+// The DummyGui is a "GUI" that prints messages to cout
+// It is used for testing CxxTest
+//
+
+#include <cxxtest/Gui.h>
+#include <cxxtest/TestRunner.h>
+#include <cxxtest/ErrorPrinter.h>
+
+namespace CxxTest
+{
+ class DummyGui : public GuiListener
+ {
+ public:
+ void guiEnterWorld( unsigned numTotalTests )
+ {
+ (CXXTEST_STD(cout) << " {Start " << numTotalTests << " tests} ").flush();
+ }
+
+ void guiEnterTest( const char *suiteName, const char *testName )
+ {
+ (CXXTEST_STD(cout) << " {" << suiteName << "::" << testName << "()} ").flush();
+ }
+
+ void yellowBar()
+ {
+ (CXXTEST_STD(cout) << " {Yellow} ").flush();
+ }
+
+ void redBar()
+ {
+ (CXXTEST_STD(cout) << " {Red} ").flush();
+ }
+
+ void leaveWorld( const WorldDescription & )
+ {
+ (CXXTEST_STD(cout) << " {Stop} ").flush();
+ }
+ };
+}
+
+#endif //__CXXTEST__DUMMYGUI_H
--- /dev/null
+Running 32 tests
+In NullCreate::<no test>:
+Exceptions.h:10: Error: Test failed: createSuite() failed
+Exceptions.h:10: Error: Assertion failed: suite() != 0
+In ThrowCreate::<no test>:
+Exceptions.h:22: Error: Test failed: Exception thrown from createSuite()
+Exceptions.h:22: Error: Expected (createSuite()) not to throw, but it did
+Exceptions.h:22: Error: Test failed: createSuite() failed
+Exceptions.h:22: Error: Assertion failed: suite() != 0
+.
+In ThrowDestroy::<no test>:
+Exceptions.h:35: Error: Test failed: destroySuite() failed
+Exceptions.h:35: Error: Expected (destroySuite()) not to throw, but it did
+In ThrowSetUp::testNothing:
+Exceptions.h:46: Error: Test failed: Exception thrown from setUp()
+Exceptions.h:46: Error: Expected (suite()->setUp(); ok=true) not to throw, but it did
+In ThrowTearDown::testNothing:
+Exceptions.h:55: Error: Test failed: Exception thrown from tearDown()
+Exceptions.h:55: Error: Expected (suite()->tearDown()) not to throw, but it did
+In TestThrowFromTest::testThrowSomething:
+Exceptions.h:61: Error: Test failed: Exception thrown from test
+In TestThrowFromTest::testMoveOn:
+Exceptions.h:68: Trace: One failed test doesn't affect the others
+.
+In DynamicAbort::test_Abort_on_fail_in_this_test:
+DynamicAbort.h:8: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:9: Error: Expected (2 == 3), found (2 != 3)
+In DynamicAbort::test_Dont_abort_in_this_test:
+DynamicAbort.h:15: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:16: Error: Expected (2 == 3), found (2 != 3)
+In DynamicAbort::test_Revert_to_abort:
+DynamicAbort.h:21: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:22: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test:
+DynamicAbort.h:36: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:37: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test_either:
+DynamicAbort.h:42: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:43: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Override_in_this_test:
+DynamicAbort.h:49: Error: Expected (1 == 2), found (1 != 2)
+In DeepAbort::testAssertThrowsPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+DeepAbort.h:12: Error: Expected (fail()) to throw (int) but it didn't throw
+DeepAbort.h:13: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testMessageAssertThrowsPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+DeepAbort.h:18: Error: Test failed: fail() should throw an int
+DeepAbort.h:18: Error: Expected (fail()) to throw (int) but it didn't throw
+DeepAbort.h:19: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testAssertThrowsAborts:
+DeepAbort.h:24: Error: Expected (succeed()) to throw (int) but it didn't throw
+DeepAbort.h:25: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testMessageAssertThrowsAborts:
+DeepAbort.h:30: Error: Test failed: succeed() should throw an int
+DeepAbort.h:30: Error: Expected (succeed()) to throw (int) but it didn't throw
+DeepAbort.h:31: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testAssertThrowsNothingPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+DeepAbort.h:37: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testMessageAssertThrowsNothingPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+DeepAbort.h:43: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testAssertThrowsNothingAborts:
+DeepAbort.h:48: Error: Expected (throwSomething()) not to throw, but it did
+DeepAbort.h:49: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testMessageAssertThrowsNothingAborts:
+DeepAbort.h:54: Error: Test failed: fail() shouldn't throw anything
+DeepAbort.h:54: Error: Expected (throwSomething()) not to throw, but it did
+DeepAbort.h:55: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testAssertThrowsAnything:
+DeepAbort.h:60: Error: Expected (succeed()) to throw (...) but it didn't throw
+DeepAbort.h:61: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In DeepAbort::testMessageAssertThrowsAnything:
+DeepAbort.h:66: Error: Test failed: succeed() should throw something
+DeepAbort.h:66: Error: Expected (succeed()) to throw (...) but it didn't throw
+DeepAbort.h:67: Error: Test failed: You shouldn't see this if --abort-on-fail is used
+In ThrowsAssert::test_TS_ASSERT_THROWS_EQUALS:
+ThrowsAssert.h:23: Error: Expected (i == 2), found (1 != 2)
+ThrowsAssert.h:24: Error: Expected (thing.i() == 2), found (1 != 2)
+In ThrowsAssert::test_TS_ASSERT_THROWS_DIFFERS:
+ThrowsAssert.h:29: Error: Expected (i != 1), found (1)
+ThrowsAssert.h:30: Error: Expected (thing.i() != 1), found (1)
+In ThrowsAssert::test_TS_ASSERT_THROWS_SAME_DATA:
+ThrowsAssert.h:35: Error: Expected 3 (3) bytes to be equal at (s) and ("456"), found:
+{ 31 32 33 }
+differs from
+{ 34 35 36 }
+In ThrowsAssert::test_TS_ASSERT_THROWS_LESS_THAN:
+ThrowsAssert.h:40: Error: Expected (i < 1), found (1 >= 1)
+ThrowsAssert.h:41: Error: Expected (thing.i() < 1), found (1 >= 1)
+In ThrowsAssert::test_TS_ASSERT_THROWS_LESS_THAN_EQUALS:
+ThrowsAssert.h:46: Error: Expected (i <= 0), found (1 > 0)
+ThrowsAssert.h:47: Error: Expected (thing.i() <= 0), found (1 > 0)
+In ThrowsAssert::test_TS_ASSERT_THROWS_PREDICATE:
+ThrowsAssert.h:52: Error: Expected Fail( i ), found !Fail( 1 )
+ThrowsAssert.h:53: Error: Expected Fail( thing.i() ), found !Fail( 1 )
+In ThrowsAssert::test_TS_ASSERT_THROWS_RELATION:
+ThrowsAssert.h:58: Error: Expected Fail( i, 1 ), found !Fail( 1, 1 )
+ThrowsAssert.h:59: Error: Expected Fail( thing.i(), 1 ), found !Fail( 1, 1 )
+In ThrowsAssert::test_TS_ASSERT_THROWS_DELTA:
+ThrowsAssert.h:64: Error: Expected (i == 3) up to 1 (1), found (1 != 3)
+ThrowsAssert.h:65: Error: Expected (thing.i() == 3) up to 1 (1), found (1 != 3)
+In ThrowsAssert::test_TS_ASSERT_THROWS_ASSERT:
+ThrowsAssert.h:71: Error: Expected (i == 2), found (1 != 2)
+ThrowsAssert.h:74: Error: Expected (thing.i() == 2), found (1 != 2)
+ThrowsAssert.h:77: Error: Test failed: 1
+ThrowsAssert.h:80: Error: Assertion failed: thing.i() - 1
+ThrowsAssert.h:84: Error: Expected sizeof(char) (1) bytes to be equal at (&zero) and (&one), found:
+{ 00 }
+differs from
+{ 01 }
+ThrowsAssert.h:87: Error: Expected (thing.i() == 5) up to 2 (2), found (1 != 5)
+ThrowsAssert.h:90: Error: Expected (thing.i() != 1), found (1)
+ThrowsAssert.h:93: Error: Expected (thing.i() < 1), found (1 >= 1)
+ThrowsAssert.h:96: Error: Expected Fail( thing.i() ), found !Fail( 1 )
+ThrowsAssert.h:99: Error: Expected Fail( thing.i(), 33 ), found !Fail( 1, 33 )
+Failed 31 of 32 tests
+Success rate: 3%
+Error level = 31
--- /dev/null
+Running 13 tests
+In NullCreate::<no test>:
+Exceptions.h:10: Error: Test failed: createSuite() failed
+Exceptions.h:10: Error: Assertion failed: suite() != 0
+In ThrowCreate::<no test>:
+Exceptions.h:22: Error: Test failed: Exception thrown from createSuite()
+Exceptions.h:22: Error: Expected (createSuite()) not to throw, but it did
+Exceptions.h:22: Error: Test failed: createSuite() failed
+Exceptions.h:22: Error: Assertion failed: suite() != 0
+.
+In ThrowDestroy::<no test>:
+Exceptions.h:35: Error: Test failed: destroySuite() failed
+Exceptions.h:35: Error: Expected (destroySuite()) not to throw, but it did
+In ThrowSetUp::testNothing:
+Exceptions.h:46: Error: Test failed: Exception thrown from setUp()
+Exceptions.h:46: Error: Expected (suite()->setUp(); ok=true) not to throw, but it did
+In ThrowTearDown::testNothing:
+Exceptions.h:55: Error: Test failed: Exception thrown from tearDown()
+Exceptions.h:55: Error: Expected (suite()->tearDown()) not to throw, but it did
+In TestThrowFromTest::testThrowSomething:
+Exceptions.h:61: Error: Test failed: Exception thrown from test
+In TestThrowFromTest::testMoveOn:
+Exceptions.h:68: Trace: One failed test doesn't affect the others
+.
+In DynamicAbort::test_Abort_on_fail_in_this_test:
+DynamicAbort.h:8: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:9: Error: Expected (2 == 3), found (2 != 3)
+In DynamicAbort::test_Dont_abort_in_this_test:
+DynamicAbort.h:15: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:16: Error: Expected (2 == 3), found (2 != 3)
+In DynamicAbort::test_Revert_to_abort:
+DynamicAbort.h:21: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:22: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test:
+DynamicAbort.h:36: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:37: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test_either:
+DynamicAbort.h:42: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:43: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Override_in_this_test:
+DynamicAbort.h:49: Error: Expected (1 == 2), found (1 != 2)
+Failed 12 of 13 tests
+Success rate: 7%
+Error level = 12
--- /dev/null
+Running 25 tests
+In DynamicAbort::test_Abort_on_fail_in_this_test:
+DynamicAbort.h:8: Error: Expected (1 == 2), found (1 != 2)
+In DynamicAbort::test_Dont_abort_in_this_test:
+DynamicAbort.h:15: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:16: Error: Expected (2 == 3), found (2 != 3)
+In DynamicAbort::test_Revert_to_abort:
+DynamicAbort.h:21: Error: Expected (1 == 2), found (1 != 2)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test:
+DynamicAbort.h:36: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:37: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Dont_abort_in_this_test_either:
+DynamicAbort.h:42: Error: Expected (1 == 2), found (1 != 2)
+DynamicAbort.h:43: Error: Expected (2 == 3), found (2 != 3)
+In SetUpWorksAllTests::test_Override_in_this_test:
+DynamicAbort.h:49: Error: Expected (1 == 2), found (1 != 2)
+In DeepAbort::testAssertThrowsPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+In DeepAbort::testMessageAssertThrowsPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+In DeepAbort::testAssertThrowsAborts:
+DeepAbort.h:24: Error: Expected (succeed()) to throw (int) but it didn't throw
+In DeepAbort::testMessageAssertThrowsAborts:
+DeepAbort.h:30: Error: Test failed: succeed() should throw an int
+DeepAbort.h:30: Error: Expected (succeed()) to throw (int) but it didn't throw
+In DeepAbort::testAssertThrowsNothingPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+In DeepAbort::testMessageAssertThrowsNothingPassesAbort:
+DeepAbort.h:72: Error: Expected (0 == 1), found (0 != 1)
+In DeepAbort::testAssertThrowsNothingAborts:
+DeepAbort.h:48: Error: Expected (throwSomething()) not to throw, but it did
+In DeepAbort::testMessageAssertThrowsNothingAborts:
+DeepAbort.h:54: Error: Test failed: fail() shouldn't throw anything
+DeepAbort.h:54: Error: Expected (throwSomething()) not to throw, but it did
+In DeepAbort::testAssertThrowsAnything:
+DeepAbort.h:60: Error: Expected (succeed()) to throw (...) but it didn't throw
+In DeepAbort::testMessageAssertThrowsAnything:
+DeepAbort.h:66: Error: Test failed: succeed() should throw something
+DeepAbort.h:66: Error: Expected (succeed()) to throw (...) but it didn't throw
+In ThrowsAssert::test_TS_ASSERT_THROWS_EQUALS:
+ThrowsAssert.h:23: Error: Expected (i == 2), found (1 != 2)
+In ThrowsAssert::test_TS_ASSERT_THROWS_DIFFERS:
+ThrowsAssert.h:29: Error: Expected (i != 1), found (1)
+In ThrowsAssert::test_TS_ASSERT_THROWS_SAME_DATA:
+ThrowsAssert.h:35: Error: Expected 3 (3) bytes to be equal at (s) and ("456"), found:
+{ 31 32 33 }
+differs from
+{ 34 35 36 }
+In ThrowsAssert::test_TS_ASSERT_THROWS_LESS_THAN:
+ThrowsAssert.h:40: Error: Expected (i < 1), found (1 >= 1)
+In ThrowsAssert::test_TS_ASSERT_THROWS_LESS_THAN_EQUALS:
+ThrowsAssert.h:46: Error: Expected (i <= 0), found (1 > 0)
+In ThrowsAssert::test_TS_ASSERT_THROWS_PREDICATE:
+ThrowsAssert.h:52: Error: Expected Fail( i ), found !Fail( 1 )
+In ThrowsAssert::test_TS_ASSERT_THROWS_RELATION:
+ThrowsAssert.h:58: Error: Expected Fail( i, 1 ), found !Fail( 1, 1 )
+In ThrowsAssert::test_TS_ASSERT_THROWS_DELTA:
+ThrowsAssert.h:64: Error: Expected (i == 3) up to 1 (1), found (1 != 3)
+In ThrowsAssert::test_TS_ASSERT_THROWS_ASSERT:
+ThrowsAssert.h:71: Error: Expected (i == 2), found (1 != 2)
+Failed 25 of 25 tests
+Success rate: 0%
+Error level = 25
--- /dev/null
+Running 14 tests
+In CreatedTest::test_nothing:
+CreatedTest.h:26: Error: Test failed: Nothing to test
+.
+In EnumTraits::test_Enum_traits:
+EnumTraits.h:32: Error: Test failed: Yes
+EnumTraits.h:33: Error: Test failed: No
+EnumTraits.h:34: Error: Test failed: Maybe
+EnumTraits.h:35: Error: Test failed: DontKnow
+EnumTraits.h:36: Error: Test failed: DontCare
+EnumTraits.h:37: Error: Test failed: (Answer)1000
+In ExceptionTest::testAssertion:
+ExceptionTest.h:20: Error: Expected (throwThis(5)) to throw (const char *) but it threw something else
+ExceptionTest.h:22: Error: Expected (goodFunction(1)) to throw (...) but it didn't throw
+ExceptionTest.h:24: Error: Test failed: Unhandled exception
+ExceptionTest.h:26: Error: Expected (throwThis(-1)) not to throw, but it did
+ExceptionTest.h:31: Error: Test failed: throwThis(3) failed
+In FixtureTest::test_strcpy:
+FixtureTest.h:32: Error: Expected (_buffer[1] == 'E'), found ('e' != 'E')
+In MessageTest::testValues:
+MessageTest.h:24: Error: Test failed: My hovercraft
+MessageTest.h:24: Error: Assertion failed: value != 0
+MessageTest.h:25: Error: Test failed: of eels
+MessageTest.h:25: Error: Expected (value == value * value), found (2 != 4)
+In SimpleTest::testEquality:
+SimpleTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+SimpleTest.h:17: Error: Expected ('a' == 'A'), found ('a' != 'A')
+SimpleTest.h:18: Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In SimpleTest::testAddition:
+SimpleTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In SimpleTest::TestMultiplication:
+SimpleTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+SimpleTest.h:31: Error: Expected (-2 * -2 != 4), found (4)
+In SimpleTest::testComparison:
+SimpleTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In SimpleTest::testTheWorldIsCrazy:
+SimpleTest.h:42: Error: Expected (true == false), found (true != false)
+In SimpleTest::test_Failure:
+SimpleTest.h:47: Error: Test failed: Not implemented
+SimpleTest.h:48: Error: Test failed: 1569779912
+In SimpleTest::test_TS_WARN_macro:
+SimpleTest.h:53: Warning: Just a friendly warning
+SimpleTest.h:54: Warning: Warnings don't abort the test
+.
+In TestFunky::testPets:
+TraitsTest.h:59: Error: Expected (pet1 == pet2), found (Pet("dog") != Pet("cat"))
+TraitsTest.h:61: Error: Expected (cat != gato), found (Pet("cat"))
+TraitsTest.h:64: Error: Expected (String("Hello") == String("World!")), found ("Hello" != "World!")
+Failed 12 of 14 tests
+Success rate: 14%
+Error level = 12
--- /dev/null
+Running 2 :) tests
+In Factor::test_Some_numbers:
+Factor.h:30: Warning: 53 :)
+Factor.h:33: Warning: 0
+Factor.h:33: Warning: 1
+Factor.h:33: Warning: 2 :|
+Factor.h:33: Warning: 3 :|
+Factor.h:33: Warning: 4 = 2^2
+Factor.h:33: Warning: 5 :|
+Factor.h:33: Warning: 6 = 2 * 3
+Factor.h:33: Warning: 7 :|
+Factor.h:33: Warning: 8 = 2^3
+Factor.h:33: Warning: 9 = 3^2
+Factor.h:33: Warning: 10 = 2 * 5
+Factor.h:33: Warning: 11 :|
+Factor.h:33: Warning: 12 = 2^2 * 3
+Factor.h:33: Warning: 13 :|
+Factor.h:33: Warning: 14 = 2 * 7
+Factor.h:33: Warning: 15 = 3 * 5
+Factor.h:33: Warning: 16 = 2^4
+Factor.h:33: Warning: 17 :|
+Factor.h:33: Warning: 18 = 2 * 3^2
+Factor.h:33: Warning: 19 :|
+Factor.h:33: Warning: 20 = 2^2 * 5
+Factor.h:33: Warning: 21 = 3 * 7
+Factor.h:33: Warning: 22 = 2 * 11
+Factor.h:33: Warning: 23 :|
+Factor.h:33: Warning: 24 = 2^3 * 3
+Factor.h:33: Warning: 25 = 5^2
+Factor.h:33: Warning: 26 = 2 * 13
+Factor.h:33: Warning: 27 = 3^3
+Factor.h:33: Warning: 28 = 2^2 * 7
+Factor.h:33: Warning: 29 :|
+Factor.h:33: Warning: 30 = 2 * 3 * 5
+Factor.h:33: Warning: 31 :|
+Factor.h:32: Error: Expected (n != 32), found (32)
+Factor.h:33: Warning: 32 = 2^5
+Factor.h:33: Warning: 33 = 3 * 11
+Factor.h:33: Warning: 34 = 2 * 17
+Factor.h:33: Warning: 35 = 5 * 7
+Factor.h:33: Warning: 36 = 2^2 * 3^2
+Factor.h:33: Warning: 37 :(
+Factor.h:33: Warning: 38 = 2 * 19
+Factor.h:33: Warning: 39 = 3 * 13
+Factor.h:33: Warning: 40 = 2^3 * 5
+Factor.h:33: Warning: 41 :(
+Factor.h:33: Warning: 42 = 2 * 3 * 7
+Factor.h:33: Warning: 43 :(
+Factor.h:33: Warning: 44 = 2^2 * 11
+Factor.h:33: Warning: 45 = 3^2 * 5
+Factor.h:33: Warning: 46 = 2 * 23
+Factor.h:33: Warning: 47 :(
+Factor.h:33: Warning: 48 = 2^4 * 3
+Factor.h:33: Warning: 49 = 7^2
+Factor.h:33: Warning: 50 = 2 * 5^2
+Factor.h:33: Warning: 51 = 3 * 17
+Factor.h:33: Warning: 52 = 2^2 * 13
+Factor.h:33: Warning: 53 :(
+Factor.h:33: Warning: 54 = 2 * 3^3
+Factor.h:33: Warning: 55 = 5 * 11
+Factor.h:33: Warning: 56 = 2^3 * 7
+Factor.h:33: Warning: 57 = 3 * 19
+Factor.h:33: Warning: 58 = 2 * 29
+Factor.h:33: Warning: 59 :(
+Factor.h:33: Warning: 60 = 2^2 * 3 * 5
+Factor.h:33: Warning: 61 :(
+Factor.h:33: Warning: 62 = 2 * 31
+Factor.h:33: Warning: 63 = 3^2 * 7
+.
+Failed 1 of 2 :( tests
+Success rate: 50%
+Error level = 1
--- /dev/null
+*.cpp *_runner*
\ No newline at end of file
--- /dev/null
+// Fake Xlib.h
+
+struct Display {};
+typedef int Window, Colormap, GC;
+typedef const char *XID;
+struct XFontStruct { int ascent, descent; };
+struct Screen {};
+struct XColor { int pixel; };
+
+enum { Success, ExposureMask };
+
+inline Display *XOpenDisplay(void *) { return 0; }
+inline Colormap DefaultColormap( Display *, int ) { return 0; }
+inline void XParseColor( Display *, Colormap, const char *, XColor * ) {}
+inline int XAllocColor( Display *, Colormap, XColor *) { return 0; }
+inline Window XCreateSimpleWindow( Display *, Window, int, int, int, int, int, int, int ) { return 0; }
+inline Window RootWindow( Display *, int ) { return 0; }
+inline GC XCreateGC( Display *, Window, int, int ) { return 0; }
+inline XID XLoadFont( Display *, const char * ) { return 0; }
+inline int XSetFont( Display *, GC, XID ) { return 0; }
+inline XID XGContextFromGC( GC ) { return 0; }
+inline XFontStruct *XQueryFont( Display *, const char * ) { return 0; }
+inline int XFreeFontInfo( char **, XFontStruct *, int ) { return 0; }
+inline int XSelectInput( Display *, Window, int ) { return 0; }
+inline int XMapWindow( Display *, Window ) { return 0; }
+inline Screen *XDefaultScreenOfDisplay( Display * ) { return 0; }
+inline int WidthOfScreen( Screen * ) { return 0; }
+inline int HeightOfScreen( Screen * ) { return 0; }
+inline int XMoveResizeWindow( Display *, Window, int, int, int, int ) { return 0; }
+
+struct XEvent {};
+inline int XCheckMaskEvent( Display *, int, XEvent * ) { return 0; }
+inline int XSetStandardProperties( Display *, Window, const char *, int, int, int, int, int ) { return 0; }
+
+struct XWindowAttributes { int width, height; };
+inline int XGetWindowAttributes( Display *, Window, XWindowAttributes * ) { return 0; }
+inline int XSetForeground( Display *, GC, unsigned long ) { return 0; }
+inline int XSetBackground( Display *, GC, unsigned long ) { return 0; }
+inline int XFillRectangle( Display *, Window, GC, int, int, int, int ) { return 0; }
+inline int XDrawLine( Display *, Window, GC, int, int, int, int ) { return 0; }
+inline int XDrawString( Display *, Window, GC, int, int, const char *, int ) { return 0; }
+inline int XFlush( Display * ) { return 0; }
+inline int XFreeGC( Display *, GC ) { return 0; }
+inline int XDestroyWindow( Display *, Window ) { return 0; }
+inline int XCloseDisplay( Display * ) { return 0; }
+inline int XTextWidth( XFontStruct *, const char *, int ) { return 0; }
--- /dev/null
+// Fake Xutil.h
--- /dev/null
+#ifndef __FAKE__COMMCTRL_H__
+#define __FAKE__COMMCTRL_H__
+
+#include <windows.h>
+
+#define PROGRESS_CLASS TEXT("PROGRESS_CLASS")
+#define STATUSCLASSNAME TEXT("STATUSCLASSNAME")
+
+enum { PBM_SETRANGE32, PBM_SETRANGE, PBM_SETPOS, PBM_SETSTEP, PBM_STEPIT, PBM_SETBARCOLOR,
+ SB_SETTEXTA, SB_SETPARTS, BS_AUTOCHECKBOX, BM_SETCHECK, BST_UNCHECKED, BM_GETCHECK,
+ BST_CHECKED, PBS_SMOOTH };
+
+#define ICC_BAR_CLASSES 1
+#define ICC_PROGRESS_CLASS 2
+
+struct INITCOMMONCONTROLSEX
+{
+ DWORD dwSize;
+ DWORD dwICC;
+};
+
+inline void InitCommonControls() {}
+inline int InitCommonControlsEx(INITCOMMONCONTROLSEX *) { return 0; }
+
+#endif // __FAKE__COMMCTRL_H__
--- /dev/null
+// fake QApplication
+
+class QWidget;
+
+class QApplication
+{
+public:
+ QApplication( int &, char ** ) {}
+ void exec() {}
+ void setMainWidget( void * ) {}
+ void processEvents() {}
+ static QWidget *desktop() { return 0; }
+ void *activeWindow() { return 0; }
+};
--- /dev/null
+// fake qglobal.h
+#define QT_VERSION 0x030000
--- /dev/null
+// fake QLabel
+#include <qstring.h>
+#include <qwidget.h>
+
+class QLabel
+{
+public:
+ QLabel( void * ) {}
+ void setText( const QString & ) {}
+};
--- /dev/null
+// fake qlayout.h
+
+class QVBoxLayout
+{
+public:
+ QVBoxLayout( void * ) {}
+ void addWidget( void * ) {}
+};
--- /dev/null
+// fake qmessagebox.h
+
+class QMessageBox
+{
+public:
+ enum Icon { Information, Warning, Critical };
+ static void *standardIcon( Icon ) { return 0; }
+};
--- /dev/null
+// fake qpixmap.h
+
--- /dev/null
+// fake qprogressbar.h
+
+class QColorGroup
+{
+public:
+ enum { Highlight };
+};
+
+class QColor
+{
+public:
+ QColor( int, int, int ) {}
+};
+
+class QPalette
+{
+public:
+ void setColor( int, const QColor & ) {}
+};
+
+class QProgressBar
+{
+public:
+ QProgressBar( int, void * ) {}
+ void setProgress( int ) {}
+ int progress() { return 0; }
+ QPalette palette() { return QPalette(); }
+ void setPalette( const QPalette & ) {}
+};
--- /dev/null
+// fake qstatusbar.h
+
+class QStatusBar
+{
+public:
+ QStatusBar( void * ) {}
+ void setProgress() {}
+ void addWidget( void *, int ) {}
+ void removeWidget( void * ) {}
+};
--- /dev/null
+// fake qstring.h
+#ifndef __FAKE__QSTRING_H
+#define __FAKE__QSTRING_H
+
+class QString
+{
+public:
+ QString() {}
+ QString( const char * ) {}
+ bool operator==( const QString & ) { return false; }
+
+ static QString number( int ) { return QString(); }
+};
+
+inline QString operator+( const QString &, const QString & ) { return QString(); }
+
+#endif // __FAKE__QSTRING_H
--- /dev/null
+// fake qwidget.h
+#ifndef __FAKE__QWIDGET_H
+#define __FAKE__QWIDGET_H
+
+class QString;
+
+class QWidget
+{
+public:
+ bool isMinimized() { return false; }
+ void close( bool ) {}
+ void showMinimized() {}
+ void showNormal() {}
+ void setCaption( const QString & ) {}
+ void setIcon( void * ) {}
+ int x() { return 0; }
+ int y() { return 0; }
+ int width() { return 0; }
+ int height() { return 0; }
+ void setGeometry( int, int, int, int ) {}
+};
+
+#endif // __FAKE__QWIDGET_H
--- /dev/null
+#ifndef __FAKE__WINDOWS_H__
+#define __FAKE__WINDOWS_H__
+
+#include <stdio.h>
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int UINT;
+typedef long LONG;
+typedef unsigned long DWORD, ULONG, LRESULT, LPARAM, WPARAM;
+
+typedef int BOOL;
+enum { FALSE, TRUE };
+
+typedef struct _HANDLE {} *HANDLE;
+typedef struct _HBRUSH {} *HBRUSH;
+typedef struct _HCURSOR {} *HCURSOR;
+typedef struct _HEAP {} *HEAP;
+typedef struct _HICON {} *HICON;
+typedef struct _HINSTANCE {} *HINSTANCE;
+typedef struct _HMENU {} *HMENU;
+typedef struct _HMODULE {} *HMODULE;
+typedef struct _HWND {} *HWND;
+
+enum { INFINITE, CS_HREDRAW, CS_VREDRAW, COLOR_WINDOW, GWL_USERDATA, HWND_TOP, SPI_GETWORKAREA,
+ WS_CHILD, WS_VISIBLE, SM_CYCAPTION, SM_CYFRAME, SM_CXSCREEN, SM_CYSCREEN,
+ SW_SHOWNORMAL, SW_MINIMIZE, WM_SIZE, WM_SETICON, ICON_BIG, WS_OVERLAPPEDWINDOW,
+ WM_CREATE, WM_TIMER, WM_CLOSE, WM_DESTROY, WM_QUIT };
+
+typedef void *LPVOID;
+
+#ifdef UNICODE
+typedef wchar_t TCHAR;
+#define TEXT(x) L##x
+#else
+typedef char TCHAR;
+#define TEXT(x) x
+#endif
+
+typedef const TCHAR *LPCTSTR;
+
+typedef char *LPSTR;
+typedef const char *LPCSTR;
+#define IDI_INFORMATION TEXT("IDI_INFORMATION")
+#define IDI_WARNING TEXT("IDI_WARNING")
+#define IDI_ERROR TEXT("IDI_ERROR")
+
+typedef void (*LPPROC)( void );
+
+#define WINAPI
+#define CALLBACK
+
+struct WNDCLASSEX
+{
+ int cbSize;
+ int style;
+ LRESULT CALLBACK (*lpfnWndProc)( HWND, UINT, WPARAM, LPARAM );
+ int cbClsExtra;
+ int cbWndExtra;
+ HINSTANCE hInstance;
+ HICON hIcon;
+ HCURSOR hCursor;
+ HBRUSH hbrBackground;
+ LPCTSTR lpszMenuName;
+ LPCTSTR lpszClassName;
+ HICON hIconSm;
+};
+
+struct RECT
+{
+ LONG left, right, top, bottom;
+};
+
+struct MSG
+{
+};
+
+typedef struct
+{
+ LPVOID lpCreateParams;
+} CREATESTRUCT, *LPCREATESTRUCT;
+
+inline HANDLE CreateEvent( LPVOID, BOOL, BOOL, LPVOID ) { return 0; }
+inline HANDLE CreateThread( LPVOID, int, DWORD WINAPI (*)( LPVOID ), LPVOID, int, LPVOID ) { return 0; }
+inline int WaitForSingleObject( HANDLE, int ) { return 0; }
+inline int RegisterClassEx( WNDCLASSEX * ) { return 0; }
+inline int SetWindowLong( HWND, int, LONG ) { return 0; }
+inline LPARAM MAKELPARAM( unsigned short, unsigned short ) { return 0; }
+inline HWND CreateWindow( LPCTSTR, LPVOID, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID ) { return 0; }
+inline LRESULT SendMessage( HWND, UINT, WPARAM, LPARAM ) { return 0; }
+inline LONG GetSystemMetrics( int ) { return 0; }
+inline int SetWindowPos( HWND, int, LONG, LONG, LONG, LONG, int ) { return 0; }
+inline int SystemParametersInfo( int, int, LPVOID, int ) { return 0; }
+inline int ShowWindow( HWND, int ) { return 0; }
+inline int UpdateWindow( HWND ) { return 0; }
+inline int SetEvent( HANDLE ) { return 0; }
+inline BOOL GetMessage( MSG *, LPVOID, int, int ) { return FALSE; }
+inline int DispatchMessage( MSG * ) { return 0; }
+inline int GetClientRect( HWND, RECT * ) { return 0; }
+inline HICON LoadIcon( HINSTANCE, LPCTSTR ) { return 0; }
+inline unsigned lstrlenA( LPCSTR ) { return 0; }
+inline int lstrcmpA( LPCSTR, LPCSTR ) { return 0; }
+inline int lstrcpyA( LPSTR, LPCSTR ) { return 0; }
+inline int lstrcatA( LPSTR, LPCSTR ) { return 0; }
+#define wsprintfA sprintf
+inline int SetWindowTextA( HWND, LPCSTR ) { return 0; }
+inline LPVOID HeapAlloc( HEAP, int, ULONG ) { return 0; }
+inline HEAP GetProcessHeap() { return 0; }
+inline int HeapFree( HEAP, int, LPVOID ) { return 0; }
+inline int DestroyWindow( HWND ) { return 0; }
+inline LONG GetWindowLong( HWND, int ) { return 0; }
+inline LRESULT CALLBACK DefWindowProc( HWND, UINT, WPARAM, LPARAM ) { return 0; }
+inline HMODULE LoadLibraryA( LPCSTR ) { return 0; }
+inline LPPROC GetProcAddress( HMODULE, LPCSTR ) { return 0; }
+inline int SetTimer( HWND, unsigned, unsigned, unsigned ) { return 0; }
+inline int KillTimer( HWND, unsigned ) { return 0; }
+inline DWORD GetTickCount() { return 0; }
+inline int ExitProcess( int ) { return 0; }
+inline bool IsIconic( HWND ) { return 0; }
+inline HWND GetForegroundWindow() { return 0; }
+
+#endif // __FAKE__WINDOWS_H__
--- /dev/null
+Running 1 test
+In Suite::testOne:
+GfSetUpFails.h:24: Error: Test failed: Error in GlobalFixture::setUp()
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+Running 1 test
+In Suite::testOne:
+GfSetUpThrows.h:24: Error: Test failed: Error in GlobalFixture::setUp()
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+Running 2 tests
+In Suite::testOne:
+GfTearDownFails.h:24: Error: Test failed: Error in GlobalFixture::tearDown()
+In Suite::testTwo:
+GfTearDownFails.h:25: Warning: Testing should go on!
+GfTearDownFails.h:25: Error: Test failed: Error in GlobalFixture::tearDown()
+Failed 2 of 2 tests
+Success rate: 0%
+Error level = 2
--- /dev/null
+Running 2 tests
+In Suite::testOne:
+GfTearDownThrows.h:24: Error: Test failed: Error in GlobalFixture::tearDown()
+In Suite::testTwo:
+GfTearDownThrows.h:25: Warning: Testing should go on!
+GfTearDownThrows.h:25: Error: Test failed: Error in GlobalFixture::tearDown()
+Failed 2 of 2 tests
+Success rate: 0%
+Error level = 2
--- /dev/null
+Running 6 tests<world><test></test>.<test></test>.<test></test>.<test></test>.<test></test>.<test></test>.</world>OK!
+Error level = 0
--- /dev/null
+Running 18 tests..................OK!
+Error level = 0
--- /dev/null
+{Start 7 tests} Running 7 tests {GreenYellowRed::test_Start_green()} . {GreenYellowRed::test_Green_again()}
+In GreenYellowRed::test_Green_again:
+GreenYellowRed.h:26: Trace: Still green
+. {GreenYellowRed::test_Now_yellow()} {Yellow}
+In GreenYellowRed::test_Now_yellow:
+GreenYellowRed.h:32: Warning: Yellow
+. {GreenYellowRed::test_Cannot_go_back()} . {GreenYellowRed::test_Finally_red()} {Red}
+In GreenYellowRed::test_Finally_red:
+GreenYellowRed.h:43: Error: Test failed: Red
+{GreenYellowRed::test_Cannot_go_back_to_yellow()} In GreenYellowRed::test_Cannot_go_back_to_yellow:
+GreenYellowRed.h:49: Warning: Yellow?
+. {GreenYellowRed::test_Cannot_go_back_to_green()} . {Stop}
+Failed 1 of 7 tests
+Success rate: 85%
+Error level = 1
--- /dev/null
+{Start 7 tests} Running 7 tests {GreenYellowRed::test_Start_green()} . {GreenYellowRed::test_Green_again()}
+In GreenYellowRed::test_Green_again:
+test/../sample/gui/GreenYellowRed.h(26): Trace: Still green
+. {GreenYellowRed::test_Now_yellow()} {Yellow}
+In GreenYellowRed::test_Now_yellow:
+test/../sample/gui/GreenYellowRed.h(32): Warning: Yellow
+. {GreenYellowRed::test_Cannot_go_back()} . {GreenYellowRed::test_Finally_red()} {Red}
+In GreenYellowRed::test_Finally_red:
+test/../sample/gui/GreenYellowRed.h(43): Error: Test failed: Red
+{GreenYellowRed::test_Cannot_go_back_to_yellow()} In GreenYellowRed::test_Cannot_go_back_to_yellow:
+test/../sample/gui/GreenYellowRed.h(49): Warning: Yellow?
+. {GreenYellowRed::test_Cannot_go_back_to_green()} . {Stop}
+Failed 1 of 7 tests
+Success rate: 85%
+Error level = 1
--- /dev/null
+Running 1 test
+In IncludesTest::testTraits:
+IncludeTest.h:12: Warning: (void *)
+IncludeTest.h:13: Warning: (long *)
+.OK!
+Error level = 0
--- /dev/null
+Running 3 tests
+In TestNonFinite::testNaN:
+TestNonFinite.h:17: Error: Expected (nan == nan), found (nan != nan)
+TestNonFinite.h:18: Error: Expected (nan == zero), found (nan != 0.0000)
+In TestNonFinite::testPlusInf:
+TestNonFinite.h:23: Error: Expected (3.0 == plus_inf), found (3.0000 != inf)
+In TestNonFinite::testMinusInf:
+TestNonFinite.h:28: Error: Expected (1.0/3.0 == minus_inf), found (0.3333 != -inf)
+Failed 3 of 3 tests
+Success rate: 0%
+Error level = 3
--- /dev/null
+Running 14 tests
+In InheritedTests1::testEquality:
+InheritedTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+InheritedTest.h:17: Error: Expected ('a' == 'A'), found ('a' != 'A')
+InheritedTest.h:18: Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In InheritedTests1::testAddition:
+InheritedTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In InheritedTests1::TestMultiplication:
+InheritedTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+InheritedTest.h:31: Error: Expected (-2 * -2 != 4), found (4)
+In InheritedTests1::testComparison:
+InheritedTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In InheritedTests1::testTheWorldIsCrazy:
+InheritedTest.h:42: Error: Expected (true == false), found (true != false)
+In InheritedTests1::test_Failure:
+InheritedTest.h:47: Error: Test failed: Not implemented
+InheritedTest.h:48: Error: Test failed: 1569779912
+In InheritedTests1::test_TS_WARN_macro:
+InheritedTest.h:53: Warning: Just a friendly warning
+InheritedTest.h:54: Warning: Warnings don't abort the test
+.
+In InheritedTests2::testEquality:
+InheritedTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+InheritedTest.h:17: Error: Expected ('a' == 'A'), found ('a' != 'A')
+InheritedTest.h:18: Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In InheritedTests2::testAddition:
+InheritedTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In InheritedTests2::TestMultiplication:
+InheritedTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+InheritedTest.h:31: Error: Expected (-2 * -2 != 4), found (4)
+In InheritedTests2::testComparison:
+InheritedTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In InheritedTests2::testTheWorldIsCrazy:
+InheritedTest.h:42: Error: Expected (true == false), found (true != false)
+In InheritedTests2::test_Failure:
+InheritedTest.h:47: Error: Test failed: Not implemented
+InheritedTest.h:48: Error: Test failed: 1569779912
+In InheritedTests2::test_TS_WARN_macro:
+InheritedTest.h:53: Warning: Just a friendly warning
+InheritedTest.h:54: Warning: Warnings don't abort the test
+.
+Failed 12 of 14 tests
+Success rate: 14%
+Error level = 12
--- /dev/null
+//
+// This program is used to check if the compiler supports __int64
+//
+int main()
+{
+ __int64 ll = 0;
+ return (int)ll;
+}
--- /dev/null
+Running 1 test
+In Int64::testInt64:
+Int64.h:12: Error: Expected ((__int64)1 == (__int64)2), found (1 != 2)
+Int64.h:13: Error: Expected ((__int64)3 != (__int64)3), found (3)
+Int64.h:14: Error: Expected ((__int64)5 < (__int64)4), found (5 >= 4)
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+//
+// This program is used to check if the compiler supports "long long"
+//
+int main()
+{
+ long long ll = 0;
+ return (int)ll;
+}
--- /dev/null
+Running 1 test
+In LongLongTest::testLongLong:
+LongLong.h:12: Error: Expected ((long long)1 == (long long)2), found (1 != 2)
+LongLong.h:13: Error: Expected ((long long)3 != (long long)3), found (3)
+LongLong.h:14: Error: Expected ((long long)5 < (long long)4), found (5 >= 4)
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+#include <cxxtest/TestRunner.h>
+#include <cxxtest/TestListener.h>
+#include <stdio.h>
+
+//
+// This test runner printer some statistics at the end of the run.
+// Note that it uses <stdio.h> and not <iostream> for compatibility
+// with older compilers.
+//
+
+using namespace CxxTest;
+
+class SummaryPrinter : public CxxTest::TestListener
+{
+public:
+ void run()
+ {
+ CxxTest::TestRunner::runAllTests( *this );
+ }
+
+ void leaveWorld( const CxxTest::WorldDescription &wd )
+ {
+ printf( "Number of suites: %u\n", wd.numSuites() );
+ printf( "Number of tests: %u\n", wd.numTotalTests() );
+ printf( "Number of failed tests: %u\n", TestTracker::tracker().failedTests() );
+ }
+};
+
+int main()
+{
+ SummaryPrinter().run();
+ return 0;
+}
--- /dev/null
+Running 10 tests
+In DynamicMax::test_Max_size_from_define:
+DynamicMax.h:19: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+In DynamicMax::test_Set_max_size:
+DynamicMax.h:25: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 ... }
+In DynamicMax::test_Revert_to_max_size_from_define:
+DynamicMax.h:30: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+In DynamicMax::test_Set_max_size_to_zero__dumps_all:
+DynamicMax.h:36: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SetUpAffectsAllTests::test_Use_12_in_this_test:
+DynamicMax.h:58: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 ... }
+In SetUpAffectsAllTests::test_Use_12_in_this_test_too:
+DynamicMax.h:63: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 ... }
+In SameData::testAssertSameData:
+SameData.h:23: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+In SameData::testAssertMessageSameData:
+SameData.h:28: Error: Test failed: Not same data
+SameData.h:28: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+In SameData::testSafeAssertSameData:
+SameData.h:33: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+In SameData::testSafeAssertMessageSameData:
+SameData.h:38: Error: Test failed: Not same data
+SameData.h:38: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC ... }
+Failed 10 of 10 tests
+Success rate: 0%
+Error level = 10
--- /dev/null
+Running 35 tests
+In LessThanEquals::testLessThanEquals:
+LessThanEquals.h:16: Error: Expected (1 <= 0), found (1 > 0)
+LessThanEquals.h:17: Error: Test failed: 1 <=? 0
+LessThanEquals.h:17: Error: Expected (1 <= 0), found (1 > 0)
+LessThanEquals.h:19: Error: Expected (1 < 0), found (1 >= 0)
+LessThanEquals.h:20: Error: Test failed: 1 <=? 0
+LessThanEquals.h:20: Error: Expected (1 <= 0), found (1 > 0)
+In Relation::testPredicate:
+Relation.h:19: Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+Relation.h:20: Error: Test failed: 1 <? 0
+Relation.h:20: Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+Relation.h:22: Warning: 1
+Relation.h:24: Warning: 1
+In Relation::testRelation:
+Relation.h:29: Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+Relation.h:30: Error: Test failed: 2 <? 1
+Relation.h:30: Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+Relation.h:32: Warning: 1
+Relation.h:34: Warning: 1
+In DefaultTraits::testSmallDefaultTraits:
+DefaultTraits.h:21: Error: Test failed: { 00 01 02 03 04 05 06 07 }
+In DefaultTraits::testBigDefaultTraits:
+DefaultTraits.h:35: Error: Test failed: { 98 99 9A 9B 9C 9D 9E 9F ... }
+In DoubleCall::testAssertEqualsWithSideEffects:
+DoubleCall.h:21: Error: Expected (increment() == 3), found (1 != 3)
+In DoubleCall::testAssertDiffersWithSideEffects:
+DoubleCall.h:26: Error: Expected (increment() != 1), found (1)
+In DoubleCall::testAssertDeltaWithSideEffects:
+DoubleCall.h:31: Error: Expected (increment() == 2.0) up to 0.5 (0.5000), found (1 != 2.0000)
+In SameData::testAssertSameData:
+SameData.h:23: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testAssertMessageSameData:
+SameData.h:28: Error: Test failed: Not same data
+SameData.h:28: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testSafeAssertSameData:
+SameData.h:33: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+In SameData::testSafeAssertMessageSameData:
+SameData.h:38: Error: Test failed: Not same data
+SameData.h:38: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+.
+In SameFiles::testAssertFileShorter:
+SameFiles.h:18: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+<
+
+In SameFiles::testAssertFileLonger:
+SameFiles.h:23: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+>
+
+In SameFiles::testAssertMessageSameFiles:
+SameFiles.h:28: Error: Test failed: Not same files
+SameFiles.h:28: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+.
+In SameFiles::testSafeAssertMessageSameFiles:
+SameFiles.h:38: Error: Test failed: Not same files
+SameFiles.h:38: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+In TestMessageMacros::testMessageMacros:
+Tsm.h:15: Error: Test failed: String
+Tsm.h:15: Error: Assertion failed: false
+Tsm.h:16: Error: Test failed: 42
+Tsm.h:16: Error: Assertion failed: false
+Tsm.h:17: Error: Test failed: String
+Tsm.h:17: Error: Expected (2 + 2 == 5), found (4 != 5)
+Tsm.h:18: Error: Test failed: 42
+Tsm.h:18: Error: Expected (2 + 2 == 5), found (4 != 5)
+Tsm.h:19: Error: Test failed: String
+Tsm.h:19: Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found:
+{ 78 }
+differs from
+{ 79 }
+Tsm.h:20: Error: Test failed: 42
+Tsm.h:20: Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found:
+{ 78 }
+differs from
+{ 79 }
+Tsm.h:21: Error: Test failed: String
+Tsm.h:21: Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Tsm.h:22: Error: Test failed: 42
+Tsm.h:22: Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Tsm.h:23: Error: Test failed: String
+Tsm.h:23: Error: Expected (0 != 0), found (0)
+Tsm.h:24: Error: Test failed: 42
+Tsm.h:24: Error: Expected (0 != 0), found (0)
+Tsm.h:25: Error: Test failed: String
+Tsm.h:25: Error: Expected (2 < 1), found (2 >= 1)
+Tsm.h:26: Error: Test failed: 42
+Tsm.h:26: Error: Expected (2 < 1), found (2 >= 1)
+Tsm.h:27: Error: Test failed: String
+Tsm.h:27: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:28: Error: Test failed: 42
+Tsm.h:28: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:29: Error: Test failed: String
+Tsm.h:29: Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Tsm.h:30: Error: Test failed: 42
+Tsm.h:30: Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Tsm.h:31: Error: Test failed: String
+Tsm.h:31: Error: Expected (throwInteger( n )) not to throw, but it did
+Tsm.h:32: Error: Test failed: 42
+Tsm.h:32: Error: Expected (throwInteger( n )) not to throw, but it did
+Tsm.h:33: Error: Test failed: String
+Tsm.h:33: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:34: Error: Test failed: 42
+Tsm.h:34: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:35: Error: Test failed: String
+Tsm.h:35: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:36: Error: Test failed: 42
+Tsm.h:36: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:37: Error: Test failed: String
+Tsm.h:37: Error: Expected (i == 43), found (42 != 43)
+Tsm.h:38: Error: Test failed: 42
+Tsm.h:38: Error: Expected (i == 43), found (42 != 43)
+In TraitsTest::testIntegerTraits:
+TraitsTest.h:13: Error: Test failed: 1
+TraitsTest.h:14: Error: Test failed: '\x0F'
+TraitsTest.h:15: Error: Test failed: -12
+TraitsTest.h:16: Error: Test failed: 34
+TraitsTest.h:17: Error: Test failed: -123
+TraitsTest.h:18: Error: Test failed: 456
+TraitsTest.h:19: Error: Test failed: -12345
+TraitsTest.h:20: Error: Test failed: 67890
+In TraitsTest::testFloatingPointTraits:
+TraitsTest.h:25: Error: Test failed: 0.1234
+TraitsTest.h:26: Error: Test failed: 0.1234
+In TraitsTest::testBoolTraits:
+TraitsTest.h:31: Error: Test failed: true
+TraitsTest.h:32: Error: Test failed: false
+In TraitsTest::testCharTraits:
+TraitsTest.h:37: Error: Test failed: 'A'
+TraitsTest.h:38: Error: Test failed: '\x04'
+TraitsTest.h:39: Error: Test failed: '\x1B'
+TraitsTest.h:40: Error: Test failed: '\0'
+TraitsTest.h:41: Error: Test failed: '\r'
+TraitsTest.h:42: Error: Test failed: '\n'
+TraitsTest.h:43: Error: Test failed: '\b'
+TraitsTest.h:44: Error: Test failed: '\t'
+TraitsTest.h:45: Error: Test failed: '\a'
+TraitsTest.h:46: Error: Test failed: '\xFB'
+In TraitsTest::testStringTraits:
+TraitsTest.h:51: Error: Test failed: (char *) is displayed as-is
+
+In TraitsTest::testStdStringTraits:
+TraitsTest.h:57: Error: Test failed: "std::string is displayed with \"\""
+TraitsTest.h:58: Error: Test failed: "Escapes\rAre\rTranslated"
+TraitsTest.h:59: Error: Test failed: "As are unprintable chars: \x124Vx"
+..
+In MockTest::test_Unimplemented:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+MockTest.h:129: Error: Expected (T::one() == 1), found (0 != 1)
+.
+In MockTest::test_Mock_traits:
+MockTest.h:40: Error: Test failed: T::getOpaque( int i ) called with no T::Base_getOpaque object
+MockTest.h:143: Error: Expected (T::getOpaque( 3 ).value == 72), found (42 != 72)
+In MockTest::test_Override:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+MockTest.h:157: Error: Expected (T::one() == 1), found (0 != 1)
+.
+In MockTest::test_Unimplemented_supply:
+MockTest.h:42: Error: Test failed: T::supplyOne( void ) called with no T::Base_supplyOne object
+MockTest.h:168: Error: Expected (supplyOne() == 1), found (0 != 1)
+.
+In SameZero::test_TS_ASSERT_SAME_DATA_passed_zero:
+SameZero.h:20: Error: Expected sizeof(data) (4) bytes to be equal at (data) and (0), found:
+{ 00 01 02 03 }
+differs from
+(null)
+SameZero.h:21: Error: Expected sizeof(data) (4) bytes to be equal at (0) and (data), found:
+(null)
+differs from
+{ 00 01 02 03 }
+Failed 28 of 35 tests
+Success rate: 20%
+Error level = 28
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite name="cxxtest" tests="35" errors="0" failures="28" time="0" >
+<testcase classname="LessThanEquals" name="testLessThanEquals" line="11">
+<failure file="test/LessThanEquals.h" line="16" type="failedAssertLessThanEquals" >Error: Expected (1 <= 0), found (1 > 0)
+Test failed: 1 <=? 0
+Error: Expected (1 <= 0), found (1 > 0)
+Error: Expected (1 < 0), found (1 >= 0)
+Test failed: 1 <=? 0
+Error: Expected (1 <= 0), found (1 > 0)</failure>
+<system-out >
+In LessThanEquals::testLessThanEquals:
+LessThanEquals.h:16: Error: Expected (1 <= 0), found (1 > 0)
+LessThanEquals.h:17: Error: Test failed: 1 <=? 0
+LessThanEquals.h:17: Error: Expected (1 <= 0), found (1 > 0)
+LessThanEquals.h:19: Error: Expected (1 < 0), found (1 >= 0)
+LessThanEquals.h:20: Error: Test failed: 1 <=? 0
+LessThanEquals.h:20: Error: Expected (1 <= 0), found (1 > 0)
+</system-out>
+</testcase>
+<testcase classname="Relation" name="testPredicate" line="17">
+<failure file="test/Relation.h" line="19" type="failedAssertPredicate" >Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+Test failed: 1 <? 0
+Error: Expected MyNegative( 1 ), found !MyNegative( 1 )</failure>
+<warning line="22" >1</warning>
+<warning line="24" >1</warning>
+<system-out >In Relation::testPredicate:
+Relation.h:19: Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+Relation.h:20: Error: Test failed: 1 <? 0
+Relation.h:20: Error: Expected MyNegative( 1 ), found !MyNegative( 1 )
+Relation.h:22: Warning: 1
+Relation.h:24: Warning: 1
+</system-out>
+</testcase>
+<testcase classname="Relation" name="testRelation" line="27">
+<failure file="test/Relation.h" line="29" type="failedAssertRelation" >Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+Test failed: 2 <? 1
+Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )</failure>
+<warning line="32" >1</warning>
+<warning line="34" >1</warning>
+<system-out >In Relation::testRelation:
+Relation.h:29: Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+Relation.h:30: Error: Test failed: 2 <? 1
+Relation.h:30: Error: Expected MyLess<int>( 2, 1 ), found !MyLess<int>( 2, 1 )
+Relation.h:32: Warning: 1
+Relation.h:34: Warning: 1
+</system-out>
+</testcase>
+<testcase classname="DefaultTraits" name="testSmallDefaultTraits" line="16">
+<failure file="test/DefaultTraits.h" line="21" type="failure" >Test failed: { 00 01 02 03 04 05 06 07 }</failure>
+<system-out >In DefaultTraits::testSmallDefaultTraits:
+DefaultTraits.h:21: Error: Test failed: { 00 01 02 03 04 05 06 07 }
+</system-out>
+</testcase>
+<testcase classname="DefaultTraits" name="testBigDefaultTraits" line="30">
+<failure file="test/DefaultTraits.h" line="35" type="failure" >Test failed: { 98 99 9A 9B 9C 9D 9E 9F ... }</failure>
+<system-out >In DefaultTraits::testBigDefaultTraits:
+DefaultTraits.h:35: Error: Test failed: { 98 99 9A 9B 9C 9D 9E 9F ... }
+</system-out>
+</testcase>
+<testcase classname="DoubleCall" name="testAssertEqualsWithSideEffects" line="19">
+<failure file="test/DoubleCall.h" line="21" type="failedAssertEquals" >Error: Expected (increment() == 3), found (1 != 3)</failure>
+<system-out >In DoubleCall::testAssertEqualsWithSideEffects:
+DoubleCall.h:21: Error: Expected (increment() == 3), found (1 != 3)
+</system-out>
+</testcase>
+<testcase classname="DoubleCall" name="testAssertDiffersWithSideEffects" line="24">
+<failure file="test/DoubleCall.h" line="26" type="failedAssertDiffers" >Error: Expected (increment() != 1), found (1)</failure>
+<system-out >In DoubleCall::testAssertDiffersWithSideEffects:
+DoubleCall.h:26: Error: Expected (increment() != 1), found (1)
+</system-out>
+</testcase>
+<testcase classname="DoubleCall" name="testAssertDeltaWithSideEffects" line="29">
+<failure file="test/DoubleCall.h" line="31" type="failedAssertDelta" >Error: Expected (increment() == 2.0) up to 0.5 (0.5000), found (1 != 2.0000)</failure>
+<system-out >In DoubleCall::testAssertDeltaWithSideEffects:
+DoubleCall.h:31: Error: Expected (increment() == 2.0) up to 0.5 (0.5000), found (1 != 2.0000)
+</system-out>
+</testcase>
+<testcase classname="SameData" name="testAssertSameData" line="21">
+<failure file="test/SameData.h" line="23" type="failedAssertSameData" >Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found</failure>
+<system-out >In SameData::testAssertSameData:
+SameData.h:23: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+</system-out>
+</testcase>
+<testcase classname="SameData" name="testAssertMessageSameData" line="26">
+<failure file="test/SameData.h" line="28" type="failure" >Test failed: Not same data
+Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found</failure>
+<system-out >In SameData::testAssertMessageSameData:
+SameData.h:28: Error: Test failed: Not same data
+SameData.h:28: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+</system-out>
+</testcase>
+<testcase classname="SameData" name="testSafeAssertSameData" line="31">
+<failure file="test/SameData.h" line="33" type="failedAssertSameData" >Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found</failure>
+<system-out >In SameData::testSafeAssertSameData:
+SameData.h:33: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+</system-out>
+</testcase>
+<testcase classname="SameData" name="testSafeAssertMessageSameData" line="36">
+<failure file="test/SameData.h" line="38" type="failure" >Test failed: Not same data
+Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found</failure>
+<system-out >In SameData::testSafeAssertMessageSameData:
+SameData.h:38: Error: Test failed: Not same data
+SameData.h:38: Error: Expected DATA_SIZE (24) bytes to be equal at (x) and (y), found:
+{ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 }
+differs from
+{ FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 }
+</system-out>
+</testcase>
+<testcase classname="SameFiles" name="testAssertFiles" line="11" />
+<testcase classname="SameFiles" name="testAssertFileShorter" line="16">
+<failure file="test/SameFiles.h" line="18" type="failedAssertSameFiles" >Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+<
+</failure>
+<system-out >
+In SameFiles::testAssertFileShorter:
+SameFiles.h:18: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+<
+
+</system-out>
+</testcase>
+<testcase classname="SameFiles" name="testAssertFileLonger" line="21">
+<failure file="test/SameFiles.h" line="23" type="failedAssertSameFiles" >Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+>
+</failure>
+<system-out >In SameFiles::testAssertFileLonger:
+SameFiles.h:23: Error: File 'SameFiles.h' ended before file 'SameFilesLonger.h' (line 42)
+= }
+= };
+=
+>
+
+</system-out>
+</testcase>
+<testcase classname="SameFiles" name="testAssertMessageSameFiles" line="26">
+<failure file="test/SameFiles.h" line="28" type="failure" >Test failed: Not same files
+Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+</failure>
+<system-out >In SameFiles::testAssertMessageSameFiles:
+SameFiles.h:28: Error: Test failed: Not same files
+SameFiles.h:28: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+</system-out>
+</testcase>
+<testcase classname="SameFiles" name="testSafeAssertSameFiles" line="31" />
+<testcase classname="SameFiles" name="testSafeAssertMessageSameFiles" line="36">
+<failure file="test/SameFiles.h" line="38" type="failure" >Test failed: Not same files
+Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+</failure>
+<system-out >
+In SameFiles::testSafeAssertMessageSameFiles:
+SameFiles.h:38: Error: Test failed: Not same files
+SameFiles.h:38: Error: Files 'SameFiles.h' and 'SameData.h' differ at line 4
+= #include <cxxtest/TestSuite.h>
+=
+= //
+< // This test suite demonstrates TS_ASSERT_SAME_ATA
+
+> // This test suite demonstrates TS_ASSERT_SAME_//
+
+</system-out>
+</testcase>
+<testcase classname="TestMessageMacros" name="testMessageMacros" line="10">
+<failure file="test/Tsm.h" line="15" type="failure" >Test failed: String
+Assertion failed: false
+Test failed: 42
+Assertion failed: false
+Test failed: String
+Error: Expected (2 + 2 == 5), found (4 != 5)
+Test failed: 42
+Error: Expected (2 + 2 == 5), found (4 != 5)
+Test failed: String
+Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found
+Test failed: 42
+Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found
+Test failed: String
+Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Test failed: 42
+Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Test failed: String
+Error: Expected (0 != 0), found (0)
+Test failed: 42
+Error: Expected (0 != 0), found (0)
+Test failed: String
+Error: Expected (2 < 1), found (2 >= 1)
+Test failed: 42
+Error: Expected (2 < 1), found (2 >= 1)
+Test failed: String
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: 42
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: String
+Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Test failed: 42
+Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Test failed: String
+Error: Expected (throwInteger( n )) not to throw, but it did
+Test failed: 42
+Error: Expected (throwInteger( n )) not to throw, but it did
+Test failed: String
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: 42
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: String
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: 42
+Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Test failed: String
+Error: Expected (i == 43), found (42 != 43)
+Test failed: 42
+Error: Expected (i == 43), found (42 != 43)</failure>
+<system-out >In TestMessageMacros::testMessageMacros:
+Tsm.h:15: Error: Test failed: String
+Tsm.h:15: Error: Assertion failed: false
+Tsm.h:16: Error: Test failed: 42
+Tsm.h:16: Error: Assertion failed: false
+Tsm.h:17: Error: Test failed: String
+Tsm.h:17: Error: Expected (2 + 2 == 5), found (4 != 5)
+Tsm.h:18: Error: Test failed: 42
+Tsm.h:18: Error: Expected (2 + 2 == 5), found (4 != 5)
+Tsm.h:19: Error: Test failed: String
+Tsm.h:19: Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found:
+{ 78 }
+differs from
+{ 79 }
+Tsm.h:20: Error: Test failed: 42
+Tsm.h:20: Error: Expected 1 (1) bytes to be equal at (&x) and (&y), found:
+{ 78 }
+differs from
+{ 79 }
+Tsm.h:21: Error: Test failed: String
+Tsm.h:21: Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Tsm.h:22: Error: Test failed: 42
+Tsm.h:22: Error: Expected (1.0 == 2.0) up to 0.5 (0.5000), found (1.0000 != 2.0000)
+Tsm.h:23: Error: Test failed: String
+Tsm.h:23: Error: Expected (0 != 0), found (0)
+Tsm.h:24: Error: Test failed: 42
+Tsm.h:24: Error: Expected (0 != 0), found (0)
+Tsm.h:25: Error: Test failed: String
+Tsm.h:25: Error: Expected (2 < 1), found (2 >= 1)
+Tsm.h:26: Error: Test failed: 42
+Tsm.h:26: Error: Expected (2 < 1), found (2 >= 1)
+Tsm.h:27: Error: Test failed: String
+Tsm.h:27: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:28: Error: Test failed: 42
+Tsm.h:28: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:29: Error: Test failed: String
+Tsm.h:29: Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Tsm.h:30: Error: Test failed: 42
+Tsm.h:30: Error: Expected (throwNothing()) to throw (...) but it didn't throw
+Tsm.h:31: Error: Test failed: String
+Tsm.h:31: Error: Expected (throwInteger( n )) not to throw, but it did
+Tsm.h:32: Error: Test failed: 42
+Tsm.h:32: Error: Expected (throwInteger( n )) not to throw, but it did
+Tsm.h:33: Error: Test failed: String
+Tsm.h:33: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:34: Error: Test failed: 42
+Tsm.h:34: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:35: Error: Test failed: String
+Tsm.h:35: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:36: Error: Test failed: 42
+Tsm.h:36: Error: Expected (throwNothing()) to throw (int) but it didn't throw
+Tsm.h:37: Error: Test failed: String
+Tsm.h:37: Error: Expected (i == 43), found (42 != 43)
+Tsm.h:38: Error: Test failed: 42
+Tsm.h:38: Error: Expected (i == 43), found (42 != 43)
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testIntegerTraits" line="11">
+<failure file="test/TraitsTest.h" line="13" type="failure" >Test failed: 1
+Test failed: '\x0F'
+Test failed: -12
+Test failed: 34
+Test failed: -123
+Test failed: 456
+Test failed: -12345
+Test failed: 67890</failure>
+<system-out >In TraitsTest::testIntegerTraits:
+TraitsTest.h:13: Error: Test failed: 1
+TraitsTest.h:14: Error: Test failed: '\x0F'
+TraitsTest.h:15: Error: Test failed: -12
+TraitsTest.h:16: Error: Test failed: 34
+TraitsTest.h:17: Error: Test failed: -123
+TraitsTest.h:18: Error: Test failed: 456
+TraitsTest.h:19: Error: Test failed: -12345
+TraitsTest.h:20: Error: Test failed: 67890
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testFloatingPointTraits" line="23">
+<failure file="test/TraitsTest.h" line="25" type="failure" >Test failed: 0.1234
+Test failed: 0.1234</failure>
+<system-out >In TraitsTest::testFloatingPointTraits:
+TraitsTest.h:25: Error: Test failed: 0.1234
+TraitsTest.h:26: Error: Test failed: 0.1234
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testBoolTraits" line="29">
+<failure file="test/TraitsTest.h" line="31" type="failure" >Test failed: true
+Test failed: false</failure>
+<system-out >In TraitsTest::testBoolTraits:
+TraitsTest.h:31: Error: Test failed: true
+TraitsTest.h:32: Error: Test failed: false
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testCharTraits" line="35">
+<failure file="test/TraitsTest.h" line="37" type="failure" >Test failed: 'A'
+Test failed: '\x04'
+Test failed: '\x1B'
+Test failed: '\0'
+Test failed: '\r'
+Test failed: '\n'
+Test failed: '\b'
+Test failed: '\t'
+Test failed: '\a'
+Test failed: '\xFB'</failure>
+<system-out >In TraitsTest::testCharTraits:
+TraitsTest.h:37: Error: Test failed: 'A'
+TraitsTest.h:38: Error: Test failed: '\x04'
+TraitsTest.h:39: Error: Test failed: '\x1B'
+TraitsTest.h:40: Error: Test failed: '\0'
+TraitsTest.h:41: Error: Test failed: '\r'
+TraitsTest.h:42: Error: Test failed: '\n'
+TraitsTest.h:43: Error: Test failed: '\b'
+TraitsTest.h:44: Error: Test failed: '\t'
+TraitsTest.h:45: Error: Test failed: '\a'
+TraitsTest.h:46: Error: Test failed: '\xFB'
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testStringTraits" line="49">
+<failure file="test/TraitsTest.h" line="51" type="failure" >Test failed: (char *) is displayed as-is
+</failure>
+<system-out >In TraitsTest::testStringTraits:
+TraitsTest.h:51: Error: Test failed: (char *) is displayed as-is
+
+</system-out>
+</testcase>
+<testcase classname="TraitsTest" name="testStdStringTraits" line="54">
+<failure file="test/TraitsTest.h" line="57" type="failure" >Test failed: "std::string is displayed with \"\""
+Test failed: "Escapes\rAre\rTranslated"
+Test failed: "As are unprintable chars: \x124Vx"</failure>
+<system-out >In TraitsTest::testStdStringTraits:
+TraitsTest.h:57: Error: Test failed: "std::string is displayed with \"\""
+TraitsTest.h:58: Error: Test failed: "Escapes\rAre\rTranslated"
+TraitsTest.h:59: Error: Test failed: "As are unprintable chars: \x124Vx"
+</system-out>
+</testcase>
+<testcase classname="MockTest" name="test_Mock" line="115" />
+<testcase classname="MockTest" name="test_Real" line="121" />
+<testcase classname="MockTest" name="test_Unimplemented" line="127">
+<failure file="test/MockTest.h" line="33" type="failure" >Test failed: T::one( void ) called with no T::Base_one object
+Error: Expected (T::one() == 1), found (0 != 1)</failure>
+<system-out >
+In MockTest::test_Unimplemented:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+MockTest.h:129: Error: Expected (T::one() == 1), found (0 != 1)
+</system-out>
+</testcase>
+<testcase classname="MockTest" name="test_More_complex_mock" line="132" />
+<testcase classname="MockTest" name="test_Mock_traits" line="141">
+<failure file="test/MockTest.h" line="40" type="failure" >Test failed: T::getOpaque( int i ) called with no T::Base_getOpaque object
+Error: Expected (T::getOpaque( 3 ).value == 72), found (42 != 72)</failure>
+<system-out >
+In MockTest::test_Mock_traits:
+MockTest.h:40: Error: Test failed: T::getOpaque( int i ) called with no T::Base_getOpaque object
+MockTest.h:143: Error: Expected (T::getOpaque( 3 ).value == 72), found (42 != 72)
+</system-out>
+</testcase>
+<testcase classname="MockTest" name="test_Override" line="146">
+<failure file="test/MockTest.h" line="33" type="failure" >Test failed: T::one( void ) called with no T::Base_one object
+Error: Expected (T::one() == 1), found (0 != 1)</failure>
+<system-out >In MockTest::test_Override:
+MockTest.h:33: Error: Test failed: T::one( void ) called with no T::Base_one object
+MockTest.h:157: Error: Expected (T::one() == 1), found (0 != 1)
+</system-out>
+</testcase>
+<testcase classname="MockTest" name="test_Supply" line="160" />
+<testcase classname="MockTest" name="test_Unimplemented_supply" line="166">
+<failure file="test/MockTest.h" line="42" type="failure" >Test failed: T::supplyOne( void ) called with no T::Base_supplyOne object
+Error: Expected (supplyOne() == 1), found (0 != 1)</failure>
+<system-out >
+In MockTest::test_Unimplemented_supply:
+MockTest.h:42: Error: Test failed: T::supplyOne( void ) called with no T::Base_supplyOne object
+MockTest.h:168: Error: Expected (supplyOne() == 1), found (0 != 1)
+</system-out>
+</testcase>
+<testcase classname="MockTest" name="test_More_complex_supply" line="171" />
+<testcase classname="SameZero" name="test_TS_ASSERT_SAME_DATA_passed_zero" line="18">
+<failure file="test/SameZero.h" line="20" type="failedAssertSameData" >Error: Expected sizeof(data) (4) bytes to be equal at (data) and (0), found
+Error: Expected sizeof(data) (4) bytes to be equal at (0) and (data), found</failure>
+<system-out >
+In SameZero::test_TS_ASSERT_SAME_DATA_passed_zero:
+SameZero.h:20: Error: Expected sizeof(data) (4) bytes to be equal at (data) and (0), found:
+{ 00 01 02 03 }
+differs from
+(null)
+SameZero.h:21: Error: Expected sizeof(data) (4) bytes to be equal at (0) and (data), found:
+(null)
+differs from
+{ 00 01 02 03 }
+</system-out>
+</testcase>
+</testsuite>
--- /dev/null
+Running 14 tests
+In CreatedTest::test_nothing:
+sample/CreatedTest.h(26): Error: Test failed: Nothing to test
+.
+In EnumTraits::test_Enum_traits:
+sample/EnumTraits.h(32): Error: Test failed: Yes
+sample/EnumTraits.h(33): Error: Test failed: No
+sample/EnumTraits.h(34): Error: Test failed: Maybe
+sample/EnumTraits.h(35): Error: Test failed: DontKnow
+sample/EnumTraits.h(36): Error: Test failed: DontCare
+sample/EnumTraits.h(37): Error: Test failed: (Answer)1000
+In ExceptionTest::testAssertion:
+sample/ExceptionTest.h(20): Error: Expected (throwThis(5)) to throw (const char *) but it threw something else
+sample/ExceptionTest.h(22): Error: Expected (goodFunction(1)) to throw (...) but it didn't throw
+sample/ExceptionTest.h(24): Error: Test failed: Unhandled exception
+sample/ExceptionTest.h(26): Error: Expected (throwThis(-1)) not to throw, but it did
+sample/ExceptionTest.h(31): Error: Test failed: throwThis(3) failed
+In FixtureTest::test_strcpy:
+sample/FixtureTest.h(32): Error: Expected (_buffer[1] == 'E'), found ('e' != 'E')
+In MessageTest::testValues:
+sample/MessageTest.h(24): Error: Test failed: My hovercraft
+sample/MessageTest.h(24): Error: Assertion failed: value != 0
+sample/MessageTest.h(25): Error: Test failed: of eels
+sample/MessageTest.h(25): Error: Expected (value == value * value), found (2 != 4)
+In SimpleTest::testEquality:
+sample/SimpleTest.h(16): Error: Expected (1 == 2), found (1 != 2)
+sample/SimpleTest.h(17): Error: Expected ('a' == 'A'), found ('a' != 'A')
+sample/SimpleTest.h(18): Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In SimpleTest::testAddition:
+sample/SimpleTest.h(24): Error: Expected (2 + 2 == 5), found (4 != 5)
+In SimpleTest::TestMultiplication:
+sample/SimpleTest.h(30): Error: Expected (4 * 4 == 44), found (16 != 44)
+sample/SimpleTest.h(31): Error: Expected (-2 * -2 != 4), found (4)
+In SimpleTest::testComparison:
+sample/SimpleTest.h(37): Error: Expected (-1 < -2), found (-1 >= -2)
+In SimpleTest::testTheWorldIsCrazy:
+sample/SimpleTest.h(42): Error: Expected (true == false), found (true != false)
+In SimpleTest::test_Failure:
+sample/SimpleTest.h(47): Error: Test failed: Not implemented
+sample/SimpleTest.h(48): Error: Test failed: 1569779912
+In SimpleTest::test_TS_WARN_macro:
+sample/SimpleTest.h(53): Warning: Just a friendly warning
+sample/SimpleTest.h(54): Warning: Warnings don't abort the test
+.
+In TestFunky::testPets:
+sample/TraitsTest.h(59): Error: Expected (pet1 == pet2), found (Pet("dog") != Pet("cat"))
+sample/TraitsTest.h(61): Error: Expected (cat != gato), found (Pet("cat"))
+sample/TraitsTest.h(64): Error: Expected (String("Hello") == String("World!")), found ("Hello" != "World!")
+Failed 12 of 14 tests
+Success rate: 14%
+Error level = 12
--- /dev/null
+Running 2 tests..OK!
+Error level = 0
--- /dev/null
+Running 14 tests
+In CreatedTest::test_nothing:
+CreatedTest.h:26: Error: Test failed: Nothing to test
+.
+In EnumTraits::test_Enum_traits:
+EnumTraits.h:32: Error: Test failed: Yes
+In ExceptionTest::testAssertion:
+ExceptionTest.h:20: Error: Expected (throwThis(5)) to throw (const char *) but it threw something else
+In FixtureTest::test_strcpy:
+FixtureTest.h:32: Error: Expected (_buffer[1] == 'E'), found ('e' != 'E')
+In MessageTest::testValues:
+MessageTest.h:24: Error: Test failed: My hovercraft
+MessageTest.h:24: Error: Assertion failed: value != 0
+In SimpleTest::testEquality:
+SimpleTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+In SimpleTest::testAddition:
+SimpleTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In SimpleTest::TestMultiplication:
+SimpleTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+In SimpleTest::testComparison:
+SimpleTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In SimpleTest::testTheWorldIsCrazy:
+SimpleTest.h:42: Error: Expected (true == false), found (true != false)
+In SimpleTest::test_Failure:
+SimpleTest.h:47: Error: Test failed: Not implemented
+In SimpleTest::test_TS_WARN_macro:
+SimpleTest.h:53: Warning: Just a friendly warning
+SimpleTest.h:54: Warning: Warnings don't abort the test
+.
+In TestFunky::testPets:
+TraitsTest.h:59: Error: Expected (pet1 == pet2), found (Pet("dog") != Pet("cat"))
+Failed 12 of 14 tests
+Success rate: 14%
+Running 14 tests
+In CreatedTest::test_nothing:
+CreatedTest.h:26: Error: Test failed: Nothing to test
+.
+In EnumTraits::test_Enum_traits:
+EnumTraits.h:32: Error: Test failed: Yes
+In ExceptionTest::testAssertion:
+ExceptionTest.h:20: Error: Expected (throwThis(5)) to throw (const char *) but it threw something else
+In FixtureTest::test_strcpy:
+FixtureTest.h:32: Error: Expected (_buffer[1] == 'E'), found ('e' != 'E')
+In MessageTest::testValues:
+MessageTest.h:24: Error: Test failed: My hovercraft
+MessageTest.h:24: Error: Assertion failed: value != 0
+In SimpleTest::testEquality:
+SimpleTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+In SimpleTest::testAddition:
+SimpleTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In SimpleTest::TestMultiplication:
+SimpleTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+In SimpleTest::testComparison:
+SimpleTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In SimpleTest::testTheWorldIsCrazy:
+SimpleTest.h:42: Error: Expected (true == false), found (true != false)
+In SimpleTest::test_Failure:
+SimpleTest.h:47: Error: Test failed: Not implemented
+In SimpleTest::test_TS_WARN_macro:
+SimpleTest.h:53: Warning: Just a friendly warning
+SimpleTest.h:54: Warning: Warnings don't abort the test
+.
+In TestFunky::testPets:
+TraitsTest.h:59: Error: Expected (pet1 == pet2), found (Pet("dog") != Pet("cat"))
+Failed 12 of 14 tests
+Success rate: 14%
+Error level = 24
--- /dev/null
+// -*- C++ -*-
+
+#define CXXTEST_ABORT_TEST_ON_FAIL
+
+// CxxTest definitions and headers
+<CxxTest preamble>
+
+// Make sure this worked
+#ifndef TS_ASSERT
+# error The preamble does not work!
+#endif
+
+#include <cxxtest/StdioPrinter.h>
+
+int main()
+{
+ CxxTest::StdioPrinter runner;
+
+ TS_FAIL( "This will not be displayed" );
+ int result = runner.run() + runner.run();
+ TS_FAIL( "This will not be displayed" );
+
+ return result;
+}
+
+
+// The CxxTest "world"
+<CxxTest world>
+
--- /dev/null
+Error level = 12
--- /dev/null
+Running 4 tests....OK!
+Error level = 0
--- /dev/null
+Running 2 tests..OK!
+Error level = 0
--- /dev/null
+Running 1 test
+In HaveStd::testHaveStd:
+HaveStd.h:13: Error: Expected (something() == "Something"), found ("something" != Something)
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+Running 9 tests
+In StlTraits::test_Pair:
+StlTraits.h:13: Error: Test failed: <3, "Three">
+StlTraits.h:15: Error: Test failed: <"Four", 4.0000>
+In StlTraits::test_Vector:
+StlTraits.h:21: Trace: {}
+StlTraits.h:25: Error: Test failed: { 1, 2, 3 }
+StlTraits.h:28: Trace: {}
+StlTraits.h:32: Error: Test failed: { "One", "Two", "Three" }
+StlTraits.h:35: Trace: {}
+StlTraits.h:39: Error: Test failed: { <1, "One">, <2, "Two">, <3, "Three"> }
+In StlTraits::test_List:
+StlTraits.h:45: Trace: {}
+StlTraits.h:49: Error: Test failed: { 1, 2, 3 }
+StlTraits.h:52: Trace: {}
+StlTraits.h:56: Error: Test failed: { "One", "Two", "Three" }
+StlTraits.h:59: Trace: {}
+StlTraits.h:63: Error: Test failed: { <1, "One">, <2, "Two">, <3, "Three"> }
+In StlTraits::test_Set:
+StlTraits.h:69: Trace: {}
+StlTraits.h:73: Error: Test failed: { 1, 2, 3 }
+StlTraits.h:76: Trace: {}
+StlTraits.h:80: Error: Test failed: { "One", "Three", "Two" }
+StlTraits.h:83: Trace: {}
+StlTraits.h:87: Error: Test failed: { <1, "One">, <2, "Two">, <3, "Three"> }
+In StlTraits::test_Map:
+StlTraits.h:93: Trace: {}
+StlTraits.h:99: Error: Test failed: { <"Humpty", "Dumpty">, <"Jack", "Jill">, <"Ren", "Stimpy"> }
+StlTraits.h:102: Trace: {}
+StlTraits.h:111: Error: Test failed: { <6, { 2, 3 }>, <210, { 2, 3, 5, 7 }> }
+In StlTraits::test_Deque:
+StlTraits.h:117: Trace: {}
+StlTraits.h:122: Error: Test failed: { 4, 3, 2, 1 }
+In StlTraits::test_MultiMap:
+StlTraits.h:128: Trace: {}
+StlTraits.h:132: Error: Test failed: { <"One", 1.0000>, <"Two", 2.0000> }
+In StlTraits::test_MultiSet:
+StlTraits.h:138: Trace: {}
+StlTraits.h:142: Error: Test failed: { 123, 456 }
+In StlTraits::test_Complex:
+StlTraits.h:148: Error: Test failed: (3.1400 + 2.7100 * i)
+StlTraits.h:149: Error: Test failed: (1.0000 * i)
+StlTraits.h:150: Error: Test failed: 1.0000
+Failed 9 of 9 tests
+Success rate: 0%
+Error level = 9
--- /dev/null
+#include <cxxtest/Flags.h>
+
+#ifdef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+int main() { return 0; }
+#endif // !_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
--- /dev/null
+Running 7 tests
+In SimpleTest::testEquality:
+SimpleTest.h:16: Error: Expected (1 == 2), found (1 != 2)
+SimpleTest.h:17: Error: Expected ('a' == 'A'), found ('a' != 'A')
+SimpleTest.h:18: Error: Expected (1.0 == -12345678900000000000000000000000000000000000000000.1234), found (1.0000 != -1.2345E50)
+In SimpleTest::testAddition:
+SimpleTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+In SimpleTest::TestMultiplication:
+SimpleTest.h:30: Error: Expected (4 * 4 == 44), found (16 != 44)
+SimpleTest.h:31: Error: Expected (-2 * -2 != 4), found (4)
+In SimpleTest::testComparison:
+SimpleTest.h:37: Error: Expected (-1 < -2), found (-1 >= -2)
+In SimpleTest::testTheWorldIsCrazy:
+SimpleTest.h:42: Error: Expected (true == false), found (true != false)
+In SimpleTest::test_Failure:
+SimpleTest.h:47: Error: Test failed: Not implemented
+SimpleTest.h:48: Error: Test failed: 1569779912
+In SimpleTest::test_TS_WARN_macro:
+SimpleTest.h:53: Warning: Just a friendly warning
+SimpleTest.h:54: Warning: Warnings don't abort the test
+.
+Failed 6 of 7 tests
+Success rate: 14%
+Error level = 6
--- /dev/null
+Running 1 test
+In SimpleTest::testAddition:
+SimpleTest.h:24: Error: Expected (2 + 2 == 5), found (4 != 5)
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+Running 2 tests
+In <no suite>::<no test>:
+SetUpWorldError.h:12: Error: Test failed: THIS IS BAD
+RealDescriptions.cpp:5: Warning: Error setting up world
+OK!
+Error level = 0
--- /dev/null
+Running 1 test
+In <no suite>::<no test>:
+RealDescriptions.cpp:5: Warning: Error setting up world
+OK!
+Error level = 0
--- /dev/null
+Running 1 test
+In <no suite>::<no test>:
+RealDescriptions.cpp:5: Warning: Error setting up world
+OK!
+Error level = 0
--- /dev/null
+Running 1 test.
+In <no suite>::<no test>:
+RealDescriptions.cpp:5: Warning: Error tearing down world
+OK!
+Error level = 0
--- /dev/null
+Running 1 test.
+In <no suite>::<no test>:
+RealDescriptions.cpp:5: Warning: Error tearing down world
+OK!
+Error level = 0
--- /dev/null
+Running 2 tests..OK!
+Error level = 0
--- /dev/null
+import sys
+import os
+import os.path
+import glob
+import difflib
+import subprocess
+import re
+if sys.version_info < (2,7):
+ import unittest2 as unittest
+else:
+ import unittest
+try:
+ import ply
+ ply_available=True
+except:
+ ply_available=False
+
+currdir = os.path.dirname(os.path.abspath(__file__))+os.sep
+sampledir = os.path.dirname(os.path.dirname(currdir))+'/sample'+os.sep
+cxxtestdir = os.path.dirname(os.path.dirname(currdir))+os.sep
+
+compilerre = re.compile("^(?P<path>[^:]+)(?P<rest>:[0-9]+:.*)$")
+dirre = re.compile("^([^"+os.sep+"]*/)*")
+xmlre = re.compile("\"(?P<path>[^\"]*/[^\"]*)\"")
+
+# Headers from the cxxtest/sample directory
+samples = ' '.join(file for file in sorted(glob.glob(sampledir+'*.h')))
+guiInputs=currdir+'../sample/gui/GreenYellowRed.h'
+if sys.platform.startswith('win'):
+ target_suffix = '.exe'
+else:
+ target_suffix = ''
+# Create a file with the list of sample files
+OUTPUT = open(currdir+'Samples.txt','w')
+for line in sorted(glob.glob(sampledir+'*.h')):
+ OUTPUT.write(line+'\n')
+OUTPUT.close()
+
+def available(compiler, exe_option):
+ cmd = "cd %s; %s %s %s %s > %s 2>&1" % (currdir, compiler, exe_option, currdir+'anything', currdir+'anything.cpp', currdir+'anything.log')
+ ##print cmd
+ status = subprocess.call(cmd, shell=True)
+ flag = status == 0 and os.path.exists(currdir+'anything')
+ os.remove(currdir+'anything.log')
+ if os.path.exists(currdir+'anything'):
+ os.remove(currdir+'anything')
+ return flag
+
+def remove_absdir(filename):
+ INPUT=open(filename, 'r')
+ lines = [line.strip() for line in INPUT]
+ INPUT.close()
+ OUTPUT=open(filename, 'w')
+ for line in lines:
+ # remove basedir at front of line
+ match = compilerre.match(line) # see if we can remove the basedir
+ if match:
+ parts = match.groupdict()
+ line = dirre.sub("", parts['path']) + parts['rest']
+ OUTPUT.write(line+'\n')
+ OUTPUT.close()
+
+def normalize_line_for_diff(line):
+ # add spaces around {}<>()
+ line = re.sub("[{}<>()]", r" \0 ", line)
+
+ # beginnig and ending whitespace
+ line = line.strip()
+
+ # remove all whitespace
+ # and leave a single space
+ line = ' '.join(line.split())
+
+ # remove spaces around "="
+ line = re.sub(" ?= ?", "=", line)
+
+
+ # remove all absolute path prefixes
+ line = ''.join(line.split(cxxtestdir))
+ # for xml, remove prefixes from everything that looks like a
+ # file path inside ""
+ line = xmlre.sub(
+ lambda match: '"'+re.sub("^[^/]+/", "", match.group(1))+'"',
+ line
+ )
+ return line
+
+def make_diff_readable(diff):
+ i = 0
+ while i+1 < len(diff):
+ if diff[i][0] == '-' and diff[i+1][0] == '+':
+ l1 = diff[i]
+ l2 = diff[i+1]
+ for j in range(1, min([len(l1), len(l2)])):
+ if l1[j] != l2[j]:
+ if j > 4:
+ j = j-2;
+ l1 = l1[j:]
+ l2 = l2[j:]
+ diff[i] = '-(...)' + l1
+ diff[i+1] = '+(...)' + l2
+ break
+ i+=1
+
+def file_diff(filename1, filename2):
+ remove_absdir(filename1)
+ remove_absdir(filename2)
+ #
+ INPUT=open(filename1, 'r')
+ lines1 = INPUT.readlines()
+ INPUT.close()
+ #
+ INPUT=open(filename2, 'r')
+ lines2 = INPUT.readlines()
+ INPUT.close()
+ #
+ lines1cmp = [normalize_line_for_diff(line) for line in lines1]
+ lines2cmp = [normalize_line_for_diff(line) for line in lines2]
+ diff = list(difflib.unified_diff(lines2cmp, lines1cmp,
+ fromfile=filename2, tofile=filename1))
+ if diff: make_diff_readable(diff)
+ diff = '\n'.join(diff)
+ return diff
+
+class BaseTestCase(object):
+
+ fog=''
+
+ def setUp(self):
+ self.passed=False
+ self.prefix=''
+ self.py_out=''
+ self.py_cpp=''
+ self.px_pre=''
+ self.px_out=''
+ self.build_log=''
+ self.build_target=''
+
+ def tearDown(self):
+ if not self.passed:
+ return
+ if os.path.exists(self.py_out):
+ os.remove(self.py_out)
+ if os.path.exists(self.py_cpp) and not 'CXXTEST_GCOV_FLAGS' in os.environ:
+ os.remove(self.py_cpp)
+ if os.path.exists(self.px_pre):
+ os.remove(self.px_pre)
+ if os.path.exists(self.px_out):
+ os.remove(self.px_out)
+ if os.path.exists(self.build_log):
+ os.remove(self.build_log)
+ if os.path.exists(self.build_target) and not 'CXXTEST_GCOV_FLAGS' in os.environ:
+ os.remove(self.build_target)
+
+ def check_if_supported(self, filename, msg):
+ target=currdir+'check'+'px'+target_suffix
+ log=currdir+'check'+'_build.log'
+ cmd = "cd %s; %s %s %s %s. %s%s../ %s > %s 2>&1" % (currdir, self.compiler, self.exe_option, target, self.include_option, self.include_option, currdir, filename, log)
+ ##print cmd
+ status = subprocess.call(cmd, shell=True)
+ os.remove(log)
+ if status != 0 or not os.path.exists(target):
+ self.skipTest(msg)
+ os.remove(target)
+
+ def init(self, prefix):
+ #
+ self.prefix = self.__class__.__name__+'_'+prefix
+ self.py_out = currdir+self.prefix+'_py.out'
+ self.py_cpp = currdir+self.prefix+'_py.cpp'
+ self.px_pre = currdir+self.prefix+'_px.pre'
+ self.px_out = currdir+self.prefix+'_px.out'
+ self.build_log = currdir+self.prefix+'_build.log'
+ self.build_target = currdir+self.prefix+'px'+target_suffix
+
+ def check_root(self, prefix='', output=None):
+ self.init(prefix)
+ args = "--have-eh --abort-on-fail --root --error-printer"
+ cmd = "cd %s; %s %s../bin/cxxtestgen %s -o %s %s > %s 2>&1" % (currdir, sys.executable, currdir, self.fog, self.py_cpp, args, self.py_out)
+ #print self.fog, "CMD", cmd
+ status = subprocess.call(cmd, shell=True)
+ self.assertEqual(status, 0, 'Error executing cxxtestgen')
+ #
+ files = [self.py_cpp]
+ for i in [1,2]:
+ args = "--have-eh --abort-on-fail --part Part%s.h" % str(i)
+ file = currdir+self.prefix+'_py%s.cpp' % str(i)
+ files.append(file)
+ cmd = "cd %s; %s %s../bin/cxxtestgen %s -o %s %s > %s 2>&1" % (currdir, sys.executable, currdir, self.fog, file, args, self.py_out)
+ ##print cmd
+ status = subprocess.call(cmd, shell=True)
+ self.assertEqual(status, 0, 'Error executing cxxtestgen')
+ #
+ cmd = "cd %s; %s %s %s %s. %s%s../ %s > %s 2>&1" % (currdir, self.compiler, self.exe_option, self.build_target, self.include_option, self.include_option, currdir, ' '.join(files), self.build_log)
+ ##print cmd
+ status = subprocess.call(cmd, shell=True)
+ for file in files:
+ if os.path.exists(file):
+ os.remove(file)
+ self.assertEqual(status, 0, 'Error executing command: '+cmd)
+ #
+ status = subprocess.call("cd %s; %s -v > %s 2>&1" % (currdir, self.build_target, self.px_pre), shell=True)
+ OUTPUT = open(self.px_pre,'a')
+ OUTPUT.write('Error level = '+str(status)+'\n')
+ OUTPUT.close()
+ diffstr = file_diff(self.px_pre, currdir+output)
+ if not diffstr == '':
+ self.fail("Unexpected differences in output:\n"+diffstr)
+ #
+ self.passed=True
+
+ def compile(self, prefix='', args=None, compile='', output=None, main=None, failGen=False, run=None, logfile=None, failBuild=False):
+ self.init(prefix)
+ #
+ cmd = "cd %s; %s %s../bin/cxxtestgen %s -o %s %s > %s 2>&1" % (currdir, sys.executable, currdir, self.fog, self.py_cpp, args, self.py_out)
+ #print ("HERE "+cmd)
+ status = subprocess.call(cmd, shell=True)
+ if failGen:
+ if status == 0:
+ self.fail('Expected cxxtestgen to fail.')
+ else:
+ self.passed=True
+ return
+ self.assertEqual(status, 0, 'Error executing command: '+cmd)
+ #
+ if not main is None:
+ # Compile with main
+ cmd = "cd %s; %s %s %s %s. %s%s../ %s main.cpp %s > %s 2>&1" % (currdir, self.compiler, self.exe_option, self.build_target, self.include_option, self.include_option, currdir, compile, self.py_cpp, self.build_log)
+ else:
+ # Compile without main
+ cmd = "cd %s; %s %s %s %s. %s%s../ %s %s > %s 2>&1" % (currdir, self.compiler, self.exe_option, self.build_target, self.include_option, self.include_option, currdir, compile, self.py_cpp, self.build_log)
+ status = subprocess.call(cmd, shell=True)
+ if failBuild:
+ if status == 0:
+ self.fail('Expected compiler to fail.')
+ else:
+ self.passed=True
+ return
+ else:
+ self.assertEqual(status, 0, 'Error executing command: '+cmd)
+ #
+ if compile == '' and not output is None:
+ if run is None:
+ cmd = "cd %s; %s -v > %s 2>&1" % (currdir, self.build_target, self.px_pre)
+ else:
+ cmd = run % (self.build_target, self.px_pre)
+ status = subprocess.call(cmd, shell=True)
+ #print "HERE-status",status
+ OUTPUT = open(self.px_pre,'a')
+ OUTPUT.write('Error level = '+str(status)+'\n')
+ OUTPUT.close()
+ if logfile is None:
+ diffstr = file_diff(self.px_pre, currdir+output)
+ else:
+ diffstr = file_diff(currdir+logfile, currdir+output)
+ if not diffstr == '':
+ self.fail("Unexpected differences in output:\n"+diffstr)
+ if not logfile is None:
+ os.remove(currdir+logfile)
+ #
+ if compile == '' and output is None and os.path.exists(self.py_cpp):
+ self.fail("Output cpp file %s should not have been generated." % self.py_cpp)
+ #
+ self.passed=True
+
+ #
+ # Tests for cxxtestgen
+ #
+
+ def test_root_or_part(self):
+ """Root/Part"""
+ self.check_root(prefix='root_or_part', output="parts.out")
+
+ def test_root_plus_part(self):
+ """Root + Part"""
+ self.compile(prefix='root_plus_part', args="--error-printer --root --part "+samples, output="error.out")
+
+ def test_wildcard(self):
+ """Wildcard input"""
+ self.compile(prefix='wildcard', args='../sample/*.h', main=True, output="wildcard.out")
+
+ def test_stdio_printer(self):
+ """Stdio printer"""
+ self.compile(prefix='stdio_printer', args="--runner=StdioPrinter "+samples, output="error.out")
+
+ def test_paren_printer(self):
+ """Paren printer"""
+ self.compile(prefix='paren_printer', args="--runner=ParenPrinter "+samples, output="paren.out")
+
+ def test_yn_runner(self):
+ """Yes/No runner"""
+ self.compile(prefix='yn_runner', args="--runner=YesNoRunner "+samples, output="runner.out")
+
+ def test_no_static_init(self):
+ """No static init"""
+ self.compile(prefix='no_static_init', args="--error-printer --no-static-init "+samples, output="error.out")
+
+ def test_samples_file(self):
+ """Samples file"""
+ self.compile(prefix='samples_file', args="--error-printer --headers Samples.txt", output="error.out")
+
+ def test_have_std(self):
+ """Have Std"""
+ self.compile(prefix='have_std', args="--runner=StdioPrinter --have-std HaveStd.h", output="std.out")
+
+ def test_comments(self):
+ """Comments"""
+ self.compile(prefix='comments', args="--error-printer Comments.h", output="comments.out")
+
+ def test_longlong(self):
+ """Long long"""
+ self.check_if_supported('longlong.cpp', "Long long is not supported by this compiler")
+ self.compile(prefix='longlong', args="--error-printer --longlong='long long' LongLong.h", output="longlong.out")
+
+ def test_int64(self):
+ """Int64"""
+ self.check_if_supported('int64.cpp', "64-bit integers are not supported by this compiler")
+ self.compile(prefix='int64', args="--error-printer --longlong=__int64 Int64.h", output="int64.out")
+
+ def test_include(self):
+ """Include"""
+ self.compile(prefix='include', args="--include=VoidTraits.h --include=LongTraits.h --error-printer IncludeTest.h", output="include.out")
+
+ #
+ # Template file tests
+ #
+
+ def test_preamble(self):
+ """Preamble"""
+ self.compile(prefix='preamble', args="--template=preamble.tpl "+samples, output="preamble.out")
+
+ def test_activate_all(self):
+ """Activate all"""
+ self.compile(prefix='activate_all', args="--template=activate.tpl "+samples, output="error.out")
+
+ def test_only_suite(self):
+ """Only Suite"""
+ self.compile(prefix='only_suite', args="--template=%s../sample/only.tpl %s" % (currdir, samples), run="%s SimpleTest > %s 2>&1", output="suite.out")
+
+ def test_only_test(self):
+ """Only Test"""
+ self.compile(prefix='only_test', args="--template=%s../sample/only.tpl %s" % (currdir, samples), run="%s SimpleTest testAddition > %s 2>&1", output="suite_test.out")
+
+ def test_have_std_tpl(self):
+ """Have Std - Template"""
+ self.compile(prefix='have_std_tpl', args="--template=HaveStd.tpl HaveStd.h", output="std.out")
+
+ def test_exceptions_tpl(self):
+ """Exceptions - Template"""
+ self.compile(prefix='exceptions_tpl', args="--template=HaveEH.tpl "+self.ehNormals, output="eh_normals.out")
+
+ #
+ # Test cases which do not require exception handling
+ #
+
+ def test_no_errors(self):
+ """No errors"""
+ self.compile(prefix='no_errors', args="--error-printer GoodSuite.h", output="good.out")
+
+ def test_infinite_values(self):
+ """Infinite values"""
+ self.compile(prefix='infinite_values', args="--error-printer --have-std TestNonFinite.h", output="infinite.out")
+
+ def test_max_dump_size(self):
+ """Max dump size"""
+ self.compile(prefix='max_dump_size', args="--error-printer --include=MaxDump.h DynamicMax.h SameData.h", output='max.out')
+
+ def test_wide_char(self):
+ """Wide char"""
+ self.check_if_supported('wchar.cpp', "The file wchar.cpp is not supported.")
+ self.compile(prefix='wide_char', args="--error-printer WideCharTest.h", output="wchar.out")
+
+ #def test_factor(self):
+ #"""Factor"""
+ #self.compile(prefix='factor', args="--error-printer --factor Factor.h", output="factor.out")
+
+ def test_user_traits(self):
+ """User traits"""
+ self.compile(prefix='user_traits', args="--template=UserTraits.tpl UserTraits.h", output='user.out')
+
+ normals = " ".join(currdir+file for file in ["LessThanEquals.h","Relation.h","DefaultTraits.h","DoubleCall.h","SameData.h","SameFiles.h","Tsm.h","TraitsTest.h","MockTest.h","SameZero.h"])
+
+ def test_normal_behavior_xunit(self):
+ """Normal Behavior with XUnit Output"""
+ self.compile(prefix='normal_behavior_xunit', args="--xunit-printer "+self.normals, logfile='TEST-cxxtest.xml', output="normal.xml")
+
+ def test_normal_behavior(self):
+ """Normal Behavior"""
+ self.compile(prefix='normal_behavior', args="--error-printer "+self.normals, output="normal.out")
+
+ def test_normal_plus_abort(self):
+ """Normal + Abort"""
+ self.compile(prefix='normal_plus_abort', args="--error-printer --have-eh --abort-on-fail "+self.normals, output="abort.out")
+
+ def test_stl_traits(self):
+ """STL Traits"""
+ self.check_if_supported('stpltpl.cpp', "The file stpltpl.cpp is not supported.")
+ self.compile(prefix='stl_traits', args="--error-printer StlTraits.h", output="stl.out")
+
+ #
+ # Test cases which do require exception handling
+ #
+ def test_throw_wo_std(self):
+ """Throw w/o Std"""
+ self.compile(prefix='test_throw_wo_std', args="--template=ThrowNoStd.tpl ThrowNoStd.h", output='throw.out')
+
+ ehNormals = "Exceptions.h DynamicAbort.h"
+
+ def test_exceptions(self):
+ """Exceptions"""
+ self.compile(prefix='exceptions', args="--error-printer --have-eh "+self.ehNormals, output="eh_normals.out")
+
+ def test_exceptions_plus_abort(self):
+ """Exceptions plus abort"""
+ self.compile(prefix='exceptions', args="--error-printer --abort-on-fail --have-eh DynamicAbort.h DeepAbort.h ThrowsAssert.h", output="eh_plus_abort.out")
+
+ def test_default_abort(self):
+ """Default abort"""
+ self.compile(prefix='default_abort', args="--error-printer --include=DefaultAbort.h "+self.ehNormals+ " DeepAbort.h ThrowsAssert.h", output="default_abort.out")
+
+ def test_default_no_abort(self):
+ """Default no abort"""
+ self.compile(prefix='default_no_abort', args="--error-printer "+self.ehNormals+" DeepAbort.h ThrowsAssert.h", output="default_abort.out")
+
+ #
+ # Global Fixtures
+ #
+
+ def test_global_fixtures(self):
+ """Global fixtures"""
+ self.compile(prefix='global_fixtures', args="--error-printer GlobalFixtures.h WorldFixtures.h", output="gfxs.out")
+
+ def test_gf_suw_fails(self):
+ """GF:SUW fails"""
+ self.compile(prefix='gf_suw_fails', args="--error-printer SetUpWorldFails.h", output="suwf.out")
+
+ def test_gf_suw_error(self):
+ """GF:SUW error"""
+ self.compile(prefix='gf_suw_error', args="--error-printer SetUpWorldError.h", output="suwe.out")
+
+ def test_gf_suw_throws(self):
+ """GF:SUW throws"""
+ self.compile(prefix='gf_suw_throws', args="--error-printer SetUpWorldThrows.h", output="suwt.out")
+
+ def test_gf_su_fails(self):
+ """GF:SU fails"""
+ self.compile(prefix='gf_su_fails', args="--error-printer GfSetUpFails.h", output="gfsuf.out")
+
+ def test_gf_su_throws(self):
+ """GF:SU throws"""
+ self.compile(prefix='gf_su_throws', args="--error-printer GfSetUpThrows.h", output="gfsut.out")
+
+ def test_gf_td_fails(self):
+ """GF:TD fails"""
+ self.compile(prefix='gf_td_fails', args="--error-printer GfTearDownFails.h", output="gftdf.out")
+
+ def test_gf_td_throws(self):
+ """GF:TD throws"""
+ self.compile(prefix='gf_td_throws', args="--error-printer GfTearDownThrows.h", output="gftdt.out")
+
+ def test_gf_tdw_fails(self):
+ """GF:TDW fails"""
+ self.compile(prefix='gf_tdw_fails', args="--error-printer TearDownWorldFails.h", output="tdwf.out")
+
+ def test_gf_tdw_throws(self):
+ """GF:TDW throws"""
+ self.compile(prefix='gf_tdw_throws', args="--error-printer TearDownWorldThrows.h", output="tdwt.out")
+
+ #
+ # GUI
+ #
+
+ def test_gui(self):
+ """GUI"""
+ self.compile(prefix='gui', args='--gui=DummyGui %s' % guiInputs, output ="gui.out")
+
+ def test_gui_runner(self):
+ """GUI + runner"""
+ self.compile(prefix='gui_runner', args="--gui=DummyGui --runner=ParenPrinter %s" % guiInputs, output="gui_paren.out")
+
+ def test_qt_gui(self):
+ """QT GUI"""
+ self.compile(prefix='qt_gui', args="--gui=QtGui GoodSuite.h", compile=self.qtFlags)
+
+ def test_win32_gui(self):
+ """Win32 GUI"""
+ self.compile(prefix='win32_gui', args="--gui=Win32Gui GoodSuite.h", compile=self.w32Flags)
+
+ def test_win32_unicode(self):
+ """Win32 Unicode"""
+ self.compile(prefix='win32_unicode', args="--gui=Win32Gui GoodSuite.h", compile=self.w32Flags+' -DUNICODE')
+
+ def test_x11_gui(self):
+ """X11 GUI"""
+ self.check_if_supported('wchar.cpp', "Cannot compile wchar.cpp")
+ self.compile(prefix='x11_gui', args="--gui=X11Gui GoodSuite.h", compile=self.x11Flags)
+
+
+ #
+ # Tests for when the compiler doesn't support exceptions
+ #
+
+ def test_no_exceptions(self):
+ """No exceptions"""
+ if self.no_eh_option is None:
+ self.skipTest("This compiler does not have an exception handling option")
+ self.compile(prefix='no_exceptions', args='--runner=StdioPrinter NoEh.h', output="no_eh.out", compile=self.no_eh_option)
+
+ def test_force_no_eh(self):
+ """Force no EH"""
+ if self.no_eh_option is None:
+ self.skipTest("This compiler does not have an exception handling option")
+ self.compile(prefix="force_no_eh", args="--runner=StdioPrinter --no-eh ForceNoEh.h", output="no_eh.out", compile=self.no_eh_option)
+
+ #
+ # Invalid input to cxxtestgen
+ #
+
+ def test_no_tests(self):
+ """No tests"""
+ self.compile(prefix='no_tests', args='EmptySuite.h', failGen=True)
+
+ def test_missing_input(self):
+ """Missing input"""
+ self.compile(prefix='missing_input', args='--template=NoSuchFile.h', failGen=True)
+
+ def test_missing_template(self):
+ """Missing template"""
+ self.compile(prefix='missing_template', args='--template=NoSuchFile.h '+samples, failGen=True)
+
+ def test_inheritance(self):
+ """Test relying on inheritance"""
+ self.compile(prefix='inheritance', args='--error-printer InheritedTest.h', output='inheritance_old.out')
+
+ #
+ # Tests that illustrate differences between the different C++ parsers
+ #
+
+ def test_inheritance(self):
+ """Test relying on inheritance"""
+ if self.fog == '':
+ self.compile(prefix='inheritance', args='--error-printer InheritedTest.h', failGen=True)
+ else:
+ self.compile(prefix='inheritance', args='--error-printer InheritedTest.h', output='inheritance.out')
+
+ def test_simple_inheritance(self):
+ """Test relying on simple inheritance"""
+ self.compile(prefix='simple_inheritance', args='--error-printer SimpleInheritedTest.h', output='simple_inheritance.out')
+
+ def test_simple_inheritance2(self):
+ """Test relying on simple inheritance (2)"""
+ if self.fog == '':
+ self.compile(prefix='simple_inheritance2', args='--error-printer SimpleInheritedTest2.h', failGen=True)
+ else:
+ self.compile(prefix='simple_inheritance2', args='--error-printer SimpleInheritedTest2.h', output='simple_inheritance2.out')
+
+ def test_comments2(self):
+ """Comments2"""
+ if self.fog == '':
+ self.compile(prefix='comments2', args="--error-printer Comments2.h", failBuild=True)
+ else:
+ self.compile(prefix='comments2', args="--error-printer Comments2.h", output='comments2.out')
+
+ def test_cpp_template1(self):
+ """C++ Templates"""
+ if self.fog == '':
+ self.compile(prefix='cpp_template1', args="--error-printer CppTemplateTest.h", failGen=True)
+ else:
+ self.compile(prefix='cpp_template1', args="--error-printer CppTemplateTest.h", output='template.out')
+
+ def test_bad1(self):
+ """BadTest1"""
+ if self.fog == '':
+ self.compile(prefix='bad1', args="--error-printer BadTest.h", failGen=True)
+ else:
+ self.compile(prefix='bad1', args="--error-printer BadTest.h", output='bad.out')
+
+
+class TestCpp(BaseTestCase, unittest.TestCase):
+
+ # Compiler specifics
+ exe_option = '-o'
+ include_option = '-I'
+ compiler='c++ -Wall -W -Werror -g'
+ no_eh_option = None
+ qtFlags='-Ifake'
+ x11Flags='-Ifake'
+ w32Flags='-Ifake'
+
+ def run(self, *args, **kwds):
+ if available('c++', '-o'):
+ return unittest.TestCase.run(self, *args, **kwds)
+
+ def setUp(self):
+ BaseTestCase.setUp(self)
+
+ def tearDown(self):
+ BaseTestCase.tearDown(self)
+
+
+class TestCppFOG(TestCpp):
+
+ fog='-f'
+
+ def run(self, *args, **kwds):
+ if ply_available:
+ return TestCpp.run(self, *args, **kwds)
+
+
+class TestGpp(BaseTestCase, unittest.TestCase):
+
+ # Compiler specifics
+ exe_option = '-o'
+ include_option = '-I'
+ compiler='g++ -g -ansi -pedantic -Wmissing-declarations -Werror -Wall -W -Wshadow -Woverloaded-virtual -Wnon-virtual-dtor -Wreorder -Wsign-promo %s' % os.environ.get('CXXTEST_GCOV_FLAGS','')
+ no_eh_option = '-fno-exceptions'
+ qtFlags='-Ifake'
+ x11Flags='-Ifake'
+ w32Flags='-Ifake'
+
+ def run(self, *args, **kwds):
+ if available('g++', '-o'):
+ return unittest.TestCase.run(self, *args, **kwds)
+
+ def setUp(self):
+ BaseTestCase.setUp(self)
+
+ def tearDown(self):
+ BaseTestCase.tearDown(self)
+
+
+class TestGppFOG(TestGpp):
+
+ fog='-f'
+
+ def run(self, *args, **kwds):
+ if ply_available:
+ return TestGpp.run(self, *args, **kwds)
+
+
+class TestClang(BaseTestCase, unittest.TestCase):
+
+ # Compiler specifics
+ exe_option = '-o'
+ include_option = '-I'
+ compiler='clang++ -v -g -Wall -W -Wshadow -Woverloaded-virtual -Wnon-virtual-dtor -Wreorder -Wsign-promo'
+ no_eh_option = '-fno-exceptions'
+ qtFlags='-Ifake'
+ x11Flags='-Ifake'
+ w32Flags='-Ifake'
+
+ def run(self, *args, **kwds):
+ if available('clang++', '-o'):
+ return unittest.TestCase.run(self, *args, **kwds)
+
+ def setUp(self):
+ BaseTestCase.setUp(self)
+
+ def tearDown(self):
+ BaseTestCase.tearDown(self)
+
+
+class TestClangFOG(TestClang):
+
+ fog='-f'
+
+ def run(self, *args, **kwds):
+ if ply_available:
+ return TestClang.run(self, *args, **kwds)
+
+
+class TestCL(BaseTestCase, unittest.TestCase):
+
+ # Compiler specifics
+ exe_option = '-o'
+ include_option = '-I'
+ compiler='cl -nologo -GX -W4 -WX'
+ no_eh_option = '-GX-'
+ qtFlags='-Ifake'
+ x11Flags='-Ifake'
+ w32Flags='-Ifake'
+
+ def run(self, *args, **kwds):
+ if available('cl', '-o'):
+ return unittest.TestCase.run(self, *args, **kwds)
+
+ def setUp(self):
+ BaseTestCase.setUp(self)
+
+ def tearDown(self):
+ BaseTestCase.tearDown(self)
+
+
+class TestCLFOG(TestCL):
+
+ fog='-f'
+
+ def run(self, *args, **kwds):
+ if ply_available:
+ return TestCL.run(self, *args, **kwds)
+
+
+if __name__ == '__main__':
+ unittest.main()
--- /dev/null
+#
+# Import and execute the Python test driver for the user guide examples
+#
+
+# Imports
+try:
+ import pyutilib.th as unittest
+ pyutilib_available=True
+except:
+ pyutilib_available=False
+import os
+from os.path import dirname, abspath, abspath, basename
+import sys
+
+if pyutilib_available:
+ currdir = dirname(abspath(__file__))+os.sep
+ datadir = os.sep.join([dirname(dirname(abspath(__file__))),'doc','examples'])+os.sep
+
+ os.chdir(datadir)
+ sys.path.insert(0, datadir)
+
+ from test_examples import *
+
+# Execute the tests
+if __name__ == '__main__':
+ unittest.main()
--- /dev/null
+Running 1 test.OK!
+Error level = 0
--- /dev/null
+#include <cxxtest/Flags.h>
+
+#ifndef _CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+template<class T> class X {} x;
+template<class T, class U> class Pair {} p;
+template<class T, class U> class X< Pair<T, U> > {} xp;
+
+int main() { return 0; }
+#endif // !_CXXTEST_PARTIAL_TEMPLATE_SPECIALIZATION
+
--- /dev/null
+#ifndef LINKEDLIST_TEST_H
+#define LINKEDLIST_TEST_H
+
+#include <cxxtest/LinkedList.h>
+
+class TestLink : public CxxTest::Link
+{
+ public:
+ bool setUp() { return true; }
+ bool tearDown() { return true; }
+};
+
+#include <cxxtest/TestSuite.h>
+class LinkedList_test : public CxxTest::TestSuite
+{
+public:
+ void test_initialize()
+ {
+ CxxTest::List list;
+ list.initialize();
+ TS_ASSERT_EQUALS((CxxTest::Link*)0, list.head());
+ TS_ASSERT_EQUALS((CxxTest::Link*)0, list.tail());
+ TS_ASSERT_EQUALS(0, list.size());
+ TS_ASSERT(list.empty());
+ }
+
+ void test_attach()
+ {
+ CxxTest::List list;
+ TestLink link;
+
+ list.initialize();
+ link.attach(list);
+
+ TS_ASSERT_EQUALS(1, list.size());
+ TS_ASSERT_EQUALS((CxxTest::Link*)&link, list.head());
+ TS_ASSERT_EQUALS((CxxTest::Link*)&link, list.tail());
+ }
+
+ void test_detach()
+ {
+ CxxTest::List list;
+ TestLink link;
+
+ list.initialize();
+ link.attach(list);
+ link.detach(list);
+
+ TS_ASSERT_EQUALS((CxxTest::Link*)0, list.head());
+ TS_ASSERT_EQUALS((CxxTest::Link*)0, list.tail());
+ TS_ASSERT_EQUALS(0, list.size());
+ TS_ASSERT(list.empty());
+ }
+};
+
+
+#endif // __SIMPLETEST_H
--- /dev/null
+CxxTestBuilder_path = '../../build_tools/SCons/cxxtest.py'
+CxxTest_dir = '../..'
+
+# First a little python magic to pull in CxxTestBuilder
+import imp
+cxxtest = imp.load_source('cxxtest', CxxTestBuilder_path)
+env = Environment()
+cxxtest.generate(env, CXXTEST_INSTALL_DIR=CxxTest_dir)
+
+for test in env.Glob('*.t.h'):
+ env.CxxTest(test)
+
--- /dev/null
+Running 1 test
+In TestUserTraits::testUserTraits:
+UserTraits.h:34: Error: Test failed: 0x7F
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+//
+// This program is used to check if the compiler supports basic_string<wchar_t>
+//
+#include <string>
+
+int main()
+{
+ std::basic_string<wchar_t> s(L"s");
+ return 0;
+}
+
--- /dev/null
+Running 1 test
+In WideCharTest::testWideStringTraits:
+WideCharTest.h:14: Error: Test failed: L"std::wstring is displayed with L\"\""
+WideCharTest.h:16: Error: Test failed: L"\x1234\x5678"
+Failed 1 of 1 test
+Success rate: 0%
+Error level = 1
--- /dev/null
+Number of suites: 8
+Number of tests: 14
+Number of failed tests: 12
+Error level = 0
--- /dev/null
+require 'pp'
+
+class Artifact
+ def initialize(config)
+ @settings = defaults()
+ @settings.merge!(config)
+
+ # Process Source paths
+ @settings[:source_files] = make_file_list( @settings[:source_files] )
+
+ # Process Include paths
+ @settings[:include_dirs] = make_file_list( @settings[:include_dirs] )
+ @settings[:include_dirs] = make_option_list( '-I', @settings[:include_dirs] )
+
+ # Process compiler options
+ @settings[:compiler_options] = make_option_list('',@settings[:compiler_options])
+
+ # Process linker options
+ @settings[:linker_options] = make_option_list('',@settings[:linker_options])
+
+ # Process preprocessor defines
+ @settings[:preprocessor_defines] = make_option_list('-D',@settings[:preprocessor_defines])
+ end
+
+ def defaults()
+ return {
+ :name => 'binary',
+ :output_dir => 'build',
+
+ :compiler_bin => 'c++',
+ :compiler_options => ['-c'],
+ :preprocessor_defines => [],
+
+ :linker_bin => 'c++',
+ :linker_options => [],
+
+ :source_files => [ 'source/**/*.c*' ],
+ :include_dirs => [ 'source/**/' ],
+ :directories => []
+ }
+ end
+
+ def to_s
+ pp @settings
+ end
+
+ def get_bin_extension()
+ if ENV['OS'] == 'Windows_NT' then
+ return '.exe'
+ else
+ return ''
+ end
+ end
+
+ def make_option_list(prefix,list)
+ if list != nil then
+ return list.collect{|opt| "#{prefix}#{opt} "}
+ else
+ return list
+ end
+ end
+
+ def make_file_list(patt_list)
+ file_list = []
+ patt_list.each {|f|
+ file_list.concat( FileList[f] )
+ }
+ return file_list
+ end
+
+ def register_directory(dir_name)
+ @settings[:directories].push(dir_name)
+ directory dir_name
+ CLOBBER.include(dir_name)
+ end
+
+ def directories()
+ return @settings[:directories]
+ end
+
+ def compile(input,output)
+ config = @settings
+ sh "#{config[:compiler_bin]} #{config[:preprocessor_defines]} #{config[:include_dirs]} #{config[:compiler_options]} #{output} #{input}"
+ end
+
+ def link(*args)
+ config = @settings
+ if args.size == 2 then
+ file_list = args[0]
+ output = args[1]
+ sh "#{config[:linker_bin]} #{config[:linker_options]} #{output} #{file_list.collect{|x| x + ' '}}"
+ else
+ sh "#{config[:linker_bin]} #{config[:linker_options]} #{config[:name]} #{config[:object_files].collect{|x| x + ' '}}"
+ end
+ end
+end
--- /dev/null
+require "#{File.expand_path(File.dirname(__FILE__))}/artifact"
+require 'rake'
+require 'rake/clean'
+
+class Binary < Artifact
+ def initialize(config)
+ super(config)
+
+ # Register output directories
+ register_directory("#{@settings[:output_dir]}/bin")
+ register_directory("#{@settings[:output_dir]}/obj")
+ register_directory("#{@settings[:output_dir]}/test")
+
+ # set output name
+ @settings[:name] = "#{@settings[:output_dir]}/bin/#{@settings[:name]}#{get_bin_extension()}"
+ CLEAN.include(@settings[:bin_name])
+
+ # Create object file list
+ @settings[:object_source_lookup] = {}
+ @settings[:object_files] = []
+ @settings[:source_files].each{ |f|
+ obj_file = @settings[:output_dir] + '/obj/' + File.basename(f).ext('o')
+ CLEAN.include(obj_file)
+ @settings[:object_files].push( obj_file )
+ @settings[:object_source_lookup][obj_file] = f
+ }
+ end
+
+ def name()
+ return @settings[:name]
+ end
+
+ def objects()
+ return @settings[:object_files]
+ end
+
+ def source_from_obj(obj)
+ return @settings[:object_source_lookup][obj]
+ end
+
+ def obj_src_lookup()
+ return lambda{|obj| @settings[:object_source_lookup][obj]}
+ end
+end
--- /dev/null
+require "#{File.expand_path(File.dirname(__FILE__))}/artifact"
+require 'rake'
+require 'rake/clean'
+
+class Library < Artifact
+ def initialize(config)
+ super(config)
+
+ # Register output directories
+ register_directory("#{@settings[:output_dir]}/bin")
+ register_directory("#{@settings[:output_dir]}/obj")
+
+ # set output name
+ @settings[:name] = "#{@settings[:output_dir]}/bin/#{@settings[:name]}"
+ CLEAN.include(@settings[:name])
+
+ # Create object file list
+ @settings[:object_source_lookup] = {}
+ @settings[:object_files] = []
+ @settings[:source_files].each{ |f|
+ obj_file = @settings[:output_dir] + '/obj/' + File.basename(f).ext('o')
+ CLEAN.include(obj_file)
+ @settings[:object_files].push( obj_file )
+ @settings[:object_source_lookup][obj_file] = f
+ }
+ end
+
+ def defaults()
+ return {
+ :name => 'binary',
+ :output_dir => 'build',
+
+ :compiler_bin => 'c++',
+ :compiler_options => ['-c'],
+ :preprocessor_defines => [],
+
+ :linker_bin => 'ar',
+ :linker_options => ['rcs'],
+
+ :source_files => [ 'source/**/*.c*' ],
+ :include_dirs => [ 'source/**/' ],
+ :directories => []
+ }
+ end
+
+ def name()
+ return @settings[:name]
+ end
+
+ def objects()
+ return @settings[:object_files]
+ end
+
+ def source_from_obj(obj)
+ return @settings[:object_source_lookup][obj]
+ end
+
+ def obj_src_lookup()
+ return lambda{|obj| @settings[:object_source_lookup][obj]}
+ end
+
+ def setup_default_rake_tasks()
+ task name() => directories() + objects() do
+ link()
+ end
+
+ rule(/obj\/.+.o$/ => obj_src_lookup()) do |t|
+ compile(t.source,t.name)
+ end
+ end
+end
--- /dev/null
+require "#{File.expand_path(File.dirname(__FILE__))}/artifact.rb"
+require 'rake'
+require 'rake/clean'
+
+class Tests < Artifact
+ def initialize(config)
+ super(config)
+
+ # Register test output directory
+ register_directory("#{@settings[:output_dir]}/test")
+
+ # Process test paths
+ @settings[:test_files] = make_file_list( @settings[:test_files] )
+
+ # Create source to runner lookup table
+ @settings[:src_test_lookup] = {}
+ @settings[:test_files].each{ |test|
+ out_dir = "#{@settings[:output_dir]}/test"
+ runner = "#{out_dir}/#{File.basename(test).ext('')}_runner.cpp"
+ @settings[:src_test_lookup][runner] = test
+ @settings[:runners].push( runner.ext(get_bin_extension()) )
+ }
+ end
+
+ def defaults()
+ defs = super()
+ defs.merge!({
+ :test_gen_bin => 'python tools/cxxtest/bin/cxxtestgen',
+ :test_gen_options => ['--error-printer'],
+ :output_dir => 'build',
+ :test_files => ['tests/source/**.h'],
+ :include_dirs => [ '.','tests/**/', 'source/**/', 'tools/cxxtest' ],
+ :runners => []
+ })
+ return defs
+ end
+
+ def directories()
+ dir_list = [ "#{@settings[:output_dir]}/test" ]
+ directory dir_list[0]
+ CLOBBER.include(dir_list[0])
+ return dir_list
+ end
+
+ def runners()
+ return @settings[:runners]
+ end
+
+ def bin_obj_lookup()
+ return lambda{|bin| bin.ext('.o')}
+ end
+
+ def obj_src_lookup()
+ return lambda{|obj| obj.ext('.cpp')}
+ end
+
+ def src_test_lookup()
+ return lambda{|src| @settings[:src_test_lookup][src] }
+ end
+
+ def generate_test_runner(input,output)
+ sh "#{@settings[:test_gen_bin]} #{@settings[:test_gen_options]} -o #{output} #{input}"
+ end
+
+ def run_all_test_runners()
+ succeeded = true
+ puts ''
+ puts '------------------'
+ puts ' Unit Tests'
+ puts '------------------'
+ puts ''
+ @settings[:runners].each{|runner|
+ status = system(runner)
+ succeeded = (succeeded and status)
+ puts ''
+ }
+ if not succeeded then
+ abort('Error: There are unit test failures')
+ end
+ end
+
+ def setup_default_rake_tasks()
+ desc 'Execute all unit tests'
+ task :test => directories() + runners() do
+ run_all_test_runners();
+ end
+
+ rule '_runner.exe' => bin_obj_lookup() do |t|
+ link([t.source],t.name)
+ end
+
+ rule( /test\/.+_runner.o$/ => obj_src_lookup() ) do |t|
+ compile(t.source,t.name)
+ end
+
+ rule '_runner.cpp' => src_test_lookup() do |t|
+ generate_test_runner(t.source,t.name)
+ end
+ end
+end
+