/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

public class InstField {
    public boolean mBoolean1, mBoolean2;
    public byte mByte1, mByte2;
    public char mChar1, mChar2;
    public short mShort1, mShort2;
    public int mInt1, mInt2;
    public float mFloat1, mFloat2;
    public long mLong1, mLong2;
    public double mDouble1, mDouble2;
    public volatile long mVolatileLong1, mVolatileLong2;

    public void run() {
        assignFields();
        checkFields();
        InstField.nullCheck(null);
    }

    /*
     * Check access to instance fields through a null pointer.
     */
    static public void nullCheck(InstField nully) {
        System.out.println("InstField.nullCheck");
        try {
            int x = nully.mInt1;
            Main.assertTrue(false);
        } catch (NullPointerException npe) {
            // good
        }
        try {
            long l = nully.mLong1;
            Main.assertTrue(false);
        } catch (NullPointerException npe) {
            // good
        }
        try {
            nully.mInt1 = 5;
            Main.assertTrue(false);
        } catch (NullPointerException npe) {
            // good
        }
        try {
            nully.mLong1 = 17L;
            Main.assertTrue(false);
        } catch (NullPointerException npe) {
            // good
        }
    }

    public void assignFields() {
        System.out.println("InstField assign...");
        mBoolean1 = true;
        mBoolean2 = false;
        mByte1 = 127;
        mByte2 = -128;
        mChar1 = 32767;
        mChar2 = 65535;
        mShort1 = 32767;
        mShort2 = -32768;
        mInt1 = 65537;
        mInt2 = -65537;
        mFloat1 = 3.1415f;
        mFloat2 = -1.0f / 0.0f;                // -inf
        mLong1 = 1234605616436508552L;     // 0x1122334455667788
        mLong2 = -1234605616436508552L;
        mDouble1 = 3.1415926535;
        mDouble2 = 1.0 / 0.0;               // +inf
        mVolatileLong1 = mLong1 - 1;
        mVolatileLong2 = mLong2 + 1;
    }

    public void checkFields() {
        System.out.println("InstField check...");
        Main.assertTrue(mBoolean1);
        Main.assertTrue(!mBoolean2);
        Main.assertTrue(mByte1 == 127);
        Main.assertTrue(mByte2 == -128);
        Main.assertTrue(mChar1 == 32767);
        Main.assertTrue(mChar2 == 65535);
        Main.assertTrue(mShort1 == 32767);
        Main.assertTrue(mShort2 == -32768);
        Main.assertTrue(mInt1 == 65537);
        Main.assertTrue(mInt2 == -65537);
        Main.assertTrue(mFloat1 > 3.141f && mFloat1 < 3.142f);
        Main.assertTrue(mFloat2 < mFloat1);
        Main.assertTrue(mLong1 == 1234605616436508552L);
        Main.assertTrue(mLong2 == -1234605616436508552L);
        Main.assertTrue(mDouble1 > 3.141592653 && mDouble1 < 3.141592654);
        Main.assertTrue(mDouble2 > mDouble1);
        Main.assertTrue(mVolatileLong1 == 1234605616436508551L);
        Main.assertTrue(mVolatileLong2 == -1234605616436508551L);
    }
}
