引导PEX尝试排序的数组输入

时间:2013-09-24 12:45:25

标签: pex

我有以下测试方法,它接受一个字符串数组,复制它,对其进行排序,然后断言已排序的复制元素应该与原始元素不同。

在大多数情况下,此测试应该通过,但我认为如果输入数组恰好已经排序,它应该会失败。

我无法让PEX发现这种情况(除了将其作为种子输入提供)。我可以在PEX中配置什么,或者改变测试的编写方式,以使PEX更有可能发现这个问题?发现这样的输入是否超出了PEX / Z3的能力?

[TestClass]
public class SortingPexTest
{
    [PexMethod(TestEmissionFilter = PexTestEmissionFilter.All, MaxConstraintSolverTime = 4)]
    [PexAllowedContractRequiresFailure]
    public void TM([PexAssumeNotNull] String[] L0)
    {
        PexAssume.AreElementsNotNull(L0);
        PexAssume.AreDistinctValues(L0);

        String[] L1 = new String[L0.Length];
        L0.CopyTo(L1, 0);
        Array.Sort(L1);

        PexAssert.IsTrue(!L0.SequenceEqual(L1));
    }
}

Microsoft Pex 0.94.51023.0 Microsoft Pex Visual Studio Extensions

1 个答案:

答案 0 :(得分:1)

某些版本的Array.Copy在当前的CLR实现中通过调用本机代码进行了优化。似乎Pex受到这个事实的影响,因为它无法跟踪Array.Copy例程中的数据流。

通过此修改,测试失败多次:

String[] L1 = L0.OrderBy(x => x).ToArray();

这可能是Pex中的一个缺陷,因为它不会像使用许多其他东西那样用可分析版本替换Array.Copy