1   
2   
3   /*
4   interface Comparable { int compareTo(Object o); }
5   abstract class GString { abstract String[] getStrings(); }
6   interface CharSequence {
7       char charAt(int);  int length();  CharSequence subsequence(int, int);  String toString()
8   }
9   
10  abstract  class AbstractList: { abstract Object get(int index); abstract int size(); }
11  
12  */
13  
14  package org.codehaus.groovy.syntax.parser;
15  
16  import groovy.lang.GroovyObject;
17  import groovy.lang.MissingClassException;
18  import groovy.lang.MissingPropertyException;
19  
20  import java.io.ByteArrayInputStream;
21  
22  import org.codehaus.groovy.classgen.RuntimeIncompleteClassException;
23  import org.codehaus.groovy.classgen.TestSupport;
24  import org.codehaus.groovy.control.CompilationFailedException;
25  
26  public class AbstractMethodCheckTest extends TestSupport {
27  
28  
29      /***
30       * GString literals generate an anonymous inner class which 
31       * adds an implementation of the abstract String[] getStrings()
32       * method. 
33       */
34      public void testAnonymousGStringAbstract() throws Exception {
35  	GroovyObject object =
36  	    assertCompileWorks(
37                 "class GStringTest {\n" +
38                 "    public groovy.lang.GString testGStringAbstract(Integer x, Integer y) {\n" + 
39                 "       return \"GStringTest of ${x} and ${y}\"\n" +
40                 "    }\n" +
41                 "}\n");
42  
43      }
44  
45      public void testCompleteComparable() throws Exception {
46  	GroovyObject object =
47  	    assertCompileWorks(
48  	     "class ComparableTest implements java.lang.Comparable {\n" +
49  	     "    int compareTo(java.lang.Object o) {\n" +
50  	     "	return 0;\n" +
51  	     "    }\n" +
52  	     "}\n");
53      }
54  
55  
56      public void testIncompleteCharSequence() throws Exception {
57  	// Should generate an error for not implementing subsequence
58  	MissingClassException e =
59  	    assertCompileFailed(
60             "class IncompleteCharSequenceTest implements java.lang.CharSequence {\n" +
61  	       "    char charAt(int pos) {\n" +
62  	       "	return 'a';\n" +
63  	       "    }\n" +
64  	       "\n" +
65  	       "    int length() {\n" +
66  	       "	return 5;\n" +
67  	       "    }\n" +
68  	       "}\n");
69      }
70  
71      public void testCompleteCharSequence() throws Exception {
72  	GroovyObject object =
73  	    assertCompileWorks(
74                "class CompleteCharSequenceTest implements java.lang.CharSequence {\n" +
75  	      "    char charAt(int pos) {\n" +
76  	      "	return 'a';\n" +
77  	      "    }\n" +
78  	      "\n" +
79  	      "    int length() {\n" +
80  	      "	return 5;\n" +
81  	      "    }\n" +
82  	      "\n" +
83  	      "   java.lang.CharSequence subSequence(int start, int end) {\n" +
84  	      "	return null;\n" +
85  	      "    }\n" +
86  	      "}\n");
87      }
88  
89  
90      public void testIncompleteList() throws Exception {
91  	// Should generate an error for not implementing Object get(int)
92  	MissingClassException e =
93  	    assertCompileFailed(
94                 "class IncompleteList extends java.util.AbstractList {\n" +
95  	       "    int size() { return 0; }\n" +
96  	       "}\n");
97      }
98  
99  
100     public void testCompleteList() throws Exception {
101 	GroovyObject object =
102 	    assertCompileWorks(
103                "class CompleteList extends java.util.AbstractList {\n" +
104 	       "    int size() { return 0; }\n" +
105 	       "    Object get(int pos) { return null; }\n" +
106 	       "}\n");
107     }
108 
109     
110     protected GroovyObject assertCompileWorks(String code) throws Exception {
111         Class type =
112             loader.parseClass(new ByteArrayInputStream(code.getBytes()), "ValidClass_" + getMethodName() + ".groovy");
113         return (GroovyObject) type.newInstance();
114     }
115 
116     protected MissingClassException assertCompileFailed(String code) throws Exception {
117         try {
118             assertCompileWorks(code);
119 
120             fail("Should have thrown an exception");
121         }
122         catch( CompilationFailedException e ) {
123             Exception cause = e.getUnit().getException(0);
124             if( cause instanceof  RuntimeIncompleteClassException ) {
125                 System.out.println("Worked, threw: " + cause);
126                 //e.printStackTrace();
127                 return null;
128             }
129             throw e;
130         }
131         return null;
132     }
133 
134 }