From d422a12027c29c1762872fd51db64f4f085abccd Mon Sep 17 00:00:00 2001 From: chenxu Date: Thu, 6 Jul 2023 11:05:22 +0800 Subject: [PATCH 01/29] =?UTF-8?q?Add:LuaXML=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenxu --- thirdparty/LuaXML/HPKBUILD | 102 + thirdparty/LuaXML/LICENSE | 201 + thirdparty/LuaXML/OAT.xml | 84 + thirdparty/LuaXML/README.OpenSource | 11 + thirdparty/LuaXML/README_zh.md | 12 + thirdparty/LuaXML/SHA512SUM | 1 + thirdparty/LuaXML/docs/hap_integrate.md | 84 + thirdparty/LuaXML/docs/pic/run_screen_cut.jpg | Bin 0 -> 188019 bytes thirdparty/LuaXML/docs/pic/screen_cut.jpg | Bin 0 -> 23610 bytes thirdparty/LuaXML/luaunit.lua | 3452 +++++++++++++++++ 10 files changed, 3947 insertions(+) create mode 100644 thirdparty/LuaXML/HPKBUILD create mode 100644 thirdparty/LuaXML/LICENSE create mode 100644 thirdparty/LuaXML/OAT.xml create mode 100644 thirdparty/LuaXML/README.OpenSource create mode 100644 thirdparty/LuaXML/README_zh.md create mode 100644 thirdparty/LuaXML/SHA512SUM create mode 100644 thirdparty/LuaXML/docs/hap_integrate.md create mode 100644 thirdparty/LuaXML/docs/pic/run_screen_cut.jpg create mode 100644 thirdparty/LuaXML/docs/pic/screen_cut.jpg create mode 100644 thirdparty/LuaXML/luaunit.lua diff --git a/thirdparty/LuaXML/HPKBUILD b/thirdparty/LuaXML/HPKBUILD new file mode 100644 index 00000000..c7e456df --- /dev/null +++ b/thirdparty/LuaXML/HPKBUILD @@ -0,0 +1,102 @@ +# Contributor: Chen Xu +# Maintainer: Chen Xu +pkgname=LuaXML +pkgver=master +pkgrel=0 +pkgdesc="A module that maps between Lua and XML without much ado." +url="https://viremo.eludi.net/LuaXML/" +archs=("armeabi-v7a" "arm64-v8a") +license=("MIT license") +depends=("LuaJIT") +makedepends=("make") + +source="https://github.com/n1tehawk/$pkgname.git" +commitid=7cd4a7ab5db85222edb4c955d53e5674afd170b6 + +autounpack=false +downloadpackage=false +buildtools="make" + +builddir=$pkgname-${commitid} +cloneflag=true +cc= + +prepare() { + if [ $cloneflag == true ] + then + mkdir $builddir + git clone -b $pkgver $source $builddir + if [ $? != 0 ] + then + return -1 + fi + cd $builddir + git reset --hard $commitid + if [ $? != 0 ] + then + return -1 + fi + cd .. + cloneflag=false + fi + cp -rf $builddir $builddir-$ARCH-build + cd $builddir-$ARCH-build + if [ $ARCH == "armeabi-v7a" ] + then + cc=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang + fi + if [ $ARCH == "arm64-v8a" ] + then + cc=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang + fi + cd $OLDPWD +} +build() { + cp -rf luaunit.lua $builddir-$ARCH-build/ + cd $builddir-$ARCH-build + cp -f $LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib/libluajit-5.1.so $LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib/liblua.so + make INCDIR=-I$LYCIUM_ROOT/usr/LuaJIT/$ARCH/include/luajit-2.1 \ + LIBDIR=-L$LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib \ + CC=${cc} -j4 VERBOSE=1 > `pwd`/build.log 2>&1 + ret=$? + cd $OLDPWD + rm -rf $LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib/liblua.so + return $ret +} + +package() { + cd $builddir-$ARCH-build + mkdir -p $LYCIUM_ROOT/usr/$pkgname/$ARCH/include + mkdir -p $LYCIUM_ROOT/usr/$pkgname/$ARCH/lib + cp -f LuaXML_lib.h $LYCIUM_ROOT/usr/$pkgname/$ARCH/include/ + ret=$? + if [ $ret != 0 ] + then + return -1 + fi + cp -f LuaXML_lib.so $LYCIUM_ROOT/usr/$pkgname/$ARCH/lib/ + ret=$? + cd $OLDPWD + unset cc + return $ret +} + +check() { + echo "The test must be on an OpenHarmony device!" + # 使用动态库链接,由于lua的原因LD_LIBRARY_PATH无效,需要将libluajit-5.1.so.2.1.0拷贝到系统默认so查找路径 + # mount -o remount,rw / + # mkdir -p /usr/local/lib + # export ROOT_PATH=/data/local/tmp/lycium + # cp $ROOT_PATH/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 + # cd ${ROOT_PATH}/main/LuaXML/LuaXML-7cd4a7ab5db85222edb4c955d53e5674afd170b6-arm64-v8a-build + # export O_PATH=$PATH + # export PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/:$PATH + # make test LUA=luajit-2.1.0-beta3 + # mount -o remount,ro / + # export PATH=$O_PATH +} + +# 清理环境 +cleanbuild() { + rm -rf ${PWD}/$builddir $builddir-armeabi-v7a-build $builddir-arm64-v8a-build #${PWD}/$packagename +} diff --git a/thirdparty/LuaXML/LICENSE b/thirdparty/LuaXML/LICENSE new file mode 100644 index 00000000..81975837 --- /dev/null +++ b/thirdparty/LuaXML/LICENSE @@ -0,0 +1,201 @@ + 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. \ No newline at end of file diff --git a/thirdparty/LuaXML/OAT.xml b/thirdparty/LuaXML/OAT.xml new file mode 100644 index 00000000..3570f382 --- /dev/null +++ b/thirdparty/LuaXML/OAT.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/LuaXML/README.OpenSource b/thirdparty/LuaXML/README.OpenSource new file mode 100644 index 00000000..73dd516b --- /dev/null +++ b/thirdparty/LuaXML/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "LuaXML", + "License": "MIT license", + "License File": "LICENSE", + "Version Number": "master", + "Owner": "chenxu.unix@gmail.com", + "Upstream URL": "https://github.com/n1tehawk/LuaXML.git", + "Description": "A module that maps between Lua and XML without much ado." + } +] diff --git a/thirdparty/LuaXML/README_zh.md b/thirdparty/LuaXML/README_zh.md new file mode 100644 index 00000000..8b639c91 --- /dev/null +++ b/thirdparty/LuaXML/README_zh.md @@ -0,0 +1,12 @@ +# LuaXML三方库说明 +## 功能简介 +LuaXML作为一个开源项目,是在Lua和XML之间建立映射的模块。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:5.2.5 +- 当前适配的功能:读取解析xml +- [MIT license](https://github.com/n1tehawk/LuaXML) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/LuaXML/SHA512SUM b/thirdparty/LuaXML/SHA512SUM new file mode 100644 index 00000000..b87ba0f9 --- /dev/null +++ b/thirdparty/LuaXML/SHA512SUM @@ -0,0 +1 @@ +8e350464cff10e5b01e189d2fd39e6819d18d8e854e1c0914378eaa7ca06fcb9d0606b665d8005a499d3005854c6ecf503ed2009f99bc1aa731147e3172488cc LuaXML-master.zip diff --git a/thirdparty/LuaXML/docs/hap_integrate.md b/thirdparty/LuaXML/docs/hap_integrate.md new file mode 100644 index 00000000..6e49fbb8 --- /dev/null +++ b/thirdparty/LuaXML/docs/hap_integrate.md @@ -0,0 +1,84 @@ +# LuaXML集成到应用hap +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 开发环境 +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/LuaXML #三方库LuaXML的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── OAT.xml #OAT文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将LuaXML拷贝至tools/main目录下 + ``` + cd tpc_c_cplusplus + cp thirdparty/LuaXML tools/main -rf + ``` +- 在tools目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + + ``` + cd tools + ./build.sh LuaJIT LuaXML + ``` +- 三方库头文件及生成的库 + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + ``` + LuaXML/armeabi-v7a LuaXML/arm64-v8a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库头文件拷贝到该目录下, 如下图所示 + ![thirdparty_install_dir](pic/screen_cut.jpg) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ``` + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/LuaXML/${OHOS_ARCH}/lib/LuaXML_lib.so) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/LuaXML/${OHOS_ARCH}/include) + ``` + +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +- 进入到构建目录,执行如下命令(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) +注意:以下为64位命令,如需测试32位,请将arm64-v8a替换为armeabi-v7a。 +``` +mount -o remount,rw / +mkdir -p /usr/local/lib +export ROOT_PATH=/data/local/tmp/lycium +cp $ROOT_PATH/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 +cd ${ROOT_PATH}/main/LuaXML/LuaXML-7cd4a7ab5db85222edb4c955d53e5674afd170b6-arm64-v8a-build +export O_PATH=$PATH +export PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/:$PATH +make test LUA=luajit-2.1.0-beta3 +mount -o remount,ro / +export PATH=$O_PATH +``` + +测试用例运行结果如下: + + ![zbar_test](pic/run_screen_cut.jpg) + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/LuaXML/docs/pic/run_screen_cut.jpg b/thirdparty/LuaXML/docs/pic/run_screen_cut.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78909ccb124ca17e9717d2efa42f1c954314e552 GIT binary patch literal 188019 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%0DYgKRZzg0&>zx8m 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≧A{{C-H;Eh(-d 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

    4dIxq|4k^dycF!|@*H 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 z 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 Se^%f>EAWq20K{H?5B)FAOPf;w literal 0 HcmV?d00001 diff --git a/thirdparty/LuaXML/docs/pic/screen_cut.jpg b/thirdparty/LuaXML/docs/pic/screen_cut.jpg new file mode 100644 index 0000000000000000000000000000000000000000..936c106a6397077938481bf274810a0ee6b194f1 GIT binary patch literal 23610 zcmeFY2UL??w=Nn41w=%o_bwv6NeduK6#?m;D2S8@Nbf{ZdIt#t0@6E3??ieNkQ#a~ z(i2Ju5W-fK~8w3RS*9mVB68;`U#3aN-L^p{D32&0#yh(Bk zcM%fbCL_Id`}g0!Kjin@f4>X&xJ5)r^!tu~?YjC7ASc4Bz;nXKV+UL#$HOPbyXpk6 z004N`akKqB;s1HzUBf51egik9ni>kR5~LFPEkvjK;oO!G_-W|T=%%|^E?m}e<&d-CH+KENm)fz z?WwMwzJZ~Uv5D0y>(@56cJ{7r?jD|A-aa2b1_g(NhK0u`d`g5SeNIlv%FfBn%P%M_ zs;sK6sjaJTXl(E3?CS36?du;M8=shjPfgD(udJ@EZ*2bB+D0B89iO01(P!ts<-!Bt z{|~YLL$bffMUIo}8g35=2!G3kcg+(w@W~0TvkBk0tDsHz(wTx?sU1JIzv>mC+U8W8I$o^g~e#Z~19o z;G)1o|EA{E$W^+wZXZK6#3~Ab2>F0zww2ZxN?TE>A3fgjRWsrBdMes;H=F9-bLUv+ zSh-JrDwoYbwpFr_6jXvkzE_-pxQ6t~=soDdo$y1&-rUenUtUEnvE;f1>}4nV>J6v1 zlG`pK;{0?Fmmw%Y3}?ohakh{P-n|Sf?8w}bx15JcQd8b8@(Vl@J9q`C(m3s6372E6 zA9pJzYUVAn*UXzdFb*8`t>>`XI3sT^1a8+qu;6mk4t618jA;XfH-g$VAX*a}hyzq@ zc`lgRC#@7dyFeyz-#A6};dN`dmpn(YPj{CXQ+E9DFSKl1>BoUAMcWJHEfXgP1dieD zUhbJ-2R=Es1olC)*xjKhzR%Wi3TK|YFZMT}Gfr0ke9SR?cyqi)2bQ#R3hA&tcTVB{ z4xvD2bd(kwO_|nYmyFJK-OF?$o!@n~`QgQ%t{}GEWJDcCYt3l$U@90AD92fc;7sRu z2#v~9p!B3D@rkNV@)%KVvx1sh#||^TF&5f?uX)V6oFqFLck$9b#j{YKCW4X08BBt%b`BviQ1VSrgU8 z8q!AWllpF-IRjNW!JkXw=T*{pJ|1|+%_Ye{ym2#e;w%6ZgCRrTOW%oao%gG~0(`gv z0Fcu6vkHFP&k6_pcLwjYAMX`_y*up+U{L}2b*C^~-Z11bdQ3m6 zbXGO}dV=!EI>%iL#nQBkj(~k?21|#veZ1>l>j2Mulob+=VXN5L`Klq1C|=q$|iwyiaC>yt#khO3xdF*#6=$wt0rH7eqqLs@}2Kg{G3#|@nq4{P{ zuP71VANdwoWL@{VV~+49r@>m@ThZ|S?03cHhd(0{YIYMKaT}IZW^&YWV>FWO5;f~w zQ~_{*H=E5as*@xP1!%c01Or}Pq@Tx~IoWJ9tlPuE9x82-oo~9$%akpAlxON2k!t&S z?LpF!CpRsjx4|Bt1BM*2qcQHzARlbO&~TyEm4Q~#8R(SulelXa+vh-=!ZP2x-Ny1` z3fL2+b_Iz_U1&B(gK=gdTu=(07$Iw6H4hP#}W_f9D zcdt1*U-UMph7tss0j9*0k<2VaUT{h|)rm^No-KldZT8FLA*tC09C; z_lG?9d#SEnuBJ_wSV{1@lup1QLFy-!M`tOLF8e4Cr~FR%mgkzEsFKg(-q)1dLCC~r z;pG8Y=|xS1^(T7Hgqc}RjRLdIcV=3=_pi_On|lfaS<5+#BR?fhF6OHo%|TN}4leBu zZ{jpHHY@x-;J-S`tr6vz2zt*;pROyw*PF;96zJv^ptm9)0xtob0}A7`ff-oxo#C_9 zD?m&+dgKZ~bh3#-UIBXG7;t`8^J3ZfZghEZ=Z5?;bMqA-T^@aoTSyi}j0I$v1>+Ct zZuGf-zNgtMS56LFjJ)7p1m+WtL*NP*D-ixdQ-()qeDs^)-S) zpxbZUWHN55mztS09}f5nd?VktFkVYeejgR>%GSr{8hKhK{~bc|6`j1yFp^`g!5tyC za>}jlP7ABnzn+3W-v8OMH{kHFxsWit{0Uyh>RWNyTKcE_#TI>A`MxM%W%cF- zKGz6!>?am?&nS}wer`KZDz0mno+dIU&xxKH_D-zw@jp1sG@W-o^ay~$R^rZ?nDKvr zm+e*%TN+xXJe=@y@ua!wW%>WLPAwd$H|RpL-P4tb(f|$0F}K^TTQR+m2I490e03RjHd zK|B|QuedyKf3*2M9rmEe6gAF|zwXUCd{Ozs7i9lI_261cEarvNB-==-KWxt*?=DLZ zmuu3kB>OwsNbwox{e6zGURQwC9jq9nUDo>w0E8ee{eM;c z7@X#R`2Q#K4~)Y9t1AQlhBj2K$8D~a=H()$u?zF$;=@9{$;qG0T9Hx1z+05CN}{$B zRlD1DO6^BXn(vXy5MuPTD}eIoo@Hgz#9S^muSDYqYKpd27egLT{Kf@?|GjO!$YyMx zy&`(+YqCS0N3>MoaA=7!P6s%uqH-!tk@# zsU>Lj=ZGsngn*k&6NFc_Fw&X~EKj$OsjzZh0)oexX_KYZ_X2<8V#+!9XG>;~j5;@Z9HV6F=uCBmY~#aN;k( zu&BlG55SODm4c(cpa_JBoxTDLJ7Jt*?J;Q8H&=koI;`a4vPxwkro;@nZ=O{MX@6pK z1(1ayyRQH@<(JuTC?&r;nESW`6g-Ueg{($lsWj7+OZz)> znKx_v@UH-Ia+_Ef!xi9Bbd%3nQO63&*7MJM?lMib1CG2Dz3(#2Zez&$ak?E;h_k2) zE$Y}SzyOHkGs1(LA}r0TzhCo0^n@>?lTU!;x)#X;hx%fRUneosqjMGkle`p)M`5of z?sUf!%{+2&RQ}m{C+E12fb8kEgB+1v%Jj(BNg!qG9i&`7xJ1S2D<9mB9~u3l<;x1s zx?N&a_nLNE<)>w@H<)>eaQ?E_cAWKgoN*DNLY7A9IbYoK{zObabQvZ zGJt!-D;!y9p`S2PyX%j)BL5D>d>ie`my#aloWC=GeEmi;i9xVJ5Xj45Ys~6YVoYYGd2Fvp3Fz_#mbw#@v`Z!&(xrnBk!q& zgr?7)VDB=>pY2@%q9xGUe_V3jJOTTsW~mRcXWVDJ5Cf^){^dT%4s4P9) zmm%e_V_!If9_$Z$&GH95X<&PtW0`G}AJ@Fyt>eF!H~ZEXG>*%*eH;!6W>CtEQB{Me0bG9jMk9{Ns7~;|fgcVGS7n*4g?0 z;=k{G#)k zitwt|ZSIdiUEe&Ff+_m}Ywk~uyXNT&meQXr@m}0kcK#3<8A+ef!9sp=aD9uuCODxO zWQX$Ey*B$inD}Y#_=`<2*$;oZ5M|bt=Y(VO6&bsy%VZJqBu*!!5VZ^UUFjTX-~GlE z{)*6-FNC5A4Xxs3Cd+<@fAiIi6ONn}NV8fG$MwuWbD1Hpq>Eh4#Qe$kG8L5WWie0| zA-cT2kx*>BBSAw$A2DBS@`U26ayTad8mH+JQkO5j1w$YOuS0$ccFChj39kUmWub>I z+b#n$JaW355PU!33azLGR>T4>kfvbpryn!bhorEGn5xU!Mq(7+MN7`a&y zvBYU1j8KVShPT(YGEa*6%3d=Hm?&qh3lm`Vgl?#<$Gwcyx~RRmxh7B`q)A3d)79%% z9>vUol&$$vM}0nws&;-<_t087op9hf*^f&p|vbD^~H>EkYhe<@=eJeUh=KjkM&UfU@c)h_o=-Gg_p6SW}*V!9MQKW zrOLrL-@4}v&hr}GM{Rb@d`#h<-raR@Q}=&qFl1_~C){;?*HuBxGvY)1Qw~C|*nB)c zo99gz{+O}Qtaln5YU_&i(ZDZz+CzX}QiYRP5d7r4r6(5`J{Ds+#k7^Q*_0@sU%hf)Md3?0kAj8olvmoMxbdNaFCv0Zm-5rf+8|u$`|gw3YymHkYgIfNRe&^l^qZK z0@~%-O6U?fIqbPd7-JTNv!UJtX87x5i(S_%*Hi6dm8afTsW+(~*aZ|!iZ;R$ATCbF za>`jP+cJXq(_WC38?_67F-HzWZB71`wEvfsT!c!rO3Pg}8NRl3Wut_B+Hnz{n>W@2 zMg@Z*WI#crm0r*>uRq5#wEt?0pr-Fuc^*{#!Z>9OHuEg(H>&u(;f;Y)R72z}}S{p<0c9c9~^um=<0=QV=!X@aX2G)}GVt4=YYAUh29? z!AOF>0xz9O<)n@oV4b2Q_iOeB@bhoqUe5;eWeMFBP|}hMJB4KXVqi;TNd`@VFumF{ z+_{o-FCD(?CxYbu;ATpyZiqlN3L1D3lwHwbG#l zHkZ0!QISGV-b`|L>`_+z$P~|hdu?9mwyABk6R;>gb-YZt%clp&(S)dUpE9$JE^1D? zv7ps3Ho2-v=lfr?2D)!4BI!y#Klb~?t|j!j_2;$z53JV>8azxF7SBXL35|y}<>h>3 z2g8T3&Ac>SI2dE6PMt~L3o=YI2?G(=tL5y(0wuC3ju(pnx#(?DhJJU+l*m<+L zXE>H5__anq<(b-Io1OAgQ_`+txhnvoO^H(fE~T~-;O`EqzZ^vi@xL5akq6vSxR6XS z2p5t4j>>)ydS)i1Md8xLWW%UC@1?-<&(6^qGvMuBRW5ZNLOQ_el)*4YP>}u#@N;=3 z14BQ21?YnFE74e1iUE~YT6DWb>Wm-+dfxsVSn?(@=8GyR9|d zfqGkOF52E0oxNxhNO`k4r3ks;$#_gC3p~?_50^8| zYDq#3jfj25xaTjTZPdbtI}VLF**AtYA5MBwgmLj#1U^vp_;mIuR#|GLNCR=CQH55@ z-;VXNy3p}0CvMI3_P)&d33)wuS;b#8@BL~;E6yrn0G~w;^NK>#ZJp5O(suFJ1APvC zi`%$mMqwK9iLeriV%jaOHi zzWIEaqfB{l=(*c77#?&5cnzXgSRj)Dib{i>CBA?*DKHrr-EHtO$uyHo3Ov723 zNm6qZSo*%YY*7m>zlPnMy6fZ!L&y*M|5_?2OZpBYu7QQt8rGS(*o{nY?Z(ZS+tcTk zr8-7mgmb4lbK05*O5G&3q>2_IwM84EJdmDIKzXOat#kL{*~RKYE5@0`(w3pT5yZ+Q zF{iQP+W^p9_WFBmC~bc2iew6JGa7G+pQI;UaGc*y$ra`6EBg@qnN4~kFB+b7Q;(B< zDC#>6H4u83V+8x{^fZ64PW@%Cz@UXZnx5cGpNNI-1e^Z?48DbceId~ zmaL$))^XX*E*7L47R$IJM+b(Hh`U$7kEg45k|};XS~q_M(zoW)TJp-b0f%p+guwea zb9Du{3#2Q=07k^raeRlZfuQp;n$JI`})k>#V49*&9I$P|FK`r5Mxgr z<~4G>(evHOfU&#AlTO~1784`B{d>G9b+8Owts>&%HIaP)LHD(wVHR;06pRHsi0Hyd zT_&VqnXun4RAw3>o#Wfgj`QhQi@7U6O~!J$WL905<)($U>z0$;sppXcEF)g>aJM!6 zwn&sf<;IAy+q&AD20hE>y?_!FhzUC`{Sa2O0adg{HI5_0_cEMTV7H&-PT88El5K9oz-0=!WEnBdx!fmKW5eEx zXa+CnguD+CFZ9;C_>E@zYK+vhPmAJ!eB~$b=KU3pQiI+7{N*2at1rOdJ(qo6b(#0Kgaxu+L$k!SnQ8io zo8IBSdRM^v11PoRuiMq=SnioWbD6cMP<`QkaTc1cC}*kCbW6c0U6Ix--RA{;Uv7Wt z0PaM=PEJYH7Ly^GlbGbKbn442*fP!te|&=F#Cl@b8}H@gfN{^lVvT>*9;Epq#BsRB zf5G$3wrG#_DlD3r9-+5DKQ5NWQ=>&~f)*Hl7NM>2(xSU>VXQB~zp~S4DEv_1R-3|% ziD)3h0FVvA-NSOn&AH&094XSGF2Cw?*JMV{oLRe(yZNt=uRQ6>EH`G$UL#uxM&6sV|?5uk*BvDZ^m*c~sSI+S=9 zv=}ABr64o+IAQj4jvciW&d5#-kiTkAh^s#nr_wSE$k{FNuv-NYZ=ZUIg5_u?Y~mbp z=_4oUmugeB8@*=~oRe9TIq--chkurwkF`(gf`ySH)w}r%N+V6IbEtnB8BO=FCGFP! zRIGR$G@JAyR6@9WHQ}8k;~>>TQ^B3{t!dk8-sJh#<-hBP|7HKn^#43EUbFp5=8Mb1 zdqDcY6Y{&ng4me4@+$BVOGhj31dzoCF0Gjh$(@s?O)*suc|T1|P-xA%%F5__6UT-H zt*?U48G*XEG_CO!0Npr4rKcb5^T{mNbpp1ONqq$Xqj$2q8Yq5@eAO75)pvE4?2`>? z@w5=X{Dcu*o)_$hUGOqFc-H!%JLUBUccEa^0^F!3WAKPx%H~VWce&@6nCGSf#z&DQsuj zSKcBHfv@?Fdsq-w;^L!DQio=|yg8L+2e8(t+l7?4`ce#Ij1OnLhw%qsWCiz}aKS4b zO49yIiO>K7jO=)`(+U${ii~6{odQ{wnx$SGac14vP~9NGt}C1vc~h^m$=vEu_Q64$ z)!`-8C#q6^2dA_Kh@9aS;Jr7vMvdp;N-3lRa)co(Y&O1-^|I1OM=cMsXd&d9mgf!B z4y@xl48|Off4QsMvWfs=FKZ9CJ?H9g;M4aL>%V$o?n4wnx+QlDiOs+9eraB>uN)(h zeh#{Arr>NN2IqKg^wC1CzCKODTkUh_9$Vkd-XGU6u1W%i0|Nn9fJl=|-7`WFosBxD zw)}I`4S&+rgTPjnF$_gHXdeAqp2RCGb}7=YYKW?iLC~$VNc<@vu+@?3Wf~_-_Zvh9*fqa!28Ipbo$GkCh^_b z?BF%1r6GUZ-p<#ruPE}EKL0l3Rc=MR20Ql{wW)F!pSwA2F}PH-vN zl6U_~I`(g*VC}>27jgcTbN&~>D}2BmSFv#g2xGoAjs@7JaN+3jYF?Up1cqATfw(G1 z`dm$A_AODrvIbcd0vBErHHpHg*P}nr;QyzPt_h5;*K)%V1pvp3k;?g0hbvCf1 zI{7^tG&rB(X`+;pu4hXs>~-!etnt_f)Y#DT$r5bv!7DV^&Qy8EPTaFdOXWw6$qcHh zqTxb4;74Oj#{mO6??`2I?*(EgPDChBR)=oCWXV4~Ud_=O{3$9q>Gm(mgJ+B)o1a=P zzxY{MJLLC@)eBq!s>`#+IHCuh*EXdv6yos^jC64T?|zZ!yZ_|yTTj39B>DiAIZ|_} z+a=u^w{#ID0YXNqfeVJcOZ;mm_&d7y;~uj{7OPsuxB{aAi#3LMY(cDA#&@ZzU}*|%2&N#dKz+dMu2_Si=EgE3e> zZ1v0zjb+jTMxgwW{KKIeqsusd?6U$k)vBEvCJQ~@;wxoe;P_FeE)^)+TomMaOI?sf zXecigp>Be-39j~MQAOk!rtB>g7b-9p+Ld&@O^K}yZxt4HW3VUxXUkIBCyYYGG#eY6KvPq?K|-PHG880fP-&x-&|$rhj&2|sxoj< zH_#MBJZ*=XgwL$c89+U+(OQ}-5ArM8X8{F2QFsDw^x-|%E*I>(+}b+50(2zqA9)9S zDL=tBe%a5z;PqNn8_R7KQ^X zYM2AGlADH>3a-YX1!jL?Gjj#-KD|AkVSmxQKRs>}JmJnOV&ed_F!p zi#F6X7uZ-BbgV9L-<`I1>7X+vofB;nbM4}QIx}|(Cmc$C7fa#ZW5~|(a=b7=e5wmz zMZ9#{1xN53?s_~8^sEo!t`k-r<#TDmk#bP>z94Q6=ls?T_{o?h^~}K~#2hj}vPAf< zT9DZb_Php3H9WnydpuqC;^U4%ij0LB&-2)bh_9B<_Bq!mf+VTJkcRE~ZSr@-`2{a{ zpN}XN2bs#uP940Cq#|IE6N{G8uWB%-l&LMdQRd^l zfp3ZopI4pxzB3X}Zeg11e6S#ap{>QHB9LH**6`*$;~A>s}MSfEBk31QUf+jJBwA*CQ^%S8k zfF@B7#DjopcP^l(oK^$wmc(fauOo$|-j-VUu4+-jqWpAyi`491zJOOcQBOYHx!#Qb zRZ(dP0AS89ckOe7E_$gT5t0>Iay?n?aKKSE(o^Vi@b=W#XJ5(`_>64Jbjm8*i z%!8k;G{zW3*km*J^6bv#onIRrS~ZR1d%L@>*#M^#!+iaqvcPp-_ zr1XvZlZC0Xjc}BF6o~W%!loliz=5Id`M_7Rtw}?UZdVPrL5S-ELMZKU3jcc*L7I4W zJN=iIJ#3%7)|pIpcbO;-3UHg%`FE+Ne{|o!41XCcn9wmREQHhIwF%{5Y4fIr#H{KT zD1i;@wJ!a4LjXDy6$DF@6b1S97O90L#gXbOTR>h!hBguwDDH3dG=2tUek)8+?AO#~ z1%L0xx-PBPCq$PTZ>%a{BVk3Q9mlu?J$d%QAZ3!@0K2%SYgg1cw^cOP%}v`bQ#eP# z^^W7M*?Y}h0~Hy6f4M?m+=h(KnVHF`^Hnx@CQhvjMq@IXu6=q2>rzJ`8|h? z)m*UDO?Tw>xx}4~DuoezE09vw9Z8K`O+kS|SrA(MB%Sn)!(Z*kynJR~GfyvpyZE_sp>?_V-3)-6KcHU?~No_S|0LR0r%|)F%jBtny~?RAYCTZGbg= z*@S8Gs_0xs2e8?W{YXlY4a%72z7U@sE}c?h`WW)bG{i2jZ38kOFI14g@p?BLnzDF~ zEiYm+u1A6_ zBAc4>fzt38Tn%tnmX{8{+=}c?a}yNG|20=McHW7Z!UOACWLor)mNJJHbDG#$@xZcYamHx<$w=OqsG@mBP`=8jhb zrUZrqju)r3R^^fqqAN@rrNs&mXD8=;*{sqmj(QI$H$kv9Z96mei{Vd}za+BCBMXY7 zloR8=6e?@(9v{qPuWBYCJ66P_D{^KRXJ=>akTW9lSsY2m)-I0>UPekD>~u-2(Cp!I zhs2v0?nNZ`g&>BTe!i>%R|MvZ?OOBCK83t>n%}%UNMi6|L~hP7N4TzNI1X!8#tb#X z()ho|yakDvFpS+=1CF()#g^j-Hy2+^ejP!&Hb2GWM4E+z_sE7=E)V z=Bn1}xVVwANp(tHO4T1@ipbd8a#)UG0eM9Mc?)M27r=)*T9?V?{4uju{-3Lxo!^X_ zJq|J|3Q-)0e-6LSy~noUB~_iV>)1+_&>`o9bLX%^h68y98UMj#oHBbN;7KD!hstv; z4>9zZQ~?p^SvV55;U-Ux@y1zheC;ut3&Cmms^el=QK!@m?+lwD%f&CZ9B03{My_&~ zx{hlbZU}^VjP3u#X$!$WGBy9%YyYw-`ptwhk#(>z%%VxUcs+e{jKGa!`4XhK)U z-{jX%0yTheQ!$yKqk_IQ}SHJbA4oPdfR-*(zOTH$i60PCIy8)~ge%i=|+!dzBGPX|cYRy|Z^Tw9C z@8q6$esP{l(F(JWZ^nU?;;}9M5YmTp z(_*DNSd#$e#{HKgN>rJ6e}~BZ>plN9VpoY0PcGFyX(sZ{fHPH&t7^efFKrHMEXlX$ zruc>5xufyQ6%tTpNT!&u8g+H}w~Eo~2!#TzGIbtlt63qrXBGWl&jNLX!oOBAMqVq8 zktl6C2t7yTE=9@8qz(u>m2E0*(zFID#sYGzAx*q9 zznP6{Ei6u*oJX>c?z{Zcvm;#p10O~ZaoQ!v+&U)Uw2Zt{3*~V*Fqkgot`ni1ejn8t zcG1yrWAv?1d-hIfEH&h7W-4x)y&(1{nkAT%#3IvHmaiA}*46wKTa&+10m;aSG7 z?g|Ud{%AKypB>b9D8FwOtpGGk(Liu_o?@A*;ic8?G3t|LCZqyv{v>7=u=JOQFFwN3 zM2nYI6*;e!Ji0}^dt5$qdLg>9(6EB5ps&M)mgtn8PLTCQ05GEpSiW{}cs9SW>T%=Y zrWh$^-Q=t}!zQYXB9kLkL0oQutaqDVtLC-B+=gmDf_wDgeQretoU5 zth|g(LBrAz>;BQL^M;x;l|z_rtkZN-cTCx@bNAY0yTZ90tk2e_#)O05a-$c8Uq#8c ze&ktrJr~K1v!s~MHec&5qngzVysnMuSG6G4QMum5YPmgmGdt&R2HA|_+Emoznffe& zxz~g7ezn*6DO`Y~3~+(&?G(8dcbZ_3p6yWi3ZAcM>0ae`4g*uK(fcd2iHeWvB?0bb z^2?CUWUUWw2RDspbIa=NR<6UvqD;(RGs(^Lzl|&QUU1pt4Slb>(Gv)Xc(1{uW@?j< z{ZxJhh+o7q>Z}_C)Lo>(7#QVpmzkcZBKFgY=GxYcwg(@WNX2<-tluf~uz3rp6?sGu z3`onTtJ#vTvFYTOz_BefW!)cZk!W8P&^NojH}xM2JmQThTBo_=Z3vD+=*l1F5=$vB zb0$>&CcOSu55iv%(Ld@n_=iN-{~*3vOxpsa(EjCUlL0J+Ec1q}VLNhV+)lfMXGJw+ zuC9TD*|hl1vuzTwm+uFH>;Z=l+;jWYpchD+$n$ghRlXP_98 zt^kUr6Js%=RqQ!mtla#(OKs}{7$+S0oJ!ZLn`>MdfA%+7JY)(jsyUAXk!-P$5q6Qy zQgqU5*VeV@7H@m>adgnfW}L5`AMw3x0P%0cx6> zpVVnkpEPJ$)jM$i5gSDAx+;##iS!$Yxn7bfF7CdL&bb2UY!cGgT!Ni`!?&M*i>v+b zsctxc7u*3O$2?iOxK}&szGtIe=P6QckW~3Sat&Zq^o{O2zFd0+xByY!?yu5~C7L*i zdY}%Tb`#-j9?P~ub=GmDCO&()qT4~mS*E~>p8^1(Ei7=k5z|eYPz2bJImJ?2U*olWJB^pC1r9Uj4 zBRLw=+C+@5NnG!xnhofdza=Ig!9po`ycf{3hkCo^VwMx&7H6rz_u#hnr{mYFk{c<_ zX<-gZW`_@WcLo2GkP;+|9g)Y?3@G3?}pM!1Fd;_JhQ`|*mib*_+M;HK=k zv))!81$`VebP250md;a;kcc=gwI5-N-%)K2M^S#JU;sKYJpm|iu-Xv#gL82-Y%|E} zMk?D_={@>fjI5ow*}y36gR#l5H5>1X0HfQJ77v z!B2_@&I0-1RV^JK3GUli_R#fpYnAGkKdZis_xqjZy_b-;uoX9@QMirxRTkxWt7^*Z zsj21gH7O`#QB&E8`F4X@q(MxV*7W@Gpr^u^pJ=B2D8zn#@Ff+d@iID}6ce{Q|Eczw zapi}WRjA=B13F2a9?8R;Y!)RnB!y?bc75jzm%qH!V$W)!K*gi=voIV;ix}&#+lKTl ziP$i3z^O~(EU>&@MiD?8n%Iw@P#yVYk`rdw<-Pp59r zYfYjs&w)BmDz*G_^_o)$FHhqk*H=dxYmHiB3y?8ws+Q&YdRZ-btjdO1cI^z5M1l$hHX}O=D(Nv{KMxzv2BJ? ze_`XEg@>)`{j-umlK@g=dNJa(b26nn!rwV>+e2_e!5QDdYgnt3JXT>TP+_I&{#W9E z8fqUq{hc^FS#KsF!?}3z2^dTOmyo#45l$Q1)Zg>2C_7&3YhGH~&lC;g3@e<^?`+0} z(vM)2xK=AM7K~3b87dP!pNp|Wr{;rw^mA8Cji;2}AVJ+ludJblK#scpC-29ZYu0yj zO$lB^6Ui1$hGfm56HKedO0tj21vk}gIp%17#7#Yjj0f~_#5)`Ay?R}!#Jsl>GwU;J zST$B!(kxYMGHr+Dsz6dc6x}K2PYkU+k{{t`RkvNO3u_)~iy43lXn22t(E=BVykJkU zLp>NSpO&)X4V>N~ch*urtgku^W>mZPb`OOBMOSEcFILHdd`v8M8aXEo;^m?DjI)!e zVjgurbZFT7^16OzP{1$%h8?~FaIiEDrt)lA*J0$(s;2TU%LVzHZC27ewMJHJT99O6 ze11wq@oW9is5fI7T<`QnZXA76z5fUlzz&(o#@>mdwS$oziz6mJ;+E6UuBgwctfoVY zHZ1!Z*j*`9`Q|(A&mj&&(_P*@p+K@CFH_}_6OtVe`xvMe+(ZoQbduwWTj77F21=uS z`3`79+g6g2uI~s+nzy#u>TlgYC22Z>fF|<`(HE#%q*l1QKd$jnwZVzV;@1q&=gFL{ zI(0Hve;~by*AguNiiWjK#hX49Ow+N*^GuNMiuG`S) z9bc?O(=invEh)E1R7YYa5^~c zWL@4lOFL`40;F95es@Gy{yTm3o5K3PjXyOw^L7{ir2{%oNfBA}pEazOg7By9Q<5U9 zi~Y&hV~kSvIV-(34$bfJJ-oB_F5g3{x64}l5p&vwp4W#baE!bCj2|@VeC=VD{GDwm z$@-Li-S@P^_Rko)ZffQ0fd#-L(4WW+XyKcGLTzN?%Rk>~lV8e$94d*yE=Y0ZmRSP4 z>#)Ci+ahN6-@GubF@J3-ju*~tluWd2YJs{L0^YS5hYk_bor*UX<(0T9f6zRYO>KwV z0&?Y|Z^O-65xdgWaei`1Ag_DP_0hZ$6O$T6O=m8=4u{`zDGN9xAN0H(1qGf{%}KYG zE|=p$+Ko%p^KId^3)Jcn)5{g%`?G`f4SK;!jfr<3g^KbJZ(0vngEwY)(@kn|UdjWb zb8O=6uA+piA58kSSPUQjwShLsplGExGE&I8gmoIo-K?)4slJp}<8~H7M=!s+^Pq_? zuzmCt@`-vaYQo9z@=FO&ya*jF%kbUBtEbaMJo+P9$gQOK%P(eAC3S{xpock!3h0 zm#PsPiB@uD4qyG{1Vums3qK5ngg&h9LT|>tLPFZUPB^Sv zD0HyD!FGNxSEC=)pqNqa04u)k6aJK__oD3wgzxLkQPDvz?jB zyRGci?dGmVG+jQPcH0wwHA+u=f`6~hir#MY*(;;fw3!zbswUj#(NAv7z40FJl`kwvL}}W3|l-H5!_{shd;}>P`2Y=Ngp$+Y^sS?h5JSDA)k&s z*1o-QMCVavv~&$z5rXP!9>w^tIFZ|(iy53Yo`#k9som^zd!=qrYd0J}r7yrT)V=gP zs@cV>rYK-atq8rS4r{7F1~lawF(i{Fg*F?^bjA+wy%vj~&#gPmvUP2s%Z#gYx9a9{ zH3prJ$PewTpQf14o-bnYRF=zk2MXrE%=boXN(ClY&|W&`Rw_^?9Xbcvh|p{r5?9K+ z8&N7Lbjke!lk-vev=BtTI0$b`j*EUVnE%8)h0!Of^s=_*78E7iGXA`D&WWVjlf&CK zoR^V?b1Ab2w8An=Kit*IMq%H016DL8AM^@Qy>Zc*x2j#Q(j>uR3(l)+i?y-6A<~Q= z>6bXX1F24|ZY3QDO5~seG-MPK9-C9QOVzMco6RQpQ|(p_2tor5yg4{-#uWwD)9KbH zi9&b-L@^En=iUMX?%LB2qB2%^RWrv*sl{Ux$ZL{B z0R5T3pX!a7H(iaefXn=oJ&K;460f37J>*0QRK%|Cp-EXTU#ox9ogLb^(?tD5s|0|% zmQP>Os{ZzUN{qRS{os=ZtAilR`A}`HOD$Y zWviy5$FSB9cv;5Z%Hk)0{a*W1TrxjFrFGOX3R+nUr4OrDi#3~@Ep4#dh*Zr~|Di|p zUEge@Sra;1Ig4dE{&pI*aC!w0M6>-fyZhg_xxY*QHS)Jk>06E;)_&7)b$z=cnHfgX zT;g@JNQ(3PW^j!knRSu9g~({>u?key5?mkOx0>4L_W9e?llW_CQ=1%=c+h_RZ^}eV zA7)BzefWpN#G7QL`{kt%v2L}2vTc5SOo0V`theH&xT$_YYE(kSWFb8UrTKk!kg_NC z9LU>+FIvrmi~Wcf`FLX5zPx<(!sx+=VR3{6Rvq-=3a~3-eFexK{YYjx+$lJH+RbwF zxVi=IrdCqQ3E_KIr6R)1{66x{tm~}gpfipMvLLD+Kdr!Men`|aE&iFHc&O|}k zm}BXzvIKLOD(tc$z$8O%hnX7oQ*2P+aG&hKqDdXNiF=`RQ?as-_{}xd%Qa1*DR}{( zJDUFfjEgtNRy;e@Nr=Qib?ES(HbWZvhZ*^5ocs4c zE@1cF+n2Gy!o8C6Zp$I8j9iq4)9Hkl(Lj>bm=E+!V|G=>+l}dQ4sTB@%zqeLd+A5) z+VGr)Np{N$>(ffTQQXLGK&DY0heSh`G9ZW`G`G>D{4)QA7D^)$p00(m7?v1_%5Xf8 zT$Sv8>ztmr0lEdVaZp*w=-~J5G>{ICA+d#f)H=_Y+Z#ZKUB(>yepInNd+D*R>SDyx z|B#Rv2M5bO=tfL1dnN(=DjJv&XXXV4byM-@|ij+I| zdM~o2tgp``?e4A2i|UT@2ejFE&Fnmdx*FL-lO~5O@$yK4BF)-o_D|$c<`G8^X;LEc z>rUW@<4vNW{}j)cO$7|L3OJaVkZAB_R!Lj|oapDn#{Ay1hQen34yv5lh+{-$Ld{;i zH*+k{?aQ*SqjnW<8US-B?m0O#bw1NuN{koj-TBq8D*JzRa_#X>sHn+&Ikr{?}{qz2D z-gD{m{`)+?|DNabd7kg}(y?bxGJ6qCOB~#$l;SA?BV4*I#CN^MIoOQY%WG;6BnCz~ ze>~mSjFlT@;a^qn+AZE`7Glv;Qwmah)Bc?zPip$xv;GSt^;fgCi--9x)g1H3-x8&q zK_;)m5tdgF6|@TDJGE-N(r;)_O?qYdMZ2hRk|PvO3jMH_MgkTsEGkz#gO$nvMcP-4 z#H-J%E&DmBIBX3z{-f^R); zE8zwagwDcfoBM4vG*=`bKlu=eBYEh~RQnR9g{q3jUVp2=xzkU?PR{P1iRDoXdNwS= zFVojouSB^@Th^gn>ta?ewibP*D%>yYe8kXp)VzMEN`0@ZP5-4`Y(>dU>^w=9J_Fs7 z=?y!rZaUyopEIvI)LEM_nSO0E#|&7+jJxdcGs)TFZK=NAwot7R#)X}OWoBsj3=+Cb zY@glu&DFV~tFE~!Bq!O-NpdFYOj|zHNUNCV#mXH4g>iGa8{YNA4ePoVZiW)zxb?dr zv&Q#QQU_R11fX+O)w0g0qQ$K`bf?`Up(WbOAMhNi|Lfi7cb)%mb{|+76j)Vp z)hDrU!y~s2N6F{oYvPaE8hfQ#beM<5e6rGJ{^oH>U^m%a$jN<7REj0359(OEjj>)7 zrUSsPCes=@_VFQRQ^#!w_oT3Q!Yxu=_iE-Pb>aMeqimxB$&0a5|yS5yd z>03_%R0zN6y*nnC2ZGXdKC%ccZ)5Gr@qK3x$Y!VM_Na%Cq)Gup37Z2;H<0Uz z%X}<-ODkOUgWLIPc28Wr5~O4_9AMRZXJTNHb)+mOx{szhlI(9EU72J%jn9;~9IH+~ zw4bqTMLn14?VD`Iz#mEB4M0*P#Y>_+oiWF0kYU{53jV6k5eL0Ob!p)6&vnx35vzonpPA;dQObZHkSuc${OJ zapc9b<`DqApKi>qY$&>2T$+DT+z{3OOU%~=-^2}@X_a`1D8J{7aJf(!Gtf^sgj;G9kp=G(9=-v%rjDzFNSwEidGqV)RH0-dtIu^F~X&2k%Q^ zfT*LyX0o4e4%pxKK#ZgRmFft0zfASE3gI+AT1twbM-aiL%qpa=#%&!5kKJ&A*!maE zfP&Buphmj4D@^;^oL9sYWllyMak24@X0?gS#;n=IJ3yDWg<`1es&8v(fAU<_nm{@Q z)8RkE)IRdP*gz&J?48p|_KCS5HZ~+HXPkSmL^W`UzvL^VHWv}9Hb<7~yuWV-o z{DjkO(mrI*OGqR^JK#mhSbKqg8gwpW0*sDmO$j;E0;e8sRi!K=<$}{^@-PrB;}#4L z%<-Cb`8+hgE-2bzJPgM1fYvhn+h^BYQ!MdF~t6)>h$)Z0>8!C>^38mw~UVPV03uzs>5UC7utGmO>@! zt2`Ck7IHdE*0VDKRn{&eCcD2!Tllc(>{qWx#vWD8BHnkdU)b6+GveMz!N~?F?s`P| zV0h;`MKu~zO-fK~39{EK;$%MQD2)i;1NUH>VxHVta<2*%)M>o8gxsinqWDyjVL6|p zn{@)SUpj44-nDA?WKg0QG~`?|3>xoJi=nM=kvrNC_K#6lHiMxZKdQyP`kT%;obP6? zz_1fFZW~QhAC+z-9phMUek|>!=^|x-l5ZG&v7Y1*!0+=!&9u9t^S7^b1#XAGqpy7VnX_|3}% z9?xwG43M`QPgCA!XvjoGw}~lN$W3hviEc?q$0K&bydwMqeb3t+m<TjytB#o@y_7n; z<4Z+1Jg^t8jJO3;=ZMC@Tc@{$g2tTa4>4V>D6Xdg4IkW9*E5GoXpjo853DKWlfM-p zngnGT@_y`GEI+~e95;ZIQ(W@(fHJU(P&=SS111CJt%lmVpyWs~quKpENj`9=s@!aY zHR=T*Ou28Kw2%001kzg4%Bayb*HS5I4=4S+p}2%D7mJ;wAs>8LfCSOFb0i6@nFq%= zQ-oe|5$~_~c)U2YtnBQ|@E|Kwc%P!zWxX|faW*g5+JO&EK z?opskWjsLT>0;o-V4z>aK-$$i`g(nB1GGoZ=8JYAoh2bo!sboJq5^eMf#*BtOo(Zc zJkjlrZfg2G3wiU;*sP8YVVD;Y*{V-K>LQc6Y%`Fc^Y- zY`y$Z_!7X#hAQKGvS;@xgWz0LWw53reJp`GR!Fkq{SYrfEpdu3SgvaT9GJbgHBzJAQmqG>YC{ud}IEg8)fR#G_D|LaK{*(vPTPE8~l=Zlpn&TJ}P7n<>k*>mxRBi zHbNu4LGciAuAU7y=PG(W?bwG>xGpcn4wnut!WmcIAc zmgQD(-9XTmumD)^{WtgEKkfe$Y<~I&)&nWiC`t?nSESev*83EIXA(6co2hq?r?l!P z&uV*?$Et_`D!R?oYc@-aF6GT_84?380)dB|KKnFWby3znRjrI0tO-QZ2`zX?WIn4|z3QyJSr82^I6UG{g!~h>Xd`Y1j>RdQOQ$PwjN>G?awF~+&ndvO`deOo zR<T?efO`zcBu|qsF z2rdTi1{&olcFtNCf&v^X2f7dJ@>DzC`@-UMqmNh62UAUn(rTK!E)2xR^Hj&74fz(e z*DvNi)Y$XF`z^&!e$PFWPJY|XNH}|OV)~0N8k(+^MHclk#fcc(wzzx|h@Ag5{{D|@ z@_&4uq%e$Nei~WyJDWfeyzT|?#J($`y~9}<*?o*ZyD&MavJPP+Wss7f?L-b${v(lx KznR&wJ^UZb?b7K0 literal 0 HcmV?d00001 diff --git a/thirdparty/LuaXML/luaunit.lua b/thirdparty/LuaXML/luaunit.lua new file mode 100644 index 00000000..6fad9a26 --- /dev/null +++ b/thirdparty/LuaXML/luaunit.lua @@ -0,0 +1,3452 @@ +--[[ + luaunit.lua + +Description: A unit testing framework +Homepage: https://github.com/bluebird75/luaunit +Development by Philippe Fremy +Based on initial work of Ryu, Gwang (http://www.gpgstudy.com/gpgiki/LuaUnit) +License: BSD License, see LICENSE.txt +]]-- + +require("math") +local M={} + +-- private exported functions (for testing) +M.private = {} + +M.VERSION='3.4' +M._VERSION=M.VERSION -- For LuaUnit v2 compatibility + +-- a version which distinguish between regular Lua and LuaJit +M._LUAVERSION = (jit and jit.version) or _VERSION + +--[[ Some people like assertEquals( actual, expected ) and some people prefer +assertEquals( expected, actual ). +]]-- +M.ORDER_ACTUAL_EXPECTED = true +M.PRINT_TABLE_REF_IN_ERROR_MSG = false +M.LINE_LENGTH = 80 +M.TABLE_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items +M.LIST_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items + +-- this setting allow to remove entries from the stack-trace, for +-- example to hide a call to a framework which would be calling luaunit +M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE = 0 + +--[[ EPS is meant to help with Lua's floating point math in simple corner +cases like almostEquals(1.1-0.1, 1), which may not work as-is (e.g. on numbers +with rational binary representation) if the user doesn't provide some explicit +error margin. + +The default margin used by almostEquals() in such cases is EPS; and since +Lua may be compiled with different numeric precisions (single vs. double), we +try to select a useful default for it dynamically. Note: If the initial value +is not acceptable, it can be changed by the user to better suit specific needs. + +See also: https://en.wikipedia.org/wiki/Machine_epsilon +]] +M.EPS = 2^-52 -- = machine epsilon for "double", ~2.22E-16 +if math.abs(1.1 - 1 - 0.1) > M.EPS then + -- rounding error is above EPS, assume single precision + M.EPS = 2^-23 -- = machine epsilon for "float", ~1.19E-07 +end + +-- set this to false to debug luaunit +local STRIP_LUAUNIT_FROM_STACKTRACE = true + +M.VERBOSITY_DEFAULT = 10 +M.VERBOSITY_LOW = 1 +M.VERBOSITY_QUIET = 0 +M.VERBOSITY_VERBOSE = 20 +M.DEFAULT_DEEP_ANALYSIS = nil +M.FORCE_DEEP_ANALYSIS = true +M.DISABLE_DEEP_ANALYSIS = false + +-- set EXPORT_ASSERT_TO_GLOBALS to have all asserts visible as global values +-- EXPORT_ASSERT_TO_GLOBALS = true + +-- we need to keep a copy of the script args before it is overriden +local cmdline_argv = rawget(_G, "arg") + +M.FAILURE_PREFIX = 'LuaUnit test FAILURE: ' -- prefix string for failed tests +M.SUCCESS_PREFIX = 'LuaUnit test SUCCESS: ' -- prefix string for successful tests finished early +M.SKIP_PREFIX = 'LuaUnit test SKIP: ' -- prefix string for skipped tests + + + +M.USAGE=[[Usage: lua [options] [testname1 [testname2] ... ] +Options: + -h, --help: Print this help + --version: Print version information + -v, --verbose: Increase verbosity + -q, --quiet: Set verbosity to minimum + -e, --error: Stop on first error + -f, --failure: Stop on first failure or error + -s, --shuffle: Shuffle tests before running them + -o, --output OUTPUT: Set output type to OUTPUT + Possible values: text, tap, junit, nil + -n, --name NAME: For junit only, mandatory name of xml file + -r, --repeat NUM: Execute all tests NUM times, e.g. to trig the JIT + -p, --pattern PATTERN: Execute all test names matching the Lua PATTERN + May be repeated to include several patterns + Make sure you escape magic chars like +? with % + -x, --exclude PATTERN: Exclude all test names matching the Lua PATTERN + May be repeated to exclude several patterns + Make sure you escape magic chars like +? with % + testname1, testname2, ... : tests to run in the form of testFunction, + TestClass or TestClass.testMethod + +You may also control LuaUnit options with the following environment variables: +* LUAUNIT_OUTPUT: same as --output +* LUAUNIT_JUNIT_FNAME: same as --name ]] + +---------------------------------------------------------------- +-- +-- general utility functions +-- +---------------------------------------------------------------- + +--[[ Note on catching exit + +I have seen the case where running a big suite of test cases and one of them would +perform a os.exit(0), making the outside world think that the full test suite was executed +successfully. + +This is an attempt to mitigate this problem: we override os.exit() to now let a test +exit the framework while we are running. When we are not running, it behaves normally. +]] + +M.oldOsExit = os.exit +os.exit = function(...) + if M.LuaUnit and #M.LuaUnit.instances ~= 0 then + local msg = [[You are trying to exit but there is still a running instance of LuaUnit. +LuaUnit expects to run until the end before exiting with a complete status of successful/failed tests. + +To force exit LuaUnit while running, please call before os.exit (assuming lu is the luaunit module loaded): + + lu.unregisterCurrentSuite() + +]] + M.private.error_fmt(2, msg) + end + M.oldOsExit(...) +end + +local function pcall_or_abort(func, ...) + -- unpack is a global function for Lua 5.1, otherwise use table.unpack + local unpack = rawget(_G, "unpack") or table.unpack + local result = {pcall(func, ...)} + if not result[1] then + -- an error occurred + print(result[2]) -- error message + print() + print(M.USAGE) + os.exit(-1) + end + return unpack(result, 2) +end + +local crossTypeOrdering = { + number = 1, boolean = 2, string = 3, table = 4, other = 5 +} +local crossTypeComparison = { + number = function(a, b) return a < b end, + string = function(a, b) return a < b end, + other = function(a, b) return tostring(a) < tostring(b) end, +} + +local function crossTypeSort(a, b) + local type_a, type_b = type(a), type(b) + if type_a == type_b then + local func = crossTypeComparison[type_a] or crossTypeComparison.other + return func(a, b) + end + type_a = crossTypeOrdering[type_a] or crossTypeOrdering.other + type_b = crossTypeOrdering[type_b] or crossTypeOrdering.other + return type_a < type_b +end + +local function __genSortedIndex( t ) + -- Returns a sequence consisting of t's keys, sorted. + local sortedIndex = {} + + for key,_ in pairs(t) do + table.insert(sortedIndex, key) + end + + table.sort(sortedIndex, crossTypeSort) + return sortedIndex +end +M.private.__genSortedIndex = __genSortedIndex + +local function sortedNext(state, control) + -- Equivalent of the next() function of table iteration, but returns the + -- keys in sorted order (see __genSortedIndex and crossTypeSort). + -- The state is a temporary variable during iteration and contains the + -- sorted key table (state.sortedIdx). It also stores the last index (into + -- the keys) used by the iteration, to find the next one quickly. + local key + + --print("sortedNext: control = "..tostring(control) ) + if control == nil then + -- start of iteration + state.count = #state.sortedIdx + state.lastIdx = 1 + key = state.sortedIdx[1] + return key, state.t[key] + end + + -- normally, we expect the control variable to match the last key used + if control ~= state.sortedIdx[state.lastIdx] then + -- strange, we have to find the next value by ourselves + -- the key table is sorted in crossTypeSort() order! -> use bisection + local lower, upper = 1, state.count + repeat + state.lastIdx = math.modf((lower + upper) / 2) + key = state.sortedIdx[state.lastIdx] + if key == control then + break -- key found (and thus prev index) + end + if crossTypeSort(key, control) then + -- key < control, continue search "right" (towards upper bound) + lower = state.lastIdx + 1 + else + -- key > control, continue search "left" (towards lower bound) + upper = state.lastIdx - 1 + end + until lower > upper + if lower > upper then -- only true if the key wasn't found, ... + state.lastIdx = state.count -- ... so ensure no match in code below + end + end + + -- proceed by retrieving the next value (or nil) from the sorted keys + state.lastIdx = state.lastIdx + 1 + key = state.sortedIdx[state.lastIdx] + if key then + return key, state.t[key] + end + + -- getting here means returning `nil`, which will end the iteration +end + +local function sortedPairs(tbl) + -- Equivalent of the pairs() function on tables. Allows to iterate in + -- sorted order. As required by "generic for" loops, this will return the + -- iterator (function), an "invariant state", and the initial control value. + -- (see http://www.lua.org/pil/7.2.html) + return sortedNext, {t = tbl, sortedIdx = __genSortedIndex(tbl)}, nil +end +M.private.sortedPairs = sortedPairs + +-- seed the random with a strongly varying seed +math.randomseed(math.floor(os.clock()*1E11)) + +local function randomizeTable( t ) + -- randomize the item orders of the table t + for i = #t, 2, -1 do + local j = math.random(i) + if i ~= j then + t[i], t[j] = t[j], t[i] + end + end +end +M.private.randomizeTable = randomizeTable + +local function strsplit(delimiter, text) +-- Split text into a list consisting of the strings in text, separated +-- by strings matching delimiter (which may _NOT_ be a pattern). +-- Example: strsplit(", ", "Anna, Bob, Charlie, Dolores") + if delimiter == "" or delimiter == nil then -- this would result in endless loops + error("delimiter is nil or empty string!") + end + if text == nil then + return nil + end + + local list, pos, first, last = {}, 1 + while true do + first, last = text:find(delimiter, pos, true) + if first then -- found? + table.insert(list, text:sub(pos, first - 1)) + pos = last + 1 + else + table.insert(list, text:sub(pos)) + break + end + end + return list +end +M.private.strsplit = strsplit + +local function hasNewLine( s ) + -- return true if s has a newline + return (string.find(s, '\n', 1, true) ~= nil) +end +M.private.hasNewLine = hasNewLine + +local function prefixString( prefix, s ) + -- Prefix all the lines of s with prefix + return prefix .. string.gsub(s, '\n', '\n' .. prefix) +end +M.private.prefixString = prefixString + +local function strMatch(s, pattern, start, final ) + -- return true if s matches completely the pattern from index start to index end + -- return false in every other cases + -- if start is nil, matches from the beginning of the string + -- if final is nil, matches to the end of the string + start = start or 1 + final = final or string.len(s) + + local foundStart, foundEnd = string.find(s, pattern, start, false) + return foundStart == start and foundEnd == final +end +M.private.strMatch = strMatch + +local function patternFilter(patterns, expr) + -- Run `expr` through the inclusion and exclusion rules defined in patterns + -- and return true if expr shall be included, false for excluded. + -- Inclusion pattern are defined as normal patterns, exclusions + -- patterns start with `!` and are followed by a normal pattern + + -- result: nil = UNKNOWN (not matched yet), true = ACCEPT, false = REJECT + -- default: true if no explicit "include" is found, set to false otherwise + local default, result = true, nil + + if patterns ~= nil then + for _, pattern in ipairs(patterns) do + local exclude = pattern:sub(1,1) == '!' + if exclude then + pattern = pattern:sub(2) + else + -- at least one include pattern specified, a match is required + default = false + end + -- print('pattern: ',pattern) + -- print('exclude: ',exclude) + -- print('default: ',default) + + if string.find(expr, pattern) then + -- set result to false when excluding, true otherwise + result = not exclude + end + end + end + + if result ~= nil then + return result + end + return default +end +M.private.patternFilter = patternFilter + +local function xmlEscape( s ) + -- Return s escaped for XML attributes + -- escapes table: + -- " " + -- ' ' + -- < < + -- > > + -- & & + + return string.gsub( s, '.', { + ['&'] = "&", + ['"'] = """, + ["'"] = "'", + ['<'] = "<", + ['>'] = ">", + } ) +end +M.private.xmlEscape = xmlEscape + +local function xmlCDataEscape( s ) + -- Return s escaped for CData section, escapes: "]]>" + return string.gsub( s, ']]>', ']]>' ) +end +M.private.xmlCDataEscape = xmlCDataEscape + + +local function lstrip( s ) + --[[Return s with all leading white spaces and tabs removed]] + local idx = 0 + while idx < s:len() do + idx = idx + 1 + local c = s:sub(idx,idx) + if c ~= ' ' and c ~= '\t' then + break + end + end + return s:sub(idx) +end +M.private.lstrip = lstrip + +local function extractFileLineInfo( s ) + --[[ From a string in the form "(leading spaces) dir1/dir2\dir3\file.lua:linenb: msg" + + Return the "file.lua:linenb" information + ]] + local s2 = lstrip(s) + local firstColon = s2:find(':', 1, true) + if firstColon == nil then + -- string is not in the format file:line: + return s + end + local secondColon = s2:find(':', firstColon+1, true) + if secondColon == nil then + -- string is not in the format file:line: + return s + end + + return s2:sub(1, secondColon-1) +end +M.private.extractFileLineInfo = extractFileLineInfo + + +local function stripLuaunitTrace2( stackTrace, errMsg ) + --[[ + -- Example of a traceback: + < + [C]: in function 'xpcall' + ./luaunit.lua:1449: in function 'protectedCall' + ./luaunit.lua:1508: in function 'execOneFunction' + ./luaunit.lua:1596: in function 'runSuiteByInstances' + ./luaunit.lua:1660: in function 'runSuiteByNames' + ./luaunit.lua:1736: in function 'runSuite' + example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + Other example: + < + [C]: in function 'xpcall' + ./luaunit.lua:1517: in function 'protectedCall' + ./luaunit.lua:1578: in function 'execOneFunction' + ./luaunit.lua:1677: in function 'runSuiteByInstances' + ./luaunit.lua:1730: in function 'runSuiteByNames' + ./luaunit.lua:1806: in function 'runSuite' + example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + < + [C]: in function 'xpcall' + luaunit2/luaunit.lua:1532: in function 'protectedCall' + luaunit2/luaunit.lua:1591: in function 'execOneFunction' + luaunit2/luaunit.lua:1679: in function 'runSuiteByInstances' + luaunit2/luaunit.lua:1743: in function 'runSuiteByNames' + luaunit2/luaunit.lua:1819: in function 'runSuite' + luaunit2/example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + + -- first line is "stack traceback": KEEP + -- next line may be luaunit line: REMOVE + -- next lines are call in the program under testOk: REMOVE + -- next lines are calls from luaunit to call the program under test: KEEP + + -- Strategy: + -- keep first line + -- remove lines that are part of luaunit + -- kepp lines until we hit a luaunit line + + The strategy for stripping is: + * keep first line "stack traceback:" + * part1: + * analyse all lines of the stack from bottom to top of the stack (first line to last line) + * extract the "file:line:" part of the line + * compare it with the "file:line" part of the error message + * if it does not match strip the line + * if it matches, keep the line and move to part 2 + * part2: + * anything NOT starting with luaunit.lua is the interesting part of the stack trace + * anything starting again with luaunit.lua is part of the test launcher and should be stripped out + ]] + + local function isLuaunitInternalLine( s ) + -- return true if line of stack trace comes from inside luaunit + return s:find('[/\\]luaunit%.lua:%d+: ') ~= nil + end + + -- print( '<<'..stackTrace..'>>' ) + + local t = strsplit( '\n', stackTrace ) + -- print( prettystr(t) ) + + local idx = 2 + + local errMsgFileLine = extractFileLineInfo(errMsg) + -- print('emfi="'..errMsgFileLine..'"') + + -- remove lines that are still part of luaunit + while t[idx] and extractFileLineInfo(t[idx]) ~= errMsgFileLine do + -- print('Removing : '..t[idx] ) + table.remove(t, idx) + end + + -- keep lines until we hit luaunit again + while t[idx] and (not isLuaunitInternalLine(t[idx])) do + -- print('Keeping : '..t[idx] ) + idx = idx + 1 + end + + -- remove remaining luaunit lines + while t[idx] do + -- print('Removing2 : '..t[idx] ) + table.remove(t, idx) + end + + -- print( prettystr(t) ) + return table.concat( t, '\n') + +end +M.private.stripLuaunitTrace2 = stripLuaunitTrace2 + + +local function prettystr_sub(v, indentLevel, printTableRefs, cycleDetectTable ) + local type_v = type(v) + if "string" == type_v then + -- use clever delimiters according to content: + -- enclose with single quotes if string contains ", but no ' + if v:find('"', 1, true) and not v:find("'", 1, true) then + return "'" .. v .. "'" + end + -- use double quotes otherwise, escape embedded " + return '"' .. v:gsub('"', '\\"') .. '"' + + elseif "table" == type_v then + --if v.__class__ then + -- return string.gsub( tostring(v), 'table', v.__class__ ) + --end + return M.private._table_tostring(v, indentLevel, printTableRefs, cycleDetectTable) + + elseif "number" == type_v then + -- eliminate differences in formatting between various Lua versions + if v ~= v then + return "#NaN" -- "not a number" + end + if v == math.huge then + return "#Inf" -- "infinite" + end + if v == -math.huge then + return "-#Inf" + end + if _VERSION == "Lua 5.3" then + local i = math.tointeger(v) + if i then + return tostring(i) + end + end + end + + return tostring(v) +end + +local function prettystr( v ) + --[[ Pretty string conversion, to display the full content of a variable of any type. + + * string are enclosed with " by default, or with ' if string contains a " + * tables are expanded to show their full content, with indentation in case of nested tables + ]]-- + local cycleDetectTable = {} + local s = prettystr_sub(v, 1, M.PRINT_TABLE_REF_IN_ERROR_MSG, cycleDetectTable) + if cycleDetectTable.detected and not M.PRINT_TABLE_REF_IN_ERROR_MSG then + -- some table contain recursive references, + -- so we must recompute the value by including all table references + -- else the result looks like crap + cycleDetectTable = {} + s = prettystr_sub(v, 1, true, cycleDetectTable) + end + return s +end +M.prettystr = prettystr + +function M.adjust_err_msg_with_iter( err_msg, iter_msg ) + --[[ Adjust the error message err_msg: trim the FAILURE_PREFIX or SUCCESS_PREFIX information if needed, + add the iteration message if any and return the result. + + err_msg: string, error message captured with pcall + iter_msg: a string describing the current iteration ("iteration N") or nil + if there is no iteration in this test. + + Returns: (new_err_msg, test_status) + new_err_msg: string, adjusted error message, or nil in case of success + test_status: M.NodeStatus.FAIL, SUCCESS or ERROR according to the information + contained in the error message. + ]] + if iter_msg then + iter_msg = iter_msg..', ' + else + iter_msg = '' + end + + local RE_FILE_LINE = '.*:%d+: ' + + -- error message is not necessarily a string, + -- so convert the value to string with prettystr() + if type( err_msg ) ~= 'string' then + err_msg = prettystr( err_msg ) + end + + if (err_msg:find( M.SUCCESS_PREFIX ) == 1) or err_msg:match( '('..RE_FILE_LINE..')' .. M.SUCCESS_PREFIX .. ".*" ) then + -- test finished early with success() + return nil, M.NodeStatus.SUCCESS + end + + if (err_msg:find( M.SKIP_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.SKIP_PREFIX .. ".*" ) ~= nil) then + -- substitute prefix by iteration message + err_msg = err_msg:gsub('.*'..M.SKIP_PREFIX, iter_msg, 1) + -- print("failure detected") + return err_msg, M.NodeStatus.SKIP + end + + if (err_msg:find( M.FAILURE_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.FAILURE_PREFIX .. ".*" ) ~= nil) then + -- substitute prefix by iteration message + err_msg = err_msg:gsub(M.FAILURE_PREFIX, iter_msg, 1) + -- print("failure detected") + return err_msg, M.NodeStatus.FAIL + end + + + + -- print("error detected") + -- regular error, not a failure + if iter_msg then + local match + -- "./test\\test_luaunit.lua:2241: some error msg + match = err_msg:match( '(.*:%d+: ).*' ) + if match then + err_msg = err_msg:gsub( match, match .. iter_msg ) + else + -- no file:line: infromation, just add the iteration info at the beginning of the line + err_msg = iter_msg .. err_msg + end + end + return err_msg, M.NodeStatus.ERROR +end + +local function tryMismatchFormatting( table_a, table_b, doDeepAnalysis, margin ) + --[[ + Prepares a nice error message when comparing tables, performing a deeper + analysis. + + Arguments: + * table_a, table_b: tables to be compared + * doDeepAnalysis: + M.DEFAULT_DEEP_ANALYSIS: (the default if not specified) perform deep analysis only for big lists and big dictionnaries + M.FORCE_DEEP_ANALYSIS : always perform deep analysis + M.DISABLE_DEEP_ANALYSIS: never perform deep analysis + * margin: supplied only for almost equality + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + + -- check if table_a & table_b are suitable for deep analysis + if type(table_a) ~= 'table' or type(table_b) ~= 'table' then + return false + end + + if doDeepAnalysis == M.DISABLE_DEEP_ANALYSIS then + return false + end + + local len_a, len_b, isPureList = #table_a, #table_b, true + + for k1, v1 in pairs(table_a) do + if type(k1) ~= 'number' or k1 > len_a then + -- this table a mapping + isPureList = false + break + end + end + + if isPureList then + for k2, v2 in pairs(table_b) do + if type(k2) ~= 'number' or k2 > len_b then + -- this table a mapping + isPureList = false + break + end + end + end + + if isPureList and math.min(len_a, len_b) < M.LIST_DIFF_ANALYSIS_THRESHOLD then + if not (doDeepAnalysis == M.FORCE_DEEP_ANALYSIS) then + return false + end + end + + if isPureList then + return M.private.mismatchFormattingPureList( table_a, table_b, margin ) + else + -- only work on mapping for the moment + -- return M.private.mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) + return false + end +end +M.private.tryMismatchFormatting = tryMismatchFormatting + +local function getTaTbDescr() + if not M.ORDER_ACTUAL_EXPECTED then + return 'expected', 'actual' + end + return 'actual', 'expected' +end + +local function extendWithStrFmt( res, ... ) + table.insert( res, string.format( ... ) ) +end + +local function mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) + --[[ + Prepares a nice error message when comparing tables which are not pure lists, performing a deeper + analysis. + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + + -- disable for the moment + --[[ + local result = {} + local descrTa, descrTb = getTaTbDescr() + + local keysCommon = {} + local keysOnlyTa = {} + local keysOnlyTb = {} + local keysDiffTaTb = {} + + local k, v + + for k,v in pairs( table_a ) do + if is_equal( v, table_b[k] ) then + table.insert( keysCommon, k ) + else + if table_b[k] == nil then + table.insert( keysOnlyTa, k ) + else + table.insert( keysDiffTaTb, k ) + end + end + end + + for k,v in pairs( table_b ) do + if not is_equal( v, table_a[k] ) and table_a[k] == nil then + table.insert( keysOnlyTb, k ) + end + end + + local len_a = #keysCommon + #keysDiffTaTb + #keysOnlyTa + local len_b = #keysCommon + #keysDiffTaTb + #keysOnlyTb + local limited_display = (len_a < 5 or len_b < 5) + + if math.min(len_a, len_b) < M.TABLE_DIFF_ANALYSIS_THRESHOLD then + return false + end + + if not limited_display then + if len_a == len_b then + extendWithStrFmt( result, 'Table A (%s) and B (%s) both have %d items', descrTa, descrTb, len_a ) + else + extendWithStrFmt( result, 'Table A (%s) has %d items and table B (%s) has %d items', descrTa, len_a, descrTb, len_b ) + end + + if #keysCommon == 0 and #keysDiffTaTb == 0 then + table.insert( result, 'Table A and B have no keys in common, they are totally different') + else + local s_other = 'other ' + if #keysCommon then + extendWithStrFmt( result, 'Table A and B have %d identical items', #keysCommon ) + else + table.insert( result, 'Table A and B have no identical items' ) + s_other = '' + end + + if #keysDiffTaTb ~= 0 then + result[#result] = string.format( '%s and %d items differing present in both tables', result[#result], #keysDiffTaTb) + else + result[#result] = string.format( '%s and no %sitems differing present in both tables', result[#result], s_other, #keysDiffTaTb) + end + end + + extendWithStrFmt( result, 'Table A has %d keys not present in table B and table B has %d keys not present in table A', #keysOnlyTa, #keysOnlyTb ) + end + + local function keytostring(k) + if "string" == type(k) and k:match("^[_%a][_%w]*$") then + return k + end + return prettystr(k) + end + + if #keysDiffTaTb ~= 0 then + table.insert( result, 'Items differing in A and B:') + for k,v in sortedPairs( keysDiffTaTb ) do + extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) + extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) + end + end + + if #keysOnlyTa ~= 0 then + table.insert( result, 'Items only in table A:' ) + for k,v in sortedPairs( keysOnlyTa ) do + extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) + end + end + + if #keysOnlyTb ~= 0 then + table.insert( result, 'Items only in table B:' ) + for k,v in sortedPairs( keysOnlyTb ) do + extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) + end + end + + if #keysCommon ~= 0 then + table.insert( result, 'Items common to A and B:') + for k,v in sortedPairs( keysCommon ) do + extendWithStrFmt( result, ' = A and B [%s]: %s', keytostring(v), prettystr(table_a[v]) ) + end + end + + return true, table.concat( result, '\n') + ]] +end +M.private.mismatchFormattingMapping = mismatchFormattingMapping + +local function mismatchFormattingPureList( table_a, table_b, margin ) + --[[ + Prepares a nice error message when comparing tables which are lists, performing a deeper + analysis. + + margin is supplied only for almost equality + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + local result, descrTa, descrTb = {}, getTaTbDescr() + + local len_a, len_b, refa, refb = #table_a, #table_b, '', '' + if M.PRINT_TABLE_REF_IN_ERROR_MSG then + refa, refb = string.format( '<%s> ', M.private.table_ref(table_a)), string.format('<%s> ', M.private.table_ref(table_b) ) + end + local longest, shortest = math.max(len_a, len_b), math.min(len_a, len_b) + local deltalv = longest - shortest + + local commonUntil = shortest + for i = 1, shortest do + if not M.private.is_table_equals(table_a[i], table_b[i], margin) then + commonUntil = i - 1 + break + end + end + + local commonBackTo = shortest - 1 + for i = 0, shortest - 1 do + if not M.private.is_table_equals(table_a[len_a-i], table_b[len_b-i], margin) then + commonBackTo = i - 1 + break + end + end + + + table.insert( result, 'List difference analysis:' ) + if len_a == len_b then + -- TODO: handle expected/actual naming + extendWithStrFmt( result, '* lists %sA (%s) and %sB (%s) have the same size', refa, descrTa, refb, descrTb ) + else + extendWithStrFmt( result, '* list sizes differ: list %sA (%s) has %d items, list %sB (%s) has %d items', refa, descrTa, len_a, refb, descrTb, len_b ) + end + + extendWithStrFmt( result, '* lists A and B start differing at index %d', commonUntil+1 ) + if commonBackTo >= 0 then + if deltalv > 0 then + extendWithStrFmt( result, '* lists A and B are equal again from index %d for A, %d for B', len_a-commonBackTo, len_b-commonBackTo ) + else + extendWithStrFmt( result, '* lists A and B are equal again from index %d', len_a-commonBackTo ) + end + end + + local function insertABValue(ai, bi) + bi = bi or ai + if M.private.is_table_equals( table_a[ai], table_b[bi], margin) then + return extendWithStrFmt( result, ' = A[%d], B[%d]: %s', ai, bi, prettystr(table_a[ai]) ) + else + extendWithStrFmt( result, ' - A[%d]: %s', ai, prettystr(table_a[ai])) + extendWithStrFmt( result, ' + B[%d]: %s', bi, prettystr(table_b[bi])) + end + end + + -- common parts to list A & B, at the beginning + if commonUntil > 0 then + table.insert( result, '* Common parts:' ) + for i = 1, commonUntil do + insertABValue( i ) + end + end + + -- diffing parts to list A & B + if commonUntil < shortest - commonBackTo - 1 then + table.insert( result, '* Differing parts:' ) + for i = commonUntil + 1, shortest - commonBackTo - 1 do + insertABValue( i ) + end + end + + -- display indexes of one list, with no match on other list + if shortest - commonBackTo <= longest - commonBackTo - 1 then + table.insert( result, '* Present only in one list:' ) + for i = shortest - commonBackTo, longest - commonBackTo - 1 do + if len_a > len_b then + extendWithStrFmt( result, ' - A[%d]: %s', i, prettystr(table_a[i]) ) + -- table.insert( result, '+ (no matching B index)') + else + -- table.insert( result, '- no matching A index') + extendWithStrFmt( result, ' + B[%d]: %s', i, prettystr(table_b[i]) ) + end + end + end + + -- common parts to list A & B, at the end + if commonBackTo >= 0 then + table.insert( result, '* Common parts at the end of the lists' ) + for i = longest - commonBackTo, longest do + if len_a > len_b then + insertABValue( i, i-deltalv ) + else + insertABValue( i-deltalv, i ) + end + end + end + + return true, table.concat( result, '\n') +end +M.private.mismatchFormattingPureList = mismatchFormattingPureList + +local function prettystrPairs(value1, value2, suffix_a, suffix_b) + --[[ + This function helps with the recurring task of constructing the "expected + vs. actual" error messages. It takes two arbitrary values and formats + corresponding strings with prettystr(). + + To keep the (possibly complex) output more readable in case the resulting + strings contain line breaks, they get automatically prefixed with additional + newlines. Both suffixes are optional (default to empty strings), and get + appended to the "value1" string. "suffix_a" is used if line breaks were + encountered, "suffix_b" otherwise. + + Returns the two formatted strings (including padding/newlines). + ]] + local str1, str2 = prettystr(value1), prettystr(value2) + if hasNewLine(str1) or hasNewLine(str2) then + -- line break(s) detected, add padding + return "\n" .. str1 .. (suffix_a or ""), "\n" .. str2 + end + return str1 .. (suffix_b or ""), str2 +end +M.private.prettystrPairs = prettystrPairs + +local UNKNOWN_REF = 'table 00-unknown ref' +local ref_generator = { value=1, [UNKNOWN_REF]=0 } + +local function table_ref( t ) + -- return the default tostring() for tables, with the table ID, even if the table has a metatable + -- with the __tostring converter + local ref = '' + local mt = getmetatable( t ) + if mt == nil then + ref = tostring(t) + else + local success, result + success, result = pcall(setmetatable, t, nil) + if not success then + -- protected table, if __tostring is defined, we can + -- not get the reference. And we can not know in advance. + ref = tostring(t) + if not ref:match( 'table: 0?x?[%x]+' ) then + return UNKNOWN_REF + end + else + ref = tostring(t) + setmetatable( t, mt ) + end + end + -- strip the "table: " part + ref = ref:sub(8) + if ref ~= UNKNOWN_REF and ref_generator[ref] == nil then + -- Create a new reference number + ref_generator[ref] = ref_generator.value + ref_generator.value = ref_generator.value+1 + end + if M.PRINT_TABLE_REF_IN_ERROR_MSG then + return string.format('table %02d-%s', ref_generator[ref], ref) + else + return string.format('table %02d', ref_generator[ref]) + end +end +M.private.table_ref = table_ref + +local TABLE_TOSTRING_SEP = ", " +local TABLE_TOSTRING_SEP_LEN = string.len(TABLE_TOSTRING_SEP) + +local function _table_tostring( tbl, indentLevel, printTableRefs, cycleDetectTable ) + printTableRefs = printTableRefs or M.PRINT_TABLE_REF_IN_ERROR_MSG + cycleDetectTable = cycleDetectTable or {} + cycleDetectTable[tbl] = true + + local result, dispOnMultLines = {}, false + + -- like prettystr but do not enclose with "" if the string is just alphanumerical + -- this is better for displaying table keys who are often simple strings + local function keytostring(k) + if "string" == type(k) and k:match("^[_%a][_%w]*$") then + return k + end + return prettystr_sub(k, indentLevel+1, printTableRefs, cycleDetectTable) + end + + local mt = getmetatable( tbl ) + + if mt and mt.__tostring then + -- if table has a __tostring() function in its metatable, use it to display the table + -- else, compute a regular table + result = tostring(tbl) + if type(result) ~= 'string' then + return string.format( '', prettystr(result) ) + end + result = strsplit( '\n', result ) + return M.private._table_tostring_format_multiline_string( result, indentLevel ) + + else + -- no metatable, compute the table representation + + local entry, count, seq_index = nil, 0, 1 + for k, v in sortedPairs( tbl ) do + + -- key part + if k == seq_index then + -- for the sequential part of tables, we'll skip the "=" output + entry = '' + seq_index = seq_index + 1 + elseif cycleDetectTable[k] then + -- recursion in the key detected + cycleDetectTable.detected = true + entry = "<"..table_ref(k)..">=" + else + entry = keytostring(k) .. "=" + end + + -- value part + if cycleDetectTable[v] then + -- recursion in the value detected! + cycleDetectTable.detected = true + entry = entry .. "<"..table_ref(v)..">" + else + entry = entry .. + prettystr_sub( v, indentLevel+1, printTableRefs, cycleDetectTable ) + end + count = count + 1 + result[count] = entry + end + return M.private._table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) + end + +end +M.private._table_tostring = _table_tostring -- prettystr_sub() needs it + +local function _table_tostring_format_multiline_string( tbl_str, indentLevel ) + local indentString = '\n'..string.rep(" ", indentLevel - 1) + return table.concat( tbl_str, indentString ) + +end +M.private._table_tostring_format_multiline_string = _table_tostring_format_multiline_string + + +local function _table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) + -- final function called in _table_to_string() to format the resulting list of + -- string describing the table. + + local dispOnMultLines = false + + -- set dispOnMultLines to true if the maximum LINE_LENGTH would be exceeded with the values + local totalLength = 0 + for k, v in ipairs( result ) do + totalLength = totalLength + string.len( v ) + if totalLength >= M.LINE_LENGTH then + dispOnMultLines = true + break + end + end + + -- set dispOnMultLines to true if the max LINE_LENGTH would be exceeded + -- with the values and the separators. + if not dispOnMultLines then + -- adjust with length of separator(s): + -- two items need 1 sep, three items two seps, ... plus len of '{}' + if #result > 0 then + totalLength = totalLength + TABLE_TOSTRING_SEP_LEN * (#result - 1) + end + dispOnMultLines = (totalLength + 2 >= M.LINE_LENGTH) + end + + -- now reformat the result table (currently holding element strings) + if dispOnMultLines then + local indentString = string.rep(" ", indentLevel - 1) + result = { + "{\n ", + indentString, + table.concat(result, ",\n " .. indentString), + "\n", + indentString, + "}" + } + else + result = {"{", table.concat(result, TABLE_TOSTRING_SEP), "}"} + end + if printTableRefs then + table.insert(result, 1, "<"..table_ref(tbl).."> ") -- prepend table ref + end + return table.concat(result) +end +M.private._table_tostring_format_result = _table_tostring_format_result -- prettystr_sub() needs it + +local function table_findkeyof(t, element) + -- Return the key k of the given element in table t, so that t[k] == element + -- (or `nil` if element is not present within t). Note that we use our + -- 'general' is_equal comparison for matching, so this function should + -- handle table-type elements gracefully and consistently. + if type(t) == "table" then + for k, v in pairs(t) do + if M.private.is_table_equals(v, element) then + return k + end + end + end + return nil +end + +local function _is_table_items_equals(actual, expected ) + local type_a, type_e = type(actual), type(expected) + + if type_a ~= type_e then + return false + + elseif (type_a == 'table') --[[and (type_e == 'table')]] then + for k, v in pairs(actual) do + if table_findkeyof(expected, v) == nil then + return false -- v not contained in expected + end + end + for k, v in pairs(expected) do + if table_findkeyof(actual, v) == nil then + return false -- v not contained in actual + end + end + return true + + elseif actual ~= expected then + return false + end + + return true +end + +--[[ +This is a specialized metatable to help with the bookkeeping of recursions +in _is_table_equals(). It provides an __index table that implements utility +functions for easier management of the table. The "cached" method queries +the state of a specific (actual,expected) pair; and the "store" method sets +this state to the given value. The state of pairs not "seen" / visited is +assumed to be `nil`. +]] +local _recursion_cache_MT = { + __index = { + -- Return the cached value for an (actual,expected) pair (or `nil`) + cached = function(t, actual, expected) + local subtable = t[actual] or {} + return subtable[expected] + end, + + -- Store cached value for a specific (actual,expected) pair. + -- Returns the value, so it's easy to use for a "tailcall" (return ...). + store = function(t, actual, expected, value, asymmetric) + local subtable = t[actual] + if not subtable then + subtable = {} + t[actual] = subtable + end + subtable[expected] = value + + -- Unless explicitly marked "asymmetric": Consider the recursion + -- on (expected,actual) to be equivalent to (actual,expected) by + -- default, and thus cache the value for both. + if not asymmetric then + t:store(expected, actual, value, true) + end + + return value + end + } +} + +local function _is_table_equals(actual, expected, cycleDetectTable, marginForAlmostEqual) + --[[Returns true if both table are equal. + + If argument marginForAlmostEqual is suppied, number comparison is done using alomstEqual instead + of strict equality. + + cycleDetectTable is an internal argument used during recursion on tables. + ]] + --print('_is_table_equals( \n '..prettystr(actual)..'\n , '..prettystr(expected).. + -- '\n , '..prettystr(cycleDetectTable)..'\n , '..prettystr(marginForAlmostEqual)..' )') + + local type_a, type_e = type(actual), type(expected) + + if type_a ~= type_e then + return false -- different types won't match + end + + if type_a == 'number' then + if marginForAlmostEqual ~= nil then + return M.almostEquals(actual, expected, marginForAlmostEqual) + else + return actual == expected + end + elseif type_a ~= 'table' then + -- other types compare directly + return actual == expected + end + + cycleDetectTable = cycleDetectTable or { actual={}, expected={} } + if cycleDetectTable.actual[ actual ] then + -- oh, we hit a cycle in actual + if cycleDetectTable.expected[ expected ] then + -- uh, we hit a cycle at the same time in expected + -- so the two tables have similar structure + return true + end + + -- cycle was hit only in actual, the structure differs from expected + return false + end + + if cycleDetectTable.expected[ expected ] then + -- no cycle in actual, but cycle in expected + -- the structure differ + return false + end + + -- at this point, no table cycle detected, we are + -- seeing this table for the first time + + -- mark the cycle detection + cycleDetectTable.actual[ actual ] = true + cycleDetectTable.expected[ expected ] = true + + + local actualKeysMatched = {} + for k, v in pairs(actual) do + actualKeysMatched[k] = true -- Keep track of matched keys + if not _is_table_equals(v, expected[k], cycleDetectTable, marginForAlmostEqual) then + -- table differs on this key + -- clear the cycle detection before returning + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return false + end + end + + for k, v in pairs(expected) do + if not actualKeysMatched[k] then + -- Found a key that we did not see in "actual" -> mismatch + -- clear the cycle detection before returning + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return false + end + -- Otherwise actual[k] was already matched against v = expected[k]. + end + + -- all key match, we have a match ! + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return true +end +M.private._is_table_equals = _is_table_equals + +local function failure(main_msg, extra_msg_or_nil, level) + -- raise an error indicating a test failure + -- for error() compatibility we adjust "level" here (by +1), to report the + -- calling context + local msg + if type(extra_msg_or_nil) == 'string' and extra_msg_or_nil:len() > 0 then + msg = extra_msg_or_nil .. '\n' .. main_msg + else + msg = main_msg + end + error(M.FAILURE_PREFIX .. msg, (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) +end + +local function is_table_equals(actual, expected, marginForAlmostEqual) + return _is_table_equals(actual, expected, nil, marginForAlmostEqual) +end +M.private.is_table_equals = is_table_equals + +local function fail_fmt(level, extra_msg_or_nil, ...) + -- failure with printf-style formatted message and given error level + failure(string.format(...), extra_msg_or_nil, (level or 1) + 1) +end +M.private.fail_fmt = fail_fmt + +local function error_fmt(level, ...) + -- printf-style error() + error(string.format(...), (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) +end +M.private.error_fmt = error_fmt + +---------------------------------------------------------------- +-- +-- assertions +-- +---------------------------------------------------------------- + +local function errorMsgEquality(actual, expected, doDeepAnalysis, margin) + -- margin is supplied only for almost equal verification + + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + if type(expected) == 'string' or type(expected) == 'table' then + local strExpected, strActual = prettystrPairs(expected, actual) + local result = string.format("expected: %s\nactual: %s", strExpected, strActual) + if margin then + result = result .. '\nwere not equal by the margin of: '..prettystr(margin) + end + + -- extend with mismatch analysis if possible: + local success, mismatchResult + success, mismatchResult = tryMismatchFormatting( actual, expected, doDeepAnalysis, margin ) + if success then + result = table.concat( { result, mismatchResult }, '\n' ) + end + return result + end + return string.format("expected: %s, actual: %s", + prettystr(expected), prettystr(actual)) +end + +function M.assertError(f, ...) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + if pcall( f, ... ) then + failure( "Expected an error when calling function but no error generated", nil, 2 ) + end +end + +function M.fail( msg ) + -- stops a test due to a failure + failure( msg, nil, 2 ) +end + +function M.failIf( cond, msg ) + -- Fails a test with "msg" if condition is true + if cond then + failure( msg, nil, 2 ) + end +end + +function M.skip(msg) + -- skip a running test + error_fmt(2, M.SKIP_PREFIX .. msg) +end + +function M.skipIf( cond, msg ) + -- skip a running test if condition is met + if cond then + error_fmt(2, M.SKIP_PREFIX .. msg) + end +end + +function M.runOnlyIf( cond, msg ) + -- continue a running test if condition is met, else skip it + if not cond then + error_fmt(2, M.SKIP_PREFIX .. prettystr(msg)) + end +end + +function M.success() + -- stops a test with a success + error_fmt(2, M.SUCCESS_PREFIX) +end + +function M.successIf( cond ) + -- stops a test with a success if condition is met + if cond then + error_fmt(2, M.SUCCESS_PREFIX) + end +end + + +------------------------------------------------------------------ +-- Equality assertions +------------------------------------------------------------------ + +function M.assertEquals(actual, expected, extra_msg_or_nil, doDeepAnalysis) + if type(actual) == 'table' and type(expected) == 'table' then + if not is_table_equals(actual, expected) then + failure( errorMsgEquality(actual, expected, doDeepAnalysis), extra_msg_or_nil, 2 ) + end + elseif type(actual) ~= type(expected) then + failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) + elseif actual ~= expected then + failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) + end +end + +function M.almostEquals( actual, expected, margin ) + if type(actual) ~= 'number' or type(expected) ~= 'number' or type(margin) ~= 'number' then + error_fmt(3, 'almostEquals: must supply only number arguments.\nArguments supplied: %s, %s, %s', + prettystr(actual), prettystr(expected), prettystr(margin)) + end + if margin < 0 then + error_fmt(3, 'almostEquals: margin must not be negative, current value is ' .. margin) + end + return math.abs(expected - actual) <= margin +end + +function M.assertAlmostEquals( actual, expected, margin, extra_msg_or_nil ) + -- check that two floats are close by margin + margin = margin or M.EPS + if type(margin) ~= 'number' then + error_fmt(2, 'almostEquals: margin must be a number, not %s', prettystr(margin)) + end + + if type(actual) == 'table' and type(expected) == 'table' then + -- handle almost equals for table + if not is_table_equals(actual, expected, margin) then + failure( errorMsgEquality(actual, expected, nil, margin), extra_msg_or_nil, 2 ) + end + elseif type(actual) == 'number' and type(expected) == 'number' and type(margin) == 'number' then + if not M.almostEquals(actual, expected, margin) then + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + local delta = math.abs(actual - expected) + fail_fmt(2, extra_msg_or_nil, 'Values are not almost equal\n' .. + 'Actual: %s, expected: %s, delta %s above margin of %s', + actual, expected, delta, margin) + end + else + error_fmt(3, 'almostEquals: must supply only number or table arguments.\nArguments supplied: %s, %s, %s', + prettystr(actual), prettystr(expected), prettystr(margin)) + end +end + +function M.assertNotEquals(actual, expected, extra_msg_or_nil) + if type(actual) ~= type(expected) then + return + end + + if type(actual) == 'table' and type(expected) == 'table' then + if not is_table_equals(actual, expected) then + return + end + elseif actual ~= expected then + return + end + fail_fmt(2, extra_msg_or_nil, 'Received the not expected value: %s', prettystr(actual)) +end + +function M.assertNotAlmostEquals( actual, expected, margin, extra_msg_or_nil ) + -- check that two floats are not close by margin + margin = margin or M.EPS + if M.almostEquals(actual, expected, margin) then + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + local delta = math.abs(actual - expected) + fail_fmt(2, extra_msg_or_nil, 'Values are almost equal\nActual: %s, expected: %s' .. + ', delta %s below margin of %s', + actual, expected, delta, margin) + end +end + +function M.assertItemsEquals(actual, expected, extra_msg_or_nil) + -- checks that the items of table expected + -- are contained in table actual. Warning, this function + -- is at least O(n^2) + if not _is_table_items_equals(actual, expected ) then + expected, actual = prettystrPairs(expected, actual) + fail_fmt(2, extra_msg_or_nil, 'Content of the tables are not identical:\nExpected: %s\nActual: %s', + expected, actual) + end +end + +------------------------------------------------------------------ +-- String assertion +------------------------------------------------------------------ + +function M.assertStrContains( str, sub, isPattern, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + -- assert( type(str) == 'string', 'Argument 1 of assertStrContains() should be a string.' ) ) + -- assert( type(sub) == 'string', 'Argument 2 of assertStrContains() should be a string.' ) ) + if not string.find(str, sub, 1, not isPattern) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not find %s %s in string %s', + isPattern and 'pattern' or 'substring', sub, str) + end +end + +function M.assertStrIContains( str, sub, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if not string.find(str:lower(), sub:lower(), 1, true) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not find (case insensitively) substring %s in string %s', + sub, str) + end +end + +function M.assertNotStrContains( str, sub, isPattern, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if string.find(str, sub, 1, not isPattern) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Found the not expected %s %s in string %s', + isPattern and 'pattern' or 'substring', sub, str) + end +end + +function M.assertNotStrIContains( str, sub, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if string.find(str:lower(), sub:lower(), 1, true) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Found (case insensitively) the not expected substring %s in string %s', + sub, str) + end +end + +function M.assertStrMatches( str, pattern, start, final, extra_msg_or_nil ) + -- Verify a full match for the string + if not strMatch( str, pattern, start, final ) then + pattern, str = prettystrPairs(pattern, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not match pattern %s with string %s', + pattern, str) + end +end + +local function _assertErrorMsgEquals( stripFileAndLine, expectedMsg, func, ... ) + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error: '..M.prettystr(expectedMsg), nil, 3 ) + end + if type(expectedMsg) == "string" and type(error_msg) ~= "string" then + -- table are converted to string automatically + error_msg = tostring(error_msg) + end + local differ = false + if stripFileAndLine then + if error_msg:gsub("^.+:%d+: ", "") ~= expectedMsg then + differ = true + end + else + if error_msg ~= expectedMsg then + local tr = type(error_msg) + local te = type(expectedMsg) + if te == 'table' then + if tr ~= 'table' then + differ = true + else + local ok = pcall(M.assertItemsEquals, error_msg, expectedMsg) + if not ok then + differ = true + end + end + else + differ = true + end + end + end + + if differ then + error_msg, expectedMsg = prettystrPairs(error_msg, expectedMsg) + fail_fmt(3, nil, 'Error message expected: %s\nError message received: %s\n', + expectedMsg, error_msg) + end +end + +function M.assertErrorMsgEquals( expectedMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + _assertErrorMsgEquals(false, expectedMsg, func, ...) +end + +function M.assertErrorMsgContentEquals(expectedMsg, func, ...) + _assertErrorMsgEquals(true, expectedMsg, func, ...) +end + +function M.assertErrorMsgContains( partialMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error containing: '..prettystr(partialMsg), nil, 2 ) + end + if type(error_msg) ~= "string" then + error_msg = tostring(error_msg) + end + if not string.find( error_msg, partialMsg, nil, true ) then + error_msg, partialMsg = prettystrPairs(error_msg, partialMsg) + fail_fmt(2, nil, 'Error message does not contain: %s\nError message received: %s\n', + partialMsg, error_msg) + end +end + +function M.assertErrorMsgMatches( expectedMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error matching: "'..expectedMsg..'"', nil, 2 ) + end + if type(error_msg) ~= "string" then + error_msg = tostring(error_msg) + end + if not strMatch( error_msg, expectedMsg ) then + expectedMsg, error_msg = prettystrPairs(expectedMsg, error_msg) + fail_fmt(2, nil, 'Error message does not match pattern: %s\nError message received: %s\n', + expectedMsg, error_msg) + end +end + +------------------------------------------------------------------ +-- Type assertions +------------------------------------------------------------------ + +function M.assertEvalToTrue(value, extra_msg_or_nil) + if not value then + failure("expected: a value evaluating to true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertEvalToFalse(value, extra_msg_or_nil) + if value then + failure("expected: false or nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsTrue(value, extra_msg_or_nil) + if value ~= true then + failure("expected: true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsTrue(value, extra_msg_or_nil) + if value == true then + failure("expected: not true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsFalse(value, extra_msg_or_nil) + if value ~= false then + failure("expected: false, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsFalse(value, extra_msg_or_nil) + if value == false then + failure("expected: not false, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsNil(value, extra_msg_or_nil) + if value ~= nil then + failure("expected: nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsNil(value, extra_msg_or_nil) + if value == nil then + failure("expected: not nil, actual: nil", extra_msg_or_nil, 2) + end +end + +--[[ +Add type assertion functions to the module table M. Each of these functions +takes a single parameter "value", and checks that its Lua type matches the +expected string (derived from the function name): + +M.assertIsXxx(value) -> ensure that type(value) conforms to "xxx" +]] +for _, funcName in ipairs( + {'assertIsNumber', 'assertIsString', 'assertIsTable', 'assertIsBoolean', + 'assertIsFunction', 'assertIsUserdata', 'assertIsThread'} +) do + local typeExpected = funcName:match("^assertIs([A-Z]%a*)$") + -- Lua type() always returns lowercase, also make sure the match() succeeded + typeExpected = typeExpected and typeExpected:lower() + or error("bad function name '"..funcName.."' for type assertion") + + M[funcName] = function(value, extra_msg_or_nil) + if type(value) ~= typeExpected then + if type(value) == 'nil' then + fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: nil', + typeExpected, type(value), prettystrPairs(value)) + else + fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: type %s, value %s', + typeExpected, type(value), prettystrPairs(value)) + end + end + end +end + +--[[ +Add shortcuts for verifying type of a variable, without failure (luaunit v2 compatibility) +M.isXxx(value) -> returns true if type(value) conforms to "xxx" +]] +for _, typeExpected in ipairs( + {'Number', 'String', 'Table', 'Boolean', + 'Function', 'Userdata', 'Thread', 'Nil' } +) do + local typeExpectedLower = typeExpected:lower() + local isType = function(value) + return (type(value) == typeExpectedLower) + end + M['is'..typeExpected] = isType + M['is_'..typeExpectedLower] = isType +end + +--[[ +Add non-type assertion functions to the module table M. Each of these functions +takes a single parameter "value", and checks that its Lua type differs from the +expected string (derived from the function name): + +M.assertNotIsXxx(value) -> ensure that type(value) is not "xxx" +]] +for _, funcName in ipairs( + {'assertNotIsNumber', 'assertNotIsString', 'assertNotIsTable', 'assertNotIsBoolean', + 'assertNotIsFunction', 'assertNotIsUserdata', 'assertNotIsThread'} +) do + local typeUnexpected = funcName:match("^assertNotIs([A-Z]%a*)$") + -- Lua type() always returns lowercase, also make sure the match() succeeded + typeUnexpected = typeUnexpected and typeUnexpected:lower() + or error("bad function name '"..funcName.."' for type assertion") + + M[funcName] = function(value, extra_msg_or_nil) + if type(value) == typeUnexpected then + fail_fmt(2, extra_msg_or_nil, 'expected: not a %s type, actual: value %s', + typeUnexpected, prettystrPairs(value)) + end + end +end + +function M.assertIs(actual, expected, extra_msg_or_nil) + if actual ~= expected then + if not M.ORDER_ACTUAL_EXPECTED then + actual, expected = expected, actual + end + local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG + M.PRINT_TABLE_REF_IN_ERROR_MSG = true + expected, actual = prettystrPairs(expected, actual, '\n', '') + M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg + fail_fmt(2, extra_msg_or_nil, 'expected and actual object should not be different\nExpected: %s\nReceived: %s', + expected, actual) + end +end + +function M.assertNotIs(actual, expected, extra_msg_or_nil) + if actual == expected then + local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG + M.PRINT_TABLE_REF_IN_ERROR_MSG = true + local s_expected + if not M.ORDER_ACTUAL_EXPECTED then + s_expected = prettystrPairs(actual) + else + s_expected = prettystrPairs(expected) + end + M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg + fail_fmt(2, extra_msg_or_nil, 'expected and actual object should be different: %s', s_expected ) + end +end + + +------------------------------------------------------------------ +-- Scientific assertions +------------------------------------------------------------------ + + +function M.assertIsNaN(value, extra_msg_or_nil) + if type(value) ~= "number" or value == value then + failure("expected: NaN, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsNaN(value, extra_msg_or_nil) + if type(value) == "number" and value ~= value then + failure("expected: not NaN, actual: NaN", extra_msg_or_nil, 2) + end +end + +function M.assertIsInf(value, extra_msg_or_nil) + if type(value) ~= "number" or math.abs(value) ~= math.huge then + failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsPlusInf(value, extra_msg_or_nil) + if type(value) ~= "number" or value ~= math.huge then + failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsMinusInf(value, extra_msg_or_nil) + if type(value) ~= "number" or value ~= -math.huge then + failure("expected: -#Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsPlusInf(value, extra_msg_or_nil) + if type(value) == "number" and value == math.huge then + failure("expected: not #Inf, actual: #Inf", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsMinusInf(value, extra_msg_or_nil) + if type(value) == "number" and value == -math.huge then + failure("expected: not -#Inf, actual: -#Inf", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsInf(value, extra_msg_or_nil) + if type(value) == "number" and math.abs(value) == math.huge then + failure("expected: not infinity, actual: " .. prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsPlusZero(value, extra_msg_or_nil) + if type(value) ~= 'number' or value ~= 0 then + failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + else if (1/value == -math.huge) then + -- more precise error diagnosis + failure("expected: +0.0, actual: -0.0", extra_msg_or_nil, 2) + else if (1/value ~= math.huge) then + -- strange, case should have already been covered + failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end + end + end +end + +function M.assertIsMinusZero(value, extra_msg_or_nil) + if type(value) ~= 'number' or value ~= 0 then + failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + else if (1/value == math.huge) then + -- more precise error diagnosis + failure("expected: -0.0, actual: +0.0", extra_msg_or_nil, 2) + else if (1/value ~= -math.huge) then + -- strange, case should have already been covered + failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end + end + end +end + +function M.assertNotIsPlusZero(value, extra_msg_or_nil) + if type(value) == 'number' and (1/value == math.huge) then + failure("expected: not +0.0, actual: +0.0", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsMinusZero(value, extra_msg_or_nil) + if type(value) == 'number' and (1/value == -math.huge) then + failure("expected: not -0.0, actual: -0.0", extra_msg_or_nil, 2) + end +end + +function M.assertTableContains(t, expected, extra_msg_or_nil) + -- checks that table t contains the expected element + if table_findkeyof(t, expected) == nil then + t, expected = prettystrPairs(t, expected) + fail_fmt(2, extra_msg_or_nil, 'Table %s does NOT contain the expected element %s', + t, expected) + end +end + +function M.assertNotTableContains(t, expected, extra_msg_or_nil) + -- checks that table t doesn't contain the expected element + local k = table_findkeyof(t, expected) + if k ~= nil then + t, expected = prettystrPairs(t, expected) + fail_fmt(2, extra_msg_or_nil, 'Table %s DOES contain the unwanted element %s (at key %s)', + t, expected, prettystr(k)) + end +end + +---------------------------------------------------------------- +-- Compatibility layer +---------------------------------------------------------------- + +-- for compatibility with LuaUnit v2.x +function M.wrapFunctions() + -- In LuaUnit version <= 2.1 , this function was necessary to include + -- a test function inside the global test suite. Nowadays, the functions + -- are simply run directly as part of the test discovery process. + -- so just do nothing ! + io.stderr:write[[Use of WrapFunctions() is no longer needed. +Just prefix your test function names with "test" or "Test" and they +will be picked up and run by LuaUnit. +]] +end + +local list_of_funcs = { + -- { official function name , alias } + + -- general assertions + { 'assertEquals' , 'assert_equals' }, + { 'assertItemsEquals' , 'assert_items_equals' }, + { 'assertNotEquals' , 'assert_not_equals' }, + { 'assertAlmostEquals' , 'assert_almost_equals' }, + { 'assertNotAlmostEquals' , 'assert_not_almost_equals' }, + { 'assertEvalToTrue' , 'assert_eval_to_true' }, + { 'assertEvalToFalse' , 'assert_eval_to_false' }, + { 'assertStrContains' , 'assert_str_contains' }, + { 'assertStrIContains' , 'assert_str_icontains' }, + { 'assertNotStrContains' , 'assert_not_str_contains' }, + { 'assertNotStrIContains' , 'assert_not_str_icontains' }, + { 'assertStrMatches' , 'assert_str_matches' }, + { 'assertError' , 'assert_error' }, + { 'assertErrorMsgEquals' , 'assert_error_msg_equals' }, + { 'assertErrorMsgContains' , 'assert_error_msg_contains' }, + { 'assertErrorMsgMatches' , 'assert_error_msg_matches' }, + { 'assertErrorMsgContentEquals', 'assert_error_msg_content_equals' }, + { 'assertIs' , 'assert_is' }, + { 'assertNotIs' , 'assert_not_is' }, + { 'assertTableContains' , 'assert_table_contains' }, + { 'assertNotTableContains' , 'assert_not_table_contains' }, + { 'wrapFunctions' , 'WrapFunctions' }, + { 'wrapFunctions' , 'wrap_functions' }, + + -- type assertions: assertIsXXX -> assert_is_xxx + { 'assertIsNumber' , 'assert_is_number' }, + { 'assertIsString' , 'assert_is_string' }, + { 'assertIsTable' , 'assert_is_table' }, + { 'assertIsBoolean' , 'assert_is_boolean' }, + { 'assertIsNil' , 'assert_is_nil' }, + { 'assertIsTrue' , 'assert_is_true' }, + { 'assertIsFalse' , 'assert_is_false' }, + { 'assertIsNaN' , 'assert_is_nan' }, + { 'assertIsInf' , 'assert_is_inf' }, + { 'assertIsPlusInf' , 'assert_is_plus_inf' }, + { 'assertIsMinusInf' , 'assert_is_minus_inf' }, + { 'assertIsPlusZero' , 'assert_is_plus_zero' }, + { 'assertIsMinusZero' , 'assert_is_minus_zero' }, + { 'assertIsFunction' , 'assert_is_function' }, + { 'assertIsThread' , 'assert_is_thread' }, + { 'assertIsUserdata' , 'assert_is_userdata' }, + + -- type assertions: assertIsXXX -> assertXxx + { 'assertIsNumber' , 'assertNumber' }, + { 'assertIsString' , 'assertString' }, + { 'assertIsTable' , 'assertTable' }, + { 'assertIsBoolean' , 'assertBoolean' }, + { 'assertIsNil' , 'assertNil' }, + { 'assertIsTrue' , 'assertTrue' }, + { 'assertIsFalse' , 'assertFalse' }, + { 'assertIsNaN' , 'assertNaN' }, + { 'assertIsInf' , 'assertInf' }, + { 'assertIsPlusInf' , 'assertPlusInf' }, + { 'assertIsMinusInf' , 'assertMinusInf' }, + { 'assertIsPlusZero' , 'assertPlusZero' }, + { 'assertIsMinusZero' , 'assertMinusZero'}, + { 'assertIsFunction' , 'assertFunction' }, + { 'assertIsThread' , 'assertThread' }, + { 'assertIsUserdata' , 'assertUserdata' }, + + -- type assertions: assertIsXXX -> assert_xxx (luaunit v2 compat) + { 'assertIsNumber' , 'assert_number' }, + { 'assertIsString' , 'assert_string' }, + { 'assertIsTable' , 'assert_table' }, + { 'assertIsBoolean' , 'assert_boolean' }, + { 'assertIsNil' , 'assert_nil' }, + { 'assertIsTrue' , 'assert_true' }, + { 'assertIsFalse' , 'assert_false' }, + { 'assertIsNaN' , 'assert_nan' }, + { 'assertIsInf' , 'assert_inf' }, + { 'assertIsPlusInf' , 'assert_plus_inf' }, + { 'assertIsMinusInf' , 'assert_minus_inf' }, + { 'assertIsPlusZero' , 'assert_plus_zero' }, + { 'assertIsMinusZero' , 'assert_minus_zero' }, + { 'assertIsFunction' , 'assert_function' }, + { 'assertIsThread' , 'assert_thread' }, + { 'assertIsUserdata' , 'assert_userdata' }, + + -- type assertions: assertNotIsXXX -> assert_not_is_xxx + { 'assertNotIsNumber' , 'assert_not_is_number' }, + { 'assertNotIsString' , 'assert_not_is_string' }, + { 'assertNotIsTable' , 'assert_not_is_table' }, + { 'assertNotIsBoolean' , 'assert_not_is_boolean' }, + { 'assertNotIsNil' , 'assert_not_is_nil' }, + { 'assertNotIsTrue' , 'assert_not_is_true' }, + { 'assertNotIsFalse' , 'assert_not_is_false' }, + { 'assertNotIsNaN' , 'assert_not_is_nan' }, + { 'assertNotIsInf' , 'assert_not_is_inf' }, + { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, + { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, + { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, + { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, + { 'assertNotIsFunction' , 'assert_not_is_function' }, + { 'assertNotIsThread' , 'assert_not_is_thread' }, + { 'assertNotIsUserdata' , 'assert_not_is_userdata' }, + + -- type assertions: assertNotIsXXX -> assertNotXxx (luaunit v2 compat) + { 'assertNotIsNumber' , 'assertNotNumber' }, + { 'assertNotIsString' , 'assertNotString' }, + { 'assertNotIsTable' , 'assertNotTable' }, + { 'assertNotIsBoolean' , 'assertNotBoolean' }, + { 'assertNotIsNil' , 'assertNotNil' }, + { 'assertNotIsTrue' , 'assertNotTrue' }, + { 'assertNotIsFalse' , 'assertNotFalse' }, + { 'assertNotIsNaN' , 'assertNotNaN' }, + { 'assertNotIsInf' , 'assertNotInf' }, + { 'assertNotIsPlusInf' , 'assertNotPlusInf' }, + { 'assertNotIsMinusInf' , 'assertNotMinusInf' }, + { 'assertNotIsPlusZero' , 'assertNotPlusZero' }, + { 'assertNotIsMinusZero' , 'assertNotMinusZero' }, + { 'assertNotIsFunction' , 'assertNotFunction' }, + { 'assertNotIsThread' , 'assertNotThread' }, + { 'assertNotIsUserdata' , 'assertNotUserdata' }, + + -- type assertions: assertNotIsXXX -> assert_not_xxx + { 'assertNotIsNumber' , 'assert_not_number' }, + { 'assertNotIsString' , 'assert_not_string' }, + { 'assertNotIsTable' , 'assert_not_table' }, + { 'assertNotIsBoolean' , 'assert_not_boolean' }, + { 'assertNotIsNil' , 'assert_not_nil' }, + { 'assertNotIsTrue' , 'assert_not_true' }, + { 'assertNotIsFalse' , 'assert_not_false' }, + { 'assertNotIsNaN' , 'assert_not_nan' }, + { 'assertNotIsInf' , 'assert_not_inf' }, + { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, + { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, + { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, + { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, + { 'assertNotIsFunction' , 'assert_not_function' }, + { 'assertNotIsThread' , 'assert_not_thread' }, + { 'assertNotIsUserdata' , 'assert_not_userdata' }, + + -- all assertions with Coroutine duplicate Thread assertions + { 'assertIsThread' , 'assertIsCoroutine' }, + { 'assertIsThread' , 'assertCoroutine' }, + { 'assertIsThread' , 'assert_is_coroutine' }, + { 'assertIsThread' , 'assert_coroutine' }, + { 'assertNotIsThread' , 'assertNotIsCoroutine' }, + { 'assertNotIsThread' , 'assertNotCoroutine' }, + { 'assertNotIsThread' , 'assert_not_is_coroutine' }, + { 'assertNotIsThread' , 'assert_not_coroutine' }, +} + +-- Create all aliases in M +for _,v in ipairs( list_of_funcs ) do + local funcname, alias = v[1], v[2] + M[alias] = M[funcname] + + if EXPORT_ASSERT_TO_GLOBALS then + _G[funcname] = M[funcname] + _G[alias] = M[funcname] + end +end + +---------------------------------------------------------------- +-- +-- Outputters +-- +---------------------------------------------------------------- + +-- A common "base" class for outputters +-- For concepts involved (class inheritance) see http://www.lua.org/pil/16.2.html + +local genericOutput = { __class__ = 'genericOutput' } -- class +local genericOutput_MT = { __index = genericOutput } -- metatable +M.genericOutput = genericOutput -- publish, so that custom classes may derive from it + +function genericOutput.new(runner, default_verbosity) + -- runner is the "parent" object controlling the output, usually a LuaUnit instance + local t = { runner = runner } + if runner then + t.result = runner.result + t.verbosity = runner.verbosity or default_verbosity + t.fname = runner.fname + else + t.verbosity = default_verbosity + end + return setmetatable( t, genericOutput_MT) +end + +-- abstract ("empty") methods +function genericOutput:startSuite() + -- Called once, when the suite is started +end + +function genericOutput:startClass(className) + -- Called each time a new test class is started +end + +function genericOutput:startTest(testName) + -- called each time a new test is started, right before the setUp() + -- the current test status node is already created and available in: self.result.currentNode +end + +function genericOutput:updateStatus(node) + -- called with status failed or error as soon as the error/failure is encountered + -- this method is NOT called for a successful test because a test is marked as successful by default + -- and does not need to be updated +end + +function genericOutput:endTest(node) + -- called when the test is finished, after the tearDown() method +end + +function genericOutput:endClass() + -- called when executing the class is finished, before moving on to the next class of at the end of the test execution +end + +function genericOutput:endSuite() + -- called at the end of the test suite execution +end + + +---------------------------------------------------------------- +-- class TapOutput +---------------------------------------------------------------- + +local TapOutput = genericOutput.new() -- derived class +local TapOutput_MT = { __index = TapOutput } -- metatable +TapOutput.__class__ = 'TapOutput' + + -- For a good reference for TAP format, check: http://testanything.org/tap-specification.html + + function TapOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_LOW) + return setmetatable( t, TapOutput_MT) + end + function TapOutput:startSuite() + print("1.."..self.result.selectedCount) + print('# Started on '..self.result.startDate) + end + function TapOutput:startClass(className) + if className ~= '[TestFunctions]' then + print('# Starting class: '..className) + end + end + + function TapOutput:updateStatus( node ) + if node:isSkipped() then + io.stdout:write("ok ", self.result.currentTestNumber, "\t# SKIP ", node.msg, "\n" ) + return + end + + io.stdout:write("not ok ", self.result.currentTestNumber, "\t", node.testName, "\n") + if self.verbosity > M.VERBOSITY_LOW then + print( prefixString( '# ', node.msg ) ) + end + if (node:isFailure() or node:isError()) and self.verbosity > M.VERBOSITY_DEFAULT then + print( prefixString( '# ', node.stackTrace ) ) + end + end + + function TapOutput:endTest( node ) + if node:isSuccess() then + io.stdout:write("ok ", self.result.currentTestNumber, "\t", node.testName, "\n") + end + end + + function TapOutput:endSuite() + print( '# '..M.LuaUnit.statusLine( self.result ) ) + return self.result.notSuccessCount + end + + +-- class TapOutput end + +---------------------------------------------------------------- +-- class JUnitOutput +---------------------------------------------------------------- + +-- See directory junitxml for more information about the junit format +local JUnitOutput = genericOutput.new() -- derived class +local JUnitOutput_MT = { __index = JUnitOutput } -- metatable +JUnitOutput.__class__ = 'JUnitOutput' + + function JUnitOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_LOW) + t.testList = {} + return setmetatable( t, JUnitOutput_MT ) + end + + function JUnitOutput:startSuite() + -- open xml file early to deal with errors + if self.fname == nil then + error('With Junit, an output filename must be supplied with --name!') + end + if string.sub(self.fname,-4) ~= '.xml' then + self.fname = self.fname..'.xml' + end + self.fd = io.open(self.fname, "w") + if self.fd == nil then + error("Could not open file for writing: "..self.fname) + end + + print('# XML output to '..self.fname) + print('# Started on '..self.result.startDate) + end + function JUnitOutput:startClass(className) + if className ~= '[TestFunctions]' then + print('# Starting class: '..className) + end + end + function JUnitOutput:startTest(testName) + print('# Starting test: '..testName) + end + + function JUnitOutput:updateStatus( node ) + if node:isFailure() then + print( '# Failure: ' .. prefixString( '# ', node.msg ):sub(4, nil) ) + -- print('# ' .. node.stackTrace) + elseif node:isError() then + print( '# Error: ' .. prefixString( '# ' , node.msg ):sub(4, nil) ) + -- print('# ' .. node.stackTrace) + end + end + + function JUnitOutput:endSuite() + print( '# '..M.LuaUnit.statusLine(self.result)) + + -- XML file writing + self.fd:write('\n') + self.fd:write('\n') + self.fd:write(string.format( + ' \n', + self.result.runCount, self.result.startIsodate, self.result.duration, self.result.errorCount, self.result.failureCount, self.result.skippedCount )) + self.fd:write(" \n") + self.fd:write(string.format(' \n', _VERSION ) ) + self.fd:write(string.format(' \n', M.VERSION) ) + -- XXX please include system name and version if possible + self.fd:write(" \n") + + for i,node in ipairs(self.result.allTests) do + self.fd:write(string.format(' \n', + node.className, node.testName, node.duration ) ) + if node:isNotSuccess() then + self.fd:write(node:statusXML()) + end + self.fd:write(' \n') + end + + -- Next two lines are needed to validate junit ANT xsd, but really not useful in general: + self.fd:write(' \n') + self.fd:write(' \n') + + self.fd:write(' \n') + self.fd:write('\n') + self.fd:close() + return self.result.notSuccessCount + end + + +-- class TapOutput end + +---------------------------------------------------------------- +-- class TextOutput +---------------------------------------------------------------- + +--[[ Example of other unit-tests suite text output + +-- Python Non verbose: + +For each test: . or F or E + +If some failed tests: + ============== + ERROR / FAILURE: TestName (testfile.testclass) + --------- + Stack trace + + +then -------------- +then "Ran x tests in 0.000s" +then OK or FAILED (failures=1, error=1) + +-- Python Verbose: +testname (filename.classname) ... ok +testname (filename.classname) ... FAIL +testname (filename.classname) ... ERROR + +then -------------- +then "Ran x tests in 0.000s" +then OK or FAILED (failures=1, error=1) + +-- Ruby: +Started + . + Finished in 0.002695 seconds. + + 1 tests, 2 assertions, 0 failures, 0 errors + +-- Ruby: +>> ruby tc_simple_number2.rb +Loaded suite tc_simple_number2 +Started +F.. +Finished in 0.038617 seconds. + + 1) Failure: +test_failure(TestSimpleNumber) [tc_simple_number2.rb:16]: +Adding doesn't work. +<3> expected but was +<4>. + +3 tests, 4 assertions, 1 failures, 0 errors + +-- Java Junit +.......F. +Time: 0,003 +There was 1 failure: +1) testCapacity(junit.samples.VectorTest)junit.framework.AssertionFailedError + at junit.samples.VectorTest.testCapacity(VectorTest.java:87) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + +FAILURES!!! +Tests run: 8, Failures: 1, Errors: 0 + + +-- Maven + +# mvn test +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running math.AdditionTest +Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: +0.03 sec <<< FAILURE! + +Results : + +Failed tests: + testLireSymbole(math.AdditionTest) + +Tests run: 2, Failures: 1, Errors: 0, Skipped: 0 + + +-- LuaUnit +---- non verbose +* display . or F or E when running tests +---- verbose +* display test name + ok/fail +---- +* blank line +* number) ERROR or FAILURE: TestName + Stack trace +* blank line +* number) ERROR or FAILURE: TestName + Stack trace + +then -------------- +then "Ran x tests in 0.000s (%d not selected, %d skipped)" +then OK or FAILED (failures=1, error=1) + + +]] + +local TextOutput = genericOutput.new() -- derived class +local TextOutput_MT = { __index = TextOutput } -- metatable +TextOutput.__class__ = 'TextOutput' + + function TextOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_DEFAULT) + t.errorList = {} + return setmetatable( t, TextOutput_MT ) + end + + function TextOutput:startSuite() + if self.verbosity > M.VERBOSITY_DEFAULT then + print( 'Started on '.. self.result.startDate ) + end + end + + function TextOutput:startTest(testName) + if self.verbosity > M.VERBOSITY_DEFAULT then + io.stdout:write( " ", self.result.currentNode.testName, " ... " ) + end + end + + function TextOutput:endTest( node ) + if node:isSuccess() then + if self.verbosity > M.VERBOSITY_DEFAULT then + io.stdout:write("Ok\n") + else + io.stdout:write(".") + io.stdout:flush() + end + else + if self.verbosity > M.VERBOSITY_DEFAULT then + print( node.status ) + print( node.msg ) + --[[ + -- find out when to do this: + if self.verbosity > M.VERBOSITY_DEFAULT then + print( node.stackTrace ) + end + ]] + else + -- write only the first character of status E, F or S + io.stdout:write(string.sub(node.status, 1, 1)) + io.stdout:flush() + end + end + end + + function TextOutput:displayOneFailedTest( index, fail ) + print(index..") "..fail.testName ) + print( fail.msg ) + print( fail.stackTrace ) + print() + end + + function TextOutput:displayErroredTests() + if #self.result.errorTests ~= 0 then + print("Tests with errors:") + print("------------------") + for i, v in ipairs(self.result.errorTests) do + self:displayOneFailedTest(i, v) + end + end + end + + function TextOutput:displayFailedTests() + if #self.result.failedTests ~= 0 then + print("Failed tests:") + print("-------------") + for i, v in ipairs(self.result.failedTests) do + self:displayOneFailedTest(i, v) + end + end + end + + function TextOutput:endSuite() + if self.verbosity > M.VERBOSITY_DEFAULT then + print("=========================================================") + else + print() + end + self:displayErroredTests() + self:displayFailedTests() + print( M.LuaUnit.statusLine( self.result ) ) + if self.result.notSuccessCount == 0 then + print('OK') + end + end + +-- class TextOutput end + + +---------------------------------------------------------------- +-- class NilOutput +---------------------------------------------------------------- + +local function nopCallable() + --print(42) + return nopCallable +end + +local NilOutput = { __class__ = 'NilOuptut' } -- class +local NilOutput_MT = { __index = nopCallable } -- metatable + +function NilOutput.new(runner) + return setmetatable( { __class__ = 'NilOutput' }, NilOutput_MT ) +end + +---------------------------------------------------------------- +-- +-- class LuaUnit +-- +---------------------------------------------------------------- + +M.LuaUnit = { + outputType = TextOutput, + verbosity = M.VERBOSITY_DEFAULT, + __class__ = 'LuaUnit', + instances = {} +} +local LuaUnit_MT = { __index = M.LuaUnit } + +if EXPORT_ASSERT_TO_GLOBALS then + LuaUnit = M.LuaUnit +end + + function M.LuaUnit.new() + local newInstance = setmetatable( {}, LuaUnit_MT ) + return newInstance + end + + -----------------[[ Utility methods ]]--------------------- + + function M.LuaUnit.asFunction(aObject) + -- return "aObject" if it is a function, and nil otherwise + if 'function' == type(aObject) then + return aObject + end + end + + function M.LuaUnit.splitClassMethod(someName) + --[[ + Return a pair of className, methodName strings for a name in the form + "class.method". If no class part (or separator) is found, will return + nil, someName instead (the latter being unchanged). + + This convention thus also replaces the older isClassMethod() test: + You just have to check for a non-nil className (return) value. + ]] + local separator = string.find(someName, '.', 1, true) + if separator then + return someName:sub(1, separator - 1), someName:sub(separator + 1) + end + return nil, someName + end + + function M.LuaUnit.isMethodTestName( s ) + -- return true is the name matches the name of a test method + -- default rule is that is starts with 'Test' or with 'test' + return string.sub(s, 1, 4):lower() == 'test' + end + + function M.LuaUnit.isTestName( s ) + -- return true is the name matches the name of a test + -- default rule is that is starts with 'Test' or with 'test' + return string.sub(s, 1, 4):lower() == 'test' + end + + function M.LuaUnit.collectTests() + -- return a list of all test names in the global namespace + -- that match LuaUnit.isTestName + + local testNames = {} + for k, _ in pairs(_G) do + if type(k) == "string" and M.LuaUnit.isTestName( k ) then + table.insert( testNames , k ) + end + end + table.sort( testNames ) + return testNames + end + + function M.LuaUnit.parseCmdLine( cmdLine ) + -- parse the command line + -- Supported command line parameters: + -- --verbose, -v: increase verbosity + -- --quiet, -q: silence output + -- --error, -e: treat errors as fatal (quit program) + -- --output, -o, + name: select output type + -- --pattern, -p, + pattern: run test matching pattern, may be repeated + -- --exclude, -x, + pattern: run test not matching pattern, may be repeated + -- --shuffle, -s, : shuffle tests before reunning them + -- --name, -n, + fname: name of output file for junit, default to stdout + -- --repeat, -r, + num: number of times to execute each test + -- [testnames, ...]: run selected test names + -- + -- Returns a table with the following fields: + -- verbosity: nil, M.VERBOSITY_DEFAULT, M.VERBOSITY_QUIET, M.VERBOSITY_VERBOSE + -- output: nil, 'tap', 'junit', 'text', 'nil' + -- testNames: nil or a list of test names to run + -- exeRepeat: num or 1 + -- pattern: nil or a list of patterns + -- exclude: nil or a list of patterns + + local result, state = {}, nil + local SET_OUTPUT = 1 + local SET_PATTERN = 2 + local SET_EXCLUDE = 3 + local SET_FNAME = 4 + local SET_REPEAT = 5 + + if cmdLine == nil then + return result + end + + local function parseOption( option ) + if option == '--help' or option == '-h' then + result['help'] = true + return + elseif option == '--version' then + result['version'] = true + return + elseif option == '--verbose' or option == '-v' then + result['verbosity'] = M.VERBOSITY_VERBOSE + return + elseif option == '--quiet' or option == '-q' then + result['verbosity'] = M.VERBOSITY_QUIET + return + elseif option == '--error' or option == '-e' then + result['quitOnError'] = true + return + elseif option == '--failure' or option == '-f' then + result['quitOnFailure'] = true + return + elseif option == '--shuffle' or option == '-s' then + result['shuffle'] = true + return + elseif option == '--output' or option == '-o' then + state = SET_OUTPUT + return state + elseif option == '--name' or option == '-n' then + state = SET_FNAME + return state + elseif option == '--repeat' or option == '-r' then + state = SET_REPEAT + return state + elseif option == '--pattern' or option == '-p' then + state = SET_PATTERN + return state + elseif option == '--exclude' or option == '-x' then + state = SET_EXCLUDE + return state + end + error('Unknown option: '..option,3) + end + + local function setArg( cmdArg, state ) + if state == SET_OUTPUT then + result['output'] = cmdArg + return + elseif state == SET_FNAME then + result['fname'] = cmdArg + return + elseif state == SET_REPEAT then + result['exeRepeat'] = tonumber(cmdArg) + or error('Malformed -r argument: '..cmdArg) + return + elseif state == SET_PATTERN then + if result['pattern'] then + table.insert( result['pattern'], cmdArg ) + else + result['pattern'] = { cmdArg } + end + return + elseif state == SET_EXCLUDE then + local notArg = '!'..cmdArg + if result['pattern'] then + table.insert( result['pattern'], notArg ) + else + result['pattern'] = { notArg } + end + return + end + error('Unknown parse state: '.. state) + end + + + for i, cmdArg in ipairs(cmdLine) do + if state ~= nil then + setArg( cmdArg, state, result ) + state = nil + else + if cmdArg:sub(1,1) == '-' then + state = parseOption( cmdArg ) + else + if result['testNames'] then + table.insert( result['testNames'], cmdArg ) + else + result['testNames'] = { cmdArg } + end + end + end + end + + if result['help'] then + M.LuaUnit.help() + end + + if result['version'] then + M.LuaUnit.version() + end + + if state ~= nil then + error('Missing argument after '..cmdLine[ #cmdLine ],2 ) + end + + return result + end + + function M.LuaUnit.help() + print(M.USAGE) + os.exit(0) + end + + function M.LuaUnit.version() + print('LuaUnit v'..M.VERSION..' by Philippe Fremy ') + os.exit(0) + end + +---------------------------------------------------------------- +-- class NodeStatus +---------------------------------------------------------------- + + local NodeStatus = { __class__ = 'NodeStatus' } -- class + local NodeStatus_MT = { __index = NodeStatus } -- metatable + M.NodeStatus = NodeStatus + + -- values of status + NodeStatus.SUCCESS = 'SUCCESS' + NodeStatus.SKIP = 'SKIP' + NodeStatus.FAIL = 'FAIL' + NodeStatus.ERROR = 'ERROR' + + function NodeStatus.new( number, testName, className ) + -- default constructor, test are PASS by default + local t = { number = number, testName = testName, className = className } + setmetatable( t, NodeStatus_MT ) + t:success() + return t + end + + function NodeStatus:success() + self.status = self.SUCCESS + -- useless because lua does this for us, but it helps me remembering the relevant field names + self.msg = nil + self.stackTrace = nil + end + + function NodeStatus:skip(msg) + self.status = self.SKIP + self.msg = msg + self.stackTrace = nil + end + + function NodeStatus:fail(msg, stackTrace) + self.status = self.FAIL + self.msg = msg + self.stackTrace = stackTrace + end + + function NodeStatus:error(msg, stackTrace) + self.status = self.ERROR + self.msg = msg + self.stackTrace = stackTrace + end + + function NodeStatus:isSuccess() + return self.status == NodeStatus.SUCCESS + end + + function NodeStatus:isNotSuccess() + -- Return true if node is either failure or error or skip + return (self.status == NodeStatus.FAIL or self.status == NodeStatus.ERROR or self.status == NodeStatus.SKIP) + end + + function NodeStatus:isSkipped() + return self.status == NodeStatus.SKIP + end + + function NodeStatus:isFailure() + return self.status == NodeStatus.FAIL + end + + function NodeStatus:isError() + return self.status == NodeStatus.ERROR + end + + function NodeStatus:statusXML() + if self:isError() then + return table.concat( + {' \n', + ' \n'}) + elseif self:isFailure() then + return table.concat( + {' \n', + ' \n'}) + elseif self:isSkipped() then + return table.concat({' ', xmlEscape(self.msg),'\n' } ) + end + return ' \n' -- (not XSD-compliant! normally shouldn't get here) + end + + --------------[[ Output methods ]]------------------------- + + local function conditional_plural(number, singular) + -- returns a grammatically well-formed string "%d " + local suffix = '' + if number ~= 1 then -- use plural + suffix = (singular:sub(-2) == 'ss') and 'es' or 's' + end + return string.format('%d %s%s', number, singular, suffix) + end + + function M.LuaUnit.statusLine(result) + -- return status line string according to results + local s = { + string.format('Ran %d tests in %0.3f seconds', + result.runCount, result.duration), + conditional_plural(result.successCount, 'success'), + } + if result.notSuccessCount > 0 then + if result.failureCount > 0 then + table.insert(s, conditional_plural(result.failureCount, 'failure')) + end + if result.errorCount > 0 then + table.insert(s, conditional_plural(result.errorCount, 'error')) + end + else + table.insert(s, '0 failures') + end + if result.skippedCount > 0 then + table.insert(s, string.format("%d skipped", result.skippedCount)) + end + if result.nonSelectedCount > 0 then + table.insert(s, string.format("%d non-selected", result.nonSelectedCount)) + end + return table.concat(s, ', ') + end + + function M.LuaUnit:startSuite(selectedCount, nonSelectedCount) + self.result = { + selectedCount = selectedCount, + nonSelectedCount = nonSelectedCount, + successCount = 0, + runCount = 0, + currentTestNumber = 0, + currentClassName = "", + currentNode = nil, + suiteStarted = true, + startTime = os.clock(), + startDate = os.date(os.getenv('LUAUNIT_DATEFMT')), + startIsodate = os.date('%Y-%m-%dT%H:%M:%S'), + patternIncludeFilter = self.patternIncludeFilter, + + -- list of test node status + allTests = {}, + failedTests = {}, + errorTests = {}, + skippedTests = {}, + + failureCount = 0, + errorCount = 0, + notSuccessCount = 0, + skippedCount = 0, + } + + self.outputType = self.outputType or TextOutput + self.output = self.outputType.new(self) + self.output:startSuite() + end + + function M.LuaUnit:startClass( className, classInstance ) + self.result.currentClassName = className + self.output:startClass( className ) + self:setupClass( className, classInstance ) + end + + function M.LuaUnit:startTest( testName ) + self.result.currentTestNumber = self.result.currentTestNumber + 1 + self.result.runCount = self.result.runCount + 1 + self.result.currentNode = NodeStatus.new( + self.result.currentTestNumber, + testName, + self.result.currentClassName + ) + self.result.currentNode.startTime = os.clock() + table.insert( self.result.allTests, self.result.currentNode ) + self.output:startTest( testName ) + end + + function M.LuaUnit:updateStatus( err ) + -- "err" is expected to be a table / result from protectedCall() + if err.status == NodeStatus.SUCCESS then + return + end + + local node = self.result.currentNode + + --[[ As a first approach, we will report only one error or one failure for one test. + + However, we can have the case where the test is in failure, and the teardown is in error. + In such case, it's a good idea to report both a failure and an error in the test suite. This is + what Python unittest does for example. However, it mixes up counts so need to be handled carefully: for + example, there could be more (failures + errors) count that tests. What happens to the current node ? + + We will do this more intelligent version later. + ]] + + -- if the node is already in failure/error, just don't report the new error (see above) + if node.status ~= NodeStatus.SUCCESS then + return + end + + if err.status == NodeStatus.FAIL then + node:fail( err.msg, err.trace ) + table.insert( self.result.failedTests, node ) + elseif err.status == NodeStatus.ERROR then + node:error( err.msg, err.trace ) + table.insert( self.result.errorTests, node ) + elseif err.status == NodeStatus.SKIP then + node:skip( err.msg ) + table.insert( self.result.skippedTests, node ) + else + error('No such status: ' .. prettystr(err.status)) + end + + self.output:updateStatus( node ) + end + + function M.LuaUnit:endTest() + local node = self.result.currentNode + -- print( 'endTest() '..prettystr(node)) + -- print( 'endTest() '..prettystr(node:isNotSuccess())) + node.duration = os.clock() - node.startTime + node.startTime = nil + self.output:endTest( node ) + + if node:isSuccess() then + self.result.successCount = self.result.successCount + 1 + elseif node:isError() then + if self.quitOnError or self.quitOnFailure then + -- Runtime error - abort test execution as requested by + -- "--error" option. This is done by setting a special + -- flag that gets handled in internalRunSuiteByInstances(). + print("\nERROR during LuaUnit test execution:\n" .. node.msg) + self.result.aborted = true + end + elseif node:isFailure() then + if self.quitOnFailure then + -- Failure - abort test execution as requested by + -- "--failure" option. This is done by setting a special + -- flag that gets handled in internalRunSuiteByInstances(). + print("\nFailure during LuaUnit test execution:\n" .. node.msg) + self.result.aborted = true + end + elseif node:isSkipped() then + self.result.runCount = self.result.runCount - 1 + else + error('No such node status: ' .. prettystr(node.status)) + end + self.result.currentNode = nil + end + + function M.LuaUnit:endClass() + self:teardownClass( self.lastClassName, self.lastClassInstance ) + self.output:endClass() + end + + function M.LuaUnit:endSuite() + if self.result.suiteStarted == false then + error('LuaUnit:endSuite() -- suite was already ended' ) + end + self.result.duration = os.clock()-self.result.startTime + self.result.suiteStarted = false + + -- Expose test counts for outputter's endSuite(). This could be managed + -- internally instead by using the length of the lists of failed tests + -- but unit tests rely on these fields being present. + self.result.failureCount = #self.result.failedTests + self.result.errorCount = #self.result.errorTests + self.result.notSuccessCount = self.result.failureCount + self.result.errorCount + self.result.skippedCount = #self.result.skippedTests + + self.output:endSuite() + end + + function M.LuaUnit:setOutputType(outputType, fname) + -- Configures LuaUnit runner output + -- outputType is one of: NIL, TAP, JUNIT, TEXT + -- when outputType is junit, the additional argument fname is used to set the name of junit output file + -- for other formats, fname is ignored + if outputType:upper() == "NIL" then + self.outputType = NilOutput + return + end + if outputType:upper() == "TAP" then + self.outputType = TapOutput + return + end + if outputType:upper() == "JUNIT" then + self.outputType = JUnitOutput + if fname then + self.fname = fname + end + return + end + if outputType:upper() == "TEXT" then + self.outputType = TextOutput + return + end + error( 'No such format: '..outputType,2) + end + + --------------[[ Runner ]]----------------- + + function M.LuaUnit:protectedCall(classInstance, methodInstance, prettyFuncName) + -- if classInstance is nil, this is just a function call + -- else, it's method of a class being called. + + local function err_handler(e) + -- transform error into a table, adding the traceback information + return { + status = NodeStatus.ERROR, + msg = e, + trace = string.sub(debug.traceback("", 1), 2) + } + end + + local ok, err + if classInstance then + -- stupid Lua < 5.2 does not allow xpcall with arguments so let's use a workaround + ok, err = xpcall( function () methodInstance(classInstance) end, err_handler ) + else + ok, err = xpcall( function () methodInstance() end, err_handler ) + end + if ok then + return {status = NodeStatus.SUCCESS} + end + -- print('ok="'..prettystr(ok)..'" err="'..prettystr(err)..'"') + + local iter_msg + iter_msg = self.exeRepeat and 'iteration '..self.currentCount + + err.msg, err.status = M.adjust_err_msg_with_iter( err.msg, iter_msg ) + + if err.status == NodeStatus.SUCCESS or err.status == NodeStatus.SKIP then + err.trace = nil + return err + end + + -- reformat / improve the stack trace + if prettyFuncName then -- we do have the real method name + err.trace = err.trace:gsub("in (%a+) 'methodInstance'", "in %1 '"..prettyFuncName.."'") + end + if STRIP_LUAUNIT_FROM_STACKTRACE then + err.trace = stripLuaunitTrace2(err.trace, err.msg) + end + + return err -- return the error "object" (table) + end + + + function M.LuaUnit:execOneFunction(className, methodName, classInstance, methodInstance) + -- When executing a test function, className and classInstance must be nil + -- When executing a class method, all parameters must be set + + if type(methodInstance) ~= 'function' then + self:unregisterSuite() + error( tostring(methodName)..' must be a function, not '..type(methodInstance)) + end + + local prettyFuncName + if className == nil then + className = '[TestFunctions]' + prettyFuncName = methodName + else + prettyFuncName = className..'.'..methodName + end + + if self.lastClassName ~= className then + if self.lastClassName ~= nil then + self:endClass() + end + self:startClass( className, classInstance ) + self.lastClassName = className + self.lastClassInstance = classInstance + end + + self:startTest(prettyFuncName) + + local node = self.result.currentNode + for iter_n = 1, self.exeRepeat or 1 do + if node:isNotSuccess() then + break + end + self.currentCount = iter_n + + -- run setUp first (if any) + if classInstance then + local func = self.asFunction( classInstance.setUp ) or + self.asFunction( classInstance.Setup ) or + self.asFunction( classInstance.setup ) or + self.asFunction( classInstance.SetUp ) + if func then + self:updateStatus(self:protectedCall(classInstance, func, className..'.setUp')) + end + end + + -- run testMethod() + if node:isSuccess() then + self:updateStatus(self:protectedCall(classInstance, methodInstance, prettyFuncName)) + end + + -- lastly, run tearDown (if any) + if classInstance then + local func = self.asFunction( classInstance.tearDown ) or + self.asFunction( classInstance.TearDown ) or + self.asFunction( classInstance.teardown ) or + self.asFunction( classInstance.Teardown ) + if func then + self:updateStatus(self:protectedCall(classInstance, func, className..'.tearDown')) + end + end + end + + self:endTest() + end + + function M.LuaUnit.expandOneClass( result, className, classInstance ) + --[[ + Input: a list of { name, instance }, a class name, a class instance + Ouptut: modify result to add all test method instance in the form: + { className.methodName, classInstance } + ]] + for methodName, methodInstance in sortedPairs(classInstance) do + if M.LuaUnit.asFunction(methodInstance) and M.LuaUnit.isMethodTestName( methodName ) then + table.insert( result, { className..'.'..methodName, classInstance } ) + end + end + end + + function M.LuaUnit.expandClasses( listOfNameAndInst ) + --[[ + -- expand all classes (provided as {className, classInstance}) to a list of {className.methodName, classInstance} + -- functions and methods remain untouched + + Input: a list of { name, instance } + + Output: + * { function name, function instance } : do nothing + * { class.method name, class instance }: do nothing + * { class name, class instance } : add all method names in the form of (className.methodName, classInstance) + ]] + local result = {} + + for i,v in ipairs( listOfNameAndInst ) do + local name, instance = v[1], v[2] + if M.LuaUnit.asFunction(instance) then + table.insert( result, { name, instance } ) + else + if type(instance) ~= 'table' then + error( 'Instance must be a table or a function, not a '..type(instance)..' with value '..prettystr(instance)) + end + local className, methodName = M.LuaUnit.splitClassMethod( name ) + if className then + local methodInstance = instance[methodName] + if methodInstance == nil then + error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) + end + table.insert( result, { name, instance } ) + else + M.LuaUnit.expandOneClass( result, name, instance ) + end + end + end + + return result + end + + function M.LuaUnit.applyPatternFilter( patternIncFilter, listOfNameAndInst ) + local included, excluded = {}, {} + for i, v in ipairs( listOfNameAndInst ) do + -- local name, instance = v[1], v[2] + if patternFilter( patternIncFilter, v[1] ) then + table.insert( included, v ) + else + table.insert( excluded, v ) + end + end + return included, excluded + end + + local function getKeyInListWithGlobalFallback( key, listOfNameAndInst ) + local result = nil + for i,v in ipairs( listOfNameAndInst ) do + if(listOfNameAndInst[i][1] == key) then + result = listOfNameAndInst[i][2] + break + end + end + if(not M.LuaUnit.asFunction( result ) ) then + result = _G[key] + end + return result + end + + function M.LuaUnit:setupSuite( listOfNameAndInst ) + local setupSuite = getKeyInListWithGlobalFallback("setupSuite", listOfNameAndInst) + if self.asFunction( setupSuite ) then + self:updateStatus( self:protectedCall( nil, setupSuite, 'setupSuite' ) ) + end + end + + function M.LuaUnit:teardownSuite(listOfNameAndInst) + local teardownSuite = getKeyInListWithGlobalFallback("teardownSuite", listOfNameAndInst) + if self.asFunction( teardownSuite ) then + self:updateStatus( self:protectedCall( nil, teardownSuite, 'teardownSuite') ) + end + end + + function M.LuaUnit:setupClass( className, instance ) + if type( instance ) == 'table' and self.asFunction( instance.setupClass ) then + self:updateStatus( self:protectedCall( instance, instance.setupClass, className..'.setupClass' ) ) + end + end + + function M.LuaUnit:teardownClass( className, instance ) + if type( instance ) == 'table' and self.asFunction( instance.teardownClass ) then + self:updateStatus( self:protectedCall( instance, instance.teardownClass, className..'.teardownClass' ) ) + end + end + + function M.LuaUnit:internalRunSuiteByInstances( listOfNameAndInst ) + --[[ Run an explicit list of tests. Each item of the list must be one of: + * { function name, function instance } + * { class name, class instance } + * { class.method name, class instance } + + This function is internal to LuaUnit. The official API to perform this action is runSuiteByInstances() + ]] + + local expandedList = self.expandClasses( listOfNameAndInst ) + if self.shuffle then + randomizeTable( expandedList ) + end + local filteredList, filteredOutList = self.applyPatternFilter( + self.patternIncludeFilter, expandedList ) + + self:startSuite( #filteredList, #filteredOutList ) + self:setupSuite( listOfNameAndInst ) + + for i,v in ipairs( filteredList ) do + local name, instance = v[1], v[2] + if M.LuaUnit.asFunction(instance) then + self:execOneFunction( nil, name, nil, instance ) + else + -- expandClasses() should have already taken care of sanitizing the input + assert( type(instance) == 'table' ) + local className, methodName = M.LuaUnit.splitClassMethod( name ) + assert( className ~= nil ) + local methodInstance = instance[methodName] + assert(methodInstance ~= nil) + self:execOneFunction( className, methodName, instance, methodInstance ) + end + if self.result.aborted then + break -- "--error" or "--failure" option triggered + end + end + + if self.lastClassName ~= nil then + self:endClass() + end + + self:teardownSuite( listOfNameAndInst ) + self:endSuite() + + if self.result.aborted then + print("LuaUnit ABORTED (as requested by --error or --failure option)") + self:unregisterSuite() + os.exit(-2) + end + end + + function M.LuaUnit:internalRunSuiteByNames( listOfName ) + --[[ Run LuaUnit with a list of generic names, coming either from command-line or from global + namespace analysis. Convert the list into a list of (name, valid instances (table or function)) + and calls internalRunSuiteByInstances. + ]] + + local instanceName, instance + local listOfNameAndInst = {} + + for i,name in ipairs( listOfName ) do + local className, methodName = M.LuaUnit.splitClassMethod( name ) + if className then + instanceName = className + instance = _G[instanceName] + + if instance == nil then + self:unregisterSuite() + error( "No such name in global space: "..instanceName ) + end + + if type(instance) ~= 'table' then + self:unregisterSuite() + error( 'Instance of '..instanceName..' must be a table, not '..type(instance)) + end + + local methodInstance = instance[methodName] + if methodInstance == nil then + self:unregisterSuite() + error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) + end + + else + -- for functions and classes + instanceName = name + instance = _G[instanceName] + end + + if instance == nil then + self:unregisterSuite() + error( "No such name in global space: "..instanceName ) + end + + if (type(instance) ~= 'table' and type(instance) ~= 'function') then + self:unregisterSuite() + error( 'Name must match a function or a table: '..instanceName ) + end + + table.insert( listOfNameAndInst, { name, instance } ) + end + + self:internalRunSuiteByInstances( listOfNameAndInst ) + end + + function M.LuaUnit.run(...) + -- Run some specific test classes. + -- If no arguments are passed, run the class names specified on the + -- command line. If no class name is specified on the command line + -- run all classes whose name starts with 'Test' + -- + -- If arguments are passed, they must be strings of the class names + -- that you want to run or generic command line arguments (-o, -p, -v, ...) + local runner = M.LuaUnit.new() + return runner:runSuite(...) + end + + function M.LuaUnit:registerSuite() + -- register the current instance into our global array of instances + -- print('-> Register suite') + M.LuaUnit.instances[ #M.LuaUnit.instances+1 ] = self + end + + function M.unregisterCurrentSuite() + -- force unregister the last registered suite + table.remove(M.LuaUnit.instances, #M.LuaUnit.instances) + end + + function M.LuaUnit:unregisterSuite() + -- print('<- Unregister suite') + -- remove our current instqances from the global array of instances + local instanceIdx = nil + for i, instance in ipairs(M.LuaUnit.instances) do + if instance == self then + instanceIdx = i + break + end + end + + if instanceIdx ~= nil then + table.remove(M.LuaUnit.instances, instanceIdx) + -- print('Unregister done') + end + + end + + function M.LuaUnit:initFromArguments( ... ) + --[[Parses all arguments from either command-line or direct call and set internal + flags of LuaUnit runner according to it. + + Return the list of names which were possibly passed on the command-line or as arguments + ]] + local args = {...} + if type(args[1]) == 'table' and args[1].__class__ == 'LuaUnit' then + -- run was called with the syntax M.LuaUnit:runSuite() + -- we support both M.LuaUnit.run() and M.LuaUnit:run() + -- strip out the first argument self to make it a command-line argument list + table.remove(args,1) + end + + if #args == 0 then + args = cmdline_argv + end + + local options = pcall_or_abort( M.LuaUnit.parseCmdLine, args ) + + -- We expect these option fields to be either `nil` or contain + -- valid values, so it's safe to always copy them directly. + self.verbosity = options.verbosity + self.quitOnError = options.quitOnError + self.quitOnFailure = options.quitOnFailure + + self.exeRepeat = options.exeRepeat + self.patternIncludeFilter = options.pattern + self.shuffle = options.shuffle + + options.output = options.output or os.getenv('LUAUNIT_OUTPUT') + options.fname = options.fname or os.getenv('LUAUNIT_JUNIT_FNAME') + + if options.output then + if options.output:lower() == 'junit' and options.fname == nil then + print('With junit output, a filename must be supplied with -n or --name') + os.exit(-1) + end + pcall_or_abort(self.setOutputType, self, options.output, options.fname) + end + + return options.testNames + end + + function M.LuaUnit:runSuite( ... ) + testNames = self:initFromArguments(...) + self:registerSuite() + self:internalRunSuiteByNames( testNames or M.LuaUnit.collectTests() ) + self:unregisterSuite() + return self.result.notSuccessCount + end + + function M.LuaUnit:runSuiteByInstances( listOfNameAndInst, commandLineArguments ) + --[[ + Run all test functions or tables provided as input. + + Input: a list of { name, instance } + instance can either be a function or a table containing test functions starting with the prefix "test" + + return the number of failures and errors, 0 meaning success + ]] + -- parse the command-line arguments + testNames = self:initFromArguments( commandLineArguments ) + self:registerSuite() + self:internalRunSuiteByInstances( listOfNameAndInst ) + self:unregisterSuite() + return self.result.notSuccessCount + end + + + +-- class LuaUnit + +-- For compatbility with LuaUnit v2 +M.run = M.LuaUnit.run +M.Run = M.LuaUnit.run + +function M:setVerbosity( verbosity ) + -- set the verbosity value (as integer) + M.LuaUnit.verbosity = verbosity +end +M.set_verbosity = M.setVerbosity +M.SetVerbosity = M.setVerbosity + + +return M \ No newline at end of file -- Gitee From 250a390ed1490d17e805dd696c23a0eee27c2f9e Mon Sep 17 00:00:00 2001 From: xuwenlong Date: Tue, 11 Jul 2023 15:13:07 +0800 Subject: [PATCH 02/29] add oneDNN Signed-off-by: xuwenlong --- thirdparty/oneDNN/HPKBUILD | 74 +++++++++++++++++ thirdparty/oneDNN/OAT.xml | 20 +++++ thirdparty/oneDNN/README.OpenSource | 11 +++ thirdparty/oneDNN/README_zh.md | 12 +++ thirdparty/oneDNN/SHA512SUM | 1 + thirdparty/oneDNN/docs/hap_integrate.md | 91 +++++++++++++++++++++ thirdparty/oneDNN/docs/pic/oneDNN_js.png | Bin 0 -> 10080 bytes thirdparty/oneDNN/docs/pic/oneDNN_test.png | Bin 0 -> 32925 bytes thirdparty/oneDNN/oneDNN_oh_pkg.patch | 31 +++++++ 9 files changed, 240 insertions(+) create mode 100644 thirdparty/oneDNN/HPKBUILD create mode 100644 thirdparty/oneDNN/OAT.xml create mode 100644 thirdparty/oneDNN/README.OpenSource create mode 100644 thirdparty/oneDNN/README_zh.md create mode 100644 thirdparty/oneDNN/SHA512SUM create mode 100644 thirdparty/oneDNN/docs/hap_integrate.md create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_js.png create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_test.png create mode 100644 thirdparty/oneDNN/oneDNN_oh_pkg.patch diff --git a/thirdparty/oneDNN/HPKBUILD b/thirdparty/oneDNN/HPKBUILD new file mode 100644 index 00000000..569fd923 --- /dev/null +++ b/thirdparty/oneDNN/HPKBUILD @@ -0,0 +1,74 @@ +# Contributor: 城meto +# Maintainer: 城meto + +pkgname=oneDNN +pkgver=v3.2 +pkgrel=0 +pkgdesc="oneDNN is an open-source cross-platform performance library of basic building blocks for deep learning applications." +url="https://github.com/oneapi-src/oneDNN" +archs=("arm64-v8a") +license=("Apache-2.0 license") +depends=("openmp") +makedepends=() +source="https://github.com/oneapi-src/$pkgname/archive/refs/tags/$pkgver.tar.gz" + +autounpack=true +downloadpackage=true +patchflag=true + +builddir=$pkgname-${pkgver:1} +packagename=$pkgname-$pkgver.tar.gz + +source envset.sh + +prepare() { + mkdir -p $builddir/$ARCH-build + + # 1.平台差异无法使用同样的方式获取cpu cache信息 + # 2.cmake 文件没有做OHOS兼容 + if [ $patchflag == true ];then + cd $builddir + patch -p1 < `pwd`/../oneDNN_oh_pkg.patch + patchflag=false + cd $OLDPWD + fi + if [ $ARCH == "arm64-v8a" ];then + setarm64ENV + host=aarch64-linux + else + echo "${ARCH} not support" + fi +} + +build() { + cd $builddir + # 需要配置openmp 的动态库路径,否则无法找到路径 + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \ + -DDNNL_BUILD_TESTS=ON \ + -DCMAKE_C_FLAGS="${CFLAGS} -I${LYCIUM_ROOT}/usr/openmp/${ARCH}/include" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS} -I${LYCIUM_ROOT}/usr/openmp/${ARCH}/include" \ + -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS} -L${LYCIUM_ROOT}/usr/openmp/${ARCH}/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS} -L${LYCIUM_ROOT}/usr/openmp/${ARCH}/lib" \ + -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1 + make -j4 -C $ARCH-build VERBOSE=1 >> `pwd`/$ARCH-build/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir + make -C $ARCH-build install VERBOSE=1 >> `pwd`/$ARCH-build/build.log 2>&1 + cd $OLDPWD +} + +check() { + echo "The test must be on an OpenHarmony device!" + # real test + # ctest +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packagename +} \ No newline at end of file diff --git a/thirdparty/oneDNN/OAT.xml b/thirdparty/oneDNN/OAT.xml new file mode 100644 index 00000000..96937ea0 --- /dev/null +++ b/thirdparty/oneDNN/OAT.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/oneDNN/README.OpenSource b/thirdparty/oneDNN/README.OpenSource new file mode 100644 index 00000000..f0c6a1dc --- /dev/null +++ b/thirdparty/oneDNN/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "oneDNN", + "License": "Apache-2.0 license", + "License File": "LICENSE", + "Version Number": "v3.2", + "Owner": "myxuan475@126.com", + "Upstream URL": "https://github.com/oneapi-src/oneDNN/archive/refs/tags/v3.2.tar.gz", + "Description": "oneDNN is an open-source cross-platform performance library of basic building blocks for deep learning applications." + } +] \ No newline at end of file diff --git a/thirdparty/oneDNN/README_zh.md b/thirdparty/oneDNN/README_zh.md new file mode 100644 index 00000000..da3e3d27 --- /dev/null +++ b/thirdparty/oneDNN/README_zh.md @@ -0,0 +1,12 @@ +# oneDNN三方库说明 +## 功能简介 +oneDNN是为深度学习应用开发的一块跨平台开源库。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:v3.2 +- 当前适配的功能:提供数据的序列化框架 +- [Apache License](https://github.com/oneapi-src/oneDNN/tree/v3.2/LICENSE) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) \ No newline at end of file diff --git a/thirdparty/oneDNN/SHA512SUM b/thirdparty/oneDNN/SHA512SUM new file mode 100644 index 00000000..6e8db932 --- /dev/null +++ b/thirdparty/oneDNN/SHA512SUM @@ -0,0 +1 @@ +6777927537370759e0d2043bee3fbbe39cb26414ae9e2155bf0978471b7615f7eede13c9622c335343e4ad1aba56b4d3534a151688b6f2c11731da8c54157f41 oneDNN-v3.2.tar.gz diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md new file mode 100644 index 00000000..b26974b5 --- /dev/null +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -0,0 +1,91 @@ +# oneDNN集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/oneDNN #三方库avrocpp的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── oneDNN_oh_pkg.patch #PATCH 文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将oneDNN拷贝至tools/main目录下 + + ```shell + cd tpc_c_cplusplus + cp -rf thirdparty/oneDNN tools/main + ``` + + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + + ```shell + cd tools + ./build.sh oneDNN openmp + ``` + +- 三方库头文件及生成的库 + + 在tools目录下会生成usr目录,该目录下存在已编译完成64位三方库 + + ```shell + oneDNN/arm64-v8a + ``` +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示: + ![thirdparty_install_dir](pic/oneDNN_js.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + + ```shell + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so) + + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/include) + + #将动态库打包到libs + add_custom_command(TARGET entry POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so + ${CMAKE_CURRENT_BINARY_DIR}/../../../../libs/${OHOS_ARCH}) + ``` + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录,执行如下命令ctest(arm64-v8a-build为构建64位的目录) + +![oneDNN_test](pic/oneDNN_test.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_js.png b/thirdparty/oneDNN/docs/pic/oneDNN_js.png new file mode 100755 index 0000000000000000000000000000000000000000..8d27e4b5b7757cec7257b3c0a0fb4c3e10b2872f GIT binary patch literal 10080 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 literal 0 HcmV?d00001 diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_test.png b/thirdparty/oneDNN/docs/pic/oneDNN_test.png new file mode 100755 index 0000000000000000000000000000000000000000..d704ff1d8cb3c7e1e76d3cfa3058bf39132f2eaf GIT binary patch literal 32925 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 Date: Thu, 13 Jul 2023 09:13:45 +0800 Subject: [PATCH 03/29] =?UTF-8?q?=E4=BF=AE=E6=94=B9IDE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=92=8Clibs=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuwenlong --- thirdparty/oneDNN/README_zh.md | 6 +++--- thirdparty/oneDNN/docs/hap_integrate.md | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/thirdparty/oneDNN/README_zh.md b/thirdparty/oneDNN/README_zh.md index da3e3d27..7e708c13 100644 --- a/thirdparty/oneDNN/README_zh.md +++ b/thirdparty/oneDNN/README_zh.md @@ -2,10 +2,10 @@ ## 功能简介 oneDNN是为深度学习应用开发的一块跨平台开源库。 ## 使用约束 -- IDE版本:DevEco Studio 3.1 Beta2 -- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) - 三方库版本:v3.2 -- 当前适配的功能:提供数据的序列化框架 +- 当前适配的功能:提供CNN基元、RNN原语、元素操作、支持多种函数和优化的数据布局。 - [Apache License](https://github.com/oneapi-src/oneDNN/tree/v3.2/LICENSE) ## 集成方式 diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md index b26974b5..6c1a98e4 100644 --- a/thirdparty/oneDNN/docs/hap_integrate.md +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -6,8 +6,8 @@ - ubuntu20.04 - [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) -- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) -- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [ohos_sdk_public 4.0.8.1 (API Version 10 Release)](https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_4.0.8.1%2F20230608_091058%2Fversion-Master_Version-OpenHarmony_4.0.8.1-20230608_091058-ohos-sdk-public.tar.gz) +- [DevEco Studio 3.1 Release](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2F81%2Fv3%2FtgRUB84wR72nTfE8Ir_xMw%2Fdevecostudio-windows-3.1.0.501.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230621T074329Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) - [准备三方库构建环境](../../../tools/README.md#编译环境准备) - [准备三方库测试环境](../../../tools/README.md#ci环境准备) @@ -56,7 +56,7 @@ ## 应用中使用三方库 -- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示: +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,动态库文件会自动拷贝到libs目录下打包,如下图所示: ![thirdparty_install_dir](pic/oneDNN_js.png) - 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 @@ -69,10 +69,11 @@ target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/include) #将动态库打包到libs + file(GLOB allLibs "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/*.so*") add_custom_command(TARGET entry POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so - ${CMAKE_CURRENT_BINARY_DIR}/../../../../libs/${OHOS_ARCH}) + ${allLibs} + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/) ``` ## 测试三方库 -- Gitee From c78d3ca0bef5c59803e64dc032e5a8f87bf41aa1 Mon Sep 17 00:00:00 2001 From: chenxu Date: Fri, 7 Jul 2023 10:01:38 +0800 Subject: [PATCH 04/29] =?UTF-8?q?Modify:=E6=95=B4=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenxu --- thirdparty/LuaXML/HPKBUILD | 15 +- thirdparty/LuaXML/LICENSE | 201 - thirdparty/LuaXML/OAT.xml | 2 +- thirdparty/LuaXML/README_zh.md | 6 +- thirdparty/LuaXML/docs/hap_integrate.md | 39 +- thirdparty/LuaXML/docs/pic/run_screen_cut.jpg | Bin 188019 -> 42055 bytes thirdparty/LuaXML/docs/pic/screen_cut.jpg | Bin 23610 -> 141297 bytes thirdparty/LuaXML/docs/pic/screen_ide.jpg | Bin 0 -> 81274 bytes thirdparty/LuaXML/luaunit.lua | 3452 ----------------- 9 files changed, 35 insertions(+), 3680 deletions(-) delete mode 100644 thirdparty/LuaXML/LICENSE mode change 100644 => 100755 thirdparty/LuaXML/docs/pic/screen_cut.jpg create mode 100755 thirdparty/LuaXML/docs/pic/screen_ide.jpg delete mode 100644 thirdparty/LuaXML/luaunit.lua diff --git a/thirdparty/LuaXML/HPKBUILD b/thirdparty/LuaXML/HPKBUILD index c7e456df..fc2cbaa1 100644 --- a/thirdparty/LuaXML/HPKBUILD +++ b/thirdparty/LuaXML/HPKBUILD @@ -52,7 +52,6 @@ prepare() { cd $OLDPWD } build() { - cp -rf luaunit.lua $builddir-$ARCH-build/ cd $builddir-$ARCH-build cp -f $LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib/libluajit-5.1.so $LYCIUM_ROOT/usr/LuaJIT/$ARCH/lib/liblua.so make INCDIR=-I$LYCIUM_ROOT/usr/LuaJIT/$ARCH/include/luajit-2.1 \ @@ -83,17 +82,21 @@ package() { check() { echo "The test must be on an OpenHarmony device!" + # 下载测试需要lua脚本 + sure download "https://github.com/bluebird75/luaunit/archive/refs/tags/LUAUNIT_V3_4.tar.gz" "luaunit-LUAUNIT_V3_4.tar.gz" + sure unpack "luaunit-LUAUNIT_V3_4.tar.gz" + cp luaunit-LUAUNIT_V3_4/luaunit.lua $builddir-$ARCH-build/ # 使用动态库链接,由于lua的原因LD_LIBRARY_PATH无效,需要将libluajit-5.1.so.2.1.0拷贝到系统默认so查找路径 # mount -o remount,rw / # mkdir -p /usr/local/lib # export ROOT_PATH=/data/local/tmp/lycium - # cp $ROOT_PATH/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 + # cp ${ROOT_PATH}/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 # cd ${ROOT_PATH}/main/LuaXML/LuaXML-7cd4a7ab5db85222edb4c955d53e5674afd170b6-arm64-v8a-build - # export O_PATH=$PATH - # export PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/:$PATH - # make test LUA=luajit-2.1.0-beta3 + # export LUAJIT_PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/luajit-2.1.0-beta3 + # make test LUA=${LUAJIT_PATH} VERBOSE=1 # mount -o remount,ro / - # export PATH=$O_PATH + # export LUAJIT_PATH= + # export ROOT_PATH= } # 清理环境 diff --git a/thirdparty/LuaXML/LICENSE b/thirdparty/LuaXML/LICENSE deleted file mode 100644 index 81975837..00000000 --- a/thirdparty/LuaXML/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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. \ No newline at end of file diff --git a/thirdparty/LuaXML/OAT.xml b/thirdparty/LuaXML/OAT.xml index 3570f382..1e4228bf 100644 --- a/thirdparty/LuaXML/OAT.xml +++ b/thirdparty/LuaXML/OAT.xml @@ -29,7 +29,7 @@ - + diff --git a/thirdparty/LuaXML/README_zh.md b/thirdparty/LuaXML/README_zh.md index 8b639c91..7a740125 100644 --- a/thirdparty/LuaXML/README_zh.md +++ b/thirdparty/LuaXML/README_zh.md @@ -2,9 +2,9 @@ ## 功能简介 LuaXML作为一个开源项目,是在Lua和XML之间建立映射的模块。 ## 使用约束 -- IDE版本:DevEco Studio 3.1 Beta2 -- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) -- 三方库版本:5.2.5 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) +- 三方库版本:master - 当前适配的功能:读取解析xml - [MIT license](https://github.com/n1tehawk/LuaXML) diff --git a/thirdparty/LuaXML/docs/hap_integrate.md b/thirdparty/LuaXML/docs/hap_integrate.md index 6e49fbb8..33b3c421 100644 --- a/thirdparty/LuaXML/docs/hap_integrate.md +++ b/thirdparty/LuaXML/docs/hap_integrate.md @@ -3,8 +3,8 @@ ## 开发环境 - ubuntu20.04 - [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) -- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) -- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [ohos_sdk_public 4.0.8.1 (API Version 10 Release)](https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_4.0.8.1%2F20230608_091058%2Fversion-Master_Version-OpenHarmony_4.0.8.1-20230608_091058-ohos-sdk-public.tar.gz) +- [DevEco Studio 3.1 Release](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2F81%2Fv3%2FtgRUB84wR72nTfE8Ir_xMw%2Fdevecostudio-windows-3.1.0.501.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230621T074329Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) - [准备三方库构建环境](../../../tools/README.md#编译环境准备) - [准备三方库测试环境](../../../tools/README.md#ci环境准备) ## 编译三方库 @@ -18,25 +18,27 @@ ├── docs #三方库相关文档的文件夹 ├── HPKBUILD #构建脚本 ├── SHA512SUM #三方库校验文件 - ├── OAT.xml #OAT文件 + ├── OAT.xml #OAT文件 ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 ├── README_zh.md ``` -- 将LuaXML拷贝至tools/main目录下 +- 将LuaXML拷贝至lycium/main目录下 ``` cd tpc_c_cplusplus - cp thirdparty/LuaXML tools/main -rf + mkdir -p lycium/main + cp thirdparty/LuaJIT lycium/main -rf + cp thirdparty/LuaXML lycium/main -rf ``` -- 在tools目录下编译三方库 - 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) +- 在lycium目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#编译环境准备) ``` - cd tools - ./build.sh LuaJIT LuaXML + cd lycium + ./build.sh LuaXML ``` - 三方库头文件及生成的库 - 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 ``` LuaXML/armeabi-v7a LuaXML/arm64-v8a ``` @@ -47,10 +49,12 @@ - 在IDE的cpp目录下新增thirdparty目录,将编译生成的库头文件拷贝到该目录下, 如下图所示  ![thirdparty_install_dir](pic/screen_cut.jpg) +- 由于只编译了arm以及arm64so库,IDE默认会编译x86版本,需要指定ABI进行编译,如下图所示 + ![thirdparty_install_dir](pic/screen_ide.jpg) - 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 ``` #将三方库加入工程中 - target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/LuaXML/${OHOS_ARCH}/lib/LuaXML_lib.so) + target_link_libraries(entry PRIVATE -L${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/LuaXML_lib.so) #将三方库的头文件加入工程中 target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/LuaXML/${OHOS_ARCH}/include) ``` @@ -61,16 +65,17 @@ - 进入到构建目录,执行如下命令(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) 注意:以下为64位命令,如需测试32位,请将arm64-v8a替换为armeabi-v7a。 ``` +# 使用动态库链接,由于lua的原因LD_LIBRARY_PATH无效,需要将libluajit-5.1.so.2.1.0拷贝到系统默认so查找路径 mount -o remount,rw / mkdir -p /usr/local/lib -export ROOT_PATH=/data/local/tmp/lycium -cp $ROOT_PATH/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 +export ROOT_PATH=/data/local/tmp/lycium #编译工具所在的目录, 需要按实际情况修改 +cp ${ROOT_PATH}/usr/LuaJIT/arm64-v8a/lib/libluajit-5.1.so.2.1.0 /usr/local/lib/libluajit-5.1.so.2 cd ${ROOT_PATH}/main/LuaXML/LuaXML-7cd4a7ab5db85222edb4c955d53e5674afd170b6-arm64-v8a-build -export O_PATH=$PATH -export PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/:$PATH -make test LUA=luajit-2.1.0-beta3 +export LUAJIT_PATH=$ROOT_PATH/usr/LuaJIT/arm64-v8a/bin/luajit-2.1.0-beta3 +make test LUA=${LUAJIT_PATH} VERBOSE=1 mount -o remount,ro / -export PATH=$O_PATH +export LUAJIT_PATH= +export ROOT_PATH= ``` 测试用例运行结果如下: diff --git a/thirdparty/LuaXML/docs/pic/run_screen_cut.jpg b/thirdparty/LuaXML/docs/pic/run_screen_cut.jpg index 78909ccb124ca17e9717d2efa42f1c954314e552..3ac810b05e4351cd1dda795ae4b537a402a558f9 100644 GIT binary patch literal 42055 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 literal 188019 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%0DYgKRZzg0&>zx8m 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≧A{{C-H;Eh(-d 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

      4dIxq|4k^dycF!|@*H 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 z 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 Se^%f>EAWq20K{H?5B)FAOPf;w diff --git a/thirdparty/LuaXML/docs/pic/screen_cut.jpg b/thirdparty/LuaXML/docs/pic/screen_cut.jpg old mode 100644 new mode 100755 index 936c106a6397077938481bf274810a0ee6b194f1..4d15712617c87addd2af6d3dc9058e1cff197b47 GIT binary patch literal 141297 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 literal 23610 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 KznR&wJ^UZb?b7K0 diff --git a/thirdparty/LuaXML/docs/pic/screen_ide.jpg b/thirdparty/LuaXML/docs/pic/screen_ide.jpg new file mode 100755 index 0000000000000000000000000000000000000000..fbe835699bffa771665eab2a6cb3a99bac99f91b GIT binary patch literal 81274 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 N$N$Ikf&Xt4{}%%{QTqS@ literal 0 HcmV?d00001 diff --git a/thirdparty/LuaXML/luaunit.lua b/thirdparty/LuaXML/luaunit.lua deleted file mode 100644 index 6fad9a26..00000000 --- a/thirdparty/LuaXML/luaunit.lua +++ /dev/null @@ -1,3452 +0,0 @@ ---[[ - luaunit.lua - -Description: A unit testing framework -Homepage: https://github.com/bluebird75/luaunit -Development by Philippe Fremy -Based on initial work of Ryu, Gwang (http://www.gpgstudy.com/gpgiki/LuaUnit) -License: BSD License, see LICENSE.txt -]]-- - -require("math") -local M={} - --- private exported functions (for testing) -M.private = {} - -M.VERSION='3.4' -M._VERSION=M.VERSION -- For LuaUnit v2 compatibility - --- a version which distinguish between regular Lua and LuaJit -M._LUAVERSION = (jit and jit.version) or _VERSION - ---[[ Some people like assertEquals( actual, expected ) and some people prefer -assertEquals( expected, actual ). -]]-- -M.ORDER_ACTUAL_EXPECTED = true -M.PRINT_TABLE_REF_IN_ERROR_MSG = false -M.LINE_LENGTH = 80 -M.TABLE_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items -M.LIST_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items - --- this setting allow to remove entries from the stack-trace, for --- example to hide a call to a framework which would be calling luaunit -M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE = 0 - ---[[ EPS is meant to help with Lua's floating point math in simple corner -cases like almostEquals(1.1-0.1, 1), which may not work as-is (e.g. on numbers -with rational binary representation) if the user doesn't provide some explicit -error margin. - -The default margin used by almostEquals() in such cases is EPS; and since -Lua may be compiled with different numeric precisions (single vs. double), we -try to select a useful default for it dynamically. Note: If the initial value -is not acceptable, it can be changed by the user to better suit specific needs. - -See also: https://en.wikipedia.org/wiki/Machine_epsilon -]] -M.EPS = 2^-52 -- = machine epsilon for "double", ~2.22E-16 -if math.abs(1.1 - 1 - 0.1) > M.EPS then - -- rounding error is above EPS, assume single precision - M.EPS = 2^-23 -- = machine epsilon for "float", ~1.19E-07 -end - --- set this to false to debug luaunit -local STRIP_LUAUNIT_FROM_STACKTRACE = true - -M.VERBOSITY_DEFAULT = 10 -M.VERBOSITY_LOW = 1 -M.VERBOSITY_QUIET = 0 -M.VERBOSITY_VERBOSE = 20 -M.DEFAULT_DEEP_ANALYSIS = nil -M.FORCE_DEEP_ANALYSIS = true -M.DISABLE_DEEP_ANALYSIS = false - --- set EXPORT_ASSERT_TO_GLOBALS to have all asserts visible as global values --- EXPORT_ASSERT_TO_GLOBALS = true - --- we need to keep a copy of the script args before it is overriden -local cmdline_argv = rawget(_G, "arg") - -M.FAILURE_PREFIX = 'LuaUnit test FAILURE: ' -- prefix string for failed tests -M.SUCCESS_PREFIX = 'LuaUnit test SUCCESS: ' -- prefix string for successful tests finished early -M.SKIP_PREFIX = 'LuaUnit test SKIP: ' -- prefix string for skipped tests - - - -M.USAGE=[[Usage: lua [options] [testname1 [testname2] ... ] -Options: - -h, --help: Print this help - --version: Print version information - -v, --verbose: Increase verbosity - -q, --quiet: Set verbosity to minimum - -e, --error: Stop on first error - -f, --failure: Stop on first failure or error - -s, --shuffle: Shuffle tests before running them - -o, --output OUTPUT: Set output type to OUTPUT - Possible values: text, tap, junit, nil - -n, --name NAME: For junit only, mandatory name of xml file - -r, --repeat NUM: Execute all tests NUM times, e.g. to trig the JIT - -p, --pattern PATTERN: Execute all test names matching the Lua PATTERN - May be repeated to include several patterns - Make sure you escape magic chars like +? with % - -x, --exclude PATTERN: Exclude all test names matching the Lua PATTERN - May be repeated to exclude several patterns - Make sure you escape magic chars like +? with % - testname1, testname2, ... : tests to run in the form of testFunction, - TestClass or TestClass.testMethod - -You may also control LuaUnit options with the following environment variables: -* LUAUNIT_OUTPUT: same as --output -* LUAUNIT_JUNIT_FNAME: same as --name ]] - ----------------------------------------------------------------- --- --- general utility functions --- ----------------------------------------------------------------- - ---[[ Note on catching exit - -I have seen the case where running a big suite of test cases and one of them would -perform a os.exit(0), making the outside world think that the full test suite was executed -successfully. - -This is an attempt to mitigate this problem: we override os.exit() to now let a test -exit the framework while we are running. When we are not running, it behaves normally. -]] - -M.oldOsExit = os.exit -os.exit = function(...) - if M.LuaUnit and #M.LuaUnit.instances ~= 0 then - local msg = [[You are trying to exit but there is still a running instance of LuaUnit. -LuaUnit expects to run until the end before exiting with a complete status of successful/failed tests. - -To force exit LuaUnit while running, please call before os.exit (assuming lu is the luaunit module loaded): - - lu.unregisterCurrentSuite() - -]] - M.private.error_fmt(2, msg) - end - M.oldOsExit(...) -end - -local function pcall_or_abort(func, ...) - -- unpack is a global function for Lua 5.1, otherwise use table.unpack - local unpack = rawget(_G, "unpack") or table.unpack - local result = {pcall(func, ...)} - if not result[1] then - -- an error occurred - print(result[2]) -- error message - print() - print(M.USAGE) - os.exit(-1) - end - return unpack(result, 2) -end - -local crossTypeOrdering = { - number = 1, boolean = 2, string = 3, table = 4, other = 5 -} -local crossTypeComparison = { - number = function(a, b) return a < b end, - string = function(a, b) return a < b end, - other = function(a, b) return tostring(a) < tostring(b) end, -} - -local function crossTypeSort(a, b) - local type_a, type_b = type(a), type(b) - if type_a == type_b then - local func = crossTypeComparison[type_a] or crossTypeComparison.other - return func(a, b) - end - type_a = crossTypeOrdering[type_a] or crossTypeOrdering.other - type_b = crossTypeOrdering[type_b] or crossTypeOrdering.other - return type_a < type_b -end - -local function __genSortedIndex( t ) - -- Returns a sequence consisting of t's keys, sorted. - local sortedIndex = {} - - for key,_ in pairs(t) do - table.insert(sortedIndex, key) - end - - table.sort(sortedIndex, crossTypeSort) - return sortedIndex -end -M.private.__genSortedIndex = __genSortedIndex - -local function sortedNext(state, control) - -- Equivalent of the next() function of table iteration, but returns the - -- keys in sorted order (see __genSortedIndex and crossTypeSort). - -- The state is a temporary variable during iteration and contains the - -- sorted key table (state.sortedIdx). It also stores the last index (into - -- the keys) used by the iteration, to find the next one quickly. - local key - - --print("sortedNext: control = "..tostring(control) ) - if control == nil then - -- start of iteration - state.count = #state.sortedIdx - state.lastIdx = 1 - key = state.sortedIdx[1] - return key, state.t[key] - end - - -- normally, we expect the control variable to match the last key used - if control ~= state.sortedIdx[state.lastIdx] then - -- strange, we have to find the next value by ourselves - -- the key table is sorted in crossTypeSort() order! -> use bisection - local lower, upper = 1, state.count - repeat - state.lastIdx = math.modf((lower + upper) / 2) - key = state.sortedIdx[state.lastIdx] - if key == control then - break -- key found (and thus prev index) - end - if crossTypeSort(key, control) then - -- key < control, continue search "right" (towards upper bound) - lower = state.lastIdx + 1 - else - -- key > control, continue search "left" (towards lower bound) - upper = state.lastIdx - 1 - end - until lower > upper - if lower > upper then -- only true if the key wasn't found, ... - state.lastIdx = state.count -- ... so ensure no match in code below - end - end - - -- proceed by retrieving the next value (or nil) from the sorted keys - state.lastIdx = state.lastIdx + 1 - key = state.sortedIdx[state.lastIdx] - if key then - return key, state.t[key] - end - - -- getting here means returning `nil`, which will end the iteration -end - -local function sortedPairs(tbl) - -- Equivalent of the pairs() function on tables. Allows to iterate in - -- sorted order. As required by "generic for" loops, this will return the - -- iterator (function), an "invariant state", and the initial control value. - -- (see http://www.lua.org/pil/7.2.html) - return sortedNext, {t = tbl, sortedIdx = __genSortedIndex(tbl)}, nil -end -M.private.sortedPairs = sortedPairs - --- seed the random with a strongly varying seed -math.randomseed(math.floor(os.clock()*1E11)) - -local function randomizeTable( t ) - -- randomize the item orders of the table t - for i = #t, 2, -1 do - local j = math.random(i) - if i ~= j then - t[i], t[j] = t[j], t[i] - end - end -end -M.private.randomizeTable = randomizeTable - -local function strsplit(delimiter, text) --- Split text into a list consisting of the strings in text, separated --- by strings matching delimiter (which may _NOT_ be a pattern). --- Example: strsplit(", ", "Anna, Bob, Charlie, Dolores") - if delimiter == "" or delimiter == nil then -- this would result in endless loops - error("delimiter is nil or empty string!") - end - if text == nil then - return nil - end - - local list, pos, first, last = {}, 1 - while true do - first, last = text:find(delimiter, pos, true) - if first then -- found? - table.insert(list, text:sub(pos, first - 1)) - pos = last + 1 - else - table.insert(list, text:sub(pos)) - break - end - end - return list -end -M.private.strsplit = strsplit - -local function hasNewLine( s ) - -- return true if s has a newline - return (string.find(s, '\n', 1, true) ~= nil) -end -M.private.hasNewLine = hasNewLine - -local function prefixString( prefix, s ) - -- Prefix all the lines of s with prefix - return prefix .. string.gsub(s, '\n', '\n' .. prefix) -end -M.private.prefixString = prefixString - -local function strMatch(s, pattern, start, final ) - -- return true if s matches completely the pattern from index start to index end - -- return false in every other cases - -- if start is nil, matches from the beginning of the string - -- if final is nil, matches to the end of the string - start = start or 1 - final = final or string.len(s) - - local foundStart, foundEnd = string.find(s, pattern, start, false) - return foundStart == start and foundEnd == final -end -M.private.strMatch = strMatch - -local function patternFilter(patterns, expr) - -- Run `expr` through the inclusion and exclusion rules defined in patterns - -- and return true if expr shall be included, false for excluded. - -- Inclusion pattern are defined as normal patterns, exclusions - -- patterns start with `!` and are followed by a normal pattern - - -- result: nil = UNKNOWN (not matched yet), true = ACCEPT, false = REJECT - -- default: true if no explicit "include" is found, set to false otherwise - local default, result = true, nil - - if patterns ~= nil then - for _, pattern in ipairs(patterns) do - local exclude = pattern:sub(1,1) == '!' - if exclude then - pattern = pattern:sub(2) - else - -- at least one include pattern specified, a match is required - default = false - end - -- print('pattern: ',pattern) - -- print('exclude: ',exclude) - -- print('default: ',default) - - if string.find(expr, pattern) then - -- set result to false when excluding, true otherwise - result = not exclude - end - end - end - - if result ~= nil then - return result - end - return default -end -M.private.patternFilter = patternFilter - -local function xmlEscape( s ) - -- Return s escaped for XML attributes - -- escapes table: - -- " " - -- ' ' - -- < < - -- > > - -- & & - - return string.gsub( s, '.', { - ['&'] = "&", - ['"'] = """, - ["'"] = "'", - ['<'] = "<", - ['>'] = ">", - } ) -end -M.private.xmlEscape = xmlEscape - -local function xmlCDataEscape( s ) - -- Return s escaped for CData section, escapes: "]]>" - return string.gsub( s, ']]>', ']]>' ) -end -M.private.xmlCDataEscape = xmlCDataEscape - - -local function lstrip( s ) - --[[Return s with all leading white spaces and tabs removed]] - local idx = 0 - while idx < s:len() do - idx = idx + 1 - local c = s:sub(idx,idx) - if c ~= ' ' and c ~= '\t' then - break - end - end - return s:sub(idx) -end -M.private.lstrip = lstrip - -local function extractFileLineInfo( s ) - --[[ From a string in the form "(leading spaces) dir1/dir2\dir3\file.lua:linenb: msg" - - Return the "file.lua:linenb" information - ]] - local s2 = lstrip(s) - local firstColon = s2:find(':', 1, true) - if firstColon == nil then - -- string is not in the format file:line: - return s - end - local secondColon = s2:find(':', firstColon+1, true) - if secondColon == nil then - -- string is not in the format file:line: - return s - end - - return s2:sub(1, secondColon-1) -end -M.private.extractFileLineInfo = extractFileLineInfo - - -local function stripLuaunitTrace2( stackTrace, errMsg ) - --[[ - -- Example of a traceback: - < - [C]: in function 'xpcall' - ./luaunit.lua:1449: in function 'protectedCall' - ./luaunit.lua:1508: in function 'execOneFunction' - ./luaunit.lua:1596: in function 'runSuiteByInstances' - ./luaunit.lua:1660: in function 'runSuiteByNames' - ./luaunit.lua:1736: in function 'runSuite' - example_with_luaunit.lua:140: in main chunk - [C]: in ?>> - error message: <> - - Other example: - < - [C]: in function 'xpcall' - ./luaunit.lua:1517: in function 'protectedCall' - ./luaunit.lua:1578: in function 'execOneFunction' - ./luaunit.lua:1677: in function 'runSuiteByInstances' - ./luaunit.lua:1730: in function 'runSuiteByNames' - ./luaunit.lua:1806: in function 'runSuite' - example_with_luaunit.lua:140: in main chunk - [C]: in ?>> - error message: <> - - < - [C]: in function 'xpcall' - luaunit2/luaunit.lua:1532: in function 'protectedCall' - luaunit2/luaunit.lua:1591: in function 'execOneFunction' - luaunit2/luaunit.lua:1679: in function 'runSuiteByInstances' - luaunit2/luaunit.lua:1743: in function 'runSuiteByNames' - luaunit2/luaunit.lua:1819: in function 'runSuite' - luaunit2/example_with_luaunit.lua:140: in main chunk - [C]: in ?>> - error message: <> - - - -- first line is "stack traceback": KEEP - -- next line may be luaunit line: REMOVE - -- next lines are call in the program under testOk: REMOVE - -- next lines are calls from luaunit to call the program under test: KEEP - - -- Strategy: - -- keep first line - -- remove lines that are part of luaunit - -- kepp lines until we hit a luaunit line - - The strategy for stripping is: - * keep first line "stack traceback:" - * part1: - * analyse all lines of the stack from bottom to top of the stack (first line to last line) - * extract the "file:line:" part of the line - * compare it with the "file:line" part of the error message - * if it does not match strip the line - * if it matches, keep the line and move to part 2 - * part2: - * anything NOT starting with luaunit.lua is the interesting part of the stack trace - * anything starting again with luaunit.lua is part of the test launcher and should be stripped out - ]] - - local function isLuaunitInternalLine( s ) - -- return true if line of stack trace comes from inside luaunit - return s:find('[/\\]luaunit%.lua:%d+: ') ~= nil - end - - -- print( '<<'..stackTrace..'>>' ) - - local t = strsplit( '\n', stackTrace ) - -- print( prettystr(t) ) - - local idx = 2 - - local errMsgFileLine = extractFileLineInfo(errMsg) - -- print('emfi="'..errMsgFileLine..'"') - - -- remove lines that are still part of luaunit - while t[idx] and extractFileLineInfo(t[idx]) ~= errMsgFileLine do - -- print('Removing : '..t[idx] ) - table.remove(t, idx) - end - - -- keep lines until we hit luaunit again - while t[idx] and (not isLuaunitInternalLine(t[idx])) do - -- print('Keeping : '..t[idx] ) - idx = idx + 1 - end - - -- remove remaining luaunit lines - while t[idx] do - -- print('Removing2 : '..t[idx] ) - table.remove(t, idx) - end - - -- print( prettystr(t) ) - return table.concat( t, '\n') - -end -M.private.stripLuaunitTrace2 = stripLuaunitTrace2 - - -local function prettystr_sub(v, indentLevel, printTableRefs, cycleDetectTable ) - local type_v = type(v) - if "string" == type_v then - -- use clever delimiters according to content: - -- enclose with single quotes if string contains ", but no ' - if v:find('"', 1, true) and not v:find("'", 1, true) then - return "'" .. v .. "'" - end - -- use double quotes otherwise, escape embedded " - return '"' .. v:gsub('"', '\\"') .. '"' - - elseif "table" == type_v then - --if v.__class__ then - -- return string.gsub( tostring(v), 'table', v.__class__ ) - --end - return M.private._table_tostring(v, indentLevel, printTableRefs, cycleDetectTable) - - elseif "number" == type_v then - -- eliminate differences in formatting between various Lua versions - if v ~= v then - return "#NaN" -- "not a number" - end - if v == math.huge then - return "#Inf" -- "infinite" - end - if v == -math.huge then - return "-#Inf" - end - if _VERSION == "Lua 5.3" then - local i = math.tointeger(v) - if i then - return tostring(i) - end - end - end - - return tostring(v) -end - -local function prettystr( v ) - --[[ Pretty string conversion, to display the full content of a variable of any type. - - * string are enclosed with " by default, or with ' if string contains a " - * tables are expanded to show their full content, with indentation in case of nested tables - ]]-- - local cycleDetectTable = {} - local s = prettystr_sub(v, 1, M.PRINT_TABLE_REF_IN_ERROR_MSG, cycleDetectTable) - if cycleDetectTable.detected and not M.PRINT_TABLE_REF_IN_ERROR_MSG then - -- some table contain recursive references, - -- so we must recompute the value by including all table references - -- else the result looks like crap - cycleDetectTable = {} - s = prettystr_sub(v, 1, true, cycleDetectTable) - end - return s -end -M.prettystr = prettystr - -function M.adjust_err_msg_with_iter( err_msg, iter_msg ) - --[[ Adjust the error message err_msg: trim the FAILURE_PREFIX or SUCCESS_PREFIX information if needed, - add the iteration message if any and return the result. - - err_msg: string, error message captured with pcall - iter_msg: a string describing the current iteration ("iteration N") or nil - if there is no iteration in this test. - - Returns: (new_err_msg, test_status) - new_err_msg: string, adjusted error message, or nil in case of success - test_status: M.NodeStatus.FAIL, SUCCESS or ERROR according to the information - contained in the error message. - ]] - if iter_msg then - iter_msg = iter_msg..', ' - else - iter_msg = '' - end - - local RE_FILE_LINE = '.*:%d+: ' - - -- error message is not necessarily a string, - -- so convert the value to string with prettystr() - if type( err_msg ) ~= 'string' then - err_msg = prettystr( err_msg ) - end - - if (err_msg:find( M.SUCCESS_PREFIX ) == 1) or err_msg:match( '('..RE_FILE_LINE..')' .. M.SUCCESS_PREFIX .. ".*" ) then - -- test finished early with success() - return nil, M.NodeStatus.SUCCESS - end - - if (err_msg:find( M.SKIP_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.SKIP_PREFIX .. ".*" ) ~= nil) then - -- substitute prefix by iteration message - err_msg = err_msg:gsub('.*'..M.SKIP_PREFIX, iter_msg, 1) - -- print("failure detected") - return err_msg, M.NodeStatus.SKIP - end - - if (err_msg:find( M.FAILURE_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.FAILURE_PREFIX .. ".*" ) ~= nil) then - -- substitute prefix by iteration message - err_msg = err_msg:gsub(M.FAILURE_PREFIX, iter_msg, 1) - -- print("failure detected") - return err_msg, M.NodeStatus.FAIL - end - - - - -- print("error detected") - -- regular error, not a failure - if iter_msg then - local match - -- "./test\\test_luaunit.lua:2241: some error msg - match = err_msg:match( '(.*:%d+: ).*' ) - if match then - err_msg = err_msg:gsub( match, match .. iter_msg ) - else - -- no file:line: infromation, just add the iteration info at the beginning of the line - err_msg = iter_msg .. err_msg - end - end - return err_msg, M.NodeStatus.ERROR -end - -local function tryMismatchFormatting( table_a, table_b, doDeepAnalysis, margin ) - --[[ - Prepares a nice error message when comparing tables, performing a deeper - analysis. - - Arguments: - * table_a, table_b: tables to be compared - * doDeepAnalysis: - M.DEFAULT_DEEP_ANALYSIS: (the default if not specified) perform deep analysis only for big lists and big dictionnaries - M.FORCE_DEEP_ANALYSIS : always perform deep analysis - M.DISABLE_DEEP_ANALYSIS: never perform deep analysis - * margin: supplied only for almost equality - - Returns: {success, result} - * success: false if deep analysis could not be performed - in this case, just use standard assertion message - * result: if success is true, a multi-line string with deep analysis of the two lists - ]] - - -- check if table_a & table_b are suitable for deep analysis - if type(table_a) ~= 'table' or type(table_b) ~= 'table' then - return false - end - - if doDeepAnalysis == M.DISABLE_DEEP_ANALYSIS then - return false - end - - local len_a, len_b, isPureList = #table_a, #table_b, true - - for k1, v1 in pairs(table_a) do - if type(k1) ~= 'number' or k1 > len_a then - -- this table a mapping - isPureList = false - break - end - end - - if isPureList then - for k2, v2 in pairs(table_b) do - if type(k2) ~= 'number' or k2 > len_b then - -- this table a mapping - isPureList = false - break - end - end - end - - if isPureList and math.min(len_a, len_b) < M.LIST_DIFF_ANALYSIS_THRESHOLD then - if not (doDeepAnalysis == M.FORCE_DEEP_ANALYSIS) then - return false - end - end - - if isPureList then - return M.private.mismatchFormattingPureList( table_a, table_b, margin ) - else - -- only work on mapping for the moment - -- return M.private.mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) - return false - end -end -M.private.tryMismatchFormatting = tryMismatchFormatting - -local function getTaTbDescr() - if not M.ORDER_ACTUAL_EXPECTED then - return 'expected', 'actual' - end - return 'actual', 'expected' -end - -local function extendWithStrFmt( res, ... ) - table.insert( res, string.format( ... ) ) -end - -local function mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) - --[[ - Prepares a nice error message when comparing tables which are not pure lists, performing a deeper - analysis. - - Returns: {success, result} - * success: false if deep analysis could not be performed - in this case, just use standard assertion message - * result: if success is true, a multi-line string with deep analysis of the two lists - ]] - - -- disable for the moment - --[[ - local result = {} - local descrTa, descrTb = getTaTbDescr() - - local keysCommon = {} - local keysOnlyTa = {} - local keysOnlyTb = {} - local keysDiffTaTb = {} - - local k, v - - for k,v in pairs( table_a ) do - if is_equal( v, table_b[k] ) then - table.insert( keysCommon, k ) - else - if table_b[k] == nil then - table.insert( keysOnlyTa, k ) - else - table.insert( keysDiffTaTb, k ) - end - end - end - - for k,v in pairs( table_b ) do - if not is_equal( v, table_a[k] ) and table_a[k] == nil then - table.insert( keysOnlyTb, k ) - end - end - - local len_a = #keysCommon + #keysDiffTaTb + #keysOnlyTa - local len_b = #keysCommon + #keysDiffTaTb + #keysOnlyTb - local limited_display = (len_a < 5 or len_b < 5) - - if math.min(len_a, len_b) < M.TABLE_DIFF_ANALYSIS_THRESHOLD then - return false - end - - if not limited_display then - if len_a == len_b then - extendWithStrFmt( result, 'Table A (%s) and B (%s) both have %d items', descrTa, descrTb, len_a ) - else - extendWithStrFmt( result, 'Table A (%s) has %d items and table B (%s) has %d items', descrTa, len_a, descrTb, len_b ) - end - - if #keysCommon == 0 and #keysDiffTaTb == 0 then - table.insert( result, 'Table A and B have no keys in common, they are totally different') - else - local s_other = 'other ' - if #keysCommon then - extendWithStrFmt( result, 'Table A and B have %d identical items', #keysCommon ) - else - table.insert( result, 'Table A and B have no identical items' ) - s_other = '' - end - - if #keysDiffTaTb ~= 0 then - result[#result] = string.format( '%s and %d items differing present in both tables', result[#result], #keysDiffTaTb) - else - result[#result] = string.format( '%s and no %sitems differing present in both tables', result[#result], s_other, #keysDiffTaTb) - end - end - - extendWithStrFmt( result, 'Table A has %d keys not present in table B and table B has %d keys not present in table A', #keysOnlyTa, #keysOnlyTb ) - end - - local function keytostring(k) - if "string" == type(k) and k:match("^[_%a][_%w]*$") then - return k - end - return prettystr(k) - end - - if #keysDiffTaTb ~= 0 then - table.insert( result, 'Items differing in A and B:') - for k,v in sortedPairs( keysDiffTaTb ) do - extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) - extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) - end - end - - if #keysOnlyTa ~= 0 then - table.insert( result, 'Items only in table A:' ) - for k,v in sortedPairs( keysOnlyTa ) do - extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) - end - end - - if #keysOnlyTb ~= 0 then - table.insert( result, 'Items only in table B:' ) - for k,v in sortedPairs( keysOnlyTb ) do - extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) - end - end - - if #keysCommon ~= 0 then - table.insert( result, 'Items common to A and B:') - for k,v in sortedPairs( keysCommon ) do - extendWithStrFmt( result, ' = A and B [%s]: %s', keytostring(v), prettystr(table_a[v]) ) - end - end - - return true, table.concat( result, '\n') - ]] -end -M.private.mismatchFormattingMapping = mismatchFormattingMapping - -local function mismatchFormattingPureList( table_a, table_b, margin ) - --[[ - Prepares a nice error message when comparing tables which are lists, performing a deeper - analysis. - - margin is supplied only for almost equality - - Returns: {success, result} - * success: false if deep analysis could not be performed - in this case, just use standard assertion message - * result: if success is true, a multi-line string with deep analysis of the two lists - ]] - local result, descrTa, descrTb = {}, getTaTbDescr() - - local len_a, len_b, refa, refb = #table_a, #table_b, '', '' - if M.PRINT_TABLE_REF_IN_ERROR_MSG then - refa, refb = string.format( '<%s> ', M.private.table_ref(table_a)), string.format('<%s> ', M.private.table_ref(table_b) ) - end - local longest, shortest = math.max(len_a, len_b), math.min(len_a, len_b) - local deltalv = longest - shortest - - local commonUntil = shortest - for i = 1, shortest do - if not M.private.is_table_equals(table_a[i], table_b[i], margin) then - commonUntil = i - 1 - break - end - end - - local commonBackTo = shortest - 1 - for i = 0, shortest - 1 do - if not M.private.is_table_equals(table_a[len_a-i], table_b[len_b-i], margin) then - commonBackTo = i - 1 - break - end - end - - - table.insert( result, 'List difference analysis:' ) - if len_a == len_b then - -- TODO: handle expected/actual naming - extendWithStrFmt( result, '* lists %sA (%s) and %sB (%s) have the same size', refa, descrTa, refb, descrTb ) - else - extendWithStrFmt( result, '* list sizes differ: list %sA (%s) has %d items, list %sB (%s) has %d items', refa, descrTa, len_a, refb, descrTb, len_b ) - end - - extendWithStrFmt( result, '* lists A and B start differing at index %d', commonUntil+1 ) - if commonBackTo >= 0 then - if deltalv > 0 then - extendWithStrFmt( result, '* lists A and B are equal again from index %d for A, %d for B', len_a-commonBackTo, len_b-commonBackTo ) - else - extendWithStrFmt( result, '* lists A and B are equal again from index %d', len_a-commonBackTo ) - end - end - - local function insertABValue(ai, bi) - bi = bi or ai - if M.private.is_table_equals( table_a[ai], table_b[bi], margin) then - return extendWithStrFmt( result, ' = A[%d], B[%d]: %s', ai, bi, prettystr(table_a[ai]) ) - else - extendWithStrFmt( result, ' - A[%d]: %s', ai, prettystr(table_a[ai])) - extendWithStrFmt( result, ' + B[%d]: %s', bi, prettystr(table_b[bi])) - end - end - - -- common parts to list A & B, at the beginning - if commonUntil > 0 then - table.insert( result, '* Common parts:' ) - for i = 1, commonUntil do - insertABValue( i ) - end - end - - -- diffing parts to list A & B - if commonUntil < shortest - commonBackTo - 1 then - table.insert( result, '* Differing parts:' ) - for i = commonUntil + 1, shortest - commonBackTo - 1 do - insertABValue( i ) - end - end - - -- display indexes of one list, with no match on other list - if shortest - commonBackTo <= longest - commonBackTo - 1 then - table.insert( result, '* Present only in one list:' ) - for i = shortest - commonBackTo, longest - commonBackTo - 1 do - if len_a > len_b then - extendWithStrFmt( result, ' - A[%d]: %s', i, prettystr(table_a[i]) ) - -- table.insert( result, '+ (no matching B index)') - else - -- table.insert( result, '- no matching A index') - extendWithStrFmt( result, ' + B[%d]: %s', i, prettystr(table_b[i]) ) - end - end - end - - -- common parts to list A & B, at the end - if commonBackTo >= 0 then - table.insert( result, '* Common parts at the end of the lists' ) - for i = longest - commonBackTo, longest do - if len_a > len_b then - insertABValue( i, i-deltalv ) - else - insertABValue( i-deltalv, i ) - end - end - end - - return true, table.concat( result, '\n') -end -M.private.mismatchFormattingPureList = mismatchFormattingPureList - -local function prettystrPairs(value1, value2, suffix_a, suffix_b) - --[[ - This function helps with the recurring task of constructing the "expected - vs. actual" error messages. It takes two arbitrary values and formats - corresponding strings with prettystr(). - - To keep the (possibly complex) output more readable in case the resulting - strings contain line breaks, they get automatically prefixed with additional - newlines. Both suffixes are optional (default to empty strings), and get - appended to the "value1" string. "suffix_a" is used if line breaks were - encountered, "suffix_b" otherwise. - - Returns the two formatted strings (including padding/newlines). - ]] - local str1, str2 = prettystr(value1), prettystr(value2) - if hasNewLine(str1) or hasNewLine(str2) then - -- line break(s) detected, add padding - return "\n" .. str1 .. (suffix_a or ""), "\n" .. str2 - end - return str1 .. (suffix_b or ""), str2 -end -M.private.prettystrPairs = prettystrPairs - -local UNKNOWN_REF = 'table 00-unknown ref' -local ref_generator = { value=1, [UNKNOWN_REF]=0 } - -local function table_ref( t ) - -- return the default tostring() for tables, with the table ID, even if the table has a metatable - -- with the __tostring converter - local ref = '' - local mt = getmetatable( t ) - if mt == nil then - ref = tostring(t) - else - local success, result - success, result = pcall(setmetatable, t, nil) - if not success then - -- protected table, if __tostring is defined, we can - -- not get the reference. And we can not know in advance. - ref = tostring(t) - if not ref:match( 'table: 0?x?[%x]+' ) then - return UNKNOWN_REF - end - else - ref = tostring(t) - setmetatable( t, mt ) - end - end - -- strip the "table: " part - ref = ref:sub(8) - if ref ~= UNKNOWN_REF and ref_generator[ref] == nil then - -- Create a new reference number - ref_generator[ref] = ref_generator.value - ref_generator.value = ref_generator.value+1 - end - if M.PRINT_TABLE_REF_IN_ERROR_MSG then - return string.format('table %02d-%s', ref_generator[ref], ref) - else - return string.format('table %02d', ref_generator[ref]) - end -end -M.private.table_ref = table_ref - -local TABLE_TOSTRING_SEP = ", " -local TABLE_TOSTRING_SEP_LEN = string.len(TABLE_TOSTRING_SEP) - -local function _table_tostring( tbl, indentLevel, printTableRefs, cycleDetectTable ) - printTableRefs = printTableRefs or M.PRINT_TABLE_REF_IN_ERROR_MSG - cycleDetectTable = cycleDetectTable or {} - cycleDetectTable[tbl] = true - - local result, dispOnMultLines = {}, false - - -- like prettystr but do not enclose with "" if the string is just alphanumerical - -- this is better for displaying table keys who are often simple strings - local function keytostring(k) - if "string" == type(k) and k:match("^[_%a][_%w]*$") then - return k - end - return prettystr_sub(k, indentLevel+1, printTableRefs, cycleDetectTable) - end - - local mt = getmetatable( tbl ) - - if mt and mt.__tostring then - -- if table has a __tostring() function in its metatable, use it to display the table - -- else, compute a regular table - result = tostring(tbl) - if type(result) ~= 'string' then - return string.format( '', prettystr(result) ) - end - result = strsplit( '\n', result ) - return M.private._table_tostring_format_multiline_string( result, indentLevel ) - - else - -- no metatable, compute the table representation - - local entry, count, seq_index = nil, 0, 1 - for k, v in sortedPairs( tbl ) do - - -- key part - if k == seq_index then - -- for the sequential part of tables, we'll skip the "=" output - entry = '' - seq_index = seq_index + 1 - elseif cycleDetectTable[k] then - -- recursion in the key detected - cycleDetectTable.detected = true - entry = "<"..table_ref(k)..">=" - else - entry = keytostring(k) .. "=" - end - - -- value part - if cycleDetectTable[v] then - -- recursion in the value detected! - cycleDetectTable.detected = true - entry = entry .. "<"..table_ref(v)..">" - else - entry = entry .. - prettystr_sub( v, indentLevel+1, printTableRefs, cycleDetectTable ) - end - count = count + 1 - result[count] = entry - end - return M.private._table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) - end - -end -M.private._table_tostring = _table_tostring -- prettystr_sub() needs it - -local function _table_tostring_format_multiline_string( tbl_str, indentLevel ) - local indentString = '\n'..string.rep(" ", indentLevel - 1) - return table.concat( tbl_str, indentString ) - -end -M.private._table_tostring_format_multiline_string = _table_tostring_format_multiline_string - - -local function _table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) - -- final function called in _table_to_string() to format the resulting list of - -- string describing the table. - - local dispOnMultLines = false - - -- set dispOnMultLines to true if the maximum LINE_LENGTH would be exceeded with the values - local totalLength = 0 - for k, v in ipairs( result ) do - totalLength = totalLength + string.len( v ) - if totalLength >= M.LINE_LENGTH then - dispOnMultLines = true - break - end - end - - -- set dispOnMultLines to true if the max LINE_LENGTH would be exceeded - -- with the values and the separators. - if not dispOnMultLines then - -- adjust with length of separator(s): - -- two items need 1 sep, three items two seps, ... plus len of '{}' - if #result > 0 then - totalLength = totalLength + TABLE_TOSTRING_SEP_LEN * (#result - 1) - end - dispOnMultLines = (totalLength + 2 >= M.LINE_LENGTH) - end - - -- now reformat the result table (currently holding element strings) - if dispOnMultLines then - local indentString = string.rep(" ", indentLevel - 1) - result = { - "{\n ", - indentString, - table.concat(result, ",\n " .. indentString), - "\n", - indentString, - "}" - } - else - result = {"{", table.concat(result, TABLE_TOSTRING_SEP), "}"} - end - if printTableRefs then - table.insert(result, 1, "<"..table_ref(tbl).."> ") -- prepend table ref - end - return table.concat(result) -end -M.private._table_tostring_format_result = _table_tostring_format_result -- prettystr_sub() needs it - -local function table_findkeyof(t, element) - -- Return the key k of the given element in table t, so that t[k] == element - -- (or `nil` if element is not present within t). Note that we use our - -- 'general' is_equal comparison for matching, so this function should - -- handle table-type elements gracefully and consistently. - if type(t) == "table" then - for k, v in pairs(t) do - if M.private.is_table_equals(v, element) then - return k - end - end - end - return nil -end - -local function _is_table_items_equals(actual, expected ) - local type_a, type_e = type(actual), type(expected) - - if type_a ~= type_e then - return false - - elseif (type_a == 'table') --[[and (type_e == 'table')]] then - for k, v in pairs(actual) do - if table_findkeyof(expected, v) == nil then - return false -- v not contained in expected - end - end - for k, v in pairs(expected) do - if table_findkeyof(actual, v) == nil then - return false -- v not contained in actual - end - end - return true - - elseif actual ~= expected then - return false - end - - return true -end - ---[[ -This is a specialized metatable to help with the bookkeeping of recursions -in _is_table_equals(). It provides an __index table that implements utility -functions for easier management of the table. The "cached" method queries -the state of a specific (actual,expected) pair; and the "store" method sets -this state to the given value. The state of pairs not "seen" / visited is -assumed to be `nil`. -]] -local _recursion_cache_MT = { - __index = { - -- Return the cached value for an (actual,expected) pair (or `nil`) - cached = function(t, actual, expected) - local subtable = t[actual] or {} - return subtable[expected] - end, - - -- Store cached value for a specific (actual,expected) pair. - -- Returns the value, so it's easy to use for a "tailcall" (return ...). - store = function(t, actual, expected, value, asymmetric) - local subtable = t[actual] - if not subtable then - subtable = {} - t[actual] = subtable - end - subtable[expected] = value - - -- Unless explicitly marked "asymmetric": Consider the recursion - -- on (expected,actual) to be equivalent to (actual,expected) by - -- default, and thus cache the value for both. - if not asymmetric then - t:store(expected, actual, value, true) - end - - return value - end - } -} - -local function _is_table_equals(actual, expected, cycleDetectTable, marginForAlmostEqual) - --[[Returns true if both table are equal. - - If argument marginForAlmostEqual is suppied, number comparison is done using alomstEqual instead - of strict equality. - - cycleDetectTable is an internal argument used during recursion on tables. - ]] - --print('_is_table_equals( \n '..prettystr(actual)..'\n , '..prettystr(expected).. - -- '\n , '..prettystr(cycleDetectTable)..'\n , '..prettystr(marginForAlmostEqual)..' )') - - local type_a, type_e = type(actual), type(expected) - - if type_a ~= type_e then - return false -- different types won't match - end - - if type_a == 'number' then - if marginForAlmostEqual ~= nil then - return M.almostEquals(actual, expected, marginForAlmostEqual) - else - return actual == expected - end - elseif type_a ~= 'table' then - -- other types compare directly - return actual == expected - end - - cycleDetectTable = cycleDetectTable or { actual={}, expected={} } - if cycleDetectTable.actual[ actual ] then - -- oh, we hit a cycle in actual - if cycleDetectTable.expected[ expected ] then - -- uh, we hit a cycle at the same time in expected - -- so the two tables have similar structure - return true - end - - -- cycle was hit only in actual, the structure differs from expected - return false - end - - if cycleDetectTable.expected[ expected ] then - -- no cycle in actual, but cycle in expected - -- the structure differ - return false - end - - -- at this point, no table cycle detected, we are - -- seeing this table for the first time - - -- mark the cycle detection - cycleDetectTable.actual[ actual ] = true - cycleDetectTable.expected[ expected ] = true - - - local actualKeysMatched = {} - for k, v in pairs(actual) do - actualKeysMatched[k] = true -- Keep track of matched keys - if not _is_table_equals(v, expected[k], cycleDetectTable, marginForAlmostEqual) then - -- table differs on this key - -- clear the cycle detection before returning - cycleDetectTable.actual[ actual ] = nil - cycleDetectTable.expected[ expected ] = nil - return false - end - end - - for k, v in pairs(expected) do - if not actualKeysMatched[k] then - -- Found a key that we did not see in "actual" -> mismatch - -- clear the cycle detection before returning - cycleDetectTable.actual[ actual ] = nil - cycleDetectTable.expected[ expected ] = nil - return false - end - -- Otherwise actual[k] was already matched against v = expected[k]. - end - - -- all key match, we have a match ! - cycleDetectTable.actual[ actual ] = nil - cycleDetectTable.expected[ expected ] = nil - return true -end -M.private._is_table_equals = _is_table_equals - -local function failure(main_msg, extra_msg_or_nil, level) - -- raise an error indicating a test failure - -- for error() compatibility we adjust "level" here (by +1), to report the - -- calling context - local msg - if type(extra_msg_or_nil) == 'string' and extra_msg_or_nil:len() > 0 then - msg = extra_msg_or_nil .. '\n' .. main_msg - else - msg = main_msg - end - error(M.FAILURE_PREFIX .. msg, (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) -end - -local function is_table_equals(actual, expected, marginForAlmostEqual) - return _is_table_equals(actual, expected, nil, marginForAlmostEqual) -end -M.private.is_table_equals = is_table_equals - -local function fail_fmt(level, extra_msg_or_nil, ...) - -- failure with printf-style formatted message and given error level - failure(string.format(...), extra_msg_or_nil, (level or 1) + 1) -end -M.private.fail_fmt = fail_fmt - -local function error_fmt(level, ...) - -- printf-style error() - error(string.format(...), (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) -end -M.private.error_fmt = error_fmt - ----------------------------------------------------------------- --- --- assertions --- ----------------------------------------------------------------- - -local function errorMsgEquality(actual, expected, doDeepAnalysis, margin) - -- margin is supplied only for almost equal verification - - if not M.ORDER_ACTUAL_EXPECTED then - expected, actual = actual, expected - end - if type(expected) == 'string' or type(expected) == 'table' then - local strExpected, strActual = prettystrPairs(expected, actual) - local result = string.format("expected: %s\nactual: %s", strExpected, strActual) - if margin then - result = result .. '\nwere not equal by the margin of: '..prettystr(margin) - end - - -- extend with mismatch analysis if possible: - local success, mismatchResult - success, mismatchResult = tryMismatchFormatting( actual, expected, doDeepAnalysis, margin ) - if success then - result = table.concat( { result, mismatchResult }, '\n' ) - end - return result - end - return string.format("expected: %s, actual: %s", - prettystr(expected), prettystr(actual)) -end - -function M.assertError(f, ...) - -- assert that calling f with the arguments will raise an error - -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error - if pcall( f, ... ) then - failure( "Expected an error when calling function but no error generated", nil, 2 ) - end -end - -function M.fail( msg ) - -- stops a test due to a failure - failure( msg, nil, 2 ) -end - -function M.failIf( cond, msg ) - -- Fails a test with "msg" if condition is true - if cond then - failure( msg, nil, 2 ) - end -end - -function M.skip(msg) - -- skip a running test - error_fmt(2, M.SKIP_PREFIX .. msg) -end - -function M.skipIf( cond, msg ) - -- skip a running test if condition is met - if cond then - error_fmt(2, M.SKIP_PREFIX .. msg) - end -end - -function M.runOnlyIf( cond, msg ) - -- continue a running test if condition is met, else skip it - if not cond then - error_fmt(2, M.SKIP_PREFIX .. prettystr(msg)) - end -end - -function M.success() - -- stops a test with a success - error_fmt(2, M.SUCCESS_PREFIX) -end - -function M.successIf( cond ) - -- stops a test with a success if condition is met - if cond then - error_fmt(2, M.SUCCESS_PREFIX) - end -end - - ------------------------------------------------------------------- --- Equality assertions ------------------------------------------------------------------- - -function M.assertEquals(actual, expected, extra_msg_or_nil, doDeepAnalysis) - if type(actual) == 'table' and type(expected) == 'table' then - if not is_table_equals(actual, expected) then - failure( errorMsgEquality(actual, expected, doDeepAnalysis), extra_msg_or_nil, 2 ) - end - elseif type(actual) ~= type(expected) then - failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) - elseif actual ~= expected then - failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) - end -end - -function M.almostEquals( actual, expected, margin ) - if type(actual) ~= 'number' or type(expected) ~= 'number' or type(margin) ~= 'number' then - error_fmt(3, 'almostEquals: must supply only number arguments.\nArguments supplied: %s, %s, %s', - prettystr(actual), prettystr(expected), prettystr(margin)) - end - if margin < 0 then - error_fmt(3, 'almostEquals: margin must not be negative, current value is ' .. margin) - end - return math.abs(expected - actual) <= margin -end - -function M.assertAlmostEquals( actual, expected, margin, extra_msg_or_nil ) - -- check that two floats are close by margin - margin = margin or M.EPS - if type(margin) ~= 'number' then - error_fmt(2, 'almostEquals: margin must be a number, not %s', prettystr(margin)) - end - - if type(actual) == 'table' and type(expected) == 'table' then - -- handle almost equals for table - if not is_table_equals(actual, expected, margin) then - failure( errorMsgEquality(actual, expected, nil, margin), extra_msg_or_nil, 2 ) - end - elseif type(actual) == 'number' and type(expected) == 'number' and type(margin) == 'number' then - if not M.almostEquals(actual, expected, margin) then - if not M.ORDER_ACTUAL_EXPECTED then - expected, actual = actual, expected - end - local delta = math.abs(actual - expected) - fail_fmt(2, extra_msg_or_nil, 'Values are not almost equal\n' .. - 'Actual: %s, expected: %s, delta %s above margin of %s', - actual, expected, delta, margin) - end - else - error_fmt(3, 'almostEquals: must supply only number or table arguments.\nArguments supplied: %s, %s, %s', - prettystr(actual), prettystr(expected), prettystr(margin)) - end -end - -function M.assertNotEquals(actual, expected, extra_msg_or_nil) - if type(actual) ~= type(expected) then - return - end - - if type(actual) == 'table' and type(expected) == 'table' then - if not is_table_equals(actual, expected) then - return - end - elseif actual ~= expected then - return - end - fail_fmt(2, extra_msg_or_nil, 'Received the not expected value: %s', prettystr(actual)) -end - -function M.assertNotAlmostEquals( actual, expected, margin, extra_msg_or_nil ) - -- check that two floats are not close by margin - margin = margin or M.EPS - if M.almostEquals(actual, expected, margin) then - if not M.ORDER_ACTUAL_EXPECTED then - expected, actual = actual, expected - end - local delta = math.abs(actual - expected) - fail_fmt(2, extra_msg_or_nil, 'Values are almost equal\nActual: %s, expected: %s' .. - ', delta %s below margin of %s', - actual, expected, delta, margin) - end -end - -function M.assertItemsEquals(actual, expected, extra_msg_or_nil) - -- checks that the items of table expected - -- are contained in table actual. Warning, this function - -- is at least O(n^2) - if not _is_table_items_equals(actual, expected ) then - expected, actual = prettystrPairs(expected, actual) - fail_fmt(2, extra_msg_or_nil, 'Content of the tables are not identical:\nExpected: %s\nActual: %s', - expected, actual) - end -end - ------------------------------------------------------------------- --- String assertion ------------------------------------------------------------------- - -function M.assertStrContains( str, sub, isPattern, extra_msg_or_nil ) - -- this relies on lua string.find function - -- a string always contains the empty string - -- assert( type(str) == 'string', 'Argument 1 of assertStrContains() should be a string.' ) ) - -- assert( type(sub) == 'string', 'Argument 2 of assertStrContains() should be a string.' ) ) - if not string.find(str, sub, 1, not isPattern) then - sub, str = prettystrPairs(sub, str, '\n') - fail_fmt(2, extra_msg_or_nil, 'Could not find %s %s in string %s', - isPattern and 'pattern' or 'substring', sub, str) - end -end - -function M.assertStrIContains( str, sub, extra_msg_or_nil ) - -- this relies on lua string.find function - -- a string always contains the empty string - if not string.find(str:lower(), sub:lower(), 1, true) then - sub, str = prettystrPairs(sub, str, '\n') - fail_fmt(2, extra_msg_or_nil, 'Could not find (case insensitively) substring %s in string %s', - sub, str) - end -end - -function M.assertNotStrContains( str, sub, isPattern, extra_msg_or_nil ) - -- this relies on lua string.find function - -- a string always contains the empty string - if string.find(str, sub, 1, not isPattern) then - sub, str = prettystrPairs(sub, str, '\n') - fail_fmt(2, extra_msg_or_nil, 'Found the not expected %s %s in string %s', - isPattern and 'pattern' or 'substring', sub, str) - end -end - -function M.assertNotStrIContains( str, sub, extra_msg_or_nil ) - -- this relies on lua string.find function - -- a string always contains the empty string - if string.find(str:lower(), sub:lower(), 1, true) then - sub, str = prettystrPairs(sub, str, '\n') - fail_fmt(2, extra_msg_or_nil, 'Found (case insensitively) the not expected substring %s in string %s', - sub, str) - end -end - -function M.assertStrMatches( str, pattern, start, final, extra_msg_or_nil ) - -- Verify a full match for the string - if not strMatch( str, pattern, start, final ) then - pattern, str = prettystrPairs(pattern, str, '\n') - fail_fmt(2, extra_msg_or_nil, 'Could not match pattern %s with string %s', - pattern, str) - end -end - -local function _assertErrorMsgEquals( stripFileAndLine, expectedMsg, func, ... ) - local no_error, error_msg = pcall( func, ... ) - if no_error then - failure( 'No error generated when calling function but expected error: '..M.prettystr(expectedMsg), nil, 3 ) - end - if type(expectedMsg) == "string" and type(error_msg) ~= "string" then - -- table are converted to string automatically - error_msg = tostring(error_msg) - end - local differ = false - if stripFileAndLine then - if error_msg:gsub("^.+:%d+: ", "") ~= expectedMsg then - differ = true - end - else - if error_msg ~= expectedMsg then - local tr = type(error_msg) - local te = type(expectedMsg) - if te == 'table' then - if tr ~= 'table' then - differ = true - else - local ok = pcall(M.assertItemsEquals, error_msg, expectedMsg) - if not ok then - differ = true - end - end - else - differ = true - end - end - end - - if differ then - error_msg, expectedMsg = prettystrPairs(error_msg, expectedMsg) - fail_fmt(3, nil, 'Error message expected: %s\nError message received: %s\n', - expectedMsg, error_msg) - end -end - -function M.assertErrorMsgEquals( expectedMsg, func, ... ) - -- assert that calling f with the arguments will raise an error - -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error - _assertErrorMsgEquals(false, expectedMsg, func, ...) -end - -function M.assertErrorMsgContentEquals(expectedMsg, func, ...) - _assertErrorMsgEquals(true, expectedMsg, func, ...) -end - -function M.assertErrorMsgContains( partialMsg, func, ... ) - -- assert that calling f with the arguments will raise an error - -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error - local no_error, error_msg = pcall( func, ... ) - if no_error then - failure( 'No error generated when calling function but expected error containing: '..prettystr(partialMsg), nil, 2 ) - end - if type(error_msg) ~= "string" then - error_msg = tostring(error_msg) - end - if not string.find( error_msg, partialMsg, nil, true ) then - error_msg, partialMsg = prettystrPairs(error_msg, partialMsg) - fail_fmt(2, nil, 'Error message does not contain: %s\nError message received: %s\n', - partialMsg, error_msg) - end -end - -function M.assertErrorMsgMatches( expectedMsg, func, ... ) - -- assert that calling f with the arguments will raise an error - -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error - local no_error, error_msg = pcall( func, ... ) - if no_error then - failure( 'No error generated when calling function but expected error matching: "'..expectedMsg..'"', nil, 2 ) - end - if type(error_msg) ~= "string" then - error_msg = tostring(error_msg) - end - if not strMatch( error_msg, expectedMsg ) then - expectedMsg, error_msg = prettystrPairs(expectedMsg, error_msg) - fail_fmt(2, nil, 'Error message does not match pattern: %s\nError message received: %s\n', - expectedMsg, error_msg) - end -end - ------------------------------------------------------------------- --- Type assertions ------------------------------------------------------------------- - -function M.assertEvalToTrue(value, extra_msg_or_nil) - if not value then - failure("expected: a value evaluating to true, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertEvalToFalse(value, extra_msg_or_nil) - if value then - failure("expected: false or nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsTrue(value, extra_msg_or_nil) - if value ~= true then - failure("expected: true, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertNotIsTrue(value, extra_msg_or_nil) - if value == true then - failure("expected: not true, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsFalse(value, extra_msg_or_nil) - if value ~= false then - failure("expected: false, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertNotIsFalse(value, extra_msg_or_nil) - if value == false then - failure("expected: not false, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsNil(value, extra_msg_or_nil) - if value ~= nil then - failure("expected: nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertNotIsNil(value, extra_msg_or_nil) - if value == nil then - failure("expected: not nil, actual: nil", extra_msg_or_nil, 2) - end -end - ---[[ -Add type assertion functions to the module table M. Each of these functions -takes a single parameter "value", and checks that its Lua type matches the -expected string (derived from the function name): - -M.assertIsXxx(value) -> ensure that type(value) conforms to "xxx" -]] -for _, funcName in ipairs( - {'assertIsNumber', 'assertIsString', 'assertIsTable', 'assertIsBoolean', - 'assertIsFunction', 'assertIsUserdata', 'assertIsThread'} -) do - local typeExpected = funcName:match("^assertIs([A-Z]%a*)$") - -- Lua type() always returns lowercase, also make sure the match() succeeded - typeExpected = typeExpected and typeExpected:lower() - or error("bad function name '"..funcName.."' for type assertion") - - M[funcName] = function(value, extra_msg_or_nil) - if type(value) ~= typeExpected then - if type(value) == 'nil' then - fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: nil', - typeExpected, type(value), prettystrPairs(value)) - else - fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: type %s, value %s', - typeExpected, type(value), prettystrPairs(value)) - end - end - end -end - ---[[ -Add shortcuts for verifying type of a variable, without failure (luaunit v2 compatibility) -M.isXxx(value) -> returns true if type(value) conforms to "xxx" -]] -for _, typeExpected in ipairs( - {'Number', 'String', 'Table', 'Boolean', - 'Function', 'Userdata', 'Thread', 'Nil' } -) do - local typeExpectedLower = typeExpected:lower() - local isType = function(value) - return (type(value) == typeExpectedLower) - end - M['is'..typeExpected] = isType - M['is_'..typeExpectedLower] = isType -end - ---[[ -Add non-type assertion functions to the module table M. Each of these functions -takes a single parameter "value", and checks that its Lua type differs from the -expected string (derived from the function name): - -M.assertNotIsXxx(value) -> ensure that type(value) is not "xxx" -]] -for _, funcName in ipairs( - {'assertNotIsNumber', 'assertNotIsString', 'assertNotIsTable', 'assertNotIsBoolean', - 'assertNotIsFunction', 'assertNotIsUserdata', 'assertNotIsThread'} -) do - local typeUnexpected = funcName:match("^assertNotIs([A-Z]%a*)$") - -- Lua type() always returns lowercase, also make sure the match() succeeded - typeUnexpected = typeUnexpected and typeUnexpected:lower() - or error("bad function name '"..funcName.."' for type assertion") - - M[funcName] = function(value, extra_msg_or_nil) - if type(value) == typeUnexpected then - fail_fmt(2, extra_msg_or_nil, 'expected: not a %s type, actual: value %s', - typeUnexpected, prettystrPairs(value)) - end - end -end - -function M.assertIs(actual, expected, extra_msg_or_nil) - if actual ~= expected then - if not M.ORDER_ACTUAL_EXPECTED then - actual, expected = expected, actual - end - local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG - M.PRINT_TABLE_REF_IN_ERROR_MSG = true - expected, actual = prettystrPairs(expected, actual, '\n', '') - M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg - fail_fmt(2, extra_msg_or_nil, 'expected and actual object should not be different\nExpected: %s\nReceived: %s', - expected, actual) - end -end - -function M.assertNotIs(actual, expected, extra_msg_or_nil) - if actual == expected then - local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG - M.PRINT_TABLE_REF_IN_ERROR_MSG = true - local s_expected - if not M.ORDER_ACTUAL_EXPECTED then - s_expected = prettystrPairs(actual) - else - s_expected = prettystrPairs(expected) - end - M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg - fail_fmt(2, extra_msg_or_nil, 'expected and actual object should be different: %s', s_expected ) - end -end - - ------------------------------------------------------------------- --- Scientific assertions ------------------------------------------------------------------- - - -function M.assertIsNaN(value, extra_msg_or_nil) - if type(value) ~= "number" or value == value then - failure("expected: NaN, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertNotIsNaN(value, extra_msg_or_nil) - if type(value) == "number" and value ~= value then - failure("expected: not NaN, actual: NaN", extra_msg_or_nil, 2) - end -end - -function M.assertIsInf(value, extra_msg_or_nil) - if type(value) ~= "number" or math.abs(value) ~= math.huge then - failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsPlusInf(value, extra_msg_or_nil) - if type(value) ~= "number" or value ~= math.huge then - failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsMinusInf(value, extra_msg_or_nil) - if type(value) ~= "number" or value ~= -math.huge then - failure("expected: -#Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertNotIsPlusInf(value, extra_msg_or_nil) - if type(value) == "number" and value == math.huge then - failure("expected: not #Inf, actual: #Inf", extra_msg_or_nil, 2) - end -end - -function M.assertNotIsMinusInf(value, extra_msg_or_nil) - if type(value) == "number" and value == -math.huge then - failure("expected: not -#Inf, actual: -#Inf", extra_msg_or_nil, 2) - end -end - -function M.assertNotIsInf(value, extra_msg_or_nil) - if type(value) == "number" and math.abs(value) == math.huge then - failure("expected: not infinity, actual: " .. prettystr(value), extra_msg_or_nil, 2) - end -end - -function M.assertIsPlusZero(value, extra_msg_or_nil) - if type(value) ~= 'number' or value ~= 0 then - failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) - else if (1/value == -math.huge) then - -- more precise error diagnosis - failure("expected: +0.0, actual: -0.0", extra_msg_or_nil, 2) - else if (1/value ~= math.huge) then - -- strange, case should have already been covered - failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end - end - end -end - -function M.assertIsMinusZero(value, extra_msg_or_nil) - if type(value) ~= 'number' or value ~= 0 then - failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) - else if (1/value == math.huge) then - -- more precise error diagnosis - failure("expected: -0.0, actual: +0.0", extra_msg_or_nil, 2) - else if (1/value ~= -math.huge) then - -- strange, case should have already been covered - failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) - end - end - end -end - -function M.assertNotIsPlusZero(value, extra_msg_or_nil) - if type(value) == 'number' and (1/value == math.huge) then - failure("expected: not +0.0, actual: +0.0", extra_msg_or_nil, 2) - end -end - -function M.assertNotIsMinusZero(value, extra_msg_or_nil) - if type(value) == 'number' and (1/value == -math.huge) then - failure("expected: not -0.0, actual: -0.0", extra_msg_or_nil, 2) - end -end - -function M.assertTableContains(t, expected, extra_msg_or_nil) - -- checks that table t contains the expected element - if table_findkeyof(t, expected) == nil then - t, expected = prettystrPairs(t, expected) - fail_fmt(2, extra_msg_or_nil, 'Table %s does NOT contain the expected element %s', - t, expected) - end -end - -function M.assertNotTableContains(t, expected, extra_msg_or_nil) - -- checks that table t doesn't contain the expected element - local k = table_findkeyof(t, expected) - if k ~= nil then - t, expected = prettystrPairs(t, expected) - fail_fmt(2, extra_msg_or_nil, 'Table %s DOES contain the unwanted element %s (at key %s)', - t, expected, prettystr(k)) - end -end - ----------------------------------------------------------------- --- Compatibility layer ----------------------------------------------------------------- - --- for compatibility with LuaUnit v2.x -function M.wrapFunctions() - -- In LuaUnit version <= 2.1 , this function was necessary to include - -- a test function inside the global test suite. Nowadays, the functions - -- are simply run directly as part of the test discovery process. - -- so just do nothing ! - io.stderr:write[[Use of WrapFunctions() is no longer needed. -Just prefix your test function names with "test" or "Test" and they -will be picked up and run by LuaUnit. -]] -end - -local list_of_funcs = { - -- { official function name , alias } - - -- general assertions - { 'assertEquals' , 'assert_equals' }, - { 'assertItemsEquals' , 'assert_items_equals' }, - { 'assertNotEquals' , 'assert_not_equals' }, - { 'assertAlmostEquals' , 'assert_almost_equals' }, - { 'assertNotAlmostEquals' , 'assert_not_almost_equals' }, - { 'assertEvalToTrue' , 'assert_eval_to_true' }, - { 'assertEvalToFalse' , 'assert_eval_to_false' }, - { 'assertStrContains' , 'assert_str_contains' }, - { 'assertStrIContains' , 'assert_str_icontains' }, - { 'assertNotStrContains' , 'assert_not_str_contains' }, - { 'assertNotStrIContains' , 'assert_not_str_icontains' }, - { 'assertStrMatches' , 'assert_str_matches' }, - { 'assertError' , 'assert_error' }, - { 'assertErrorMsgEquals' , 'assert_error_msg_equals' }, - { 'assertErrorMsgContains' , 'assert_error_msg_contains' }, - { 'assertErrorMsgMatches' , 'assert_error_msg_matches' }, - { 'assertErrorMsgContentEquals', 'assert_error_msg_content_equals' }, - { 'assertIs' , 'assert_is' }, - { 'assertNotIs' , 'assert_not_is' }, - { 'assertTableContains' , 'assert_table_contains' }, - { 'assertNotTableContains' , 'assert_not_table_contains' }, - { 'wrapFunctions' , 'WrapFunctions' }, - { 'wrapFunctions' , 'wrap_functions' }, - - -- type assertions: assertIsXXX -> assert_is_xxx - { 'assertIsNumber' , 'assert_is_number' }, - { 'assertIsString' , 'assert_is_string' }, - { 'assertIsTable' , 'assert_is_table' }, - { 'assertIsBoolean' , 'assert_is_boolean' }, - { 'assertIsNil' , 'assert_is_nil' }, - { 'assertIsTrue' , 'assert_is_true' }, - { 'assertIsFalse' , 'assert_is_false' }, - { 'assertIsNaN' , 'assert_is_nan' }, - { 'assertIsInf' , 'assert_is_inf' }, - { 'assertIsPlusInf' , 'assert_is_plus_inf' }, - { 'assertIsMinusInf' , 'assert_is_minus_inf' }, - { 'assertIsPlusZero' , 'assert_is_plus_zero' }, - { 'assertIsMinusZero' , 'assert_is_minus_zero' }, - { 'assertIsFunction' , 'assert_is_function' }, - { 'assertIsThread' , 'assert_is_thread' }, - { 'assertIsUserdata' , 'assert_is_userdata' }, - - -- type assertions: assertIsXXX -> assertXxx - { 'assertIsNumber' , 'assertNumber' }, - { 'assertIsString' , 'assertString' }, - { 'assertIsTable' , 'assertTable' }, - { 'assertIsBoolean' , 'assertBoolean' }, - { 'assertIsNil' , 'assertNil' }, - { 'assertIsTrue' , 'assertTrue' }, - { 'assertIsFalse' , 'assertFalse' }, - { 'assertIsNaN' , 'assertNaN' }, - { 'assertIsInf' , 'assertInf' }, - { 'assertIsPlusInf' , 'assertPlusInf' }, - { 'assertIsMinusInf' , 'assertMinusInf' }, - { 'assertIsPlusZero' , 'assertPlusZero' }, - { 'assertIsMinusZero' , 'assertMinusZero'}, - { 'assertIsFunction' , 'assertFunction' }, - { 'assertIsThread' , 'assertThread' }, - { 'assertIsUserdata' , 'assertUserdata' }, - - -- type assertions: assertIsXXX -> assert_xxx (luaunit v2 compat) - { 'assertIsNumber' , 'assert_number' }, - { 'assertIsString' , 'assert_string' }, - { 'assertIsTable' , 'assert_table' }, - { 'assertIsBoolean' , 'assert_boolean' }, - { 'assertIsNil' , 'assert_nil' }, - { 'assertIsTrue' , 'assert_true' }, - { 'assertIsFalse' , 'assert_false' }, - { 'assertIsNaN' , 'assert_nan' }, - { 'assertIsInf' , 'assert_inf' }, - { 'assertIsPlusInf' , 'assert_plus_inf' }, - { 'assertIsMinusInf' , 'assert_minus_inf' }, - { 'assertIsPlusZero' , 'assert_plus_zero' }, - { 'assertIsMinusZero' , 'assert_minus_zero' }, - { 'assertIsFunction' , 'assert_function' }, - { 'assertIsThread' , 'assert_thread' }, - { 'assertIsUserdata' , 'assert_userdata' }, - - -- type assertions: assertNotIsXXX -> assert_not_is_xxx - { 'assertNotIsNumber' , 'assert_not_is_number' }, - { 'assertNotIsString' , 'assert_not_is_string' }, - { 'assertNotIsTable' , 'assert_not_is_table' }, - { 'assertNotIsBoolean' , 'assert_not_is_boolean' }, - { 'assertNotIsNil' , 'assert_not_is_nil' }, - { 'assertNotIsTrue' , 'assert_not_is_true' }, - { 'assertNotIsFalse' , 'assert_not_is_false' }, - { 'assertNotIsNaN' , 'assert_not_is_nan' }, - { 'assertNotIsInf' , 'assert_not_is_inf' }, - { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, - { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, - { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, - { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, - { 'assertNotIsFunction' , 'assert_not_is_function' }, - { 'assertNotIsThread' , 'assert_not_is_thread' }, - { 'assertNotIsUserdata' , 'assert_not_is_userdata' }, - - -- type assertions: assertNotIsXXX -> assertNotXxx (luaunit v2 compat) - { 'assertNotIsNumber' , 'assertNotNumber' }, - { 'assertNotIsString' , 'assertNotString' }, - { 'assertNotIsTable' , 'assertNotTable' }, - { 'assertNotIsBoolean' , 'assertNotBoolean' }, - { 'assertNotIsNil' , 'assertNotNil' }, - { 'assertNotIsTrue' , 'assertNotTrue' }, - { 'assertNotIsFalse' , 'assertNotFalse' }, - { 'assertNotIsNaN' , 'assertNotNaN' }, - { 'assertNotIsInf' , 'assertNotInf' }, - { 'assertNotIsPlusInf' , 'assertNotPlusInf' }, - { 'assertNotIsMinusInf' , 'assertNotMinusInf' }, - { 'assertNotIsPlusZero' , 'assertNotPlusZero' }, - { 'assertNotIsMinusZero' , 'assertNotMinusZero' }, - { 'assertNotIsFunction' , 'assertNotFunction' }, - { 'assertNotIsThread' , 'assertNotThread' }, - { 'assertNotIsUserdata' , 'assertNotUserdata' }, - - -- type assertions: assertNotIsXXX -> assert_not_xxx - { 'assertNotIsNumber' , 'assert_not_number' }, - { 'assertNotIsString' , 'assert_not_string' }, - { 'assertNotIsTable' , 'assert_not_table' }, - { 'assertNotIsBoolean' , 'assert_not_boolean' }, - { 'assertNotIsNil' , 'assert_not_nil' }, - { 'assertNotIsTrue' , 'assert_not_true' }, - { 'assertNotIsFalse' , 'assert_not_false' }, - { 'assertNotIsNaN' , 'assert_not_nan' }, - { 'assertNotIsInf' , 'assert_not_inf' }, - { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, - { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, - { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, - { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, - { 'assertNotIsFunction' , 'assert_not_function' }, - { 'assertNotIsThread' , 'assert_not_thread' }, - { 'assertNotIsUserdata' , 'assert_not_userdata' }, - - -- all assertions with Coroutine duplicate Thread assertions - { 'assertIsThread' , 'assertIsCoroutine' }, - { 'assertIsThread' , 'assertCoroutine' }, - { 'assertIsThread' , 'assert_is_coroutine' }, - { 'assertIsThread' , 'assert_coroutine' }, - { 'assertNotIsThread' , 'assertNotIsCoroutine' }, - { 'assertNotIsThread' , 'assertNotCoroutine' }, - { 'assertNotIsThread' , 'assert_not_is_coroutine' }, - { 'assertNotIsThread' , 'assert_not_coroutine' }, -} - --- Create all aliases in M -for _,v in ipairs( list_of_funcs ) do - local funcname, alias = v[1], v[2] - M[alias] = M[funcname] - - if EXPORT_ASSERT_TO_GLOBALS then - _G[funcname] = M[funcname] - _G[alias] = M[funcname] - end -end - ----------------------------------------------------------------- --- --- Outputters --- ----------------------------------------------------------------- - --- A common "base" class for outputters --- For concepts involved (class inheritance) see http://www.lua.org/pil/16.2.html - -local genericOutput = { __class__ = 'genericOutput' } -- class -local genericOutput_MT = { __index = genericOutput } -- metatable -M.genericOutput = genericOutput -- publish, so that custom classes may derive from it - -function genericOutput.new(runner, default_verbosity) - -- runner is the "parent" object controlling the output, usually a LuaUnit instance - local t = { runner = runner } - if runner then - t.result = runner.result - t.verbosity = runner.verbosity or default_verbosity - t.fname = runner.fname - else - t.verbosity = default_verbosity - end - return setmetatable( t, genericOutput_MT) -end - --- abstract ("empty") methods -function genericOutput:startSuite() - -- Called once, when the suite is started -end - -function genericOutput:startClass(className) - -- Called each time a new test class is started -end - -function genericOutput:startTest(testName) - -- called each time a new test is started, right before the setUp() - -- the current test status node is already created and available in: self.result.currentNode -end - -function genericOutput:updateStatus(node) - -- called with status failed or error as soon as the error/failure is encountered - -- this method is NOT called for a successful test because a test is marked as successful by default - -- and does not need to be updated -end - -function genericOutput:endTest(node) - -- called when the test is finished, after the tearDown() method -end - -function genericOutput:endClass() - -- called when executing the class is finished, before moving on to the next class of at the end of the test execution -end - -function genericOutput:endSuite() - -- called at the end of the test suite execution -end - - ----------------------------------------------------------------- --- class TapOutput ----------------------------------------------------------------- - -local TapOutput = genericOutput.new() -- derived class -local TapOutput_MT = { __index = TapOutput } -- metatable -TapOutput.__class__ = 'TapOutput' - - -- For a good reference for TAP format, check: http://testanything.org/tap-specification.html - - function TapOutput.new(runner) - local t = genericOutput.new(runner, M.VERBOSITY_LOW) - return setmetatable( t, TapOutput_MT) - end - function TapOutput:startSuite() - print("1.."..self.result.selectedCount) - print('# Started on '..self.result.startDate) - end - function TapOutput:startClass(className) - if className ~= '[TestFunctions]' then - print('# Starting class: '..className) - end - end - - function TapOutput:updateStatus( node ) - if node:isSkipped() then - io.stdout:write("ok ", self.result.currentTestNumber, "\t# SKIP ", node.msg, "\n" ) - return - end - - io.stdout:write("not ok ", self.result.currentTestNumber, "\t", node.testName, "\n") - if self.verbosity > M.VERBOSITY_LOW then - print( prefixString( '# ', node.msg ) ) - end - if (node:isFailure() or node:isError()) and self.verbosity > M.VERBOSITY_DEFAULT then - print( prefixString( '# ', node.stackTrace ) ) - end - end - - function TapOutput:endTest( node ) - if node:isSuccess() then - io.stdout:write("ok ", self.result.currentTestNumber, "\t", node.testName, "\n") - end - end - - function TapOutput:endSuite() - print( '# '..M.LuaUnit.statusLine( self.result ) ) - return self.result.notSuccessCount - end - - --- class TapOutput end - ----------------------------------------------------------------- --- class JUnitOutput ----------------------------------------------------------------- - --- See directory junitxml for more information about the junit format -local JUnitOutput = genericOutput.new() -- derived class -local JUnitOutput_MT = { __index = JUnitOutput } -- metatable -JUnitOutput.__class__ = 'JUnitOutput' - - function JUnitOutput.new(runner) - local t = genericOutput.new(runner, M.VERBOSITY_LOW) - t.testList = {} - return setmetatable( t, JUnitOutput_MT ) - end - - function JUnitOutput:startSuite() - -- open xml file early to deal with errors - if self.fname == nil then - error('With Junit, an output filename must be supplied with --name!') - end - if string.sub(self.fname,-4) ~= '.xml' then - self.fname = self.fname..'.xml' - end - self.fd = io.open(self.fname, "w") - if self.fd == nil then - error("Could not open file for writing: "..self.fname) - end - - print('# XML output to '..self.fname) - print('# Started on '..self.result.startDate) - end - function JUnitOutput:startClass(className) - if className ~= '[TestFunctions]' then - print('# Starting class: '..className) - end - end - function JUnitOutput:startTest(testName) - print('# Starting test: '..testName) - end - - function JUnitOutput:updateStatus( node ) - if node:isFailure() then - print( '# Failure: ' .. prefixString( '# ', node.msg ):sub(4, nil) ) - -- print('# ' .. node.stackTrace) - elseif node:isError() then - print( '# Error: ' .. prefixString( '# ' , node.msg ):sub(4, nil) ) - -- print('# ' .. node.stackTrace) - end - end - - function JUnitOutput:endSuite() - print( '# '..M.LuaUnit.statusLine(self.result)) - - -- XML file writing - self.fd:write('\n') - self.fd:write('\n') - self.fd:write(string.format( - ' \n', - self.result.runCount, self.result.startIsodate, self.result.duration, self.result.errorCount, self.result.failureCount, self.result.skippedCount )) - self.fd:write(" \n") - self.fd:write(string.format(' \n', _VERSION ) ) - self.fd:write(string.format(' \n', M.VERSION) ) - -- XXX please include system name and version if possible - self.fd:write(" \n") - - for i,node in ipairs(self.result.allTests) do - self.fd:write(string.format(' \n', - node.className, node.testName, node.duration ) ) - if node:isNotSuccess() then - self.fd:write(node:statusXML()) - end - self.fd:write(' \n') - end - - -- Next two lines are needed to validate junit ANT xsd, but really not useful in general: - self.fd:write(' \n') - self.fd:write(' \n') - - self.fd:write(' \n') - self.fd:write('\n') - self.fd:close() - return self.result.notSuccessCount - end - - --- class TapOutput end - ----------------------------------------------------------------- --- class TextOutput ----------------------------------------------------------------- - ---[[ Example of other unit-tests suite text output - --- Python Non verbose: - -For each test: . or F or E - -If some failed tests: - ============== - ERROR / FAILURE: TestName (testfile.testclass) - --------- - Stack trace - - -then -------------- -then "Ran x tests in 0.000s" -then OK or FAILED (failures=1, error=1) - --- Python Verbose: -testname (filename.classname) ... ok -testname (filename.classname) ... FAIL -testname (filename.classname) ... ERROR - -then -------------- -then "Ran x tests in 0.000s" -then OK or FAILED (failures=1, error=1) - --- Ruby: -Started - . - Finished in 0.002695 seconds. - - 1 tests, 2 assertions, 0 failures, 0 errors - --- Ruby: ->> ruby tc_simple_number2.rb -Loaded suite tc_simple_number2 -Started -F.. -Finished in 0.038617 seconds. - - 1) Failure: -test_failure(TestSimpleNumber) [tc_simple_number2.rb:16]: -Adding doesn't work. -<3> expected but was -<4>. - -3 tests, 4 assertions, 1 failures, 0 errors - --- Java Junit -.......F. -Time: 0,003 -There was 1 failure: -1) testCapacity(junit.samples.VectorTest)junit.framework.AssertionFailedError - at junit.samples.VectorTest.testCapacity(VectorTest.java:87) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - -FAILURES!!! -Tests run: 8, Failures: 1, Errors: 0 - - --- Maven - -# mvn test -------------------------------------------------------- - T E S T S -------------------------------------------------------- -Running math.AdditionTest -Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: -0.03 sec <<< FAILURE! - -Results : - -Failed tests: - testLireSymbole(math.AdditionTest) - -Tests run: 2, Failures: 1, Errors: 0, Skipped: 0 - - --- LuaUnit ----- non verbose -* display . or F or E when running tests ----- verbose -* display test name + ok/fail ----- -* blank line -* number) ERROR or FAILURE: TestName - Stack trace -* blank line -* number) ERROR or FAILURE: TestName - Stack trace - -then -------------- -then "Ran x tests in 0.000s (%d not selected, %d skipped)" -then OK or FAILED (failures=1, error=1) - - -]] - -local TextOutput = genericOutput.new() -- derived class -local TextOutput_MT = { __index = TextOutput } -- metatable -TextOutput.__class__ = 'TextOutput' - - function TextOutput.new(runner) - local t = genericOutput.new(runner, M.VERBOSITY_DEFAULT) - t.errorList = {} - return setmetatable( t, TextOutput_MT ) - end - - function TextOutput:startSuite() - if self.verbosity > M.VERBOSITY_DEFAULT then - print( 'Started on '.. self.result.startDate ) - end - end - - function TextOutput:startTest(testName) - if self.verbosity > M.VERBOSITY_DEFAULT then - io.stdout:write( " ", self.result.currentNode.testName, " ... " ) - end - end - - function TextOutput:endTest( node ) - if node:isSuccess() then - if self.verbosity > M.VERBOSITY_DEFAULT then - io.stdout:write("Ok\n") - else - io.stdout:write(".") - io.stdout:flush() - end - else - if self.verbosity > M.VERBOSITY_DEFAULT then - print( node.status ) - print( node.msg ) - --[[ - -- find out when to do this: - if self.verbosity > M.VERBOSITY_DEFAULT then - print( node.stackTrace ) - end - ]] - else - -- write only the first character of status E, F or S - io.stdout:write(string.sub(node.status, 1, 1)) - io.stdout:flush() - end - end - end - - function TextOutput:displayOneFailedTest( index, fail ) - print(index..") "..fail.testName ) - print( fail.msg ) - print( fail.stackTrace ) - print() - end - - function TextOutput:displayErroredTests() - if #self.result.errorTests ~= 0 then - print("Tests with errors:") - print("------------------") - for i, v in ipairs(self.result.errorTests) do - self:displayOneFailedTest(i, v) - end - end - end - - function TextOutput:displayFailedTests() - if #self.result.failedTests ~= 0 then - print("Failed tests:") - print("-------------") - for i, v in ipairs(self.result.failedTests) do - self:displayOneFailedTest(i, v) - end - end - end - - function TextOutput:endSuite() - if self.verbosity > M.VERBOSITY_DEFAULT then - print("=========================================================") - else - print() - end - self:displayErroredTests() - self:displayFailedTests() - print( M.LuaUnit.statusLine( self.result ) ) - if self.result.notSuccessCount == 0 then - print('OK') - end - end - --- class TextOutput end - - ----------------------------------------------------------------- --- class NilOutput ----------------------------------------------------------------- - -local function nopCallable() - --print(42) - return nopCallable -end - -local NilOutput = { __class__ = 'NilOuptut' } -- class -local NilOutput_MT = { __index = nopCallable } -- metatable - -function NilOutput.new(runner) - return setmetatable( { __class__ = 'NilOutput' }, NilOutput_MT ) -end - ----------------------------------------------------------------- --- --- class LuaUnit --- ----------------------------------------------------------------- - -M.LuaUnit = { - outputType = TextOutput, - verbosity = M.VERBOSITY_DEFAULT, - __class__ = 'LuaUnit', - instances = {} -} -local LuaUnit_MT = { __index = M.LuaUnit } - -if EXPORT_ASSERT_TO_GLOBALS then - LuaUnit = M.LuaUnit -end - - function M.LuaUnit.new() - local newInstance = setmetatable( {}, LuaUnit_MT ) - return newInstance - end - - -----------------[[ Utility methods ]]--------------------- - - function M.LuaUnit.asFunction(aObject) - -- return "aObject" if it is a function, and nil otherwise - if 'function' == type(aObject) then - return aObject - end - end - - function M.LuaUnit.splitClassMethod(someName) - --[[ - Return a pair of className, methodName strings for a name in the form - "class.method". If no class part (or separator) is found, will return - nil, someName instead (the latter being unchanged). - - This convention thus also replaces the older isClassMethod() test: - You just have to check for a non-nil className (return) value. - ]] - local separator = string.find(someName, '.', 1, true) - if separator then - return someName:sub(1, separator - 1), someName:sub(separator + 1) - end - return nil, someName - end - - function M.LuaUnit.isMethodTestName( s ) - -- return true is the name matches the name of a test method - -- default rule is that is starts with 'Test' or with 'test' - return string.sub(s, 1, 4):lower() == 'test' - end - - function M.LuaUnit.isTestName( s ) - -- return true is the name matches the name of a test - -- default rule is that is starts with 'Test' or with 'test' - return string.sub(s, 1, 4):lower() == 'test' - end - - function M.LuaUnit.collectTests() - -- return a list of all test names in the global namespace - -- that match LuaUnit.isTestName - - local testNames = {} - for k, _ in pairs(_G) do - if type(k) == "string" and M.LuaUnit.isTestName( k ) then - table.insert( testNames , k ) - end - end - table.sort( testNames ) - return testNames - end - - function M.LuaUnit.parseCmdLine( cmdLine ) - -- parse the command line - -- Supported command line parameters: - -- --verbose, -v: increase verbosity - -- --quiet, -q: silence output - -- --error, -e: treat errors as fatal (quit program) - -- --output, -o, + name: select output type - -- --pattern, -p, + pattern: run test matching pattern, may be repeated - -- --exclude, -x, + pattern: run test not matching pattern, may be repeated - -- --shuffle, -s, : shuffle tests before reunning them - -- --name, -n, + fname: name of output file for junit, default to stdout - -- --repeat, -r, + num: number of times to execute each test - -- [testnames, ...]: run selected test names - -- - -- Returns a table with the following fields: - -- verbosity: nil, M.VERBOSITY_DEFAULT, M.VERBOSITY_QUIET, M.VERBOSITY_VERBOSE - -- output: nil, 'tap', 'junit', 'text', 'nil' - -- testNames: nil or a list of test names to run - -- exeRepeat: num or 1 - -- pattern: nil or a list of patterns - -- exclude: nil or a list of patterns - - local result, state = {}, nil - local SET_OUTPUT = 1 - local SET_PATTERN = 2 - local SET_EXCLUDE = 3 - local SET_FNAME = 4 - local SET_REPEAT = 5 - - if cmdLine == nil then - return result - end - - local function parseOption( option ) - if option == '--help' or option == '-h' then - result['help'] = true - return - elseif option == '--version' then - result['version'] = true - return - elseif option == '--verbose' or option == '-v' then - result['verbosity'] = M.VERBOSITY_VERBOSE - return - elseif option == '--quiet' or option == '-q' then - result['verbosity'] = M.VERBOSITY_QUIET - return - elseif option == '--error' or option == '-e' then - result['quitOnError'] = true - return - elseif option == '--failure' or option == '-f' then - result['quitOnFailure'] = true - return - elseif option == '--shuffle' or option == '-s' then - result['shuffle'] = true - return - elseif option == '--output' or option == '-o' then - state = SET_OUTPUT - return state - elseif option == '--name' or option == '-n' then - state = SET_FNAME - return state - elseif option == '--repeat' or option == '-r' then - state = SET_REPEAT - return state - elseif option == '--pattern' or option == '-p' then - state = SET_PATTERN - return state - elseif option == '--exclude' or option == '-x' then - state = SET_EXCLUDE - return state - end - error('Unknown option: '..option,3) - end - - local function setArg( cmdArg, state ) - if state == SET_OUTPUT then - result['output'] = cmdArg - return - elseif state == SET_FNAME then - result['fname'] = cmdArg - return - elseif state == SET_REPEAT then - result['exeRepeat'] = tonumber(cmdArg) - or error('Malformed -r argument: '..cmdArg) - return - elseif state == SET_PATTERN then - if result['pattern'] then - table.insert( result['pattern'], cmdArg ) - else - result['pattern'] = { cmdArg } - end - return - elseif state == SET_EXCLUDE then - local notArg = '!'..cmdArg - if result['pattern'] then - table.insert( result['pattern'], notArg ) - else - result['pattern'] = { notArg } - end - return - end - error('Unknown parse state: '.. state) - end - - - for i, cmdArg in ipairs(cmdLine) do - if state ~= nil then - setArg( cmdArg, state, result ) - state = nil - else - if cmdArg:sub(1,1) == '-' then - state = parseOption( cmdArg ) - else - if result['testNames'] then - table.insert( result['testNames'], cmdArg ) - else - result['testNames'] = { cmdArg } - end - end - end - end - - if result['help'] then - M.LuaUnit.help() - end - - if result['version'] then - M.LuaUnit.version() - end - - if state ~= nil then - error('Missing argument after '..cmdLine[ #cmdLine ],2 ) - end - - return result - end - - function M.LuaUnit.help() - print(M.USAGE) - os.exit(0) - end - - function M.LuaUnit.version() - print('LuaUnit v'..M.VERSION..' by Philippe Fremy ') - os.exit(0) - end - ----------------------------------------------------------------- --- class NodeStatus ----------------------------------------------------------------- - - local NodeStatus = { __class__ = 'NodeStatus' } -- class - local NodeStatus_MT = { __index = NodeStatus } -- metatable - M.NodeStatus = NodeStatus - - -- values of status - NodeStatus.SUCCESS = 'SUCCESS' - NodeStatus.SKIP = 'SKIP' - NodeStatus.FAIL = 'FAIL' - NodeStatus.ERROR = 'ERROR' - - function NodeStatus.new( number, testName, className ) - -- default constructor, test are PASS by default - local t = { number = number, testName = testName, className = className } - setmetatable( t, NodeStatus_MT ) - t:success() - return t - end - - function NodeStatus:success() - self.status = self.SUCCESS - -- useless because lua does this for us, but it helps me remembering the relevant field names - self.msg = nil - self.stackTrace = nil - end - - function NodeStatus:skip(msg) - self.status = self.SKIP - self.msg = msg - self.stackTrace = nil - end - - function NodeStatus:fail(msg, stackTrace) - self.status = self.FAIL - self.msg = msg - self.stackTrace = stackTrace - end - - function NodeStatus:error(msg, stackTrace) - self.status = self.ERROR - self.msg = msg - self.stackTrace = stackTrace - end - - function NodeStatus:isSuccess() - return self.status == NodeStatus.SUCCESS - end - - function NodeStatus:isNotSuccess() - -- Return true if node is either failure or error or skip - return (self.status == NodeStatus.FAIL or self.status == NodeStatus.ERROR or self.status == NodeStatus.SKIP) - end - - function NodeStatus:isSkipped() - return self.status == NodeStatus.SKIP - end - - function NodeStatus:isFailure() - return self.status == NodeStatus.FAIL - end - - function NodeStatus:isError() - return self.status == NodeStatus.ERROR - end - - function NodeStatus:statusXML() - if self:isError() then - return table.concat( - {' \n', - ' \n'}) - elseif self:isFailure() then - return table.concat( - {' \n', - ' \n'}) - elseif self:isSkipped() then - return table.concat({' ', xmlEscape(self.msg),'\n' } ) - end - return ' \n' -- (not XSD-compliant! normally shouldn't get here) - end - - --------------[[ Output methods ]]------------------------- - - local function conditional_plural(number, singular) - -- returns a grammatically well-formed string "%d " - local suffix = '' - if number ~= 1 then -- use plural - suffix = (singular:sub(-2) == 'ss') and 'es' or 's' - end - return string.format('%d %s%s', number, singular, suffix) - end - - function M.LuaUnit.statusLine(result) - -- return status line string according to results - local s = { - string.format('Ran %d tests in %0.3f seconds', - result.runCount, result.duration), - conditional_plural(result.successCount, 'success'), - } - if result.notSuccessCount > 0 then - if result.failureCount > 0 then - table.insert(s, conditional_plural(result.failureCount, 'failure')) - end - if result.errorCount > 0 then - table.insert(s, conditional_plural(result.errorCount, 'error')) - end - else - table.insert(s, '0 failures') - end - if result.skippedCount > 0 then - table.insert(s, string.format("%d skipped", result.skippedCount)) - end - if result.nonSelectedCount > 0 then - table.insert(s, string.format("%d non-selected", result.nonSelectedCount)) - end - return table.concat(s, ', ') - end - - function M.LuaUnit:startSuite(selectedCount, nonSelectedCount) - self.result = { - selectedCount = selectedCount, - nonSelectedCount = nonSelectedCount, - successCount = 0, - runCount = 0, - currentTestNumber = 0, - currentClassName = "", - currentNode = nil, - suiteStarted = true, - startTime = os.clock(), - startDate = os.date(os.getenv('LUAUNIT_DATEFMT')), - startIsodate = os.date('%Y-%m-%dT%H:%M:%S'), - patternIncludeFilter = self.patternIncludeFilter, - - -- list of test node status - allTests = {}, - failedTests = {}, - errorTests = {}, - skippedTests = {}, - - failureCount = 0, - errorCount = 0, - notSuccessCount = 0, - skippedCount = 0, - } - - self.outputType = self.outputType or TextOutput - self.output = self.outputType.new(self) - self.output:startSuite() - end - - function M.LuaUnit:startClass( className, classInstance ) - self.result.currentClassName = className - self.output:startClass( className ) - self:setupClass( className, classInstance ) - end - - function M.LuaUnit:startTest( testName ) - self.result.currentTestNumber = self.result.currentTestNumber + 1 - self.result.runCount = self.result.runCount + 1 - self.result.currentNode = NodeStatus.new( - self.result.currentTestNumber, - testName, - self.result.currentClassName - ) - self.result.currentNode.startTime = os.clock() - table.insert( self.result.allTests, self.result.currentNode ) - self.output:startTest( testName ) - end - - function M.LuaUnit:updateStatus( err ) - -- "err" is expected to be a table / result from protectedCall() - if err.status == NodeStatus.SUCCESS then - return - end - - local node = self.result.currentNode - - --[[ As a first approach, we will report only one error or one failure for one test. - - However, we can have the case where the test is in failure, and the teardown is in error. - In such case, it's a good idea to report both a failure and an error in the test suite. This is - what Python unittest does for example. However, it mixes up counts so need to be handled carefully: for - example, there could be more (failures + errors) count that tests. What happens to the current node ? - - We will do this more intelligent version later. - ]] - - -- if the node is already in failure/error, just don't report the new error (see above) - if node.status ~= NodeStatus.SUCCESS then - return - end - - if err.status == NodeStatus.FAIL then - node:fail( err.msg, err.trace ) - table.insert( self.result.failedTests, node ) - elseif err.status == NodeStatus.ERROR then - node:error( err.msg, err.trace ) - table.insert( self.result.errorTests, node ) - elseif err.status == NodeStatus.SKIP then - node:skip( err.msg ) - table.insert( self.result.skippedTests, node ) - else - error('No such status: ' .. prettystr(err.status)) - end - - self.output:updateStatus( node ) - end - - function M.LuaUnit:endTest() - local node = self.result.currentNode - -- print( 'endTest() '..prettystr(node)) - -- print( 'endTest() '..prettystr(node:isNotSuccess())) - node.duration = os.clock() - node.startTime - node.startTime = nil - self.output:endTest( node ) - - if node:isSuccess() then - self.result.successCount = self.result.successCount + 1 - elseif node:isError() then - if self.quitOnError or self.quitOnFailure then - -- Runtime error - abort test execution as requested by - -- "--error" option. This is done by setting a special - -- flag that gets handled in internalRunSuiteByInstances(). - print("\nERROR during LuaUnit test execution:\n" .. node.msg) - self.result.aborted = true - end - elseif node:isFailure() then - if self.quitOnFailure then - -- Failure - abort test execution as requested by - -- "--failure" option. This is done by setting a special - -- flag that gets handled in internalRunSuiteByInstances(). - print("\nFailure during LuaUnit test execution:\n" .. node.msg) - self.result.aborted = true - end - elseif node:isSkipped() then - self.result.runCount = self.result.runCount - 1 - else - error('No such node status: ' .. prettystr(node.status)) - end - self.result.currentNode = nil - end - - function M.LuaUnit:endClass() - self:teardownClass( self.lastClassName, self.lastClassInstance ) - self.output:endClass() - end - - function M.LuaUnit:endSuite() - if self.result.suiteStarted == false then - error('LuaUnit:endSuite() -- suite was already ended' ) - end - self.result.duration = os.clock()-self.result.startTime - self.result.suiteStarted = false - - -- Expose test counts for outputter's endSuite(). This could be managed - -- internally instead by using the length of the lists of failed tests - -- but unit tests rely on these fields being present. - self.result.failureCount = #self.result.failedTests - self.result.errorCount = #self.result.errorTests - self.result.notSuccessCount = self.result.failureCount + self.result.errorCount - self.result.skippedCount = #self.result.skippedTests - - self.output:endSuite() - end - - function M.LuaUnit:setOutputType(outputType, fname) - -- Configures LuaUnit runner output - -- outputType is one of: NIL, TAP, JUNIT, TEXT - -- when outputType is junit, the additional argument fname is used to set the name of junit output file - -- for other formats, fname is ignored - if outputType:upper() == "NIL" then - self.outputType = NilOutput - return - end - if outputType:upper() == "TAP" then - self.outputType = TapOutput - return - end - if outputType:upper() == "JUNIT" then - self.outputType = JUnitOutput - if fname then - self.fname = fname - end - return - end - if outputType:upper() == "TEXT" then - self.outputType = TextOutput - return - end - error( 'No such format: '..outputType,2) - end - - --------------[[ Runner ]]----------------- - - function M.LuaUnit:protectedCall(classInstance, methodInstance, prettyFuncName) - -- if classInstance is nil, this is just a function call - -- else, it's method of a class being called. - - local function err_handler(e) - -- transform error into a table, adding the traceback information - return { - status = NodeStatus.ERROR, - msg = e, - trace = string.sub(debug.traceback("", 1), 2) - } - end - - local ok, err - if classInstance then - -- stupid Lua < 5.2 does not allow xpcall with arguments so let's use a workaround - ok, err = xpcall( function () methodInstance(classInstance) end, err_handler ) - else - ok, err = xpcall( function () methodInstance() end, err_handler ) - end - if ok then - return {status = NodeStatus.SUCCESS} - end - -- print('ok="'..prettystr(ok)..'" err="'..prettystr(err)..'"') - - local iter_msg - iter_msg = self.exeRepeat and 'iteration '..self.currentCount - - err.msg, err.status = M.adjust_err_msg_with_iter( err.msg, iter_msg ) - - if err.status == NodeStatus.SUCCESS or err.status == NodeStatus.SKIP then - err.trace = nil - return err - end - - -- reformat / improve the stack trace - if prettyFuncName then -- we do have the real method name - err.trace = err.trace:gsub("in (%a+) 'methodInstance'", "in %1 '"..prettyFuncName.."'") - end - if STRIP_LUAUNIT_FROM_STACKTRACE then - err.trace = stripLuaunitTrace2(err.trace, err.msg) - end - - return err -- return the error "object" (table) - end - - - function M.LuaUnit:execOneFunction(className, methodName, classInstance, methodInstance) - -- When executing a test function, className and classInstance must be nil - -- When executing a class method, all parameters must be set - - if type(methodInstance) ~= 'function' then - self:unregisterSuite() - error( tostring(methodName)..' must be a function, not '..type(methodInstance)) - end - - local prettyFuncName - if className == nil then - className = '[TestFunctions]' - prettyFuncName = methodName - else - prettyFuncName = className..'.'..methodName - end - - if self.lastClassName ~= className then - if self.lastClassName ~= nil then - self:endClass() - end - self:startClass( className, classInstance ) - self.lastClassName = className - self.lastClassInstance = classInstance - end - - self:startTest(prettyFuncName) - - local node = self.result.currentNode - for iter_n = 1, self.exeRepeat or 1 do - if node:isNotSuccess() then - break - end - self.currentCount = iter_n - - -- run setUp first (if any) - if classInstance then - local func = self.asFunction( classInstance.setUp ) or - self.asFunction( classInstance.Setup ) or - self.asFunction( classInstance.setup ) or - self.asFunction( classInstance.SetUp ) - if func then - self:updateStatus(self:protectedCall(classInstance, func, className..'.setUp')) - end - end - - -- run testMethod() - if node:isSuccess() then - self:updateStatus(self:protectedCall(classInstance, methodInstance, prettyFuncName)) - end - - -- lastly, run tearDown (if any) - if classInstance then - local func = self.asFunction( classInstance.tearDown ) or - self.asFunction( classInstance.TearDown ) or - self.asFunction( classInstance.teardown ) or - self.asFunction( classInstance.Teardown ) - if func then - self:updateStatus(self:protectedCall(classInstance, func, className..'.tearDown')) - end - end - end - - self:endTest() - end - - function M.LuaUnit.expandOneClass( result, className, classInstance ) - --[[ - Input: a list of { name, instance }, a class name, a class instance - Ouptut: modify result to add all test method instance in the form: - { className.methodName, classInstance } - ]] - for methodName, methodInstance in sortedPairs(classInstance) do - if M.LuaUnit.asFunction(methodInstance) and M.LuaUnit.isMethodTestName( methodName ) then - table.insert( result, { className..'.'..methodName, classInstance } ) - end - end - end - - function M.LuaUnit.expandClasses( listOfNameAndInst ) - --[[ - -- expand all classes (provided as {className, classInstance}) to a list of {className.methodName, classInstance} - -- functions and methods remain untouched - - Input: a list of { name, instance } - - Output: - * { function name, function instance } : do nothing - * { class.method name, class instance }: do nothing - * { class name, class instance } : add all method names in the form of (className.methodName, classInstance) - ]] - local result = {} - - for i,v in ipairs( listOfNameAndInst ) do - local name, instance = v[1], v[2] - if M.LuaUnit.asFunction(instance) then - table.insert( result, { name, instance } ) - else - if type(instance) ~= 'table' then - error( 'Instance must be a table or a function, not a '..type(instance)..' with value '..prettystr(instance)) - end - local className, methodName = M.LuaUnit.splitClassMethod( name ) - if className then - local methodInstance = instance[methodName] - if methodInstance == nil then - error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) - end - table.insert( result, { name, instance } ) - else - M.LuaUnit.expandOneClass( result, name, instance ) - end - end - end - - return result - end - - function M.LuaUnit.applyPatternFilter( patternIncFilter, listOfNameAndInst ) - local included, excluded = {}, {} - for i, v in ipairs( listOfNameAndInst ) do - -- local name, instance = v[1], v[2] - if patternFilter( patternIncFilter, v[1] ) then - table.insert( included, v ) - else - table.insert( excluded, v ) - end - end - return included, excluded - end - - local function getKeyInListWithGlobalFallback( key, listOfNameAndInst ) - local result = nil - for i,v in ipairs( listOfNameAndInst ) do - if(listOfNameAndInst[i][1] == key) then - result = listOfNameAndInst[i][2] - break - end - end - if(not M.LuaUnit.asFunction( result ) ) then - result = _G[key] - end - return result - end - - function M.LuaUnit:setupSuite( listOfNameAndInst ) - local setupSuite = getKeyInListWithGlobalFallback("setupSuite", listOfNameAndInst) - if self.asFunction( setupSuite ) then - self:updateStatus( self:protectedCall( nil, setupSuite, 'setupSuite' ) ) - end - end - - function M.LuaUnit:teardownSuite(listOfNameAndInst) - local teardownSuite = getKeyInListWithGlobalFallback("teardownSuite", listOfNameAndInst) - if self.asFunction( teardownSuite ) then - self:updateStatus( self:protectedCall( nil, teardownSuite, 'teardownSuite') ) - end - end - - function M.LuaUnit:setupClass( className, instance ) - if type( instance ) == 'table' and self.asFunction( instance.setupClass ) then - self:updateStatus( self:protectedCall( instance, instance.setupClass, className..'.setupClass' ) ) - end - end - - function M.LuaUnit:teardownClass( className, instance ) - if type( instance ) == 'table' and self.asFunction( instance.teardownClass ) then - self:updateStatus( self:protectedCall( instance, instance.teardownClass, className..'.teardownClass' ) ) - end - end - - function M.LuaUnit:internalRunSuiteByInstances( listOfNameAndInst ) - --[[ Run an explicit list of tests. Each item of the list must be one of: - * { function name, function instance } - * { class name, class instance } - * { class.method name, class instance } - - This function is internal to LuaUnit. The official API to perform this action is runSuiteByInstances() - ]] - - local expandedList = self.expandClasses( listOfNameAndInst ) - if self.shuffle then - randomizeTable( expandedList ) - end - local filteredList, filteredOutList = self.applyPatternFilter( - self.patternIncludeFilter, expandedList ) - - self:startSuite( #filteredList, #filteredOutList ) - self:setupSuite( listOfNameAndInst ) - - for i,v in ipairs( filteredList ) do - local name, instance = v[1], v[2] - if M.LuaUnit.asFunction(instance) then - self:execOneFunction( nil, name, nil, instance ) - else - -- expandClasses() should have already taken care of sanitizing the input - assert( type(instance) == 'table' ) - local className, methodName = M.LuaUnit.splitClassMethod( name ) - assert( className ~= nil ) - local methodInstance = instance[methodName] - assert(methodInstance ~= nil) - self:execOneFunction( className, methodName, instance, methodInstance ) - end - if self.result.aborted then - break -- "--error" or "--failure" option triggered - end - end - - if self.lastClassName ~= nil then - self:endClass() - end - - self:teardownSuite( listOfNameAndInst ) - self:endSuite() - - if self.result.aborted then - print("LuaUnit ABORTED (as requested by --error or --failure option)") - self:unregisterSuite() - os.exit(-2) - end - end - - function M.LuaUnit:internalRunSuiteByNames( listOfName ) - --[[ Run LuaUnit with a list of generic names, coming either from command-line or from global - namespace analysis. Convert the list into a list of (name, valid instances (table or function)) - and calls internalRunSuiteByInstances. - ]] - - local instanceName, instance - local listOfNameAndInst = {} - - for i,name in ipairs( listOfName ) do - local className, methodName = M.LuaUnit.splitClassMethod( name ) - if className then - instanceName = className - instance = _G[instanceName] - - if instance == nil then - self:unregisterSuite() - error( "No such name in global space: "..instanceName ) - end - - if type(instance) ~= 'table' then - self:unregisterSuite() - error( 'Instance of '..instanceName..' must be a table, not '..type(instance)) - end - - local methodInstance = instance[methodName] - if methodInstance == nil then - self:unregisterSuite() - error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) - end - - else - -- for functions and classes - instanceName = name - instance = _G[instanceName] - end - - if instance == nil then - self:unregisterSuite() - error( "No such name in global space: "..instanceName ) - end - - if (type(instance) ~= 'table' and type(instance) ~= 'function') then - self:unregisterSuite() - error( 'Name must match a function or a table: '..instanceName ) - end - - table.insert( listOfNameAndInst, { name, instance } ) - end - - self:internalRunSuiteByInstances( listOfNameAndInst ) - end - - function M.LuaUnit.run(...) - -- Run some specific test classes. - -- If no arguments are passed, run the class names specified on the - -- command line. If no class name is specified on the command line - -- run all classes whose name starts with 'Test' - -- - -- If arguments are passed, they must be strings of the class names - -- that you want to run or generic command line arguments (-o, -p, -v, ...) - local runner = M.LuaUnit.new() - return runner:runSuite(...) - end - - function M.LuaUnit:registerSuite() - -- register the current instance into our global array of instances - -- print('-> Register suite') - M.LuaUnit.instances[ #M.LuaUnit.instances+1 ] = self - end - - function M.unregisterCurrentSuite() - -- force unregister the last registered suite - table.remove(M.LuaUnit.instances, #M.LuaUnit.instances) - end - - function M.LuaUnit:unregisterSuite() - -- print('<- Unregister suite') - -- remove our current instqances from the global array of instances - local instanceIdx = nil - for i, instance in ipairs(M.LuaUnit.instances) do - if instance == self then - instanceIdx = i - break - end - end - - if instanceIdx ~= nil then - table.remove(M.LuaUnit.instances, instanceIdx) - -- print('Unregister done') - end - - end - - function M.LuaUnit:initFromArguments( ... ) - --[[Parses all arguments from either command-line or direct call and set internal - flags of LuaUnit runner according to it. - - Return the list of names which were possibly passed on the command-line or as arguments - ]] - local args = {...} - if type(args[1]) == 'table' and args[1].__class__ == 'LuaUnit' then - -- run was called with the syntax M.LuaUnit:runSuite() - -- we support both M.LuaUnit.run() and M.LuaUnit:run() - -- strip out the first argument self to make it a command-line argument list - table.remove(args,1) - end - - if #args == 0 then - args = cmdline_argv - end - - local options = pcall_or_abort( M.LuaUnit.parseCmdLine, args ) - - -- We expect these option fields to be either `nil` or contain - -- valid values, so it's safe to always copy them directly. - self.verbosity = options.verbosity - self.quitOnError = options.quitOnError - self.quitOnFailure = options.quitOnFailure - - self.exeRepeat = options.exeRepeat - self.patternIncludeFilter = options.pattern - self.shuffle = options.shuffle - - options.output = options.output or os.getenv('LUAUNIT_OUTPUT') - options.fname = options.fname or os.getenv('LUAUNIT_JUNIT_FNAME') - - if options.output then - if options.output:lower() == 'junit' and options.fname == nil then - print('With junit output, a filename must be supplied with -n or --name') - os.exit(-1) - end - pcall_or_abort(self.setOutputType, self, options.output, options.fname) - end - - return options.testNames - end - - function M.LuaUnit:runSuite( ... ) - testNames = self:initFromArguments(...) - self:registerSuite() - self:internalRunSuiteByNames( testNames or M.LuaUnit.collectTests() ) - self:unregisterSuite() - return self.result.notSuccessCount - end - - function M.LuaUnit:runSuiteByInstances( listOfNameAndInst, commandLineArguments ) - --[[ - Run all test functions or tables provided as input. - - Input: a list of { name, instance } - instance can either be a function or a table containing test functions starting with the prefix "test" - - return the number of failures and errors, 0 meaning success - ]] - -- parse the command-line arguments - testNames = self:initFromArguments( commandLineArguments ) - self:registerSuite() - self:internalRunSuiteByInstances( listOfNameAndInst ) - self:unregisterSuite() - return self.result.notSuccessCount - end - - - --- class LuaUnit - --- For compatbility with LuaUnit v2 -M.run = M.LuaUnit.run -M.Run = M.LuaUnit.run - -function M:setVerbosity( verbosity ) - -- set the verbosity value (as integer) - M.LuaUnit.verbosity = verbosity -end -M.set_verbosity = M.setVerbosity -M.SetVerbosity = M.setVerbosity - - -return M \ No newline at end of file -- Gitee From 8448f0bab94baa7eb7e16dd598463a26ccf393b2 Mon Sep 17 00:00:00 2001 From: xuwenlong Date: Fri, 14 Jul 2023 09:14:33 +0800 Subject: [PATCH 05/29] =?UTF-8?q?=E4=BF=AE=E6=94=B9abiFilters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuwenlong --- thirdparty/oneDNN/docs/hap_integrate.md | 4 ++++ thirdparty/oneDNN/docs/pic/oneDNN_build.png | Bin 0 -> 52138 bytes 2 files changed, 4 insertions(+) create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_build.png diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md index 6c1a98e4..5d444d35 100644 --- a/thirdparty/oneDNN/docs/hap_integrate.md +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -57,6 +57,7 @@ ## 应用中使用三方库 - 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,动态库文件会自动拷贝到libs目录下打包,如下图所示: + ![thirdparty_install_dir](pic/oneDNN_js.png) - 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 @@ -75,6 +76,9 @@ ${allLibs} ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/) ``` + 修改IDE的entry/build-profile.json5 文件,增加编译架构过滤:"abiFilters": ["armeabi-v7a", "arm64-v8a"], 如下图所示: + + ![oneDNN_build](pic/oneDNN_build.png) ## 测试三方库 diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_build.png b/thirdparty/oneDNN/docs/pic/oneDNN_build.png new file mode 100755 index 0000000000000000000000000000000000000000..3a44fbf78c725c6d94bc99434b2eca64cf72b8a9 GIT binary patch literal 52138 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