--|测试数据生成器--介绍QuickCheck测试数据生成器的示例--2016年功能编程课程。--托马斯·哈格伦模块TestDataGenerator,其中导入数据。列表(nub)导入测试。快速检查导入过载导入ExhaustiveTesting隐藏((==>))----------------------------------------------------------------------------------*针对您自己的数据类型测试数据生成器--(使用上周扑克牌的数据类型){-data套装=黑桃|红桃|钻石|梅花推导(Show,Eq)-}rSuit::通用套装rSuit=元素[黑桃、红心、钻石、梅花]{-data排名=数字Int | Jack | Queen | King | Ace推导(Show、Eq、Ord)all_ranks=[数字n|n<-[2..10]]++[杰克、皇后、国王、王牌]-}rRank_v1::Gen等级rRank_v1=元素all_ranks--**生成排名的更结构化方法r数字::Gen等级rNumeric=元素[Numeric n | n<-[2..10]]rFaceCard::Gen等级rFaceCard=元素[Jack,Queen,King,Ace]rRank_v2::Gen等级rRank_v2=[rNumeric,rFaceCard]之一rRank_v3::Gen等级rRank_v3=频率[(9,rNumeric),(4,rFaceCard)]r等级=r等级_v3--data Card=卡牌等级套装衍生秀rCard::通用卡rCard=do r<-r银行s<-r套装return(卡)----------------------------------------------------------------------------------*更多使用do和return定义的生成器示例evenInteger::Gen整数evenInteger=do n<-任意返回(2*n)非负::Gen整数非负=do n<-任意返回(abs n)pairsOfEvenIntegers=doTwice evenIntegerdoTwice io=do x<-ioy<-io返回(x,y)--data Hand=Empty |添加卡片手派生显示--|生成随机手牌rHand_v1::Gen HandrHand_v1=其中之一[return Empty,做c<-rCardh<-r手_v1return(添加c h)]--|更多大手牌rHand_v2::通用手rHand_v2=频率[(1,return Empty),(4,做c<-rCardh<-r手_v1return(添加c h))]--|从卡片列表生成手牌,消除重复的卡片rHand_v3::通用手rHand_v3=做卡片<-任意return(listToHand(核心卡))listToHand::[Card]->手listToHand=foldr添加空rHand=rHand_v2----------------------------------------------------------------------------------*在Arbitrary类中生成实例以指定默认测试--数据生成器实例任意诉讼,其中任意=rSuit实例任意等级,其中任意=rRank实例任意卡,其中任意=rCardinstance任意手,其中任意=rHand----------------------------------------------------------------------------------*测试测试数据生成器--|并非所有Rank类型的值都是有效的等级。validRank(数字n)=2<=n&&n<=10validRank _=真--|显式指定测试数据生成器(使用forAll),--测试rRank只生成有效的等级。prop_all_validRank_1=用于所有rRank validRank--|测试“任意”仅生成有效等级--prop_all_validRank_2 r=--|检查测试数据分布(使用collect)--prop_all_validRank_3 r=--|检查“任意”生成的手的尺寸分布--prop_手柄h=size空=0尺寸(加上c h)=1+尺寸h----------------------------------------------------------------------------------*测试算法属性--|在排序列表的右侧插入新元素插入:命令a=>a->[a]->[a]插入x[]=[x]插入x(y:ys)|x[a] ->布尔isOrdered[]=真isOrdered[x]=真按顺序(x1:x2:xs)=x1<=x2&&按顺序(x2:x)--|测试插件,首次尝试--prop_insert_1 x xs=--|测试插入,第二次尝试--属性插入2 x xs=--|随机生成的列表中有多少是有序的?--prop_isOrdered xs=--**使用有序列表进行测试--|使用orderedList--prop_插入_3 x=--|使用有序--prop_插入_4 x