Clover Coverage Report
Coverage timestamp: Fri May 24 2013 13:47:27 UTC
../../../../../img/srcFileCovDistChart9.png 45% of files have more coverage
162   411   46   18
64   336   0.28   9
9     5.11  
1    
 
  QedeqVoCreator       Line # 138 162 46 82.1% 0.8212766
 
  (2)
 
1    /* This file is part of the project "Hilbert II" - http://www.qedeq.org
2    *
3    * Copyright 2000-2013, Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10    * This program is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13    * GNU General Public License for more details.
14    */
15   
16    package org.qedeq.kernel.se.test;
17   
18    import java.io.PrintStream;
19    import java.lang.reflect.Constructor;
20    import java.lang.reflect.Method;
21    import java.lang.reflect.Modifier;
22    import java.util.ArrayList;
23    import java.util.HashMap;
24    import java.util.List;
25    import java.util.Map;
26   
27    import org.qedeq.base.io.TextOutput;
28    import org.qedeq.kernel.se.base.list.Element;
29    import org.qedeq.kernel.se.base.module.Author;
30    import org.qedeq.kernel.se.base.module.AuthorList;
31    import org.qedeq.kernel.se.base.module.Axiom;
32    import org.qedeq.kernel.se.base.module.ChangedRule;
33    import org.qedeq.kernel.se.base.module.ChangedRuleList;
34    import org.qedeq.kernel.se.base.module.Chapter;
35    import org.qedeq.kernel.se.base.module.ChapterList;
36    import org.qedeq.kernel.se.base.module.Conclusion;
37    import org.qedeq.kernel.se.base.module.ConditionalProof;
38    import org.qedeq.kernel.se.base.module.Existential;
39    import org.qedeq.kernel.se.base.module.FormalProof;
40    import org.qedeq.kernel.se.base.module.FormalProofLine;
41    import org.qedeq.kernel.se.base.module.FormalProofLineList;
42    import org.qedeq.kernel.se.base.module.FormalProofList;
43    import org.qedeq.kernel.se.base.module.Formula;
44    import org.qedeq.kernel.se.base.module.FunctionDefinition;
45    import org.qedeq.kernel.se.base.module.Header;
46    import org.qedeq.kernel.se.base.module.Hypothesis;
47    import org.qedeq.kernel.se.base.module.Import;
48    import org.qedeq.kernel.se.base.module.ImportList;
49    import org.qedeq.kernel.se.base.module.InitialFunctionDefinition;
50    import org.qedeq.kernel.se.base.module.InitialPredicateDefinition;
51    import org.qedeq.kernel.se.base.module.Latex;
52    import org.qedeq.kernel.se.base.module.LatexList;
53    import org.qedeq.kernel.se.base.module.LinkList;
54    import org.qedeq.kernel.se.base.module.LiteratureItem;
55    import org.qedeq.kernel.se.base.module.LiteratureItemList;
56    import org.qedeq.kernel.se.base.module.Location;
57    import org.qedeq.kernel.se.base.module.LocationList;
58    import org.qedeq.kernel.se.base.module.Node;
59    import org.qedeq.kernel.se.base.module.NodeType;
60    import org.qedeq.kernel.se.base.module.PredicateDefinition;
61    import org.qedeq.kernel.se.base.module.Proof;
62    import org.qedeq.kernel.se.base.module.ProofList;
63    import org.qedeq.kernel.se.base.module.Proposition;
64    import org.qedeq.kernel.se.base.module.Qedeq;
65    import org.qedeq.kernel.se.base.module.Reason;
66    import org.qedeq.kernel.se.base.module.Rename;
67    import org.qedeq.kernel.se.base.module.Rule;
68    import org.qedeq.kernel.se.base.module.Section;
69    import org.qedeq.kernel.se.base.module.SectionList;
70    import org.qedeq.kernel.se.base.module.Specification;
71    import org.qedeq.kernel.se.base.module.Subsection;
72    import org.qedeq.kernel.se.base.module.SubsectionList;
73    import org.qedeq.kernel.se.base.module.SubsectionType;
74    import org.qedeq.kernel.se.base.module.SubstFree;
75    import org.qedeq.kernel.se.base.module.SubstFunc;
76    import org.qedeq.kernel.se.base.module.SubstPred;
77    import org.qedeq.kernel.se.base.module.Term;
78    import org.qedeq.kernel.se.base.module.Universal;
79    import org.qedeq.kernel.se.base.module.UsedByList;
80    import org.qedeq.kernel.se.dto.list.DefaultAtom;
81    import org.qedeq.kernel.se.dto.list.DefaultElementList;
82    import org.qedeq.kernel.se.dto.module.AddVo;
83    import org.qedeq.kernel.se.dto.module.AuthorListVo;
84    import org.qedeq.kernel.se.dto.module.AuthorVo;
85    import org.qedeq.kernel.se.dto.module.AxiomVo;
86    import org.qedeq.kernel.se.dto.module.ChangedRuleListVo;
87    import org.qedeq.kernel.se.dto.module.ChangedRuleVo;
88    import org.qedeq.kernel.se.dto.module.ChapterListVo;
89    import org.qedeq.kernel.se.dto.module.ChapterVo;
90    import org.qedeq.kernel.se.dto.module.ConclusionVo;
91    import org.qedeq.kernel.se.dto.module.ConditionalProofVo;
92    import org.qedeq.kernel.se.dto.module.ExistentialVo;
93    import org.qedeq.kernel.se.dto.module.FormalProofLineListVo;
94    import org.qedeq.kernel.se.dto.module.FormalProofLineVo;
95    import org.qedeq.kernel.se.dto.module.FormalProofListVo;
96    import org.qedeq.kernel.se.dto.module.FormalProofVo;
97    import org.qedeq.kernel.se.dto.module.FormulaVo;
98    import org.qedeq.kernel.se.dto.module.FunctionDefinitionVo;
99    import org.qedeq.kernel.se.dto.module.HeaderVo;
100    import org.qedeq.kernel.se.dto.module.HypothesisVo;
101    import org.qedeq.kernel.se.dto.module.ImportListVo;
102    import org.qedeq.kernel.se.dto.module.ImportVo;
103    import org.qedeq.kernel.se.dto.module.InitialFunctionDefinitionVo;
104    import org.qedeq.kernel.se.dto.module.InitialPredicateDefinitionVo;
105    import org.qedeq.kernel.se.dto.module.LatexListVo;
106    import org.qedeq.kernel.se.dto.module.LatexVo;
107    import org.qedeq.kernel.se.dto.module.LinkListVo;
108    import org.qedeq.kernel.se.dto.module.LiteratureItemListVo;
109    import org.qedeq.kernel.se.dto.module.LiteratureItemVo;
110    import org.qedeq.kernel.se.dto.module.LocationListVo;
111    import org.qedeq.kernel.se.dto.module.LocationVo;
112    import org.qedeq.kernel.se.dto.module.ModusPonensVo;
113    import org.qedeq.kernel.se.dto.module.NodeVo;
114    import org.qedeq.kernel.se.dto.module.PredicateDefinitionVo;
115    import org.qedeq.kernel.se.dto.module.ProofListVo;
116    import org.qedeq.kernel.se.dto.module.ProofVo;
117    import org.qedeq.kernel.se.dto.module.PropositionVo;
118    import org.qedeq.kernel.se.dto.module.QedeqVo;
119    import org.qedeq.kernel.se.dto.module.RenameVo;
120    import org.qedeq.kernel.se.dto.module.RuleVo;
121    import org.qedeq.kernel.se.dto.module.SectionListVo;
122    import org.qedeq.kernel.se.dto.module.SectionVo;
123    import org.qedeq.kernel.se.dto.module.SpecificationVo;
124    import org.qedeq.kernel.se.dto.module.SubsectionListVo;
125    import org.qedeq.kernel.se.dto.module.SubsectionVo;
126    import org.qedeq.kernel.se.dto.module.SubstFreeVo;
127    import org.qedeq.kernel.se.dto.module.SubstFuncVo;
128    import org.qedeq.kernel.se.dto.module.SubstPredVo;
129    import org.qedeq.kernel.se.dto.module.TermVo;
130    import org.qedeq.kernel.se.dto.module.UniversalVo;
131    import org.qedeq.kernel.se.dto.module.UsedByListVo;
132   
133    /**
134    * Test helper. Creates full QEDEQ module.
135    *
136    * @author Michael Meyling
137    */
 
138    public class QedeqVoCreator {
139   
140    /** Maps abstract classes to an implementation class. */
141    private static final Map interface2ConcreteClass = new HashMap();
142   
 
143  2 toggle static {
144  2 interface2ConcreteClass.put(Author.class, AuthorVo.class);
145  2 interface2ConcreteClass.put(AuthorList.class, AuthorListVo.class);
146  2 interface2ConcreteClass.put(Axiom.class, AxiomVo.class);
147  2 interface2ConcreteClass.put(ChangedRule.class, ChangedRuleVo.class);
148  2 interface2ConcreteClass.put(ChangedRuleList.class, ChangedRuleListVo.class);
149  2 interface2ConcreteClass.put(Chapter.class, ChapterVo.class);
150  2 interface2ConcreteClass.put(ChapterList.class, ChapterListVo.class);
151  2 interface2ConcreteClass.put(ConditionalProof.class, ConditionalProofVo.class);
152  2 interface2ConcreteClass.put(Conclusion.class, ConclusionVo.class);
153  2 interface2ConcreteClass.put(InitialPredicateDefinition.class, InitialPredicateDefinitionVo.class);
154  2 interface2ConcreteClass.put(PredicateDefinition.class, PredicateDefinitionVo.class);
155  2 interface2ConcreteClass.put(Existential.class, ExistentialVo.class);
156  2 interface2ConcreteClass.put(InitialFunctionDefinition.class, InitialFunctionDefinitionVo.class);
157  2 interface2ConcreteClass.put(FunctionDefinition.class, FunctionDefinitionVo.class);
158  2 interface2ConcreteClass.put(FormalProof.class, FormalProofVo.class);
159  2 interface2ConcreteClass.put(FormalProofList.class, FormalProofListVo.class);
160  2 interface2ConcreteClass.put(FormalProofLineList.class, FormalProofLineListVo.class);
161  2 interface2ConcreteClass.put(Formula.class, FormulaVo.class);
162  2 interface2ConcreteClass.put(Header.class, HeaderVo.class);
163  2 interface2ConcreteClass.put(Hypothesis.class, HypothesisVo.class);
164  2 interface2ConcreteClass.put(Import.class, ImportVo.class);
165  2 interface2ConcreteClass.put(ImportList.class, ImportListVo.class);
166  2 interface2ConcreteClass.put(Latex.class, LatexVo.class);
167  2 interface2ConcreteClass.put(LatexList.class, LatexListVo.class);
168  2 interface2ConcreteClass.put(LinkList.class, LinkListVo.class);
169  2 interface2ConcreteClass.put(LiteratureItem.class, LiteratureItemVo.class);
170  2 interface2ConcreteClass.put(LiteratureItemList.class, LiteratureItemListVo.class);
171  2 interface2ConcreteClass.put(Location.class, LocationVo.class);
172  2 interface2ConcreteClass.put(LocationList.class, LocationListVo.class);
173  2 interface2ConcreteClass.put(Node.class, NodeVo.class);
174  2 interface2ConcreteClass.put(Proof.class, ProofVo.class);
175  2 interface2ConcreteClass.put(ProofList.class, ProofListVo.class);
176  2 interface2ConcreteClass.put(Proposition.class, PropositionVo.class);
177  2 interface2ConcreteClass.put(Qedeq.class, QedeqVo.class);
178  2 interface2ConcreteClass.put(Rename.class, RenameVo.class);
179  2 interface2ConcreteClass.put(Rule.class, RuleVo.class);
180  2 interface2ConcreteClass.put(Section.class, SectionVo.class);
181  2 interface2ConcreteClass.put(SectionList.class, SectionListVo.class);
182  2 interface2ConcreteClass.put(Specification.class, SpecificationVo.class);
183  2 interface2ConcreteClass.put(Subsection.class, SubsectionVo.class);
184  2 interface2ConcreteClass.put(SubsectionList.class, SubsectionListVo.class);
185  2 interface2ConcreteClass.put(SubstFree.class, SubstFreeVo.class);
186  2 interface2ConcreteClass.put(SubstFunc.class, SubstFuncVo.class);
187  2 interface2ConcreteClass.put(SubstPred.class, SubstPredVo.class);
188  2 interface2ConcreteClass.put(Term.class, TermVo.class);
189  2 interface2ConcreteClass.put(Universal.class, UniversalVo.class);
190  2 interface2ConcreteClass.put(UsedByList.class, UsedByListVo.class);
191    }
192   
193    private int intCounter;
194   
195    private int stringCounter;
196   
 
197  1 toggle public QedeqVoCreator() {
198    }
199   
200   
 
201  116 toggle private List abstractToConcreteClass(final Class clazz) {
202  116 List result = new ArrayList();
203  116 if (!Modifier.isAbstract(clazz.getModifiers()) && !clazz.isInterface()) {
204  82 result.add(clazz);
205    } else {
206  34 Object concreteClass = interface2ConcreteClass.get(clazz);
207  34 if (concreteClass == null) {
208  23 if (clazz == Element.class) {
209  19 result.add(DefaultAtom.class);
210  19 result.add(DefaultElementList.class);
211  4 } else if (clazz == NodeType.class) {
212  1 result.add(PredicateDefinitionVo.class);
213  1 result.add(InitialPredicateDefinitionVo.class);
214  1 result.add(FunctionDefinitionVo.class);
215  1 result.add(InitialFunctionDefinitionVo.class);
216  1 result.add(RuleVo.class);
217  1 result.add(PropositionVo.class);
218  1 result.add(AxiomVo.class);
219  3 } else if (clazz == SubsectionType.class) {
220  1 result.add(NodeVo.class);
221  1 result.add(SubsectionVo.class);
222  2 } else if (clazz == FormalProofLine.class) {
223  1 result.add(FormalProofLineVo.class);
224  1 result.add(ConditionalProofVo.class);
225  1 } else if (clazz == Reason.class) {
226  1 result.add(ModusPonensVo.class);
227  1 result.add(SubstFreeVo.class);
228  1 result.add(SubstPredVo.class);
229  1 result.add(RenameVo.class);
230  1 result.add(AddVo.class);
231  1 result.add(ExistentialVo.class);
232  1 result.add(UniversalVo.class);
233  1 result.add(SubstFuncVo.class);
234    }
235    } else {
236  11 result.add(concreteClass);
237    }
238    }
239  116 return result;
240    }
241   
 
242  1 toggle public List create(){
243  1 return createValuesFor(Qedeq.class);
244    }
245   
 
246  0 toggle public static void main(final String[] args) {
247  0 final QedeqVoCreator c = new QedeqVoCreator();
248  0 final List vos = c.create();
249  0 for (int i = 0; i < vos.size(); i++) {
250    // System.out.println(vos.get(i).toString());
251    // System.out.println("**********************************");
252    }
253    }
254   
255    public TextOutput out = new TextOutput("out", new PrintStream(System.out));
256   
257    /**
258    * Create variations of instances of given class.
259    *
260    * @param clazz
261    * @return A list with objects that are instances of <code>clazz</code>.
262    */
 
263  222 toggle public List createValuesFor(Class clazz) {
264    // out.pushLevel(clazz.getName());
265    // out.println("Creating new for " + clazz.getName());
266  222 final List result = new ArrayList();
267   
268  222 Object vo = null;
269  222 if (clazz.isPrimitive()) {
270  1 if (clazz == Integer.TYPE) {
271  1 vo = new Integer(++intCounter);
272    } else {
273  0 throw new RuntimeException("not yet supported: " + clazz);
274    }
275  221 } else if (clazz.equals(Integer.class)) {
276  0 vo = new Integer(++intCounter);
277  221 } else if (clazz.equals(String.class)) {
278  103 vo = "s" + (++stringCounter);
279  118 } else if (clazz.equals(Boolean.class)) {
280  2 result.add(Boolean.FALSE);
281  2 vo = Boolean.TRUE;
282  116 } else if (clazz.equals(List.class)) {
283  0 vo = new ArrayList();
284    } else {
285  116 List clazzes = abstractToConcreteClass(clazz);
286  116 if (clazzes.size() == 0) {
287  0 throw new RuntimeException("not yet supported: " + clazz);
288    }
289  266 for (int k = 0; k < clazzes.size(); k++) {
290  150 final Class clazz2 = (Class) clazzes.get(k);
291  150 vo = getEmptyObject(clazz2);
292  150 result.add(vo);
293  150 Method[] methods = clazz2.getDeclaredMethods();
294  1612 for (int i = 0; i < methods.length; i++) {
295  1462 if (methods[i].getName().startsWith("set")) {
296  181 final Method setter = methods[i];
297  181 if (setter.getParameterTypes().length > 1) {
298  0 fail("setter with more than one parameter found: " + setter.getName());
299  0 continue;
300    }
301  181 if (clazz2 == ConditionalProofVo.class
302    && "setFormalProofLineList".equals(setter.getName())) {
303  1 continue;
304    }
305  180 final Class setClazz = setter.getParameterTypes()[0];
306  180 final List values = createValuesFor(setClazz);
307  937 for (int j = 0; j < values.size(); j++) {
308    // System.out.println(setter);
309  757 vo = getEmptyObject(clazz2);
310  757 try {
311  757 setter.invoke(vo, new Object[] {values.get(j)});
312    } catch (Exception e) {
313  0 e.printStackTrace(System.out);
314  0 throw new RuntimeException(e);
315    }
316  757 result.add(vo);
317    }
318  1281 } else if (methods[i].getName().equals("add")) {
319  60 final Method adder = methods[i];
320  60 if (adder.getParameterTypes().length > 1) {
321  0 final StringBuffer buffer = new StringBuffer("in class \"" + clazz
322    + "\" method \"add\" with more than one parameter found: "
323    + adder.getName());
324  0 for (int j = 0; j < adder.getParameterTypes().length; j++) {
325  0 buffer.append(" " + adder.getParameterTypes()[j]);
326    }
327  0 fail(buffer.toString());
328  0 continue;
329    }
330  60 final Class setClazz = adder.getParameterTypes()[0];
331  60 if (setClazz != clazz) {
332  41 final List values = createValuesFor(setClazz);
333  535 for (int j = 0; j < values.size(); j++) {
334    // System.out.println(adder);
335  494 vo = getEmptyObject(clazz2);
336  494 try {
337  494 adder.invoke(vo, new Object[] {values.get(j)});
338    } catch (Exception e) {
339  0 e.printStackTrace(System.out);
340  0 throw new RuntimeException(e);
341    }
342  494 result.add(vo);
343    }
344    }
345    }
346    }
347    }
348    }
349    // out.println("Creating done for " + clazz.getName());
350    // out.popLevel(clazz.getName().length());
351  222 return result;
352    }
353   
354   
355    /**
356    * Get (if possible) empty instance of an class. This method could be overwritten to get more
357    * objects.
358    *
359    * @param clazz For this class an instance is wanted.
360    * @param parent This class has <code>clazz</code> as an attribute. Maybe <code>null</code>.
361    * @param attribute Attribute name of parent that shall be filled.
362    * @return Just the result of the default constructor (if existing). Might be
363    * <code>null</code>.
364    * @throws Exception Something went wrong. Perhaps the preconditions in {@link #testAll()}
365    * were violated.
366    */
 
367  1401 toggle private Object getEmptyObject(Class clazz) {
368   
369  1401 if (clazz.equals(DefaultAtom.class)) { // application specific
370  19 return new DefaultAtom("s" + (++stringCounter));
371    }
372  1382 if (clazz.equals(DefaultElementList.class)) { // application specific
373  19 return new DefaultElementList("s" + (++stringCounter));
374    }
375  1363 Constructor[] constructors = clazz.getConstructors();
376  1363 Constructor constructor = null;
377  2955 for (int j = 0; j < constructors.length; j++) {
378  1592 if (constructors[j].getParameterTypes().length == 0) {
379  1363 constructor = constructors[j];
380    }
381    }
382  1363 if (constructor == null) {
383  0 throw new RuntimeException("no constructor found for clazz: " + clazz.getName());
384    }
385  1363 try {
386  1363 return constructor.newInstance(new Object[0]);
387    } catch (final Exception e) {
388  0 System.out.println(constructor);
389  0 throw new RuntimeException(e);
390    }
391    }
392   
393    /**
394    * Get name with first letter upper case.
395    *
396    * @param name
397    * @return Name with first letter upper case.
398    */
 
399  0 toggle public static final String getUName(final String name) {
400  0 if (name.length() > 0) {
401  0 return name.substring(0, 1).toUpperCase() + name.substring(1);
402    }
403  0 return "";
404    }
405   
 
406  0 toggle public void fail(final String message) {
407  0 throw new RuntimeException(message);
408    }
409   
410   
411    }