View Javadoc
1   package common;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.util.Vector;
6   
7   import org.junit.Assert;
8   
9   import de.fhdw.wtf.generator.java.generatorModel.GenAnyType;
10  import de.fhdw.wtf.generator.java.generatorModel.GenAspect;
11  import de.fhdw.wtf.generator.java.generatorModel.GenAspectAttribute;
12  import de.fhdw.wtf.generator.java.generatorModel.GenAspectOperation;
13  import de.fhdw.wtf.generator.java.generatorModel.GenClass;
14  import de.fhdw.wtf.generator.java.generatorModel.GenClassClass;
15  import de.fhdw.wtf.generator.java.generatorModel.GenClassModifier;
16  import de.fhdw.wtf.generator.java.generatorModel.GenComment;
17  import de.fhdw.wtf.generator.java.generatorModel.GenException;
18  import de.fhdw.wtf.generator.java.generatorModel.GenExternalClassClass;
19  import de.fhdw.wtf.generator.java.generatorModel.GenFullParsedOperationState;
20  import de.fhdw.wtf.generator.java.generatorModel.GenInterfaceClass;
21  import de.fhdw.wtf.generator.java.generatorModel.GenJavaAttribute;
22  import de.fhdw.wtf.generator.java.generatorModel.GenJavaException;
23  import de.fhdw.wtf.generator.java.generatorModel.GenJavaOperation;
24  import de.fhdw.wtf.generator.java.generatorModel.GenOperationModifier;
25  import de.fhdw.wtf.generator.java.generatorModel.GenPackage;
26  import de.fhdw.wtf.generator.java.generatorModel.GenParameter;
27  import de.fhdw.wtf.generator.java.generatorModel.GenPrimitiveClass;
28  import de.fhdw.wtf.generator.java.generatorModel.GenSimpleInterfaceClass;
29  import de.fhdw.wtf.generator.java.generatorModel.GenType;
30  import de.fhdw.wtf.generator.java.generatorModel.GenTypeReferenceByReference;
31  import de.fhdw.wtf.generator.java.generatorModel.GenUserClass;
32  import de.fhdw.wtf.generator.java.generatorModel.GenVisibility;
33  import de.fhdw.wtf.generator.java.visitor.GenClassClassVisitor;
34  import de.fhdw.wtf.generator.java.visitor.GenClassVisitor;
35  import de.fhdw.wtf.generator.writer.writer.ExceptionFileWriter;
36  import de.fhdw.wtf.generator.writer.writer.FileHeaderWriter;
37  import de.fhdw.wtf.generator.writer.writer.JavaAspectClassFileWriter;
38  import de.fhdw.wtf.generator.writer.writer.JavaClassFileWriter;
39  import de.fhdw.wtf.generator.writer.writer.JavaInterfaceClassFileWriter;
40  
41  /**
42   * Provide test facilities for usage in every test concerning generator code.
43   */
44  public abstract class CommonTest {
45  	
46  	/**
47  	 * Root directory in which to store test related files
48  	 * 
49  	 * @return Absolute path to the root directory
50  	 */
51  	public abstract String getRootDir();
52  	
53  	public abstract String getCompareDir();
54  	
55  	private final JavaAspectClassFileWriter aspectWriter = new JavaAspectClassFileWriter(false);
56  	private final JavaClassFileWriter classWriter = new JavaClassFileWriter(true);
57  	private final ExceptionFileWriter exceptionWriter = new ExceptionFileWriter(true);
58  	private final JavaInterfaceClassFileWriter interfaceWriter = new JavaInterfaceClassFileWriter(false);
59  	
60  	// TODO -> Create this thing. Just copied from lines above.
61  	// private final ExceptionFileWriter exceptionWriter = new ExceptionFileWriter(false);
62  	
63  	private void writeFile(final GenClass c) {
64  		final File rootdir = new File(this.getRootDir());
65  		c.accept(new GenClassVisitor() {
66  			@Override
67  			public void handle(final GenInterfaceClass interfaceClass) {
68  				
69  				final FileHeaderWriter writer = new FileHeaderWriter(CommonTest.this.interfaceWriter);
70  				writer.writeGenClass(interfaceClass, rootdir);
71  			}
72  			
73  			@Override
74  			public void handle(final GenClassClass clazz) {
75  				clazz.accept(new GenClassClassVisitor() {
76  					@Override
77  					public void handle(final GenAspect aspect) {
78  						CommonTest.this.aspectWriter.writeAspectClass(aspect, rootdir);
79  					}
80  					
81  					@Override
82  					public void handle(final GenUserClass userClass) {
83  						final FileHeaderWriter writer = new FileHeaderWriter(CommonTest.this.classWriter);
84  						writer.writeGenClass(userClass, rootdir);
85  					}
86  					
87  					@Override
88  					public void handle(final GenJavaException javaException) {
89  						// nothing to do
90  					}
91  					
92  					@Override
93  					public void handle(final GenAnyType anyType) {
94  						// nothing to do
95  					}
96  					
97  					@Override
98  					public void handle(final GenException exceptionClass) {
99  						final FileHeaderWriter writer = new FileHeaderWriter(CommonTest.this.exceptionWriter);
100 						writer.writeGenClass(exceptionClass, rootdir);
101 					}
102 					
103 					@Override
104 					public void handle(final GenExternalClassClass externalClass) {
105 						// nothing to do
106 					}
107 				});
108 			}
109 			
110 			@Override
111 			public void handle(final GenPrimitiveClass primitiveClass) {
112 				// do not write file
113 			}
114 		});
115 	}
116 	
117 	public void doTest(final String className, final GenPackage packag, final GenClass c) throws IOException {
118 		this.writeFile(c);
119 		this.doAssert(className + c.getFileEnding(), packag);
120 	}
121 	
122 	protected void doTest(final String className, final GenPackage packag, final GenInterfaceClass iC)
123 			throws IOException {
124 		final boolean fullyQualified = true;
125 		final JavaInterfaceClassFileWriter javaInterfaceClassWriter = new JavaInterfaceClassFileWriter(fullyQualified);
126 		final FileHeaderWriter writer = new FileHeaderWriter(javaInterfaceClassWriter);
127 		writer.writeGenClass(iC, new File(CommonTest.this.getRootDir()));
128 		this.doAssert(className + iC.getFileEnding(), packag);
129 	}
130 	
131 	private void doAssert(final String fileName, final GenPackage packag) throws IOException {
132 		final String expected = TestUtil.loadFile(this.getCompareDir() + fileName + ".compare");
133 		final String actual = TestUtil.loadFile(this.getRootDir() + packag.toString() + "/" + fileName);
134 		Assert.assertEquals(expected.replaceAll("\\s+", ""), actual.replaceAll("\\s+", ""));
135 	}
136 	
137 	public GenClassClass getEmptyDefaultClassClass(final String className, final GenPackage packag) {
138 		final String classComment = defaultClassComment;
139 		final String nonGenPart = "// TODO implement";
140 		final GenUserClass c =
141 				GenUserClass.create(
142 						className,
143 						new Vector<GenJavaOperation>(),
144 						new Vector<GenInterfaceClass>(),
145 						new Vector<GenJavaAttribute>(),
146 						new Vector<GenClassModifier>(),
147 						new Vector<GenJavaOperation>(),
148 						null,
149 						packag,
150 						GenComment.create(classComment),
151 						nonGenPart);
152 		return c;
153 	}
154 	
155 	public GenException getEmptyDefaultException(final String className, final GenPackage packag) {
156 		final String exceptionComment = defaultExceptionComment;
157 		final String nonGenPart = "// TODO implement non-generated part of Exception";
158 		final GenException c =
159 				GenException.create(
160 						className,
161 						new Vector<GenJavaOperation>(),
162 						new Vector<GenInterfaceClass>(),
163 						new Vector<GenJavaAttribute>(),
164 						new Vector<GenClassModifier>(),
165 						new Vector<GenJavaOperation>(),
166 						packag,
167 						GenComment.create(exceptionComment),
168 						nonGenPart);
169 		return c;
170 	}
171 	
172 	public GenAspect getEmptyDefaultAspect(final String className, final GenPackage packag) {
173 		final String classComment = defaultClassComment;
174 		final GenAspect a =
175 				GenAspect.create(
176 						className,
177 						new Vector<GenJavaOperation>(),
178 						new Vector<GenAspectOperation>(),
179 						new Vector<GenInterfaceClass>(),
180 						new Vector<GenJavaAttribute>(),
181 						new Vector<GenAspectAttribute>(),
182 						new Vector<GenClassModifier>(),
183 						new Vector<GenJavaOperation>(),
184 						null,
185 						packag,
186 						GenComment.create(classComment),
187 						"");
188 		return a;
189 	}
190 	
191 	public GenJavaOperation getDefaultOp(final String name,
192 			final GenVisibility visibility,
193 			final String method,
194 			final GenType returnType) {
195 		return GenJavaOperation.create(
196 				name,
197 				visibility,
198 				new Vector<GenParameter>(),
199 				new Vector<GenException>(),
200 				method,
201 				returnType,
202 				new Vector<GenOperationModifier>(),
203 				GenComment.create(defaultComment));
204 	}
205 	
206 	public GenAspectOperation getDefaultAspectOp(final String name,
207 			final GenVisibility visibility,
208 			final String method,
209 			final GenType returnType,
210 			final GenClassClass owner) {
211 		return GenAspectOperation.create(name, new Vector<GenParameter>(), GenFullParsedOperationState.create(
212 				GenComment.create(defaultComment),
213 				new Vector<GenException>(),
214 				GenTypeReferenceByReference.create(returnType),
215 				new Vector<GenOperationModifier>(),
216 				visibility,
217 				method), owner);
218 	}
219 	
220 	public GenInterfaceClass getEmptyDefaultInterfaceClass(final String interfaceName, final GenPackage packag) {
221 		return GenSimpleInterfaceClass.create(
222 				interfaceName,
223 				new Vector<GenJavaOperation>(),
224 				new Vector<GenInterfaceClass>(),
225 				packag,
226 				GenComment.create(defaultClassComment),
227 				"// TODO");
228 	}
229 	
230 	public static final String defaultComment = "\t/**\n\t * TODO Comment\n\t */";
231 	public static final String defaultClassComment = "/**\n * TODO Comment Class\n */";
232 	public static final String defaultExceptionComment = "/**\n * TODO Comment Exception\n */";
233 	
234 }