// This test verifies that join points exist in the execution of field initializers. 

import org.aspectj.testing.Tester;

//class Tester {
//	public static void checkEqual(int i1, int i2, String s) {
//		System.err.println(s + ": " + i1 + " == " + i2);
//	}
//}

public class FieldInitializerJoinPoints {
    
    static int jcount = 0;
    static int kcount = 0;
    static int lcount = 0;
    static int mcount = 0;

    static int ncount = 0;
    static int ocount = 0;
    static int pcount = 0;
    static int qcount = 0;
    
    static int nMcount = 0;
    static int oMcount = 0;
    static int pMcount = 0;
    static int qMcount = 0;    

    static final int j = 99; // not even a set join point here. 
    static int k = 98;       // a set join point
    final int l = 97;        // not a join point (constant final)
    int m = 96;              // yet another set join point  

	void foo() {
		int i = 97;
		switch(i) {
			case l: System.err.println(l);
		}
	}

    static int n() { return 95; }
    static int o() { return 94; }
    static int p() { return 93; }
    static int q() { return 92; }

    static final int n = n(); // a call and set join point
    static int o = o();       // a call and set join point
    final int p = p();        // a call and set join point
    int q = q();              // a call and set join point

    public static void main(String[] args) {
	new FieldInitializerJoinPoints();
	new FieldInitializerJoinPoints();	

	Tester.checkEqual(jcount, 0, "jcount");
	Tester.checkEqual(kcount, 1, "kcount");
	Tester.checkEqual(lcount, 0, "lcount");
	Tester.checkEqual(mcount, 2, "mcount");

	Tester.checkEqual(ncount, 1, "ncount");
	Tester.checkEqual(ocount, 1, "ocount");
	Tester.checkEqual(pcount, 2, "pcount");
	Tester.checkEqual(qcount, 2, "qcount");	
	
	Tester.checkEqual(nMcount, 1, "nMcount");
	Tester.checkEqual(oMcount, 1, "oMcount");
	Tester.checkEqual(pMcount, 2, "pMcount");
	Tester.checkEqual(qMcount, 2, "qMcount");
    }

}




aspect A {
	public static void mumble(FieldInitializerJoinPoints fp) {
		System.err.println(fp.l);
	}
	
    before(): set(int FieldInitializerJoinPoints.j) { FieldInitializerJoinPoints.jcount++; }
    before(): set(int FieldInitializerJoinPoints.k) { FieldInitializerJoinPoints.kcount++; }
    before(): set(int FieldInitializerJoinPoints.l) { FieldInitializerJoinPoints.lcount++; }
    before(): set(int FieldInitializerJoinPoints.m) { FieldInitializerJoinPoints.mcount++; }

    before(): set(int FieldInitializerJoinPoints.n) { FieldInitializerJoinPoints.ncount++; }
    before(): set(int FieldInitializerJoinPoints.o) { FieldInitializerJoinPoints.ocount++; }
    before(): set(int FieldInitializerJoinPoints.p) { FieldInitializerJoinPoints.pcount++; }
    before(): set(int FieldInitializerJoinPoints.q) { FieldInitializerJoinPoints.qcount++; }

    before(): call(int FieldInitializerJoinPoints.n()) { FieldInitializerJoinPoints.nMcount++; }
    before(): call(int FieldInitializerJoinPoints.o()) { FieldInitializerJoinPoints.oMcount++; }
    before(): call(int FieldInitializerJoinPoints.p()) { FieldInitializerJoinPoints.pMcount++; }
    before(): call(int FieldInitializerJoinPoints.q()) { FieldInitializerJoinPoints.qMcount++; }
}