1   package org.sourceforge.jemm.client.types;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertFalse;
5   import static org.junit.Assert.assertNull;
6   import static org.junit.Assert.assertTrue;
7   
8   import org.junit.After;
9   import org.junit.Before;
10  import org.junit.Test;
11  import org.sourceforge.jemm.JEMMInternalException;
12  import org.sourceforge.jemm.client.Entity;
13  import org.sourceforge.jemm.client.FieldKey;
14  import org.sourceforge.jemm.client.ObjectSource;
15  import org.sourceforge.jemm.client.classes.Shadowed;
16  import org.sourceforge.jemm.database.FieldType;
17  import org.sourceforge.jemm.types.ID;
18  
19  
20  public class JEMMObjectAccessorTest {
21  	FieldKey objFKey = new FieldKey(Shadowed.class,"obj");
22  	
23  	JEMMObjectAccessor accessor;
24  	Entity entity;
25  	
26  	Shadowed fieldValue;
27  	
28  	@Before
29  	public void setUp() {
30  		Shadowed s = new Shadowed(new ID(1));
31  		fieldValue = new Shadowed(new ID(2));
32  		
33  		ObjectSource source = new ObjectSource() {
34  			public Object getObject(ID fieldID) {
35  				return fieldValue;
36  			}
37  		};
38  		
39  		entity = new Entity(s);
40  		accessor = new JEMMObjectAccessor(entity,source);
41  	}
42  	
43  	@After
44  	public void tearDown() {
45  		
46  	}
47  	
48  	// FINALIZED STATE TESTS
49  	// *********************
50  	
51  	@Test
52  	public void getFieldContainsValue() {
53  		accessor.setField(objFKey, fieldValue);
54  		
55  		Object value = accessor.getField(objFKey);
56  		assertEquals(fieldValue,value);
57  	}
58  	
59  	@Test
60  	public void getFieldNull() {
61  		accessor.setField(objFKey, null);
62  		Object value = accessor.getField(objFKey);
63  		assertNull(value);
64  	}
65  	
66  	@Test(expected=RuntimeException.class)
67  	public void getFieldNoValue() {
68  		Object value = accessor.getField(objFKey);
69  		assertNull(value);
70  	}
71  	
72  	@Test
73  	public void getRawFieldExists() {
74  		accessor.setField(objFKey, fieldValue);
75  		
76  		Object value = accessor.getFieldRaw(objFKey);
77  		assertEquals(new ID(2),value);
78  	}
79  	
80  	@Test
81  	public void getRawFieldNullValue() {
82  		accessor.setField(objFKey, null);
83  		
84  		Object value = accessor.getFieldRaw(objFKey);
85  		assertNull(value);
86  	}
87  	
88  	@Test(expected=RuntimeException.class)
89  	public void getRawFieldNoValue() {
90  		Object value = accessor.getFieldRaw(objFKey);
91  		assertNull(value);
92  	}
93  	
94  	@Test
95  	public void setFieldJEMMObject() {
96  		accessor.setField(objFKey, fieldValue);
97  		assertNull(entity.getField(objFKey));
98  		assertEquals(new ID(2),entity.getShadowData().getField(Shadowed.class, FieldType.OBJECT, "obj"));
99  	}
100 	
101 	@Test
102 	public void setFieldID() {
103 		accessor.setField(objFKey, new ID(2));
104 		assertNull(entity.getField(objFKey));
105 		assertEquals(new ID(2),entity.getShadowData().getField(Shadowed.class, FieldType.OBJECT, "obj"));
106 	}
107 	
108 	@Test(expected=JEMMInternalException.class)
109 	public void setFieldPrimtive() {
110 		accessor.setField(objFKey, 'a');
111 	}
112 	
113 	@Test
114 	public void setFieldNull() {
115 		accessor.setField(objFKey, null);
116 		assertNull(entity.getField(objFKey));
117 	}
118 	
119 	// INITIALIZED STATE TESTS
120 	// ***********************
121 	
122 	@Test
123 	public void getFieldValueInitialised() {
124 		accessor.setField(objFKey, fieldValue);
125 		accessor.initialise(objFKey);
126 		
127 		Object value = accessor.getField(objFKey);
128 		assertEquals(fieldValue,value);
129 	}
130 	
131 	@Test
132 	public void getFieldNullInitialised() {
133 		accessor.setField(objFKey, null);
134 		accessor.initialise(objFKey);
135 		
136 		Object value = accessor.getField(objFKey);
137 		assertNull(value);
138 	}
139 	
140 	@Test
141 	public void getRawFieldInitialisedValue() {
142 		accessor.setField(objFKey, fieldValue);
143 		accessor.initialise(objFKey);
144 		
145 		assertEquals(new ID(2),accessor.getFieldRaw(objFKey));
146 	}
147 	
148 	@Test
149 	public void getRawFieldInitialisedNull() {
150 		accessor.setField(objFKey, null);
151 		accessor.initialise(objFKey);
152 		
153 		assertEquals(null,accessor.getFieldRaw(objFKey));
154 	}
155 	
156 	
157 	
158 	@Test(expected=RuntimeException.class)
159 	public void initialiseNotSet() {
160 		accessor.initialise(objFKey);
161 	}
162 	
163 	@Test
164 	public void initialiseWithID() {
165 		accessor.setField(objFKey, fieldValue);
166 		accessor.initialise(objFKey);
167 		
168 		Object value = entity.getField(objFKey);
169 		assertEquals(fieldValue,value);
170 		assertTrue(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
171 	}
172 	
173 	@Test
174 	public void initialiseNullValue() {
175 		accessor.setField(objFKey, null);
176 		accessor.initialise(objFKey);
177 		
178 		Object value = entity.getField(objFKey);
179 		assertNull(value);
180 		assertTrue(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
181 	}
182 	
183 	@Test
184 	public void initialiseTwice() {
185 		accessor.setField(objFKey, null);
186 		accessor.initialise(objFKey);
187 		accessor.initialise(objFKey);
188 		
189 		Object value = entity.getField(objFKey);
190 		assertNull(value);
191 		
192 		assertTrue(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
193 	}
194 	
195 	
196 	// STATE CHANGE
197 	// ************
198 	
199 	@Test
200 	public void finalizeWithObject() {
201 		accessor.setField(objFKey, fieldValue);
202 		accessor.initialise(objFKey);
203 		
204 		entity.setField(objFKey, new Shadowed(new ID(3)));
205 		
206 		accessor.finalize(objFKey);
207 		assertEquals(new ID(3),accessor.getFieldRaw(objFKey));
208 		assertNull(entity.getField(objFKey));
209 		assertFalse(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
210 	}
211 	
212 	@Test
213 	public void finalizeNullValue() {
214 		accessor.setField(objFKey, null);
215 		accessor.initialise(objFKey);
216 		
217 		accessor.finalize(objFKey);
218 		assertNull(accessor.getFieldRaw(objFKey));
219 		assertNull(entity.getField(objFKey));
220 		assertFalse(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
221 	}
222 	
223 	@Test
224 	public void finalizeTwice() {
225 		accessor.setField(objFKey, fieldValue);
226 		accessor.initialise(objFKey);
227 		
228 		accessor.finalize(objFKey);
229 		
230 		entity.setField(objFKey, new Shadowed(new ID(3)));
231 		
232 		accessor.finalize(objFKey);
233 		
234 		assertEquals(new ID(2),accessor.getFieldRaw(objFKey));
235 		assertFalse(entity.getShadowData().isFieldInitialised(Shadowed.class, FieldType.OBJECT, "obj"));
236 	}
237 }