Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MSTest Shows Partial Code Coverage on Compound Boolean Expressions

From Microsoft's documentation, partially covered code is "...where some of the code blocks within the line were not executed." I'm pretty stumped on this one (simplified for brevity):

Given this method:

public List<string> CodeUnderTest()
{
    var collection = new List<string> { "test1", "test2", "test3" };
    return collection.Where(x => x.StartsWith("t") && x == "test2").ToList();
}

And this test:

[TestMethod]
public void Test()
{
    var result = new Class1().CodeUnderTest();
    CollectionAssert.Contains(result, "test2");
}

Code coverage results shows that the expression x.StartsWith("t") && x == "test2 is only partially covered. I'm not sure how that's possible unless the compiler or CLR has some sort of eager condition matching stuff, but maybe I just need to have it explained.

like image 664
lukiffer Avatar asked Oct 18 '12 05:10

lukiffer


1 Answers

The conditional-AND operator (&&) performs a logical-AND of its bool operands, but only evaluates its second operand if necessary.

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.100).aspx

so you would expect both sides to be covered

perhaps what it is complaining about is that you haven't tested the -ve paths i.e. if your collection is

var collection = new List<string> { "test1", "test2", "test3", "not_this_one" };

this way you test the x.StartsWith("t") being T/F because currently only the T path is being tested for that condition.

like image 148
Shaun Wilde Avatar answered Sep 18 '22 15:09

Shaun Wilde