1   /*
2   * E-nspire Gemini.
3   * A Java and AspectJ based framework that enables transparent 
4   * bidirectional relationships between Plain Old Java Objects.
5   * 
6   * Copyright (C) 2005 Dragan Djuric
7   * 
8   * This program is free software; you can redistribute it and/or
9   * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  * 
22  * Contact the author at dragand@dev.java.net
23  */
24  package com.enspire.gemini.integration.test.listsimple;
25  
26  import java.util.LinkedList;
27  import java.util.List;
28  
29  import org.jmock.Mock;
30  import org.jmock.MockObjectTestCase;
31  
32  import com.enspire.gemini.integration.model.listsimple.ABidirectionalDefault;
33  import com.enspire.gemini.integration.model.listsimple.A;
34  import com.enspire.gemini.integration.model.listsimple.AUnidirectional;
35  import com.enspire.gemini.integration.model.listsimple.B;
36  import com.enspire.gemini.integration.model.listsimple.BBidirectional;
37  
38  /***
39   * @author Dragan Djuric <dragand@dev.java.net>
40   *
41   */
42  public class BBidirectionalTest extends MockObjectTestCase {
43  
44      private B testClass;
45  
46      private Mock mockA;
47      
48      protected A createABidirectional() {
49          ABidirectionalDefault a = new ABidirectionalDefault();
50          a.setB(new LinkedList());
51          return a;
52      }
53      
54      protected A createAUnidirectional() {
55          AUnidirectional a = new AUnidirectional();
56          a.setB(new LinkedList());
57          return a;
58      }
59  
60      /***
61       * @see TestCase#setUp()
62       */
63      protected void setUp() throws Exception {
64          super.setUp();
65          testClass = new BBidirectional();
66          mockA = new Mock(A.class);
67      }
68  
69      public void testASetOppositeBidirectional() {
70          A aBidirectional = createABidirectional();
71          testClass.setA(aBidirectional);
72          assertSame(aBidirectional, testClass.getA());
73          assertTrue(aBidirectional.getB().contains(testClass));
74      }
75      
76      public void testASetOppositeUnidirectional() {
77          A aUnidirectional = createAUnidirectional();
78          testClass.setA(aUnidirectional);
79          assertSame(aUnidirectional, testClass.getA());
80          assertTrue(aUnidirectional.getB().contains(testClass));
81      }
82      
83      public void testAUnset() {
84          A aBidirectional = createABidirectional();
85          testClass.setA(aBidirectional);
86          assertSame(aBidirectional, testClass.getA());
87          assertTrue(aBidirectional.getB().contains(testClass));
88          testClass.setA(null);
89          assertNull(testClass.getA());
90          assertFalse(aBidirectional.getB().contains(testClass));
91      }
92      
93      public void testASetAgain() {
94          A aBidirectional = createABidirectional();
95          testClass.setA(aBidirectional);
96          assertSame(aBidirectional, testClass.getA());
97          assertTrue(aBidirectional.getB().contains(testClass));
98          testClass.setA(aBidirectional);
99          assertSame(aBidirectional, testClass.getA());
100         assertTrue(aBidirectional.getB().contains(testClass));
101         assertSame(1, aBidirectional.getB().size());
102     }
103     
104     public void testAReplace() {
105         A aBidirectional = createABidirectional();
106         A aUnidirectional = createAUnidirectional();
107         testClass.setA(aBidirectional);
108         assertSame(aBidirectional, testClass.getA());
109         assertTrue(aBidirectional.getB().contains(testClass));
110         testClass.setA(aUnidirectional);
111         assertSame(aUnidirectional, testClass.getA());
112         assertTrue(aUnidirectional.getB().contains(testClass));
113         assertFalse(aBidirectional.getB().contains(testClass));
114     }
115     
116     public void testAReplaceConnected() {
117         A aBidirectional = createABidirectional();
118         A aBidirectional1 = createABidirectional();
119         testClass.setA(aBidirectional1);
120         assertSame(aBidirectional1, testClass.getA());
121         assertTrue(aBidirectional1.getB().contains(testClass));
122         testClass.setA(aBidirectional);
123         assertSame(aBidirectional, testClass.getA());
124         assertTrue(aBidirectional.getB().contains(testClass));
125         assertFalse(aBidirectional1.getB().contains(testClass));
126     }
127     
128     public void testAThrowsException() {
129         Mock mockList = new Mock(List.class);
130         List aBSet = (List)mockList.proxy();
131         A a = (A)mockA.proxy();
132         A aBidirectional = createABidirectional();
133         testClass.setA(aBidirectional);
134         assertSame(aBidirectional, testClass.getA());
135         assertTrue(aBidirectional.getB().contains(testClass));
136         mockA.expects(once()).method("getB").withNoArguments().
137                 will(returnValue(aBSet));
138         mockList.expects(once()).method("contains").with(same(testClass)).
139                 will(returnValue(false));
140         mockList.expects(once()).method("add").with(same(testClass)).
141                 will(throwException(new RuntimeException()));
142         try {
143             testClass.setA(a);
144             fail("RuntimeException should be thrown");
145         }catch(RuntimeException e) {
146             assertSame(aBidirectional, testClass.getA());
147             assertTrue(aBidirectional.getB().contains(testClass));
148         }
149     }
150 
151 }