Ajc121Tests.java

/* *******************************************************************
 * Copyright (c) 2004 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Public License v 2.0
 * which accompanies this distribution and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
 *
 * ******************************************************************/
package org.aspectj.systemtest.ajc121;

import java.net.URL;

import org.aspectj.testing.XMLBasedAjcTestCase;

import junit.framework.Test;

public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase {

  public static Test suite() {
    return XMLBasedAjcTestCase.loadSuite(Ajc121Tests.class);
  }

  protected URL getSpecFile() {
    return getClassResource("ajc121.xml");
  }

  public void test001(){
    runTest("false ambiguous binding error (introduced in 1.2rc2)");
  }

  public void test002(){
    runTest("An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc");
  }

  public void test003(){
    runTest("An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc");
  }

  public void test004(){
    runTest("An if() pointcut inside a perthis() clauses an ABORT - null pointer exception in ajc");
  }

  public void test005(){
    runTest("compiler aborts with 'conflicting dominates orders' with circular declare precedences");
  }

  public void test006(){
    runTest("'can't bind type' message has $ for . in type name for declare soft");
  }

  public void test007(){
    runTest("Hiding of Instance Methods by static methods");
  }

  public void test008(){
    runTest("if(false) optimisation");
  }

  public void test009(){
    runTest("if(true) optimisation");
  }

  public void test010(){
    runTest("java.lang.NullPointerException in WeaverMessageHandler class");
  }

  public void test011(){
    runTest("ClassCastException at BcelRenderer.java:169");
  }

  public void test012(){
    runTest("Front-end bug, shouldn't allow patterns of the form foo.., should be foo..*");
  }

  public void test013() {
  	runTest("Nullpointer-Exception when defining a withincode() pointcut");
  }

  public void test014() {
  	runTest("NPE, Incorrect XLint:unmatchedSuperTypeInCall warning");
  }

  public void test015_invalidXlint() { // keywords: "laurie hendren"
  	runTest("invalid warning indicating no match when a match really occurs");
  }

  public void test016_ByteConversionInstructions() {
  	runTest("RuntimeException thrown: Could not find instruction: org.apache.bcel.generic.B2I");
  	String output = getLastRunResult().getStdErr();
  	assertTrue("Expected to find [b2] in this output but didn't:"+output, output.contains("[b2]"));
  	assertTrue("Expected to find [b127] in this output but didn't:"+output, output.contains("[b127]"));
  	assertTrue("Expected to find [b0] in this output but didn't:"+output, output.contains("[b0]"));

  	assertTrue("Expected to find [c65] in this output but didn't:"+output, output.contains("[c65]"));
  	assertTrue("Expected to find [c66] in this output but didn't:"+output, output.contains("[c66]"));
  	assertTrue("Expected to find [c67] in this output but didn't:"+output, output.contains("[c67]"));

  	assertTrue("Expected to find [s1] in this output but didn't:"+output, output.contains("[s1]"));
  	assertTrue("Expected to find [s32767] in this output but didn't:"+output, output.contains("[s32767]"));
  	assertTrue("Expected to find [b0] in this output but didn't:"+output, output.contains("[b0]"));
  }

  public void test017_PrivateMethodCallsInAroundAdvice() {
    runTest("Cannot advise private method call in around advice");
    System.err.println(getLastRunResult().getStdErr());
  }

  public void test018_PrivateFieldSetsInAroundAdvice() {
    runTest("Cannot advise private field sets in around advice");
    System.err.println(getLastRunResult().getStdErr());
  }

  public void test019_PrivateFieldGetsInAroundAdvice() {
    runTest("Cannot advise private field gets in around advice");
    System.err.println(getLastRunResult().getStdErr());
  }

// test takes over 5 minutes to run, so not included in normal suite run
//  public void test020_branchTargetOffsetTooLargeForShort() {
//      runTest("Branch target offset too large for short");
//  }

//  public void test021_BcelFailureWithVeryLargeClasses() {
//      runTest("Weaver fails in BCEL for large classes");
//  }
//
//  public void test022_BcelFailureWithVeryLargeClasses_Binary() {
//      runTest("Weaver fails in BCEL for large classes (binary)");
//  }

  public void test023_proceedInAround1() {
      runTest("proceed used as method name in around advice (1)");
  }

  public void test024_proceedInAround2() {
      runTest("proceed used as method name in around advice (2)");
  }

  public void test025_proceedInAround3() {
      runTest("proceed used as method name in around advice (3)");
  }

  public void test026_bindingThisAndTargetToTheSameFormal() {
  	runTest("ajc crashes when compiling the following program (binding this() and target())");
  }

  public void test027_itdsOnInnerClassesAsStatic() {
      runTest("ITDs on inner classes should be static context");
  }

  public void test028_itdsAndInitializers() {
    runTest("resolution of IT field inits");
  }

  public void test029_falseInvalidAbsoluteTypeName() {
    runTest("Valid but inaccessible type names should not be flagged by XLint:invalidAbsoluteTypeName");
  }

  public void test030_privateITDinitialisersBeingMatched() {
    runTest("intertype initialisers should match field set pointcuts");
  }

  public void test031_privateITDinitialisersBeingMatched_OxfordTest() {
    runTest("intertype initialisers should match field set pointcuts (oxford testcase)");
    //System.err.println(">"+getLastRunResult().getStdErr());
    String exp = ":set field set(int C.n):set field set(int C.m):get field get(int C.n):set field set(int C.n)";
    assertTrue("Expected output '"+exp+"' but got "+getLastRunResult().getStdErr(),
    		getLastRunResult().getStdErr().equals(exp));
  }

  public void test032_stringConcatForDEOW() {
    runTest("Compile time declarations (warning and error) do not accept string concatenation (with +)");
  }

  public void test033_stringConcatForDEOWErrorCase() {
    runTest("Compile time declarations (warning and error) do not accept string concatenation (with +) (2)");
  }

  public void test034_scopeForITDS_pr61768() {
      runTest("scope for inter-type methods");
  }

  public void test035_innerAspectCallsPrivateMethod_pr71372() {
    runTest("NoSuchMethodError calling private method from around advice in inner aspect");
    String s = getLastRunResult().getStdErr();
    assertTrue("Expected ':before:around' but got "+s,
    		   s.equals(":before:around"));
  }

  public void test036_innerAspectCallsPrivateMethod_pr71372_2() {
    runTest("NoSuchMethodError calling private method from around advice in inner aspect (2)");
    String s = getLastRunResult().getStdErr();
    assertTrue("Expected ':before:around' but got "+s,
    		   s.equals(":before:around"));
  }

  public void test037_innerAspectCallsPrivateMethod_pr71372_3() {
    runTest("NoSuchMethodError calling private method from around advice in inner aspect (3)");
    String s = getLastRunResult().getStdErr();
    assertTrue("Expected ':before:around' but got "+s,
    		   s.equals(":before:around"));
  }

  public void test038_innerAspectCallsPrivateMethod_pr71372_4() {
    runTest("NoSuchMethodError calling private method from around advice in inner aspect (4)");
    String s = getLastRunResult().getStdErr();
    assertTrue("Expected ':before:around' but got "+s,
    		   s.equals(":before:around"));
  }

  public void test039_privilegedAspectAccessingPrivateMethods_pr67579() {
  	runTest("NPE on privileged aspect error");
  }

  public void test040_privilegedAspectAccessingPrivateMethods_pr67579_2() {
  	runTest("NPE on privileged aspect error (2)");
  }

  public void test041_ITDaccessingPrivateMethod_pr67578() {
  	runTest("Privileged Aspect Access Problem Across Packages");
  }

  public void test042_ITDaccessingPrivateMethod_pr67578_2() {
  	runTest("Privileged Aspect Access Problem Across Packages (2)");
  }

  public void test043_pr62642_ExceptionInInitializerError() {
    runTest("proper handling of ExceptionInIntializer inside clinit in presence of after throwing advice");
    String s = getLastRunResult().getStdErr();
    assertTrue("Output should contain java.lang.ExceptionInInitializerError but is '"+s+"'",
			s.contains("java.lang.ExceptionInInitializerError"));
    // No getCause on 1.3 JVMs
//    assertTrue("Output should contain 'CAUSE=org.aspectj.lang.NoAspectBoundException' but is '"+s+"'",
//            s.indexOf("CAUSE=org.aspectj.lang.NoAspectBoundException")!=-1);
  }

  public void test044_ITDnameClashes() {
    	runTest("ITD name clashes with private members");
  }

  public void test045_ITDprotectedVisibility() {
  	runTest("Inconsistency in scoping of protected members in ITDs");
  }

  public void test045_wrongLineForExecutionJoinPoint() {
  	runTest("wrong line for method execution join point");
  }

  public void test046_interfaceITD_pr70794_1() {
    runTest("The introduction on interface causes the interface implementation class error (1)");
  }

  public void test047_interfaceITD_pr70794_2() {
    runTest("The introduction on interface causes the interface implementation class error (2)");
  }

  public void test048_interfaceITD_pr70794_3() {
    runTest("The introduction on interface causes the interface implementation class error (3)");
  }

  public void test049_interfaceITD_pr70794_4() {
    runTest("The introduction on interface causes the interface implementation class error (4)");
  }

  public void test050_typePatternMatchingWithArrays() {
  	runTest("declare warning warns at wrong points");
  }

  public void test052_bogusMessage1() {
    runTest("Bogus error message: The abstract method ajc$pointcut$$tracingScope$a2 in type Tracing can only be defined by an abstract class (1)");
  }

  public void test053_bogusMessage2() {
    runTest("Bogus error message: The abstract method ajc$pointcut$$tracingScope$a2 in type Tracing can only be defined by an abstract class (2)");
  }

  public void test054_cnfe() {
    runTest("passing null to array arguments confuzes static join point signature. (1)");
  }

  public void test055_cnfe() {
    runTest("passing null to array arguments confuzes static join point signature. (2)");
  }

  public void test056_arrayCloning() {
    runTest("around advice throws java.lang.VerifyError at runtime");
  }

  public void test057_decSoftWithSuper() {
      runTest("declare soft can cause programs with invalid exception behaviour to be generated");
  }

  public void test058_npeOnTJPerror() {
    runTest("NPE on thisJoinPoint mistake");
  }

  public void test059_cflowOptimization_counters() {
  	runTest("Optimization of cflow - counters (1)");
  }

  public void test060_cflowOptimization_counters() {
  	runTest("Optimization of cflow - shared counters (2)");
  }

  public void test061_cflowOptimization_counters() {
  	runTest("Optimization of cflow - shared stacks (3)");
  }

  public void test062_cflowOptimization_counters() {
  	runTest("Optimization of cflow - counters (4)");
  }

  public void test063_cflowOptimization_countersWithAbstractPcuts() {
  	runTest("Optimization of cflow - counters with abstract pointcuts (5)");
  }

  public void test064() {
  	runTest("Anonymous classes unaware of introductions into abstract classes");
  }

  private int countLines(String s) {
    int lines = 0;
    int idx = 0;
    while (s.indexOf("\n",idx)!=-1) {
    	lines++;
    	idx = s.indexOf("\n",idx)+1;
    }
    return lines;
  }

  public void test065() {
  	runTest("before,after not (cflow(within(Trace*))) prints nothing");
  	String s = getLastRunResult().getStdErr();
  	int lines = countLines(s);
	assertTrue("The actual output does not match the expected output.  Expected 102 lines but got "+
			   lines+" lines.  Actual output =\n"+s,lines==102);
	// IF YOU WANT TO SEE THE EXPECTED OUTPUT, LOOK IN THE TEST PROGRAM bugs/WhatsGoingOn.java
  }

}