Skip to content

MSTEST0037 analyzer should suggest Contains/DoesNotContain/ContainsSingle for overloads taking a predicate #6360

@cremor

Description

@cremor

Summary

It would be nice if the MSTEST0037 analyzer could suggest changing Linq statements with predicates that can be instead written with Assert.Contains, Assert.DoesNotContain or Assert.ContainsSingle.

Background and Motivation

Cleaner code.

Proposed Feature

The MSTEST0037 analyzer (and code fix) should be extended to cover these cases:

[TestClass]
public sealed class Test1
{
    private readonly IEnumerable<int> _enumerable = [];

    [TestMethod]
    public void ShouldSuggestContainsSingle()
    {
        // Expected analyzer suggestion:
        //Assert.ContainsSingle(x => x == 1, _enumerable);

        Assert.AreEqual(1, _enumerable.Where(x => x == 1).Count());
        Assert.AreEqual(1, _enumerable.Count(x => x == 1));
    }

    [TestMethod]
    public void ShouldSuggestContains()
    {
        // Expected analyzer suggestion:
        //Assert.Contains(x => x == 1, _enumerable);

        Assert.IsTrue(_enumerable.Where(x => x == 1).Any());
        Assert.IsTrue(_enumerable.Any(x => x == 1));

        Assert.AreNotEqual(0, _enumerable.Where(x => x == 1).Count());
        Assert.AreNotEqual(0, _enumerable.Count(x => x == 1));

        Assert.IsTrue(_enumerable.Where(x => x == 1).Count() > 0);
        Assert.IsTrue(_enumerable.Count(x => x == 1) > 0);

        // I added those only because the analyzer currently suggests them instead of the 'Assert.IsTrue' above.
        Assert.IsGreaterThan(0, _enumerable.Where(x => x == 1).Count());
        Assert.IsGreaterThan(0, _enumerable.Count(x => x == 1));
    }

    [TestMethod]
    public void ShouldSuggestDoesNotContain()
    {
        // Expected analyzer suggestion:
        //Assert.DoesNotContain(x => x == 1, _enumerable);

        Assert.IsFalse(_enumerable.Where(x => x == 1).Any());
        Assert.IsFalse(_enumerable.Any(x => x == 1));

        Assert.AreEqual(0, _enumerable.Where(x => x == 1).Count());
        Assert.AreEqual(0, _enumerable.Count(x => x == 1));

        Assert.IsFalse(_enumerable.Where(x => x == 1).Count() > 0);
        Assert.IsFalse(_enumerable.Count(x => x == 1) > 0);

        // I added those only because the analyzer currently suggests them instead of the 'Assert.IsFalse' above.
        Assert.IsLessThanOrEqualTo(0, _enumerable.Where(x => x == 1).Count());
        Assert.IsLessThanOrEqualTo(0, _enumerable.Count(x => x == 1));
    }
}

Metadata

Metadata

Assignees

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions