以不同顺序执行时测试失败
Test failing when executed in a different order
当我执行这个程序时:
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 执行了测试程序,但显然该部门没有任何问题。
有什么提示吗?
请在最近发布的rakudo 2019.11上重新测试。当我重构 NativeCall 设置代码时,很有可能我已经修复了这个问题。
当我执行这个程序时:
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 执行了测试程序,但显然该部门没有任何问题。
有什么提示吗?
请在最近发布的rakudo 2019.11上重新测试。当我重构 NativeCall 设置代码时,很有可能我已经修复了这个问题。