首页 > 解决方案 > 以不同顺序执行时测试失败

问题描述

当我执行这个程序时:

use Test;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }

ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';

测试工作正常,即使我以这种方式交换两个“ok”测试:

ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';

如果我将声明移至模块:

unit module mymodule;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }

并编写一个测试程序:

use Test;
use lib '.';
use mymodule;

ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';

再次执行这两个测试没有错误,但如果我交换最后两行:

ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';

我收到此错误: Type check failed for return value; expected Num but got Whatever (*)我不明白为什么。我什至怀疑可能是内存损坏,所以我使用 valgrind 执行了测试程序,但显然那个部门没有任何问题。有什么提示吗?

标签: testingraku

解决方案


请在最近发布的 rakudo 2019.11 上重新测试。当我重构 NativeCall 设置代码时,我很有可能已经修复了这个问题。


推荐阅读