You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SignaturePatternTestCase.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Common Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/cpl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.patterns;
  13. import java.io.*;
  14. import junit.framework.*;
  15. import org.aspectj.weaver.*;
  16. import org.aspectj.weaver.bcel.*;
  17. public class SignaturePatternTestCase extends TestCase {
  18. /**
  19. * Constructor for PatternTestCase.
  20. * @param name
  21. */
  22. public SignaturePatternTestCase(String name) {
  23. super(name);
  24. }
  25. BcelWorld world = new BcelWorld();
  26. public void testThrowsMatch() throws IOException {
  27. Member onlyDerivedOnDerived = Member.methodFromString("static void fluffy.Derived.onlyDerived()");
  28. Member mOnBase = Member.methodFromString("void fluffy.Base.m()");
  29. Member mOnDerived = Member.methodFromString("void fluffy.Derived.m()");
  30. checkMatch(makeMethodPat("* fluffy.Base.*(..) throws java.lang.CloneNotSupportedException"),
  31. new Member[] { mOnBase },
  32. new Member[] { mOnDerived });
  33. checkMatch(makeMethodPat("* fluffy.Derived.*(..) throws java.lang.CloneNotSupportedException"),
  34. new Member[] { },
  35. new Member[] { mOnBase, mOnDerived });
  36. //XXX need pattern checks
  37. Member[] NONE = new Member[] {};
  38. Member[] M = new Member[] { onlyDerivedOnDerived };
  39. Member[] NO_EXCEPTIONS = new Member[] { mOnDerived };
  40. Member[] BOTH = new Member[] {mOnDerived, onlyDerivedOnDerived};
  41. checkMatch(makeMethodPat("* *(..)"), M, NONE);
  42. checkMatch(makeMethodPat("* *(..) throws !*"), NO_EXCEPTIONS, M);
  43. checkMatch(makeMethodPat("* *(..) throws *"), M, NO_EXCEPTIONS);
  44. checkMatch(makeMethodPat("* *(..) throws *, !*"), NONE, BOTH);
  45. checkMatch(makeMethodPat("* *(..) throws (!*)"), NONE, BOTH);
  46. checkMatch(makeMethodPat("* *(..) throws !(!*)"), BOTH, NONE);
  47. checkMatch(makeMethodPat("* *(..) throws *..IOException"), M, NO_EXCEPTIONS);
  48. checkMatch(makeMethodPat("* *(..) throws *..IOException, *..Clone*"), M, NO_EXCEPTIONS);
  49. checkMatch(makeMethodPat("* *(..) throws *..IOException, !*..Clone*"), NONE, BOTH);
  50. checkMatch(makeMethodPat("* *(..) throws !*..IOException"), NO_EXCEPTIONS, M);
  51. }
  52. public void testInstanceMethodMatch() throws IOException {
  53. Member objectToString = Member.methodFromString("java.lang.String java.lang.Object.toString()");
  54. Member integerToString = Member.methodFromString("java.lang.String java.lang.Integer.toString()");
  55. Member integerIntValue = Member.methodFromString("int java.lang.Integer.intValue()");
  56. //Member objectToString = Member.methodFromString("java.lang.String java.lang.Object.toString()");
  57. checkMatch(makeMethodPat("* java.lang.Object.*(..)"),
  58. new Member[] { objectToString, integerToString },
  59. new Member[] { integerIntValue });
  60. checkMatch(makeMethodPat("* java.lang.Integer.*(..)"),
  61. new Member[] { integerIntValue, integerToString },
  62. new Member[] { objectToString });
  63. }
  64. public void testStaticMethodMatch() throws IOException {
  65. Member onlyBaseOnBase = Member.methodFromString("static void fluffy.Base.onlyBase()");
  66. Member onlyBaseOnDerived = Member.methodFromString("static void fluffy.Derived.onlyBase()");
  67. Member onlyDerivedOnDerived = Member.methodFromString("static void fluffy.Derived.onlyDerived()");
  68. Member bothOnBase = Member.methodFromString("static void fluffy.Base.both()");
  69. Member bothOnDerived = Member.methodFromString("static void fluffy.Derived.both()");
  70. checkMatch(makeMethodPat("* fluffy.Base.*(..)"),
  71. new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase },
  72. new Member[] { onlyDerivedOnDerived, bothOnDerived });
  73. checkMatch(makeMethodPat("* fluffy.Derived.*(..)"),
  74. new Member[] { onlyBaseOnDerived, bothOnDerived, onlyDerivedOnDerived },
  75. new Member[] { onlyBaseOnBase, bothOnBase });
  76. }
  77. public void testFieldMatch() throws IOException {
  78. Member onlyBaseOnBase = Member.fieldFromString("int fluffy.Base.onlyBase");
  79. Member onlyBaseOnDerived = Member.fieldFromString("int fluffy.Derived.onlyBase");
  80. Member onlyDerivedOnDerived = Member.fieldFromString("int fluffy.Derived.onlyDerived");
  81. Member bothOnBase = Member.fieldFromString("int fluffy.Base.both");
  82. Member bothOnDerived = Member.fieldFromString("int fluffy.Derived.both");
  83. checkMatch(makeFieldPat("* fluffy.Base.*"),
  84. new Member[] { onlyBaseOnBase, onlyBaseOnDerived, bothOnBase },
  85. new Member[] { onlyDerivedOnDerived, bothOnDerived });
  86. checkMatch(makeFieldPat("* fluffy.Derived.*"),
  87. new Member[] { onlyBaseOnDerived, bothOnDerived, onlyDerivedOnDerived },
  88. new Member[] { onlyBaseOnBase, bothOnBase });
  89. }
  90. public void testConstructorMatch() throws IOException {
  91. Member onBase = Member.methodFromString("void fluffy.Base.<init>()");
  92. Member onDerived = Member.methodFromString("void fluffy.Derived.<init>()");
  93. Member onBaseWithInt = Member.methodFromString("void fluffy.Base.<init>(int)");
  94. checkMatch(makeMethodPat("fluffy.Base.new(..)"),
  95. new Member[] { onBase, onBaseWithInt },
  96. new Member[] { onDerived });
  97. checkMatch(makeMethodPat("fluffy.Derived.new(..)"),
  98. new Member[] { onDerived},
  99. new Member[] { onBase, onBaseWithInt });
  100. }
  101. public void checkMatch(SignaturePattern p, Member[] yes, Member[] no) throws IOException {
  102. p = p.resolveBindings(new TestScope(world, new FormalBinding[0]), new Bindings(0));
  103. for (int i=0; i < yes.length; i++) {
  104. checkMatch(p, yes[i], true);
  105. }
  106. for (int i=0; i < no.length; i++) {
  107. checkMatch(p, no[i], false);
  108. }
  109. checkSerialization(p);
  110. }
  111. private void checkMatch(SignaturePattern p, Member member, boolean b) {
  112. boolean matches = p.matches(member, world);
  113. assertEquals(p.toString() + " matches " + member.toString(), b, matches);
  114. }
  115. private SignaturePattern makeMethodPat(String pattern) {
  116. return new PatternParser(pattern).parseMethodOrConstructorSignaturePattern();
  117. }
  118. private SignaturePattern makeFieldPat(String pattern) {
  119. return new PatternParser(pattern).parseFieldSignaturePattern();
  120. }
  121. private void checkSerialization(SignaturePattern p) throws IOException {
  122. ByteArrayOutputStream bo = new ByteArrayOutputStream();
  123. DataOutputStream out = new DataOutputStream(bo);
  124. p.write(out);
  125. out.close();
  126. ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
  127. VersionedDataInputStream in = new VersionedDataInputStream(bi);
  128. SignaturePattern newP = SignaturePattern.read(in, null);
  129. assertEquals("write/read", p, newP);
  130. }
  131. }