// --------------
// Operators.java
// --------------

final class OperatorsTest {
    public static void main (String[] args) {
        System.out.println("Operators.java");

        {
        final int i = 2;
        final int j = -i;
        assert i ==  2;
        assert j == -2;
//      ++-i;                    // doesn't compile
        }

        {
        int i = 2;
        int j = ++i;
        assert i == 3;
        assert j == 3;
//      ++++i;                   // doesn't compile
        }

        {
        int i = 2;
        int j = i++;
        assert i == 3;
        assert j == 2;
//      i++++;                   // doesn't compile
        }

        {
              int i = 2;
        final int j = 3;
        final int k = (i = j);
        assert i == 3;
        assert j == 3;
        assert k == 3;
//      ++(i = j);               // doesn't compile
        }

        {
        final int i = 2;
        final int j = 3;
        final int k = i + j;
        assert i == 2;
        assert j == 3;
        assert k == 5;
//      ++(i + j);               // doesn't compile
        }

        {
              int i = 2;
        final int j = 3;
        int k = (i += j);
        assert i == 5;
        assert j == 3;
        assert k == 5;
//      ++(i += j);              // doesn't compile
        }

        {
        final int i = 12;
        final int j = 10;
        final int k = i % j;
        assert i == 12;
        assert j == 10;
        assert k ==  2;
//      ++(i % j);               // doesn't compile
        }

        {
              int i = 12;
        final int j = 10;
        final int k = (i %= j);
        assert i ==  2;
        assert j == 10;
        assert k ==  2;
//      ++(i %= j);              // doesn't compile
        }

        {
        final int i = 2;
        final int j = 3;
        final int k = i << j;
        assert i ==  2;
        assert j ==  3;
        assert k == 16;
//      ++(i << j);              // doesn't compile
        }

        {
              int i = 2;
        final int j = 3;
        final int k = (i <<= j);
        assert i == 16;
        assert j ==  3;
        assert k == 16;
//      ++(i <<= j);             // doesn't compile
        }

        {
        final int i = 10;        // 0000 0000 0000 1010
        final int j = ~i;        // 1111 1111 1111 0101
        assert i ==  10;
        assert j == -11;
        final int k = ~i + 1;    // 1111 1111 1111 0110
        assert i ==  10;
        assert k == -10;
//      ++~i;
        }

        {
        final int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = i & j;     // 1000
        assert i == 10;
        assert j == 12;
        assert k ==  8;
//      ++(i & j);               // doesn't compile
        }

        {
              int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = (i &= j);  // 1000
        assert i ==  8;
        assert j == 12;
        assert k ==  8;
//      ++(i &= j);              // doesn't compile
        }

        {
        final int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = i | j;     // 1110
        assert i == 10;
        assert j == 12;
        assert k == 14;
//      ++(i | j);               // doesn't compile
        }

        {
              int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = (i |= j);  // 1110
        assert i == 14;
        assert j == 12;
        assert k == 14;
//      ++(i |= j);              // doesn't compile
        }

        {
        final int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = i ^ j;     // 0110
        assert i == 10;
        assert j == 12;
        assert k ==  6;
//      ++(i ^ j);               // doesn't compile
        }

        {
              int i = 10;        // 1010
        final int j = 12;        // 1100
        final int k = (i ^= j);  // 0110
        assert i ==  6;
        assert j == 12;
        assert k ==  6;
//      ++(i ^= j);              // doesn't compile
        }

        {
        int i = 10;              // 1010
        int j = 12;              // 1100
        i ^= j;
        assert i ==  6;          // 0110
        assert j == 12;          // 1100
        j ^= i;
        assert i ==  6;          // 0110
        assert j == 10;          // 1010
        i ^= j;
        assert i == 12;          // 1100
        assert j == 10;          // 1010
        }

        {
        int i = 10;
        int j = 12;
        i += j;
        assert i == 22;
        assert j == 12;
        j = i - j;
        assert i == 22;
        assert j == 10;
        i -= j;
        assert i == 12;
        assert j == 10;
        }

        {
        final boolean a = true;
        final boolean b = true;
        final boolean c = false;
        assert a && b;
        assert !(a && c);
        assert a || b;
        assert a || c;
        assert (a && b) == !(!a || !b);
        assert (a && c) == !(!a || !c);
        }

        System.out.println("Done.");}}
