(no commit message)
[utils] / support / general / src / test / java / org / wamblee / persistence / AbstractDetachableTest.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.persistence;
17
18 import static org.mockito.Mockito.*;
19
20 import org.junit.Before;
21 import org.junit.Test;
22
23 import static junit.framework.TestCase.*;
24
25 public class AbstractDetachableTest {
26
27     public static class X {
28
29     }
30
31     public static interface DetachableMethods {
32         Integer getReference(X aObject);
33
34         X load(Integer aReference);
35     }
36
37     public class MyDetachable extends AbstractDetachable<X, Integer> {
38
39         public MyDetachable(X aObj) {
40             super(aObj);
41         }
42
43         @Override
44         protected Integer getReference(X aObject) {
45             return methods.getReference(aObject);
46         }
47
48         @Override
49         protected X load(Integer aReference) {
50             return methods.load(aReference);
51         }
52
53     }
54
55     private DetachableMethods methods;
56     private AbstractDetachable<X, Integer> detachable;
57     private X x;
58
59     @Before
60     public void setUp() {
61         methods = mock(DetachableMethods.class);
62     }
63
64     @Test(expected = IllegalArgumentException.class)
65     public void testNullPassedIn() {
66         detachable = new MyDetachable(null);
67     }
68
69     @Test
70     public void testDetach() {
71         x = new X();
72         Integer ref = 100;
73         when(methods.getReference(any(X.class))).thenReturn(ref);
74         detachable = new MyDetachable(x);
75         verifyNoMoreInteractions(methods);
76         detachable.detach();
77         verify(methods).getReference(same(x));
78         assertNull(detachable.getObject());
79         assertEquals(ref, detachable.getReference());
80     }
81
82     @Test
83     public void testDetachTwice() {
84         reset(methods);
85         testDetach();
86         detachable.detach();
87         detachable.detach();
88         verifyNoMoreInteractions(methods);
89     }
90
91     @Test(expected = IllegalStateException.class)
92     public void testDetachWithNullReference() {
93         x = new X();
94         Integer ref = 100;
95         when(methods.getReference(any(X.class))).thenReturn(null);
96         detachable = new MyDetachable(x);
97         verifyNoMoreInteractions(methods);
98         detachable.detach();
99     }
100
101     @Test
102     public void testReattach() {
103         testDetach();
104         reset(methods);
105
106         X x2 = new X(); // the new X loaded from persistent storage.
107         when(methods.load(detachable.getReference())).thenReturn(x2);
108
109         X x3 = detachable.get();
110         verify(methods).load(100);
111         assertSame(x2, x3);
112
113         assertSame(x2, detachable.getObject());
114     }
115
116     @Test
117     public void testGetInvokedTwiceNoLoads() {
118         testReattach();
119         reset(methods);
120         detachable.get();
121         detachable.get();
122         verifyNoMoreInteractions(methods);
123     }
124
125 }