using System;

class Test
{
    void Test1(string[] args)
    {
        // BAD: Loop upper bound is off-by-one
        for (int i = 0; i <= args.Length; i++) // $ Alert
        {
            Console.WriteLine(args[i]);
        }

        // BAD: Loop upper bound is off-by-one
        for (int i = 0; args.Length >= i; i++) // $ Alert
        {
            Console.WriteLine(args[i]);
        }

        // GOOD: Loop upper bound is correct
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine(args[i]);
        }

        int j = 0;
        // BAD: Off-by-one on index validity check
        if (j <= args.Length) // $ Alert
        {
            Console.WriteLine(args[j]);
        }

        // BAD: Off-by-one on index validity check
        if (args.Length >= j) // $ Alert
        {
            Console.WriteLine(args[j]);
        }
    }

    void Test2(string[] args)
    {
        int j = 0;

        // GOOD: Correct terminating value
        if (args.Length > j)
        {
            Console.WriteLine(args[j]);
        }
    }

    void Test3(string[] args)
    {
        // GOOD: Guarded by ternary operator.
        for (int i = 0; i <= args.Length; i++)
        {
            string s = i < args.Length ? args[i] : "";
        }
    }

    void Test4(string[] args)
    {
        int j = 0;

        // GOOD: Guarded by ternary operator.
        if( j <= args.Length )
        {
            string s = j < args.Length ? args[j] : "";
        }
    }

    void Test5(string[] args)
    {
        // GOOD: A valid test of Length.
        for (int i = 0; i != args.Length; i++)
        {
            Console.WriteLine(args[i]);
        }
    }

    void Test6(string[] args)
    {
        int j = 0;

        // GOOD: There is another correct test.
        if( j <= args.Length )
        {
            if (j == args.Length) return;
            Console.WriteLine(args[j]);
        }
    }

    void Test7(string[] args)
    {
        // GOOD: Guarded by ||.
        for (int i = 0; i <= args.Length; i++)
        {
            bool b = i == args.Length || args[i] == "x";
        }
    }
}
