KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > tests > jfun > yan > BaseNonSingletonContainerTestCase


1 /*
2  * Created on Mar 21, 2005
3  *
4  * Author Ben Yu
5  * ZBS
6  */

7 package tests.jfun.yan;
8
9 import java.util.ArrayList JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.LinkedHashMap JavaDoc;
12
13 import tests.jfun.yan.tck.BaseContainerTestCase;
14 import tests.jfun.yan.tck.BaseContainerTestCase.Person;
15 import tests.jfun.yan.testmodel.ICacheFactory;
16 import tests.jfun.yan.testmodel.ICacheFactory2;
17 import tests.jfun.yan.testmodel.MyCache;
18
19 import jfun.yan.Component;
20 import jfun.yan.Components;
21 import jfun.yan.Creator;
22 import jfun.yan.CyclicDependencyException;
23 import jfun.yan.Functions;
24 import jfun.yan.IrresolveableArgumentException;
25 import jfun.yan.Map2;
26 import jfun.yan.Monad;
27 import jfun.yan.ParameterTypeMismatchException;
28 import jfun.yan.ReturnTypeMismatchException;
29 import jfun.yan.Container;
30 import jfun.yan.TypeMismatchException;
31 import jfun.yan.util.Predicate;
32 import junit.framework.TestCase;
33 import junit.framework.TestSuite;
34
35 /**
36  * Zephyr Business Solution
37  *
38  * @author Ben Yu
39  *
40  */

41 public class BaseNonSingletonContainerTestCase extends tests.jfun.yan.tck.BaseContainerTestCase {
42   public static void main(String JavaDoc[] args){
43     tests.jfun.yan.Utils.runTest(suite());
44   }
45   private static TestSuite suite(){
46     return new TestSuite(BaseNonSingletonContainerTestCase.class);
47   }
48
49   public static class Avenue{
50     private final int id;
51     private final String JavaDoc name;
52     private static int seed = 0;
53     Avenue(int id, String JavaDoc name){
54       this.id = id;
55       this.name = name;
56     }
57     public static Avenue instance(String JavaDoc name){
58       return new Avenue(++seed, name);
59     }
60     
61     public int getId() {
62       return id;
63     }
64     public String JavaDoc getName() {
65       return name;
66     }
67   }
68   public void testHashmapComponent(){
69     final Container yan = createYanContainer();
70     final Component newAvenue = Components.static_method(Avenue.class, "instance");
71     yan.registerComponent("target", Components.hashmap(
72         new String JavaDoc[]{"first", "second", "third"},
73         new Creator[]{newAvenue.withArgument(0, Components.value("Randolph")),
74             newAvenue.withArgument(0, Components.value("Lincoln")),
75             newAvenue.withArgument(0, Components.value("Fullerton"))}
76         )
77     );
78     assertEquals(java.util.LinkedHashMap JavaDoc.class, yan.verifyType(HashMap JavaDoc.class));
79     final HashMap JavaDoc hmap = (HashMap JavaDoc)yan.getInstanceOfType(java.util.Map JavaDoc.class);
80     verifyLinkedHashMap((LinkedHashMap JavaDoc)hmap);
81     final Component bad_hash = Components.hashmap(
82         new String JavaDoc[]{"a","b"},
83         new Creator[]{
84             Components.useKey("a").withState("hello"),
85             Components.useState(new Predicate(){
86               public boolean isObject(Object JavaDoc obj){
87                 return false;
88               }
89             })
90         }
91     );
92     yan.registerComponent("bad_hash", bad_hash);
93     try{
94       yan.getInstance("bad_hash");
95       fail("should have failed with UnresolvedComponentException");
96     }
97     catch(jfun.yan.UnresolvedComponentException e){
98       assertTraceSize(e,3);
99       assertEntry(e, 0, "useKey <a>");
100       assertEntry(e, 1, bad_hash);
101       assertEntry(e, 2, "getInstance <bad_hash>");
102     }
103   }
104   public void testHashMapComponentWithLessKey(){
105     final Container yan = createYanContainer();
106     final Component newAvenue = Components.static_method(Avenue.class, "instance");
107     try{
108       yan.registerComponent("target", Components.hashmap(
109           new String JavaDoc[]{"first", "second"},
110           new Creator[]{newAvenue.withArgument(0, Components.value("Randolph")),
111               newAvenue.withArgument(0, Components.value("Lincoln")),
112               newAvenue.withArgument(0, Components.value("Fullerton"))}
113           )
114       );
115       fail("should have failed");
116     }
117     catch(IllegalArgumentException JavaDoc e){
118       assertEquals("keys.length==2, vals.length==3", e.getMessage());
119     }
120   }
121   public void testHashMapComponentWithDuplicateKey(){
122     //in the new design, we do not check key dups.
123
//wrappers such as Nuts check duplicates.
124
final Container yan = createYanContainer();
125     final Component newAvenue = Components.static_method(Avenue.class, "instance");
126     //try{
127
yan.registerComponent("target", Components.hashmap(
128           new String JavaDoc[]{"first", "second", "second"},
129           new Creator[]{newAvenue.withArgument(0, Components.value("Randolph")),
130               newAvenue.withArgument(0, Components.value("Lincoln")),
131               newAvenue.withArgument(0, Components.value("Fullerton"))}
132           )
133       );
134       //fail("should have failed");
135
//}
136
//catch(IllegalArgumentException e){
137
// assertEquals("duplicate key: second", e.getMessage());
138
//}
139
}
140   public void testCreateLinkedHashMapUsingMap(){
141     final Container yan = createYanContainer();
142     final Component newAvenue = Components.useKey("factory");
143     final Component factory = Components.static_method(Avenue.class, "instance")
144     .incomplete();
145     final String JavaDoc[] keys = new String JavaDoc[]{"first", "second", "third"};
146     final Component vals = Components.array(new Component[]{newAvenue.withArgument(0, Components.value("Randolph")),
147         newAvenue.withArgument(0, Components.value("Lincoln")),
148         newAvenue.withArgument(0, Components.value("Fullerton"))});
149     final Component cc = vals.map(new jfun.yan.Map(){
150       public Object JavaDoc map(Object JavaDoc obj){
151         final Object JavaDoc[] vs = (Object JavaDoc[])obj;
152         final LinkedHashMap JavaDoc lhm = new LinkedHashMap JavaDoc(vs.length);
153         for(int i=0; i<vs.length; i++){
154           lhm.put(keys[i], vs[i]);
155         }
156         return lhm;
157       }
158     }).cast(LinkedHashMap JavaDoc.class);
159     yan.registerComponent(cc);
160     yan.registerComponent("factory", factory);
161     yan.verify();
162     final LinkedHashMap JavaDoc lhm = (LinkedHashMap JavaDoc)yan.getInstance(LinkedHashMap JavaDoc.class);
163     verifyLinkedHashMap(lhm);
164
165   }
166   public void testCreateLinkedHashMapUsingMap2(){
167     final Container yan = createYanContainer();
168     final Component newAvenue = Components.useKey("factory");
169     final Component factory = Components.static_method(Avenue.class, "instance")
170     .incomplete();
171     final Component keys = Components.value(new String JavaDoc[]{"first", "second", "third"});
172     final Component vals = Components.list(new Creator[]{newAvenue.withArgument(0, Components.value("Randolph")),
173         newAvenue.withArgument(0, Components.value("Lincoln")),
174         newAvenue.withArgument(0, Components.value("Fullerton"))});
175     final Component cc = Monad.map(keys, vals, new Map2(){
176       public Object JavaDoc map(Object JavaDoc o1, Object JavaDoc o2){
177         final Object JavaDoc[] ks = (Object JavaDoc[])o1;
178         final java.util.List JavaDoc vs = (java.util.List JavaDoc)o2;
179         final LinkedHashMap JavaDoc lhm = new LinkedHashMap JavaDoc(ks.length);
180         for(int i=0;i<vs.size();i++){
181           lhm.put(ks[i], vs.get(i));
182         }
183         return lhm;
184       }
185     }).cast(LinkedHashMap JavaDoc.class);
186     yan.registerComponent(cc);
187     yan.registerComponent("factory", factory);
188     yan.verify();
189     final LinkedHashMap JavaDoc lhm = (LinkedHashMap JavaDoc)yan.getInstance(LinkedHashMap JavaDoc.class);
190     verifyLinkedHashMap(lhm);
191   }
192   public void testCreateLinkedHashMapUsingBind(){
193     final Container yan = createYanContainer();
194     final Component newAvenue = Components.useKey("factory");
195     final Component factory = Components.static_method(Avenue.class, "instance")
196     .incomplete();
197     //final Component keys = Components.value(new String[]{"first", "second", "third"});
198
final Component vals = Components.list(new Creator[]{newAvenue.withArgument(0, Components.value("Randolph")),
199         newAvenue.withArgument(0, Components.value("Lincoln")),
200         newAvenue.withArgument(0, Components.value("Fullerton"))});
201     final Component cc = Monad.bind(vals, new jfun.yan.Binder(){
202       public Creator bind(Object JavaDoc obj){
203         final Object JavaDoc[] ks = new String JavaDoc[]{"first", "second", "third"};
204         final java.util.List JavaDoc vs = (java.util.List JavaDoc)obj;
205         final LinkedHashMap JavaDoc lhm = new LinkedHashMap JavaDoc();
206         for(int i=0; i<ks.length; i++){
207           lhm.put(ks[i], vs.get(i));
208         }
209         return Components.value(lhm);
210       }
211     }).cast(LinkedHashMap JavaDoc.class);
212     yan.registerComponent(cc);
213     yan.registerComponent("factory", factory);
214     yan.verify();
215     final LinkedHashMap JavaDoc lhm = (LinkedHashMap JavaDoc)yan.getInstance(LinkedHashMap JavaDoc.class);
216     verifyLinkedHashMap(lhm);
217   }
218   private void verifyLinkedHashMap(final LinkedHashMap JavaDoc lhm){
219     assertEquals(3, lhm.size());
220     java.util.Iterator JavaDoc it = lhm.keySet().iterator();
221     String JavaDoc k = (String JavaDoc)it.next();
222     assertEquals("first", k);
223     Avenue a = (Avenue)lhm.get(k);
224     int from = a.getId();
225     assertEquals("Randolph", a.getName());
226     k = (String JavaDoc)it.next();
227     assertEquals("second", k);
228     a = (Avenue)lhm.get(k);
229     assertEquals(from+1, a.getId());
230     assertEquals("Lincoln", a.getName());
231     k = (String JavaDoc)it.next();
232     assertEquals("third", k);
233     a = (Avenue)lhm.get(k);
234     assertEquals(from+2, a.getId());
235     assertEquals("Fullerton", a.getName());
236   }
237   public void testArrayComponent(){
238     final Container yan = createYanContainer();
239     yan.registerComponent("target",
240         Components.array(
241         new Component[]{Components.value("hello"), Components.value("world")}));
242     assertEquals(String JavaDoc[].class, yan.verifyComponent(
243         yan.getComponent("target")));
244     String JavaDoc[] arr = (String JavaDoc[])yan.getInstance("target");
245     assertEquals(2, arr.length);
246     assertEquals("hello", arr[0]);
247     assertEquals("world", arr[1]);
248   }
249   public void testArrayComponentWithDynamicBoundComponent(){
250     final Container yan = createYanContainer();
251     yan.registerComponent("target", Components.array(
252         new Component[]{Components.value("hello"), Components.useKey("you")}));
253     yan.registerValue("you", "world");
254     assertEquals(Object JavaDoc[].class, yan.verifyComponent(yan.getComponent("target")));
255     Object JavaDoc[] arr = (Object JavaDoc[])yan.getInstanceOfType(Object JavaDoc[].class);
256     assertEquals(2, arr.length);
257     assertEquals("hello", arr[0]);
258     assertEquals("world", arr[1]);
259   }
260   public void testArrayComponentWithComponentTypeSpecified(){
261     final Container yan = createYanContainer();
262     yan.registerComponent(
263         Components.array(
264         new Component[]{Components.value("hello"), Components.useKey("you")}
265         , CharSequence JavaDoc.class));
266     yan.registerValue("you", "world");
267     assertEquals(CharSequence JavaDoc[].class, yan.verifyComponent(yan.getComponent(CharSequence JavaDoc[].class)));
268     CharSequence JavaDoc[] arr = (CharSequence JavaDoc[])yan.getInstanceOfType(CharSequence JavaDoc[].class);
269     assertFalse(arr instanceof String JavaDoc[]);
270     assertEquals(2, arr.length);
271     assertEquals("hello", arr[0]);
272     assertEquals("world", arr[1]);
273   }
274   public void testArrayComponentWithRaggedType(){
275     final Container yan = createYanContainer();
276     yan.registerComponent("target", Components.array(
277         new Component[]{Components.value("hello"),
278             Components.useKey("age")}));
279     yan.registerValue("age", new Integer JavaDoc(20));
280     assertEquals(Object JavaDoc[].class, yan.verifyComponent(yan.getComponent("target")));
281     Object JavaDoc[] arr = (Object JavaDoc[])yan.getInstanceOfType(Object JavaDoc[].class);
282     
283     assertEquals(2, arr.length);
284     assertEquals("hello", arr[0]);
285     assertEquals(new Integer JavaDoc(20), arr[1]);
286   }
287   public void testBadArrayComponentWithRaggedType(){
288     final Container yan = createYanContainer();
289     yan.registerValue("age", new Integer JavaDoc(20));
290     yan.registerComponent("target", Components.array(
291         new Component[]{Components.value("hello"),
292             Components.useKey("age")}, CharSequence JavaDoc.class));
293     
294     try{
295       yan.verify();
296       fail("should have failed with illegal argument");
297     }
298     catch(TypeMismatchException e){
299       assertEquals("type mismatch: the #1 element is of java.lang.Integer, while java.lang.CharSequence is expected.", e.getMessage());
300     }
301   }
302   public void testListComponent(){
303     final Container yan = createYanContainer();
304     yan.registerComponent(Components.list(new Creator[]{
305         Components.value("hello"), Components.value("world")}
306     ));
307     assertEquals(java.util.ArrayList JavaDoc.class,
308         yan.verifyComponent(yan.getComponentOfType(java.util.List JavaDoc.class)));
309     final java.util.List JavaDoc list = (java.util.List JavaDoc)yan.getInstanceOfType(java.util.ArrayList JavaDoc.class);
310     assertEquals(2, list.size());
311     assertEquals("hello", list.get(0));
312     assertEquals("world", list.get(1));
313   }
314   public void testCyclicListComponent(){
315     final Container yan = createYanContainer();
316     yan.registerComponent("target", Components.list(new Creator[]{
317         Components.value("hello"), Components.useKey("target")}
318     ));
319     try{
320       yan.verifyKey("target");
321       fail("should have failed with cyclic dependency");
322     }
323     catch(CyclicDependencyException e){
324       assertEquals(4, e.getResolutionTrace().size());
325       assertEntry(e, 0, "list [hello,useKey <target>]");
326       assertEntry(e, 1, "useKey <target>");
327       assertEntry(e, 2, "list [hello,useKey <target>]");
328       assertEntry(e, 3, "verifyKey <target>");
329     }
330   }
331   public void testCyclicArrayComponent(){
332     final Container yan = createYanContainer();
333     yan.registerComponent("target", Components.array(new Component[]{
334         Components.value("hello"), Components.useKey("target")}
335     ));
336     try{
337       yan.verifyKey("target");
338       fail("should have failed with cyclic dependency");
339     }
340     catch(CyclicDependencyException e){
341       assertTraceSize(e, 4);
342       assertEntry(e, 0, "array [hello,useKey <target>]:java.lang.Object[]");
343       assertEntry(e, 1, "useKey <target>");
344       assertEntry(e, 2, "array [hello,useKey <target>]:java.lang.Object[]");
345       assertEntry(e, 3, "verifyKey <target>");
346     }
347   }
348   public void testUseAll(){
349     final Container yan = createYanContainer();
350     yan.registerComponent("target", Components.useAll(String JavaDoc.class));
351     assertEquals(0, ((java.util.List JavaDoc)yan.getInstanceOfType(java.util.List JavaDoc.class)).size());
352     yan.registerValue("abc");
353     yan.registerValue("yet another", "cde");
354     java.util.List JavaDoc strs = (java.util.List JavaDoc)yan.getInstance("target");
355     assertEquals(2, strs.size());
356     assertEquals("abc", strs.get(0));
357     assertEquals("cde", strs.get(1));
358     yan.registerComponent("another", Components.useKey("yet another").subsume(String JavaDoc.class));
359     strs = (java.util.List JavaDoc)yan.getInstance("target");
360     assertEquals(3, strs.size());
361     assertEquals("abc", strs.get(0));
362     assertEquals("cde", strs.get(1));
363     assertEquals("cde", strs.get(2));
364     
365   }
366   public void testUseAllInSameContainer(){
367     final Container yan = createYanContainer();
368     yan.registerComponent("target", Components.useAll(yan, String JavaDoc.class));
369     assertEquals(0, ((java.util.List JavaDoc)yan.getInstanceOfType(java.util.List JavaDoc.class)).size());
370     yan.registerValue("abc");
371     yan.registerValue("yet another", "cde");
372     java.util.List JavaDoc strs = (java.util.List JavaDoc)yan.getInstance("target");
373     assertEquals(2, strs.size());
374     assertEquals("abc", strs.get(0));
375     assertEquals("cde", strs.get(1));
376     yan.registerComponent("another", Components.useKey("yet another").subsume(String JavaDoc.class));
377     strs = (java.util.ArrayList JavaDoc)yan.getInstance("target");
378     assertEquals(3, strs.size());
379     assertEquals("abc", strs.get(0));
380     assertEquals("cde", strs.get(1));
381     assertEquals("cde", strs.get(2));
382     
383   }
384   public void testUseAllInDifferentContainer(){
385     final Container yan1 = createYanContainer();
386     final Container yan = createYanContainer();
387     yan1.registerComponent("target", Components.useAll(yan, String JavaDoc.class));
388     assertEquals(0, ((java.util.List JavaDoc)yan1.getInstanceOfType(java.util.List JavaDoc.class)).size());
389     yan.registerValue("abc");
390     yan.registerValue("yet another", "cde");
391     java.util.List JavaDoc strs = (java.util.List JavaDoc)yan1.getInstance("target");
392     assertEquals(2, strs.size());
393     assertEquals("abc", strs.get(0));
394     assertEquals("cde", strs.get(1));
395     //have to specify the container because otherwise "yet another" will be looked up from yan1.
396
yan.registerComponent("another", Components.useKey(yan, "yet another").subsume(String JavaDoc.class));
397     strs = (java.util.List JavaDoc)yan1.getInstance("target");
398     assertEquals(3, strs.size());
399     assertEquals("abc", strs.get(0));
400     assertEquals("cde", strs.get(1));
401     assertEquals("cde", strs.get(2));
402     
403   }
404   public void testUseState(){
405     final Container yan = createYanContainer();
406     yan.registerComponent("allnul", Components.useState(new Predicate(){
407       public boolean isObject(Object JavaDoc obj){
408         return obj==null;
409       }
410       public String JavaDoc toString(){return "isnull";}
411     }).withState("!do not recurse on me"));
412     yan.registerComponent("startswithhello", Components.useState(new Predicate(){
413       public boolean isObject(Object JavaDoc obj){
414         if(obj instanceof String JavaDoc){
415           final String JavaDoc s = (String JavaDoc)obj;
416           return s.startsWith("hello");
417         }
418         else return false;
419       }
420       public String JavaDoc toString(){return "startsWithHello";}
421     }));
422     yan.registerValue("foo");
423     yan.registerComponent("bar", Components.value(Class JavaDoc.class)
424         .withState("hello world"));
425     yan.registerValue("baz", new Integer JavaDoc(10));
426     yan.registerComponent("joo", Components.value(int.class).withState("hello me"));
427     try{
428       final java.util.List JavaDoc nulls = (java.util.List JavaDoc)yan.getInstance("allnul");
429       final java.util.List JavaDoc hellos = (java.util.List JavaDoc)yan.getInstance("startswithhello");
430       assertEquals(3, nulls.size());
431       assertEquals(2, hellos.size());
432       final java.util.List JavaDoc the_hellos = (java.util.List JavaDoc)nulls.get(0);
433       assertEquals(hellos, the_hellos);
434       assertEquals("foo", nulls.get(1));
435       assertEquals(new Integer JavaDoc(10), nulls.get(2));
436       assertEquals(Class JavaDoc.class, hellos.get(0));
437       assertEquals(int.class, hellos.get(1));
438     }
439     catch(jfun.yan.YanException e){
440       e.printResolutionTrace(System.err);
441       throw e;
442     }
443   }
444   public String JavaDoc signup(Person p1, Person p2){
445     assertSame(p1, p2);
446     return p1.getName();
447   }
448   public void testSharedArgument()
449   throws Exception JavaDoc{
450     final Container yan = createYanContainer();
451     final Component signup = Components.method(this, "signup");
452     yan.registerComponent("target",
453         Monad.bind(Components.useType(Person.class),
454           new jfun.yan.Binder(){
455             public Creator bind(Object JavaDoc v){
456               final Component c = Components.value(v);
457               return signup.withArguments(
458                   new Creator[]{c,c}
459               );
460             }
461           }
462         ).cast(signup.getType())
463     );
464     yan.registerComponent(Components.method(this, "newPerson").bean(new String JavaDoc[]{"name"}));
465     yan.registerValue(new Integer JavaDoc(10));
466     final String JavaDoc name = "Jack Nicolson";
467     yan.registerValue(name);
468     assertEquals(name, yan.getInstance("target"));
469   }
470   public void testFactory(){
471     final Container yan = createYanContainer();
472     final Component mycache =
473       Components.ctor(MyCache.class,
474           new Class JavaDoc[]{String JavaDoc.class, int.class});
475     
476     final Component factory =
477       mycache.factory(ICacheFactory.class);
478     yan.registerComponent("target", factory);
479     final ICacheFactory ifactory =
480       (ICacheFactory)yan.getInstance("target");
481     final tests.jfun.yan.testmodel.ICache icache = ifactory.createCache("tom", 10);
482     assertEquals(MyCache.class, icache.getClass());
483     assertEquals("tom", icache.getName());
484     assertEquals(10, icache.getCapacity());
485     try{
486       yan.verify();
487       fail("should have failed with IrresolveableArgumentException");
488     }
489     catch(IrresolveableArgumentException e){
490       assertTraceSize(e, 3);
491       assertEntry(e, 1, "tests.jfun.yan.testmodel.ICacheFactory");
492       assertEquals(0, e.getOrdinalPosition());
493       assertEquals(String JavaDoc.class, e.getParameterType());
494     }
495     yan.registerValue("someone");
496     try{
497       yan.verify();
498       fail("should have failed with IrresolveableArgumentException");
499     }
500     catch(IrresolveableArgumentException e){
501       assertTraceSize(e, 3);
502       assertEntry(e, 1, "tests.jfun.yan.testmodel.ICacheFactory");
503       assertEquals(1, e.getOrdinalPosition());
504       assertEquals(int.class, e.getParameterType());
505     }
506     yan.registerValue(new Integer JavaDoc(0));
507     yan.verify();
508     
509     final tests.jfun.yan.testmodel.ICache icache2 = ifactory.createCache("jack", 11);
510     assertEquals(MyCache.class, icache2.getClass());
511     assertEquals("jack", icache2.getName());
512     assertEquals(11, icache2.getCapacity());
513     
514     final tests.jfun.yan.testmodel.ICache icache3 = ifactory.createCache();
515     assertEquals(MyCache.class, icache3.getClass());
516     assertEquals("someone", icache3.getName());
517     assertEquals(0, icache3.getCapacity());
518   }
519   public void testCustomizationsOnProductComponentShouldOverrideFactoryParameter(){
520     final Container yan = createYanContainer();
521     final Component mycache =
522       Components.ctor(MyCache.class,
523           new Class JavaDoc[]{String JavaDoc.class, int.class})
524       .withArgument(1, Components.value(100));
525     
526     final Component factory =
527       mycache.factory(ICacheFactory.class);
528     yan.registerComponent("target", factory);
529     final ICacheFactory ifactory =
530       (ICacheFactory)yan.getInstance("target");
531     final tests.jfun.yan.testmodel.ICache icache = ifactory.createCache("tom", 10);
532     assertEquals(MyCache.class, icache.getClass());
533     assertEquals("tom", icache.getName());
534     assertEquals(100, icache.getCapacity());
535     try{
536       yan.verify();
537       fail("should have failed with IrresolveableArgumentException");
538     }
539     catch(IrresolveableArgumentException e){
540       //e.printResolutionTrace();
541
assertTraceSize(e, 4);
542       assertEntry(e, 2, "tests.jfun.yan.testmodel.ICacheFactory");
543       assertEquals(0, e.getOrdinalPosition());
544       assertEquals(String JavaDoc.class, e.getParameterType());
545     }
546     yan.registerValue("someone");
547     yan.verify();
548     yan.registerValue(new Integer JavaDoc(0));
549     yan.verify();
550     
551     final tests.jfun.yan.testmodel.ICache icache2 = ifactory.createCache("jack", 11);
552     assertEquals(MyCache.class, icache2.getClass());
553     assertEquals("jack", icache2.getName());
554     assertEquals(100, icache2.getCapacity());
555     
556     final tests.jfun.yan.testmodel.ICache icache3 = ifactory.createCache();
557     assertEquals(MyCache.class, icache3.getClass());
558     assertEquals("someone", icache3.getName());
559     assertEquals(100, icache3.getCapacity());
560   }
561   public void testLocalCustomizationOverridesFactoryParametersRedirectedToPropeties()
562   throws Exception JavaDoc{
563     final Container yan = createYanContainer();
564     final Component mycache =
565       Components.bean(MyCache.class)
566       //.withProperty("name", Components.value("should not see me"))
567
.withProperty("name",
568           Components.useProperty(MyCache.class, "capacity", int.class)
569           .map(new jfun.yan.Map(){
570             public Object JavaDoc map(Object JavaDoc obj){
571               return obj.toString();
572             }
573           }).cast(String JavaDoc.class)
574       )
575       .withProperty("name", Components.value("should not see me"))
576       ;
577     
578     final Component factory =
579       Components.fromArguments(mycache, new String JavaDoc[]{"name","capacity"})
580       .factory(ICacheFactory.class);
581     yan.registerComponent("target", factory);
582     final ICacheFactory ifactory =
583       (ICacheFactory)yan.getInstance("target");
584     final tests.jfun.yan.testmodel.ICache icache = ifactory.createCache("tom", 10);
585     assertEquals(MyCache.class, icache.getClass());
586     assertEquals("10", icache.getName());
587     assertEquals(10, icache.getCapacity());
588     try{
589       yan.verify();
590       fail("should have failed with IrresolveableArgumentException");
591     }
592     catch(IrresolveableArgumentException e){
593      //e.printResolutionTrace();
594
assertTraceSize(e, 7);
595       assertEntry(e, 5, "tests.jfun.yan.testmodel.ICacheFactory");
596       final int pos = e.getOrdinalPosition();
597       if(pos==0)
598         assertEquals(String JavaDoc.class, e.getParameterType());
599       else
600         assertEquals(int.class, e.getParameterType());
601     }
602     yan.registerValue("someone");
603     try{
604       yan.verify();
605       fail("should have failed with IrresolveableArgumentException");
606     }
607     catch(IrresolveableArgumentException e){
608       assertTraceSize(e, 7);
609       assertEntry(e, 5, "tests.jfun.yan.testmodel.ICacheFactory");
610       final int pos = e.getOrdinalPosition();
611       if(pos==0)
612         assertEquals(String JavaDoc.class, e.getParameterType());
613       else
614         assertEquals(int.class, e.getParameterType());
615     }
616     yan.registerValue(new Integer JavaDoc(0));
617     yan.verify();
618     
619     final tests.jfun.yan.testmodel.ICache icache2 = ifactory.createCache("jack", 11);
620     assertEquals(MyCache.class, icache2.getClass());
621     assertEquals("11", icache2.getName());
622     assertEquals(11, icache2.getCapacity());
623     
624     final tests.jfun.yan.testmodel.ICache icache3 = ifactory.createCache();
625     assertEquals(MyCache.class, icache3.getClass());
626     assertEquals("0", icache3.getName());
627     assertEquals(0, icache3.getCapacity());
628   }
629   public void testFactoryWithParametersRedirectedToPropeties()
630   throws Exception JavaDoc{
631     final Container yan = createYanContainer();
632     final Component mycache =
633       Components.bean(MyCache.class);
634     
635     final Component factory =
636       Components.fromArguments(mycache, new String JavaDoc[]{"name","capacity"})
637       .factory(ICacheFactory.class);
638     yan.registerComponent("target", factory);
639     final ICacheFactory ifactory =
640       (ICacheFactory)yan.getInstance("target");
641     final tests.jfun.yan.testmodel.ICache icache = ifactory.createCache("tom", 10);
642     assertEquals(MyCache.class, icache.getClass());
643     assertEquals("tom", icache.getName());
644     assertEquals(10, icache.getCapacity());
645     try{
646       yan.verify();
647       fail("should have failed with IrresolveableArgumentException");
648     }
649     catch(IrresolveableArgumentException e){
650      //e.printResolutionTrace();
651
assertTraceSize(e, 5);
652       assertEntry(e, 3, "tests.jfun.yan.testmodel.ICacheFactory");
653       final int pos = e.getOrdinalPosition();
654       if(pos==0)
655         assertEquals(String JavaDoc.class, e.getParameterType());
656       else
657         assertEquals(int.class, e.getParameterType());
658     }
659     yan.registerValue("someone");
660     try{
661       yan.verify();
662       fail("should have failed with IrresolveableArgumentException");
663     }
664     catch(IrresolveableArgumentException e){
665       assertTraceSize(e, 5);
666       assertEntry(e, 3, "tests.jfun.yan.testmodel.ICacheFactory");
667       final int pos = e.getOrdinalPosition();
668       if(pos==0)
669         assertEquals(String JavaDoc.class, e.getParameterType());
670       else
671         assertEquals(int.class, e.getParameterType());
672     }
673     yan.registerValue(new Integer JavaDoc(0));
674     yan.verify();
675     
676     final tests.jfun.yan.testmodel.ICache icache2 = ifactory.createCache("jack", 11);
677     assertEquals(MyCache.class, icache2.getClass());
678     assertEquals("jack", icache2.getName());
679     assertEquals(11, icache2.getCapacity());
680     
681     final tests.jfun.yan.testmodel.ICache icache3 = ifactory.createCache();
682     assertEquals(MyCache.class, icache3.getClass());
683     assertEquals("someone", icache3.getName());
684     assertEquals(0, icache3.getCapacity());
685   }
686   public void testFactoryWithParametersRedirectedToPropertiesThenRedirectedBackToArguments()
687   throws Exception JavaDoc{
688     final Container yan = createYanContainer();
689     final Component mycache =
690       Components.ctor(MyCache.class, new Class JavaDoc[]{String JavaDoc.class, int.class})
691       .fromProperties(new String JavaDoc[]{"name","capacity"});
692     
693     final Component factory =
694       mycache.fromArguments(new String JavaDoc[]{"name","capacity"})
695       .factory(ICacheFactory.class);
696     yan.registerComponent("target", factory);
697     final ICacheFactory ifactory =
698       (ICacheFactory)yan.getInstance("target");
699     final tests.jfun.yan.testmodel.ICache icache = ifactory.createCache("tom", 10);
700     assertEquals(MyCache.class, icache.getClass());
701     assertEquals("tom", icache.getName());
702     assertEquals(10, icache.getCapacity());
703     try{
704       yan.verify();
705       fail("should have failed with IrresolveableArgumentException");
706     }
707     catch(IrresolveableArgumentException e){
708       //e.printResolutionTrace();
709
assertTraceSize(e, 5);
710       assertEntry(e, 3, "tests.jfun.yan.testmodel.ICacheFactory");
711       final int pos = e.getOrdinalPosition();
712       if(pos==0)
713         assertEquals(String JavaDoc.class, e.getParameterType());
714       else
715         assertEquals(int.class, e.getParameterType());
716     }
717     yan.registerValue("someone");
718     try{
719       yan.verify();
720       fail("should have failed with IrresolveableArgumentException");
721     }
722     catch(IrresolveableArgumentException e){
723       assertTraceSize(e, 5);
724       assertEntry(e, 3, "tests.jfun.yan.testmodel.ICacheFactory");
725       final int pos = e.getOrdinalPosition();
726       if(pos==0)
727         assertEquals(String JavaDoc.class, e.getParameterType());
728       else
729         assertEquals(int.class, e.getParameterType());
730     }
731     yan.registerValue(new Integer JavaDoc(0));
732     yan.verify();
733     
734     final tests.jfun.yan.testmodel.ICache icache2 = ifactory.createCache("jack", 11);
735     assertEquals(MyCache.class, icache2.getClass());
736     assertEquals("jack", icache2.getName());
737     assertEquals(11, icache2.getCapacity());
738     
739     final tests.jfun.yan.testmodel.ICache icache3 = ifactory.createCache();
740     assertEquals(MyCache.class, icache3.getClass());
741     assertEquals("someone", icache3.getName());
742     assertEquals(0, icache3.getCapacity());
743   }
744   public void testFactoryWithBadParameterSequence()
745   throws Exception JavaDoc{
746     final Container yan = createYanContainer();
747     final Component mycache =
748       Components.ctor(MyCache.class,
749           new Class JavaDoc[]{String JavaDoc.class, int.class});
750     
751     final Component factory =
752       mycache.factory(ICacheFactory2.class);
753     yan.registerComponent("target", factory);
754     try{
755       yan.verify();
756       fail("should have failed with ParameterTypeMismatchException");
757     }
758     catch(ParameterTypeMismatchException e){
759       assertEquals(0, e.getOrdinalPosition());
760       assertEquals(String JavaDoc.class, e.getExpectedType());
761       assertEquals(int.class, e.getActualType());
762     }
763   }
764   public void testFactoryWithBadReturnType(){
765     final Container yan = createYanContainer();
766     final Component mycache =
767       Components.ctor(MyCache.class,
768           new Class JavaDoc[]{String JavaDoc.class, int.class});
769     
770     final Component factory =
771       mycache.factory(tests.jfun.yan.testmodel.IMonitoredCacheFactory.class);
772     yan.registerComponent("target", factory);
773     try{
774       yan.verify();
775       fail("should have failed with ReturnTypeMismatchException");
776     }
777     catch(ReturnTypeMismatchException e){
778       //e.printResolutionTrace();
779
assertEquals("tests.jfun.yan.testmodel.MyCache cannot match return type of <public abstract tests.jfun.yan.testmodel.IMonitoredCache tests.jfun.yan.testmodel.IMonitoredCacheFactory.createCache(java.lang.String,int)>",
780           e.getMessage());
781       assertEntry(e, 0, "tests.jfun.yan.testmodel.IMonitoredCacheFactory");
782       //assertEquals(0, e.getOrdinalPosition());
783
assertEquals(tests.jfun.yan.testmodel.IMonitoredCache.class, e.getExpectedType());
784       assertEquals(MyCache.class, e.getActualType());
785     }
786   }
787   public void testSealedComponent(){
788     final Container yan = createYanContainer();
789     final Component c1 = Components.ctor(java.util.ArrayList JavaDoc.class, new Class JavaDoc[]{int.class});
790     yan.registerComponent("list", c1.seal());
791     yan.registerValue(new Integer JavaDoc(10));
792     try{
793       yan.getInstance("list");
794       fail ("should have failed with IrresolveableArgumentException");
795     }
796     catch(IrresolveableArgumentException e){}
797     yan.registerComponent("list", c1.seal().withArgument(0, Components.value(5)));
798     yan.getInstance("list");
799     //fail ("should have failed with IrresolveableArgumentException");
800

801     yan.registerComponent("list", c1);
802     yan.registerComponent("target", Components.useKey("list").seal()
803         .withArgument(0, Components.value(12)));
804     //try{
805
yan.getInstance("target");
806       //fail("should have failed with IrresolveableArgumentException");
807
//}
808
//catch(IrresolveableArgumentException e){}
809
//assertEquals(10, result.size());
810
yan.registerComponent("list", c1.withArgument(0,
811         Components.useArgument(Functions.ctor(
812             ArrayList JavaDoc.class, new Class JavaDoc[]{int.class}), 0, int.class)));
813     yan.registerComponent("target", Components.useKey("list").seal()
814         .withArgument(0, Components.value(12)));
815     //try{
816
yan.getInstance("target");
817       //fail("should have failed with IrresolveableArgumentException");
818
//}
819
//catch(IrresolveableArgumentException e){}
820
yan.registerComponent("list", c1.withArgument(0, Components.useType(int.class)));
821     yan.registerComponent("target", Components.useKey("list").seal()
822         .withArgument(0, Components.value(12)));
823     final java.util.ArrayList JavaDoc result = (ArrayList JavaDoc)yan.getInstance("target");
824     final Component array = Components.ctor(String JavaDoc[].class);
825     
826     
827     yan.registerComponent("array", array.withArgument(0, Components.useType(int.class)));
828     yan.registerComponent("target", Components.useKey("array").seal()
829         .withArgument(0, Components.value(12)));
830     final String JavaDoc[] arr = (String JavaDoc[])yan.getInstance("target");
831     assertEquals(10, arr.length);
832     final Component array2 = Components.ctor(int[].class, new Class JavaDoc[]{int.class});
833     yan.registerComponent("array", array2.withArgument(0, Components.useType(int.class)));
834     yan.registerComponent("target", Components.useKey("array").seal()
835         .withArgument(0, Components.value(12)));
836     final int[] arr2 = (int[])yan.getInstance("target");
837     assertEquals(10, arr2.length);
838     try{
839       Components.ctor(int[].class, null);
840     }
841     catch(IllegalArgumentException JavaDoc e){
842       assertEquals("constructor not found for: int[]()", e.getMessage());
843     }
844     try{
845       Components.ctor(int[].class, new Class JavaDoc[0]);
846     }
847     catch(IllegalArgumentException JavaDoc e){
848       assertEquals("constructor not found for: int[]()", e.getMessage());
849     }
850     try{
851       Components.ctor(int[].class, new Class JavaDoc[]{int.class, int.class});
852     }
853     catch(IllegalArgumentException JavaDoc e){
854       assertEquals("constructor not found for: int[](int,int)", e.getMessage());
855     }
856   }
857 }
858
Popular Tags