aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/LICENSE.shunit2703
-rw-r--r--lib/shunit2542
2 files changed, 515 insertions, 730 deletions
diff --git a/doc/LICENSE.shunit2 b/doc/LICENSE.shunit2
index 4362b49..8dada3e 100644
--- a/doc/LICENSE.shunit2
+++ b/doc/LICENSE.shunit2
@@ -1,502 +1,201 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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!
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/lib/shunit2 b/lib/shunit2
index 590a5a8..0455d2f 100644
--- a/lib/shunit2
+++ b/lib/shunit2
@@ -1,95 +1,141 @@
#! /bin/sh
-# $Id: shunit2 322 2011-04-24 00:09:45Z kate.ward@forestent.com $
# vim:et:ft=sh:sts=2:sw=2
#
-# Copyright 2008 Kate Ward. All Rights Reserved.
-# Released under the LGPL (GNU Lesser General Public License)
+# Copyright 2008-2017 Kate Ward. All Rights Reserved.
+# Released under the Apache 2.0 license.
#
# shUnit2 -- Unit testing framework for Unix shell scripts.
-# http://code.google.com/p/shunit2/
+# https://github.com/kward/shunit2
#
# Author: kate.ward@forestent.com (Kate Ward)
#
# shUnit2 is a xUnit based unit test framework for Bourne shell scripts. It is
# based on the popular JUnit unit testing framework for Java.
+#
+# $() are not fully portable (POSIX != portable).
+# shellcheck disable=SC2006
+# expr may be antiquated, but it is the only solution in some cases.
+# shellcheck disable=SC2003
+# Commands are purposely escaped so they can be mocked outside shUnit2.
+# shellcheck disable=SC1001,SC1012
-# return if shunit already loaded
-[ -n "${SHUNIT_VERSION:-}" ] && exit 0
-
-SHUNIT_VERSION='2.1.6'
+# Return if shunit2 already loaded.
+\[ -n "${SHUNIT_VERSION:-}" ] && exit 0
+SHUNIT_VERSION='2.1.7pre'
+# Return values that scripts can use.
SHUNIT_TRUE=0
SHUNIT_FALSE=1
SHUNIT_ERROR=2
-# enable strict mode by default
+# Logging functions.
+_shunit_warn() { echo "shunit2:WARN $*" >&2; }
+_shunit_error() { echo "shunit2:ERROR $*" >&2; }
+_shunit_fatal() { echo "shunit2:FATAL $*" >&2; exit ${SHUNIT_ERROR}; }
+
+# Determine some reasonable command defaults.
+__SHUNIT_UNAME_S=`uname -s`
+case "${__SHUNIT_UNAME_S}" in
+ BSD) __SHUNIT_CMD_EXPR='gexpr' ;;
+ *) __SHUNIT_CMD_EXPR='expr' ;;
+esac
+
+__SHUNIT_CMD_ECHO_ESC='echo -e'
+# shellcheck disable=SC2039
+\[ "`echo -e test`" = '-e test' ] && __SHUNIT_CMD_ECHO_ESC='echo'
+
+# Commands a user can override if needed.
+SHUNIT_CMD_EXPR=${SHUNIT_CMD_EXPR:-${__SHUNIT_CMD_EXPR}}
+
+# Enable strict mode by default.
SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
-_shunit_warn() { echo "shunit2:WARN $@" >&2; }
-_shunit_error() { echo "shunit2:ERROR $@" >&2; }
-_shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; }
+# Enable color output. Options are 'never', 'always', or 'auto'.
+SHUNIT_COLOR=${SHUNIT_COLOR:-auto}
-# specific shell checks
-if [ -n "${ZSH_VERSION:-}" ]; then
+# Specific shell checks.
+if \[ -n "${ZSH_VERSION:-}" ]; then
setopt |grep "^shwordsplit$" >/dev/null
- if [ $? -ne ${SHUNIT_TRUE} ]; then
+ if \[ $? -ne ${SHUNIT_TRUE} ]; then
_shunit_fatal 'zsh shwordsplit option is required for proper operation'
fi
- if [ -z "${SHUNIT_PARENT:-}" ]; then
+ if \[ -z "${SHUNIT_PARENT:-}" ]; then
_shunit_fatal "zsh does not pass \$0 through properly. please declare \
\"SHUNIT_PARENT=\$0\" before calling shUnit2"
fi
fi
#
-# constants
+# Constants
#
-__SHUNIT_ASSERT_MSG_PREFIX='ASSERT:'
__SHUNIT_MODE_SOURCED='sourced'
__SHUNIT_MODE_STANDALONE='standalone'
__SHUNIT_PARENT=${SHUNIT_PARENT:-$0}
-# set the constants readonly
-shunit_constants_=`set |grep '^__SHUNIT_' |cut -d= -f1`
-echo "${shunit_constants_}" |grep '^Binary file' >/dev/null && \
- shunit_constants_=`set |grep -a '^__SHUNIT_' |cut -d= -f1`
-for shunit_constant_ in ${shunit_constants_}; do
- shunit_ro_opts_=''
- case ${ZSH_VERSION:-} in
- '') ;; # this isn't zsh
- [123].*) ;; # early versions (1.x, 2.x, 3.x)
- *) shunit_ro_opts_='-g' ;; # all later versions. declare readonly globally
- esac
- readonly ${shunit_ro_opts_} ${shunit_constant_}
+# ANSI colors.
+__SHUNIT_ANSI_NONE='\033[0m'
+__SHUNIT_ANSI_RED='\033[1;31m'
+__SHUNIT_ANSI_GREEN='\033[1;32m'
+__SHUNIT_ANSI_YELLOW='\033[1;33m'
+__SHUNIT_ANSI_CYAN='\033[1;36m'
+
+# Set the constants readonly.
+__shunit_constants=`set |grep '^__SHUNIT_' |cut -d= -f1`
+echo "${__shunit_constants}" |grep '^Binary file' >/dev/null && \
+ __shunit_constants=`set |grep -a '^__SHUNIT_' |cut -d= -f1`
+for __shunit_const in ${__shunit_constants}; do
+ if \[ -z "${ZSH_VERSION:-}" ]; then
+ readonly "${__shunit_const}"
+ else
+ case ${ZSH_VERSION} in
+ [123].*) readonly "${__shunit_const}" ;;
+ *) readonly -g "${__shunit_const}" # Declare readonly constants globally.
+ esac
+ fi
done
-unset shunit_constant_ shunit_constants_ shunit_ro_opts_
+unset __shunit_const __shunit_constants
+
+#
+# Internal variables.
+#
-# variables
-__shunit_lineno='' # line number of executed test
-__shunit_mode=${__SHUNIT_MODE_SOURCED} # operating mode
-__shunit_reportGenerated=${SHUNIT_FALSE} # is report generated
-__shunit_script='' # filename of unittest script (standalone mode)
-__shunit_skip=${SHUNIT_FALSE} # is skipping enabled
-__shunit_suite='' # suite of tests to execute
+# Variables.
+__shunit_lineno='' # Line number of executed test.
+__shunit_mode=${__SHUNIT_MODE_SOURCED} # Operating mode.
+__shunit_reportGenerated=${SHUNIT_FALSE} # Is report generated.
+__shunit_script='' # Filename of unittest script (standalone mode).
+__shunit_skip=${SHUNIT_FALSE} # Is skipping enabled.
+__shunit_suite='' # Suite of tests to execute.
-# counts of tests
+# ANSI colors (populated by _shunit_configureColor()).
+__shunit_ansi_none=''
+__shunit_ansi_red=''
+__shunit_ansi_green=''
+__shunit_ansi_yellow=''
+__shunit_ansi_cyan=''
+
+# Counts of tests.
__shunit_testSuccess=${SHUNIT_TRUE}
__shunit_testsTotal=0
__shunit_testsPassed=0
__shunit_testsFailed=0
-# counts of asserts
+# Counts of asserts.
__shunit_assertsTotal=0
__shunit_assertsPassed=0
__shunit_assertsFailed=0
__shunit_assertsSkipped=0
-# macros
-_SHUNIT_LINENO_='eval __shunit_lineno=""; if [ "${1:-}" = "--lineno" ]; then [ -n "$2" ] && __shunit_lineno="[$2] "; shift 2; fi'
+#
+# Macros.
+#
+
+# shellcheck disable=SC2016,SC2089
+_SHUNIT_LINENO_='eval __shunit_lineno=""; if \[ "${1:-}" = "--lineno" ]; then \[ -n "$2" ] && __shunit_lineno="[$2] "; shift 2; fi'
#-----------------------------------------------------------------------------
-# assert functions
+# Assertion functions.
#
# Assert that two values are equal to one another.
@@ -100,18 +146,17 @@ _SHUNIT_LINENO_='eval __shunit_lineno=""; if [ "${1:-}" = "--lineno" ]; then [ -
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertEquals()
-{
+assertEquals() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "assertEquals() requires two or three arguments; $# given"
- _shunit_error "1: ${1:+$1} 2: ${2:+$2} 3: ${3:+$3}"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -119,7 +164,7 @@ assertEquals()
shunit_actual_=$2
shunit_return=${SHUNIT_TRUE}
- if [ "${shunit_expected_}" = "${shunit_actual_}" ]; then
+ if \[ "${shunit_expected_}" = "${shunit_actual_}" ]; then
_shunit_assertPass
else
failNotEquals "${shunit_message_}" "${shunit_expected_}" "${shunit_actual_}"
@@ -129,6 +174,7 @@ assertEquals()
unset shunit_message_ shunit_expected_ shunit_actual_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"'
# Assert that two values are not equal to one another.
@@ -139,17 +185,17 @@ _ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertNotEquals()
-{
+assertNotEquals() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "assertNotEquals() requires two or three arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -157,7 +203,7 @@ assertNotEquals()
shunit_actual_=$2
shunit_return=${SHUNIT_TRUE}
- if [ "${shunit_expected_}" != "${shunit_actual_}" ]; then
+ if \[ "${shunit_expected_}" != "${shunit_actual_}" ]; then
_shunit_assertPass
else
failSame "${shunit_message_}" "$@"
@@ -167,6 +213,7 @@ assertNotEquals()
unset shunit_message_ shunit_expected_ shunit_actual_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_NOT_EQUALS_='eval assertNotEquals --lineno "${LINENO:-}"'
# Assert that a value is null (i.e. an empty string)
@@ -176,17 +223,17 @@ _ASSERT_NOT_EQUALS_='eval assertNotEquals --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertNull()
-{
+assertNull() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 1 -o $# -gt 2 ]; then
+ if \[ $# -lt 1 -o $# -gt 2 ]; then
_shunit_error "assertNull() requires one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 2 ]; then
+ if \[ $# -eq 2 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -196,6 +243,7 @@ assertNull()
unset shunit_message_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"'
# Assert that a value is not null (i.e. a non-empty string)
@@ -207,15 +255,16 @@ _ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"'
# integer: success (TRUE/FALSE/ERROR constant)
assertNotNull()
{
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null
+ if \[ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null
_shunit_error "assertNotNull() requires one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 2 ]; then
+ if \[ $# -eq 2 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -227,6 +276,7 @@ assertNotNull()
unset shunit_actual_ shunit_message_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"'
# Assert that two values are the same (i.e. equal to one another).
@@ -237,17 +287,17 @@ _ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertSame()
-{
+assertSame() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "assertSame() requires two or three arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -257,6 +307,7 @@ assertSame()
unset shunit_message_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"'
# Assert that two values are not the same (i.e. not equal to one another).
@@ -267,17 +318,17 @@ _ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertNotSame()
-{
+assertNotSame() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "assertNotSame() requires two or three arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_:-}$1"
shift
fi
@@ -287,6 +338,7 @@ assertNotSame()
unset shunit_message_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"'
# Assert that a value or shell test condition is true.
@@ -301,49 +353,49 @@ _ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"'
# The following test will succeed:
# assertTrue 0
# assertTrue "[ 34 -gt 23 ]"
-# The folloing test will fail with a message:
+# The following test will fail with a message:
# assertTrue 123
-# assertTrue "test failed" "[ -r '/non/existant/file' ]"
+# assertTrue "test failed" "[ -r '/non/existent/file' ]"
#
# Args:
# message: string: failure message [optional]
# condition: string: integer value or shell conditional statement
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertTrue()
-{
+assertTrue() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -gt 2 ]; then
- _shunit_error "assertTrue() takes one two arguments; $# given"
+ if \[ $# -lt 1 -o $# -gt 2 ]; then
+ _shunit_error "assertTrue() takes one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 2 ]; then
+ if \[ $# -eq 2 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
shunit_condition_=$1
- # see if condition is an integer, i.e. a return value
+ # See if condition is an integer, i.e. a return value.
shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'`
shunit_return=${SHUNIT_TRUE}
- if [ -z "${shunit_condition_}" ]; then
- # null condition
+ if \[ -z "${shunit_condition_}" ]; then
+ # Null condition.
shunit_return=${SHUNIT_FALSE}
- elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
+ elif \[ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
then
- # possible return value. treating 0 as true, and non-zero as false.
- [ ${shunit_condition_} -ne 0 ] && shunit_return=${SHUNIT_FALSE}
+ # Possible return value. Treating 0 as true, and non-zero as false.
+ \[ "${shunit_condition_}" -ne 0 ] && shunit_return=${SHUNIT_FALSE}
else
- # (hopefully) a condition
- ( eval ${shunit_condition_} ) >/dev/null 2>&1
- [ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE}
+ # Hopefully... a condition.
+ ( eval "${shunit_condition_}" ) >/dev/null 2>&1
+ \[ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE}
fi
- # record the test
- if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then
+ # Record the test.
+ if \[ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then
_shunit_assertPass
else
_shunit_assertFail "${shunit_message_}"
@@ -352,6 +404,7 @@ assertTrue()
unset shunit_message_ shunit_condition_ shunit_match_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"'
# Assert that a value or shell test condition is false.
@@ -366,7 +419,7 @@ _ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"'
# The following test will succeed:
# assertFalse 1
# assertFalse "[ 'apples' = 'oranges' ]"
-# The folloing test will fail with a message:
+# The following test will fail with a message:
# assertFalse 0
# assertFalse "test failed" "[ 1 -eq 1 -a 2 -eq 2 ]"
#
@@ -375,52 +428,53 @@ _ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"'
# condition: string: integer value or shell conditional statement
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-assertFalse()
-{
+assertFalse() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 1 -o $# -gt 2 ]; then
+ if \[ $# -lt 1 -o $# -gt 2 ]; then
_shunit_error "assertFalse() quires one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 2 ]; then
+ if \[ $# -eq 2 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
shunit_condition_=$1
- # see if condition is an integer, i.e. a return value
+ # See if condition is an integer, i.e. a return value.
shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'`
shunit_return=${SHUNIT_TRUE}
- if [ -z "${shunit_condition_}" ]; then
- # null condition
+ if \[ -z "${shunit_condition_}" ]; then
+ # Null condition.
shunit_return=${SHUNIT_FALSE}
- elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
+ elif \[ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
then
- # possible return value. treating 0 as true, and non-zero as false.
- [ ${shunit_condition_} -eq 0 ] && shunit_return=${SHUNIT_FALSE}
+ # Possible return value. Treating 0 as true, and non-zero as false.
+ \[ "${shunit_condition_}" -eq 0 ] && shunit_return=${SHUNIT_FALSE}
else
- # (hopefully) a condition
- ( eval ${shunit_condition_} ) >/dev/null 2>&1
- [ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE}
+ # Hopefully... a condition.
+ ( eval "${shunit_condition_}" ) >/dev/null 2>&1
+ \[ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE}
fi
- # record the test
- if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then
+ # Record the test.
+ if \[ "${shunit_return}" -eq "${SHUNIT_TRUE}" ]; then
_shunit_assertPass
else
_shunit_assertFail "${shunit_message_}"
fi
unset shunit_message_ shunit_condition_ shunit_match_
- return ${shunit_return}
+ return "${shunit_return}"
}
+# shellcheck disable=SC2016,SC2034
_ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"'
#-----------------------------------------------------------------------------
-# failure functions
+# Failure functions.
#
# Records a test failure.
@@ -429,17 +483,17 @@ _ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"'
# message: string: failure message [optional]
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-fail()
-{
+fail() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -gt 1 ]; then
+ if \[ $# -gt 1 ]; then
_shunit_error "fail() requires zero or one arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 1 ]; then
+ if \[ $# -eq 1 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -449,6 +503,7 @@ fail()
unset shunit_message_
return ${SHUNIT_FALSE}
}
+# shellcheck disable=SC2016,SC2034
_FAIL_='eval fail --lineno "${LINENO:-}"'
# Records a test failure, stating two values were not equal.
@@ -459,17 +514,17 @@ _FAIL_='eval fail --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-failNotEquals()
-{
+failNotEquals() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "failNotEquals() requires one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -481,6 +536,7 @@ failNotEquals()
unset shunit_message_ shunit_expected_ shunit_actual_
return ${SHUNIT_FALSE}
}
+# shellcheck disable=SC2016,SC2034
_FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"'
# Records a test failure, stating two values should have been the same.
@@ -493,15 +549,16 @@ _FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"'
# integer: success (TRUE/FALSE/ERROR constant)
failSame()
{
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "failSame() requires two or three arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -511,6 +568,7 @@ failSame()
unset shunit_message_
return ${SHUNIT_FALSE}
}
+# shellcheck disable=SC2016,SC2034
_FAIL_SAME_='eval failSame --lineno "${LINENO:-}"'
# Records a test failure, stating two values were not equal.
@@ -523,17 +581,17 @@ _FAIL_SAME_='eval failSame --lineno "${LINENO:-}"'
# actual: string: actual value
# Returns:
# integer: success (TRUE/FALSE/ERROR constant)
-failNotSame()
-{
+failNotSame() {
+ # shellcheck disable=SC2090
${_SHUNIT_LINENO_}
- if [ $# -lt 2 -o $# -gt 3 ]; then
+ if \[ $# -lt 2 -o $# -gt 3 ]; then
_shunit_error "failNotEquals() requires one or two arguments; $# given"
return ${SHUNIT_ERROR}
fi
_shunit_shouldSkip && return ${SHUNIT_TRUE}
shunit_message_=${__shunit_lineno}
- if [ $# -eq 3 ]; then
+ if \[ $# -eq 3 ]; then
shunit_message_="${shunit_message_}$1"
shift
fi
@@ -543,10 +601,11 @@ failNotSame()
unset shunit_message_
return ${shunit_return}
}
+# shellcheck disable=SC2016,SC2034
_FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"'
#-----------------------------------------------------------------------------
-# skipping functions
+# Skipping functions.
#
# Force remaining assert and fail functions to be "skipped".
@@ -557,19 +616,13 @@ _FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"'
#
# Args:
# None
-startSkipping()
-{
- __shunit_skip=${SHUNIT_TRUE}
-}
+startSkipping() { __shunit_skip=${SHUNIT_TRUE}; }
# Resume the normal recording behavior of assert and fail calls.
#
# Args:
# None
-endSkipping()
-{
- __shunit_skip=${SHUNIT_FALSE}
-}
+endSkipping() { __shunit_skip=${SHUNIT_FALSE}; }
# Returns the state of assert and fail call skipping.
#
@@ -577,13 +630,10 @@ endSkipping()
# None
# Returns:
# boolean: (TRUE/FALSE constant)
-isSkipping()
-{
- return ${__shunit_skip}
-}
+isSkipping() { return ${__shunit_skip}; }
#-----------------------------------------------------------------------------
-# suite functions
+# Suite functions.
#
# Stub. This function should contains all unit test calls to be made.
@@ -610,8 +660,7 @@ isSkipping()
#
# Args:
# function: string: name of a function to add to current unit test suite
-suite_addTest()
-{
+suite_addTest() {
shunit_func_=${1:-}
__shunit_suite="${__shunit_suite:+${__shunit_suite} }${shunit_func_}"
@@ -653,7 +702,7 @@ suite_addTest()
#
# Args:
# None
-#setUp() { :; }
+#setUp() { :; } # DO NOT UNCOMMENT THIS FUNCTION
# Note: see _shunit_mktempFunc() for actual implementation
# Stub. This function will be called after each test is run.
@@ -668,41 +717,41 @@ suite_addTest()
#tearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION
#------------------------------------------------------------------------------
-# internal shUnit2 functions
+# Internal shUnit2 functions.
#
# Create a temporary directory to store various run-time files in.
#
# This function is a cross-platform temporary directory creation tool. Not all
-# OSes have the mktemp function, so one is included here.
+# OSes have the `mktemp` function, so one is included here.
#
# Args:
# None
# Outputs:
# string: the temporary directory that was created
-_shunit_mktempDir()
-{
- # try the standard mktemp function
+_shunit_mktempDir() {
+ # Try the standard `mktemp` function.
( exec mktemp -dqt shunit.XXXXXX 2>/dev/null ) && return
- # the standard mktemp didn't work. doing our own.
- if [ -r '/dev/urandom' -a -x '/usr/bin/od' ]; then
+ # The standard `mktemp` didn't work. Use our own.
+ # shellcheck disable=SC2039
+ if \[ -r '/dev/urandom' -a -x '/usr/bin/od' ]; then
_shunit_random_=`/usr/bin/od -vAn -N4 -tx4 </dev/urandom \
|sed 's/^[^0-9a-f]*//'`
- elif [ -n "${RANDOM:-}" ]; then
+ elif \[ -n "${RANDOM:-}" ]; then
# $RANDOM works
_shunit_random_=${RANDOM}${RANDOM}${RANDOM}$$
else
- # $RANDOM doesn't work
+ # `$RANDOM` doesn't work.
_shunit_date_=`date '+%Y%m%d%H%M%S'`
- _shunit_random_=`expr ${_shunit_date_} / $$`
+ _shunit_random_=`expr "${_shunit_date_}" / $$`
fi
_shunit_tmpDir_="${TMPDIR:-/tmp}/shunit.${_shunit_random_}"
- ( umask 077 && mkdir "${_shunit_tmpDir_}" ) || \
+ ( umask 077 && \mkdir "${_shunit_tmpDir_}" ) || \
_shunit_fatal 'could not create temporary directory! exiting'
- echo ${_shunit_tmpDir_}
+ echo "${_shunit_tmpDir_}"
unset _shunit_date_ _shunit_random_ _shunit_tmpDir_
}
@@ -710,16 +759,15 @@ _shunit_mktempDir()
#
# Args:
# None
-_shunit_mktempFunc()
-{
+_shunit_mktempFunc() {
for _shunit_func_ in oneTimeSetUp oneTimeTearDown setUp tearDown suite noexec
do
_shunit_file_="${__shunit_tmpDir}/${_shunit_func_}"
- cat <<EOF >"${_shunit_file_}"
+ \cat <<EOF >"${_shunit_file_}"
#! /bin/sh
exit ${SHUNIT_TRUE}
EOF
- chmod +x "${_shunit_file_}"
+ \chmod +x "${_shunit_file_}"
done
unset _shunit_file_
@@ -733,8 +781,7 @@ EOF
#
# Args:
# name: string: name of the trap called (specified when trap defined)
-_shunit_cleanup()
-{
+_shunit_cleanup() {
_shunit_name_=$1
case ${_shunit_name_} in
@@ -742,22 +789,22 @@ _shunit_cleanup()
INT) _shunit_signal_=2 ;;
TERM) _shunit_signal_=15 ;;
*)
- _shunit_warn "unrecognized trap value (${_shunit_name_})"
+ _shunit_error "unrecognized trap value (${_shunit_name_})"
_shunit_signal_=0
;;
esac
- # do our work
- rm -fr "${__shunit_tmpDir}"
+ # Do our work.
+ \rm -fr "${__shunit_tmpDir}"
- # exit for all non-EXIT signals
- if [ ${_shunit_name_} != 'EXIT' ]; then
+ # Exit for all non-EXIT signals.
+ if \[ "${_shunit_name_}" != 'EXIT' ]; then
_shunit_warn "trapped and now handling the (${_shunit_name_}) signal"
- # disable EXIT trap
+ # Disable EXIT trap.
trap 0
- # add 128 to signal and exit
- exit `expr ${_shunit_signal_} + 128`
- elif [ ${__shunit_reportGenerated} -eq ${SHUNIT_FALSE} ] ; then
+ # Add 128 to signal and exit.
+ exit "`expr "${_shunit_signal_}" + 128`"
+ elif \[ ${__shunit_reportGenerated} -eq ${SHUNIT_FALSE} ] ; then
_shunit_assertFail 'Unknown failure encountered running a test'
_shunit_generateReport
exit ${SHUNIT_ERROR}
@@ -766,12 +813,51 @@ _shunit_cleanup()
unset _shunit_name_ _shunit_signal_
}
+# configureOutput based on user preferences, e.g. color.
+#
+# Args:
+# color: string: color mode (one of `always`, `auto`, or `none`).
+_shunit_configureColor() {
+ _shunit_color_=${SHUNIT_FALSE} # By default, no color.
+ case $1 in
+ 'always') _shunit_color_=${SHUNIT_TRUE} ;;
+ 'auto')
+ ( exec tput >/dev/null 2>&1 ) # Check for existence of tput command.
+ if [ $? -lt 127 ]; then
+ _shunit_tput_=`tput colors`
+ # shellcheck disable=SC2166,SC2181
+ [ $? -eq 0 -a "${_shunit_tput_}" -ge 16 ] && _shunit_color_=${SHUNIT_TRUE}
+ fi
+ ;;
+ 'none') ;;
+ *) _shunit_fatal "unrecognized SHUNIT_COLOR option '${SHUNIT_COLOR}'" ;;
+ esac
+
+ case ${_shunit_color_} in
+ ${SHUNIT_TRUE})
+ __shunit_ansi_none=${__SHUNIT_ANSI_NONE}
+ __shunit_ansi_red=${__SHUNIT_ANSI_RED}
+ __shunit_ansi_green=${__SHUNIT_ANSI_GREEN}
+ __shunit_ansi_yellow=${__SHUNIT_ANSI_YELLOW}
+ __shunit_ansi_cyan=${__SHUNIT_ANSI_CYAN}
+ ;;
+ ${SHUNIT_FALSE})
+ __shunit_ansi_none=''
+ __shunit_ansi_red=''
+ __shunit_ansi_green=''
+ __shunit_ansi_yellow=''
+ __shunit_ansi_cyan=''
+ ;;
+ esac
+
+ unset _shunit_color_ _shunit_tput_
+}
+
# The actual running of the tests happens here.
#
# Args:
# None
-_shunit_execSuite()
-{
+_shunit_execSuite() {
for _shunit_test_ in ${__shunit_suite}; do
__shunit_testSuccess=${SHUNIT_TRUE}
@@ -783,13 +869,13 @@ _shunit_execSuite()
# execute the test
echo "${_shunit_test_}"
- eval ${_shunit_test_}
+ eval "${_shunit_test_}"
# execute the per-test tear-down function
tearDown
# update stats
- if [ ${__shunit_testSuccess} -eq ${SHUNIT_TRUE} ]; then
+ if \[ ${__shunit_testSuccess} -eq ${SHUNIT_TRUE} ]; then
__shunit_testsPassed=`expr ${__shunit_testsPassed} + 1`
else
__shunit_testsFailed=`expr ${__shunit_testsFailed} + 1`
@@ -805,42 +891,43 @@ _shunit_execSuite()
# None
# Output:
# string: the report of successful and failed tests, as well as totals.
-_shunit_generateReport()
-{
+_shunit_generateReport() {
_shunit_ok_=${SHUNIT_TRUE}
- # if no exit code was provided one, determine an appropriate one
- [ ${__shunit_testsFailed} -gt 0 \
+ # If no exit code was provided one, determine an appropriate one.
+ \[ "${__shunit_testsFailed}" -gt 0 \
-o ${__shunit_testSuccess} -eq ${SHUNIT_FALSE} ] \
&& _shunit_ok_=${SHUNIT_FALSE}
echo
- if [ ${__shunit_testsTotal} -eq 1 ]; then
- echo "Ran ${__shunit_testsTotal} test."
+ _shunit_msg_="Ran ${__shunit_ansi_cyan}${__shunit_testsTotal}${__shunit_ansi_none}"
+ if \[ "${__shunit_testsTotal}" -eq 1 ]; then
+ ${__SHUNIT_CMD_ECHO_ESC} "${_shunit_msg_} test."
else
- echo "Ran ${__shunit_testsTotal} tests."
+ ${__SHUNIT_CMD_ECHO_ESC} "${_shunit_msg_} tests."
fi
_shunit_failures_=''
_shunit_skipped_=''
- [ ${__shunit_assertsFailed} -gt 0 ] \
+ \[ ${__shunit_assertsFailed} -gt 0 ] \
&& _shunit_failures_="failures=${__shunit_assertsFailed}"
- [ ${__shunit_assertsSkipped} -gt 0 ] \
+ \[ ${__shunit_assertsSkipped} -gt 0 ] \
&& _shunit_skipped_="skipped=${__shunit_assertsSkipped}"
- if [ ${_shunit_ok_} -eq ${SHUNIT_TRUE} ]; then
- _shunit_msg_='OK'
- [ -n "${_shunit_skipped_}" ] \
- && _shunit_msg_="${_shunit_msg_} (${_shunit_skipped_})"
+ if \[ ${_shunit_ok_} -eq ${SHUNIT_TRUE} ]; then
+ _shunit_msg_="${__shunit_ansi_green}OK${__shunit_ansi_none}"
+ \[ -n "${_shunit_skipped_}" ] \
+ && _shunit_msg_="${_shunit_msg_} (${__shunit_ansi_yellow}${_shunit_skipped_}${__shunit_ansi_none})"
else
- _shunit_msg_="FAILED (${_shunit_failures_}"
- [ -n "${_shunit_skipped_}" ] \
- && _shunit_msg_="${_shunit_msg_},${_shunit_skipped_}"
+ _shunit_msg_="${__shunit_ansi_red}FAILED${__shunit_ansi_none}"
+ _shunit_msg_="${_shunit_msg_} (${__shunit_ansi_red}${_shunit_failures_}${__shunit_ansi_none}"
+ \[ -n "${_shunit_skipped_}" ] \
+ && _shunit_msg_="${_shunit_msg_},${__shunit_ansi_yellow}${_shunit_skipped_}${__shunit_ansi_none}"
_shunit_msg_="${_shunit_msg_})"
fi
echo
- echo ${_shunit_msg_}
+ ${__SHUNIT_CMD_ECHO_ESC} "${_shunit_msg_}"
__shunit_reportGenerated=${SHUNIT_TRUE}
unset _shunit_failures_ _shunit_msg_ _shunit_ok_ _shunit_skipped_
@@ -854,7 +941,7 @@ _shunit_generateReport()
# boolean: whether the test should be skipped (TRUE/FALSE constant)
_shunit_shouldSkip()
{
- [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE}
+ \[ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE}
_shunit_assertSkip
}
@@ -862,8 +949,7 @@ _shunit_shouldSkip()
#
# Args:
# None
-_shunit_assertPass()
-{
+_shunit_assertPass() {
__shunit_assertsPassed=`expr ${__shunit_assertsPassed} + 1`
__shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
}
@@ -872,14 +958,14 @@ _shunit_assertPass()
#
# Args:
# message: string: failure message to provide user
-_shunit_assertFail()
-{
+_shunit_assertFail() {
_shunit_msg_=$1
__shunit_testSuccess=${SHUNIT_FALSE}
- __shunit_assertsFailed=`expr ${__shunit_assertsFailed} + 1`
- __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
- echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_shunit_msg_}"
+ __shunit_assertsFailed=`expr "${__shunit_assertsFailed}" + 1`
+ __shunit_assertsTotal=`expr "${__shunit_assertsTotal}" + 1`
+ ${__SHUNIT_CMD_ECHO_ESC} \
+ "${__shunit_ansi_red}ASSERT:${__shunit_ansi_none}${_shunit_msg_}"
unset _shunit_msg_
}
@@ -890,8 +976,8 @@ _shunit_assertFail()
# None
_shunit_assertSkip()
{
- __shunit_assertsSkipped=`expr ${__shunit_assertsSkipped} + 1`
- __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
+ __shunit_assertsSkipped=`expr "${__shunit_assertsSkipped}" + 1`
+ __shunit_assertsTotal=`expr "${__shunit_assertsTotal}" + 1`
}
# Prepare a script filename for sourcing.
@@ -919,7 +1005,7 @@ _shunit_prepForSourcing()
# string: with escaped character(s)
_shunit_escapeCharInStr()
{
- [ -n "$2" ] || return # no point in doing work on an empty string
+ \[ -n "$2" ] || return # No point in doing work on an empty string.
# Note: using shorter variable names to prevent conflicts with
# _shunit_escapeCharactersInString().
@@ -927,7 +1013,8 @@ _shunit_escapeCharInStr()
_shunit_s_=$2
- # escape the character
+ # Escape the character.
+ # shellcheck disable=SC1003,SC2086
echo ''${_shunit_s_}'' |sed 's/\'${_shunit_c_}'/\\\'${_shunit_c_}'/g'
unset _shunit_c_ _shunit_s_
@@ -941,7 +1028,7 @@ _shunit_escapeCharInStr()
# string: with escaped character(s)
_shunit_escapeCharactersInString()
{
- [ -n "$1" ] || return # no point in doing work on an empty string
+ \[ -n "$1" ] || return # No point in doing work on an empty string.
_shunit_str_=$1
@@ -961,13 +1048,13 @@ _shunit_escapeCharactersInString()
# script: string: name of script to extract functions from
# Returns:
# string: of function names
-_shunit_extractTestFunctions()
-{
+_shunit_extractTestFunctions() {
_shunit_script_=$1
- # extract the lines with test function names, strip of anything besides the
+ # Extract the lines with test function names, strip of anything besides the
# function name, and output everything on a single line.
_shunit_regex_='^[ ]*(function )*test[A-Za-z0-9_]* *\(\)'
+ # shellcheck disable=SC2196
egrep "${_shunit_regex_}" "${_shunit_script_}" \
|sed 's/^[^A-Za-z0-9_]*//;s/^function //;s/\([A-Za-z0-9_]*\).*/\1/g' \
|xargs
@@ -976,73 +1063,72 @@ _shunit_extractTestFunctions()
}
#------------------------------------------------------------------------------
-# main
+# Main.
#
-# determine the operating mode
-if [ $# -eq 0 ]; then
+# Determine the operating mode.
+if \[ $# -eq 0 ]; then
__shunit_script=${__SHUNIT_PARENT}
__shunit_mode=${__SHUNIT_MODE_SOURCED}
else
__shunit_script=$1
- [ -r "${__shunit_script}" ] || \
+ \[ -r "${__shunit_script}" ] || \
_shunit_fatal "unable to read from ${__shunit_script}"
__shunit_mode=${__SHUNIT_MODE_STANDALONE}
fi
-# create a temporary storage location
+# Create a temporary storage location.
__shunit_tmpDir=`_shunit_mktempDir`
-# provide a public temporary directory for unit test scripts
-# TODO(kward): document this
+# Provide a public temporary directory for unit test scripts.
+# TODO(kward): document this.
SHUNIT_TMPDIR="${__shunit_tmpDir}/tmp"
-mkdir "${SHUNIT_TMPDIR}"
+\mkdir "${SHUNIT_TMPDIR}"
-# setup traps to clean up after ourselves
+# Setup traps to clean up after ourselves.
trap '_shunit_cleanup EXIT' 0
trap '_shunit_cleanup INT' 2
trap '_shunit_cleanup TERM' 15
-# create phantom functions to work around issues with Cygwin
+# Create phantom functions to work around issues with Cygwin.
_shunit_mktempFunc
PATH="${__shunit_tmpDir}:${PATH}"
-# make sure phantom functions are executable. this will bite if /tmp (or the
-# current $TMPDIR) points to a path on a partition that was mounted with the
-# 'noexec' option. the noexec command was created with _shunit_mktempFunc().
+# Make sure phantom functions are executable. This will bite if `/tmp` (or the
+# current `$TMPDIR`) points to a path on a partition that was mounted with the
+# 'noexec' option. The noexec command was created with `_shunit_mktempFunc()`.
noexec 2>/dev/null || _shunit_fatal \
- 'please declare TMPDIR with path on partition with exec permission'
+ 'Please declare TMPDIR with path on partition with exec permission.'
-# we must manually source the tests in standalone mode
-if [ "${__shunit_mode}" = "${__SHUNIT_MODE_STANDALONE}" ]; then
+# We must manually source the tests in standalone mode.
+if \[ "${__shunit_mode}" = "${__SHUNIT_MODE_STANDALONE}" ]; then
+ # shellcheck disable=SC1090
. "`_shunit_prepForSourcing \"${__shunit_script}\"`"
fi
-# execute the oneTimeSetUp function (if it exists)
+# Configure default output coloring behavior.
+_shunit_configureColor "${SHUNIT_COLOR}"
+
+# Execute the oneTimeSetUp function (if it exists).
oneTimeSetUp
-# execute the suite function defined in the parent test script
-# deprecated as of 2.1.0
+# Execute the suite function defined in the parent test script.
+# DEPRECATED as of 2.1.0.
suite
-# if no suite function was defined, dynamically build a list of functions
-if [ -z "${__shunit_suite}" ]; then
+# If no suite function was defined, dynamically build a list of functions.
+if \[ -z "${__shunit_suite}" ]; then
shunit_funcs_=`_shunit_extractTestFunctions "${__shunit_script}"`
for shunit_func_ in ${shunit_funcs_}; do
- suite_addTest ${shunit_func_}
+ suite_addTest "${shunit_func_}"
done
fi
unset shunit_func_ shunit_funcs_
-# execute the tests
_shunit_execSuite
-
-# execute the oneTimeTearDown function (if it exists)
oneTimeTearDown
-
-# generate the report
_shunit_generateReport
-# that's it folks
-[ ${__shunit_testsFailed} -eq 0 ]
+# That's it folks.
+\[ "${__shunit_testsFailed}" -eq 0 ]
exit $?